[pypy-svn] r53336 - in pypy/branch/less-meta-instances/pypy/rpython: . lltypesystem ootypesystem test
arigo at codespeak.net
arigo at codespeak.net
Fri Apr 4 18:18:24 CEST 2008
Author: arigo
Date: Fri Apr 4 18:18:22 2008
New Revision: 53336
Modified:
pypy/branch/less-meta-instances/pypy/rpython/lltypesystem/rclass.py
pypy/branch/less-meta-instances/pypy/rpython/ootypesystem/rclass.py
pypy/branch/less-meta-instances/pypy/rpython/rclass.py
pypy/branch/less-meta-instances/pypy/rpython/rpbc.py
pypy/branch/less-meta-instances/pypy/rpython/test/test_rclass.py
Log:
(antocuni, arigo) More progress...
Modified: pypy/branch/less-meta-instances/pypy/rpython/lltypesystem/rclass.py
==============================================================================
--- pypy/branch/less-meta-instances/pypy/rpython/lltypesystem/rclass.py (original)
+++ pypy/branch/less-meta-instances/pypy/rpython/lltypesystem/rclass.py Fri Apr 4 18:18:22 2008
@@ -166,7 +166,10 @@
if cast_to_typeptr:
vtable = cast_vtable_to_typeptr(vtable)
return vtable
- getruntime = getvtable
+
+ def getruntime(self, expected_type):
+ assert expected_type == CLASSTYPE
+ return self.getvtable()
def setup_vtable(self, vtable, rsubcls):
"""Initialize the 'self' portion of the 'vtable' belonging to the
Modified: pypy/branch/less-meta-instances/pypy/rpython/ootypesystem/rclass.py
==============================================================================
--- pypy/branch/less-meta-instances/pypy/rpython/ootypesystem/rclass.py (original)
+++ pypy/branch/less-meta-instances/pypy/rpython/ootypesystem/rclass.py Fri Apr 4 18:18:22 2008
@@ -83,7 +83,7 @@
def setup_meta_instance(self, meta_instance, rsubcls):
if self.classdef is None:
rinstance = getinstancerepr(self.rtyper, rsubcls.classdef)
- setattr(meta_instance, 'class_', rinstance.lowleveltype._class)
+ meta_instance.class_ = ootype.runtimeClass(rinstance.lowleveltype)
else:
# setup class attributes: for each attribute name at the level
# of 'self', look up its value in the subclass rsubcls
@@ -106,8 +106,15 @@
# then initialize the 'super' portion of the vtable
self.rbase.setup_meta_instance(meta_instance, rsubcls)
- getruntime = get_meta_instance
-
+ def getruntime(self, expected_type):
+ if expected_type == ootype.Class:
+ rinstance = getinstancerepr(self.rtyper, self.classdef)
+ return ootype.runtimeClass(rinstance.lowleveltype)
+ else:
+ assert ootype.isSubclass(expected_type, META)
+ meta = self.get_meta_instance(cast_to_root_meta=False)
+ return ootype.ooupcast(expected_type, meta)
+
def fromclasstype(self, vclass, llops):
assert ootype.isSubclass(vclass.concretetype, META)
if self.lowleveltype == ootype.Class:
Modified: pypy/branch/less-meta-instances/pypy/rpython/rclass.py
==============================================================================
--- pypy/branch/less-meta-instances/pypy/rpython/rclass.py (original)
+++ pypy/branch/less-meta-instances/pypy/rpython/rclass.py Fri Apr 4 18:18:22 2008
@@ -61,7 +61,8 @@
raise TyperError("not a subclass of %r: %r" % (
self.classdef.name, desc))
- return getclassrepr(self.rtyper, subclassdef).getruntime()
+ r_subclass = getclassrepr(self.rtyper, subclassdef)
+ return r_subclass.getruntime(self.lowleveltype)
def convert_const(self, value):
if not isinstance(value, (type, types.ClassType)):
Modified: pypy/branch/less-meta-instances/pypy/rpython/rpbc.py
==============================================================================
--- pypy/branch/less-meta-instances/pypy/rpython/rpbc.py (original)
+++ pypy/branch/less-meta-instances/pypy/rpython/rpbc.py Fri Apr 4 18:18:22 2008
@@ -665,7 +665,9 @@
raise TyperError("%r not in %r" % (cls, self))
if self.lowleveltype is Void:
return None
- return rclass.get_type_repr(self.rtyper).convert_desc(desc)
+ subclassdef = desc.getuniqueclassdef()
+ r_subclass = rclass.getclassrepr(self.rtyper, subclassdef)
+ return r_subclass.getruntime(self.lowleveltype)
def convert_const(self, cls):
if cls is None:
Modified: pypy/branch/less-meta-instances/pypy/rpython/test/test_rclass.py
==============================================================================
--- pypy/branch/less-meta-instances/pypy/rpython/test/test_rclass.py (original)
+++ pypy/branch/less-meta-instances/pypy/rpython/test/test_rclass.py Fri Apr 4 18:18:22 2008
@@ -97,16 +97,31 @@
assert res == 4
def test_runtime_exception(self):
+ class MyExc(Exception):
+ pass
+ class Sub1(MyExc):
+ pass
+ class Sub2(MyExc):
+ pass
def pick(flag):
if flag:
- return TypeError
+ return Sub1
else:
- return ValueError
- def f(flag):
+ return Sub2
+ def g(flag):
ex = pick(flag)
raise ex()
- self.interpret_raises(TypeError, f, [True])
- self.interpret_raises(ValueError, f, [False])
+ def f(flag):
+ try:
+ g(flag)
+ except Sub1:
+ return 1
+ except Sub2:
+ return 2
+ else:
+ return 3
+ assert self.interpret(f, [True]) == 1
+ assert self.interpret(f, [False]) == 2
def test_classattr_as_defaults(self):
def dummyfn():
More information about the Pypy-commit
mailing list