def __init__(self, exception, init):
rule = parse_attrs(init)['rule']
span = parse_attrs(init)['Span']
-
if span.startswith(dotdynadir / 'tmp'):
# don't show users tmp files create by the repl.
msg = '%r in ininitializer for rule\n %s' % \
(exception, rule)
-
else:
msg = '%r in ininitializer for rule\n %s\n %s' % \
- (exception,
- span,
- rule)
+ (exception, span, rule)
super(DynaInitializerException, self).__init__(msg)
return None
+import os
+
class Interpreter(object):
def __init__(self):
self.files = []
+ # interpretor needs a place for it's temporary files.
+ self.tmp = tmp = (dotdynadir / 'tmp' / str(os.getpid()))
+ if tmp.exists():
+ tmp.rmtree()
+ tmp.makedirs_p()
+
def __getstate__(self):
return ((self.chart,
self.agenda,
raise DynaInitializerException(e, init)
else:
-
- # TODO: how do I make this transactional? what if the user hits ^C
- # in the middle of the following blocK?
- #
- # - maybe transaction isn't want I mean. Maybe all I want (for now
- # is to avoid ^C.
-
for fn, r, h in env.updaters:
self.new_updater(fn, r, h)
for r, h in env.initializers:
return self.go()
- def dynac(self, filename, out=None):
+ def dynac(self, filename):
+ filename = path(filename)
self.files.append(filename)
- out = dynac(filename, out)
+
+ out = self.tmp / filename.read_hexhash('sha1') + '.plan.py'
+
+ dynac(filename, out)
self.files.append(out)
+ return out
def dynac_code(self, code):
"""
x.update(self.parser_state)
x.update(code)
- dyna = dotdynadir / 'tmp' / ('%s.dyna' % x.hexdigest())
- dyna.dirname().mkdir_p() # make necessary directories
-
- out = '%s.plan.py' % dyna
+ dyna = self.tmp / ('%s.dyna' % x.hexdigest())
with file(dyna, 'wb') as f:
f.write(self.parser_state) # include parser state if any.
f.write(code)
- self.dynac(dyna, out) # might raise compiler error
-
- return out
+ return self.dynac(dyna)
def peel(fn, item):
# def pickle_interp():
# import subprocess
-#
-# crash = dotdynadir / 'crash'
-# crash.rmtree(ignore_errors=False)
-# crash.mkdir_p()
-#
-# for f in [dotdynadir / 'crash.log'] + interp.files:
-# path(f).copy(crash)
-#
-# subprocess.Popen(['tar', 'czf', dotdynadir / 'crash.tar.gz', crash])
-#
+# subprocess.Popen(['tar', 'czf', dotdynadir / 'crash.tar.gz', dotdynadir])
# crash_handler.interp = pickle_interp
return
if args.plan:
- plan = args.source
+ # copy plan to tmp directory
+ plan = tmp / args.source.read_hexhash('sha1') + '.plan.py'
+ args.source.copy(plan)
+
else:
- plan = args.source + '.plan.py'
- interp.dynac(args.source, plan)
+ #plan = args.source + '.plan.py'
+ #interp.dynac(args.source, plan)
+ plan = interp.dynac(args.source)
if args.profile:
# When profiling, its common practice to disable the garbage collector.
return _comments.sub('', src).strip()
-def dynac(f, out=None, anf=None, compiler_args=()):
+def dynac(f, out, anf=None, compiler_args=()):
"""
Run compiler on file, ``f``, write results to ``out``. Raises
``DynaCompilerError`` on failure.
if not f.exists():
raise DynaCompilerError("File '%s' does not exist." % f)
- if out is None:
- out = dotdynadir / 'tmp' / f.read_hexhash('sha1') + '.plan.py'
-
cmd = ['%s/dist/build/dyna/dyna' % dynahome,
'-B', 'python', '-o', out, f]
assert not stdout.strip(), [stdout, stderr]
raise DynaCompilerError(stderr)
- return out
def lexer(term):