Author: Greg Price <[email protected]>
Branch:
Changeset: r59502:f53b6d32b69b
Date: 2012-12-12 22:32 -0800
http://bitbucket.org/pypy/pypy/changeset/f53b6d32b69b/
Log: signature: support pointer types
diff --git a/pypy/rlib/test/test_signature.py b/pypy/rlib/test/test_signature.py
--- a/pypy/rlib/test/test_signature.py
+++ b/pypy/rlib/test/test_signature.py
@@ -3,12 +3,14 @@
from pypy.rlib import types
from pypy.annotation import model
from pypy.translator.translator import TranslationContext, graphof
+from pypy.rpython.lltypesystem import rstr
+from pypy.rpython.annlowlevel import LowLevelAnnotatorPolicy
-def annotate_at(f):
+def annotate_at(f, policy=None):
t = TranslationContext()
- a = t.buildannotator()
- a.annotate_helper(f, [model.s_ImpossibleValue]*f.func_code.co_argcount)
+ a = t.buildannotator(policy=policy)
+ a.annotate_helper(f, [model.s_ImpossibleValue]*f.func_code.co_argcount,
policy=policy)
return a
def sigof(a, f):
@@ -16,8 +18,8 @@
g = graphof(a.translator, f)
return [a.bindings[v] for v in g.startblock.inputargs] +
[a.bindings[g.getreturnvar()]]
-def getsig(f):
- a = annotate_at(f)
+def getsig(f, policy=None):
+ a = annotate_at(f, policy=policy)
return sigof(a, f)
def check_annotator_fails(caller):
@@ -102,6 +104,20 @@
assert getsig(f) == [model.SomeUnicodeString(), model.SomeInteger()]
+def test_ptr():
+ policy = LowLevelAnnotatorPolicy()
+ @signature(types.ptr(rstr.STR), returns=types.none())
+ def f(buf):
+ pass
+ argtype = getsig(f, policy=policy)[0]
+ assert isinstance(argtype, model.SomePtr)
+ assert argtype.ll_ptrtype.TO == rstr.STR
+
+ def g():
+ f(rstr.mallocstr(10))
+ getsig(g, policy=policy)
+
+
def test_list():
@signature(types.list(types.int()), returns=types.int())
def f(a):
diff --git a/pypy/rlib/types.py b/pypy/rlib/types.py
--- a/pypy/rlib/types.py
+++ b/pypy/rlib/types.py
@@ -34,6 +34,11 @@
return model.SomeChar()
+def ptr(ll_type):
+ from pypy.rpython.lltypesystem.lltype import Ptr
+ return model.SomePtr(Ptr(ll_type))
+
+
def list(element):
listdef = ListDef(None, element, mutated=True, resized=True)
return model.SomeList(listdef)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit