Author: Amaury Forgeot d'Arc <[email protected]>
Branch: split-ast-classes
Changeset: r65017:14092bb5545c
Date: 2013-06-24 21:34 +0200
http://bitbucket.org/pypy/pypy/changeset/14092bb5545c/

Log:    Progress: obj2mod()

diff --git a/pypy/interpreter/astcompiler/ast.py 
b/pypy/interpreter/astcompiler/ast.py
--- a/pypy/interpreter/astcompiler/ast.py
+++ b/pypy/interpreter/astcompiler/ast.py
@@ -34,6 +34,13 @@
 class W_AST(W_Root):
     w_dict = None
 
+    def obj2mod(self, space):
+        if space.isinstance_w(self, get(space).w_Module):
+            return Module.from_object(space, self)
+        else:
+            raise OperationError(space.w_TypeError, space.wrap(
+                    "Expected mod node"))
+
     def getdict(self, space):
         if self.w_dict is None:
             self.w_dict = space.newdict(instance=True)
@@ -138,6 +145,12 @@
         w_body = space.newlist(body_w)
         space.setattr(w_node, space.wrap('body'), w_body)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        body = space.getattr(w_node, space.wrap('body'))
+        return Module(body)
+
 State.ast_type('Module', 'mod')
 
 
@@ -163,6 +176,12 @@
         w_body = space.newlist(body_w)
         space.setattr(w_node, space.wrap('body'), w_body)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        body = space.getattr(w_node, space.wrap('body'))
+        return Interactive(body)
+
 State.ast_type('Interactive', 'mod')
 
 
@@ -183,6 +202,12 @@
         w_body = self.body.to_object(space)  # expr
         space.setattr(w_node, space.wrap('body'), w_body)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        body = space.getattr(w_node, space.wrap('body'))
+        return Expression(body)
+
 State.ast_type('Expression', 'mod')
 
 
@@ -208,6 +233,12 @@
         w_body = space.newlist(body_w)
         space.setattr(w_node, space.wrap('body'), w_body)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        body = space.getattr(w_node, space.wrap('body'))
+        return Suite(body)
+
 State.ast_type('Suite', 'mod')
 
 
@@ -257,6 +288,15 @@
         w_decorator_list = space.newlist(decorator_list_w)
         space.setattr(w_node, space.wrap('decorator_list'), w_decorator_list)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        name = space.getattr(w_node, space.wrap('name'))
+        args = space.getattr(w_node, space.wrap('args'))
+        body = space.getattr(w_node, space.wrap('body'))
+        decorator_list = space.getattr(w_node, space.wrap('decorator_list'))
+        return FunctionDef(name, args, body, decorator_list)
+
 State.ast_type('FunctionDef', 'stmt')
 
 
@@ -304,6 +344,15 @@
         w_decorator_list = space.newlist(decorator_list_w)
         space.setattr(w_node, space.wrap('decorator_list'), w_decorator_list)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        name = space.getattr(w_node, space.wrap('name'))
+        bases = space.getattr(w_node, space.wrap('bases'))
+        body = space.getattr(w_node, space.wrap('body'))
+        decorator_list = space.getattr(w_node, space.wrap('decorator_list'))
+        return ClassDef(name, bases, body, decorator_list)
+
 State.ast_type('ClassDef', 'stmt')
 
 
@@ -326,6 +375,12 @@
         w_value = self.value.to_object(space)  # expr
         space.setattr(w_node, space.wrap('value'), w_value)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        value = space.getattr(w_node, space.wrap('value'))
+        return Return(value)
+
 State.ast_type('Return', 'stmt')
 
 
@@ -352,6 +407,12 @@
         w_targets = space.newlist(targets_w)
         space.setattr(w_node, space.wrap('targets'), w_targets)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        targets = space.getattr(w_node, space.wrap('targets'))
+        return Delete(targets)
+
 State.ast_type('Delete', 'stmt')
 
 
