Author: Amaury Forgeot d'Arc <amaur...@gmail.com>
Branch: split-ast-classes
Changeset: r65020:f4e2683859c2
Date: 2013-06-24 23:17 +0200
http://bitbucket.org/pypy/pypy/changeset/f4e2683859c2/

Log:    Fixes for optional fields

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
@@ -137,6 +137,8 @@
 class mod(AST):
     @staticmethod
     def from_object(space, w_node):
+        if space.is_w(w_node, space.w_None):
+            return None
         if space.isinstance_w(w_node, get(space).w_Module):
             return Module.from_object(space, w_node)
         if space.isinstance_w(w_node, get(space).w_Interactive):
@@ -282,6 +284,8 @@
 
     @staticmethod
     def from_object(space, w_node):
+        if space.is_w(w_node, space.w_None):
+            return None
         if space.isinstance_w(w_node, get(space).w_FunctionDef):
             return FunctionDef.from_object(space, w_node)
         if space.isinstance_w(w_node, get(space).w_ClassDef):
@@ -477,7 +481,7 @@
 
     def to_object(self, space):
         w_node = space.call_function(get(space).w_Return)
-        w_value = self.value.to_object(space)  # expr
+        w_value = self.value.to_object(space) if self.value else space.w_None  
# expr
         space.setattr(w_node, space.wrap('value'), w_value)
         w_lineno = space.wrap(self.lineno)  # int
         space.setattr(w_node, space.wrap('lineno'), w_lineno)
@@ -642,7 +646,7 @@
 
     def to_object(self, space):
         w_node = space.call_function(get(space).w_Print)
-        w_dest = self.dest.to_object(space)  # expr
+        w_dest = self.dest.to_object(space) if self.dest else space.w_None  # 
expr
         space.setattr(w_node, space.wrap('dest'), w_dest)
         if self.values is None:
             values_w = []
@@ -871,7 +875,7 @@
         w_node = space.call_function(get(space).w_With)
         w_context_expr = self.context_expr.to_object(space)  # expr
         space.setattr(w_node, space.wrap('context_expr'), w_context_expr)
-        w_optional_vars = self.optional_vars.to_object(space)  # expr
+        w_optional_vars = self.optional_vars.to_object(space) if 
self.optional_vars else space.w_None  # expr
         space.setattr(w_node, space.wrap('optional_vars'), w_optional_vars)
         if self.body is None:
             body_w = []
@@ -921,11 +925,11 @@
 
     def to_object(self, space):
         w_node = space.call_function(get(space).w_Raise)
-        w_type = self.type.to_object(space)  # expr
+        w_type = self.type.to_object(space) if self.type else space.w_None  # 
expr
         space.setattr(w_node, space.wrap('type'), w_type)
-        w_inst = self.inst.to_object(space)  # expr
+        w_inst = self.inst.to_object(space) if self.inst else space.w_None  # 
expr
         space.setattr(w_node, space.wrap('inst'), w_inst)
-        w_tback = self.tback.to_object(space)  # expr
+        w_tback = self.tback.to_object(space) if self.tback else space.w_None  
# expr
         space.setattr(w_node, space.wrap('tback'), w_tback)
         w_lineno = space.wrap(self.lineno)  # int
         space.setattr(w_node, space.wrap('lineno'), w_lineno)
@@ -1081,7 +1085,7 @@
         w_node = space.call_function(get(space).w_Assert)
         w_test = self.test.to_object(space)  # expr
         space.setattr(w_node, space.wrap('test'), w_test)
-        w_msg = self.msg.to_object(space)  # expr
+        w_msg = self.msg.to_object(space) if self.msg else space.w_None  # expr
         space.setattr(w_node, space.wrap('msg'), w_msg)
         w_lineno = space.wrap(self.lineno)  # int
         space.setattr(w_node, space.wrap('lineno'), w_lineno)
@@ -1211,9 +1215,9 @@
         w_node = space.call_function(get(space).w_Exec)
         w_body = self.body.to_object(space)  # expr
         space.setattr(w_node, space.wrap('body'), w_body)
-        w_globals = self.globals.to_object(space)  # expr
+        w_globals = self.globals.to_object(space) if self.globals else 
space.w_None  # expr
         space.setattr(w_node, space.wrap('globals'), w_globals)
-        w_locals = self.locals.to_object(space)  # expr
+        w_locals = self.locals.to_object(space) if self.locals else 
space.w_None  # expr
         space.setattr(w_node, space.wrap('locals'), w_locals)
         w_lineno = space.wrap(self.lineno)  # int
         space.setattr(w_node, space.wrap('lineno'), w_lineno)
@@ -1396,6 +1400,8 @@
 
     @staticmethod
     def from_object(space, w_node):
+        if space.is_w(w_node, space.w_None):
+            return None
         if space.isinstance_w(w_node, get(space).w_BoolOp):
             return BoolOp.from_object(space, w_node)
         if space.isinstance_w(w_node, get(space).w_BinOp):
