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

chromatic at svn.parrot.org chromatic at svn.parrot.org
Fri Nov 20 08:41:36 UTC 2009


Author: chromatic
Date: Fri Nov 20 08:41:35 2009
New Revision: 42597
URL: https://trac.parrot.org/parrot/changeset/42597

Log:
[PCC] Replaced repeated VTABLE accessor calls with macro access in
fill_params(), for a minor performance improvement.

Modified:
   trunk/src/call/args.c

Modified: trunk/src/call/args.c
==============================================================================
--- trunk/src/call/args.c	Fri Nov 20 03:10:44 2009	(r42596)
+++ trunk/src/call/args.c	Fri Nov 20 08:41:35 2009	(r42597)
@@ -938,44 +938,47 @@
     ASSERT_ARGS(fill_params)
     PMC    *named_used_list = PMCNULL;
     PMC    *arg_sig;
+    INTVAL *raw_params;
     INTVAL  param_count     = VTABLE_elements(interp, raw_sig);
-    INTVAL  positional_args;
     INTVAL  param_index     = 0;
     INTVAL  arg_index       = 0;
     INTVAL  named_count     = 0;
     INTVAL  err_check       = 0;
+    INTVAL  positional_args;
 
     /* Check if we should be throwing errors. This is configured separately
      * for parameters and return values. */
     if (PARROT_ERRORS_test(interp, PARROT_ERRORS_PARAM_COUNT_FLAG))
-            err_check = 1;
+        err_check = 1;
 
     /* A null call object is fine if there are no arguments and no returns. */
     if (PMC_IS_NULL(call_object)) {
-        if (param_count > 0) {
-            if (err_check)
-                Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
-                    "too few arguments: 0 passed, %d expected", param_count);
-        }
+        if (param_count > 0 && err_check)
+            Parrot_ex_throw_from_c_args(interp, NULL,
+                EXCEPTION_INVALID_OPERATION,
+                "too few arguments: 0 passed, %d expected", param_count);
+
         return;
     }
 
     positional_args = VTABLE_elements(interp, call_object);
     GETATTR_CallSignature_arg_flags(interp, call_object, arg_sig);
+    GETATTR_FixedIntegerArray_int_array(interp, raw_sig, raw_params);
 
     /* EXPERIMENTAL! This block adds provisional :call_sig param support on the
        callee side only. Does not add :call_sig arg support on the caller side.
        This is not the final form of the algorithm, but should provide the
        tools that HLL designers need in the interim. */
     if (param_count == 1) {
-        const INTVAL first_flag = VTABLE_get_integer_keyed_int(interp, raw_sig, 0);
+        const INTVAL first_flag = raw_params[0];
+
         if (first_flag & PARROT_ARG_CALL_SIG) {
             *accessor->pmc(interp, arg_info, 0) = call_object;
             return;
         }
     }
     else if (param_count == 2) {
-        const INTVAL second_flag = VTABLE_get_integer_keyed_int(interp, raw_sig, 1);
+        const INTVAL second_flag = raw_params[1];
         if (second_flag & PARROT_ARG_CALL_SIG)
             *accessor->pmc(interp, arg_info, 1) = call_object;
     }
@@ -1002,7 +1005,7 @@
             return;
         }
 
-        param_flags = VTABLE_get_integer_keyed_int(interp, raw_sig, param_index);
+        param_flags = raw_params[param_index];
 
         /* If it's a call_sig, we're done. */
         if (param_flags & PARROT_ARG_CALL_SIG)
@@ -1049,12 +1052,13 @@
                 param_index++;
                 if (param_index >= param_count)
                     continue;
-                param_flags = VTABLE_get_integer_keyed_int(interp,
-                            raw_sig, param_index);
+
+                param_flags = raw_params[param_index];
 
                 /* Mark the name as used, cannot be filled again. */
                 if (PMC_IS_NULL(named_used_list)) /* Only created if needed. */
                     named_used_list = pmc_new(interp, enum_class_Hash);
+
                 VTABLE_set_integer_keyed_str(interp, named_used_list, param_name, 1);
             }
             else if (named_count > 0) {
@@ -1093,8 +1097,8 @@
                 INTVAL next_param_flags;
 
                 if (param_index + 1 < param_count) {
-                    next_param_flags = VTABLE_get_integer_keyed_int(interp,
-                            raw_sig, param_index + 1);
+                    next_param_flags = raw_params[param_index + 1];
+
                     if (next_param_flags & PARROT_ARG_OPT_FLAG) {
                         param_index++;
                         *accessor->intval(interp, arg_info, param_index) = 1;
@@ -1118,8 +1122,8 @@
             /* Mark the option flag for the parameter to FALSE, it was filled
              * with a default value. */
             if (param_index + 1 < param_count) {
-                next_param_flags = VTABLE_get_integer_keyed_int(interp,
-                        raw_sig, param_index + 1);
+                next_param_flags = raw_params[param_index + 1];
+
                 if (next_param_flags & PARROT_ARG_OPT_FLAG) {
                     param_index++;
                     *accessor->intval(interp, arg_info, param_index) = 0;
@@ -1154,7 +1158,7 @@
         if (param_index >= param_count)
             break;
 
-        param_flags = VTABLE_get_integer_keyed_int(interp, raw_sig, param_index);
+        param_flags = raw_params[param_index];
 
         /* All remaining parameters must be named. */
         if (!(param_flags & PARROT_ARG_NAME)) {
@@ -1218,7 +1222,8 @@
             param_index++;
             if (param_index >= param_count)
                 continue;
-            param_flags = VTABLE_get_integer_keyed_int(interp, raw_sig, param_index);
+
+            param_flags = raw_params[param_index];
 
             if (VTABLE_exists_keyed_str(interp, call_object, param_name)) {
 
@@ -1257,8 +1262,8 @@
                     INTVAL next_param_flags;
 
                     if (param_index + 1 < param_count) {
-                        next_param_flags = VTABLE_get_integer_keyed_int(interp,
-                                raw_sig, param_index + 1);
+                        next_param_flags = raw_params[param_index + 1];
+
                         if (next_param_flags & PARROT_ARG_OPT_FLAG) {
                             param_index++;
                             *accessor->intval(interp, arg_info, param_index) = 1;
@@ -1275,8 +1280,8 @@
                 /* Mark the option flag for the parameter to FALSE, it was filled
                  * with a default value. */
                 if (param_index + 1 < param_count) {
-                    next_param_flags = VTABLE_get_integer_keyed_int(interp,
-                            raw_sig, param_index + 1);
+                    next_param_flags = raw_params[param_index + 1];
+
                     if (next_param_flags & PARROT_ARG_OPT_FLAG) {
                         param_index++;
                         *accessor->intval(interp, arg_info, param_index) = 0;


More information about the parrot-commits mailing list