[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