@@ -1943,7 +1949,7 @@
 
     def to_object(self, space):
         w_node = space.call_function(get(space).w_Yield)
-        w_value = self.value.to_object(space)  # expr
+        w_value = self.value.to_object(space) if self.value else space.w_None  
# expr
         space.setattr(w_node, space.wrap('value'), w_value)
         w_lineno = space.wrap(self.lineno)  # int
         space.setattr(w_node, space.wrap('lineno'), w_lineno)
@@ -2057,9 +2063,9 @@
             keywords_w = [node.to_object(space) for node in self.keywords] # 
keyword
         w_keywords = space.newlist(keywords_w)
         space.setattr(w_node, space.wrap('keywords'), w_keywords)
-        w_starargs = self.starargs.to_object(space)  # expr
+        w_starargs = self.starargs.to_object(space) if self.starargs else 
space.w_None  # expr
         space.setattr(w_node, space.wrap('starargs'), w_starargs)
-        w_kwargs = self.kwargs.to_object(space)  # expr
+        w_kwargs = self.kwargs.to_object(space) if self.kwargs else 
space.w_None  # expr
         space.setattr(w_node, space.wrap('kwargs'), w_kwargs)
         w_lineno = space.wrap(self.lineno)  # int
         space.setattr(w_node, space.wrap('lineno'), w_lineno)
@@ -2489,6 +2495,8 @@
 class slice(AST):
     @staticmethod
     def from_object(space, w_node):
+        if space.is_w(w_node, space.w_None):
+            return None
         if space.isinstance_w(w_node, get(space).w_Ellipsis):
             return Ellipsis.from_object(space, w_node)
         if space.isinstance_w(w_node, get(space).w_Slice):
@@ -2542,11 +2550,11 @@
 
     def to_object(self, space):
         w_node = space.call_function(get(space).w_Slice)
-        w_lower = self.lower.to_object(space)  # expr
+        w_lower = self.lower.to_object(space) if self.lower else space.w_None  
# expr
         space.setattr(w_node, space.wrap('lower'), w_lower)
-        w_upper = self.upper.to_object(space)  # expr
+        w_upper = self.upper.to_object(space) if self.upper else space.w_None  
# expr
         space.setattr(w_node, space.wrap('upper'), w_upper)
-        w_step = self.step.to_object(space)  # expr
+        w_step = self.step.to_object(space) if self.step else space.w_None  # 
expr
         space.setattr(w_node, space.wrap('step'), w_step)
         return w_node
 
@@ -2965,6 +2973,8 @@
 
     @staticmethod
     def from_object(space, w_node):
+        if space.is_w(w_node, space.w_None):
+            return None
         if space.isinstance_w(w_node, get(space).w_ExceptHandler):
             return ExceptHandler.from_object(space, w_node)
         raise operationerrfmt(space.w_TypeError,
@@ -2993,9 +3003,9 @@
 
     def to_object(self, space):
         w_node = space.call_function(get(space).w_ExceptHandler)
-        w_type = self.type.to_object(space)  # expr
+        w_type = self.type.to_object(space) if self.type else space.w_None  # 
expr
         space.setattr(w_node, space.wrap('type'), w_type)
-        w_name = self.name.to_object(space)  # expr
+        w_name = self.name.to_object(space) if self.name else space.w_None  # 
expr
         space.setattr(w_node, space.wrap('name'), w_name)
         if self.body is None:
             body_w = []
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
@@ -92,6 +92,8 @@
                 self.emit("")
             self.emit("@staticmethod", 1)
             self.emit("def from_object(space, w_node):", 1)
+            self.emit("if space.is_w(w_node, space.w_None):", 2)
+            self.emit("    return None", 2)
             for typ in sum.types:
                 self.emit("if space.isinstance_w(w_node, get(space).w_%s):"
                           % (typ.name,), 2)
@@ -126,8 +128,11 @@
         elif field.type.value in ("identifier", "int"):
             return "space.wrap(%s)" % (value,)
         else:
-            return "%s.to_object(space)" % (value,)
-
+            wrapper = "%s.to_object(space)" % (value,)
+            if field.opt:
+                wrapper += " if %s else space.w_None" % (value,)
+            return wrapper
+        
     def get_value_extractor(self, field, value):
         if field.type.value in self.data.simple_types:
             return "%s.from_object(space, %s)" % (field.type, value)
diff --git a/pypy/module/_ast/__init__.py b/pypy/module/_ast/__init__.py
--- a/pypy/module/_ast/__init__.py
+++ b/pypy/module/_ast/__init__.py
@@ -13,6 +13,7 @@
 
 def _setup():
     defs = Module.interpleveldefs
+    defs['AST'] = "pypy.interpreter.astcompiler.ast.get(space).w_AST"
     for (name, base, fields) in ast.State.AST_TYPES:
         defs[name] = "pypy.interpreter.astcompiler.ast.get(space).w_" + name
 _setup()
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to