[pypy-svn] r59138 - in pypy/branch/oo-jit/pypy/jit/codegen/cli: . test
antocuni at codespeak.net
antocuni at codespeak.net
Thu Oct 16 13:35:09 CEST 2008
Author: antocuni
Date: Thu Oct 16 13:35:09 2008
New Revision: 59138
Added:
pypy/branch/oo-jit/pypy/jit/codegen/cli/test/test_args_manager.py (contents, props changed)
Modified:
pypy/branch/oo-jit/pypy/jit/codegen/cli/args_manager.py
Log:
refactor ArgsManager to make it testable without involving any CLI
opereration, and write actual tests for it; one of those fails
Modified: pypy/branch/oo-jit/pypy/jit/codegen/cli/args_manager.py
==============================================================================
--- pypy/branch/oo-jit/pypy/jit/codegen/cli/args_manager.py (original)
+++ pypy/branch/oo-jit/pypy/jit/codegen/cli/args_manager.py Thu Oct 16 13:35:09 2008
@@ -10,11 +10,7 @@
array[i] = types[i]
return array
-def MakeGenericType(clitype, paramtypes):
- array = new_type_array(paramtypes)
- return clitype.MakeGenericType(array)
-
-class ArgsManager:
+class BaseArgsManager:
def __init__(self):
self.type_counter = {}
@@ -22,21 +18,19 @@
self.clitype = None
self._init_types()
- def _load_pypylib(self):
- from pypy.translator.cli.query import pypylib, pypylib2
- assembly = None
- for name in [pypylib, pypylib2]:
- assembly = Assembly.LoadWithPartialName(name)
- if assembly:
- break
- assert assembly is not None
- return assembly
-
def _init_types(self):
- pypylib = self._load_pypylib()
- self.clitype_InputArgs = pypylib.GetType('pypy.runtime.InputArgs`1')
- self.clitype_Void = pypylib.GetType('pypy.runtime.Void')
- self.clitype_Pair = pypylib.GetType('pypy.runtime.Pair`2')
+ self.clitype_InputArgs = None
+ self.clitype_Void = None
+ self.clitype_Pair = None
+
+ def _make_generic_type(self, clitype, paramtypes):
+ raise NotImplementedError
+
+ def _store_by_index(self, meth, gv_arg, i):
+ raise NotImplementedError
+
+ def _load_by_index(self, meth, i):
+ raise NotImplementedError
def is_open(self):
return self.clitype is None
@@ -70,43 +64,17 @@
for clitype, count in self.type_counter.iteritems():
self.type_index[clitype] = len(fieldtypes)
fieldtypes += [clitype] * count
-
pairtype = self.clitype_Void
+
# iterate over reversed(fieldtypes)
i = len(fieldtypes)-1
while True:
if i < 0:
break
fieldtype = fieldtypes[i]
- pairtype = MakeGenericType(self.clitype_Pair, [fieldtype, pairtype])
+ pairtype = self._make_generic_type(self.clitype_Pair, [fieldtype, pairtype])
i-=1
-
-## for fieldtype in fieldtypes[::-1]:
-## pairtype = MakeGenericType(self.clitype_Pair, [fieldtype, pairtype])
- self.clitype = MakeGenericType(self.clitype_InputArgs, [pairtype])
-
- def _store_by_index(self, meth, gv_arg, i):
- head_info = self._load_nth_head(meth, i)
- gv_arg.load(meth)
- meth.il.Emit(OpCodes.Stfld, head_info)
-
- def _load_by_index(self, meth, i):
- head_info = self._load_nth_head(meth, i)
- meth.il.Emit(OpCodes.Ldfld, head_info)
-
- def _load_nth_head(self, meth, n):
- il = meth.il
- fields_info = self.clitype.GetField("fields")
- meth.gv_inputargs.load(meth)
- il.Emit(OpCodes.Ldflda, fields_info)
-
- lastfield_info = fields_info
- for _ in range(n):
- fieldtype = lastfield_info.get_FieldType()
- lastfield_info = fieldtype.GetField("tail")
- il.Emit(OpCodes.Ldflda, lastfield_info)
- fieldtype = lastfield_info.get_FieldType()
- return fieldtype.GetField("head")
+ self.clitype = self._make_generic_type(self.clitype_InputArgs, [pairtype])
def copy_to_inputargs(self, meth, args_gv):
"copy args_gv into the appropriate fields of inputargs"
@@ -143,3 +111,49 @@
curidx += 1
indexes.append(curidx)
return indexes
+
+
+class ArgsManager(BaseArgsManager):
+
+ def _load_pypylib(self):
+ from pypy.translator.cli.query import pypylib, pypylib2
+ assembly = None
+ for name in [pypylib, pypylib2]:
+ assembly = Assembly.LoadWithPartialName(name)
+ if assembly:
+ break
+ assert assembly is not None
+ return assembly
+
+ def _init_types(self):
+ pypylib = self._load_pypylib()
+ self.clitype_InputArgs = pypylib.GetType('pypy.runtime.InputArgs`1')
+ self.clitype_Void = pypylib.GetType('pypy.runtime.Void')
+ self.clitype_Pair = pypylib.GetType('pypy.runtime.Pair`2')
+
+ def _make_generic_type(self, clitype, paramtypes):
+ array = new_type_array(paramtypes)
+ return clitype.MakeGenericType(array)
+
+ def _store_by_index(self, meth, gv_arg, i):
+ head_info = self._load_nth_head(meth, i)
+ gv_arg.load(meth)
+ meth.il.Emit(OpCodes.Stfld, head_info)
+
+ def _load_by_index(self, meth, i):
+ head_info = self._load_nth_head(meth, i)
+ meth.il.Emit(OpCodes.Ldfld, head_info)
+
+ def _load_nth_head(self, meth, n):
+ il = meth.il
+ fields_info = self.clitype.GetField("fields")
+ meth.gv_inputargs.load(meth)
+ il.Emit(OpCodes.Ldflda, fields_info)
+
+ lastfield_info = fields_info
+ for _ in range(n):
+ fieldtype = lastfield_info.get_FieldType()
+ lastfield_info = fieldtype.GetField("tail")
+ il.Emit(OpCodes.Ldflda, lastfield_info)
+ fieldtype = lastfield_info.get_FieldType()
+ return fieldtype.GetField("head")
Added: pypy/branch/oo-jit/pypy/jit/codegen/cli/test/test_args_manager.py
==============================================================================
--- (empty file)
+++ pypy/branch/oo-jit/pypy/jit/codegen/cli/test/test_args_manager.py Thu Oct 16 13:35:09 2008
@@ -0,0 +1,108 @@
+import py
+from pypy.jit.codegen.cli.args_manager import BaseArgsManager
+
+class MyArgsManager(BaseArgsManager):
+
+ def _init_types(self):
+ self.clitype_InputArgs = 'InputArgs'
+ self.clitype_Void = 'Void'
+ self.clitype_Pair = 'Pair'
+
+ def _make_generic_type(self, clitype, paramtypes):
+ return clitype, paramtypes
+
+ def _store_by_index(self, meth, gv_arg, i):
+ meth.operations.append(('store_arg', gv_arg, i))
+
+ def _load_by_index(self, meth, i):
+ meth.operations.append(('load_arg', i))
+
+class FakeMethod:
+
+ def __init__(self):
+ self.operations = []
+
+class FakeGenVar:
+
+ def __init__(self, clitype):
+ self.clitype = clitype
+
+ def getCliType(self):
+ return self.clitype
+
+ def store(self, meth):
+ meth.operations.append(('store', self))
+
+
+def test_register_types():
+ m = MyArgsManager()
+ assert m.is_open()
+ m.register_types(['int', 'float', 'int'])
+ assert m.type_counter['int'] == 2
+ assert m.type_counter['float'] == 1
+
+ m.register_types(['int', 'int', 'int'])
+ assert m.type_counter['int'] == 3
+ assert m.type_counter['float'] == 1
+
+def test_close():
+ m = MyArgsManager()
+ m.register_types(['int', 'float', 'int'])
+ m.close()
+ assert not m.is_open()
+ # XXX: this test depend on dictionary order :-/
+ assert m.getCliType() == (
+ 'InputArgs', [
+ ('Pair', [
+ 'int', ('Pair', [
+ 'int', ('Pair', [
+ 'float', 'Void'
+ ])
+ ])
+ ])
+ ])
+
+ assert m.type_index['int'] == 0
+ assert m.type_index['float'] == 2
+
+def test__get_indexes():
+ py.test.skip('fixme')
+ m = MyArgsManager()
+ m.register_types(['int', 'float', 'int'])
+ m.close()
+ indexes = m._get_indexes(['int', 'float', 'int'])
+ assert indexes == [0, 1, 2]
+
+def test_copy_to_inputargs():
+ meth = FakeMethod()
+ gv_x = FakeGenVar('int')
+ gv_y = FakeGenVar('int')
+ args_gv = [gv_x, gv_y]
+
+ m = MyArgsManager()
+ m.register(args_gv)
+ m.close()
+ m.copy_to_inputargs(meth, args_gv)
+
+ assert meth.operations == [
+ ('store_arg', gv_x, 0),
+ ('store_arg', gv_y, 1)
+ ]
+
+def test_copy_from_inputargs():
+ meth = FakeMethod()
+ gv_x = FakeGenVar('int')
+ gv_y = FakeGenVar('int')
+ args_gv = [gv_x, gv_y]
+
+ m = MyArgsManager()
+ m.register(args_gv)
+ m.close()
+ m.copy_from_inputargs(meth, args_gv)
+
+ assert meth.operations == [
+ ('load_arg', 0),
+ ('store', gv_x),
+ ('load_arg', 1),
+ ('store', gv_y)
+ ]
More information about the Pypy-commit
mailing list