[pypy-svn] r52805 - in pypy/branch/fixed-list-ootype/pypy/translator: cli cli/src cli/test oosupport

antocuni at codespeak.net antocuni at codespeak.net
Fri Mar 21 16:17:25 CET 2008


Author: antocuni
Date: Fri Mar 21 16:17:24 2008
New Revision: 52805

Modified:
   pypy/branch/fixed-list-ootype/pypy/translator/cli/constant.py
   pypy/branch/fixed-list-ootype/pypy/translator/cli/cts.py
   pypy/branch/fixed-list-ootype/pypy/translator/cli/gencli.py
   pypy/branch/fixed-list-ootype/pypy/translator/cli/ilgenerator.py
   pypy/branch/fixed-list-ootype/pypy/translator/cli/metavm.py
   pypy/branch/fixed-list-ootype/pypy/translator/cli/oopspec.py
   pypy/branch/fixed-list-ootype/pypy/translator/cli/opcodes.py
   pypy/branch/fixed-list-ootype/pypy/translator/cli/src/pypylib.cs
   pypy/branch/fixed-list-ootype/pypy/translator/cli/test/test_list.py
   pypy/branch/fixed-list-ootype/pypy/translator/oosupport/constant.py
Log:
add support to ootype.Array to gencli



Modified: pypy/branch/fixed-list-ootype/pypy/translator/cli/constant.py
==============================================================================
--- pypy/branch/fixed-list-ootype/pypy/translator/cli/constant.py	(original)
+++ pypy/branch/fixed-list-ootype/pypy/translator/cli/constant.py	Fri Mar 21 16:17:24 2008
@@ -28,7 +28,7 @@
 from pypy.translator.oosupport.constant import \
      push_constant, WeakRefConst, StaticMethodConst, CustomDictConst, \
      ListConst, ClassConst, InstanceConst, RecordConst, DictConst, \
-     BaseConstantGenerator
+     BaseConstantGenerator, ArrayConst
 from pypy.translator.cli.ilgenerator import CLIBaseGenerator
 from pypy.rpython.ootypesystem import ootype
 from pypy.translator.cli.comparer import EqualityComparer
@@ -353,7 +353,23 @@
         self.db.const_count.inc('List')
         self.db.const_count.inc('List', self.value._TYPE.ITEM)
         self.db.const_count.inc('List', len(self.value._list))
-        super(CLIListConst, self).create_pointer(gen)        
+        super(CLIListConst, self).create_pointer(gen)
+
+
+class CLIArrayConst(CLIBaseConstMixin, ArrayConst):
+
+    def _do_not_initialize(self):
+        # Check if it is an array of all zeroes:
+        try:
+            if self.value._list == [0] * len(self.value._list):
+                return True
+        except:
+            pass
+        return super(CLIArrayConst, self)._do_not_initialize()
+
+    def _setitem(self, SELFTYPE, gen):
+        gen.array_setitem(SELFTYPE)
+
 
 class CLIDictConst(CLIDictMixin, DictConst):
     def create_pointer(self, gen):

Modified: pypy/branch/fixed-list-ootype/pypy/translator/cli/cts.py
==============================================================================
--- pypy/branch/fixed-list-ootype/pypy/translator/cli/cts.py	(original)
+++ pypy/branch/fixed-list-ootype/pypy/translator/cli/cts.py	Fri Mar 21 16:17:24 2008
@@ -91,6 +91,14 @@
         arglist = ', '.join([arg.typename() for arg in self.arg_types])
         return '[%s]%s`%d<%s>' % (assembly, name, numparam, arglist)
 
+class CliArrayType(CliType):
+
+    def __init__(self, itemtype):
+        self.itemtype = itemtype
+
+    def typename(self):
+        return '%s[]' % self.itemtype.typename()
+
 
 T = CliPrimitiveType
 class types:
@@ -241,6 +249,11 @@
         elif isinstance(t, ootype.StaticMethod):
             delegate = self.db.record_delegate(t)
             return CliClassType(None, delegate)
+        elif isinstance(t, ootype.Array):
+            item_type = self.lltype_to_cts(t.ITEM)
+            if item_type == types.void: # special case: Array of Void
+                return types.list_of_void
+            return CliArrayType(item_type)
         elif isinstance(t, ootype.List):
             item_type = self.lltype_to_cts(t.ITEM)
             if item_type == types.void: # special case: List of Void

Modified: pypy/branch/fixed-list-ootype/pypy/translator/cli/gencli.py
==============================================================================
--- pypy/branch/fixed-list-ootype/pypy/translator/cli/gencli.py	(original)
+++ pypy/branch/fixed-list-ootype/pypy/translator/cli/gencli.py	Fri Mar 21 16:17:24 2008
@@ -32,6 +32,7 @@
     RecordConst = constant.CLIRecordConst
     ClassConst = constant.CLIClassConst
     ListConst = constant.CLIListConst
+    ArrayConst = constant.CLIArrayConst
     StaticMethodConst = constant.CLIStaticMethodConst
     CustomDictConst = constant.CLICustomDictConst
     DictConst = constant.CLIDictConst

