[svn:parrot] r36529 - in branches/kill_pccinvoke: include/parrot src src/call

allison at svn.parrot.org allison at svn.parrot.org
Tue Feb 10 05:11:33 UTC 2009


Author: allison
Date: Tue Feb 10 05:11:32 2009
New Revision: 36529
URL: https://trac.parrot.org/parrot/changeset/36529

Log:
[pcc] Moving the signature object construction function into the PCC
code where it belongs.

Modified:
   branches/kill_pccinvoke/include/parrot/call.h
   branches/kill_pccinvoke/include/parrot/multidispatch.h
   branches/kill_pccinvoke/src/call/pcc.c
   branches/kill_pccinvoke/src/multidispatch.c

Modified: branches/kill_pccinvoke/include/parrot/call.h
==============================================================================
--- branches/kill_pccinvoke/include/parrot/call.h	Tue Feb 10 04:09:41 2009	(r36528)
+++ branches/kill_pccinvoke/include/parrot/call.h	Tue Feb 10 05:11:32 2009	(r36529)
@@ -92,6 +92,16 @@
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
 
 PARROT_EXPORT
+PARROT_WARN_UNUSED_RESULT
+PARROT_CANNOT_RETURN_NULL
+PMC* Parrot_build_sig_object_from_varargs(PARROT_INTERP,
+    ARGIN_NULLOK(PMC* obj),
+    ARGIN(const char *sig),
+    va_list args)
+        __attribute__nonnull__(1)
+        __attribute__nonnull__(3);
+
+PARROT_EXPORT
 void Parrot_convert_arg(PARROT_INTERP, ARGMOD(call_state *st))
         __attribute__nonnull__(1)
         __attribute__nonnull__(2)
@@ -268,6 +278,10 @@
         __attribute__nonnull__(1)
         __attribute__nonnull__(3);
 
+#define ASSERT_ARGS_Parrot_build_sig_object_from_varargs \
+     __attribute__unused__ int _ASSERT_ARGS_CHECK = \
+       PARROT_ASSERT_ARG(interp) \
+    || PARROT_ASSERT_ARG(sig)
 #define ASSERT_ARGS_Parrot_convert_arg __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \
     || PARROT_ASSERT_ARG(st)

Modified: branches/kill_pccinvoke/include/parrot/multidispatch.h
==============================================================================
--- branches/kill_pccinvoke/include/parrot/multidispatch.h	Tue Feb 10 04:09:41 2009	(r36528)
+++ branches/kill_pccinvoke/include/parrot/multidispatch.h	Tue Feb 10 05:11:32 2009	(r36529)
@@ -57,16 +57,6 @@
 /* Don't modify between HEADERIZER BEGIN / HEADERIZER END.  Your changes will be lost. */
 
 PARROT_EXPORT
