[svn:parrot] r44679 - branches/pcc_hackathon_6Mar10/src/call
whiteknight at svn.parrot.org
whiteknight at svn.parrot.org
Sat Mar 6 01:43:42 UTC 2010
Author: whiteknight
Date: Sat Mar 6 01:43:42 2010
New Revision: 44679
URL: https://trac.parrot.org/parrot/changeset/44679
Log:
in Parrot_pcc_build_sig_object_from_varargs, we can skip information here about returns handling. We're probably going to need to create a new function somewhere to unpack the returns back from the return CallContext in places like Parrot_pcc_invoke_sig_object and family
Modified:
branches/pcc_hackathon_6Mar10/src/call/args.c
Modified: branches/pcc_hackathon_6Mar10/src/call/args.c
==============================================================================
--- branches/pcc_hackathon_6Mar10/src/call/args.c Sat Mar 6 01:39:39 2010 (r44678)
+++ branches/pcc_hackathon_6Mar10/src/call/args.c Sat Mar 6 01:43:42 2010 (r44679)
@@ -754,9 +754,8 @@
ARGIN(const char *sig), va_list args)
{
ASSERT_ARGS(Parrot_pcc_build_sig_object_from_varargs)
- PMC *type_tuple = PMCNULL;
- PMC *arg_flags = PMCNULL;
- PMC *return_flags = PMCNULL;
+ PMC * type_tuple = PMCNULL;
+ PMC * arg_flags = PMCNULL;
PMC * const call_object = Parrot_pmc_new(interp, enum_class_CallContext);
const INTVAL sig_len = strlen(sig);
INTVAL in_return_sig = 0;
@@ -768,88 +767,55 @@
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 = sig[i];
- if (in_return_sig) {
- STRING * const signature = CONST_STRING(interp, "signature");
- /* Returns store the original passed-in pointer so they can pass
- * the result back to the caller. */
- switch (type) {
- case 'I':
- csr_push_pointer(interp, call_object,
- (void *)va_arg(args, INTVAL *), PARROT_ARG_INTVAL);
- break;
- case 'N':
- csr_push_pointer(interp, call_object,
- (void *)va_arg(args, FLOATVAL *), PARROT_ARG_FLOATVAL);
- break;
- case 'S':
- csr_push_pointer(interp, call_object,
- (void *)va_arg(args, STRING **), PARROT_ARG_STRING);
- break;
- case 'P':
- csr_push_pointer(interp, call_object,
- (void *)va_arg(args, PMC **), PARROT_ARG_PMC);
- break;
- default:
- Parrot_ex_throw_from_c_args(interp, NULL,
- EXCEPTION_INVALID_OPERATION,
- "Dispatch: invalid argument type %c!", type);
- }
- }
- else {
- /* Regular arguments just set the value */
- switch (type) {
- case 'I':
- VTABLE_push_integer(interp, call_object, va_arg(args, INTVAL));
- break;
- case 'N':
- VTABLE_push_float(interp, call_object, va_arg(args, FLOATVAL));
- break;
- case 'S':
- VTABLE_push_string(interp, call_object, va_arg(args, STRING *));
- break;
- case 'P':
- {
- const INTVAL type_lookahead = sig[i+1];
- PMC * const pmc_arg = va_arg(args, PMC *);
- if (type_lookahead == 'f') {
- dissect_aggregate_arg(interp, call_object, pmc_arg);
- i++; /* skip 'f' */
- }
- else {
- 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' */
- append_pi = 0; /* Don't append Pi in front of signature */
- }
+ /* Regular arguments just set the value */
+ switch (type) {
+ case 'I':
+ VTABLE_push_integer(interp, call_object, va_arg(args, INTVAL));
+ break;
+ case 'N':
+ VTABLE_push_float(interp, call_object, va_arg(args, FLOATVAL));
+ break;
+ case 'S':
+ VTABLE_push_string(interp, call_object, va_arg(args, STRING *));
+ break;
+ case 'P':
+ {
+ const INTVAL type_lookahead = sig[i+1];
+ PMC * const pmc_arg = va_arg(args, PMC *);
+ if (type_lookahead == 'f') {
+ dissect_aggregate_arg(interp, call_object, pmc_arg);
+ i++; /* skip 'f' */
+ }
+ else {
+ 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' */
+ append_pi = 0; /* Don't append Pi in front of signature */
}
- break;
}
- case '-':
- i++; /* skip '>' */
- in_return_sig = 1;
break;
- default:
- Parrot_ex_throw_from_c_args(interp, NULL,
- EXCEPTION_INVALID_OPERATION,
- "Dispatch: invalid argument type %c!", type);
}
+ case '-':
+ break;
+ default:
+ Parrot_ex_throw_from_c_args(interp, NULL,
+ EXCEPTION_INVALID_OPERATION,
+ "Dispatch: invalid argument type %c!", type);
}
}
/* Check if we have an invocant, and add it to the front of the arguments iff needed */
- if (!PMC_IS_NULL(obj) && append_pi) {
+ if (!PMC_IS_NULL(obj) && append_pi)
VTABLE_unshift_pmc(interp, call_object, obj);
- }
return call_object;
}
More information about the parrot-commits
mailing list