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 parse_expr(self, ws_expression): expression = ws_expression.strip() #in case of " x" ast_tree = parser.expr(expression) ast_tree = self.r_transformer.transform(ast_tree) compiler.misc.set_filename('<sympify>', ast_tree) code = ExpressionCodeGenerator(ast_tree).getCode() parsed_expr = eval(code, self.local_dict, self.global_dict) #Changed order to prefer sympy objects to user defined return parsed_expr
def _compileAstMethod(self, name, expr): """ Produce a callable of a single argument with name C{name} that returns the value of the given AST. @param name: The name of the callable. @param expr: The AST to compile. """ f = self.function(name, expr) e = ast.Expression(f) e.filename = self.name c = ExpressionCodeGenerator(e).getCode() return FunctionType(c.co_consts[-1], globals())
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, (), ())
if len(source) < 128: msg += ":\n " + orig_source raise Exception(msg) else: raise recursively_replace(tree, wrap_node) if mode == 'exec': set_filename(filename, lineno - line_offset, tree) cg = ModuleCodeGenerator(tree) else: set_filename(filename, lineno - line_offset, tree) cg = ExpressionCodeGenerator(tree) return cg.getCode() def py_compile_exec_bytecode(source, **kwargs): code = py_compile(source, 'exec', **kwargs) return marshal.dumps(code) def py_compile_eval_bytecode(source, **kwargs): source = source.strip() code = py_compile(source, 'eval', **kwargs) return marshal.dumps(code)