[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