>From 7e5238291182fafcbf8aa11256b5c6ba2bd64c2a Mon Sep 17 00:00:00 2001 From: Gwenael Casaccio Date: Thu, 19 Dec 2013 12:05:08 +0100 Subject: [PATCH] Add two primitives VMpr_Object_primitiveOn, VMpr_Object_primitiveOn WithArguments for calling primitives. --- ChangeLog | 5 +++ libgst/prims.def | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) diff --git a/ChangeLog b/ChangeLog index d5395cc..947f32a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-12-19 Gwenael Casaccio + + * libgst/prims.def: Add VMpr_Object_primitiveOnWithArguments and + VMpr_Object_primitiveOn primitives. + 2013-06-14 Jochen Schmitt * smalltalk-mode-init.el.in: Use inhibit-local-variables-regexps diff --git a/libgst/prims.def b/libgst/prims.def index 7e8eaaf..c75010a 100644 --- a/libgst/prims.def +++ b/libgst/prims.def @@ -6211,5 +6211,114 @@ primitive VMpr_Random_next [succeed] PRIM_FAILED; } +/* Object primitive:on:ifFailed: + Object primitive:on:with:ifFailed: + Object primitive:on:with:withifFailed: + Object primitive:on:with:with:with:ifFailed: */ +primitive VMpr_Object_primitiveOn [succeed,fail] +{ + OOP oop1, receiver_oop, failed_oop; + OOP *oopVec; + int i, numPrimitive; + _gst_primitives_executed++; + + if (numArgs < 3) + PRIM_FAILED; + + oopVec = alloca (numArgs * sizeof (OOP)); + + failed_oop = POP_OOP (); + + for (i = 0; i < numArgs - 3; i++) + oopVec[i] = POP_OOP (); + + receiver_oop = POP_OOP (); + + oop1 = POP_OOP (); + if (!IS_INT (oop1)) + { + UNPOP (numArgs); + PRIM_FAILED; + } + + numPrimitive = TO_INT (oop1); + + PUSH_OOP (receiver_oop); + + for (i = numArgs - 4; i >= 0; i--) + PUSH_OOP (oopVec[i]); + + if COMMON (!execute_primitive_operation(numPrimitive, numArgs - 3)) + PRIM_SUCCEEDED; + + UNPOP (numArgs - 1); + + PUSH_OOP (oop1); + PUSH_OOP (receiver_oop); + + for (i = numArgs - 4; i >= 0; i--) + PUSH_OOP (oopVec[i]); + + PUSH_OOP (failed_oop); + + PRIM_FAILED; +} + +/* Object primitive:on:withArguments:ifFailed: */ +primitive VMpr_Object_primitiveOnWithArguments [succeed,fail] +{ + OOP oop1; + OOP oop2; + OOP oop3; + OOP receiver_oop; + int numPrimitive; + + _gst_primitives_executed++; + + if (numArgs != 4) + PRIM_FAILED; + + oop3 = POP_OOP (); + oop2 = POP_OOP (); + receiver_oop = POP_OOP (); + oop1 = POP_OOP (); + + if (!IS_INT (oop1) || !IS_CLASS (oop2, _gst_array_class)) + { + UNPOP (numArgs); + PRIM_FAILED; + } + + numPrimitive = TO_INT (oop1); + + { + OOP result_oop; + int i, args; + mst_Boolean succeed; + + args = NUM_INDEXABLE_FIELDS (oop2); + + PUSH_OOP (receiver_oop); + + for (i = 1; i <= args; i++) + PUSH_OOP (ARRAY_AT (oop2, i)); + + if COMMON (!execute_primitive_operation(numPrimitive, args)) + PRIM_SUCCEEDED; + + for (i = 1; i <= args; i++) + POP_OOP (); + + POP_OOP (); + } + + PUSH_OOP (oop1); + PUSH_OOP (receiver_oop); + PUSH_OOP (oop2); + PUSH_OOP (oop3); + + PRIM_FAILED; +} + #undef INT_BIN_OP #undef BOOL_BIN_OP -- 1.8.3.2