@@ -382,6 +443,13 @@
         w_value = self.value.to_object(space)  # expr
         space.setattr(w_node, space.wrap('value'), w_value)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        targets = space.getattr(w_node, space.wrap('targets'))
+        value = space.getattr(w_node, space.wrap('value'))
+        return Assign(targets, value)
+
 State.ast_type('Assign', 'stmt')
 
 
@@ -410,6 +478,14 @@
         w_value = self.value.to_object(space)  # expr
         space.setattr(w_node, space.wrap('value'), w_value)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        target = space.getattr(w_node, space.wrap('target'))
+        op = space.getattr(w_node, space.wrap('op'))
+        value = space.getattr(w_node, space.wrap('value'))
+        return AugAssign(target, op, value)
+
 State.ast_type('AugAssign', 'stmt')
 
 
@@ -444,6 +520,14 @@
         w_nl = self.nl.to_object(space)  # bool
         space.setattr(w_node, space.wrap('nl'), w_nl)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        dest = space.getattr(w_node, space.wrap('dest'))
+        values = space.getattr(w_node, space.wrap('values'))
+        nl = space.getattr(w_node, space.wrap('nl'))
+        return Print(dest, values, nl)
+
 State.ast_type('Print', 'stmt')
 
 
@@ -487,6 +571,15 @@
         w_orelse = space.newlist(orelse_w)
         space.setattr(w_node, space.wrap('orelse'), w_orelse)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        target = space.getattr(w_node, space.wrap('target'))
+        iter = space.getattr(w_node, space.wrap('iter'))
+        body = space.getattr(w_node, space.wrap('body'))
+        orelse = space.getattr(w_node, space.wrap('orelse'))
+        return For(target, iter, body, orelse)
+
 State.ast_type('For', 'stmt')
 
 
@@ -526,6 +619,14 @@
         w_orelse = space.newlist(orelse_w)
         space.setattr(w_node, space.wrap('orelse'), w_orelse)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        test = space.getattr(w_node, space.wrap('test'))
+        body = space.getattr(w_node, space.wrap('body'))
+        orelse = space.getattr(w_node, space.wrap('orelse'))
+        return While(test, body, orelse)
+
 State.ast_type('While', 'stmt')
 
 
@@ -565,6 +666,14 @@
         w_orelse = space.newlist(orelse_w)
         space.setattr(w_node, space.wrap('orelse'), w_orelse)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        test = space.getattr(w_node, space.wrap('test'))
+        body = space.getattr(w_node, space.wrap('body'))
+        orelse = space.getattr(w_node, space.wrap('orelse'))
+        return If(test, body, orelse)
+
 State.ast_type('If', 'stmt')
 
 
@@ -600,6 +709,14 @@
         w_body = space.newlist(body_w)
         space.setattr(w_node, space.wrap('body'), w_body)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        context_expr = space.getattr(w_node, space.wrap('context_expr'))
+        optional_vars = space.getattr(w_node, space.wrap('optional_vars'))
+        body = space.getattr(w_node, space.wrap('body'))
+        return With(context_expr, optional_vars, body)
+
 State.ast_type('With', 'stmt')
 
 
@@ -632,6 +749,14 @@
         w_tback = self.tback.to_object(space)  # expr
         space.setattr(w_node, space.wrap('tback'), w_tback)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        type = space.getattr(w_node, space.wrap('type'))
+        inst = space.getattr(w_node, space.wrap('inst'))
+        tback = space.getattr(w_node, space.wrap('tback'))
+        return Raise(type, inst, tback)
+
 State.ast_type('Raise', 'stmt')
 
 
@@ -676,6 +801,14 @@
         w_orelse = space.newlist(orelse_w)
         space.setattr(w_node, space.wrap('orelse'), w_orelse)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        body = space.getattr(w_node, space.wrap('body'))
+        handlers = space.getattr(w_node, space.wrap('handlers'))
+        orelse = space.getattr(w_node, space.wrap('orelse'))
+        return TryExcept(body, handlers, orelse)
+
 State.ast_type('TryExcept', 'stmt')
 
 
