[svn:parrot] r41828 - in branches/pcc_reapply/src: . call
bacek at svn.parrot.org
bacek at svn.parrot.org
Sun Oct 11 21:09:01 UTC 2009
Author: bacek
Date: Sun Oct 11 21:08:57 2009
New Revision: 41828
URL: https://trac.parrot.org/parrot/changeset/41828
Log:
Update return_flags in extend.c:append_result
Modified:
branches/pcc_reapply/src/call/args.c
branches/pcc_reapply/src/extend.c
Modified: branches/pcc_reapply/src/call/args.c
==============================================================================
--- branches/pcc_reapply/src/call/args.c Sun Oct 11 20:28:13 2009 (r41827)
+++ branches/pcc_reapply/src/call/args.c Sun Oct 11 21:08:57 2009 (r41828)
@@ -1523,6 +1523,7 @@
result_list = VTABLE_get_attr_str(interp, call_object, CONST_STRING(interp, "returns"));
result_sig = VTABLE_get_attr_str(interp, call_object, CONST_STRING(interp, "return_flags"));
result_count = PMC_IS_NULL(result_list) ? 0 : VTABLE_elements(interp, result_list);
+ PARROT_ASSERT(PMC_IS_NULL(result_list) || !PMC_IS_NULL(result_sig));
/* the call obj doesn't have the returns as positionals, so instead we loop
* over raw_sig and count the number of returns before the first named return.
Modified: branches/pcc_reapply/src/extend.c
==============================================================================
--- branches/pcc_reapply/src/extend.c Sun Oct 11 20:28:13 2009 (r41827)
+++ branches/pcc_reapply/src/extend.c Sun Oct 11 21:08:57 2009 (r41828)
@@ -1028,9 +1028,11 @@
Parrot_String full_sig;
Parrot_PMC returns;
Parrot_PMC return_pointer;
+ Parrot_PMC return_flags;
- Parrot_String return_name = Parrot_str_new_constant(interp, "returns");
- Parrot_String sig_name = Parrot_str_new_constant(interp, "signature");
+ Parrot_String return_name = Parrot_str_new_constant(interp, "returns");
+ Parrot_String return_flags_name = Parrot_str_new_constant(interp, "return_flags");
+ Parrot_String sig_name = Parrot_str_new_constant(interp, "signature");
full_sig = VTABLE_get_string(interp, sig_object);
/* Append ->[T] */
@@ -1047,6 +1049,24 @@
VTABLE_set_pointer(interp, return_pointer, result);
VTABLE_set_string_keyed_str(interp, return_pointer, sig_name, type);
VTABLE_push_pmc(interp, returns, return_pointer);
+
+ /* Update returns_flag */
+ return_flags = VTABLE_get_attr_str(interp, sig_object, return_flags_name);
+ if (PMC_IS_NULL(return_flags)) {
+ return_flags = pmc_new(interp, enum_class_ResizablePMCArray);
+ VTABLE_set_attr_str(interp, sig_object, return_flags_name, return_flags);
+ }
+ switch(Parrot_str_indexed(interp, type, 0)) {
+ case 'I': VTABLE_push_integer(interp, return_flags, PARROT_ARG_INTVAL); break;
+ case 'N': VTABLE_push_integer(interp, return_flags, PARROT_ARG_FLOATVAL); break;
+ case 'S': VTABLE_push_integer(interp, return_flags, PARROT_ARG_STRING); break;
+ case 'P': VTABLE_push_integer(interp, return_flags, PARROT_ARG_PMC); break;
+ default:
+ Parrot_ex_throw_from_c_args(interp, NULL,
+ EXCEPTION_INVALID_OPERATION,
+ "invalid signature string element!");
+ }
+
}
/*
More information about the parrot-commits
mailing list