[svn:parrot] r45195 - trunk/src/call

chromatic at svn.parrot.org chromatic at svn.parrot.org
Sat Mar 27 01:02:25 UTC 2010


Author: chromatic
Date: Sat Mar 27 01:02:25 2010
New Revision: 45195
URL: https://trac.parrot.org/parrot/changeset/45195

Log:
[PCC] Reduced (mostly) unnecessary uses of strlen() on argument and return
signatures.  We could optimize the switch statements slightly more, but this is
a good tradeoff for now.

Modified:
   trunk/src/call/args.c

Modified: trunk/src/call/args.c
==============================================================================
--- trunk/src/call/args.c	Sat Mar 27 01:02:22 2010	(r45194)
+++ trunk/src/call/args.c	Sat Mar 27 01:02:25 2010	(r45195)
@@ -674,7 +674,6 @@
     PMC         * arg_flags         = PMCNULL;
     PMC         * ignored_flags     = PMCNULL;
     PMC         * call_object;
-    const INTVAL  sig_len           = strlen(sig);
     INTVAL       i                  = 0;
 
     if (PMC_IS_NULL(signature))
@@ -688,7 +687,7 @@
     VTABLE_set_attr_str(interp, call_object, CONST_STRING(interp, "arg_flags"), arg_flags);
 
     /* Process the varargs list */
-    for (; i < sig_len; ++i) {
+    for (; sig[i] != '\0'; ++i) {
         const INTVAL type = sig[i];
 
         /* Regular arguments just set the value */
@@ -764,19 +763,19 @@
     PMC         * type_tuple        = PMCNULL;
     PMC         * arg_flags         = PMCNULL;
     PMC         * const call_object = Parrot_pmc_new(interp, enum_class_CallContext);
-    const INTVAL sig_len            = strlen(sig);
     INTVAL       in_return_sig      = 0;
     INTVAL       i;
     int          append_pi          = 1;
 
-    if (!sig_len)
+    /* empty args or empty returns */
+    if (*sig == '-' || *sig == '\0')
         return call_object;
 
     parse_signature_string(interp, sig, &arg_flags);
     VTABLE_set_attr_str(interp, call_object, CONST_STRING(interp, "arg_flags"), arg_flags);
 
     /* Process the varargs list */
-    for (i = 0; i < sig_len; ++i) {
+    for (i = 0; sig[i] != '\0'; ++i) {
         const INTVAL type = sig[i];
 
         /* Don't process returns */
@@ -810,9 +809,10 @@
                         if (i != 0)
                             Parrot_ex_throw_from_c_args(interp, NULL,
                                 EXCEPTION_INVALID_OPERATION,
-                                "Dispatch: only the first argument can be an invocant");
-                        i++; /* skip 'i' */
-                        append_pi = 0; /* Don't append Pi in front of signature */
+                                "Dispatch: only the first argument "
+                                "can be an invocant");
+                        i++;           /* skip 'i' */
+                        append_pi = 0; /* Don't prepend Pi to signature */
                     }
                 }
                 break;
@@ -827,7 +827,7 @@
         }
     }
 
-    /* Check if we have an invocant, and add it to the front of the arguments iff needed */
+    /* Add invocant to the front of the arguments iff needed */
     if (!PMC_IS_NULL(obj) && append_pi)
         VTABLE_unshift_pmc(interp, call_object, obj);
 
@@ -1431,7 +1431,8 @@
         (pmc_func_t)pmc_constant_from_varargs,
     };
 
-    if (strlen(signature) < 1)
+    /* empty args or empty returns */
+    if (*signature == '-' || *signature == '\0')
         return;
 
     parse_signature_string(interp, signature, &raw_sig);


More information about the parrot-commits mailing list