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