[pypy-svn] r19981 - in pypy/branch/somepbc-refactoring/pypy: rpython rpython/test translator

pedronis at codespeak.net pedronis at codespeak.net
Thu Nov 17 16:35:11 CET 2005


Author: pedronis
Date: Thu Nov 17 16:35:10 2005
New Revision: 19981

Modified:
   pypy/branch/somepbc-refactoring/pypy/rpython/annlowlevel.py
   pypy/branch/somepbc-refactoring/pypy/rpython/test/test_llann.py
   pypy/branch/somepbc-refactoring/pypy/translator/annrpython.py
Log:
(arigo, pedronis)

fixed annlowlevel.py and its basic tests in test_llann.py

now annotator.build_types delegate to the function desc to possibly apply a required specialisation



Modified: pypy/branch/somepbc-refactoring/pypy/rpython/annlowlevel.py
==============================================================================
--- pypy/branch/somepbc-refactoring/pypy/rpython/annlowlevel.py	(original)
+++ pypy/branch/somepbc-refactoring/pypy/rpython/annlowlevel.py	Thu Nov 17 16:35:10 2005
@@ -44,12 +44,8 @@
 class LowLevelAnnotatorPolicy(AnnotatorPolicy):
     allow_someobjects = False
 
-    def default_specialize(pol, bookkeeper, ignored, spaceop, func, args, mono):
-        args_s, kwds_s = args.unpack()
-        assert not kwds_s
-        if not args_s or not isinstance(func, types.FunctionType):
-            return None, None
-        key = [func]
+    def default_specialize(pol, funcdesc, args_s):
+        key = []
         new_args_s = []
         for s_obj in args_s:
             if isinstance(s_obj, annmodel.SomePBC):
@@ -64,7 +60,9 @@
                     # passing non-low-level types to a ll_* function is allowed
                     # for module/ll_*
                     key.append(s_obj.__class__)
-        return tuple(key), bookkeeper.build_args('simple_call', new_args_s)
+        flowgraph = funcdesc.cachedgraph(tuple(key))
+        args_s[:] = new_args_s
+        return flowgraph
 
     def override__init_opaque_object(pol, s_opaqueptr, s_value):
         assert isinstance(s_opaqueptr, annmodel.SomePtr)
@@ -90,14 +88,10 @@
     saved = annotator.policy, annotator.added_blocks
     annotator.policy = LowLevelAnnotatorPolicy()
     try:
-        args = annotator.bookkeeper.build_args('simple_call', args_s)
-        (ll_function, args), key = decide_callable(annotator.bookkeeper, None, ll_function, args, mono=True, unpacked=True)
-        args_s, kwds_s = args.unpack()
-        assert not kwds_s
         annotator.added_blocks = {}
         s = annotator.build_types(ll_function, args_s)
         # invoke annotation simplifications for the new blocks
         annotator.simplify(block_subset=annotator.added_blocks)
     finally:
         annotator.policy, annotator.added_blocks = saved
-    return s, ll_function
+    return s

Modified: pypy/branch/somepbc-refactoring/pypy/rpython/test/test_llann.py
==============================================================================
--- pypy/branch/somepbc-refactoring/pypy/rpython/test/test_llann.py	(original)
+++ pypy/branch/somepbc-refactoring/pypy/rpython/test/test_llann.py	Thu Nov 17 16:35:10 2005
@@ -29,7 +29,7 @@
             s = malloc(S)
             return s.v
         a = self.RPythonAnnotator()
-        s, dontcare = annotate_lowlevel_helper(a, llf, [])
+        s = annotate_lowlevel_helper(a, llf, [])
         assert s.knowntype == int
 
     def test_simple2(self):
@@ -39,7 +39,7 @@
             s = malloc(S2)
             return s.a.v+s.b.v
         a = self.RPythonAnnotator()
-        s, dontcare = annotate_lowlevel_helper(a, llf, [])
+        s = annotate_lowlevel_helper(a, llf, [])
         assert s.knowntype == int
 
     def test_array(self):
@@ -48,7 +48,7 @@
             a = malloc(A, 1)
             return a[0].v
         a = self.RPythonAnnotator()
