[pypy-svn] r76013 - pypy/branch/interplevel-array/pypy/module/array

hakanardo at codespeak.net hakanardo at codespeak.net
Thu Jul 8 11:40:26 CEST 2010


Author: hakanardo
Date: Thu Jul  8 11:40:24 2010
New Revision: 76013

Modified:
   pypy/branch/interplevel-array/pypy/module/array/interp_array.py
Log:
moved to raw mallocs

Modified: pypy/branch/interplevel-array/pypy/module/array/interp_array.py
==============================================================================
--- pypy/branch/interplevel-array/pypy/module/array/interp_array.py	(original)
+++ pypy/branch/interplevel-array/pypy/module/array/interp_array.py	Thu Jul  8 11:40:24 2010
@@ -36,7 +36,8 @@
     def __init__(self, itemtype, unwrap, canoverflow=False, signed=False):
         self.itemtype = itemtype
         self.bytes = rffi.sizeof(itemtype)
-        self.arraytype = lltype.GcArray(itemtype)
+        #self.arraytype = lltype.GcArray(itemtype)
+        self.arraytype = lltype.Array(itemtype, hints={'nolength': True})
         self.unwrap = unwrap
         self.signed = signed
         self.canoverflow = canoverflow
@@ -108,10 +109,20 @@
             return rffi.cast(mytype.itemtype, item)
 
 
+        def __del__(self):
+            self.setlen(0)
+
+                
         def setlen(self, size):
-            new_buffer = lltype.malloc(mytype.arraytype, size)
-            for i in range(min(size,self.len)):
-                new_buffer[i] = self.buffer[i]
+            if size > 0:
+                #new_buffer = lltype.malloc(mytype.arraytype, size)
+                new_buffer = lltype.malloc(mytype.arraytype, size, flavor='raw')
+                for i in range(min(size,self.len)):
+                    new_buffer[i] = self.buffer[i]
+            else:
+                new_buffer = lltype.nullptr(mytype.arraytype)
+            if self.buffer != lltype.nullptr(mytype.arraytype):
+                lltype.free(self.buffer, flavor='raw')                
             self.buffer = new_buffer
             self.len = size
         setlen.unwrap_spec = ['self', int]
@@ -219,11 +230,17 @@
             oldlen = self.len
             new = len(s) / mytype.bytes
             self.setlen(oldlen + new)
-            for i in range(new):
-                p = i * mytype.bytes
-                item=runpack(mytype.typecode, s[p:p + mytype.bytes])
-                #self.buffer[oldlen + i]=self.item_w(self.space.wrap(item))
-                self.buffer[oldlen + i]=rffi.cast(mytype.itemtype, item)
+            if False:
+                for i in range(new):
+                    p = i * mytype.bytes
+                    item=runpack(mytype.typecode, s[p:p + mytype.bytes])
+                    #self.buffer[oldlen + i]=self.item_w(self.space.wrap(item))
+                    self.buffer[oldlen + i]=rffi.cast(mytype.itemtype, item)
+            else:
+                pbuf = rffi.cast(rffi.CCHARP, self.buffer)
+                for i in range(len(s)):
+                    pbuf[oldlen * mytype.bytes + i] = s[i]
+                    
         descr_fromstring.unwrap_spec = ['self', str]
 
         def descr_tolist(self):
@@ -234,6 +251,12 @@
             #return self.space.newlist([self.space.wrap(i) for i in self.buffer])
         descr_tolist.unwrap_spec = ['self']
 
+        def descr_tostring(self):
+            pbuf = rffi.cast(rffi.CCHARP, self.buffer)
+            s = ''
+            for i in range(self.len * self.itemsize):
+                s += pbuf[i]
+            return self.space.wrap(s)
 
 
     def descr_itemsize(space, self):
@@ -263,7 +286,8 @@
         tolist       = interp2app(W_Array.descr_tolist),
         tounicode    = appmethod('tounicode'),
         tofile       = appmethod('tofile'),
-        tostring     = appmethod('tostring'),
+        #tostring     = appmethod('tostring'),
+        tostring     = interp2app(W_Array.descr_tostring),
 
         _setlen      = interp2app(W_Array.setlen),
     )



More information about the Pypy-commit mailing list