Author: David Schneider <[email protected]>
Branch: arm-backed-float
Changeset: r45100:3f26b83707de
Date: 2011-06-21 17:13 +0200
http://bitbucket.org/pypy/pypy/changeset/3f26b83707de/
Log: fix for an issue triggered when a const int is passed as the size to
_malloc_varsize.
diff --git a/pypy/jit/backend/arm/opassembler.py
b/pypy/jit/backend/arm/opassembler.py
--- a/pypy/jit/backend/arm/opassembler.py
+++ b/pypy/jit/backend/arm/opassembler.py
@@ -937,13 +937,14 @@
# from: ../x86/regalloc.py:750
# called from regalloc
# XXX kill this function at some point
- def _regalloc_malloc_varsize(self, size, size_box, vloc, ofs_items_loc,
regalloc, result):
+ def _regalloc_malloc_varsize(self, size, size_box, vloc, vbox,
ofs_items_loc, regalloc, result):
self.mc.MUL(size.value, size.value, vloc.value)
if ofs_items_loc.is_imm():
self.mc.ADD_ri(size.value, size.value, ofs_items_loc.value)
else:
self.mc.ADD_rr(size.value, size.value, ofs_items_loc.value)
force_index = self.write_new_force_index()
+ regalloc.force_spill_var(vbox)
self._emit_call(force_index, self.malloc_func_addr, [size_box],
regalloc,
result=result)
diff --git a/pypy/jit/backend/arm/regalloc.py b/pypy/jit/backend/arm/regalloc.py
--- a/pypy/jit/backend/arm/regalloc.py
+++ b/pypy/jit/backend/arm/regalloc.py
@@ -935,14 +935,16 @@
else:
ofs_items_loc, ofs_items_box =
self._ensure_value_is_boxed(ofs_items_box, boxes)
boxes.append(ofs_items_box)
- vloc, v = self._ensure_value_is_boxed(v, [res_v])
- boxes.append(v)
+ vloc, vbox = self._ensure_value_is_boxed(v, [res_v])
+ boxes.append(vbox)
size, size_box = self._ensure_value_is_boxed(itemsize_box, boxes)
boxes.append(size_box)
self.assembler._regalloc_malloc_varsize(size, size_box,
- vloc, ofs_items_loc, self, res_v)
+ vloc, vbox, ofs_items_loc, self, res_v)
base_loc = self.make_sure_var_in_reg(res_v)
- value_loc = self.make_sure_var_in_reg(v)
+
+ value_loc, vbox = self._ensure_value_is_boxed(v, [res_v])
+ boxes.append(vbox)
self.possibly_free_vars(boxes)
assert value_loc.is_reg()
assert base_loc.is_reg()
diff --git a/pypy/jit/backend/arm/test/test_runner.py
b/pypy/jit/backend/arm/test/test_runner.py
--- a/pypy/jit/backend/arm/test/test_runner.py
+++ b/pypy/jit/backend/arm/test/test_runner.py
@@ -104,3 +104,14 @@
self.cpu.set_future_value_int(0, 11)
res = self.cpu.execute_token(lt1)
assert self.cpu.get_latest_value_int(0) == 10
+
+ def test_new_array_with_const_length(self):
+ """ Test for an issue with malloc_varsize when the size is an imm
+ that gets lost around the call to malloc"""
+ A = lltype.GcArray(lltype.Signed)
+ arraydescr = self.cpu.arraydescrof(A)
+ r1 = self.execute_operation(rop.NEW_ARRAY, [ConstInt(6)],
+ 'ref', descr=arraydescr)
+ a = lltype.cast_opaque_ptr(lltype.Ptr(A), r1.value)
+ assert a[0] == 0
+ assert len(a) == 6
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit