def compile(self, filename=None, mode='exec', |
flag=generators.compiler_flag, dont_inherit=0): |
""" return compiled code object. if filename is None |
invent an artificial filename which displays |
the source/line position of the caller frame. |
""" |
if not filename or py.path.local(filename).check(file=0): |
frame = sys._getframe(1) |
filename = '%s<%s:%d>' % (filename, frame.f_code.co_filename, |
frame.f_lineno) |
source = "\n".join(self.lines) + '\n' |
try: |
co = cpy_compile(source, filename, mode, flag) |
except SyntaxError, ex: |
|
msglines = self.lines[:ex.lineno] |
if ex.offset: |
msglines.append(" "*ex.offset + '^') |
msglines.append("syntax error probably generated here: %s" % filename) |
newex = SyntaxError('\n'.join(msglines)) |
newex.offset = ex.offset |
newex.lineno = ex.lineno |
newex.text = ex.text |
raise newex |
else: |
co_filename = MyStr(filename) |
co_filename.__source__ = self |
return py.code.Code(co).new(rec=1, co_filename=co_filename) |