Author: leo
Date: Thu Feb 9 05:38:56 2006
New Revision: 11482
Modified:
trunk/src/ops/core.ops
trunk/src/ops/pic.ops
Log:
Argument passing cleanup 2
* use SIG_* macros in *.ops
* make results_info more robust WRT missing get_results opcode
Modified: trunk/src/ops/core.ops
==============================================================================
--- trunk/src/ops/core.ops (original)
+++ trunk/src/ops/core.ops Thu Feb 9 05:38:56 2006
@@ -497,7 +497,7 @@ op set_args(inconst PMC) {
/* for now just point to the opcode */
interpreter->current_args = this;
- argc = VTABLE_elements(interpreter, signature);
+ argc = SIG_ELEMS(signature);
goto OFFSET(argc + 2);
}
@@ -507,7 +507,7 @@ op get_results(inconst PMC) {
INTVAL argc;
CONTEXT(interpreter->ctx)->current_results = this;
- argc = VTABLE_elements(interpreter, signature);
+ argc = SIG_ELEMS(signature);
goto OFFSET(argc + 2);
}
@@ -551,7 +551,7 @@ op set_returns(inconst PMC) {
parrot_pass_args(interpreter, ctx, caller_ctx,
PARROT_OP_get_results_pc);
}
- argc = VTABLE_elements(interpreter, signature);
+ argc = SIG_ELEMS(signature);
goto OFFSET(argc + 2);
}
@@ -567,19 +567,21 @@ specified in F<docs/pdds/pdd03_calling_c
inline op result_info(out PMC) {
/* Get context of callee from return continuation. */
PMC *cc = CONTEXT(interpreter->ctx)->current_cont;
- PMC *i = NULL;
- if (cc && PMC_cont(cc)->to_ctx)
- {
- /* Find results PMC index and get PMC. */
- opcode_t results_pmc = PMC_cont(cc)->to_ctx->current_results[1];
- i = PF_CONST(PMC_cont(cc)->seg, results_pmc)->u.key;
+ PMC *sig = NULL;
+ if (cc && PMC_cont(cc)->to_ctx) {
+ /* caller context has results */
+ opcode_t *results = PMC_cont(cc)->to_ctx->current_results;
+ if (results) {
+ /* get results PMC index and get PMC. */
+ sig = PF_CONST(PMC_cont(cc)->seg, results[1])->u.key;
+ }
}
/* If no elements, hand back empty array; otherwise PMC. */
- if (PMC_IS_NULL(i))
+ if (!sig)
$1 = pmc_new(interpreter, enum_class_FixedIntegerArray);
else
- $1 = i;
+ $1 = sig;
goto NEXT();
}
Modified: trunk/src/ops/pic.ops
==============================================================================
--- trunk/src/ops/pic.ops (original)
+++ trunk/src/ops/pic.ops Thu Feb 9 05:38:56 2006
@@ -257,21 +257,20 @@ inline op pic_callr__(inconst PMC) :pic
pc = ctx->current_results;
if (pc) {
pred_pc = (void**) pc - ctx->pred_offset;
- args[0] = (_reg_base + ((opcode_t*)pred_pc)[2]);
- assert((sig = (PMC*)(pred_pc[1])) &&
- PObj_is_PMC_TEST(sig) &&
- sig->vtable->base_type == enum_class_FixedIntegerArray &&
- VTABLE_elements(interpreter, sig) == 1);
+ sig = (PMC*)(pred_pc[1]);
+ ASSERT_SIG_PMC(sig);
+ assert(SIG_ELEMS(sig) <= 1);
+ args[0] = SIG_ELEMS(sig) ?
+ (_reg_base + ((opcode_t*)pred_pc)[2]) : NULL;
}
else
args[0] = NULL;
/* set_args */
n_args = 0;
sig = mic->m.sig;
- assert(PObj_is_PMC_TEST(sig) &&
- sig->vtable->base_type == enum_class_FixedIntegerArray);
- n_args = VTABLE_elements(interpreter, sig);
- sig_bits = PMC_data(sig);
+ ASSERT_SIG_PMC(sig);
+ n_args = SIG_ELEMS(sig);
+ sig_bits = SIG_ARRAY(sig);
for (i = 0; i < n_args; ++i) {
switch (sig_bits[i]) {
case PARROT_ARG_INTVAL: