[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