Modified: pypy/branch/fixed-list-ootype/pypy/translator/cli/ilgenerator.py
==============================================================================
--- pypy/branch/fixed-list-ootype/pypy/translator/cli/ilgenerator.py	(original)
+++ pypy/branch/fixed-list-ootype/pypy/translator/cli/ilgenerator.py	Fri Mar 21 16:17:24 2008
@@ -407,3 +407,31 @@
 
     def dup(self, TYPE):
         self.ilasm.opcode('dup')
+
+    def oonewarray(self, TYPE, length):
+        if TYPE.ITEM is ootype.Void:
+            self.new(TYPE)
+            self.ilasm.opcode('dup')
+            self.load(length)
+            self.ilasm.call_method('void [pypylib]pypy.runtime.ListOfVoid::_ll_resize(int32)', virtual=False)
+        else:
+            clitype = self.cts.lltype_to_cts(TYPE)
+            self.load(length)
+            self.ilasm.opcode('newarr', clitype.itemtype.typename())
+    
+    def _array_suffix(self, ARRAY, erase_unsigned=False):
+        from pypy.translator.cli.metavm import OOTYPE_TO_MNEMONIC
+        suffix = OOTYPE_TO_MNEMONIC.get(ARRAY.ITEM, 'ref')
+        if erase_unsigned:
+            suffix = suffix.replace('u', 'i')
+        return suffix
+
+    def array_setitem(self, ARRAY):
+        suffix = self._array_suffix(ARRAY, erase_unsigned=True)
+        self.ilasm.opcode('stelem.%s' % suffix)
+
+    def array_getitem(self, ARRAY):
+        self.ilasm.opcode('ldelem.%s' % self._array_suffix(ARRAY))
+
+    def array_length(self, ARRAY):
+        self.ilasm.opcode('ldlen')

Modified: pypy/branch/fixed-list-ootype/pypy/translator/cli/metavm.py
==============================================================================
--- pypy/branch/fixed-list-ootype/pypy/translator/cli/metavm.py	(original)
+++ pypy/branch/fixed-list-ootype/pypy/translator/cli/metavm.py	Fri Mar 21 16:17:24 2008
@@ -67,6 +67,17 @@
             arg_list = ', '.join(arg_types)
             signature = '%s %s::%s(%s)' % (ret_type, STRING_HELPER_CLASS, method_name, arg_list)
             generator.call_signature(signature)
+        elif isinstance(this.concretetype, ootype.Array) and this.concretetype.ITEM is not ootype.Void:
+            v_array = args[0]
+            ARRAY = v_array.concretetype
+            if method_name == 'll_setitem_fast':
+                generator.array_setitem(ARRAY)
+            elif method_name == 'll_getitem_fast':
+                generator.array_getitem(ARRAY)
+            elif method_name == 'll_length':
+                generator.array_length(ARRAY)
+            else:
+                assert False
         else:
             generator.call_method(this.concretetype, method_name)
             
@@ -198,10 +209,14 @@
         generator.ilasm.call('class [mscorlib]System.Type class [mscorlib]System.Type::GetTypeFromHandle(valuetype [mscorlib]System.RuntimeTypeHandle)')
 
 OOTYPE_TO_MNEMONIC = {
+    ootype.Bool: 'i1', 
+    ootype.Char: 'i2',
+    ootype.UniChar: 'i2',
     ootype.Signed: 'i4',
     ootype.SignedLongLong: 'i8',
     ootype.Unsigned: 'u4',
     ootype.UnsignedLongLong: 'u8',
+    ootype.Float: 'r8',
     }
 
 class _CastPrimitive(MicroInstruction):

Modified: pypy/branch/fixed-list-ootype/pypy/translator/cli/oopspec.py
==============================================================================
--- pypy/branch/fixed-list-ootype/pypy/translator/cli/oopspec.py	(original)
+++ pypy/branch/fixed-list-ootype/pypy/translator/cli/oopspec.py	Fri Mar 21 16:17:24 2008
@@ -31,9 +31,9 @@
 
 def get_method(TYPE, name):
     try:
-        # special case: when having List of Void, look at the concrete
-        # methods, not the generic ones
-        if isinstance(TYPE, ootype.List) and TYPE.ITEM is ootype.Void:
+        # special case: when having List of Void, or an Array, look at
+        # the concrete methods, not the generic ones
+        if isinstance(TYPE, ootype.Array) or (isinstance(TYPE, ootype.List) and TYPE.ITEM is ootype.Void):
             return TYPE._METHODS[name]
         else:
             return TYPE._GENERIC_METHODS[name]

Modified: pypy/branch/fixed-list-ootype/pypy/translator/cli/opcodes.py
==============================================================================
--- pypy/branch/fixed-list-ootype/pypy/translator/cli/opcodes.py	(original)
+++ pypy/branch/fixed-list-ootype/pypy/translator/cli/opcodes.py	Fri Mar 21 16:17:24 2008
@@ -3,7 +3,7 @@
      MapException, Box, Unbox, NewArray, GetArrayElem, SetArrayElem,\
      TypeOf, CastPrimitive
 from pypy.translator.oosupport.metavm import PushArg, PushAllArgs, StoreResult, InstructionList,\
