[pypy-svn] r30105 - in pypy/dist/pypy/translator/cli: . test
antocuni at codespeak.net
antocuni at codespeak.net
Mon Jul 17 10:27:29 CEST 2006
Author: antocuni
Date: Mon Jul 17 10:27:22 2006
New Revision: 30105
Modified:
pypy/dist/pypy/translator/cli/cts.py
pypy/dist/pypy/translator/cli/metavm.py
pypy/dist/pypy/translator/cli/opcodes.py
pypy/dist/pypy/translator/cli/test/test_objectmodel.py
Log:
Initial support for weak references.
Modified: pypy/dist/pypy/translator/cli/cts.py
==============================================================================
--- pypy/dist/pypy/translator/cli/cts.py (original)
+++ pypy/dist/pypy/translator/cli/cts.py Mon Jul 17 10:27:22 2006
@@ -6,6 +6,7 @@
from pypy.rpython.lltypesystem.lltype import SignedLongLong, UnsignedLongLong
from pypy.rpython.ootypesystem import ootype
+from pypy.rpython.lltypesystem.llmemory import WeakGcAddress
from pypy.translator.cli.option import getoption
from pypy.translator.cli import oopspec
@@ -14,6 +15,7 @@
log = py.log.Producer("cli")
py.log.setconsumer("cli", ansi_log)
+WEAKREF = '[mscorlib]System.WeakReference'
PYPY_LIST = '[pypylib]pypy.runtime.List`1<%s>'
PYPY_LIST_OF_VOID = '[pypylib]pypy.runtime.ListOfVoid'
PYPY_DICT = '[pypylib]pypy.runtime.Dict`2<%s, %s>'
@@ -35,6 +37,7 @@
ootype.Class: 'class [mscorlib]System.Type',
ootype.String: 'string',
ootype.StringBuilder: 'class ' + PYPY_STRING_BUILDER,
+ WeakGcAddress: 'class ' + WEAKREF,
# maps generic types to their ordinal
ootype.List.SELFTYPE_T: 'class ' + (PYPY_LIST % '!0'),
Modified: pypy/dist/pypy/translator/cli/metavm.py
==============================================================================
--- pypy/dist/pypy/translator/cli/metavm.py (original)
+++ pypy/dist/pypy/translator/cli/metavm.py Mon Jul 17 10:27:22 2006
@@ -117,7 +117,13 @@
'[mscorlib]System.Collections.Generic.IEqualityComparer`1<!0>)'
% dict_type)
-
+class _CastWeakAdrToPtr(MicroInstruction):
+ def render(self, generator, op):
+ RESULTTYPE = op.result.concretetype
+ resulttype = generator.cts.lltype_to_cts(RESULTTYPE)
+ generator.load(op.args[0])
+ generator.ilasm.call_method('object class [mscorlib]System.WeakReference::get_Target()', True)
+ generator.ilasm.opcode('castclass', resulttype)
Call = _Call()
CallMethod = _CallMethod()
@@ -129,3 +135,4 @@
OOString = _OOString()
DownCast = _DownCast()
NewCustomDict = _NewCustomDict()
+CastWeakAdrToPtr = _CastWeakAdrToPtr()
Modified: pypy/dist/pypy/translator/cli/opcodes.py
==============================================================================
--- pypy/dist/pypy/translator/cli/opcodes.py (original)
+++ pypy/dist/pypy/translator/cli/opcodes.py Mon Jul 17 10:27:22 2006
@@ -1,5 +1,6 @@
from pypy.translator.cli.metavm import Call, CallMethod, RuntimeNew, \
- IndirectCall, GetField, SetField, CastTo, OOString, DownCast, NewCustomDict
+ IndirectCall, GetField, SetField, CastTo, OOString, DownCast, NewCustomDict,\
+ CastWeakAdrToPtr
from pypy.translator.oosupport.metavm import PushArg, PushAllArgs, StoreResult, InstructionList,\
New
@@ -61,6 +62,9 @@
'direct_call': [Call],
'indirect_call': [IndirectCall],
+ 'cast_ptr_to_weakadr': [PushAllArgs, 'newobj instance void class [mscorlib]System.WeakReference::.ctor(object)'],
+ 'cast_weakadr_to_ptr': [CastWeakAdrToPtr],
+
# __________ numeric operations __________
'bool_not': [PushAllArgs]+Not,
Modified: pypy/dist/pypy/translator/cli/test/test_objectmodel.py
==============================================================================
--- pypy/dist/pypy/translator/cli/test/test_objectmodel.py (original)
+++ pypy/dist/pypy/translator/cli/test/test_objectmodel.py Mon Jul 17 10:27:22 2006
@@ -2,8 +2,31 @@
from pypy.translator.cli.test.runtest import CliTest
from pypy.rpython.test.test_objectmodel import BaseTestObjectModel
+from pypy.rpython.objectmodel import cast_object_to_weakgcaddress,\
+ cast_weakgcaddress_to_object
+
def skip_r_dict(self):
py.test.skip('r_dict support is still incomplete')
class TestCliObjectModel(CliTest, BaseTestObjectModel):
test_rtype_r_dict_bm = skip_r_dict
+
+ # this test is copied from TestLLtype in
+ # rpython/test_objectmodel.py. It is not in TestOOtype because at
+ # the moment llinterpret can't handle cast_*weakadr*
+ def test_cast_to_and_from_weakaddress(self):
+ class A(object):
+ pass
+ class B(object):
+ pass
+ def f():
+ a = A()
+ addr = cast_object_to_weakgcaddress(a)
+ return a is cast_weakgcaddress_to_object(addr, A)
+ res = self.interpret(f, [])
+ assert res
+## def g():
+## a = A()
+## addr = cast_object_to_weakgcaddress(a)
+## return cast_weakgcaddress_to_int(addr)
+## assert isinstance(self.interpret(f, []), int)
More information about the Pypy-commit
mailing list