-        s, dontcare = annotate_lowlevel_helper(a, llf, [])
+        s = annotate_lowlevel_helper(a, llf, [])
         assert s.knowntype == int
 
     def test_prim_array(self):
@@ -57,7 +57,7 @@
             a = malloc(A, 1)
             return a[0]
         a = self.RPythonAnnotator()
-        s, dontcare = annotate_lowlevel_helper(a, llf, [])
+        s = annotate_lowlevel_helper(a, llf, [])
         assert s.knowntype == int
 
     def test_prim_array_setitem(self):
@@ -67,7 +67,7 @@
             a[0] = 3
             return a[0]
         a = self.RPythonAnnotator()
-        s, dontcare = annotate_lowlevel_helper(a, llf, [])
+        s = annotate_lowlevel_helper(a, llf, [])
         assert s.knowntype == int        
         
     def test_cast_simple_widening(self):
@@ -80,7 +80,7 @@
             p3 = cast_pointer(PS1, p2)
             return p3
         a = self.RPythonAnnotator()
-        s, dontcare = annotate_lowlevel_helper(a, llf, [annmodel.SomePtr(PS1)])
+        s = annotate_lowlevel_helper(a, llf, [annmodel.SomePtr(PS1)])
         assert isinstance(s, annmodel.SomePtr)
         assert s.ll_ptrtype == PS1
 
@@ -94,7 +94,7 @@
             p3 = cast_pointer(PS1, p2)
             return p3
         a = self.RPythonAnnotator()
-        s, dontcare = annotate_lowlevel_helper(a, llf, [])
+        s = annotate_lowlevel_helper(a, llf, [])
         assert isinstance(s, annmodel.SomePtr)
         assert s.ll_ptrtype == PS1
 
@@ -105,8 +105,6 @@
         PS1 = Ptr(S1)
         PS2 = Ptr(S2)
         PS3 = Ptr(S3)
-        def llwitness(p12, p13, p21, p23, p31, p32):
-            pass
         def llf():
             p1 = malloc(S1)
             p2 = p1.sub
@@ -117,17 +115,10 @@
             p23 = cast_pointer(PS2, p3)
             p31 = cast_pointer(PS3, p1)
             p32 = cast_pointer(PS3, p2)
-            llwitness(p12, p13, p21, p23, p31, p32)
+            return p12, p13, p21, p23, p31, p32
         a = self.RPythonAnnotator()
-        s, dontcare = annotate_lowlevel_helper(a, llf, [])
-        
-        spec_llwitness = None
-        for call in annotated_calls(a):
-            spec_llwitness = derived(call, 'llwitness')
-
-        g = a.translator.flowgraphs[spec_llwitness]
-        bindings = [a.binding(v) for v in g.getargs()]
-        assert [x.ll_ptrtype for x in bindings] == [PS1, PS1, PS2, PS2, PS3, PS3]
+        s = annotate_lowlevel_helper(a, llf, [])
+        assert [x.ll_ptrtype for x in s.items] == [PS1, PS1, PS2, PS2, PS3, PS3]
             
 
     def test_array_length(self):
@@ -136,7 +127,7 @@
             a = malloc(A, 1)
             return len(a)
         a = self.RPythonAnnotator()
-        s, dontcare = annotate_lowlevel_helper(a, llf, [])
+        s = annotate_lowlevel_helper(a, llf, [])
         assert s.knowntype == int
 
     def test_funcptr(self):
@@ -145,7 +136,7 @@
         def llf(p):
             return p(0)
         a = self.RPythonAnnotator()
-        s, dontcare = annotate_lowlevel_helper(a, llf, [annmodel.SomePtr(PF)])
+        s = annotate_lowlevel_helper(a, llf, [annmodel.SomePtr(PF)])
         assert s.knowntype == int
  
 
@@ -169,33 +160,32 @@
             a2[0] = 2.0
             return ll_get(A, a2, 1)
         a = self.RPythonAnnotator()
-        s, llf2 = annotate_lowlevel_helper(a, llf, [])
-        assert llf2 is llf
+        s = annotate_lowlevel_helper(a, llf, [])
         assert s == annmodel.SomeFloat()
