Example #1
0
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, (), ())
Example #2
0
    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
Example #3
0
    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())
Example #4
0
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,
        (),
        (),
    )
Example #5
0
File: eval.py Project: alon/polinax
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, (), ())
Example #6
0
            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)