[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