@@ -711,6 +844,13 @@
         w_finalbody = space.newlist(finalbody_w)
         space.setattr(w_node, space.wrap('finalbody'), w_finalbody)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        body = space.getattr(w_node, space.wrap('body'))
+        finalbody = space.getattr(w_node, space.wrap('finalbody'))
+        return TryFinally(body, finalbody)
+
 State.ast_type('TryFinally', 'stmt')
 
 
@@ -737,6 +877,13 @@
         w_msg = self.msg.to_object(space)  # expr
         space.setattr(w_node, space.wrap('msg'), w_msg)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        test = space.getattr(w_node, space.wrap('test'))
+        msg = space.getattr(w_node, space.wrap('msg'))
+        return Assert(test, msg)
+
 State.ast_type('Assert', 'stmt')
 
 
@@ -763,6 +910,12 @@
         w_names = space.newlist(names_w)
         space.setattr(w_node, space.wrap('names'), w_names)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        names = space.getattr(w_node, space.wrap('names'))
+        return Import(names)
+
 State.ast_type('Import', 'stmt')
 
 
@@ -795,6 +948,14 @@
         w_level = space.wrap(self.level)  # int
         space.setattr(w_node, space.wrap('level'), w_level)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        module = space.getattr(w_node, space.wrap('module'))
+        names = space.getattr(w_node, space.wrap('names'))
+        level = space.getattr(w_node, space.wrap('level'))
+        return ImportFrom(module, names, level)
+
 State.ast_type('ImportFrom', 'stmt')
 
 
@@ -826,6 +987,14 @@
         w_locals = self.locals.to_object(space)  # expr
         space.setattr(w_node, space.wrap('locals'), w_locals)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        body = space.getattr(w_node, space.wrap('body'))
+        globals = space.getattr(w_node, space.wrap('globals'))
+        locals = space.getattr(w_node, space.wrap('locals'))
+        return Exec(body, globals, locals)
+
 State.ast_type('Exec', 'stmt')
 
 
@@ -850,6 +1019,12 @@
         w_names = space.newlist(names_w)
         space.setattr(w_node, space.wrap('names'), w_names)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        names = space.getattr(w_node, space.wrap('names'))
+        return Global(names)
+
 State.ast_type('Global', 'stmt')
 
 
@@ -871,6 +1046,12 @@
         w_value = self.value.to_object(space)  # expr
         space.setattr(w_node, space.wrap('value'), w_value)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        value = space.getattr(w_node, space.wrap('value'))
+        return Expr(value)
+
 State.ast_type('Expr', 'stmt')
 
 
@@ -888,6 +1069,11 @@
     def to_object(self, space):
         w_node = space.call_function(get(space).w_Pass)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        return Pass()
+
 State.ast_type('Pass', 'stmt')
 
 
@@ -905,6 +1091,11 @@
     def to_object(self, space):
         w_node = space.call_function(get(space).w_Break)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        return Break()
+
 State.ast_type('Break', 'stmt')
 
 
@@ -922,6 +1113,11 @@
     def to_object(self, space):
         w_node = space.call_function(get(space).w_Continue)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        return Continue()
+
 State.ast_type('Continue', 'stmt')
 
 
@@ -958,6 +1154,13 @@
         w_values = space.newlist(values_w)
         space.setattr(w_node, space.wrap('values'), w_values)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        op = space.getattr(w_node, space.wrap('op'))
+        values = space.getattr(w_node, space.wrap('values'))
+        return BoolOp(op, values)
+
 State.ast_type('BoolOp', 'expr')
 
 
@@ -986,6 +1189,14 @@
         w_right = self.right.to_object(space)  # expr
         space.setattr(w_node, space.wrap('right'), w_right)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        left = space.getattr(w_node, space.wrap('left'))
+        op = space.getattr(w_node, space.wrap('op'))
+        right = space.getattr(w_node, space.wrap('right'))
+        return BinOp(left, op, right)
+
 State.ast_type('BinOp', 'expr')
 
 