-    New, RuntimeNew, CastTo, PushPrimitive, OOString, OOUnicode
+    New, RuntimeNew, CastTo, PushPrimitive, OOString, OOUnicode, OONewArray
 from pypy.translator.cli.cts import WEAKREF
 from pypy.rpython.ootypesystem import ootype
 
@@ -54,6 +54,7 @@
     'ooparse_int':              [PushAllArgs, 'call int32 [pypylib]pypy.runtime.Utils::OOParseInt(string, int32)'],
     'ooparse_float':            [PushAllArgs, 'call float64 [pypylib]pypy.runtime.Utils::OOParseFloat(string)'],
     'oonewcustomdict':          [NewCustomDict],
+    'oonewarray':               [OONewArray, StoreResult],
     
     'same_as':                  DoNothing,
     'hint':                     [PushArg(0), StoreResult],

Modified: pypy/branch/fixed-list-ootype/pypy/translator/cli/src/pypylib.cs
==============================================================================
--- pypy/branch/fixed-list-ootype/pypy/translator/cli/src/pypylib.cs	(original)
+++ pypy/branch/fixed-list-ootype/pypy/translator/cli/src/pypylib.cs	Fri Mar 21 16:17:24 2008
@@ -34,10 +34,28 @@
         public static string ToPython(object x) {
             if (x == null)
                 return "None";
+            else if (x is Array)
+                return ArrayToPython((Array)x);
             else
                 return x.ToString();
         }
 
+        private static string ArrayToPython(Array array)
+        {
+            string res = "[";
+            foreach(object item in array) {
+                if (item != null && item.GetType() == typeof(string)) {
+                    object tmp = (object)item;
+                    res += ToPython((string)tmp) + ",";
+                }
+                else
+                    res += ToPython(item) + ",";
+                
+            }
+            res += "]";
+            return res;
+        }
+
         public static string InstanceToPython(object obj) 
         { 
             return string.Format("InstanceWrapper('{0}')", obj.GetType().FullName);
@@ -338,11 +356,9 @@
             return s.Substring(start, count);
         }
 
-        public static List<string> ll_split_chr(string s, char ch)
+        public static string[] ll_split_chr(string s, char ch)
         {
-            List<string> res = new List<string>();
-            res.AddRange(s.Split(ch));
-            return res;
+            return s.Split(ch);
         }
 
         public static bool ll_contains(string s, char ch)
@@ -382,7 +398,7 @@
                     res += pypy.test.Result.ToPython((string)tmp) + ",";
                 }
                 else
-                    res += item.ToString() + ","; // XXX: doesn't work for chars
+                    res += pypy.test.Result.ToPython(item) + ",";
             }
             res += "]";
             return res;

Modified: pypy/branch/fixed-list-ootype/pypy/translator/cli/test/test_list.py
==============================================================================
--- pypy/branch/fixed-list-ootype/pypy/translator/cli/test/test_list.py	(original)
+++ pypy/branch/fixed-list-ootype/pypy/translator/cli/test/test_list.py	Fri Mar 21 16:17:24 2008
@@ -1,6 +1,7 @@
 import py
 from pypy.translator.cli.test.runtest import CliTest
 from pypy.rpython.test.test_rlist import BaseTestRlist
+from pypy.rlib.rarithmetic import r_uint
 
 class TestCliList(CliTest, BaseTestRlist):
     def test_recursive(self):
@@ -8,3 +9,19 @@
 
     def test_getitem_exc(self):
         py.test.skip('fixme!')
+
+    def test_list_unsigned(self):
+        def fn(x):
+            lst = [r_uint(0), r_uint(1)]
+            lst[0] = r_uint(x)
+            return lst[0]
+        res = self.interpret(fn, [42])
+        assert res == 42
+
+    def test_list_bool(self):
+        def fn(x):
+            lst = [True, False]
+            lst[0] = x
+            return lst[0]
+        res = self.interpret(fn, [False])
+        assert res == False

Modified: pypy/branch/fixed-list-ootype/pypy/translator/oosupport/constant.py
==============================================================================
--- pypy/branch/fixed-list-ootype/pypy/translator/oosupport/constant.py	(original)
+++ pypy/branch/fixed-list-ootype/pypy/translator/oosupport/constant.py	Fri Mar 21 16:17:24 2008
@@ -670,9 +670,10 @@
             gen.dup(SELFTYPE)
             push_constant(self.db, ootype.Signed, idx, gen)
             push_constant(self.db, ITEM, item, gen)
-            gen.call_method(SELFTYPE, 'll_setitem_fast')
-            print idx, item
+            self._setitem(SELFTYPE, gen)
 
+    def _setitem(self, SELFTYPE, gen):
+        gen.call_method(SELFTYPE, 'll_setitem_fast')
 
 # ______________________________________________________________________
 # Dictionary constants



More information about the Pypy-commit mailing list