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

Reply via email to