Author: Ronan Lamy <[email protected]>
Branch:
Changeset: r89708:584f6da010f3
Date: 2017-01-23 19:11 +0000
http://bitbucket.org/pypy/pypy/changeset/584f6da010f3/
Log: Make astcompiler code more annotator-friendly
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
@@ -1,6 +1,8 @@
# Generated by tools/asdl_py.py
from rpython.tool.pairtype import extendabletype
from rpython.tool.sourcetools import func_with_new_name
+from rpython.rlib.signature import signature, finishsigs
+from rpython.rlib import types
from pypy.interpreter import typedef
from pypy.interpreter.baseobjspace import W_Root
@@ -32,6 +34,7 @@
class AST(object):
__metaclass__ = extendabletype
+ _attrs_ = ['lineno', 'col_offset']
def walkabout(self, visitor):
raise AssertionError("walkabout() implementation not provided")
@@ -139,7 +142,7 @@
self.w_AST = space.gettypeobject(W_AST.typedef)
for (name, base, fields, attributes) in self.AST_TYPES:
self.make_new_type(space, name, base, fields, attributes)
-
+
def make_new_type(self, space, name, base, fields, attributes):
w_base = getattr(self, 'w_%s' % base)
w_dict = space.newdict()
@@ -151,7 +154,7 @@
space.setitem_str(w_dict, "_attributes",
space.newtuple([space.wrap(a) for a in
attributes]))
w_type = space.call_function(
- space.w_type,
+ space.w_type,
space.wrap(name), space.newtuple([w_base]), w_dict)
setattr(self, 'w_%s' % name, w_type)
@@ -1883,8 +1886,8 @@
def mutate_over(self, visitor):
self.elt = self.elt.mutate_over(visitor)
- if self.generators:
- visitor._mutate_sequence(self.generators)
+ for i in range(len(self.generators)):
+ self.generators[i] = self.generators[i].mutate_over(visitor)
return visitor.visit_ListComp(self)
def to_object(self, space):
@@ -1931,8 +1934,8 @@
def mutate_over(self, visitor):
self.elt = self.elt.mutate_over(visitor)
- if self.generators:
- visitor._mutate_sequence(self.generators)
+ for i in range(len(self.generators)):
+ self.generators[i] = self.generators[i].mutate_over(visitor)
return visitor.visit_SetComp(self)
def to_object(self, space):
@@ -1981,8 +1984,8 @@
def mutate_over(self, visitor):
self.key = self.key.mutate_over(visitor)
self.value = self.value.mutate_over(visitor)
- if self.generators:
- visitor._mutate_sequence(self.generators)
+ for i in range(len(self.generators)):
+ self.generators[i] = self.generators[i].mutate_over(visitor)
return visitor.visit_DictComp(self)
def to_object(self, space):
@@ -2033,8 +2036,8 @@
def mutate_over(self, visitor):
self.elt = self.elt.mutate_over(visitor)
- if self.generators:
- visitor._mutate_sequence(self.generators)
+ for i in range(len(self.generators)):
+ self.generators[i] = self.generators[i].mutate_over(visitor)
return visitor.visit_GeneratorExp(self)
def to_object(self, space):
@@ -3106,6 +3109,7 @@
_NotIn,
]
+@finishsigs
class comprehension(AST):
def __init__(self, target, iter, ifs):
@@ -3113,6 +3117,7 @@
self.iter = iter
self.ifs = ifs
+ @signature(types.self(), types.any(), returns=types.self())
def mutate_over(self, visitor):
self.target = self.target.mutate_over(visitor)
self.iter = self.iter.mutate_over(visitor)
diff --git a/pypy/interpreter/astcompiler/codegen.py
b/pypy/interpreter/astcompiler/codegen.py
--- a/pypy/interpreter/astcompiler/codegen.py
+++ b/pypy/interpreter/astcompiler/codegen.py
@@ -7,6 +7,7 @@
# you figure out a way to remove them, great, but try a translation first,
# please.
+from rpython.rlib.objectmodel import specialize
from pypy.interpreter.astcompiler import ast, assemble, symtable, consts, misc
from pypy.interpreter.astcompiler import optimize # For side effects
from pypy.interpreter.pyparser.error import SyntaxError
@@ -1027,11 +1028,17 @@
def visit_ListComp(self, lc):
self.update_position(lc.lineno)
- if len(lc.generators) != 1 or lc.generators[0].ifs:
+ if len(lc.generators) == 1:
+ comp = lc.generators[0]
+ assert isinstance(comp, ast.comprehension)
+ if comp.ifs:
+ single = False
+ self.emit_op_arg(ops.BUILD_LIST, 0)
+ else:
+ single = True
+ else:
single = False
self.emit_op_arg(ops.BUILD_LIST, 0)
- else:
- single = True
self._listcomp_generator(lc.generators, 0, lc.elt, single=single)
def _comp_generator(self, node, generators, gen_index):
diff --git a/pypy/interpreter/astcompiler/optimize.py
b/pypy/interpreter/astcompiler/optimize.py
--- a/pypy/interpreter/astcompiler/optimize.py
+++ b/pypy/interpreter/astcompiler/optimize.py
@@ -6,6 +6,7 @@
from pypy.interpreter.error import OperationError
from rpython.rlib.unroll import unrolling_iterable
from rpython.rlib.runicode import MAXUNICODE
+from rpython.rlib.objectmodel import specialize
def optimize_ast(space, tree, compile_info):
@@ -165,6 +166,7 @@
self.space = space
self.compile_info = compile_info
+ @specialize.argtype(1)
def default_visitor(self, node):
return node
diff --git a/rpython/rlib/types.py b/rpython/rlib/types.py
--- a/rpython/rlib/types.py
+++ b/rpython/rlib/types.py
@@ -76,8 +76,8 @@
return model.SomeDict(dictdef)
-def instance(cls):
- return lambda bookkeeper:
model.SomeInstance(bookkeeper.getuniqueclassdef(cls))
+def instance(cls, can_be_None=False):
+ return lambda bookkeeper:
model.SomeInstance(bookkeeper.getuniqueclassdef(cls), can_be_None=can_be_None)
class SelfTypeMarker(object):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit