[svn:parrot] r43042 - in branches/context_unify3: include/parrot src/call

bacek at svn.parrot.org bacek at svn.parrot.org
Mon Dec 14 12:43:19 UTC 2009


Author: bacek
Date: Mon Dec 14 12:43:19 2009
New Revision: 43042
URL: https://trac.parrot.org/parrot/changeset/43042

Log:
Factor out prepare_call function

Modified:
   branches/context_unify3/include/parrot/call.h
   branches/context_unify3/src/call/pcc.c

Modified: branches/context_unify3/include/parrot/call.h
==============================================================================
--- branches/context_unify3/include/parrot/call.h	Mon Dec 14 12:42:55 2009	(r43041)
+++ branches/context_unify3/include/parrot/call.h	Mon Dec 14 12:43:19 2009	(r43042)
@@ -82,6 +82,15 @@
         __attribute__nonnull__(3);
 
 PARROT_EXPORT
+void Parrot_pcc_prepare_call(PARROT_INTERP,
+    ARGIN(PMC *call_object),
+    ARGIN(PMC *ret_cont),
+    ARGIN_NULLOK(PMC *current_object))
+        __attribute__nonnull__(1)
+        __attribute__nonnull__(2)
+        __attribute__nonnull__(3);
+
+PARROT_EXPORT
 void Parrot_PCCINVOKE(PARROT_INTERP,
     ARGIN(PMC* pmc),
     ARGMOD(STRING *method_name),
@@ -109,6 +118,10 @@
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(sub_obj) \
     , PARROT_ASSERT_ARG(sig))
+#define ASSERT_ARGS_Parrot_pcc_prepare_call __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(call_object) \
+    , PARROT_ASSERT_ARG(ret_cont))
 #define ASSERT_ARGS_Parrot_PCCINVOKE __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(pmc) \

Modified: branches/context_unify3/src/call/pcc.c
==============================================================================
--- branches/context_unify3/src/call/pcc.c	Mon Dec 14 12:42:55 2009	(r43041)
+++ branches/context_unify3/src/call/pcc.c	Mon Dec 14 12:43:19 2009	(r43042)
@@ -253,6 +253,34 @@
 }
 
 /*
+ 
+=item C<void Parrot_pcc_prepare_call(PARROT_INTERP, PMC *call_object, PMC
+*ret_cont, PMC *current_object)>
+
+Prepare and push CallContext for invoke Sub.
+
+TODO Invent better name for it.
+
+=cut
+
+*/
+PARROT_EXPORT
+void
+Parrot_pcc_prepare_call(PARROT_INTERP, ARGIN(PMC *call_object),
+        ARGIN(PMC *ret_cont), ARGIN_NULLOK(PMC *current_object))
+{
+    ASSERT_ARGS(Parrot_pcc_prepare_call)
+
+    Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), call_object);
+    Parrot_pcc_init_context(interp, call_object, CURRENT_CONTEXT(interp));
+    Parrot_pcc_set_caller_ctx(interp, call_object, CURRENT_CONTEXT(interp));
+    Parrot_pcc_set_continuation(interp, call_object, ret_cont);
+    interp->current_cont    = ret_cont;
+    interp->current_object  = current_object;
+    CURRENT_CONTEXT(interp) = call_object;
+}
+
+/*
 
 =item C<void Parrot_pcc_invoke_from_sig_object(PARROT_INTERP, PMC *sub_obj, PMC
 *call_object)>
@@ -275,12 +303,7 @@
     opcode_t    *dest;
     PMC * const  ret_cont = new_ret_continuation_pmc(interp, NULL);
 
-    Parrot_pcc_set_signature(interp, CURRENT_CONTEXT(interp), call_object);
-    Parrot_pcc_init_context(interp, call_object, CURRENT_CONTEXT(interp));
-    Parrot_pcc_set_caller_ctx(interp, call_object, CURRENT_CONTEXT(interp));
-    Parrot_pcc_set_continuation(interp, call_object, ret_cont);
-    interp->current_cont = ret_cont;
-    CURRENT_CONTEXT(interp) = call_object;
+    Parrot_pcc_prepare_call(interp, call_object, ret_cont, NULL);
 
     /* Invoke the function */
     dest = VTABLE_invoke(interp, sub_obj, NULL);


More information about the parrot-commits mailing list