-        g = a.translator.getflowgraph(llf)
-        for_ = {}
+        vTs = []
+        ngraphs = len(a.translator.graphs)
         for call in annotated_calls(a):
             if derived(call, "ll_"):
-                    for_[tuple([x.value for x in call.args[0:2]])] = True
-        assert len(for_) == 4
-        vTs = []
-        for func, T in for_.keys():
-            g = a.translator.getflowgraph(func)
-            args = g.getargs()
-            rv = g.getreturnvar()
-            if len(args) == 2:
-                vT, vn = args
-                vTs.append(vT)
-                assert a.binding(vT) == annmodel.SomePBC({T: True})
-                assert a.binding(vn).knowntype == int
-                assert a.binding(rv).ll_ptrtype.TO == T
-            else:
-                vT, vp, vi = args
-                vTs.append(vT)
-                assert a.binding(vT) == annmodel.SomePBC({T: True})
-                assert a.binding(vi).knowntype == int
-                assert a.binding(vp).ll_ptrtype.TO == T
-                assert a.binding(rv) == annmodel.lltype_to_annotation(T.OF)
+                func = call.args[0].value
+                T = call.args[1].value
+                inputcells = [a.binding(v) for v in call.args[1:]]
+                g = a.bookkeeper.getdesc(func).specialize(inputcells)
+                args = g.getargs()
+                rv = g.getreturnvar()
+                if len(args) == 2:
+                    vT, vn = args
+                    vTs.append(vT)
+                    assert a.binding(vT) == a.bookkeeper.immutablevalue(T)
+                    assert a.binding(vn).knowntype == int
+                    assert a.binding(rv).ll_ptrtype.TO == T
+                else:
+                    vT, vp, vi = args
+                    vTs.append(vT)
+                    assert a.binding(vT) == a.bookkeeper.immutablevalue(T)
+                    assert a.binding(vi).knowntype == int
+                    assert a.binding(vp).ll_ptrtype.TO == T
+                    assert a.binding(rv) == annmodel.lltype_to_annotation(T.OF)
+        assert len(a.translator.graphs) == ngraphs
         return a, vTs
  
     def test_ll_calling_ll2(self):
@@ -220,45 +210,44 @@
             a2[0] = 2.0
             return ll_get(a2, 1)
         a = self.RPythonAnnotator()
-        s, llf2 = annotate_lowlevel_helper(a, llf, [])
-        assert llf2 is llf
+        s = annotate_lowlevel_helper(a, llf, [])
         assert s == annmodel.SomeFloat()
-        g = a.translator.getflowgraph(llf)
-        for_ = {}
+
         def q(v):
             s = a.binding(v)
             if s.is_constant():
                 return s.const
             else:
                 return s.ll_ptrtype
-
-        for call in annotated_calls(a):
-            if derived(call, "ll_") or derived(call, "makelen4"):
-                for_[tuple([q(x) for x in call.args[0:2]])] = True
                 
-        assert len(for_) == 5
         vTs = []
-        for func, T in for_.keys():
-            g = a.translator.getflowgraph(func)
-            args = g.getargs()
-            rv = g.getreturnvar()
-            if isinstance(T, ContainerType):
-                if len(args) == 2:
-                    vT, vn = args
-                    vTs.append(vT)
-                    assert a.binding(vT) == annmodel.SomePBC({T: True})
-                    assert a.binding(vn).knowntype == int
-                    assert a.binding(rv).ll_ptrtype.TO == T
+        ngraphs = len(a.translator.graphs)
+        for call in annotated_calls(a):
+            if derived(call, "ll_") or derived(call, "makelen4"):
+                func = call.args[0].value
+                T = q(call.args[1])
+                inputcells = [a.binding(v) for v in call.args[1:]]
+                g = a.bookkeeper.getdesc(func).specialize(inputcells)
+                args = g.getargs()
+                rv = g.getreturnvar()
+                if isinstance(T, ContainerType):
+                    if len(args) == 2:
+                        vT, vn = args
+                        vTs.append(vT)
+                        assert a.binding(vT) == a.bookkeeper.immutablevalue(T)
+                        assert a.binding(vn).knowntype == int
+                        assert a.binding(rv).ll_ptrtype.TO == T
+                    else:
+                        vT, = args
+                        vTs.append(vT)
+                        assert a.binding(vT) == a.bookkeeper.immutablevalue(T)
+                        assert a.binding(rv).ll_ptrtype.TO == T
                 else:
