[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