[svn:parrot] r39815 - in branches/context_pmc/src: call pmc
whiteknight at svn.parrot.org
whiteknight at svn.parrot.org
Sun Jun 28 17:25:30 UTC 2009
Author: whiteknight
Date: Sun Jun 28 17:25:29 2009
New Revision: 39815
URL: https://trac.parrot.org/parrot/changeset/39815
Log:
[context_pmc] lots more switchover, especially in the pcc system. Updated Context.mark to mark registers, added some documentation
Modified:
branches/context_pmc/src/call/ops.c
branches/context_pmc/src/call/pcc.c
branches/context_pmc/src/pmc/context.pmc
Modified: branches/context_pmc/src/call/ops.c
==============================================================================
--- branches/context_pmc/src/call/ops.c Sun Jun 28 16:36:36 2009 (r39814)
+++ branches/context_pmc/src/call/ops.c Sun Jun 28 17:25:29 2009 (r39815)
@@ -121,7 +121,7 @@
/*
-=item C<Parrot_Context * Parrot_runops_fromc(PARROT_INTERP, PMC *sub)>
+=item C<PMC * Parrot_runops_fromc(PARROT_INTERP, PMC *sub)>
Runs the Parrot ops, called from C code. The function arguments are
already setup according to Parrot calling conventions, the C<sub> argument
@@ -134,12 +134,12 @@
PARROT_EXPORT
PARROT_IGNORABLE_RESULT
PARROT_CANNOT_RETURN_NULL
-Parrot_Context *
+PMC *
Parrot_runops_fromc(PARROT_INTERP, ARGIN(PMC *sub))
{
ASSERT_ARGS(Parrot_runops_fromc)
opcode_t offset, *dest;
- Parrot_Context *ctx;
+ PMC *ctx;
/* we need one return continuation with a NULL offset */
PMC * const ret_c = new_ret_continuation_pmc(interp, NULL);
@@ -199,7 +199,7 @@
char new_sig[10];
const char *sig_p;
- Parrot_Context * const old_ctx = CONTEXT(interp);
+ PMC * const old_ctx = CONTEXT(interp);
interp->current_cont = new_ret_continuation_pmc(interp, NULL);
interp->current_object = obj;
@@ -251,7 +251,7 @@
"no get_params in sub");
*/
- ctx = Parrot_context_ref(interp, CONTEXT(interp));
+ ctx = CONTEXT(interp);
offset = dest - interp->code->base.data;
runops(interp, offset);
return ctx;
@@ -280,7 +280,7 @@
Parrot_run_meth_fromc(PARROT_INTERP, ARGIN(PMC *sub), ARGIN_NULLOK(PMC *obj), SHIM(STRING *meth))
{
ASSERT_ARGS(Parrot_run_meth_fromc)
- Parrot_Context *ctx;
+ PMC *ctx;
opcode_t offset, *dest;
interp->current_cont = new_ret_continuation_pmc(interp, NULL);
@@ -318,14 +318,13 @@
{
ASSERT_ARGS(Parrot_runops_fromc_args)
va_list args;
- Parrot_Context *ctx;
+ PMC *ctx;
PMC *retval;
va_start(args, sig);
ctx = runops_args(interp, sub, PMCNULL, NULL, sig, args);
va_end(args);
retval = (PMC *)set_retval(interp, *sig, ctx);
- Parrot_free_context(interp, ctx, 1);
return retval;
}
@@ -367,7 +366,6 @@
ctx = runops_args(interp, sub, PMCNULL, NULL, sig, args);
va_end(args);
retval = set_retval(interp, *sig, ctx);
- Parrot_free_context(interp, ctx, 1);
interp->current_args = cargs;
interp->current_params = params;
@@ -397,14 +395,13 @@
{
ASSERT_ARGS(Parrot_runops_fromc_args_reti)
va_list args;
- Parrot_Context *ctx;
+ PMC *ctx;
INTVAL retval;
va_start(args, sig);
ctx = runops_args(interp, sub, PMCNULL, NULL, sig, args);
va_end(args);
retval = set_retval_i(interp, *sig, ctx);
- Parrot_free_context(interp, ctx, 1);
return retval;
}
@@ -429,14 +426,13 @@
{
ASSERT_ARGS(Parrot_runops_fromc_args_retf)
va_list args;
- Parrot_Context *ctx;
+ PMC *ctx;
FLOATVAL retval;
va_start(args, sig);
ctx = runops_args(interp, sub, PMCNULL, NULL, sig, args);
va_end(args);
retval = set_retval_f(interp, *sig, ctx);
- Parrot_free_context(interp, ctx, 1);
return retval;
}
@@ -462,14 +458,13 @@
{
ASSERT_ARGS(Parrot_run_meth_fromc_args)
va_list args;
- Parrot_Context *ctx;
+ PMC *ctx;
void* retval;
va_start(args, sig);
ctx = runops_args(interp, sub, obj, meth, sig, args);
va_end(args);
retval = set_retval(interp, *sig, ctx);
- Parrot_free_context(interp, ctx, 1);
return retval;
}
@@ -494,14 +489,13 @@
{
ASSERT_ARGS(Parrot_run_meth_fromc_args_reti)
va_list args;
- Parrot_Context *ctx;
+ PMC *ctx;
INTVAL retval;
va_start(args, sig);
ctx = runops_args(interp, sub, obj, meth, sig, args);
va_end(args);
retval = set_retval_i(interp, *sig, ctx);
- Parrot_free_context(interp, ctx, 1);
return retval;
}
@@ -526,14 +520,13 @@
{
ASSERT_ARGS(Parrot_run_meth_fromc_args_retf)
va_list args;
- Parrot_Context *ctx;
+ PMC *ctx;
FLOATVAL retval;
va_start(args, sig);
ctx = runops_args(interp, sub, obj, meth, sig, args);
va_end(args);
retval = set_retval_f(interp, *sig, ctx);
- Parrot_free_context(interp, ctx, 1);
return retval;
}
@@ -559,10 +552,9 @@
{
ASSERT_ARGS(Parrot_runops_fromc_arglist)
void* retval;
- Parrot_Context * const ctx = runops_args(interp, sub, PMCNULL, NULL, sig, args);
+ PMC * const ctx = runops_args(interp, sub, PMCNULL, NULL, sig, args);
retval = set_retval(interp, *sig, ctx);
- Parrot_free_context(interp, ctx, 1);
return retval;
}
@@ -587,10 +579,9 @@
{
ASSERT_ARGS(Parrot_runops_fromc_arglist_reti)
INTVAL retval;
- Parrot_Context * const ctx = runops_args(interp, sub, PMCNULL, NULL, sig, args);
+ PMC * const ctx = runops_args(interp, sub, PMCNULL, NULL, sig, args);
retval = set_retval_i(interp, *sig, ctx);
- Parrot_free_context(interp, ctx, 1);
return retval;
}
@@ -615,10 +606,9 @@
{
ASSERT_ARGS(Parrot_runops_fromc_arglist_retf)
FLOATVAL retval;
- Parrot_Context * const ctx = runops_args(interp, sub, PMCNULL, NULL, sig, args);
+ PMC * const ctx = runops_args(interp, sub, PMCNULL, NULL, sig, args);
retval = set_retval_f(interp, *sig, ctx);
- Parrot_free_context(interp, ctx, 1);
return retval;
}
@@ -643,12 +633,11 @@
ARGIN(STRING *meth), ARGIN(const char *sig), va_list args)
{
ASSERT_ARGS(Parrot_run_meth_fromc_arglist)
- Parrot_Context *ctx;
+ PMC *ctx;
void* retval;
ctx = runops_args(interp, sub, obj, meth, sig, args);
retval = set_retval(interp, *sig, ctx);
- Parrot_free_context(interp, ctx, 1);
return retval;
}
@@ -675,10 +664,9 @@
{
ASSERT_ARGS(Parrot_run_meth_fromc_arglist_reti)
INTVAL retval;
- Parrot_Context * const ctx = runops_args(interp, sub, obj, meth, sig, args);
+ PMC * const ctx = runops_args(interp, sub, obj, meth, sig, args);
retval = set_retval_i(interp, *sig, ctx);
- Parrot_free_context(interp, ctx, 1);
return retval;
}
@@ -704,10 +692,9 @@
{
ASSERT_ARGS(Parrot_run_meth_fromc_arglist_retf)
FLOATVAL retval;
- Parrot_Context * const ctx = runops_args(interp, sub, obj, meth, sig, args);
+ PMC * const ctx = runops_args(interp, sub, obj, meth, sig, args);
retval = set_retval_f(interp, *sig, ctx);
- Parrot_free_context(interp, ctx, 1);
return retval;
}
Modified: branches/context_pmc/src/call/pcc.c
==============================================================================
--- branches/context_pmc/src/call/pcc.c Sun Jun 28 16:36:36 2009 (r39814)
+++ branches/context_pmc/src/call/pcc.c Sun Jun 28 17:25:29 2009 (r39815)
@@ -22,6 +22,7 @@
#include "pcc.str"
#include "../pmc/pmc_key.h"
#include "../pmc/pmc_continuation.h"
+#include "../pmc/pmc_context.h"
/* HEADERIZER HFILE: include/parrot/call.h */
@@ -511,8 +512,8 @@
Parrot_init_ret_nci(PARROT_INTERP, ARGOUT(call_state *st), ARGIN(const char *sig))
{
ASSERT_ARGS(Parrot_init_ret_nci)
- Parrot_Context *ctx = CONTEXT(interp);
- PMC * const current_cont = ctx->current_cont;
+ PMC * ctx = CONTEXT(interp);
+ PMC * const current_cont = PARROT_CONTEXT(ctx)->current_cont;
/* 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 */
@@ -526,17 +527,19 @@
* in the constants table. */
if (ctx->results_signature)
Parrot_init_arg_indexes_and_sig_pmc(interp, ctx,
- ctx->current_results, ctx->results_signature, &st->dest);
+ PARROT_CONTEXT(ctx)->current_results,
+ PARROT_CONTEXT(ctx)->results_signature, &st->dest);
else
- Parrot_init_arg_op(interp, ctx, ctx->current_results, &st->dest);
+ Parrot_init_arg_op(interp, ctx,
+ PARROT_CONTEXT(ctx)->current_results, &st->dest);
}
/*
-=item C<int Parrot_init_arg_indexes_and_sig_pmc(PARROT_INTERP, Parrot_Context
-*ctx, opcode_t *indexes, PMC *sig_pmc, call_state_item *sti)>
+=item C<int Parrot_init_arg_indexes_and_sig_pmc(PARROT_INTERP, PMC *ctx,
+opcode_t *indexes, PMC *sig_pmc, call_state_item *sti)>
Initializes argument transfer with given context registers, register indexes,
and a signature PMC.
@@ -552,14 +555,14 @@
PARROT_EXPORT
int
-Parrot_init_arg_indexes_and_sig_pmc(PARROT_INTERP, ARGIN(Parrot_Context *ctx),
+Parrot_init_arg_indexes_and_sig_pmc(PARROT_INTERP, ARGIN(PMC *ctx),
ARGIN_NULLOK(opcode_t *indexes), ARGIN_NULLOK(PMC *sig_pmc),
ARGMOD(call_state_item *sti))
{
ASSERT_ARGS(Parrot_init_arg_indexes_and_sig_pmc)
if (!sig_pmc && indexes) {
++indexes;
- sig_pmc = ctx->constants[*indexes]->u.key;
+ sig_pmc = PARROT_CONTEXT(ctx)->constants[*indexes]->u.key;
ASSERT_SIG_PMC(sig_pmc);
++indexes;
}
@@ -589,7 +592,7 @@
/*
-=item C<int Parrot_init_arg_op(PARROT_INTERP, Parrot_Context *ctx, opcode_t *pc,
+=item C<int Parrot_init_arg_op(PARROT_INTERP, PMC *ctx, opcode_t *pc,
call_state_item *sti)>
Initializes argument transfer with given context registers and opcode location
@@ -601,7 +604,7 @@
PARROT_EXPORT
int
-Parrot_init_arg_op(PARROT_INTERP, ARGIN(Parrot_Context *ctx),
+Parrot_init_arg_op(PARROT_INTERP, ARGIN(PMC *ctx),
ARGIN_NULLOK(opcode_t *pc), ARGIN(call_state_item *sti))
{
ASSERT_ARGS(Parrot_init_arg_op)
@@ -609,7 +612,7 @@
if (pc) {
++pc;
- sig_pmc = ctx->constants[*pc]->u.key;
+ sig_pmc = PARROT_CONTEXT(ctx)->constants[*pc]->u.key;
ASSERT_SIG_PMC(sig_pmc);
++pc;
}
@@ -620,8 +623,8 @@
/*
-=item C<int Parrot_init_arg_sig(PARROT_INTERP, Parrot_Context *ctx, const char
-*sig, void *ap, call_state_item *sti)>
+=item C<int Parrot_init_arg_sig(PARROT_INTERP, PMC *ctx, const char *sig, void
+*ap, call_state_item *sti)>
Initializes argument transfer with given code segment (holding the
const_table), registers, function signature, and arguments.
@@ -632,7 +635,7 @@
PARROT_EXPORT
int
-Parrot_init_arg_sig(PARROT_INTERP, ARGIN(Parrot_Context *ctx),
+Parrot_init_arg_sig(PARROT_INTERP, ARGIN(PMC *ctx),
ARGIN(const char *sig), ARGIN_NULLOK(void *ap),
ARGMOD(call_state_item *sti))
{
@@ -1199,12 +1202,12 @@
for (; key; key = VTABLE_shift_pmc(interp, key)) {
/* register keys have to be cloned */
if (PObj_get_FLAGS(key) & KEY_register_FLAG) {
- Parrot_Context temp_ctx;
+ Parrot_Context_attributes temp_ctx;
/* clone sets key values according to refered register items */
- SAVE_OFF_REGS(interp->ctx, (*(st->src.ctx)), temp_ctx)
+ SAVE_OFF_REGS(PARROT_CONTEXT(interp->ctx), PARROT_CONTEXT(*(st->src.ctx)), temp_ctx)
UVal_pmc(st->val) = VTABLE_clone(interp, key);
- RESTORE_REGS(interp->ctx, temp_ctx)
+ RESTORE_REGS(PARROT_CONTEXT(interp->ctx), temp_ctx)
return;
}
}
@@ -1841,9 +1844,8 @@
/*
-=item C<void parrot_pass_args(PARROT_INTERP, Parrot_Context *src_ctx,
-Parrot_Context *dest_ctx, opcode_t *src_indexes, opcode_t *dest_indexes,
-arg_pass_t param_or_result)>
+=item C<void parrot_pass_args(PARROT_INTERP, PMC *src_ctx, PMC *dest_ctx,
+opcode_t *src_indexes, opcode_t *dest_indexes, arg_pass_t param_or_result)>
Main argument passing routine.
@@ -1863,7 +1865,7 @@
PARROT_EXPORT
void
parrot_pass_args(PARROT_INTERP,
- ARGMOD(Parrot_Context *src_ctx), ARGMOD(Parrot_Context *dest_ctx),
+ ARGMOD(PMC *src_ctx), ARGMOD(PMC *dest_ctx),
ARGMOD_NULLOK(opcode_t *src_indexes), ARGMOD_NULLOK(opcode_t *dest_indexes),
arg_pass_t param_or_result)
{
@@ -1879,9 +1881,9 @@
}
else /* (param_or_result == PARROT_PASS_RESULTS) */ {
src_signature = interp->returns_signature;
- dest_signature = dest_ctx->results_signature;
+ dest_signature = PARROT_CONTEXT(dest_ctx)->results_signature;
interp->returns_signature = NULL;
- dest_ctx->results_signature = NULL;
+ PARROT_CONTEXT(dest_ctx)->results_signature = NULL;
}
Parrot_init_arg_indexes_and_sig_pmc(interp, src_ctx, src_indexes,
@@ -1900,7 +1902,7 @@
/*
=item C<opcode_t * parrot_pass_args_fromc(PARROT_INTERP, const char *sig,
-opcode_t *dest, Parrot_Context *old_ctxp, va_list ap)>
+opcode_t *dest, PMC *old_ctxp, va_list ap)>
Passes arguments from C code with given signature to a Parrot Sub.
Prerequisites are like above.
@@ -1913,7 +1915,7 @@
PARROT_WARN_UNUSED_RESULT
opcode_t *
parrot_pass_args_fromc(PARROT_INTERP, ARGIN(const char *sig),
- ARGMOD(opcode_t *dest), ARGIN(Parrot_Context *old_ctxp), va_list ap)
+ ARGMOD(opcode_t *dest), ARGIN(PMC *old_ctxp), va_list ap)
{
ASSERT_ARGS(parrot_pass_args_fromc)
call_state st;
@@ -1927,8 +1929,8 @@
/*
-=item C<static int set_retval_util(PARROT_INTERP, const char *sig,
-Parrot_Context *ctx, call_state *st)>
+=item C<static int set_retval_util(PARROT_INTERP, const char *sig, PMC *ctx,
+call_state *st)>
Adds the current return parameter to the current context, and fetches
the next return parameter from the call state object.
@@ -1939,7 +1941,7 @@
static int
set_retval_util(PARROT_INTERP, ARGIN(const char *sig),
- ARGIN(Parrot_Context *ctx), ARGMOD(call_state *st))
+ ARGIN(PMC *ctx), ARGMOD(call_state *st))
{
ASSERT_ARGS(set_retval_util)
opcode_t * const src_pc = interp->current_returns;
@@ -1964,7 +1966,7 @@
/*
-=item C<void * set_retval(PARROT_INTERP, int sig_ret, Parrot_Context *ctx)>
+=item C<void * set_retval(PARROT_INTERP, int sig_ret, PMC *ctx)>
Handles void and pointer (PMC *, STRING *) return values. Returns a PMC,
STRING, or NULL pointer as appropriate.
@@ -1976,7 +1978,7 @@
PARROT_WARN_UNUSED_RESULT
PARROT_CAN_RETURN_NULL
void *
-set_retval(PARROT_INTERP, int sig_ret, ARGIN(Parrot_Context *ctx))
+set_retval(PARROT_INTERP, int sig_ret, ARGIN(PMC *ctx))
{
ASSERT_ARGS(set_retval)
call_state st;
@@ -2001,7 +2003,7 @@
/*
-=item C<INTVAL set_retval_i(PARROT_INTERP, int sig_ret, Parrot_Context *ctx)>
+=item C<INTVAL set_retval_i(PARROT_INTERP, int sig_ret, PMC *ctx)>
Handles an INTVAL return value, returning its value if present and 0 otherwise.
@@ -2010,7 +2012,7 @@
*/
INTVAL
-set_retval_i(PARROT_INTERP, int sig_ret, ARGIN(Parrot_Context *ctx))
+set_retval_i(PARROT_INTERP, int sig_ret, ARGIN(PMC *ctx))
{
ASSERT_ARGS(set_retval_i)
call_state st;
@@ -2028,7 +2030,7 @@
/*
-=item C<FLOATVAL set_retval_f(PARROT_INTERP, int sig_ret, Parrot_Context *ctx)>
+=item C<FLOATVAL set_retval_f(PARROT_INTERP, int sig_ret, PMC *ctx)>
Handles a FLOATVAL return value, returning its value if present and 0.0
otherwise.
@@ -2038,7 +2040,7 @@
*/
FLOATVAL
-set_retval_f(PARROT_INTERP, int sig_ret, ARGIN(Parrot_Context *ctx))
+set_retval_f(PARROT_INTERP, int sig_ret, ARGIN(PMC *ctx))
{
ASSERT_ARGS(set_retval_f)
call_state st;
@@ -2056,7 +2058,7 @@
/*
-=item C<STRING* set_retval_s(PARROT_INTERP, int sig_ret, Parrot_Context *ctx)>
+=item C<STRING* set_retval_s(PARROT_INTERP, int sig_ret, PMC *ctx)>
Handles a STRING return value, returning its pointer if present and NULL
otherwise.
@@ -2068,7 +2070,7 @@
PARROT_CAN_RETURN_NULL
PARROT_WARN_UNUSED_RESULT
STRING*
-set_retval_s(PARROT_INTERP, int sig_ret, ARGIN(Parrot_Context *ctx))
+set_retval_s(PARROT_INTERP, int sig_ret, ARGIN(PMC *ctx))
{
ASSERT_ARGS(set_retval_s)
call_state st;
@@ -2086,7 +2088,7 @@
/*
-=item C<PMC* set_retval_p(PARROT_INTERP, int sig_ret, Parrot_Context *ctx)>
+=item C<PMC* set_retval_p(PARROT_INTERP, int sig_ret, PMC *ctx)>
Handles a PMC return value, returning the PMC pointer if present and NULL
otherwise.
@@ -2098,7 +2100,7 @@
PARROT_CAN_RETURN_NULL
PARROT_WARN_UNUSED_RESULT
PMC*
-set_retval_p(PARROT_INTERP, int sig_ret, ARGIN(Parrot_Context *ctx))
+set_retval_p(PARROT_INTERP, int sig_ret, ARGIN(PMC *ctx))
{
ASSERT_ARGS(set_retval_p)
call_state st;
@@ -2117,8 +2119,8 @@
/*
=item C<static void commit_last_arg(PARROT_INTERP, int index, int cur, opcode_t
-*n_regs_used, int seen_arrow, PMC * const *sigs, opcode_t **indexes,
-Parrot_Context *ctx, PMC *pmc, va_list *list)>
+*n_regs_used, int seen_arrow, PMC * const *sigs, opcode_t **indexes, PMC *ctx,
+PMC *pmc, va_list *list)>
Called by C<Parrot_PCCINVOKE> when it reaches the end of each arg in the arg
signature. See C<Parrot_PCCINVOKE> for signature syntax.
@@ -2130,7 +2132,7 @@
static void
commit_last_arg(PARROT_INTERP, int index, int cur,
ARGMOD(opcode_t *n_regs_used), int seen_arrow, ARGIN(PMC * const *sigs),
- ARGMOD(opcode_t **indexes), ARGMOD(Parrot_Context *ctx),
+ ARGMOD(opcode_t **indexes), ARGMOD(PMC *ctx),
ARGIN_NULLOK(PMC *pmc), ARGIN(va_list *list))
{
ASSERT_ARGS(commit_last_arg)
@@ -2166,13 +2168,17 @@
if (!seen_arrow) {
switch (cur & PARROT_ARG_TYPE_MASK) {
case PARROT_ARG_INTVAL:
- CTX_REG_INT(ctx, reg_offset) = va_arg(*list, INTVAL); break;
+ VTABLE_set_integer_keyed_int(interp, ctx, reg_offset, va_arg(*list, INTVAL));
+ break;
case PARROT_ARG_FLOATVAL:
- CTX_REG_NUM(ctx, reg_offset) = va_arg(*list, FLOATVAL); break;
+ VTABLE_set_number_keyed_int(interp, ctx, reg_offset, va_arg(*list, FLOATVAL));
+ break;
case PARROT_ARG_STRING:
- CTX_REG_STR(ctx, reg_offset) = va_arg(*list, STRING *); break;
+ VTABLE_set_string_keyed_int(interp, ctx, reg_offset, va_arg(*list, STRING *));
+ break;
case PARROT_ARG_PMC:
- CTX_REG_PMC(ctx, reg_offset) = va_arg(*list, PMC *); break;
+ VTABLE_set_pmc_keyed_int(interp, ctx, reg_offset, va_arg(*list, PMC *));
+ break;
default:
Parrot_ex_throw_from_c_args(interp, NULL,
EXCEPTION_INVALID_OPERATION,
@@ -2289,14 +2295,14 @@
if (arg_ret_cnt[1] > 0)
VTABLE_set_integer_native(interp, results_sig, arg_ret_cnt[1]);
- return Parrot_push_context(interp, n_regs_used);
+ return Parrot_set_new_context(interp, n_regs_used);
}
/*
=item C<static void commit_last_arg_sig_object(PARROT_INTERP, int index, int
cur, opcode_t *n_regs_used, int seen_arrow, PMC * const *sigs, opcode_t
-**indexes, Parrot_Context *ctx, PMC *sig_obj)>
+**indexes, PMC *ctx, PMC *sig_obj)>
Called by Parrot_pcc_invoke_from_sig_object when it reaches the end of each
arg in the arg signature. See C<Parrot_pcc_invoke_from_sig_object> for
@@ -2309,7 +2315,7 @@
static void
commit_last_arg_sig_object(PARROT_INTERP, int index, int cur,
ARGMOD(opcode_t *n_regs_used), int seen_arrow, ARGIN(PMC * const *sigs),
- ARGMOD(opcode_t **indexes), ARGMOD(Parrot_Context *ctx),
+ ARGMOD(opcode_t **indexes), ARGMOD(PMC *ctx),
ARGIN(PMC *sig_obj))
{
ASSERT_ARGS(commit_last_arg_sig_object)
@@ -2356,18 +2362,23 @@
if (!seen_arrow) {
switch (cur & PARROT_ARG_TYPE_MASK) {
case PARROT_ARG_INTVAL:
- CTX_REG_INT(ctx, reg_offset) = VTABLE_get_integer_keyed_int(interp, sig_obj, index);
+ VTABLE_set_integer_keyed_int(interp, ctx, reg_offset,
+ VTABLE_get_integer_keyed_int(interp, sig_obj, index));
break;
case PARROT_ARG_FLOATVAL:
- CTX_REG_NUM(ctx, reg_offset) = VTABLE_get_number_keyed_int(interp, sig_obj, index);
+ VTABLE_set_number_keyed_int(interp, ctx, reg_offset,
+ VTABLE_get_number_keyed_int(interp, sig_obj, index));
break;
case PARROT_ARG_STRING:
- CTX_REG_STR(ctx, reg_offset) = VTABLE_get_string_keyed_int(interp, sig_obj, index);
+ VTABLE_set_string_keyed_int(interp, ctx, reg_offset,
+ VTABLE_get_string_keyed_int(interp, sig_obj, index));
break;
case PARROT_ARG_PMC:
- CTX_REG_PMC(ctx, reg_offset) = VTABLE_get_pmc_keyed_int(interp, sig_obj, index);
- if (cur & PARROT_ARG_INVOCANT) {
- interp->current_object = CTX_REG_PMC(ctx, reg_offset);
+ {
+ PMC * const p = VTABLE_get_pmc_keyed_int(interp, sig_obj, index);
+ VTABLE_set_pmc_keyed_int(interp, ctx, reg_offset, p);
+ if (cur & PARROT_ARG_INVOCANT)
+ interp->current_object = p;
}
break;
default:
@@ -2380,8 +2391,8 @@
/*
-=item C<static void set_context_sig_returns(PARROT_INTERP, Parrot_Context *ctx,
-opcode_t **indexes, const char *ret_x, PMC *result_list)>
+=item C<static void set_context_sig_returns(PARROT_INTERP, PMC *ctx, opcode_t
+**indexes, const char *ret_x, PMC *result_list)>
Sets the subroutine return arguments in the context C<ctx>. Takes a C string
for the return signature C<ret_x> and a list of return parameters C<result_list>.
@@ -2392,7 +2403,7 @@
static void
set_context_sig_returns(PARROT_INTERP,
- ARGMOD(Parrot_Context *ctx), ARGMOD(opcode_t **indexes),
+ ARGMOD(PMC *ctx), ARGMOD(opcode_t **indexes),
ARGIN_NULLOK(const char *ret_x), ARGMOD(PMC *result_list))
{
ASSERT_ARGS(set_context_sig_returns)
@@ -2408,28 +2419,20 @@
if (isupper((unsigned char)*x)) {
switch (*x) {
case 'I':
- {
VTABLE_set_integer_native(interp, result_item,
- CTX_REG_INT(ctx, indexes[seen_arrow][index]));
- }
+ VTABLE_get_integer_keyed_int(interp, ctx, indexes[seen_arrow][index]));
break;
case 'N':
- {
VTABLE_set_number_native(interp, result_item,
- CTX_REG_NUM(ctx, indexes[seen_arrow][index]));
- }
+ VTABLE_get_number_keyed_int(interp, ctx, indexes[seen_arrow][index]));
break;
case 'S':
- {
VTABLE_set_string_native(interp, result_item,
- CTX_REG_STR(ctx, indexes[seen_arrow][index]));
- }
+ VTABLE_get_string_keyed_int(interp, ctx, indexes[seen_arrow][index]));
break;
case 'P':
- {
VTABLE_set_pmc(interp, result_item,
- CTX_REG_PMC(ctx, indexes[seen_arrow][index]));
- }
+ VTABLE_get_pmc_keyed_int(interp, ctx, indexes[seen_arrow][index]));
break;
default:
Parrot_ex_throw_from_c_args(interp, NULL,
@@ -2449,8 +2452,8 @@
/*
-=item C<static void set_context_sig_returns_varargs(PARROT_INTERP,
-Parrot_Context *ctx, opcode_t **indexes, const char *ret_x, va_list returns)>
+=item C<static void set_context_sig_returns_varargs(PARROT_INTERP, PMC *ctx,
+opcode_t **indexes, const char *ret_x, va_list returns)>
Sets the subroutine return arguments in the context C<ctx>. Takes a C string
for the return signature C<ret_x> and a varargs list of return parameters C<returns>.
@@ -2465,7 +2468,7 @@
*/
static void
-set_context_sig_returns_varargs(PARROT_INTERP, ARGMOD(Parrot_Context *ctx),
+set_context_sig_returns_varargs(PARROT_INTERP, ARGMOD(PMC *ctx),
ARGMOD(opcode_t **indexes), ARGIN(const char *ret_x), va_list returns)
{
ASSERT_ARGS(set_context_sig_returns_varargs)
@@ -2481,25 +2484,25 @@
case 'I':
{
INTVAL * const tmpINTVAL = va_arg(returns, INTVAL*);
- *tmpINTVAL = CTX_REG_INT(ctx, indexes[seen_arrow][index]);
+ *tmpINTVAL = VTABLE_get_integer_keyed_int(interp, ctx, indexes[seen_arrow][index]);
}
break;
case 'N':
{
FLOATVAL * const tmpFLOATVAL = va_arg(returns, FLOATVAL*);
- *tmpFLOATVAL = CTX_REG_NUM(ctx, indexes[seen_arrow][index]);
+ *tmpFLOATVAL = VTABLE_get_number_keyed_int(interp, ctx, indexes[seen_arrow][index]);
}
break;
case 'S':
{
STRING ** const tmpSTRING = va_arg(returns, STRING**);
- *tmpSTRING = CTX_REG_STR(ctx, indexes[seen_arrow][index]);
+ *tmpSTRING = VTABLE_get_string_keyed_int(interp, ctx, indexes[seen_arrow][index]);
}
break;
case 'P':
{
PMC ** const tmpPMC = va_arg(returns, PMC**);
- *tmpPMC = CTX_REG_PMC(ctx, indexes[seen_arrow][index]);
+ *tmpPMC = VTABLE_get_pmc_keyed_int(interp, ctx, indexes[seen_arrow][index]);
}
break;
default:
@@ -2509,14 +2512,14 @@
}
}
}
- Parrot_pop_context(interp);
+ VTABLE_pop_pmc(interp, CONTEXT(interp));
}
/*
=item C<static const char * set_context_sig_params(PARROT_INTERP, const char
-*signature, INTVAL *n_regs_used, PMC **sigs, opcode_t **indexes, Parrot_Context
-*ctx, PMC *sig_obj)>
+*signature, INTVAL *n_regs_used, PMC **sigs, opcode_t **indexes, PMC *ctx, PMC
+*sig_obj)>
Sets the subroutine arguments in the C<ctx> context, according to the
signature string C<signature>. Currently this function is only called
@@ -2533,7 +2536,7 @@
static const char *
set_context_sig_params(PARROT_INTERP, ARGIN(const char *signature),
ARGMOD(INTVAL *n_regs_used), ARGMOD(PMC **sigs),
- ARGMOD(opcode_t **indexes), ARGMOD(Parrot_Context *ctx),
+ ARGMOD(opcode_t **indexes), ARGMOD(PMC *ctx),
ARGMOD(PMC *sig_obj))
{
ASSERT_ARGS(set_context_sig_params)
@@ -2617,8 +2620,8 @@
interp->current_args = indexes[0];
interp->args_signature = sigs[0];
- ctx->current_results = indexes[1];
- ctx->results_signature = sigs[1];
+ PARROT_CONTEXT(ctx)->current_results = indexes[1];
+ PARROT_CONTEXT(ctx)->results_signature = sigs[1];
return ret_x;
}
@@ -2727,7 +2730,7 @@
PMC * const results_sig = pmc_new(interp, enum_class_FixedIntegerArray);
PMC * const ret_cont = new_ret_continuation_pmc(interp, NULL);
- Parrot_Context *ctx; /* The newly created context */
+ PMC *ctx; /* The newly created context */
PMC *pccinvoke_meth;
opcode_t *save_current_args;
@@ -2771,7 +2774,7 @@
indexes[0][0] = 0;
VTABLE_set_integer_keyed_int(interp, sigs[0], 0, PARROT_ARG_PMC);
- CTX_REG_PMC(ctx, 0) = pmc;
+ VTABLE_set_pmc_keyed_int(interp, ctx, 0, pmc);
n_regs_used[REGNO_PMC]++;
index = 0;
@@ -2852,15 +2855,15 @@
interp->current_args = arg_indexes;
interp->args_signature = args_sig;
- ctx->current_results = result_indexes;
- ctx->results_signature = results_sig;
+ PARROT_CONTEXT(ctx)->current_results = result_indexes;
+ PARROT_CONTEXT(ctx)->results_signature = results_sig;
/* arg_accessors assigned in loop above */
interp->current_object = pmc;
interp->current_cont = NEED_CONTINUATION;
- ctx->current_cont = ret_cont;
- PMC_cont(ret_cont)->from_ctx = Parrot_context_ref(interp, ctx);
+ PARROT_CONTEXT(ctx)->current_cont = ret_cont;
+ PMC_cont(ret_cont)->from_ctx = ctx;
pccinvoke_meth = VTABLE_find_method(interp, pmc, method_name);
if (PMC_IS_NULL(pccinvoke_meth))
@@ -2957,11 +2960,11 @@
PMC * const ret_cont = new_ret_continuation_pmc(interp, NULL);
PMC * const result_list = VTABLE_get_attr_str(interp, sig_obj, CONST_STRING(interp, "returns"));
- Parrot_Context *ctx;
- opcode_t *dest;
- opcode_t *save_current_args;
- PMC *save_args_signature;
- PMC *save_current_object;
+ PMC *ctx;
+ opcode_t *dest;
+ opcode_t *save_current_args;
+ PMC *save_args_signature;
+ PMC *save_current_object;
/* temporary state vars for building PCC index and PCC signature arrays. */
@@ -3003,7 +3006,7 @@
}
interp->current_cont = NEED_CONTINUATION;
ctx->current_cont = ret_cont;
- PMC_cont(ret_cont)->from_ctx = Parrot_context_ref(interp, ctx);
+ PMC_cont(ret_cont)->from_ctx = ctx;
/* Invoke the function */
dest = VTABLE_invoke(interp, sub_obj, NULL);
Modified: branches/context_pmc/src/pmc/context.pmc
==============================================================================
--- branches/context_pmc/src/pmc/context.pmc Sun Jun 28 16:36:36 2009 (r39814)
+++ branches/context_pmc/src/pmc/context.pmc Sun Jun 28 17:25:29 2009 (r39815)
@@ -168,6 +168,16 @@
* to simplify conversion between code ptrs in e.g. invoke */
ATTR size_t pred_offset;
+/*
+
+=item C<void init()>
+
+Initializes a new top-level context without a parent
+
+=cut
+
+*/
+
VTABLE void init() {
Parrot_Context_attributes * const ctx =
mem_alloc_typed(Parrot_Context_attributes);
@@ -185,6 +195,16 @@
PObj_custom_mark_SET(SELF);
}
+/*
+
+=item C<void init_pmc()>
+
+Creates a new Context PMC with the given old_ctx as a parent context.
+
+=cut
+
+*/
+
VTABLE void init_pmc(PMC *old_ctx) {
Parrot_Context_attributes * const ctx =
mem_alloc_typed(Parrot_Context_attributes);
@@ -227,9 +247,30 @@
clear_regs(interp, ctx);
}
+/*
+
+=item C<void mark()>
+
+Mark the context, it's data items, and all the associated registers.
+
+=cut
+
+*/
+
VTABLE void mark() {
Parrot_Context_attributes * const data = PARROT_CONTEXT(SELF);
if (data) {
+ INTVAL i;
+ INTVAL num_pmcs = PARROT_CONTEXT(SELF)->n_regs_used[REGNO_PMC];
+ INTVAL num_strs = PARROT_CONTEXT(SELF)->n_regs_used[REGNO_STR];
+
+ /* Mark register values alive */
+ for (i = 0; i < num_pmcs; ++i)
+ Parrot_gc_mark_PObj_alive(interp, VTABLE_get_pmc_keyed_int(INTERP, SELF, i));
+ for (i = 0; i < num_strs; ++i)
+ Parrot_gc_mark_PObj_alive(INTERP, VTABLE_get_string_keyed_int(INTERP, SELF, i));
+
+ /* Mark other data items alive */
if (data->caller_ctx)
Parrot_gc_mark_PObj_alive(interp, data->caller_ctx);
if (data->lex_pad)
@@ -255,19 +296,18 @@
=item C<void push_pmc(PMC *new)>
-Pushes the new context, and sets it as the current context
+Pushes the new context, sets SELF as the caller_ctx of the given context.
=cut
*/
VTABLE void push_pmc(PMC * new) {
- PMC * const old = CONTEXT(interp);
-
- PARROT_CONTEXT(SELF)->caller_ctx = old;
+ PARROT_CONTEXT(SELF)->caller_ctx = SELF;
/* doesn't change */
- PARROT_CONTEXT(SELF)->current_sub = PARROT_CONTEXT(old)->current_sub;
+ PARROT_CONTEXT(SELF)->current_sub = PARROT_CONTEXT(SELF)->current_sub;
+ CONTEXT(INTERP) = new;
}
/*
@@ -285,10 +325,24 @@
/* restore old, set cached interpreter base pointers */
CONTEXT(interp) = old;
- interp->ctx.bp = old->bp;
- interp->ctx.bp_ps = old->bp_ps;
}
+/*
+
+=item C<void set_integer_native(INTVAL val)>
+
+=item C<void set_number_native(FLOATVAL val)>
+
+=item C<void set_pmc(PMC * val)>
+
+=item C<void set_string_native(STRING * val)>
+
+Sets all registers in SELF of the given type to the given value.
+
+=cut
+
+*/
+
VTABLE void set_integer_native(INTVAL val) {
INTVAL i;
INTVAL num_ints = PARROT_CONTEXT(SELF)->n_regs_used[REGNO_INT];
@@ -306,7 +360,7 @@
VTABLE void set_pmc(PMC * val) {
INTVAL i;
INTVAL num_pmcs = PARROT_CONTEXT(SELF)->n_regs_used[REGNO_PMC];
- for (i = 0; i < num_nums; ++i)
+ for (i = 0; i < num_pmcs; ++i)
VTABLE_set_pmc_keyed_int(INTERP, SELF, i, val);
}
@@ -317,6 +371,36 @@
VTABLE_set_string_keyed_int(INTERP, SELF, i, val);
}
+/*
+
+=item C<INTVAL get_integer_keyed_int(INTVAL key)>
+
+=item C<void set_integer_keyed_int(INTVAL key, INTVAL val)>
+
+Get and set methods for I registers
+
+=item C<FLOATVAL get_number_keyed_int(FLOATVAL key)>
+
+=item C<void set_number_keyed_int(INTVAL key, FLOATVAL val)>
+
+Get and set methods for N registers
+
+=item C<STRING * get_string_keyed_int(INTVAL key)>
+
+=item C<void set_string_keyed_int(INTVAL key, STRING * val)>
+
+Get and set methods for S registers
+
+=item C<PMC * get_pmc_keyed_int(INTVAL key)>
+
+=item C<void set_pmc_keyed_int(INTVAL key, PMC * val)>
+
+Get and set methods for P registers
+
+=cut
+
+*/
+
VTABLE INTVAL get_integer_keyed_int(INTVAL x) {
return PARROT_CONTEXT(SELF)->bp.regs_i[x];
}
@@ -349,6 +433,18 @@
PARROT_CONTEXT(SELF)->bp_ps.regs_s[x] = val;
}
+/*
+
+=item C<void set_pointer(void * number_regs_used)>
+
+Set a pointer to a 4-element INTVAL array that specifies how many of each
+type of register are needed in the context. Takes the numbers, calculates
+the sizes, and allocates memory accordingly
+
+=cut
+
+*/
+
VTABLE void set_pointer(void *number_regs_used) {
Parrot_Context_attributes * const ctx = PARROT_CONTEXT(SELF);
const size_t size_i = sizeof (INTVAL) * number_regs_used[REGNO_INT];
@@ -375,10 +471,31 @@
ctx->bp_ps.regs_s = (STRING **)((char *)ctx_regs + size_nip);
}
+/*
+
+=item C<void * get_pointer()>
+
+Returns a pointer to the allocated memory for holding registers.
+
+=cut
+
+*/
+
VTABLE void * get_pointer() {
return PARROT_CONTEXT(SELF)->regs;
}
+/*
+
+=item C<void * get_pointer_keyed_int(INTVAL regtype)>
+
+Gets a base pointer to the given register set. regtype can be one of
+REGNO_INT, REGNO_NUM, REGNO_STR, or REGNO_PMC
+
+=cut
+
+*/
+
VTABLE void * get_pointer_keyed_int(INTVAL regtype) {
switch (regtype) {
case REGNO_INT:
@@ -392,6 +509,16 @@
}
}
+/*
+
+=item C<void destroy()>
+
+deallocates memory used by the context
+
+=cut
+
+*/
+
VTABLE void destroy() {
Parrot_Context_attributes * const data = PARROT_CONTEXT(SELF);
if (data) {
More information about the parrot-commits
mailing list