[svn:parrot] r41815 - branches/pcc_reapply/src/call
bacek at svn.parrot.org
bacek at svn.parrot.org
Sun Oct 11 04:00:47 UTC 2009
Author: bacek
Date: Sun Oct 11 04:00:47 2009
New Revision: 41815
URL: https://trac.parrot.org/parrot/changeset/41815
Log:
Fix passing Keys.
Modified:
branches/pcc_reapply/src/call/args.c
Modified: branches/pcc_reapply/src/call/args.c
==============================================================================
--- branches/pcc_reapply/src/call/args.c Sun Oct 11 04:00:27 2009 (r41814)
+++ branches/pcc_reapply/src/call/args.c Sun Oct 11 04:00:47 2009 (r41815)
@@ -515,7 +515,7 @@
}
else {
string_sig = Parrot_str_append(interp, string_sig, CONST_STRING(interp, "P"));
- VTABLE_push_pmc(interp, call_object, CTX_REG_PMC(ctx, raw_index));
+ VTABLE_push_pmc(interp, call_object, clone_key_arg(interp, pmc_value));
}
break;
@@ -856,7 +856,7 @@
{
INTVAL type_lookahead = Parrot_str_indexed(interp, string_sig, (i + 1));
PMC * const pmc_arg = va_arg(args, PMC *);
- VTABLE_push_pmc(interp, call_object, pmc_arg);
+ VTABLE_push_pmc(interp, call_object, clone_key_arg(interp, pmc_arg));
if (type_lookahead == 'i') {
if (i != 0)
Parrot_ex_throw_from_c_args(interp, NULL,
@@ -1034,8 +1034,8 @@
VTABLE_get_string_keyed_int(interp, call_object, arg_index);
break;
case PARROT_ARG_PMC:
- *accessor->pmc(interp, arg_info, param_index) = clone_key_arg(interp,
- VTABLE_get_pmc_keyed_int(interp, call_object, arg_index));
+ *accessor->pmc(interp, arg_info, param_index) =
+ VTABLE_get_pmc_keyed_int(interp, call_object, arg_index);
break;
default:
Parrot_ex_throw_from_c_args(interp, NULL,
@@ -1203,8 +1203,8 @@
VTABLE_get_string_keyed_str(interp, call_object, param_name);
break;
case PARROT_ARG_PMC:
- *accessor->pmc(interp, arg_info, param_index) = clone_key_arg(interp,
- VTABLE_get_pmc_keyed_str(interp, call_object, param_name));
+ *accessor->pmc(interp, arg_info, param_index) =
+ VTABLE_get_pmc_keyed_str(interp, call_object, param_name);
break;
default:
Parrot_ex_throw_from_c_args(interp, NULL,
@@ -2466,12 +2466,7 @@
clone_key_arg(PARROT_INTERP, ARGIN(PMC *key))
{
ASSERT_ARGS(clone_key_arg)
-
- /*
- * This function is sligtly broken. We need correct way to calculate caller_ctx to clone Keys
- */
-
- return key;
+ PMC *t;
if (PMC_IS_NULL(key))
return key;
@@ -2479,40 +2474,10 @@
if (key->vtable->base_type != enum_class_Key)
return key;
- for (; key; key=key_next(interp, key)) {
+ for (t = key; t; t=key_next(interp, t)) {
/* register keys have to be cloned */
if (PObj_get_FLAGS(key) & KEY_register_FLAG) {
- INTVAL n_regs_used[4];
- Regs_ni bp;
- Regs_ps bp_ps;
- PMC *res;
- /*
- * XXX We are 2 levels below original Key Context. Why?
- */
- PMC *caller_ctx = Parrot_pcc_get_caller_ctx(
- interp, Parrot_pcc_get_caller_ctx(interp, CURRENT_CONTEXT(interp)));
-
- PARROT_ASSERT(!PMC_IS_NULL(caller_ctx) || !"Need caller_ctx to clone Key");
-
- /* clone sets key values according to refered register items */
- bp = *Parrot_pcc_get_regs_ni(interp, CURRENT_CONTEXT(interp));
- bp_ps = *Parrot_pcc_get_regs_ps(interp, CURRENT_CONTEXT(interp));
- memcpy(n_regs_used, CONTEXT(interp)->n_regs_used, 4 * sizeof (INTVAL));
-
- Parrot_pcc_set_regs_ni(interp, CURRENT_CONTEXT(interp),
- Parrot_pcc_get_regs_ni(interp, caller_ctx));
- Parrot_pcc_set_regs_ps(interp, CURRENT_CONTEXT(interp),
- Parrot_pcc_get_regs_ps(interp, caller_ctx));
- memcpy(CONTEXT(interp)->n_regs_used,
- Parrot_pcc_get_context_struct(interp, caller_ctx),
- 4 * sizeof (INTVAL));
-
- res = VTABLE_clone(interp, key);
-
- Parrot_pcc_set_regs_ni(interp, CURRENT_CONTEXT(interp), &bp);
- Parrot_pcc_set_regs_ps(interp, CURRENT_CONTEXT(interp), &bp_ps);
- memcpy(CONTEXT(interp)->n_regs_used, n_regs_used, 4 * sizeof (INTVAL));
- return res;
+ return VTABLE_clone(interp, key);
}
}
More information about the parrot-commits
mailing list