[svn:parrot] r40782 - in branches/context_pmc3: include/parrot lib/Parrot/Pmc2c src src/call src/interp src/ops src/pmc

bacek at svn.parrot.org bacek at svn.parrot.org
Tue Aug 25 11:17:58 UTC 2009


Author: bacek
Date: Tue Aug 25 11:17:56 2009
New Revision: 40782
URL: https://trac.parrot.org/parrot/changeset/40782

Log:
[core] Add current_cont accessor to Context and use it

Modified:
   branches/context_pmc3/include/parrot/context.h
   branches/context_pmc3/lib/Parrot/Pmc2c/PCCMETHOD.pm
   branches/context_pmc3/src/call/pcc.c
   branches/context_pmc3/src/context.c
   branches/context_pmc3/src/debug.c
   branches/context_pmc3/src/exceptions.c
   branches/context_pmc3/src/interp/inter_create.c
   branches/context_pmc3/src/interp/inter_misc.c
   branches/context_pmc3/src/ops/core.ops
   branches/context_pmc3/src/ops/object.ops
   branches/context_pmc3/src/ops/pic.ops
   branches/context_pmc3/src/pic.c
   branches/context_pmc3/src/pmc/continuation.pmc
   branches/context_pmc3/src/pmc/coroutine.pmc
   branches/context_pmc3/src/pmc/nci.pmc
   branches/context_pmc3/src/pmc/parrotinterpreter.pmc
   branches/context_pmc3/src/pmc/sub.pmc
   branches/context_pmc3/src/sub.c

Modified: branches/context_pmc3/include/parrot/context.h
==============================================================================
--- branches/context_pmc3/include/parrot/context.h	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/include/parrot/context.h	Tue Aug 25 11:17:56 2009	(r40782)
@@ -87,6 +87,11 @@
         __attribute__nonnull__(1);
 
 PARROT_EXPORT
+PMC* Parrot_cx_get_continuation(PARROT_INTERP, ARGIN(PMC *ctx))
+        __attribute__nonnull__(1)
+        __attribute__nonnull__(2);
+
+PARROT_EXPORT
 PMC* Parrot_cx_get_lex_pad(PARROT_INTERP, ARGIN(PMC *ctx))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
@@ -134,6 +139,13 @@
         __attribute__nonnull__(3);
 
 PARROT_EXPORT
+void Parrot_cx_set_continuation(PARROT_INTERP,
+    ARGIN(PMC *ctx),
+    ARGIN_NULLOK(PMC *_continuation))
+        __attribute__nonnull__(1)
+        __attribute__nonnull__(2);
+
+PARROT_EXPORT
 void Parrot_cx_set_lex_pad(PARROT_INTERP,
     ARGIN(PMC *ctx),
     ARGIN(PMC *lex_pad))
@@ -167,6 +179,9 @@
     || PARROT_ASSERT_ARG(ctx)
 #define ASSERT_ARGS_Parrot_cx_get_context __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp)
+#define ASSERT_ARGS_Parrot_cx_get_continuation __attribute__unused__ int _ASSERT_ARGS_CHECK = \
+       PARROT_ASSERT_ARG(interp) \
+    || PARROT_ASSERT_ARG(ctx)
 #define ASSERT_ARGS_Parrot_cx_get_lex_pad __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(ctx)
@@ -192,6 +207,9 @@
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(ctx) \
     || PARROT_ASSERT_ARG(caller_ctx)
+#define ASSERT_ARGS_Parrot_cx_set_continuation __attribute__unused__ int _ASSERT_ARGS_CHECK = \
+       PARROT_ASSERT_ARG(interp) \
+    || PARROT_ASSERT_ARG(ctx)
 #define ASSERT_ARGS_Parrot_cx_set_lex_pad __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(ctx) \

