[pypy-commit] pypy default: Add tests, and write the missing corners (non-translated casts
arigo
noreply at buildbot.pypy.org
Sat Apr 28 11:27:45 CEST 2012
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r54782:3260900bdd46
Date: 2012-04-28 10:08 +0200
http://bitbucket.org/pypy/pypy/changeset/3260900bdd46/
Log: Add tests, and write the missing corners (non-translated casts
from/to None)
diff --git a/pypy/rpython/annlowlevel.py b/pypy/rpython/annlowlevel.py
--- a/pypy/rpython/annlowlevel.py
+++ b/pypy/rpython/annlowlevel.py
@@ -488,6 +488,8 @@
else:
TO = PTR
if not hasattr(object, '_carry_around_for_tests'):
+ if object is None:
+ return lltype.nullptr(PTR.TO)
assert not hasattr(object, '_TYPE')
object._carry_around_for_tests = True
object._TYPE = TO
@@ -557,6 +559,8 @@
"""NOT_RPYTHON: hack. Reverse the hacking done in cast_object_to_ptr()."""
if isinstance(lltype.typeOf(ptr), lltype.Ptr):
ptr = ptr._as_obj()
+ if ptr is None:
+ return None
if not isinstance(ptr, Class):
raise NotImplementedError("cast_base_ptr_to_instance: casting %r to %r"
% (ptr, Class))
diff --git a/pypy/rpython/test/test_llann.py b/pypy/rpython/test/test_llann.py
--- a/pypy/rpython/test/test_llann.py
+++ b/pypy/rpython/test/test_llann.py
@@ -9,6 +9,7 @@
from pypy.rpython.annlowlevel import MixLevelHelperAnnotator
from pypy.rpython.annlowlevel import PseudoHighLevelCallable
from pypy.rpython.annlowlevel import llhelper, cast_instance_to_base_ptr
+from pypy.rpython.annlowlevel import cast_base_ptr_to_instance
from pypy.rpython.annlowlevel import base_ptr_lltype
from pypy.rpython.llinterp import LLInterpreter
from pypy.rpython.test.test_llinterp import interpret
@@ -502,7 +503,10 @@
self.y = y
def f(x, y):
- a = A(x, y)
+ if x > 20:
+ a = None
+ else:
+ a = A(x, y)
a1 = cast_instance_to_base_ptr(a)
return a1
@@ -510,3 +514,30 @@
assert typeOf(res) == base_ptr_lltype()
assert fishllattr(res, 'x') == 5
assert fishllattr(res, 'y') == 10
+
+ res = interpret(f, [25, 10])
+ assert res == nullptr(base_ptr_lltype().TO)
+
+
+def test_cast_base_ptr_to_instance():
+ class A:
+ def __init__(self, x, y):
+ self.x = x
+ self.y = y
+
+ def f(x, y):
+ if x > 20:
+ a = None
+ else:
+ a = A(x, y)
+ a1 = cast_instance_to_base_ptr(a)
+ b = cast_base_ptr_to_instance(A, a1)
+ return a is b
+
+ assert f(5, 10) is True
+ assert f(25, 10) is True
+
+ res = interpret(f, [5, 10])
+ assert res is True
+ res = interpret(f, [25, 10])
+ assert res is True
More information about the pypy-commit
mailing list