Author: Armin Rigo <[email protected]>
Branch:
Changeset: r50261:090ec341827b
Date: 2011-12-07 14:55 +0100
http://bitbucket.org/pypy/pypy/changeset/090ec341827b/
Log: Progress.
diff --git a/pypy/objspace/fake/checkmodule.py
b/pypy/objspace/fake/checkmodule.py
--- a/pypy/objspace/fake/checkmodule.py
+++ b/pypy/objspace/fake/checkmodule.py
@@ -1,50 +1,12 @@
-from pypy.objspace.fake.objspace import FakeObjSpace, W_Root, is_root
-from pypy.interpreter import gateway
-
-
-class ModuleChecker(object):
-
- def __init__(self):
- self.space = FakeObjSpace()
-
- def load_module(self, modname):
- space = self.space
- mod = __import__('pypy.module.%s' % modname, None, None, ['__doc__'])
- # force computation and record what we wrap
- del space.seen_wrap[:]
- module = mod.Module(space, W_Root())
- for name in module.loaders:
- module._load_lazily(space, name)
- self.seen = space.seen_wrap[:]
-
- def collect_entry_points(self):
- self.entry_points = []
- for value in self.seen:
- if isinstance(value, gateway.interp2app):
- self.collect_interp2app(value)
-
- def collect_interp2app(self, interp2app):
- space = self.space
- activation = interp2app._code.activation
- scopelen = interp2app._code.sig.scope_length()
- scope_w = [W_Root()] * scopelen
- #
- def check():
- w_result = activation._run(space, scope_w)
- is_root(w_result)
- #
- self.entry_points.append(check)
-
- def check_translates(self):
- def entry_point():
- for fn in entry_points:
- fn()
- entry_points = self.entry_points
- self.space.translates(entry_point)
+from pypy.objspace.fake.objspace import FakeObjSpace, W_Root
def checkmodule(modname):
- checker = ModuleChecker()
- checker.load_module(modname)
- checker.collect_entry_points()
- checker.check_translates()
+ space = FakeObjSpace()
+ mod = __import__('pypy.module.%s' % modname, None, None, ['__doc__'])
+ # force computation and record what we wrap
+ module = mod.Module(space, W_Root())
+ for name in module.loaders:
+ module._load_lazily(space, name)
+ #
+ space.translates()
diff --git a/pypy/objspace/fake/objspace.py b/pypy/objspace/fake/objspace.py
--- a/pypy/objspace/fake/objspace.py
+++ b/pypy/objspace/fake/objspace.py
@@ -1,6 +1,5 @@
from pypy.interpreter.baseobjspace import W_Root, ObjSpace
-from pypy.interpreter import argument
-from pypy.translator.driver import TranslationDriver
+from pypy.interpreter import argument, gateway
from pypy.annotation.model import SomeInstance, s_None
from pypy.rpython.extregistry import ExtRegistryEntry
from pypy.rpython.lltypesystem import lltype
@@ -8,6 +7,7 @@
from pypy.rlib.unroll import unrolling_iterable
from pypy.rlib.objectmodel import we_are_translated
from pypy.rlib.nonconst import NonConstant
+from pypy.translator.translator import TranslationContext
def is_root(w_obj):
@@ -38,7 +38,7 @@
class FakeObjSpace(ObjSpace):
def __init__(self):
- self.seen_wrap = []
+ self._seen_extras = []
ObjSpace.__init__(self)
def is_true(self, w_obj):
@@ -50,11 +50,21 @@
return W_Root()
def wrap(self, x):
- if not we_are_translated():
- self.seen_wrap.append(x)
+ if isinstance(x, gateway.interp2app):
+ self._see_interp2app(x)
return W_Root()
wrap._annspecialcase_ = "specialize:argtype(1)"
+ def _see_interp2app(self, interp2app):
+ "NOT_RPYTHON"
+ activation = interp2app._code.activation
+ scopelen = interp2app._code.sig.scope_length()
+ scope_w = [W_Root()] * scopelen
+ def check():
+ w_result = activation._run(self, scope_w)
+ is_root(w_result)
+ self._seen_extras.append(check)
+
def call_args(self, w_func, args):
is_root(w_func)
is_arguments(args)
@@ -72,14 +82,20 @@
# ----------
- def translates(self, func, argtypes=None):
- if argtypes is None:
- nb_args = func.func_code.co_argcount
- argtypes = [W_Root] * nb_args
+ def translates(self, func=None, argtypes=None):
+ if func is not None:
+ if argtypes is None:
+ nb_args = func.func_code.co_argcount
+ argtypes = [W_Root] * nb_args
#
- driver = TranslationDriver()
- driver.setup(func, argtypes)
- driver.proceed(['rtype_lltype'])
+ t = TranslationContext()
+ ann = t.buildannotator()
+ if func is not None:
+ ann.build_types(func, argtypes)
+ for check in self._seen_extras:
+ ann.build_types(check, [])
+ t.buildrtyper().specialize()
+ t.checkgraphs()
def setup():
diff --git a/pypy/objspace/fake/test/test_checkmodule.py
b/pypy/objspace/fake/test/test_checkmodule.py
--- a/pypy/objspace/fake/test/test_checkmodule.py
+++ b/pypy/objspace/fake/test/test_checkmodule.py
@@ -1,5 +1,25 @@
-from pypy.objspace.fake.checkmodule import checkmodule
+from pypy.objspace.fake.checkmodule import checkmodule, FakeObjSpace
+from pypy.interpreter.gateway import interp2app
+def make_checker():
+ check = []
+ def see():
+ check.append(True)
+ see._annspecialcase_ = 'specialize:memo'
+ return see, check
+
+
+def test_wrap_interp2app():
+ see, check = make_checker()
+ space = FakeObjSpace()
+ assert len(space._seen_extras) == 0
+ assert len(check) == 0
+ space.wrap(interp2app(lambda space: see()))
+ assert len(space._seen_extras) == 1
+ assert len(check) == 0
+ space.translates(lambda: None)
+ assert len(check) == 1
+
def test_itertools_module():
checkmodule('itertools')
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit