[pypy-svn] r74462 - in pypy/branch/blackhole-improvement/pypy/jit/codewriter: . test

arigo at codespeak.net arigo at codespeak.net
Mon May 10 14:55:43 CEST 2010


Author: arigo
Date: Mon May 10 14:55:42 2010
New Revision: 74462

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py
Log:
getinteriorfield.


Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	Mon May 10 14:55:42 2010
@@ -430,6 +430,18 @@
             sizedescr = self.cpu.sizeof(STRUCT)
             return SpaceOperation('new', [sizedescr], op.result)
 
+    def rewrite_op_getinteriorfield(self, op):
+        # only supports strings and unicodes
+        assert len(op.args) == 3
+        assert op.args[1].value == 'chars'
+        optype = op.args[0].concretetype
+        if optype == lltype.Ptr(rstr.STR):
+            opname = "strgetitem"
+        else:
+            assert optype == lltype.Ptr(rstr.UNICODE)
+            opname = "unicodegetitem"
+        return SpaceOperation(opname, [op.args[0], op.args[2]], op.result)
+
     def _rewrite_equality(self, op, opname):
         arg0, arg1 = op.args
         if isinstance(arg0, Constant) and not arg0.value:

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py	Mon May 10 14:55:42 2010
@@ -404,3 +404,27 @@
     op1 = Transformer().rewrite_operation(op)
     assert op1.opname == 'int_is_true'
     assert op1.args == [v1]
+
+def test_str_getinteriorfield():
+    v = varoftype(lltype.Ptr(rstr.STR))
+    v_index = varoftype(lltype.Signed)
+    v_result = varoftype(lltype.Char)
+    op = SpaceOperation('getinteriorfield',
+                        [v, Constant('chars', lltype.Void), v_index],
+                        v_result)
+    op1 = Transformer().rewrite_operation(op)
+    assert op1.opname == 'strgetitem'
+    assert op1.args == [v, v_index]
+    assert op1.result == v_result
+
+def test_unicode_getinteriorfield():
+    v = varoftype(lltype.Ptr(rstr.UNICODE))
+    v_index = varoftype(lltype.Signed)
+    v_result = varoftype(lltype.UniChar)
+    op = SpaceOperation('getinteriorfield',
+                        [v, Constant('chars', lltype.Void), v_index],
+                        v_result)
+    op1 = Transformer().rewrite_operation(op)
+    assert op1.opname == 'unicodegetitem'
+    assert op1.args == [v, v_index]
+    assert op1.result == v_result



More information about the Pypy-commit mailing list