@@ -1010,6 +1221,13 @@
         w_operand = self.operand.to_object(space)  # expr
         space.setattr(w_node, space.wrap('operand'), w_operand)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        op = space.getattr(w_node, space.wrap('op'))
+        operand = space.getattr(w_node, space.wrap('operand'))
+        return UnaryOp(op, operand)
+
 State.ast_type('UnaryOp', 'expr')
 
 
@@ -1035,6 +1253,13 @@
         w_body = self.body.to_object(space)  # expr
         space.setattr(w_node, space.wrap('body'), w_body)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        args = space.getattr(w_node, space.wrap('args'))
+        body = space.getattr(w_node, space.wrap('body'))
+        return Lambda(args, body)
+
 State.ast_type('Lambda', 'expr')
 
 
@@ -1064,6 +1289,14 @@
         w_orelse = self.orelse.to_object(space)  # expr
         space.setattr(w_node, space.wrap('orelse'), w_orelse)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        test = space.getattr(w_node, space.wrap('test'))
+        body = space.getattr(w_node, space.wrap('body'))
+        orelse = space.getattr(w_node, space.wrap('orelse'))
+        return IfExp(test, body, orelse)
+
 State.ast_type('IfExp', 'expr')
 
 
@@ -1099,6 +1332,13 @@
         w_values = space.newlist(values_w)
         space.setattr(w_node, space.wrap('values'), w_values)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        keys = space.getattr(w_node, space.wrap('keys'))
+        values = space.getattr(w_node, space.wrap('values'))
+        return Dict(keys, values)
+
 State.ast_type('Dict', 'expr')
 
 
@@ -1125,6 +1365,12 @@
         w_elts = space.newlist(elts_w)
         space.setattr(w_node, space.wrap('elts'), w_elts)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        elts = space.getattr(w_node, space.wrap('elts'))
+        return Set(elts)
+
 State.ast_type('Set', 'expr')
 
 
@@ -1155,6 +1401,13 @@
         w_generators = space.newlist(generators_w)
         space.setattr(w_node, space.wrap('generators'), w_generators)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        elt = space.getattr(w_node, space.wrap('elt'))
+        generators = space.getattr(w_node, space.wrap('generators'))
+        return ListComp(elt, generators)
+
 State.ast_type('ListComp', 'expr')
 
 
@@ -1185,6 +1438,13 @@
         w_generators = space.newlist(generators_w)
         space.setattr(w_node, space.wrap('generators'), w_generators)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        elt = space.getattr(w_node, space.wrap('elt'))
+        generators = space.getattr(w_node, space.wrap('generators'))
+        return SetComp(elt, generators)
+
 State.ast_type('SetComp', 'expr')
 
 
@@ -1219,6 +1479,14 @@
         w_generators = space.newlist(generators_w)
         space.setattr(w_node, space.wrap('generators'), w_generators)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        key = space.getattr(w_node, space.wrap('key'))
+        value = space.getattr(w_node, space.wrap('value'))
+        generators = space.getattr(w_node, space.wrap('generators'))
+        return DictComp(key, value, generators)
+
 State.ast_type('DictComp', 'expr')
 
 
@@ -1249,6 +1517,13 @@
         w_generators = space.newlist(generators_w)
         space.setattr(w_node, space.wrap('generators'), w_generators)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        elt = space.getattr(w_node, space.wrap('elt'))
+        generators = space.getattr(w_node, space.wrap('generators'))
+        return GeneratorExp(elt, generators)
+
 State.ast_type('GeneratorExp', 'expr')
 
 
@@ -1271,6 +1546,12 @@
         w_value = self.value.to_object(space)  # expr
         space.setattr(w_node, space.wrap('value'), w_value)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        value = space.getattr(w_node, space.wrap('value'))
+        return Yield(value)
+
 State.ast_type('Yield', 'expr')
 
 
