[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