[pypy-svn] r26444 - in pypy/dist/pypy/translator/cli: . test

antocuni at codespeak.net antocuni at codespeak.net
Thu Apr 27 14:47:34 CEST 2006


Author: antocuni
Date: Thu Apr 27 14:47:24 2006
New Revision: 26444

Added:
   pypy/dist/pypy/translator/cli/record.py   (contents, props changed)
   pypy/dist/pypy/translator/cli/test/test_tuple.py   (contents, props changed)
Modified:
   pypy/dist/pypy/translator/cli/cts.py
   pypy/dist/pypy/translator/cli/database.py
   pypy/dist/pypy/translator/cli/test/compile.py
Log:
Added support for Record.



Modified: pypy/dist/pypy/translator/cli/cts.py
==============================================================================
--- pypy/dist/pypy/translator/cli/cts.py	(original)
+++ pypy/dist/pypy/translator/cli/cts.py	Thu Apr 27 14:47:24 2006
@@ -6,7 +6,7 @@
 
 from pypy.rpython.lltypesystem.lltype import Signed, Unsigned, Void, Bool, Float
 from pypy.rpython.lltypesystem.lltype import SignedLongLong, UnsignedLongLong
-from pypy.rpython.ootypesystem.ootype import Instance, Class, StaticMethod, List
+from pypy.rpython.ootypesystem.ootype import Instance, Class, StaticMethod, List, Record
 from pypy.translator.cli.option import getoption
 from pypy.translator.cli import oopspec
 
@@ -62,6 +62,9 @@
         if isinstance(t, Instance):
             self.db.pending_class(t)
             return self.__class(t._name, include_class)
+        elif isinstance(t, Record):
+            name = self.db.pending_record(t)
+            return self.__class(name, include_class)
         elif isinstance(t, StaticMethod):
             return 'void' # TODO: is it correct to ignore StaticMethod?
         elif isinstance(t, List):

Modified: pypy/dist/pypy/translator/cli/database.py
==============================================================================
--- pypy/dist/pypy/translator/cli/database.py	(original)
+++ pypy/dist/pypy/translator/cli/database.py	Thu Apr 27 14:47:24 2006
@@ -1,6 +1,7 @@
 from pypy.translator.cli.cts import CTS
 from pypy.translator.cli.function import Function
 from pypy.translator.cli.class_ import Class
+from pypy.translator.cli.record import Record
 from pypy.rpython.ootypesystem import ootype
 
 try:
@@ -27,6 +28,11 @@
     def pending_class(self, classdef):
         self.pending_node(Class(self, classdef))
 
+    def pending_record(self, record):
+        r = Record(self, record)
+        self.pending_node(r)
+        return r.get_name()
+
     def pending_node(self, node):
         if node in self._pending_nodes or node in self._rendered_nodes:
             return

Added: pypy/dist/pypy/translator/cli/record.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/translator/cli/record.py	Thu Apr 27 14:47:24 2006
@@ -0,0 +1,55 @@
+import string
+
+from pypy.translator.cli.node import Node
+from pypy.translator.cli.cts import CTS
+
+class Record(Node):
+    def __init__(self, db, record):
+        self.db = db
+        self.cts = CTS(db)
+        self.record = record
+
+        trans = string.maketrans('(),', '___')
+        name = ['Record']
+        for f_name, (f_type, f_default) in record._fields.iteritems():
+            type_name = f_type._short_name().translate(trans)
+            name.append(type_name)
+        self.name = '__'.join(name)
+        record._name = self.name
+
+    def __hash__(self):
+        return hash(self.record)
+
+    def __eq__(self, other):
+        return self.record == other.record
+
+    def get_name(self):
+        return self.name
+
+    def get_base_class(self):
+        return '[mscorlib]System.Object'        
+
+    def render(self, ilasm):
+        if self.db.class_name(self.record) is not None:
+            return # already rendered
+
+        self.ilasm = ilasm
+
+        ilasm.begin_class(self.name, self.get_base_class())
+        for f_name, (f_type, f_default) in self.record._fields.iteritems():
+            cts_type = self.cts.lltype_to_cts(f_type)
+            if cts_type != 'void':
+                ilasm.field(f_name, cts_type)
+
+        self._ctor()
+        ilasm.end_class()
+
+        self.db.record_class(self.record, self.name)
+
+    def _ctor(self):
+        self.ilasm.begin_function('.ctor', [], 'void', False, 'specialname', 'rtspecialname', 'instance')
+        self.ilasm.opcode('ldarg.0')
+        self.ilasm.call('instance void %s::.ctor()' % self.get_base_class())
+        self.ilasm.opcode('ret')
+        self.ilasm.end_function()
+        

Modified: pypy/dist/pypy/translator/cli/test/compile.py
==============================================================================
--- pypy/dist/pypy/translator/cli/test/compile.py	(original)
+++ pypy/dist/pypy/translator/cli/test/compile.py	Thu Apr 27 14:47:24 2006
@@ -24,10 +24,15 @@
         print 'OK'
 
 
+class Foo:
+    def __init__(self, x):
+        self.x = x
 
 def bar(x, y):
-    a = [x] + [y]
-    return a[0]
+    t = (x,y)
+    return t[0]
+#    f = Foo(3)
+#    return f.x
 
 f = compile_function(bar, [int, int])
 

Added: pypy/dist/pypy/translator/cli/test/test_tuple.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/translator/cli/test/test_tuple.py	Thu Apr 27 14:47:24 2006
@@ -0,0 +1,17 @@
+from pypy.translator.cli.test.runtest import check
+
+def create_tuple(x, y):
+    return x, y
+
+def test_tuple():
+    def func(x, y):
+        t = create_tuple(x, y)
+        return t[0] + t[1]
+    check(func, [int, int], (42, 13))
+
+def test_list_item():
+    def func(x, y):
+        t = ([x, y], x)
+        return t[0][0]
+    check(func, [int, int], (42, 13))
+



More information about the Pypy-commit mailing list