[svn:parrot] r37972 - branches/pcc_rewiring/src/call
allison at svn.parrot.org
allison at svn.parrot.org
Wed Apr 8 01:36:06 UTC 2009
Author: allison
Date: Wed Apr 8 01:36:04 2009
New Revision: 37972
URL: https://trac.parrot.org/parrot/changeset/37972
Log:
[pcc] Allow return values to be constants too.
Modified:
branches/pcc_rewiring/src/call/pcc.c
Modified: branches/pcc_rewiring/src/call/pcc.c
==============================================================================
--- branches/pcc_rewiring/src/call/pcc.c Wed Apr 8 00:35:15 2009 (r37971)
+++ branches/pcc_rewiring/src/call/pcc.c Wed Apr 8 01:36:04 2009 (r37972)
@@ -1021,11 +1021,11 @@
ARGIN(PMC *raw_sig), ARGIN(opcode_t *raw_returns))
{
ASSERT_ARGS(Parrot_pcc_fill_returns_from_op)
- INTVAL return_index, positional_index;
Parrot_Context *ctx = CONTEXT(interp);
PMC * const return_list = VTABLE_get_attr_str(interp, call_object, CONST_STRING(interp, "returns"));
INTVAL return_list_elements = VTABLE_elements(interp, return_list);
INTVAL raw_return_count = VTABLE_elements(interp, raw_sig);
+ INTVAL return_index = 0;
INTVAL return_list_index = 0;
INTVAL err_check = 0;
@@ -1045,24 +1045,39 @@
INTVAL return_flags = VTABLE_get_integer_keyed_int(interp,
raw_sig, return_index);
+ const INTVAL constant = PARROT_ARG_CONSTANT_ISSET(return_flags);
const INTVAL raw_index = raw_returns[return_index + 2];
PMC *result_item = VTABLE_get_pmc_keyed_int(interp, return_list, return_list_index);
switch (PARROT_ARG_TYPE_MASK_MASK(return_flags)) {
case PARROT_ARG_INTVAL:
- VTABLE_set_integer_native(interp, result_item, CTX_REG_INT(ctx, raw_index));
+ if (constant)
+ VTABLE_set_integer_native(interp, result_item, raw_index);
+ else
+ VTABLE_set_integer_native(interp, result_item, CTX_REG_INT(ctx, raw_index));
return_list_index++;
break;
case PARROT_ARG_FLOATVAL:
- VTABLE_set_number_native(interp, result_item, CTX_REG_NUM(ctx, raw_index));
+ if (constant)
+ VTABLE_set_number_native(interp, result_item,
+ ctx->constants[raw_index]->u.number);
+ else
+ VTABLE_set_number_native(interp, result_item, CTX_REG_NUM(ctx, raw_index));
return_list_index++;
break;
case PARROT_ARG_STRING:
- VTABLE_set_string_native(interp, result_item, CTX_REG_STR(ctx, raw_index));
+ if (constant)
+ VTABLE_set_string_native(interp, result_item, Parrot_str_new_COW(interp,
+ ctx->constants[raw_index]->u.string));
+ else
+ VTABLE_set_string_native(interp, result_item, CTX_REG_STR(ctx, raw_index));
return_list_index++;
break;
case PARROT_ARG_PMC:
- VTABLE_set_pmc(interp, result_item, CTX_REG_PMC(ctx, raw_index));
+ if (constant)
+ VTABLE_set_pmc(interp, result_item, ctx->constants[raw_index]->u.key);
+ else
+ VTABLE_set_pmc(interp, result_item, CTX_REG_PMC(ctx, raw_index));
return_list_index++;
break;
default:
More information about the parrot-commits
mailing list