Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r50510:0af6042f9ef6 Date: 2011-12-14 17:23 +0100 http://bitbucket.org/pypy/pypy/changeset/0af6042f9ef6/
Log: Support "malloc(STRUCT, flavor='raw')" too. diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py --- a/pypy/jit/codewriter/jtransform.py +++ b/pypy/jit/codewriter/jtransform.py @@ -498,27 +498,29 @@ else: log.WARNING('ignoring hint %r at %r' % (hints, self.graph)) + def _rewrite_raw_malloc(self, op, name, args): + d = op.args[1].value.copy() + d.pop('flavor') + add_memory_pressure = d.pop('add_memory_pressure', False) + zero = d.pop('zero', False) + track_allocation = d.pop('track_allocation', True) + if d: + raise UnsupportedMallocFlags(d) + TYPE = op.args[0].value + if zero: + name += '_zero' + if add_memory_pressure: + name += '_add_memory_pressure' + if not track_allocation: + name += '_no_track_allocation' + return self._do_builtin_call(op, name, args, + extra = (TYPE,), + extrakey = TYPE) + def rewrite_op_malloc_varsize(self, op): if op.args[1].value['flavor'] == 'raw': - d = op.args[1].value.copy() - d.pop('flavor') - add_memory_pressure = d.pop('add_memory_pressure', False) - zero = d.pop('zero', False) - track_allocation = d.pop('track_allocation', True) - if d: - raise UnsupportedMallocFlags(d) - ARRAY = op.args[0].value - name = 'raw_malloc' - if zero: - name += '_zero' - if add_memory_pressure: - name += '_add_memory_pressure' - if not track_allocation: - name += '_no_track_allocation' - return self._do_builtin_call(op, name, - [op.args[2]], - extra = (ARRAY,), - extrakey = ARRAY) + return self._rewrite_raw_malloc(op, 'raw_malloc_varsize', + [op.args[2]]) if op.args[0].value == rstr.STR: return SpaceOperation('newstr', [op.args[2]], op.result) elif op.args[0].value == rstr.UNICODE: @@ -739,6 +741,9 @@ return [op0, op1] def rewrite_op_malloc(self, op): + if op.args[1].value['flavor'] == 'raw': + return self._rewrite_raw_malloc(op, 'raw_malloc_fixedsize', []) + # assert op.args[1].value == {'flavor': 'gc'} STRUCT = op.args[0].value vtable = heaptracker.get_vtable_for_gcstruct(self.cpu, STRUCT) diff --git a/pypy/jit/codewriter/support.py b/pypy/jit/codewriter/support.py --- a/pypy/jit/codewriter/support.py +++ b/pypy/jit/codewriter/support.py @@ -599,21 +599,59 @@ return p return _ll_0_alloc_with_del - def build_raw_malloc_builder(zero=False, add_memory_pressure=False, track_allocation=True): - def build_ll_1_raw_malloc(ARRAY): - def _ll_1_raw_malloc(n): - return lltype.malloc(ARRAY, n, flavor='raw', zero=zero, add_memory_pressure=add_memory_pressure) - return _ll_1_raw_malloc - return build_ll_1_raw_malloc + def build_raw_malloc_varsize_builder(zero=False, + add_memory_pressure=False, + track_allocation=True): + def build_ll_1_raw_malloc_varsize(ARRAY): + def _ll_1_raw_malloc_varsize(n): + return lltype.malloc(ARRAY, n, flavor='raw', zero=zero, + add_memory_pressure=add_memory_pressure) + return _ll_1_raw_malloc_varsize + return build_ll_1_raw_malloc_varsize - build_ll_1_raw_malloc = build_raw_malloc_builder() - build_ll_1_raw_malloc_zero = build_raw_malloc_builder(zero=True) - build_ll_1_raw_malloc_zero_add_memory_pressure = build_raw_malloc_builder(zero=True, add_memory_pressure=True) - build_ll_1_raw_malloc_add_memory_pressure = build_raw_malloc_builder(add_memory_pressure=True) - build_ll_1_raw_malloc_no_track_allocation = build_raw_malloc_builder(track_allocation=False) - build_ll_1_raw_malloc_zero_no_track_allocation = build_raw_malloc_builder(zero=True, track_allocation=False) - build_ll_1_raw_malloc_zero_add_memory_pressure_no_track_allocation = build_raw_malloc_builder(zero=True, add_memory_pressure=True, track_allocation=False) - build_ll_1_raw_malloc_add_memory_pressure_no_track_allocation = build_raw_malloc_builder(add_memory_pressure=True, track_allocation=False) + build_ll_1_raw_malloc_varsize = ( + build_raw_malloc_varsize_builder()) + build_ll_1_raw_malloc_varsize_zero = ( + build_raw_malloc_varsize_builder(zero=True)) + build_ll_1_raw_malloc_varsize_zero_add_memory_pressure = ( + build_raw_malloc_varsize_builder(zero=True, add_memory_pressure=True)) + build_ll_1_raw_malloc_varsize_add_memory_pressure = ( + build_raw_malloc_varsize_builder(add_memory_pressure=True)) + build_ll_1_raw_malloc_varsize_no_track_allocation = ( + build_raw_malloc_varsize_builder(track_allocation=False)) + build_ll_1_raw_malloc_varsize_zero_no_track_allocation = ( + build_raw_malloc_varsize_builder(zero=True, track_allocation=False)) + build_ll_1_raw_malloc_varsize_zero_add_memory_pressure_no_track_allocation = ( + build_raw_malloc_varsize_builder(zero=True, add_memory_pressure=True, track_allocation=False)) + build_ll_1_raw_malloc_varsize_add_memory_pressure_no_track_allocation = ( + build_raw_malloc_varsize_builder(add_memory_pressure=True, track_allocation=False)) + + def build_raw_malloc_fixedsize_builder(zero=False, + add_memory_pressure=False, + track_allocation=True): + def build_ll_0_raw_malloc_fixedsize(STRUCT): + def _ll_0_raw_malloc_fixedsize(): + return lltype.malloc(STRUCT, flavor='raw', zero=zero, + add_memory_pressure=add_memory_pressure) + return _ll_0_raw_malloc_fixedsize + return build_ll_0_raw_malloc_fixedsize + + build_ll_0_raw_malloc_fixedsize = ( + build_raw_malloc_fixedsize_builder()) + build_ll_0_raw_malloc_fixedsize_zero = ( + build_raw_malloc_fixedsize_builder(zero=True)) + build_ll_0_raw_malloc_fixedsize_zero_add_memory_pressure = ( + build_raw_malloc_fixedsize_builder(zero=True, add_memory_pressure=True)) + build_ll_0_raw_malloc_fixedsize_add_memory_pressure = ( + build_raw_malloc_fixedsize_builder(add_memory_pressure=True)) + build_ll_0_raw_malloc_fixedsize_no_track_allocation = ( + build_raw_malloc_fixedsize_builder(track_allocation=False)) + build_ll_0_raw_malloc_fixedsize_zero_no_track_allocation = ( + build_raw_malloc_fixedsize_builder(zero=True, track_allocation=False)) + build_ll_0_raw_malloc_fixedsize_zero_add_memory_pressure_no_track_allocation = ( + build_raw_malloc_fixedsize_builder(zero=True, add_memory_pressure=True, track_allocation=False)) + build_ll_0_raw_malloc_fixedsize_add_memory_pressure_no_track_allocation = ( + build_raw_malloc_fixedsize_builder(add_memory_pressure=True, track_allocation=False)) def build_ll_1_raw_free(ARRAY): def _ll_1_raw_free(p): diff --git a/pypy/jit/codewriter/test/test_codewriter.py b/pypy/jit/codewriter/test/test_codewriter.py --- a/pypy/jit/codewriter/test/test_codewriter.py +++ b/pypy/jit/codewriter/test/test_codewriter.py @@ -217,7 +217,7 @@ cw.make_jitcodes(verbose=True) # s = jitdriver_sd.mainjitcode.dump() - assert 'residual_call_ir_i $<* fn _ll_1_raw_malloc__Signed>' in s + assert 'residual_call_ir_i $<* fn _ll_1_raw_malloc_varsize__Signed>' in s assert 'setarrayitem_raw_i' in s assert 'getarrayitem_raw_i' in s assert 'residual_call_ir_v $<* fn _ll_1_raw_free__arrayPtr>' in s diff --git a/pypy/jit/codewriter/test/test_jtransform.py b/pypy/jit/codewriter/test/test_jtransform.py --- a/pypy/jit/codewriter/test/test_jtransform.py +++ b/pypy/jit/codewriter/test/test_jtransform.py @@ -550,7 +550,7 @@ tr = Transformer(FakeCPU(), FakeResidualCallControl()) op0, op1 = tr.rewrite_operation(op) assert op0.opname == 'residual_call_ir_i' - assert op0.args[0].value == 'raw_malloc' # pseudo-function as a str + assert op0.args[0].value == 'raw_malloc_varsize' # pseudo-function as a str assert op1.opname == '-live-' assert op1.args == [] @@ -564,7 +564,7 @@ tr = Transformer(FakeCPU(), FakeResidualCallControl()) op0, op1 = tr.rewrite_operation(op) assert op0.opname == 'residual_call_ir_i' - assert op0.args[0].value == 'raw_malloc_zero' # pseudo-function as a str + assert op0.args[0].value == 'raw_malloc_varsize_zero' # pseudo-fn as a str assert op1.opname == '-live-' assert op1.args == [] @@ -578,6 +578,18 @@ tr = Transformer(FakeCPU(), FakeResidualCallControl()) py.test.raises(UnsupportedMallocFlags, tr.rewrite_operation, op) +def test_raw_malloc_fixedsize(): + S = lltype.Struct('dummy', ('x', lltype.Signed)) + v = varoftype(lltype.Ptr(S)) + flags = Constant({'flavor': 'raw', 'zero': True}, lltype.Void) + op = SpaceOperation('malloc', [Constant(S, lltype.Void), flags], v) + tr = Transformer(FakeCPU(), FakeResidualCallControl()) + op0, op1 = tr.rewrite_operation(op) + assert op0.opname == 'residual_call_r_i' + assert op0.args[0].value == 'raw_malloc_fixedsize_zero' #pseudo-fn as a str + assert op1.opname == '-live-' + assert op1.args == [] + def test_rename_on_links(): v1 = Variable() v2 = Variable(); v2.concretetype = llmemory.Address diff --git a/pypy/jit/metainterp/test/test_rawmem.py b/pypy/jit/metainterp/test/test_rawmem.py --- a/pypy/jit/metainterp/test/test_rawmem.py +++ b/pypy/jit/metainterp/test/test_rawmem.py @@ -8,7 +8,7 @@ VOID_TP = lltype.Array(lltype.Void, hints={"nolength": True, "uncast_on_llgraph": True}) class A(object): def __init__(self, x): - self.storage = rffi.cast(lltype.Ptr(VOID_TP), x)\ + self.storage = rffi.cast(lltype.Ptr(VOID_TP), x) def f(n): x = lltype.malloc(TP, n, flavor="raw", zero=True) @@ -19,4 +19,14 @@ lltype.free(x, flavor="raw") return s res = self.interp_operations(f, [10]) - assert res == 1.0 \ No newline at end of file + + def test_fixed_size_malloc(self): + TIMEVAL = lltype.Struct('dummy', ('tv_sec', rffi.LONG), ('tv_usec', rffi.LONG)) + def f(): + p = lltype.malloc(TIMEVAL, flavor='raw') + lltype.free(p, flavor='raw') + return 42 + res = self.interp_operations(f, []) + assert res == 42 + self.check_operations_history({'call': 2, 'guard_no_exception': 1, + 'finish': 1}) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit