[pypy-svn] r76198 - pypy/branch/interplevel-array/pypy/module/array
hakanardo at codespeak.net
hakanardo at codespeak.net
Wed Jul 14 13:20:20 CEST 2010
Author: hakanardo
Date: Wed Jul 14 13:20:18 2010
New Revision: 76198
Modified:
pypy/branch/interplevel-array/pypy/module/array/interp_array.py
pypy/branch/interplevel-array/pypy/module/array/interp_simple.py
Log:
potential memory leak fixed and some rpython fixes
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 Wed Jul 14 13:20:18 2010
@@ -140,10 +140,10 @@
def __del__(self):
self.setlen(0)
-
+
def setlen(self, size):
- if size > self.allocated or size < self.allocated/2:
- if size > 0: #FIXME: allways free 0
+ if size > 0:
+ if size > self.allocated or size < self.allocated/2:
if size < 9:
some = 3
else:
@@ -154,14 +154,19 @@
for i in range(min(size,self.len)):
new_buffer[i] = self.buffer[i]
else:
- assert size == 0
- self.allocated = 0
- 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
+ return
+ else:
+ assert size == 0
+ self.allocated = 0
+ 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]
+
+ setlen.unwrap_spec = ['self', int]
def descr_len(self):
return self.space.wrap(self.len)
@@ -553,6 +558,8 @@
array.unwrap_spec = (ObjSpace, str, W_Root)
class W_WrappedArray(Wrappable):
+ _immutable_fields_ = ['_array']
+
def __init__(self, typecode, w_initializer=None):
pass
__init__.unwrap_spec = ['self', str, W_Root]
@@ -562,21 +569,31 @@
descr_pop.unwrap_spec = ['self', int]
def descr_getitem(self, w_i):
- w_item = self._array.descr_getitem(w_i)
+ space = self._array.space
+ #w_item = self._array.descr_getitem(w_i)
+ w_item = space.call_function(
+ space.getattr(self._array, space.wrap('__getitem__')), w_i)
if isinstance(w_item, W_ArrayBase):
return wrap_array(w_item)
return w_item
descr_getitem.unwrap_spec = ['self', W_Root]
def descr_iadd(self, w_i):
- self._array.descr_iadd(w_i._array)
+ space = self._array.space
+ #self._array.descr_iadd(w_i._array)
+ w_i = space.interp_w(W_WrappedArray, w_i)
+ w_item = space.call_function(
+ space.getattr(self._array, space.wrap('__iadd__')), w_i._array)
return self
descr_iadd.unwrap_spec = ['self', W_Root]
- def descr_imul(self, i):
- self._array.descr_imul(i)
+ def descr_imul(self, w_i):
+ space = self._array.space
+ #self._array.descr_imul(i)
+ w_item = space.call_function(
+ space.getattr(self._array, space.wrap('__imul__')), w_i)
return self
- descr_imul.unwrap_spec = ['self', int]
+ descr_imul.unwrap_spec = ['self', W_Root]
def descr_reduce(self):
space=self._array.space
@@ -588,6 +605,8 @@
mod = space.interp_w(MixedModule, w_mod)
w_new_inst = mod.get('_new_array')
return space.newtuple([w_new_inst, space.newtuple(args)])
+ return space.newtuple([space.gettypeobject(W_WrappedArray.typedef),
+ space.newtuple(args)])
def unwrap_array(w_a):
Modified: pypy/branch/interplevel-array/pypy/module/array/interp_simple.py
==============================================================================
--- pypy/branch/interplevel-array/pypy/module/array/interp_simple.py (original)
+++ pypy/branch/interplevel-array/pypy/module/array/interp_simple.py Wed Jul 14 13:20:18 2010
@@ -11,6 +11,8 @@
class W_SizedFloatArray(Wrappable):
+ _immutable_fields_ = ['size', 'buffer']
+
@dont_look_inside
def __init__(self, space, size):
self.space = space
More information about the Pypy-commit
mailing list