[svn:parrot] r44777 - in branches/pcc_hackathon_6Mar10: include/parrot lib/Parrot/Pmc2c src/call src/pmc

allison at svn.parrot.org allison at svn.parrot.org
Mon Mar 8 21:58:28 UTC 2010


Author: allison
Date: Mon Mar  8 21:58:24 2010
New Revision: 44777
URL: https://trac.parrot.org/parrot/changeset/44777

Log:
[pcc] Correctly pass return results from generated NCI methods in PMCs. Add
invocant to signature from interp->current_object, rather than passing as an
argument.

Modified:
   branches/pcc_hackathon_6Mar10/include/parrot/call.h
   branches/pcc_hackathon_6Mar10/lib/Parrot/Pmc2c/PCCMETHOD.pm
   branches/pcc_hackathon_6Mar10/src/call/args.c
   branches/pcc_hackathon_6Mar10/src/call/pcc.c
   branches/pcc_hackathon_6Mar10/src/pmc/callcontext.pmc

Modified: branches/pcc_hackathon_6Mar10/include/parrot/call.h
==============================================================================
--- branches/pcc_hackathon_6Mar10/include/parrot/call.h	Mon Mar  8 20:23:57 2010	(r44776)
+++ branches/pcc_hackathon_6Mar10/include/parrot/call.h	Mon Mar  8 21:58:24 2010	(r44777)
@@ -157,10 +157,19 @@
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
 
 PARROT_EXPORT
+PARROT_CANNOT_RETURN_NULL
+PMC* Parrot_pcc_build_call_from_c_args(PARROT_INTERP,
+    ARGIN_NULLOK(PMC *signature),
+    ARGIN(const char *sig),
+    ...)
+        __attribute__nonnull__(1)
+        __attribute__nonnull__(3);
+
+PARROT_EXPORT
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
 PMC* Parrot_pcc_build_call_from_varargs(PARROT_INTERP,
-    ARGIN_NULLOK(PMC *obj),
+    ARGIN_NULLOK(PMC *signature),
     ARGIN(const char *sig),
     ARGMOD(va_list *args))
         __attribute__nonnull__(1)
@@ -261,6 +270,10 @@
         FUNC_MODIFIES(*arg_sig)
         FUNC_MODIFIES(*return_sig);
 
+#define ASSERT_ARGS_Parrot_pcc_build_call_from_c_args \
+     __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+       PARROT_ASSERT_ARG(interp) \
+    , PARROT_ASSERT_ARG(sig))
 #define ASSERT_ARGS_Parrot_pcc_build_call_from_varargs \
      __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \

Modified: branches/pcc_hackathon_6Mar10/lib/Parrot/Pmc2c/PCCMETHOD.pm
==============================================================================
--- branches/pcc_hackathon_6Mar10/lib/Parrot/Pmc2c/PCCMETHOD.pm	Mon Mar  8 20:23:57 2010	(r44776)
+++ branches/pcc_hackathon_6Mar10/lib/Parrot/Pmc2c/PCCMETHOD.pm	Mon Mar  8 21:58:24 2010	(r44777)
@@ -258,7 +258,7 @@
     /*BEGIN RETURN $returns */
 END
         $e->emit( <<"END", __FILE__, __LINE__ + 1 );
-    Parrot_pcc_fill_returns_from_c_args(interp, _call_object, "$returns_signature",
+    Parrot_pcc_build_call_from_c_args(interp, _call_object, "$returns_signature",
             $returns_varargs);
     return;
     /*END RETURN $returns */

Modified: branches/pcc_hackathon_6Mar10/src/call/args.c
==============================================================================
--- branches/pcc_hackathon_6Mar10/src/call/args.c	Mon Mar  8 20:23:57 2010	(r44776)
+++ branches/pcc_hackathon_6Mar10/src/call/args.c	Mon Mar  8 21:58:24 2010	(r44777)
@@ -524,9 +524,10 @@
     ASSERT_ARGS(Parrot_pcc_build_sig_object_from_op)
     PMC            *call_object;
     PMC            * const ctx = CURRENT_CONTEXT(interp);
+    PMC            *new_sig = PMCNULL;
     INTVAL         *int_array;
     INTVAL          arg_count;
-    INTVAL          arg_index;
+    INTVAL          arg_index = 0;
 
     if (PMC_IS_NULL(signature))
         call_object = Parrot_pmc_new(interp, enum_class_CallContext);
@@ -536,14 +537,33 @@
     }
 
     /* this macro is much, much faster than the VTABLE STRING comparisons */