-                    vT, = args
-                    vTs.append(vT)
-                    assert a.binding(vT) == annmodel.SomePBC({T: True})
-                    assert a.binding(rv).ll_ptrtype.TO == T
-            else:
-                vp, vi = args
-                assert a.binding(vi).knowntype == int
-                assert a.binding(vp).ll_ptrtype == T
-                assert a.binding(rv) == annmodel.lltype_to_annotation(T.TO.OF)
+                    vp, vi = args
+                    assert a.binding(vi).knowntype == int
+                    assert a.binding(vp).ll_ptrtype == T
+                    assert a.binding(rv) == annmodel.lltype_to_annotation(T.TO.OF)
+        assert len(a.translator.graphs) == ngraphs
         return a, vTs
 
     def test_getRuntimeTypeInfo(self):
@@ -267,7 +256,7 @@
         def llf():
             return getRuntimeTypeInfo(S)
         a = self.RPythonAnnotator()
-        s, dontcare = annotate_lowlevel_helper(a, llf, [])
+        s = annotate_lowlevel_helper(a, llf, [])
         assert isinstance(s, annmodel.SomePtr)
         assert s.ll_ptrtype == Ptr(RuntimeTypeInfo)
         assert s.const == getRuntimeTypeInfo(S)
@@ -278,7 +267,7 @@
         def llf(p):
             return runtime_type_info(p)
         a = self.RPythonAnnotator()
-        s, dontcare = annotate_lowlevel_helper(a, llf, [annmodel.SomePtr(Ptr(S))])
+        s = annotate_lowlevel_helper(a, llf, [annmodel.SomePtr(Ptr(S))])
         assert isinstance(s, annmodel.SomePtr)
         assert s.ll_ptrtype == Ptr(RuntimeTypeInfo)
         

Modified: pypy/branch/somepbc-refactoring/pypy/translator/annrpython.py
==============================================================================
--- pypy/branch/somepbc-refactoring/pypy/translator/annrpython.py	(original)
+++ pypy/branch/somepbc-refactoring/pypy/translator/annrpython.py	Thu Nov 17 16:35:10 2005
@@ -73,27 +73,32 @@
 
     def build_types(self, flowgraph, input_arg_types):
         """Recursively build annotations about the specific entry point."""
+        # make input arguments and set their type
+        inputcells = []
+        for t in input_arg_types:
+            if not isinstance(t, annmodel.SomeObject):
+                t = self.bookkeeper.valueoftype(t)
+            inputcells.append(t)
+
         if not isinstance(flowgraph, FunctionGraph):
-            # XXX this part of the interface is only for testing/debugging
             func = flowgraph
             if self.translator is None:
                 from pypy.translator.translator import TranslationContext
                 self.translator = TranslationContext()
                 self.translator.annotator = self
-            flowgraph = self.translator.buildflowgraph(func)
+            specialized = self.bookkeeper.getdesc(func).specialize(inputcells)
+            if not isinstance(specialized, FunctionGraph):
+                assert isinstance(specialized, annmodel.SomeObject)
+                return specialized
+            flowgraph = specialized
+ 
         checkgraph(flowgraph)
         self._register_returnvar(flowgraph)
-        # make input arguments and set their type
-        input_arg_types = list(input_arg_types)
+
         nbarg = len(flowgraph.getargs())
         if len(input_arg_types) != nbarg: 
             raise TypeError("%s expects %d args, got %d" %(       
                             flowgraph, nbarg, len(input_arg_types)))
-        inputcells = []
-        for t in input_arg_types:
-            if not isinstance(t, annmodel.SomeObject):
-                t = self.bookkeeper.valueoftype(t)
-            inputcells.append(t)
         
         # register the entry point
         self.addpendingblock(flowgraph, flowgraph.startblock, inputcells)



More information about the Pypy-commit mailing list