[pypy-svn] r63925 - pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86

fijal at codespeak.net fijal at codespeak.net
Fri Apr 10 06:26:05 CEST 2009


Author: fijal
Date: Fri Apr 10 06:26:03 2009
New Revision: 63925

Modified:
   pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py
Log:
enough support for unicode to actually translate


Modified: pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py	(original)
+++ pypy/branch/pyjitpl5-simplify/pypy/jit/backend/x86/runner.py	Fri Apr 10 06:26:03 2009
@@ -427,12 +427,17 @@
         else:
             raise NotImplementedError("size = %d" % size)
 
-    def do_strlen(self, args, descr=0):
-        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
-                                                   self.translate_support_code)
-        gcref = args[0].getptr(llmemory.GCREF)
-        v = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)[ofs_length/WORD]
-        return BoxInt(v)
+    def _new_do_len(TP):
+        def do_strlen(self, args, descr=0):
+            basesize, itemsize, ofs_length = symbolic.get_array_token(TP,
+                                                self.translate_support_code)
+            gcref = args[0].getptr(llmemory.GCREF)
+            v = rffi.cast(rffi.CArrayPtr(lltype.Signed), gcref)[ofs_length/WORD]
+            return BoxInt(v)
+        return do_strlen
+
+    do_strlen = _new_do_len(rstr.STR)
+    do_unicodelen = _new_do_len(rstr.UNICODE)
 
     def do_strgetitem(self, args, descr=0):
         basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
@@ -442,6 +447,15 @@
         v = rffi.cast(rffi.CArrayPtr(lltype.Char), gcref)[basesize + i]
         return BoxInt(ord(v))
 
+    def do_unicodegetitem(self, args, descr=0):
+        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
+                                                    self.translate_support_code)
+        gcref = args[0].getptr(llmemory.GCREF)
+        i = args[1].getint()
+        basesize = basesize // itemsize
+        v = rffi.cast(rffi.CArrayPtr(lltype.UniChar), gcref)[basesize + i]
+        return BoxInt(ord(v))
+
     @specialize.argtype(1)
     def _base_do_getfield(self, gcref, fielddescr):
         ofs, size, ptr = self.unpack_fielddescr(fielddescr)
@@ -508,15 +522,18 @@
         rffi.cast(rffi.CArrayPtr(lltype.Signed), res)[0] = num_elem
         return BoxPtr(self.cast_int_to_gcref(res))
 
-    def do_newstr(self, args, descr=0):
-        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
-                                         self.translate_support_code)
-        assert itemsize == 1
-        num_elem = args[0].getint()
-        size = basesize + num_elem
-        res = rffi.cast(GC_MALLOC, gc_malloc_fnaddr())(size)
-        rffi.cast(rffi.CArrayPtr(lltype.Signed), res)[ofs_length/WORD] = num_elem
-        return BoxPtr(self.cast_int_to_gcref(res))
+    def _new_do_newstr(TP):
+        def do_newstr(self, args, descr=0):
+            basesize, itemsize, ofs_length = symbolic.get_array_token(TP,
+                                             self.translate_support_code)
+            num_elem = args[0].getint()
+            size = basesize + num_elem * itemsize
+            res = rffi.cast(GC_MALLOC, gc_malloc_fnaddr())(size)
+            rffi.cast(rffi.CArrayPtr(lltype.Signed), res)[ofs_length/WORD] = num_elem
+            return BoxPtr(self.cast_int_to_gcref(res))
+        return do_newstr
+    do_newstr = _new_do_newstr(rstr.STR)
+    do_newunicode = _new_do_newstr(rstr.UNICODE)
 
     def do_strsetitem(self, args, descr=0):
         basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.STR,
@@ -526,6 +543,15 @@
         a = args[0].getptr(llmemory.GCREF)
         rffi.cast(rffi.CArrayPtr(lltype.Char), a)[index + basesize] = chr(v)
 
+    def do_unicodesetitem(self, args, descr=0):
+        basesize, itemsize, ofs_length = symbolic.get_array_token(rstr.UNICODE,
+                                                self.translate_support_code)
+        index = args[1].getint()
+        v = args[2].getint()
+        a = args[0].getptr(llmemory.GCREF)
+        basesize = basesize // itemsize
+        rffi.cast(rffi.CArrayPtr(lltype.UniChar), a)[index + basesize] = unichr(v)
+
     def do_call(self, args, calldescr):
         num_args, size, ptr = self.unpack_calldescr(calldescr)
         assert isinstance(calldescr, ConstDescr3)



More information about the Pypy-commit mailing list