@@ -1308,6 +1589,14 @@
         w_comparators = space.newlist(comparators_w)
         space.setattr(w_node, space.wrap('comparators'), w_comparators)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        left = space.getattr(w_node, space.wrap('left'))
+        ops = space.getattr(w_node, space.wrap('ops'))
+        comparators = space.getattr(w_node, space.wrap('comparators'))
+        return Compare(left, ops, comparators)
+
 State.ast_type('Compare', 'expr')
 
 
@@ -1357,6 +1646,16 @@
         w_kwargs = self.kwargs.to_object(space)  # expr
         space.setattr(w_node, space.wrap('kwargs'), w_kwargs)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        func = space.getattr(w_node, space.wrap('func'))
+        args = space.getattr(w_node, space.wrap('args'))
+        keywords = space.getattr(w_node, space.wrap('keywords'))
+        starargs = space.getattr(w_node, space.wrap('starargs'))
+        kwargs = space.getattr(w_node, space.wrap('kwargs'))
+        return Call(func, args, keywords, starargs, kwargs)
+
 State.ast_type('Call', 'expr')
 
 
@@ -1378,6 +1677,12 @@
         w_value = self.value.to_object(space)  # expr
         space.setattr(w_node, space.wrap('value'), w_value)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        value = space.getattr(w_node, space.wrap('value'))
+        return Repr(value)
+
 State.ast_type('Repr', 'expr')
 
 
@@ -1398,6 +1703,12 @@
         w_n = self.n  # object
         space.setattr(w_node, space.wrap('n'), w_n)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        n = space.getattr(w_node, space.wrap('n'))
+        return Num(n)
+
 State.ast_type('Num', 'expr')
 
 
@@ -1418,6 +1729,12 @@
         w_s = self.s  # string
         space.setattr(w_node, space.wrap('s'), w_s)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        s = space.getattr(w_node, space.wrap('s'))
+        return Str(s)
+
 State.ast_type('Str', 'expr')
 
 
@@ -1445,6 +1762,14 @@
         w_ctx = expr_context_to_class[self.ctx - 1]().to_object(space)  # 
expr_context
         space.setattr(w_node, space.wrap('ctx'), w_ctx)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        value = space.getattr(w_node, space.wrap('value'))
+        attr = space.getattr(w_node, space.wrap('attr'))
+        ctx = space.getattr(w_node, space.wrap('ctx'))
+        return Attribute(value, attr, ctx)
+
 State.ast_type('Attribute', 'expr')
 
 
@@ -1473,6 +1798,14 @@
         w_ctx = expr_context_to_class[self.ctx - 1]().to_object(space)  # 
expr_context
         space.setattr(w_node, space.wrap('ctx'), w_ctx)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        value = space.getattr(w_node, space.wrap('value'))
+        slice = space.getattr(w_node, space.wrap('slice'))
+        ctx = space.getattr(w_node, space.wrap('ctx'))
+        return Subscript(value, slice, ctx)
+
 State.ast_type('Subscript', 'expr')
 
 
@@ -1496,6 +1829,13 @@
         w_ctx = expr_context_to_class[self.ctx - 1]().to_object(space)  # 
expr_context
         space.setattr(w_node, space.wrap('ctx'), w_ctx)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        id = space.getattr(w_node, space.wrap('id'))
+        ctx = space.getattr(w_node, space.wrap('ctx'))
+        return Name(id, ctx)
+
 State.ast_type('Name', 'expr')
 
 
@@ -1525,6 +1865,13 @@
         w_ctx = expr_context_to_class[self.ctx - 1]().to_object(space)  # 
expr_context
         space.setattr(w_node, space.wrap('ctx'), w_ctx)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        elts = space.getattr(w_node, space.wrap('elts'))
+        ctx = space.getattr(w_node, space.wrap('ctx'))
+        return List(elts, ctx)
+
 State.ast_type('List', 'expr')
 
 
@@ -1554,6 +1901,13 @@
         w_ctx = expr_context_to_class[self.ctx - 1]().to_object(space)  # 