Modified: branches/context_pmc3/lib/Parrot/Pmc2c/PCCMETHOD.pm
==============================================================================
--- branches/context_pmc3/lib/Parrot/Pmc2c/PCCMETHOD.pm	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/lib/Parrot/Pmc2c/PCCMETHOD.pm	Tue Aug 25 11:17:56 2009	(r40782)
@@ -403,7 +403,7 @@
     UNUSED(_return_indexes);
 
     if (_caller_ctx) {
-        _ccont = CONTEXT_FIELD(interp, _caller_ctx, current_cont);
+        _ccont = Parrot_cx_get_continuation(interp, _caller_ctx);
     }
     else {
         /* there is no point calling Parrot_ex_throw_from_c_args here, because
@@ -411,7 +411,7 @@
         exit_fatal(1, "No caller_ctx for continuation \%p.", _ccont);
     }
 
-    CONTEXT_FIELD(interp, _ctx, current_cont)   = _ret_cont;
+    Parrot_cx_set_continuation(interp, _ctx, _ret_cont);
     PMC_cont(_ret_cont)->from_ctx       = _ctx;
 
     _current_args                       = interp->current_args;

Modified: branches/context_pmc3/src/call/pcc.c
==============================================================================
--- branches/context_pmc3/src/call/pcc.c	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/call/pcc.c	Tue Aug 25 11:17:56 2009	(r40782)
@@ -517,7 +517,7 @@
 {
     ASSERT_ARGS(Parrot_init_ret_nci)
     PMC *ctx                 = CONTEXT(interp);
-    PMC * const current_cont = CONTEXT_FIELD(interp, ctx, current_cont);
+    PMC * const current_cont = Parrot_cx_get_continuation(interp, ctx);
 
     /* if this NCI call was a taicall, return results to caller's get_results
      * this also means that we pass the caller's register base pointer */
@@ -2874,7 +2874,7 @@
 
     interp->current_object       = pmc;
     interp->current_cont         = NEED_CONTINUATION;
-    CONTEXT_FIELD(interp, ctx, current_cont) = ret_cont;
+    Parrot_cx_set_continuation(interp, ctx, ret_cont);
     PMC_cont(ret_cont)->from_ctx = ctx;
     pccinvoke_meth               = VTABLE_find_method(interp, pmc, method_name);
 
@@ -3017,7 +3017,7 @@
         interp->current_object       = PMCNULL;
     }
     interp->current_cont             = NEED_CONTINUATION;
-    CONTEXT_FIELD(interp, ctx, current_cont) = ret_cont;
+    Parrot_cx_set_continuation(interp, ctx, ret_cont);
     PMC_cont(ret_cont)->from_ctx     = ctx;
 
     /* Invoke the function */

Modified: branches/context_pmc3/src/context.c
==============================================================================
--- branches/context_pmc3/src/context.c	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/context.c	Tue Aug 25 11:17:56 2009	(r40782)
@@ -327,6 +327,46 @@
     c->current_namespace = _namespace;
 }
 