-PARROT_WARN_UNUSED_RESULT
-PARROT_CANNOT_RETURN_NULL
-PMC* Parrot_build_sig_object_from_varargs(PARROT_INTERP,
-    ARGIN_NULLOK(PMC* obj),
-    ARGIN(const char *sig),
-    va_list args)
-        __attribute__nonnull__(1)
-        __attribute__nonnull__(3);
-
-PARROT_EXPORT
 void Parrot_mmd_add_multi_from_c_args(PARROT_INTERP,
     ARGIN(const char *sub_name),
     ARGIN(const char *short_sig),
@@ -217,10 +207,6 @@
         __attribute__nonnull__(2)
         __attribute__nonnull__(3);
 
-#define ASSERT_ARGS_Parrot_build_sig_object_from_varargs \
-     __attribute__unused__ int _ASSERT_ARGS_CHECK = \
-       PARROT_ASSERT_ARG(interp) \
-    || PARROT_ASSERT_ARG(sig)
 #define ASSERT_ARGS_Parrot_mmd_add_multi_from_c_args \
      __attribute__unused__ int _ASSERT_ARGS_CHECK = \
        PARROT_ASSERT_ARG(interp) \

Modified: branches/kill_pccinvoke/src/call/pcc.c
==============================================================================
--- branches/kill_pccinvoke/src/call/pcc.c	Tue Feb 10 04:09:41 2009	(r36528)
+++ branches/kill_pccinvoke/src/call/pcc.c	Tue Feb 10 05:11:32 2009	(r36529)
@@ -346,6 +346,122 @@
         (orig).bp = (save).bp;\
         (orig).bp_ps = (save).bp_ps;
 
+/*
+
+=item C<PMC* Parrot_build_sig_object_from_varargs>
+
+Take a varargs list, and convert it into a CallSignature PMC. The CallSignature
+stores the original short signature string, and an array of integer types to
+pass on to the multiple dispatch search.
+
+=cut
+
+*/
+
+PARROT_EXPORT
+PARROT_WARN_UNUSED_RESULT
+PARROT_CANNOT_RETURN_NULL
+PMC*
+Parrot_build_sig_object_from_varargs(PARROT_INTERP, ARGIN_NULLOK(PMC* obj),
+        ARGIN(const char *sig), va_list args)
+{
+    ASSERT_ARGS(Parrot_build_sig_object_from_varargs)
+    PMC         *type_tuple    = PMCNULL;
+    PMC         *returns       = PMCNULL;
+    PMC         *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);
+    INTVAL       in_return_sig = 0;
+    INTVAL       i;
+
+    if (!sig_len)
+        return call_object;
+
+    VTABLE_set_string_native(interp, call_object, string_sig);
+
+    /* Process the varargs list */
+    for (i = 0; i < sig_len; ++i) {
+        const INTVAL type = Parrot_str_indexed(interp, string_sig, i);
+
+        /* Only create the returns array if it's needed */
+        if (in_return_sig && PMC_IS_NULL(returns)) {
+            returns = pmc_new(interp, enum_class_ResizablePMCArray);
+            VTABLE_set_attr_str(interp, call_object, CONST_STRING(interp, "results"), returns);
+        }
+
+        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. */
+            PMC * const val_pointer = pmc_new(interp, enum_class_CPointer);
+            VTABLE_push_pmc(interp, returns, val_pointer);
+
+            switch (type) {
+                case 'I':
+                    VTABLE_set_pointer(interp, val_pointer, (void *)va_arg(args, INTVAL *));
+                    VTABLE_set_string_keyed_str(interp, val_pointer, signature, CONST_STRING(interp, "I"));
+                    break;
+                case 'N':
+                    VTABLE_set_pointer(interp, val_pointer, (void *)va_arg(args, FLOATVAL *));
+                    VTABLE_set_string_keyed_str(interp, val_pointer, signature, CONST_STRING(interp, "N"));
+                    break;
+                case 'S':
+                    VTABLE_set_pointer(interp, val_pointer, (void *)va_arg(args, STRING **));
+                    VTABLE_set_string_keyed_str(interp, val_pointer, signature, CONST_STRING(interp, "S"));
+                    break;
+                case 'P':
+                    VTABLE_set_pointer(interp, val_pointer, (void *)va_arg(args, PMC **));
+                    VTABLE_set_string_keyed_str(interp, val_pointer, signature, CONST_STRING(interp, "P"));
+                    break;
+                default:
+                    Parrot_ex_throw_from_c_args(interp, NULL,
+                        EXCEPTION_INVALID_OPERATION,
+                        "Multiple 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':
+                {
+                    PMC * const pmc_arg = va_arg(args, PMC *);
+                    VTABLE_push_pmc(interp, call_object, pmc_arg);
+                    break;
+                }
+                case '-':
+                    i++; /* skip '>' */
+                    in_return_sig = 1;
+                    break;
+                default:
+                    Parrot_ex_throw_from_c_args(interp, NULL,
+                        EXCEPTION_INVALID_OPERATION,
+                        "Multiple Dispatch: invalid argument type %c!", type);
+            }
+        }
+    }
+
+    /* Check if we have an invocant, and add it to the front of the arguments */
+    if (!PMC_IS_NULL(obj)) {
+        string_sig = Parrot_str_concat(interp, CONST_STRING(interp, "Pi"), string_sig, 0);
+        VTABLE_set_string_native(interp, call_object, string_sig);
+        VTABLE_unshift_pmc(interp, call_object, obj);
+    }
+
+    /* Build a type_tuple for multiple dispatch */
+    type_tuple = Parrot_mmd_build_type_tuple_from_sig_obj(interp, call_object);
+    VTABLE_set_pmc(interp, call_object, type_tuple);
+
+    return call_object;
+}
 
 /*
 

Modified: branches/kill_pccinvoke/src/multidispatch.c
==============================================================================
--- branches/kill_pccinvoke/src/multidispatch.c	Tue Feb 10 04:09:41 2009	(r36528)
+++ branches/kill_pccinvoke/src/multidispatch.c	Tue Feb 10 05:11:32 2009	(r36529)
@@ -280,125 +280,6 @@
     return Parrot_mmd_sort_manhattan_by_sig_pmc(interp, candidate_list, invoke_sig);
 }
 
-
-/*
-
-=item C<PMC* Parrot_build_sig_object_from_varargs>
-
-Take a varargs list, and convert it into a CallSignature PMC. The CallSignature
-stores the original short signature string, and an array of integer types to
-pass on to the multiple dispatch search.
-
-=cut
-
-*/
-
-PARROT_EXPORT
-PARROT_WARN_UNUSED_RESULT
-PARROT_CANNOT_RETURN_NULL
-PMC*
-Parrot_build_sig_object_from_varargs(PARROT_INTERP, ARGIN_NULLOK(PMC* obj),
-        ARGIN(const char *sig), va_list args)
-{
-    ASSERT_ARGS(Parrot_build_sig_object_from_varargs)
-    PMC         *type_tuple    = PMCNULL;
-    PMC         *returns       = PMCNULL;
-    PMC         *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);
-    INTVAL       in_return_sig = 0;
-    INTVAL       i;
-
-    if (!sig_len)
-        return call_object;
-
-    VTABLE_set_string_native(interp, call_object, string_sig);
-
-    /* Process the varargs list */
-    for (i = 0; i < sig_len; ++i) {
-        const INTVAL type = Parrot_str_indexed(interp, string_sig, i);
-
-        /* Only create the returns array if it's needed */
-        if (in_return_sig && PMC_IS_NULL(returns)) {
-            returns = pmc_new(interp, enum_class_ResizablePMCArray);
-            VTABLE_set_attr_str(interp, call_object, CONST_STRING(interp, "results"), returns);
-        }
-
-        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. */
-            PMC * const val_pointer = pmc_new(interp, enum_class_CPointer);
-            VTABLE_push_pmc(interp, returns, val_pointer);
-
-            switch (type) {
-                case 'I':
-                    VTABLE_set_pointer(interp, val_pointer, (void *)va_arg(args, INTVAL *));
-                    VTABLE_set_string_keyed_str(interp, val_pointer, signature, CONST_STRING(interp, "I"));
-                    break;
-                case 'N':
-                    VTABLE_set_pointer(interp, val_pointer, (void *)va_arg(args, FLOATVAL *));
-                    VTABLE_set_string_keyed_str(interp, val_pointer, signature, CONST_STRING(interp, "N"));
-                    break;
-                case 'S':
-                    VTABLE_set_pointer(interp, val_pointer, (void *)va_arg(args, STRING **));
-                    VTABLE_set_string_keyed_str(interp, val_pointer, signature, CONST_STRING(interp, "S"));
-                    break;
-                case 'P':
-                    VTABLE_set_pointer(interp, val_pointer, (void *)va_arg(args, PMC **));
-                    VTABLE_set_string_keyed_str(interp, val_pointer, signature, CONST_STRING(interp, "P"));
-                    break;
-                default:
-                    Parrot_ex_throw_from_c_args(interp, NULL,
-                        EXCEPTION_INVALID_OPERATION,
-                        "Multiple 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':
-                {
-                    PMC * const pmc_arg = va_arg(args, PMC *);
-                    VTABLE_push_pmc(interp, call_object, pmc_arg);
-                    break;
-                }
-                case '-':
-                    i++; /* skip '>' */
-                    in_return_sig = 1;
-                    break;
-                default:
-                    Parrot_ex_throw_from_c_args(interp, NULL,
-                        EXCEPTION_INVALID_OPERATION,
-                        "Multiple Dispatch: invalid argument type %c!", type);
-            }
-        }
-    }
-
-    /* Check if we have an invocant, and add it to the front of the arguments */
-    if (!PMC_IS_NULL(obj)) {
-        string_sig = Parrot_str_concat(interp, CONST_STRING(interp, "Pi"), string_sig, 0);
-        VTABLE_set_string_native(interp, call_object, string_sig);
-        VTABLE_unshift_pmc(interp, call_object, obj);
-    }
-
-    /* Build a type_tuple for multiple dispatch */
-    type_tuple = Parrot_mmd_build_type_tuple_from_sig_obj(interp, call_object);
-    VTABLE_set_pmc(interp, call_object, type_tuple);
-
-    return call_object;
-}
-
-
 /*
 
 =item C<void Parrot_mmd_multi_dispatch_from_c_args>


More information about the parrot-commits mailing list