-    SETATTR_CallContext_arg_flags(interp, call_object, raw_sig);
     GETATTR_FixedIntegerArray_size(interp, raw_sig, arg_count);
     GETATTR_FixedIntegerArray_int_array(interp, raw_sig, int_array);
 
-    for (arg_index = 0; arg_index < arg_count; arg_index++) {
+    if (!PMC_IS_NULL(interp->current_object)) {
+        VTABLE_unshift_pmc(interp, call_object, interp->current_object);
+        if (int_array[0] & (PARROT_ARG_PMC | PARROT_ARG_INVOCANT))
+            arg_index++;
+        else {
+            new_sig = Parrot_pmc_new(interp, enum_class_ResizablePMCArray);
+            VTABLE_unshift_integer(interp, new_sig, PARROT_ARG_PMC | PARROT_ARG_INVOCANT);
+        }
+        interp->current_object = NULL;
+    }
+
+    if (PMC_IS_NULL(new_sig)) {
+        SETATTR_CallContext_arg_flags(interp, call_object, raw_sig);
+    }
+    else {
+        SETATTR_CallContext_arg_flags(interp, call_object, new_sig);
+    }
+
+    for (; arg_index < arg_count; arg_index++) {
         const INTVAL arg_flags = int_array[arg_index];
         const INTVAL constant  = PARROT_ARG_CONSTANT_ISSET(arg_flags);
         const INTVAL raw_index = raw_args[arg_index + 2];
+        if (!PMC_IS_NULL(new_sig))
+            VTABLE_push_integer(interp, new_sig, arg_flags);
 
         switch (PARROT_ARG_TYPE_MASK_MASK(arg_flags)) {
           case PARROT_ARG_INTVAL:
@@ -730,8 +750,37 @@
 
 /*
 
-=item C<PMC* Parrot_pcc_build_call_from_varargs(PARROT_INTERP, PMC *obj, const
-char *sig, va_list *args)>
+=item C<PMC* Parrot_pcc_build_call_from_c_args(PARROT_INTERP, PMC *signature,
+const char *sig, ...)>
+
+Converts a variable list of C args into a CallContext PMC. The CallContext
+stores the original short signature string and an array of integer types to
+pass on to the multiple dispatch search.
+
+=cut
+
+*/
+
+PARROT_EXPORT
+PARROT_CANNOT_RETURN_NULL
+PMC*
+Parrot_pcc_build_call_from_c_args(PARROT_INTERP,
+        ARGIN_NULLOK(PMC *signature), ARGIN(const char *sig), ...)
+{
+    ASSERT_ARGS(Parrot_pcc_build_call_from_c_args)
+    PMC *call_object;
+    va_list args;
+    va_start(args, sig);
+    call_object = Parrot_pcc_build_call_from_varargs(interp, signature,
+         sig, &args);
+    va_end(args);
+    return call_object;
+}
+
+/*
+
+=item C<PMC* Parrot_pcc_build_call_from_varargs(PARROT_INTERP, PMC *signature,
+const char *sig, va_list *args)>
 
 Converts a varargs list into a CallContext PMC. The CallContext stores the
 original short signature string and an array of integer types to pass on to the
@@ -745,26 +794,34 @@
 PARROT_WARN_UNUSED_RESULT
 PARROT_CANNOT_RETURN_NULL
 PMC*
-Parrot_pcc_build_call_from_varargs(PARROT_INTERP, ARGIN_NULLOK(PMC *obj),
-        ARGIN(const char *sig), ARGMOD(va_list *args))
+Parrot_pcc_build_call_from_varargs(PARROT_INTERP,
+        ARGIN_NULLOK(PMC *signature), ARGIN(const char *sig),
+        ARGMOD(va_list *args))
 {
     ASSERT_ARGS(Parrot_pcc_build_call_from_varargs)
     PMC         * type_tuple        = PMCNULL;
     PMC         * arg_flags         = PMCNULL;
     PMC         * ignored_flags     = PMCNULL;
-    PMC         * const call_object = Parrot_pmc_new(interp, enum_class_CallContext);
-    INTVAL sig_len            = strlen(sig);
+    PMC         * call_object;
+    INTVAL       sig_len            = strlen(sig);
     INTVAL       in_return_sig      = 0;
     INTVAL       i                  = 0;
     int          append_pi          = 1;
-    const INTVAL has_invocant = !PMC_IS_NULL(obj);
+
+    if (PMC_IS_NULL(signature))
+        call_object = Parrot_pmc_new(interp, enum_class_CallContext);
+    else {
+        call_object = signature;
+        VTABLE_morph(interp, call_object, PMCNULL);
+    }
 
     parse_signature_string(interp, sig, &arg_flags);
-    if (has_invocant) {
+    if (!PMC_IS_NULL(interp->current_object)) {
         VTABLE_unshift_integer(interp, arg_flags, PARROT_ARG_PMC | PARROT_ARG_INVOCANT);
-        VTABLE_unshift_pmc(interp, call_object, obj);
+        VTABLE_unshift_pmc(interp, call_object, interp->current_object);
         if (sig[0] == 'P' && sig[1] == 'i')
             i += 2;
+        interp->current_object = NULL;
     }
     VTABLE_set_attr_str(interp, call_object, CONST_STRING(interp, "arg_flags"), arg_flags);
 

Modified: branches/pcc_hackathon_6Mar10/src/call/pcc.c
==============================================================================
--- branches/pcc_hackathon_6Mar10/src/call/pcc.c	Mon Mar  8 20:23:57 2010	(r44776)
+++ branches/pcc_hackathon_6Mar10/src/call/pcc.c	Mon Mar  8 21:58:24 2010	(r44777)
@@ -192,8 +192,10 @@
     char *arg_sig, *ret_sig;
     Parrot_pcc_split_signature_string(interp, signature, &arg_sig, &ret_sig);
 
+    interp->current_object = pmc;
+
     va_start(args, signature);
-    call_obj = Parrot_pcc_build_call_from_varargs(interp, pmc, arg_sig, &args);
+    call_obj = Parrot_pcc_build_call_from_varargs(interp, PMCNULL, arg_sig, &args);
 
     /* Find the subroutine object as a named method on pmc */
     sub_obj = VTABLE_find_method(interp, pmc, method_name);
@@ -203,10 +205,10 @@
              "Method '%Ss' not found", method_name);
 
     /* Invoke the subroutine object with the given CallContext object */
-    interp->current_object = pmc;
     Parrot_pcc_invoke_from_sig_object(interp, sub_obj, call_obj);
     Parrot_pcc_fill_params_from_varargs(interp, call_obj, ret_sig, &args);
     va_end(args);
+
 }
 
 /*

Modified: branches/pcc_hackathon_6Mar10/src/pmc/callcontext.pmc
==============================================================================
--- branches/pcc_hackathon_6Mar10/src/pmc/callcontext.pmc	Mon Mar  8 20:23:57 2010	(r44776)
+++ branches/pcc_hackathon_6Mar10/src/pmc/callcontext.pmc	Mon Mar  8 21:58:24 2010	(r44777)
@@ -567,6 +567,11 @@
         if (!PMC_data(SELF))
             return;
 
+        SET_ATTR_short_sig(INTERP, SELF, NULL);
+        SET_ATTR_arg_flags(INTERP, SELF, PMCNULL);
+        SET_ATTR_return_flags(INTERP, SELF, PMCNULL);
+        SET_ATTR_type_tuple(INTERP, SELF, PMCNULL);
+
         GET_ATTR_hash(INTERP, SELF, hash);
         GET_ATTR_num_positionals(INTERP, SELF, num_positionals);
 


More information about the parrot-commits mailing list