diff --git a/rsqueakvm/primitives/array_stream.py b/rsqueakvm/primitives/array_stream.py index 807f8737..476682bd 100644 --- a/rsqueakvm/primitives/array_stream.py +++ b/rsqueakvm/primitives/array_stream.py @@ -56,4 +56,5 @@ def func(interp, s_frame, w_receiver, n0, w_value): if not (isinstance(w_receiver, W_BytesObject) or isinstance(w_receiver, W_WordsObject)): raise PrimitiveFailedError - return w_receiver.short_atput0(interp.space, n0, w_value) + w_receiver.short_atput0(interp.space, n0, w_value) + return w_value diff --git a/rsqueakvm/primitives/control.py b/rsqueakvm/primitives/control.py index c0310801..ca677d3b 100644 --- a/rsqueakvm/primitives/control.py +++ b/rsqueakvm/primitives/control.py @@ -255,14 +255,12 @@ def func(interp, s_frame, w_block_ctx, args_w): @expose_primitive(PERFORM, no_result=True, clean_stack=False) def func(interp, s_frame, argcount): - if argcount == 1: - w_selector = s_frame.pop() - w_rcvr = s_frame.top() - return s_frame._sendSelector( - w_selector, 0, interp, w_rcvr, - w_rcvr.class_shadow(interp.space)) - else: - raise PrimitiveFailedError + arguments_w = s_frame.pop_and_return_n(argcount - 1) + w_selector = s_frame.pop() + w_rcvr = s_frame.top() + return s_frame._sendSelector( + w_selector, argcount - 1, interp, w_rcvr, + w_rcvr.class_shadow(interp.space), w_arguments=arguments_w) @expose_primitive(PERFORM_WITH_ARGS, unwrap_spec=[object, object, list], diff --git a/rsqueakvm/primitives/system.py b/rsqueakvm/primitives/system.py index 4c2a588e..266a48a2 100644 --- a/rsqueakvm/primitives/system.py +++ b/rsqueakvm/primitives/system.py @@ -1,3 +1,5 @@ +from rpython.rlib import jit + from rsqueakvm import constants from rsqueakvm.error import PrimitiveFailedError, MetaPrimFailed from rsqueakvm.model.numeric import W_SmallInteger @@ -40,7 +42,9 @@ def func(interp, s_frame, w_rcvr, primFailFlag): raise PrimitiveFailedError @expose_primitive(VM_PARAMETERS) +@jit.dont_look_inside def func(interp, s_frame, argcount): + from rpython.rlib import jit_hooks """Behaviour depends on argument count: 0 args: return an Array of VM parameter values; 1 arg: return the indicated VM parameter; @@ -123,13 +127,20 @@ def func(interp, s_frame, argcount): vm_w_params[8] = interp.space.wrap_int(1) # must be 1 for VM Stats view to work vm_w_params[41] = interp.space.wrap_int(1) # We are a "stack-like" VM - number of stack tables - vm_w_params[45] = interp.space.wrap_int(1) # We are a "cog-like" VM - machine code zone size + # sizeOfMachineCode = jit_hooks.stats_asmmemmgr_allocated(None) + sizeOfMachineCode = jit_hooks.stats_asmmemmgr_used(None) + vm_w_params[45] = interp.space.wrap_int(sizeOfMachineCode) vm_w_params[39] = interp.space.wrap_int(constants.BYTES_PER_WORD) vm_w_params[40] = interp.space.wrap_int(interp.image.version.magic) vm_w_params[55] = interp.space.wrap_int(interp.process_switch_count) vm_w_params[57] = interp.space.wrap_int(interp.forced_interrupt_checks_count) vm_w_params[59] = interp.space.wrap_int(interp.stack_overflow_count) + + numberOfLoops = jit_hooks.stats_get_counter_value(None, jit.Counters.TOTAL_COMPILED_LOOPS) + numberOfBridges = jit_hooks.stats_get_counter_value(None, jit.Counters.TOTAL_COMPILED_BRIDGES) + vm_w_params[63] = interp.space.wrap_int(numberOfLoops + numberOfBridges) + vm_w_params[69] = interp.space.wrap_int(constants.INTERP_PROXY_MAJOR) vm_w_params[70] = interp.space.wrap_int(constants.INTERP_PROXY_MINOR) diff --git a/rsqueakvm/test/test_miniimage.py b/rsqueakvm/test/test_miniimage.py index 43dc03cf..e3f8c799 100644 --- a/rsqueakvm/test/test_miniimage.py +++ b/rsqueakvm/test/test_miniimage.py @@ -301,9 +301,39 @@ def test_primitive_perform(): for sel in selectors_w: if sel.unwrap_string(None) == 'size': w_sel = sel + break size = _prim(space, PERFORM, [w_o, w_sel]) assert size.value == 3 +def test_primitive_perform_with(): + from rsqueakvm.test.test_primitives import _prim + w_o = space.wrap_list([space.wrap_int(1), 2, 3]) + w_methoddict = w_o.class_shadow(space).s_superclass().s_superclass().s_superclass().s_superclass().w_methoddict() + w_methoddict.as_methoddict_get_shadow(space).sync_method_cache() + selectors_w = w_methoddict.strategy.methoddict.keys() + w_sel = None + for sel in selectors_w: + if sel.unwrap_string(None) == 'at:': + w_sel = sel + break + index = _prim(space, PERFORM, [w_o, w_sel, space.wrap_int(1)]) + assert index.value == 1 + +def test_primitive_perform_with_with(): + from rsqueakvm.test.test_primitives import _prim + w_o = space.wrap_list([1, 2, 3]) + w_methoddict = w_o.class_shadow(space).s_superclass().s_superclass().s_superclass().s_superclass().w_methoddict() + w_methoddict.as_methoddict_get_shadow(space).sync_method_cache() + selectors_w = w_methoddict.strategy.methoddict.keys() + w_sel = None + for sel in selectors_w: + if sel.unwrap_string(None) == 'at:put:': + w_sel = sel + break + w_val = _prim(space, PERFORM, [w_o, w_sel, space.wrap_int(1), space.w_nil]) + assert w_val is space.w_nil + assert w_o.fetch(space, 0) is space.w_nil + def test_primitive_perform_with_args(): from rsqueakvm.test.test_primitives import _prim w_o = space.wrap_list([1, 2, 3])