Author: Maciej Fijalkowski <[email protected]>
Branch: more-reusal-of-structures
Changeset: r65345:cb84b0c40d85
Date: 2013-07-11 16:48 +0200
http://bitbucket.org/pypy/pypy/changeset/cb84b0c40d85/

Log:    park those changes on a branch for now

diff --git a/rpython/jit/codewriter/codewriter.py 
b/rpython/jit/codewriter/codewriter.py
--- a/rpython/jit/codewriter/codewriter.py
+++ b/rpython/jit/codewriter/codewriter.py
@@ -13,7 +13,7 @@
 
 class CodeWriter(object):
     callcontrol = None    # for tests
-    debug = False
+    debug = True
 
     def __init__(self, cpu=None, jitdrivers_sd=[]):
         self.cpu = cpu
diff --git a/rpython/rtyper/lltypesystem/rdict.py 
b/rpython/rtyper/lltypesystem/rdict.py
--- a/rpython/rtyper/lltypesystem/rdict.py
+++ b/rpython/rtyper/lltypesystem/rdict.py
@@ -1,7 +1,7 @@
 from rpython.tool.pairtype import pairtype
 from rpython.flowspace.model import Constant
 from rpython.rtyper.rdict import AbstractDictRepr, AbstractDictIteratorRepr
-from rpython.rtyper.lltypesystem import lltype
+from rpython.rtyper.lltypesystem import lltype, llmemory
 from rpython.rlib import objectmodel, jit
 from rpython.rlib.debug import ll_assert
 from rpython.rlib.rarithmetic import r_uint, intmask, LONG_BIT
@@ -50,7 +50,8 @@
             assert callable(key_repr)
             self._key_repr_computer = key_repr
         else:
-            self.external_key_repr, self.key_repr = self.pickkeyrepr(key_repr)
+            self.external_key_repr, self.key_repr = self.pickrepr(key_repr,
+                                                                  is_key=True)
         if not isinstance(value_repr, rmodel.Repr):  # not computed yet, done 
by setup()
             assert callable(value_repr)
             self._value_repr_computer = value_repr
@@ -63,13 +64,11 @@
         self.force_non_null = force_non_null
         # setup() needs to be called to finish this initialization
 
-    def _externalvsinternal(self, rtyper, item_repr):
-        return rmodel.externalvsinternal(self.rtyper, item_repr)
-
     def _setup_repr(self):
         if 'key_repr' not in self.__dict__:
             key_repr = self._key_repr_computer()
-            self.external_key_repr, self.key_repr = self.pickkeyrepr(key_repr)
+            self.external_key_repr, self.key_repr = self.pickrepr(key_repr,
+                                                                  is_key=True)
         if 'value_repr' not in self.__dict__:
             self.external_value_repr, self.value_repr = 
self.pickrepr(self._value_repr_computer())
         if isinstance(self.DICT, lltype.GcForwardReference):
@@ -832,6 +831,8 @@
 
 def recast(P, v):
     if isinstance(P, lltype.Ptr):
+        if P == llmemory.GCREF:
+            return lltype.cast_opaque_ptr(P, v)
         return lltype.cast_pointer(P, v)
     else:
         return v
diff --git a/rpython/rtyper/rdict.py b/rpython/rtyper/rdict.py
--- a/rpython/rtyper/rdict.py
+++ b/rpython/rtyper/rdict.py
@@ -32,13 +32,12 @@
 
 class AbstractDictRepr(rmodel.Repr):
 
-    def pickrepr(self, item_repr):
+    def pickrepr(self, item_repr, is_key=False):
         if self.custom_eq_hash:
             return item_repr, item_repr
         else:
-            return self._externalvsinternal(self.rtyper, item_repr)
-
-    pickkeyrepr = pickrepr
+            return rmodel.externalvsinternal(self.rtyper, item_repr,
+                                             is_key=is_key)
 
     def compact_repr(self):
         return 'DictR %s %s' % (self.key_repr.compact_repr(), 
self.value_repr.compact_repr())
diff --git a/rpython/rtyper/rmodel.py b/rpython/rtyper/rmodel.py
--- a/rpython/rtyper/rmodel.py
+++ b/rpython/rtyper/rmodel.py
@@ -1,7 +1,7 @@
 from rpython.annotator import model as annmodel, unaryop, binaryop, description
 from rpython.flowspace.model import Constant
 from rpython.rtyper.error import TyperError, MissingRTypeOperation
