• R/O
  • SSH

quipu: Commit

quipu mercurial repository


Commit MetaInfo

Revision6cf66983bbf36f1c7408915ab86078a95a23e934 (tree)
Zeit2019-10-19 00:28:33
AutorAgustina Arzille <avarzille@rise...>
CommiterAgustina Arzille

Log Message

Refactor method calling into its own function

Ändern Zusammenfassung

Diff

diff -r ac10c2f3511c -r 6cf66983bbf3 function.cpp
--- a/function.cpp Thu Oct 17 19:17:57 2019 -0300
+++ b/function.cpp Fri Oct 18 12:28:33 2019 -0300
@@ -244,6 +244,43 @@
244244 return (true);
245245 }
246246
247+static object
248+meth_call (interpreter *interp, object cache, object *argv, int argc)
249+{
250+ if (!tuple_p (cache))
251+ interp->raise ("type-error", "second argument must be a tuple");
252+ else if (argc < 3)
253+ interp->raise_nargs (3, -1, argc);
254+
255+ QP_TMARK (interp);
256+ object *tp = (object *)QP_TALLOC (interp, (argc - 1) * sizeof (*tp));
257+ tp[0] = NIL;
258+ for (int i = 2; i < argc; ++i)
259+ tp[i - 1] = type (argv[i]);
260+
261+ local_varobj<array> types;
262+ types.local_init (tp, argc - 1);
263+
264+ valref pred (interp, fixint (0)), succ (interp, fixint (0));
265+ valref rv (interp, tuple_nearest (interp, cache, types.as_obj (),
266+ &*pred, &*succ));
267+
268+ if (*rv != UNBOUND)
269+ ;
270+ else if (array_p (*pred) && meth_try (&types, *pred))
271+ *rv = *pred;
272+ else if (array_p (*succ) && meth_try (&types, *succ))
273+ *rv = *succ;
274+ else
275+ interp->raise ("dispatch-error", "no suitable method found");
276+
277+ interp->stkend -= interpreter::frame_size;
278+ argc -= 2; // Skip code and cache.
279+ *(interp->stkend - argc - 1) = xaref (*rv, 0);
280+ interp->cur_frame = as_int (interp->stack[interp->cur_frame - 4]);
281+ return (call_n (interp, argc));
282+}
283+
247284 object p_meth_ctl (interpreter *interp, object *argv, int argc)
248285 {
249286 if (!fixint_p (*argv))
@@ -269,43 +306,7 @@
269306 fixint (meth_cmptypes (interp, argv[1], argv[2])));
270307
271308 case 2:
272- { // Call method.
273- object cache = argv[1];
274-
275- if (!tuple_p (cache))
276- interp->raise ("type-error", "second argument must be a tuple");
277- else if (argc < 3)
278- interp->raise_nargs (3, -1, argc);
279-
280- QP_TMARK (interp);
281- object *tp = (object *)QP_TALLOC (interp, (argc - 1) * sizeof (object));
282-
283- tp[0] = NIL;
284- for (int i = 2; i < argc; ++i)
285- tp[i - 1] = type (argv[i]);
286-
287- local_varobj<array> types;
288- types.local_init (tp, argc - 1);
289-
290- valref pred (interp, fixint (0)), succ (interp, fixint (0));
291- valref rv (interp, tuple_nearest (interp, cache, types.as_obj (),
292- &*pred, &*succ));
293-
294- if (*rv != UNBOUND)
295- ;
296- else if (array_p (*pred) && meth_try (&types, *pred))
297- *rv = *pred;
298- else if (array_p (*succ) && meth_try (&types, *succ))
299- *rv = *succ;
300- else
301- interp->raise ("dispatch-error", "no suitable method found");
302-
303- interp->stkend -= interpreter::frame_size;
304- argc -= 2; // Skip code and cache.
305- *(interp->stkend - argc - 1) = xaref (*rv, 0);
306- interp->cur_frame = as_int (interp->stack[interp->cur_frame - 4]);
307- return (call_n (interp, argc));
308- }
309+ return (meth_call (interp, argv[1], argv, argc));
309310
310311 case 3:
311312 // Flag method.
Show on old repository browser