+/*
+
+=item C<PMC* Parrot_cx_get_continuation(PARROT_INTERP, PMC *ctx)>
+
+Get continuation of Context.
+
+=cut
+
+*/
+
+PARROT_EXPORT
+PMC*
+Parrot_cx_get_continuation(PARROT_INTERP, ARGIN(PMC *ctx))
+{
+    ASSERT_ARGS(Parrot_cx_get_continuation)
+    Parrot_Context *c = Parrot_cx_get_context(interp, ctx);
+    return c->current_cont;
+}
+
+
+/*
+
+=item C<void Parrot_cx_set_continuation(PARROT_INTERP, PMC *ctx, PMC
+*_continuation)>
+
+Set caller Context.
+
+=cut
+
+*/
+
+PARROT_EXPORT
+void
+Parrot_cx_set_continuation(PARROT_INTERP, ARGIN(PMC *ctx), ARGIN_NULLOK(PMC *_continuation))
+{
+    ASSERT_ARGS(Parrot_cx_set_continuation)
+    Parrot_Context *c = Parrot_cx_get_context(interp, ctx);
+    c->current_cont = _continuation;
+}
+
 
 
 /*

Modified: branches/context_pmc3/src/debug.c
==============================================================================
--- branches/context_pmc3/src/debug.c	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/debug.c	Tue Aug 25 11:17:56 2009	(r40782)
@@ -3540,9 +3540,9 @@
     /* backtrace: follow the continuation chain */
     while (1) {
         Parrot_cont *sub_cont;
-        sub = CONTEXT_FIELD(interp, ctx, current_cont);
+        sub = Parrot_cx_get_continuation(interp, ctx);
 
-        if (!sub)
+        if (PMC_IS_NULL(sub))
             break;
 
         sub_cont = PMC_cont(sub);

Modified: branches/context_pmc3/src/exceptions.c
==============================================================================
--- branches/context_pmc3/src/exceptions.c	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/exceptions.c	Tue Aug 25 11:17:56 2009	(r40782)
@@ -390,7 +390,7 @@
     /* Note the thrower.
      * XXX TT#596 - pass in current context instead when we have context PMCs. */
     /* Don't split line. It will break CONST_STRING handling */
-    VTABLE_set_attr_str(interp, exception, CONST_STRING(interp, "thrower"), CURRENT_CONTEXT_FIELD(interp, current_cont));
+    VTABLE_set_attr_str(interp, exception, CONST_STRING(interp, "thrower"), Parrot_cx_get_continuation(interp, CONTEXT(interp)));
 
     /* it's a C exception handler */
     if (PObj_get_FLAGS(handler) & SUB_FLAG_C_HANDLER) {

Modified: branches/context_pmc3/src/interp/inter_create.c
==============================================================================
--- branches/context_pmc3/src/interp/inter_create.c	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/interp/inter_create.c	Tue Aug 25 11:17:56 2009	(r40782)
@@ -216,7 +216,7 @@
 
     /* clear context introspection vars */
     CURRENT_CONTEXT_FIELD(interp, current_sub)    = NULL;
-    CURRENT_CONTEXT_FIELD(interp, current_cont)   = NULL;
+    Parrot_cx_set_continuation(interp, CONTEXT(interp), NULL); /* TODO Use PMCNULL */
     CURRENT_CONTEXT_FIELD(interp, current_object) = NULL;
 
     /* Load the core op func and info tables */

Modified: branches/context_pmc3/src/interp/inter_misc.c
==============================================================================
--- branches/context_pmc3/src/interp/inter_misc.c	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/interp/inter_misc.c	Tue Aug 25 11:17:56 2009	(r40782)
@@ -285,7 +285,7 @@
             return CURRENT_CONTEXT_FIELD(interp, current_sub);
         case CURRENT_CONT:
             {
-            PMC * const cont = CURRENT_CONTEXT_FIELD(interp, current_cont);
+            PMC * const cont = Parrot_cx_get_continuation(interp, CONTEXT(interp));
             if (!PMC_IS_NULL(cont) && cont->vtable->base_type ==
                     enum_class_RetContinuation)
                 return VTABLE_clone(interp, cont);

Modified: branches/context_pmc3/src/ops/core.ops
==============================================================================
--- branches/context_pmc3/src/ops/core.ops	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/ops/core.ops	Tue Aug 25 11:17:56 2009	(r40782)
@@ -456,14 +456,14 @@
     opcode_t *dest;
     PMC * const p = $1;
     dest = expr NEXT();
-    interp->current_cont = CURRENT_CONTEXT_FIELD(interp, current_cont);
+    interp->current_cont = Parrot_cx_get_continuation(interp, CONTEXT(interp));
     PObj_get_FLAGS(interp->current_cont) |= SUB_FLAG_TAILCALL;
     dest = (opcode_t *)p->vtable->invoke(interp, p, dest);
     goto ADDRESS(dest);
 }
 
 inline op returncc() :flow {
-    PMC * const p = CURRENT_CONTEXT_FIELD(interp, current_cont);
+    PMC * const p = Parrot_cx_get_continuation(interp, CONTEXT(interp));
     opcode_t * const dest = (opcode_t *)p->vtable->invoke(interp,
             p, expr NEXT());
     goto ADDRESS(dest);
@@ -542,7 +542,7 @@
 
     interp->current_params = _this;
     ctx     = CONTEXT(interp);
-    ccont   = CONTEXT_FIELD(interp, ctx, current_cont);
+    ccont   = Parrot_cx_get_continuation(interp, ctx);
 
     caller_ctx  = Parrot_cx_get_caller_ctx(interp, ctx);
 
@@ -575,7 +575,7 @@
     interp->current_returns = _this;
     ctx                     = CONTEXT(interp);
     caller_ctx              = Parrot_cx_get_caller_ctx(interp, ctx);
-    ccont                   = CONTEXT_FIELD(interp, ctx, current_cont);
+    ccont                   = Parrot_cx_get_continuation(interp, ctx);
 
     if (PMC_cont(ccont)->address) {
         /* Call is from runops_fromc */
@@ -614,7 +614,7 @@
 
 inline op result_info(out PMC) {
     /* Get context of callee from return continuation. */
-    PMC * const cc = CURRENT_CONTEXT_FIELD(interp, current_cont);
+    PMC * const cc = Parrot_cx_get_continuation(interp, CONTEXT(interp));
     PMC *sig = NULL;
     if (cc && PMC_cont(cc)->to_ctx) {
         /* caller context has results */

Modified: branches/context_pmc3/src/ops/object.ops
==============================================================================
--- branches/context_pmc3/src/ops/object.ops	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/ops/object.ops	Tue Aug 25 11:17:56 2009	(r40782)
@@ -142,7 +142,7 @@
         VTABLE_get_string(interp, VTABLE_get_class(interp, object)));
   }
   else {
-    interp->current_cont = CURRENT_CONTEXT_FIELD(interp, current_cont);
+    interp->current_cont = Parrot_cx_get_continuation(interp, CONTEXT(interp));
     PObj_get_FLAGS(interp->current_cont) |= SUB_FLAG_TAILCALL;
     interp->current_object = object;
     dest = (opcode_t *)VTABLE_invoke(interp, method_pmc, next);
@@ -157,7 +157,7 @@
 
   opcode_t *dest;
 
-  interp->current_cont = CURRENT_CONTEXT_FIELD(interp, current_cont);
+  interp->current_cont = Parrot_cx_get_continuation(interp, CONTEXT(interp));
   PObj_get_FLAGS(interp->current_cont) |= SUB_FLAG_TAILCALL;
   interp->current_object = object;
   dest = (opcode_t *)VTABLE_invoke(interp, method_pmc, next);

Modified: branches/context_pmc3/src/ops/pic.ops
==============================================================================
--- branches/context_pmc3/src/ops/pic.ops	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/ops/pic.ops	Tue Aug 25 11:17:56 2009	(r40782)
@@ -159,7 +159,7 @@
         }
         else
             n = 2;
-        ccont = CONTEXT_FIELD(interp, ctx, current_cont);
+        ccont = Parrot_cx_get_continuation(interp, ctx);
         if (PObj_get_FLAGS(ccont) & SUB_FLAG_TAILCALL) {
             PObj_get_FLAGS(ccont) &= ~SUB_FLAG_TAILCALL;
             Parrot_cx_dec_recursion_depth(interp, ctx);
@@ -189,7 +189,7 @@
 
     ctx     = CONTEXT(interp);
     mic     = (Parrot_MIC *) cur_opcode[1];
-    ccont   = CONTEXT_FIELD(interp, ctx, current_cont);
+    ccont   = Parrot_cx_get_continuation(interp, ctx);
     cc      = PMC_cont(ccont);
     if (!cc->address) {
         interp->current_returns = CUR_OPCODE;

Modified: branches/context_pmc3/src/pic.c
==============================================================================
--- branches/context_pmc3/src/pic.c	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/pic.c	Tue Aug 25 11:17:56 2009	(r40782)
@@ -705,7 +705,7 @@
     /* check params */
 
     if (op == PARROT_OP_set_returns_pc) {
-        PMC * const ccont = CONTEXT_FIELD(interp, ctx, current_cont);
+        PMC * const ccont = Parrot_cx_get_continuation(interp, ctx);
         if (!PMC_cont(ccont)->address)
             return 0;
         caller_ctx = PMC_cont(ccont)->to_ctx;

Modified: branches/context_pmc3/src/pmc/continuation.pmc
==============================================================================
--- branches/context_pmc3/src/pmc/continuation.pmc	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/pmc/continuation.pmc	Tue Aug 25 11:17:56 2009	(r40782)
@@ -312,7 +312,7 @@
 
     METHOD continuation() {
         Parrot_cont *cc   = PMC_cont(SELF);
-        PMC         *cont = CONTEXT_FIELD(interp, cc->to_ctx, current_cont);
+        PMC         *cont = Parrot_cx_get_continuation(interp, cc->to_ctx);
 
         if (cont)
             RETURN(PMC *cont);

Modified: branches/context_pmc3/src/pmc/coroutine.pmc
==============================================================================
--- branches/context_pmc3/src/pmc/coroutine.pmc	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/pmc/coroutine.pmc	Tue Aug 25 11:17:56 2009	(r40782)
@@ -154,7 +154,7 @@
             CONTEXT_FIELD(INTERP, ctx, current_sub)         = SELF;
             CONTEXT_FIELD(INTERP, ctx, current_HLL)         = co->HLL_id;
             Parrot_cx_set_namespace(INTERP, ctx, co->namespace_stash);
-            CONTEXT_FIELD(INTERP, ctx, current_cont)        = ccont;
+            Parrot_cx_set_continuation(INTERP, ctx, ccont);
             CONTEXT_FIELD(INTERP, ctx, current_object)      = NULL;
             INTERP->current_object                  = NULL;
             INTERP->current_cont                    = NULL;
@@ -186,7 +186,7 @@
             ctx                   = co->ctx;
 
             /* and the recent call context */
-            ccont                   = CONTEXT_FIELD(INTERP, ctx, current_cont);
+            ccont                   = Parrot_cx_get_continuation(INTERP, ctx);
             PMC_cont(ccont)->to_ctx = CONTEXT(interp);
             Parrot_cx_set_caller_ctx(interp, ctx, CONTEXT(interp));
 
@@ -201,7 +201,7 @@
             /* switch back to last remembered code seg and context */
 
             wanted_seg            = co->caller_seg;
-            ccont                 = CONTEXT_FIELD(INTERP, co->ctx, current_cont);
+            ccont                 = Parrot_cx_get_continuation(INTERP, co->ctx);
             ctx                   = PMC_cont(ccont)->to_ctx;
 
             if (! ctx) {

Modified: branches/context_pmc3/src/pmc/nci.pmc
==============================================================================
--- branches/context_pmc3/src/pmc/nci.pmc	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/pmc/nci.pmc	Tue Aug 25 11:17:56 2009	(r40782)
@@ -346,7 +346,7 @@
          */
         if (cont && cont != NEED_CONTINUATION
         && (PObj_get_FLAGS(cont) & SUB_FLAG_TAILCALL)) {
-            cont = CURRENT_CONTEXT_FIELD(interp, current_cont);
+            cont = Parrot_cx_get_continuation(interp, CONTEXT(interp));
             next = VTABLE_invoke(INTERP, cont, next);
         }
 

Modified: branches/context_pmc3/src/pmc/parrotinterpreter.pmc
==============================================================================
--- branches/context_pmc3/src/pmc/parrotinterpreter.pmc	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/pmc/parrotinterpreter.pmc	Tue Aug 25 11:17:56 2009	(r40782)
@@ -490,7 +490,7 @@
         }
         else {
             for (; level; --level) {
-                cont = CONTEXT_FIELD(interp, ctx, current_cont);
+                cont = Parrot_cx_get_continuation(interp, ctx);
 
                 if (PMC_IS_NULL(cont) || !PMC_cont(cont)->seg)
                     Parrot_ex_throw_from_c_args(interp, NULL,
@@ -525,7 +525,7 @@
         s = CONST_STRING(interp, "continuation");
 
         if (Parrot_str_equal(interp, item, s))
-            return VTABLE_clone(interp, CONTEXT_FIELD(interp, ctx, current_cont));
+            return VTABLE_clone(interp, Parrot_cx_get_continuation(interp, ctx));
 
         s = CONST_STRING(interp, "annotations");
 

Modified: branches/context_pmc3/src/pmc/sub.pmc
==============================================================================
--- branches/context_pmc3/src/pmc/sub.pmc	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/pmc/sub.pmc	Tue Aug 25 11:17:56 2009	(r40782)
@@ -285,7 +285,7 @@
         CONTEXT_FIELD(interp, context, current_sub)  = SELF;
         CONTEXT_FIELD(interp, context, caller_ctx)   = caller_ctx;
         CONTEXT_FIELD(interp, context, current_pc)   = pc;
-        CONTEXT_FIELD(interp, context, current_cont) = ccont;
+        Parrot_cx_set_continuation(interp, context, ccont);
 
         /* check recursion/call depth */
         if (Parrot_cx_inc_recursion_depth(INTERP, context) > INTERP->recursion_limit)

Modified: branches/context_pmc3/src/sub.c
==============================================================================
--- branches/context_pmc3/src/sub.c	Tue Aug 25 11:17:07 2009	(r40781)
+++ branches/context_pmc3/src/sub.c	Tue Aug 25 11:17:56 2009	(r40782)
@@ -149,7 +149,7 @@
 {
     ASSERT_ARGS(invalidate_retc_context)
     PMC *ctx = PMC_cont(cont)->from_ctx;
-    cont = CONTEXT_FIELD(interp, ctx, current_cont);
+    cont = Parrot_cx_get_continuation(interp, ctx);
 
     while (1) {
         /*
@@ -161,7 +161,7 @@
             break;
         cont->vtable = interp->vtables[enum_class_Continuation];
         ctx  = Parrot_cx_get_caller_ctx(interp, ctx);
-        cont = CONTEXT_FIELD(interp, ctx, current_cont);
+        cont = Parrot_cx_get_continuation(interp, ctx);
     }
 
 }


More information about the parrot-commits mailing list