[pypy-svn] r26401 - in pypy/dist/pypy/translator/cl: . test

sanxiyn at codespeak.net sanxiyn at codespeak.net
Thu Apr 27 08:25:17 CEST 2006


Author: sanxiyn
Date: Thu Apr 27 08:25:13 2006
New Revision: 26401

Modified:
   pypy/dist/pypy/translator/cl/gencl.py
   pypy/dist/pypy/translator/cl/test/test_cltrans_oo.py
Log:
(nik, dialtone, sanxiyn)
Add a failing test, implement runtimenew, declare class before
representing it as symbol, and...


Modified: pypy/dist/pypy/translator/cl/gencl.py
==============================================================================
--- pypy/dist/pypy/translator/cl/gencl.py	(original)
+++ pypy/dist/pypy/translator/cl/gencl.py	Thu Apr 27 08:25:13 2006
@@ -3,7 +3,7 @@
 from pypy.tool.udir import udir
 from pypy.objspace.flow.model import Constant
 from pypy.translator.translator import graphof
-from pypy.rpython.ootypesystem.ootype import dynamicType, oodowncast, List, Record, Instance, _static_meth, _meth, ROOT
+from pypy.rpython.ootypesystem.ootype import dynamicType, oodowncast, List, Record, Instance, _class, _static_meth, _meth, ROOT
 from pypy.rpython.ootypesystem.rclass import OBJECT
 from pypy.translator.cl.clrepr import repr_arg, repr_var, repr_const, repr_fun_name, repr_class_name
 
@@ -86,6 +86,9 @@
         else:
             raise NotImplementedError()
 
+    def op_runtimenew(self, result, arg):
+        yield "(setf %s (make-instance %s))" % (result, arg)
+
     def op_instanceof(self, result, arg, clsname):
         yield "(setf %s (typep %s %s))" % (result, arg, clsname)
 
@@ -199,8 +202,11 @@
         const_declaration.append("(setf %s (make-instance %s))" % (name, cls))
         fields = INST._allfields()
         for fieldname in fields:
-            fieldvalue = repr_const(getattr(inst, fieldname))
-            const_declaration.append("(setf (slot-value %s '%s) %s)" % (name, fieldname, fieldvalue))
+            fieldvalue = getattr(inst, fieldname)
+            if isinstance(fieldvalue, _class):
+                self.declare_class(fieldvalue._INSTANCE)
+            fieldvaluerepr = repr_const(getattr(inst, fieldname))
+            const_declaration.append("(setf (slot-value %s '%s) %s)" % (name, fieldname, fieldvaluerepr))
         const_declaration = "\n".join(const_declaration)
         self.declarations.append(const_declaration)
         self.constcount += 1

Modified: pypy/dist/pypy/translator/cl/test/test_cltrans_oo.py
==============================================================================
--- pypy/dist/pypy/translator/cl/test/test_cltrans_oo.py	(original)
+++ pypy/dist/pypy/translator/cl/test/test_cltrans_oo.py	Thu Apr 27 08:25:13 2006
@@ -76,6 +76,27 @@
     assert cl_dynamic_class(True) == 1
     assert cl_dynamic_class(False) == 2
 
+def test_instance():
+    py.test.skip("TODO")
+    class Foo:
+        value = 0
+    class Bar(Foo):
+        value = 1
+    class Baz(Foo):
+        value = 2
+    def pick_class(flag):
+        if flag:
+            return Bar
+        else:
+            return Baz
+    def dynamic_instance(flag):
+        cls = pick_class(flag)
+        obj = cls()
+        return obj.value
+    cl_dynamic_instance = make_cl_func(dynamic_instance, [bool])
+    assert cl_dynamic_instance(True) == 1
+    assert cl_dynamic_instance(False) == 2
+
 def test_list_length():
     def list_length_one(number):
         lst = [number]



More information about the Pypy-commit mailing list