[pypy-commit] pypy default: Support "malloc(STRUCT, flavor='raw')" too.
arigo
noreply at buildbot.pypy.org
Wed Dec 14 18:07:54 CET 2011
Author: Armin Rigo <arigo at 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})
More information about the pypy-commit
mailing list