Author: Armin Rigo <[email protected]>
Branch:
Changeset: r85121:4e4fa6046959
Date: 2016-06-13 11:53 +0200
http://bitbucket.org/pypy/pypy/changeset/4e4fa6046959/
Log: Add a test checking the conversion_table() function and the
pointer_table array. Add 'immutable' hints on these arrays.
diff --git a/rpython/rtyper/rpbc.py b/rpython/rtyper/rpbc.py
--- a/rpython/rtyper/rpbc.py
+++ b/rpython/rtyper/rpbc.py
@@ -414,7 +414,7 @@
if self.s_pbc.can_be_None:
self.descriptions.insert(0, None)
POINTER_TABLE = Array(self.pointer_repr.lowleveltype,
- hints={'nolength': True})
+ hints={'nolength': True, 'immutable': True})
pointer_table = malloc(POINTER_TABLE, len(self.descriptions),
immortal=True)
for i, desc in enumerate(self.descriptions):
@@ -564,7 +564,7 @@
if r_to in r_from._conversion_tables:
return r_from._conversion_tables[r_to]
else:
- t = malloc(Array(Char, hints={'nolength': True}),
+ t = malloc(Array(Char, hints={'nolength': True, 'immutable': True}),
len(r_from.descriptions), immortal=True)
l = []
for i, d in enumerate(r_from.descriptions):
@@ -577,7 +577,7 @@
if l == range(len(r_from.descriptions)):
r = None
else:
- r = inputconst(Ptr(Array(Char, hints={'nolength': True})), t)
+ r = inputconst(typeOf(t), t)
r_from._conversion_tables[r_to] = r
return r
diff --git a/rpython/rtyper/test/test_rpbc.py b/rpython/rtyper/test/test_rpbc.py
--- a/rpython/rtyper/test/test_rpbc.py
+++ b/rpython/rtyper/test/test_rpbc.py
@@ -2012,6 +2012,36 @@
e = py.test.raises(ValueError, self.interpret, f, [3])
assert str(e.value).startswith(r"exit case '\xff' not found")
+ @py.test.mark.parametrize('limit', [3, 5])
+ def test_conversion_table(self, limit):
+ # with limit==3, check conversion from Char to Ptr(Func).
+ # with limit>3, check conversion from Char to Char.
+ def f1():
+ return 111
+ def f2():
+ return 222
+ def f3():
+ return 333
+ def g(n):
+ if n & 1:
+ return f1
+ else:
+ return f2
+ def f(n):
+ x = g(n) # can be f1 or f2
+ if n > 10:
+ x = f3 # now can be f1 or f2 or f3
+ return x()
+
+ from rpython.config.translationoption import
get_combined_translation_config
+ self.config = get_combined_translation_config(translating=True)
+ self.config.translation.withsmallfuncsets = limit
+ assert self.interpret(f, [3]) == 111
+ assert self.interpret(f, [4]) == 222
+ assert self.interpret(f, [13]) == 333
+ assert self.interpret(f, [14]) == 333
+
+
def test_smallfuncsets_basic():
from rpython.translator.translator import TranslationContext, graphof
from rpython.config.translationoption import
get_combined_translation_config
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit