Author: Maciej Fijalkowski <fij...@gmail.com> Branch: fast-slowpath Changeset: r65471:8d11a494f1a9 Date: 2013-07-19 00:02 +0200 http://bitbucket.org/pypy/pypy/changeset/8d11a494f1a9/
Log: This seems to work diff --git a/rpython/jit/backend/llsupport/rewrite.py b/rpython/jit/backend/llsupport/rewrite.py --- a/rpython/jit/backend/llsupport/rewrite.py +++ b/rpython/jit/backend/llsupport/rewrite.py @@ -126,27 +126,6 @@ else: self.gen_malloc_fixedsize(size, descr.tid, op.result) - def handle_list_resize_ge(self, op): - """ what we want to do is to check the length and than add a conditional - call to really resize - """ - extra_info = op.getdescr().get_extra_info() - itemsdescr = extra_info.extra_descrs[0] - arraydescr = extra_info.extra_descrs[1] - func = op.getarg(0) - lst = op.getarg(1) - newsizebox = op.getarg(2) - arrbox = BoxPtr() - arrlenbox = BoxInt() - cond_box = BoxInt() - op0 = ResOperation(rop.GETFIELD_GC, [lst], arrbox, descr=itemsdescr) - op1 = ResOperation(rop.ARRAYLEN_GC, [arrbox], arrlenbox, - descr=arraydescr) - op2 = ResOperation(rop.INT_GE, [arrlenbox, newsizebox], cond_box) - op3 = ResOperation(rop.COND_CALL, [cond_box, func, lst, newsizebox], - None, descr=op.getdescr()) - self.newops += [op0, op1, op2, op3] - def handle_new_array(self, arraydescr, op, kind=FLAG_ARRAY): v_length = op.getarg(0) total_size = -1 @@ -245,6 +224,30 @@ self.newops.append(ResOperation(rop.CALL_ASSEMBLER, args, op.result, op.getdescr())) + def handle_list_resize_ge(self, op): + """ what we want to do is to check the length and than add a conditional + call to really resize + """ + extra_info = op.getdescr().get_extra_info() + lendescr = extra_info.extra_descrs[0] + itemsdescr = extra_info.extra_descrs[1] + arraydescr = extra_info.extra_descrs[2] + func = op.getarg(0) + lst = op.getarg(1) + newsizebox = op.getarg(2) + arrbox = BoxPtr() + arrlenbox = BoxInt() + cond_box = BoxInt() + op0 = ResOperation(rop.GETFIELD_GC, [lst], arrbox, descr=itemsdescr) + op1 = ResOperation(rop.ARRAYLEN_GC, [arrbox], arrlenbox, + descr=arraydescr) + op2 = ResOperation(rop.INT_LT, [arrlenbox, newsizebox], cond_box) + op3 = ResOperation(rop.COND_CALL, [cond_box, func, lst, newsizebox], + None, descr=op.getdescr()) + op4 = ResOperation(rop.SETFIELD_GC, [lst, newsizebox], None, + descr=lendescr) + self.newops += [op0, op1, op2, op3, op4] + # ---------- def emitting_an_operation_that_can_collect(self): diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py b/rpython/jit/backend/llsupport/test/test_rewrite.py --- a/rpython/jit/backend/llsupport/test/test_rewrite.py +++ b/rpython/jit/backend/llsupport/test/test_rewrite.py @@ -92,12 +92,13 @@ ARRAY = lltype.GcArray(lltype.Signed) LIST = lltype.GcStruct('LIST', ('length', lltype.Signed), ('items', lltype.Ptr(ARRAY))) + lendescr = get_field_descr(self.gc_ll_descr, LIST, 'length') itemsdescr = get_field_descr(self.gc_ll_descr, LIST, 'items') arraydescr = get_array_descr(self.gc_ll_descr, ARRAY) extrainfo = EffectInfo(None, None, None, None, extraeffect=EffectInfo.EF_RANDOM_EFFECTS, oopspecindex=EffectInfo.OS_LIST_RESIZE_GE, - extra_descrs=[itemsdescr, arraydescr]) + extra_descrs=[lendescr, itemsdescr, arraydescr]) list_resize_descr = get_call_descr(self.gc_ll_descr, [lltype.Ptr(LIST), lltype.Signed], lltype.Void, extrainfo) @@ -798,6 +799,7 @@ [p0, i0] p1 = getfield_gc(p0, descr=itemsdescr) i1 = arraylen_gc(p1, descr=arraydescr) - i2 = int_ge(i1, i0) + i2 = int_lt(i1, i0) cond_call(i2, ConstClass(list_resize_ge), p0, i0, descr=list_resize_descr) + setfield_gc(p0, i0, descr=lendescr) """) diff --git a/rpython/jit/codewriter/effectinfo.py b/rpython/jit/codewriter/effectinfo.py --- a/rpython/jit/codewriter/effectinfo.py +++ b/rpython/jit/codewriter/effectinfo.py @@ -272,8 +272,10 @@ funcobj = op.args[0].value._obj if funcobj.random_effects_on_gcobjs: return True - except (AttributeError, lltype.DelayedPointer): + except lltype.DelayedPointer: return True # better safe than sorry + except AttributeError: + return False return super(RandomEffectsAnalyzer, self).analyze_external_call( op, seen) diff --git a/rpython/jit/codewriter/jtransform.py b/rpython/jit/codewriter/jtransform.py --- a/rpython/jit/codewriter/jtransform.py +++ b/rpython/jit/codewriter/jtransform.py @@ -1622,9 +1622,11 @@ index = EffectInfo.OS_LIST_RESIZE_GE LIST = args[0].concretetype.TO itemsdescr = self.cpu.fielddescrof(LIST, 'items') + lendescr = self.cpu.fielddescrof(LIST, 'length') arraydescr = self.cpu.arraydescrof(LIST.items.TO) return self.handle_residual_call(op, oopspecindex=index, - extradescrs=[itemsdescr, arraydescr]) + extradescrs=[lendescr, itemsdescr, + arraydescr]) # ---------- # Strings and Unicodes. _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit