[pypy-svn] r53337 - in pypy/branch/less-meta-instances/pypy/rpython: ootypesystem test

arigo at codespeak.net arigo at codespeak.net
Fri Apr 4 18:39:35 CEST 2008


Author: arigo
Date: Fri Apr  4 18:39:34 2008
New Revision: 53337

Modified:
   pypy/branch/less-meta-instances/pypy/rpython/ootypesystem/rbuiltin.py
   pypy/branch/less-meta-instances/pypy/rpython/ootypesystem/rclass.py
   pypy/branch/less-meta-instances/pypy/rpython/test/test_rclass.py
Log:
(antocuni, arigo)  More small fixes; test_class passes!


Modified: pypy/branch/less-meta-instances/pypy/rpython/ootypesystem/rbuiltin.py
==============================================================================
--- pypy/branch/less-meta-instances/pypy/rpython/ootypesystem/rbuiltin.py	(original)
+++ pypy/branch/less-meta-instances/pypy/rpython/ootypesystem/rbuiltin.py	Fri Apr  4 18:39:34 2008
@@ -75,15 +75,14 @@
 
     v_obj, v_cls = hop.inputargs(instance_repr, class_repr)
     if isinstance(v_cls, Constant):
-        c_cls = hop.inputconst(ootype.Void, v_cls.value.class_._INSTANCE)
+        c_cls = hop.inputconst(ootype.Void, v_cls.value._INSTANCE)
         return hop.genop('instanceof', [v_obj, c_cls], resulttype=ootype.Bool)
     else:
         return hop.gendirectcall(ll_isinstance, v_obj, v_cls)
 
-def ll_isinstance(inst, meta):
-    c1 = inst.meta.class_
-    c2 = meta.class_
-    return ootype.subclassof(c1, c2)
+def ll_isinstance(inst, class_):
+    c1 = ootype.classof(inst)
+    return ootype.subclassof(c1, class_)
 
 def rtype_instantiate(hop):
     if hop.args_s[0].is_constant():

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:39:34 2008
@@ -423,14 +423,21 @@
                 return hop.genop("oosend", [cname, v_inst],
                                  resulttype = hop.r_result.lowleveltype)
         elif attr == '__class__':
-            if hop.r_result.lowleveltype is ootype.Void:
+            expected_type = hop.r_result.lowleveltype
+            if expected_type is ootype.Void:
                 # special case for when the result of '.__class__' is constant
                 [desc] = hop.s_result.descriptions
                 return hop.inputconst(ootype.Void, desc.pyobj)
+            elif expected_type == ootype.Class:
+                return hop.genop('classof', [v_inst],
+                                 resulttype = ootype.Class)
             else:
-                cmeta = inputconst(ootype.Void, "meta")
-                return hop.genop('oogetfield', [v_inst, cmeta],
-                                 resulttype=CLASSTYPE)
+                assert expected_type == META
+                _, meth = v_inst.concretetype._lookup('getmeta')
+                assert meth
+                c_getmeta = hop.inputconst(ootype.Void, 'getmeta')
+                return hop.genop('oosend', [c_getmeta, v_inst],
+                                 resulttype = META)
         else:
             raise TyperError("no attribute %r on %r" % (attr, self))
 

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:39:34 2008
@@ -816,8 +816,8 @@
         t.buildrtyper(type_system=self.type_system).specialize()
         graph = graphof(t, f)
         TYPEA = graph.startblock.operations[0].args[0].value
-        TYPEB = graph.startblock.operations[2].args[0].value
-        TYPEC = graph.startblock.operations[4].args[0].value
+        TYPEB = graph.startblock.operations[1].args[0].value
+        TYPEC = graph.startblock.operations[2].args[0].value
         _, destra = TYPEA._lookup("o__del__")
         _, destrb = TYPEB._lookup("o__del__")
         _, destrc = TYPEC._lookup("o__del__")


More information about the pypy-svn mailing list