expr_context
         space.setattr(w_node, space.wrap('ctx'), w_ctx)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        elts = space.getattr(w_node, space.wrap('elts'))
+        ctx = space.getattr(w_node, space.wrap('ctx'))
+        return Tuple(elts, ctx)
+
 State.ast_type('Tuple', 'expr')
 
 
@@ -1574,6 +1928,12 @@
         w_value = self.value  # object
         space.setattr(w_node, space.wrap('value'), w_value)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        value = space.getattr(w_node, space.wrap('value'))
+        return Const(value)
+
 State.ast_type('Const', 'expr')
 
 
@@ -1643,6 +2003,11 @@
     def to_object(self, space):
         w_node = space.call_function(get(space).w_Ellipsis)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        return Ellipsis()
+
 State.ast_type('Ellipsis', 'slice')
 
 
@@ -1674,6 +2039,14 @@
         w_step = self.step.to_object(space)  # expr
         space.setattr(w_node, space.wrap('step'), w_step)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        lower = space.getattr(w_node, space.wrap('lower'))
+        upper = space.getattr(w_node, space.wrap('upper'))
+        step = space.getattr(w_node, space.wrap('step'))
+        return Slice(lower, upper, step)
+
 State.ast_type('Slice', 'slice')
 
 
@@ -1699,6 +2072,12 @@
         w_dims = space.newlist(dims_w)
         space.setattr(w_node, space.wrap('dims'), w_dims)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        dims = space.getattr(w_node, space.wrap('dims'))
+        return ExtSlice(dims)
+
 State.ast_type('ExtSlice', 'slice')
 
 
@@ -1719,6 +2098,12 @@
         w_value = self.value.to_object(space)  # expr
         space.setattr(w_node, space.wrap('value'), w_value)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        value = space.getattr(w_node, space.wrap('value'))
+        return Index(value)
+
 State.ast_type('Index', 'slice')
 
 
@@ -1980,6 +2365,14 @@
         w_ifs = space.newlist(ifs_w)
         space.setattr(w_node, space.wrap('ifs'), w_ifs)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        target = space.getattr(w_node, space.wrap('target'))
+        iter = space.getattr(w_node, space.wrap('iter'))
+        ifs = space.getattr(w_node, space.wrap('ifs'))
+        return comprehension(target, iter, ifs)
+
 State.ast_type('comprehension', 'AST')
 
 class excepthandler(AST):
@@ -2022,6 +2415,14 @@
         w_body = space.newlist(body_w)
         space.setattr(w_node, space.wrap('body'), w_body)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        type = space.getattr(w_node, space.wrap('type'))
+        name = space.getattr(w_node, space.wrap('name'))
+        body = space.getattr(w_node, space.wrap('body'))
+        return ExceptHandler(type, name, body)
+
 State.ast_type('ExceptHandler', 'excepthandler')
 
 
@@ -2062,6 +2463,15 @@
         w_defaults = space.newlist(defaults_w)
         space.setattr(w_node, space.wrap('defaults'), w_defaults)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        args = space.getattr(w_node, space.wrap('args'))
+        vararg = space.getattr(w_node, space.wrap('vararg'))
+        kwarg = space.getattr(w_node, space.wrap('kwarg'))
+        defaults = space.getattr(w_node, space.wrap('defaults'))
+        return arguments(args, vararg, kwarg, defaults)
+
 State.ast_type('arguments', 'AST')
 
 class keyword(AST):
@@ -2084,6 +2494,13 @@
         w_value = self.value.to_object(space)  # expr
         space.setattr(w_node, space.wrap('value'), w_value)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        arg = space.getattr(w_node, space.wrap('arg'))
+        value = space.getattr(w_node, space.wrap('value'))
+        return keyword(arg, value)
+
 State.ast_type('keyword', 'AST')
 
 class alias(AST):
@@ -2105,6 +2522,13 @@
         w_asname = space.wrap(self.asname)  # identifier
         space.setattr(w_node, space.wrap('asname'), w_asname)
         return w_node
