[svn:parrot] r44893 - in trunk/src: . pmc

chromatic at svn.parrot.org chromatic at svn.parrot.org
Fri Mar 12 03:38:59 UTC 2010


Author: chromatic
Date: Fri Mar 12 03:38:36 2010
New Revision: 44893
URL: https://trac.parrot.org/parrot/changeset/44893

Log:
[MMD] Moved the logic for calculating the MMD type tuple from
Parrot_mmd_find_multi_from_sig_obj() into the CallContext PMC's get_pmc VTABLE,
as walking through CallContext's positionals to serialize them into a STRING
then walking through that STRINg to create a RIA was awfully silly.  This gives
a modest but measurable speed improvement to MMD-heavy code.

Modified:
   trunk/src/multidispatch.c
   trunk/src/pmc/callcontext.pmc

Modified: trunk/src/multidispatch.c
==============================================================================
--- trunk/src/multidispatch.c	Fri Mar 12 02:24:37 2010	(r44892)
+++ trunk/src/multidispatch.c	Fri Mar 12 03:38:36 2010	(r44893)
@@ -1,5 +1,5 @@
 /*
-Copyright (C) 2003-2009, Parrot Foundation.
+Copyright (C) 2003-2010, Parrot Foundation.
 $Id$
 
 =head1 NAME
@@ -456,82 +456,7 @@
 Parrot_mmd_build_type_tuple_from_sig_obj(PARROT_INTERP, ARGIN(PMC *sig_obj))
 {
     ASSERT_ARGS(Parrot_mmd_build_type_tuple_from_sig_obj)
-    PMC * const  type_tuple = Parrot_pmc_new(interp, enum_class_ResizableIntegerArray);
-    STRING      *string_sig = VTABLE_get_string(interp, sig_obj);
-    INTVAL       args_ended = 0;
-    INTVAL       i, seen_invocant = 0;
-    INTVAL       sig_len;
-
-    if (STRING_IS_NULL(string_sig)) {
-            Parrot_ex_throw_from_c_args(interp, NULL, 1,
-                    "Call has no signature, unable to dispatch.\n");
-    }
-
-    sig_len = Parrot_str_byte_length(interp, string_sig);
-
-    for (i = 0; i < sig_len; ++i) {
-        INTVAL type = Parrot_str_indexed(interp, string_sig, i + seen_invocant);
-        if (args_ended)
-            break;
-
-        /* Regular arguments just set the value */
-        switch (type) {
-          case 'I':
-            VTABLE_set_integer_keyed_int(interp, type_tuple,
-                        i, enum_type_INTVAL);
-            break;
-          case 'N':
-            VTABLE_set_integer_keyed_int(interp, type_tuple,
-                        i, enum_type_FLOATVAL);
-            break;
-          case 'S':
-            {
-                INTVAL type_lookahead = Parrot_str_indexed(interp, string_sig, (i + 1));
-                if (type_lookahead == 'n') {
-                    args_ended = 1;
-                    break;
-                }
-                VTABLE_set_integer_keyed_int(interp, type_tuple,
-                            i, enum_type_STRING);
-                break;
-            }
-          case 'P':
-            {
-                INTVAL type_lookahead = Parrot_str_indexed(interp, string_sig, (i + 1));
-                if (type_lookahead == 'i') {
-                    if (i != 0)
-                        Parrot_ex_throw_from_c_args(interp, NULL,
-                            EXCEPTION_INVALID_OPERATION,
-                            "Multiple Dispatch: only the first argument can be an invocant");
-                    seen_invocant = 1;
-                }
-                else if (type_lookahead == 'f') {
-                    args_ended = 1;
-                    break;
-                }
-                else {
-                    PMC *pmc_arg = VTABLE_get_pmc_keyed_int(interp, sig_obj, i);
-                    if (PMC_IS_NULL(pmc_arg))
-                        VTABLE_set_integer_keyed_int(interp, type_tuple,
-                                i, enum_type_PMC);
-                    else
-                        VTABLE_set_integer_keyed_int(interp, type_tuple, i,
-                                VTABLE_type(interp, pmc_arg));
-                }
-
-                break;
-            }
-          case '-':
-            args_ended = 1;
-            break;
-          default:
-            Parrot_ex_throw_from_c_args(interp, NULL,
-                    EXCEPTION_INVALID_OPERATION,
-                    "Multiple Dispatch: invalid argument type %c!", type);
-        }
-    }
-
-    return type_tuple;
+    return VTABLE_get_pmc(interp, sig_obj);
 }
 
 

Modified: trunk/src/pmc/callcontext.pmc
==============================================================================
--- trunk/src/pmc/callcontext.pmc	Fri Mar 12 02:24:37 2010	(r44892)
+++ trunk/src/pmc/callcontext.pmc	Fri Mar 12 03:38:36 2010	(r44893)
@@ -687,12 +687,55 @@
         GET_ATTR_type_tuple(INTERP, SELF, type_tuple);
 
         if (PMC_IS_NULL(type_tuple)) {
-            type_tuple = Parrot_mmd_build_type_tuple_from_sig_obj(INTERP, SELF);
+            Pcc_cell *c;
+            INTVAL    num_positionals;
+            INTVAL    i = 0;
+
+            GET_ATTR_positionals(INTERP, SELF, c);
+            GET_ATTR_num_positionals(INTERP, SELF, num_positionals);
+
+            type_tuple = Parrot_pmc_new_init_int(interp,
+                enum_class_ResizableIntegerArray, num_positionals);
+
+            while (c) {
+                switch (CELL_TYPE_MASK(c)) {
+                    case INTCELL:
+                        VTABLE_set_integer_keyed_int(interp, type_tuple,
+                            i, enum_type_INTVAL);
+                        break;
+                    case FLOATCELL:
+                        VTABLE_set_integer_keyed_int(interp, type_tuple,
+                            i, enum_type_FLOATVAL);
+                        break;
+                    case STRINGCELL:
+                        VTABLE_set_integer_keyed_int(interp, type_tuple,
+                            i, enum_type_STRING);
+                        break;
+                    case PMCCELL:
+                    {
+                        PMC *pmc_arg = CELL_PMC(c);
+                        if (PMC_IS_NULL(pmc_arg))
+                            VTABLE_set_integer_keyed_int(interp, type_tuple,
+                                    i, enum_type_PMC);
+                        else
+                            VTABLE_set_integer_keyed_int(interp, type_tuple, i,
+                                    VTABLE_type(interp, pmc_arg));
+                        break;
+                    }
+                    default:
+                        Parrot_ex_throw_from_c_args(interp, NULL,
+                            EXCEPTION_INVALID_OPERATION,
+                            "Multiple Dispatch: invalid argument type!");
+                }
+
+                i++;
+                c = NEXT_CELL(c);
+            }
+
             SET_ATTR_type_tuple(INTERP, SELF, type_tuple);
         }
 
         return type_tuple;
-
     }
 
 /*


More information about the parrot-commits mailing list