[svn:parrot] r41911 - branches/pcc_reapply/src/call
bacek at svn.parrot.org
bacek at svn.parrot.org
Sat Oct 17 23:03:18 UTC 2009
Author: bacek
Date: Sat Oct 17 23:03:17 2009
New Revision: 41911
URL: https://trac.parrot.org/parrot/changeset/41911
Log:
[pcc] Implement flattening of argument in build_sig_object_from_varargs.
Modified:
branches/pcc_reapply/src/call/args.c
Modified: branches/pcc_reapply/src/call/args.c
==============================================================================
--- branches/pcc_reapply/src/call/args.c Sat Oct 17 23:02:51 2009 (r41910)
+++ branches/pcc_reapply/src/call/args.c Sat Oct 17 23:03:17 2009 (r41911)
@@ -832,22 +832,21 @@
PMC *arg_flags = PMCNULL;
PMC *return_flags = PMCNULL;
PMC * const call_object = pmc_new(interp, enum_class_CallSignature);
- STRING *string_sig = Parrot_str_new_constant(interp, sig);
- const INTVAL sig_len = Parrot_str_byte_length(interp, string_sig);
+ STRING *string_sig = Parrot_str_new(interp, NULL, 0);
+ const INTVAL sig_len = strlen(sig);
INTVAL in_return_sig = 0;
INTVAL i;
if (!sig_len)
return call_object;
- VTABLE_set_string_native(interp, call_object, string_sig);
parse_signature_string(interp, sig, &arg_flags, &return_flags);
VTABLE_set_attr_str(interp, call_object, CONST_STRING(interp, "arg_flags"), arg_flags);
VTABLE_set_attr_str(interp, call_object, CONST_STRING(interp, "return_flags"), return_flags);
/* Process the varargs list */
for (i = 0; i < sig_len; ++i) {
- const INTVAL type = Parrot_str_indexed(interp, string_sig, i);
+ const INTVAL type = sig[i];
/* Only create the returns array if it's needed */
if (in_return_sig && PMC_IS_NULL(returns)) {
@@ -890,24 +889,36 @@
switch (type) {
case 'I':
VTABLE_push_integer(interp, call_object, va_arg(args, INTVAL));
+ string_sig = Parrot_str_append(interp, string_sig, CONST_STRING(interp, "I"));
break;
case 'N':
VTABLE_push_float(interp, call_object, va_arg(args, FLOATVAL));
+ string_sig = Parrot_str_append(interp, string_sig, CONST_STRING(interp, "N"));
break;
case 'S':
VTABLE_push_string(interp, call_object, va_arg(args, STRING *));
+ string_sig = Parrot_str_append(interp, string_sig, CONST_STRING(interp, "S"));
break;
case 'P':
{
- INTVAL type_lookahead = Parrot_str_indexed(interp, string_sig, (i + 1));
+ INTVAL type_lookahead = sig[i+1];
PMC * const pmc_arg = va_arg(args, PMC *);
- 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,
- EXCEPTION_INVALID_OPERATION,
- "Dispatch: only the first argument can be an invocant");
- i++; /* skip 'i' */
+ if (type_lookahead == 'f') {
+ STRING * const flat_list = dissect_aggregate_arg(
+ interp, call_object, pmc_arg);
+ string_sig = Parrot_str_append(interp, string_sig, flat_list);
+ i++; /* skip 'f' */
+ }
+ else {
+ VTABLE_push_pmc(interp, call_object, clone_key_arg(interp, pmc_arg));
+ string_sig = Parrot_str_append(interp, string_sig, CONST_STRING(interp, "P"));
+ if (type_lookahead == 'i') {
+ if (i != 0)
+ Parrot_ex_throw_from_c_args(interp, NULL,
+ EXCEPTION_INVALID_OPERATION,
+ "Dispatch: only the first argument can be an invocant");
+ i++; /* skip 'i' */
+ }
}
break;
}
@@ -930,6 +941,8 @@
VTABLE_unshift_pmc(interp, call_object, obj);
}
+ VTABLE_set_string_native(interp, call_object, string_sig);
+
return call_object;
}
More information about the parrot-commits
mailing list