[pypy-svn] r69879 - in pypy/branch/virtual-forcing/pypy: annotation rlib rlib/test

arigo at codespeak.net arigo at codespeak.net
Thu Dec 3 21:57:11 CET 2009


Author: arigo
Date: Thu Dec  3 21:57:09 2009
New Revision: 69879

Modified:
   pypy/branch/virtual-forcing/pypy/annotation/binaryop.py
   pypy/branch/virtual-forcing/pypy/rlib/_jit_vref.py
   pypy/branch/virtual-forcing/pypy/rlib/test/test__jit_vref.py
Log:
Mixing with None is fine.


Modified: pypy/branch/virtual-forcing/pypy/annotation/binaryop.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/annotation/binaryop.py	(original)
+++ pypy/branch/virtual-forcing/pypy/annotation/binaryop.py	Thu Dec  3 21:57:09 2009
@@ -785,6 +785,8 @@
         glob = globals()
     loc = locals()
     source = py.code.Source("""
+        from pypy.tool.pairtype import pairtype
+        from pypy.annotation.model import SomePBC, SomeObject
         class __extend__(pairtype(%(classname)s, SomePBC)):
             def union((obj, pbc)):
                 if pbc.isNone():

Modified: pypy/branch/virtual-forcing/pypy/rlib/_jit_vref.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/rlib/_jit_vref.py	(original)
+++ pypy/branch/virtual-forcing/pypy/rlib/_jit_vref.py	Thu Dec  3 21:57:09 2009
@@ -1,4 +1,5 @@
 from pypy.annotation import model as annmodel
+from pypy.annotation.binaryop import _make_none_union
 from pypy.rpython.extregistry import ExtRegistryEntry
 from pypy.rpython.rclass import getinstancerepr
 from pypy.rpython.rmodel import Repr
@@ -11,6 +12,9 @@
     def __init__(self, s_instance):
         self.s_instance = s_instance
 
+    def can_be_none(self):
+        return True
+
     def simple_call(self):
         return self.s_instance
 
@@ -22,6 +26,8 @@
     def rtyper_makekey(self):
         return self.__class__,
 
+_make_none_union('SomeVRef', 'obj.s_instance', globals())
+
 
 class VRefRepr(Repr):
     def __init__(self, rtyper):
@@ -33,5 +39,5 @@
 
     def rtype_simple_call(self, hop):
         [v] = hop.inputargs(self)
-        v = hop.genop('jit_virtual_force', [v], resulttype = OBJECTPTR)
+        v = hop.genop('jit_force_virtual', [v], resulttype = OBJECTPTR)
         return hop.genop('cast_pointer', [v], resulttype = hop.r_result)

Modified: pypy/branch/virtual-forcing/pypy/rlib/test/test__jit_vref.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/rlib/test/test__jit_vref.py	(original)
+++ pypy/branch/virtual-forcing/pypy/rlib/test/test__jit_vref.py	Thu Dec  3 21:57:09 2009
@@ -52,6 +52,18 @@
     assert isinstance(s.s_instance, annmodel.SomeInstance)
     assert s.s_instance.classdef == a.bookkeeper.getuniqueclassdef(X)
 
+def test_annotate_4():
+    def f(n):
+        if n > 0:
+            return virtual_ref(X())
+        else:
+            return None
+    a = RPythonAnnotator()
+    s = a.build_types(f, [int])
+    assert isinstance(s, SomeVRef)
+    assert isinstance(s.s_instance, annmodel.SomeInstance)
+    assert s.s_instance.classdef == a.bookkeeper.getuniqueclassdef(X)
+
 def test_rtype_1():
     def f():
         return virtual_ref(X())



More information about the Pypy-commit mailing list