def _compile(node, source=None, mode='eval', filename=None, lineno=-1): xform = { 'eval': ExpressionASTTransformer }.get(mode, TemplateASTTransformer) tree = xform().visit(node) if isinstance(filename, unicode): # unicode file names not allowed for code objects filename = filename.encode('utf-8', 'replace') elif not filename: filename = '<string>' tree.filename = filename if lineno <= 0: lineno = 1 if mode == 'eval': gen = ExpressionCodeGenerator(tree) name = '<Expression %s>' % (repr(source or '?')) else: gen = ModuleCodeGenerator(tree) name = '<Suite>' gen.optimized = True code = gen.getCode() # We'd like to just set co_firstlineno, but it's readonly. So we need to # clone the code object while adjusting the line number return new.code(0, code.co_nlocals, code.co_stacksize, code.co_flags | 0x0040, code.co_code, code.co_consts, code.co_names, code.co_varnames, filename, name, lineno, code.co_lnotab, (), ())
def _compile(node, source=None, mode="eval", filename=None, lineno=-1): tree = TemplateASTTransformer().visit(node) if isinstance(filename, unicode): # unicode file names not allowed for code objects filename = filename.encode("utf-8", "replace") elif not filename: filename = "<string>" tree.filename = filename if lineno <= 0: lineno = 1 if mode == "eval": gen = ExpressionCodeGenerator(tree) name = "<Expression %s>" % (repr(source or "?")) else: gen = ModuleCodeGenerator(tree) name = "<Suite>" gen.optimized = True code = gen.getCode() # We'd like to just set co_firstlineno, but it's readonly. So we need to # clone the code object while adjusting the line number return new.code( 0, code.co_nlocals, code.co_stacksize, code.co_flags | 0x0040, code.co_code, code.co_consts, code.co_names, code.co_varnames, filename, name, lineno, code.co_lnotab, (), (), )
def _compile(node, source=None, mode='eval', filename=None, lineno=-1, xform=None): if xform is None: xform = {'eval': ExpressionASTTransformer}.get(mode, TemplateASTTransformer) tree = xform().visit(node) if isinstance(filename, unicode): # unicode file names not allowed for code objects filename = filename.encode('utf-8', 'replace') elif not filename: filename = '<string>' tree.filename = filename if lineno <= 0: lineno = 1 if mode == 'eval': gen = ExpressionCodeGenerator(tree) name = '<Expression %r>' % (source or '?') else: gen = ModuleCodeGenerator(tree) lines = source.splitlines() if not lines: extract = '' else: extract = lines[0] if len(lines) > 1: extract += ' ...' name = '<Suite %r>' % (extract) gen.optimized = True code = gen.getCode() # We'd like to just set co_firstlineno, but it's readonly. So we need to # clone the code object while adjusting the line number return new.code(0, code.co_nlocals, code.co_stacksize, code.co_flags | 0x0040, code.co_code, code.co_consts, code.co_names, code.co_varnames, filename, name, lineno, code.co_lnotab, (), ())