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

Reply via email to