+
+    @staticmethod
+    def from_object(space, w_node):
+        name = space.getattr(w_node, space.wrap('name'))
+        asname = space.getattr(w_node, space.wrap('asname'))
+        return alias(name, asname)
+
 State.ast_type('alias', 'AST')
 
 class ASTVisitor(object):
diff --git a/pypy/interpreter/astcompiler/test/test_ast.py 
b/pypy/interpreter/astcompiler/test/test_ast.py
--- a/pypy/interpreter/astcompiler/test/test_ast.py
+++ b/pypy/interpreter/astcompiler/test/test_ast.py
@@ -27,3 +27,11 @@
         w_node = node.to_object(space)
         w_op = space.getattr(w_node, space.wrap("op"))
         assert space.isinstance_w(w_op, ast.get(space).w_operator)
+
+    def from_object(self, space):
+        value = space.wrap(42)
+        w_node = space.call_function(ast.get(space).w_Num)
+        space.setattr(w_node, space.wrap('n'), value)
+        node = ast.Num.from_object(space, w_node)
+        assert node.n is value
+        
diff --git a/pypy/interpreter/astcompiler/tools/asdl_py.py 
b/pypy/interpreter/astcompiler/tools/asdl_py.py
--- a/pypy/interpreter/astcompiler/tools/asdl_py.py
+++ b/pypy/interpreter/astcompiler/tools/asdl_py.py
@@ -128,6 +128,10 @@
             wrapper = self.get_value_converter(field, "self.%s" % field.name)
             return ["w_%s = %s  # %s" % (field.name, wrapper, field.type)]
 
+    def get_field_extractor(self, field):
+        lines = ["%s = space.getattr(w_node, space.wrap('%s'))" % (field.name, 
field.name)]
+        return lines
+
     def make_converters(self, fields, name):
         self.emit("def to_object(self, space):", 1)
         self.emit("w_node = space.call_function(get(space).w_%s)" % name, 2)
@@ -138,6 +142,16 @@
             self.emit("space.setattr(w_node, space.wrap(%r), w_%s)" % (
                     str(field.name), field.name), 2)
         self.emit("return w_node", 2)
+        self.emit("")
+        self.emit("@staticmethod", 1)
+        self.emit("def from_object(space, w_node):", 1)
+        for field in fields:
+            unwrapping_code = self.get_field_extractor(field)
+            for line in unwrapping_code:
+                self.emit(line, 2)
+        self.emit("return %s(%s)" % (
+                name, ', '.join(str(field.name) for field in fields)), 2)
+        self.emit("")
 
     def make_constructor(self, fields, node, extras=None, base=None):
         if fields or extras:
@@ -349,6 +363,13 @@
 class W_AST(W_Root):
     w_dict = None
 
+    def obj2mod(self, space):
+        if space.isinstance_w(self, get(space).w_Module):
+            return Module.from_object(space, self)
+        else:
+            raise OperationError(space.w_TypeError, space.wrap(
+                    "Expected mod node"))
+
     def getdict(self, space):
         if self.w_dict is None:
             self.w_dict = space.newdict(instance=True)
diff --git a/pypy/module/__builtin__/compiling.py 
b/pypy/module/__builtin__/compiling.py
--- a/pypy/module/__builtin__/compiling.py
+++ b/pypy/module/__builtin__/compiling.py
@@ -28,8 +28,7 @@
     w_ast_type = space.gettypeobject(ast.W_AST.typedef)
     str_ = None
     if space.isinstance_w(w_source, w_ast_type):
-        ast_node = space.interp_w(ast.mod, w_source)
-        ast_node.sync_app_attrs(space)
+        ast_node = space.interp_w(ast.W_AST, w_source).obj2mod(space)
     elif space.isinstance_w(w_source, space.w_unicode):
         w_utf_8_source = space.call_method(w_source, "encode",
                                            space.wrap("utf-8"))
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to