[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