-from rpython.rtyper.lltypesystem import lltype
+from rpython.rtyper.lltypesystem import lltype, llmemory
 from rpython.rtyper.lltypesystem.lltype import (Void, Bool, Float, typeOf,
     LowLevelType, isCompatibleType)
 from rpython.tool.pairtype import pairtype, extendabletype, pair
@@ -433,13 +433,17 @@
                                             Constant('gc')).value
     return alloc_flavor
 
-def externalvsinternal(rtyper, item_repr): # -> external_item_repr, 
(internal_)item_repr
+def externalvsinternal(rtyper, item_repr, is_key=False): # -> 
external_item_repr, (internal_)item_repr
     from rpython.rtyper import rclass
-    if (isinstance(item_repr, rclass.AbstractInstanceRepr) and
-        getattr(item_repr, 'gcflavor', 'gc') == 'gc'):
-        return item_repr, rclass.getinstancerepr(rtyper, None)
+    TP = item_repr.lowleveltype
+    if not is_key:
+        if isinstance(TP, lltype.Ptr) and TP.TO._gckind == 'gc':
+            return item_repr, rtyper.gcref_repr
     else:
-        return item_repr, item_repr
+        if (isinstance(item_repr, rclass.AbstractInstanceRepr) and
+            getattr(item_repr, 'gcflavor', 'gc') == 'gc'):
+            return item_repr, rclass.getinstancerepr(rtyper, None)
+    return item_repr, item_repr
 
 
 class DummyValueBuilder(object):
diff --git a/rpython/rtyper/rtyper.py b/rpython/rtyper/rtyper.py
--- a/rpython/rtyper/rtyper.py
+++ b/rpython/rtyper/rtyper.py
@@ -23,6 +23,7 @@
 from rpython.rtyper.lltypesystem.lltype import (Signed, Void, LowLevelType,
     Ptr, ContainerType, FuncType, functionptr, typeOf, RuntimeTypeInfo,
     attachRuntimeTypeInfo, Primitive)
+from rpython.rtyper.lltypesystem import llmemory
 from rpython.rtyper.ootypesystem import ootype
 from rpython.rtyper.rmodel import Repr, inputconst, BrokenReprTyperError
 from rpython.rtyper.typesystem import LowLevelTypeSystem, 
ObjectOrientedTypeSystem
@@ -68,6 +69,8 @@
         self.typererror_count = 0
         # make the primitive_to_repr constant mapping
         self.primitive_to_repr = {}
+        self.gcref_repr = self.getrepr(annmodel.lltype_to_annotation(
+            llmemory.GCREF))
         if self.type_system.offers_exceptiondata:
             self.exceptiondata = 
self.type_system.exceptiondata.ExceptionData(self)
         else:
@@ -918,7 +921,17 @@
     def convertvar(self, v, r_from, r_to):
         assert isinstance(v, (Variable, Constant))
         if r_from != r_to:
-            v = pair(r_from, r_to).convert_from_to(v, self)
+            # we add a special conversion of opaque pointers
+            if (r_from.lowleveltype == llmemory.GCREF and
+                isinstance(r_to.lowleveltype, Ptr)):
+                v = self.genop('cast_opaque_ptr', [v],
+                               resulttype=r_to.lowleveltype)
+            elif (r_to.lowleveltype == llmemory.GCREF and
+                isinstance(r_from.lowleveltype, Ptr)):
+                v = self.genop('cast_opaque_ptr', [v],
+                               resulttype=r_to.lowleveltype)
+            else:
+                v = pair(r_from, r_to).convert_from_to(v, self)
             if v is NotImplemented:
                 raise TyperError("don't know how to convert from %r to %r" %
                                  (r_from, r_to))
diff --git a/rpython/rtyper/test/test_rdict.py 
b/rpython/rtyper/test/test_rdict.py
--- a/rpython/rtyper/test/test_rdict.py
+++ b/rpython/rtyper/test/test_rdict.py
@@ -1056,18 +1056,6 @@
 
 
 
-class TestOOtype(BaseTestRdict, OORtypeMixin):
-
-    def test_recursive(self):
-        def func(i):
-            dic = {i: {}}
-            dic[i] = dic
-            return dic[i]
-        res = self.interpret(func, [5])
-        assert res.ll_get(5) is res
-
-    # ____________________________________________________________
-
 class TestStress:
 
     def test_stress(self):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to