[svn:parrot] r42853 - branches/cs_csr_merge/src/call

bacek at svn.parrot.org bacek at svn.parrot.org
Wed Dec 2 09:42:03 UTC 2009


Author: bacek
Date: Wed Dec  2 09:42:03 2009
New Revision: 42853
URL: https://trac.parrot.org/parrot/changeset/42853

Log:
Switch from CSR to CS in building returns.

Modified:
   branches/cs_csr_merge/src/call/args.c

Modified: branches/cs_csr_merge/src/call/args.c
==============================================================================
--- branches/cs_csr_merge/src/call/args.c	Wed Dec  2 09:41:42 2009	(r42852)
+++ branches/cs_csr_merge/src/call/args.c	Wed Dec  2 09:42:03 2009	(r42853)
@@ -454,8 +454,7 @@
     , PARROT_ASSERT_ARG(value))
 #define ASSERT_ARGS_csr_set_string_keyed_int __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
-    , PARROT_ASSERT_ARG(self) \
-    , PARROT_ASSERT_ARG(value))
+    , PARROT_ASSERT_ARG(self))
 #define ASSERT_ARGS_dissect_aggregate_arg __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(call_object) \
@@ -819,7 +818,6 @@
     PMC            *call_object;
     INTVAL         *int_array;
     PMC            *ctx         = CURRENT_CONTEXT(interp);
-    PMC            *returns     = pmc_new(interp, enum_class_CallSignatureReturns);
     INTVAL          returns_pos = 0;
     INTVAL          arg_index;
     INTVAL          arg_count;
@@ -841,7 +839,6 @@
 
     /* a little encapsulation violation for great speed */
     SETATTR_CallSignature_return_flags(interp, call_object, raw_sig);
-    SETATTR_CallSignature_results(interp, call_object, returns);
 
     GETATTR_FixedIntegerArray_size(interp, raw_sig, arg_count);
     GETATTR_FixedIntegerArray_int_array(interp, raw_sig, int_array);
@@ -855,33 +852,33 @@
          * the result back to the caller. */
         switch (PARROT_ARG_TYPE_MASK_MASK(arg_flags)) {
             case PARROT_ARG_INTVAL:
-                VTABLE_set_pointer_keyed_int(interp, returns, returns_pos++,
+                csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
                         &(CTX_REG_INT(ctx, raw_index)));
-                VTABLE_push_integer(interp, returns, PARROT_ARG_INTVAL);
+                csr_push_integer(interp, call_object, PARROT_ARG_INTVAL);
                 break;
             case PARROT_ARG_FLOATVAL:
-                VTABLE_set_pointer_keyed_int(interp, returns, returns_pos++,
+                csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
                         &(CTX_REG_NUM(ctx, raw_index)));
-                VTABLE_push_integer(interp, returns, PARROT_ARG_FLOATVAL);
+                csr_push_integer(interp, call_object, PARROT_ARG_FLOATVAL);
                 break;
             case PARROT_ARG_STRING:
                 if (arg_flags & PARROT_ARG_NAME) {
                     STRING * string_val = arg_flags & PARROT_ARG_CONSTANT
                                           ? Parrot_pcc_get_string_constant(interp, ctx, raw_index)
                                           : CTX_REG_STR(ctx, raw_index);
-                    VTABLE_set_pointer_keyed_int(interp, returns, returns_pos++,
+                    csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
                             string_val);
                 }
                 else {
-                    VTABLE_set_pointer_keyed_int(interp, returns, returns_pos++,
+                    csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
                             &(CTX_REG_STR(ctx, raw_index)));
-                    VTABLE_push_integer(interp, returns, PARROT_ARG_STRING);
+                    csr_push_integer(interp, call_object, PARROT_ARG_STRING);
                 }
                 break;
             case PARROT_ARG_PMC:
-                VTABLE_set_pointer_keyed_int(interp, returns, returns_pos++,
+                csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
                         &(CTX_REG_PMC(ctx, raw_index)));
-                VTABLE_push_integer(interp, returns, PARROT_ARG_PMC);
+                csr_push_integer(interp, call_object, PARROT_ARG_PMC);
                 break;
             default:
                 break;
@@ -914,7 +911,6 @@
 {
     ASSERT_ARGS(Parrot_pcc_build_sig_object_from_varargs)
     PMC         *type_tuple         = PMCNULL;
-    PMC         *returns            = PMCNULL;
     PMC         *arg_flags     = PMCNULL;
     PMC         *return_flags  = PMCNULL;
     PMC         * const call_object = pmc_new(interp, enum_class_CallSignature);
@@ -935,36 +931,30 @@
     for (i = 0; i < sig_len; ++i) {
         const INTVAL type = 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_CallSignatureReturns);
-            VTABLE_set_attr_str(interp, call_object, CONST_STRING(interp, "returns"), 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. */
             switch (type) {
                 case 'I':
-                    VTABLE_set_pointer_keyed_int(interp, returns, returns_pos++,
+                    csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
                             (void *)va_arg(args, INTVAL *));
-                    VTABLE_push_integer(interp, returns, PARROT_ARG_INTVAL);
+                    csr_push_integer(interp, call_object, PARROT_ARG_INTVAL);
                     break;
                 case 'N':
-                    VTABLE_set_pointer_keyed_int(interp, returns, returns_pos++,
+                    csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
                             (void *)va_arg(args, FLOATVAL *));
-                    VTABLE_push_integer(interp, returns, PARROT_ARG_FLOATVAL);
+                    csr_push_integer(interp, call_object, PARROT_ARG_FLOATVAL);
                     break;
                 case 'S':
-                    VTABLE_set_pointer_keyed_int(interp, returns, returns_pos++,
+                    csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
                             (void *)va_arg(args, STRING **));
-                    VTABLE_push_integer(interp, returns, PARROT_ARG_STRING);
+                    csr_push_integer(interp, call_object, PARROT_ARG_STRING);
                     break;
                 case 'P':
-                    VTABLE_set_pointer_keyed_int(interp, returns, returns_pos++,
+                    csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
                             (void *)va_arg(args, PMC **));
-                    VTABLE_push_integer(interp, returns, PARROT_ARG_PMC);
+                    csr_push_integer(interp, call_object, PARROT_ARG_PMC);
                     break;
                 default:
                     Parrot_ex_throw_from_c_args(interp, NULL,
@@ -1509,16 +1499,16 @@
     ASSERT_ARGS(assign_default_result_value)
     switch (PARROT_ARG_TYPE_MASK_MASK(result_flags)) {
         case PARROT_ARG_INTVAL:
-            VTABLE_set_integer_keyed_int(interp, results, index, 0);
+            csr_set_integer_keyed_int(interp, results, index, 0);
             break;
         case PARROT_ARG_FLOATVAL:
-            VTABLE_set_number_keyed_int(interp, results, index, 0.0);
+            csr_set_number_keyed_int(interp, results, index, 0.0);
             break;
         case PARROT_ARG_STRING:
-            VTABLE_set_string_keyed_int(interp, results, index, NULL);
+            csr_set_string_keyed_int(interp, results, index, NULL);
             break;
         case PARROT_ARG_PMC:
-            VTABLE_set_pmc_keyed_int(interp, results, index, PMCNULL);
+            csr_set_pmc_keyed_int(interp, results, index, PMCNULL);
             break;
         default:
             Parrot_ex_throw_from_c_args(interp, NULL,
@@ -1634,7 +1624,6 @@
     ASSERT_ARGS(fill_results)
     INTVAL *return_array;
     INTVAL *result_array;
-    PMC    *result_list;
     PMC    *result_sig         = NULL;
     PMC    *ctx                = CURRENT_CONTEXT(interp);
     PMC    *named_used_list    = PMCNULL;
@@ -1669,11 +1658,10 @@
         return;
     }
 
-    GETATTR_CallSignature_results(interp, call_object, result_list);
     GETATTR_CallSignature_return_flags(interp, call_object, result_sig);
 
-    result_count = PMC_IS_NULL(result_list) ? 0 : VTABLE_elements(interp, result_list);
-    PARROT_ASSERT(PMC_IS_NULL(result_list) || !PMC_IS_NULL(result_sig));
+    result_count = csr_elements(interp, call_object);
+    PARROT_ASSERT((result_count == 0) || !PMC_IS_NULL(result_sig));
 
     GETATTR_FixedIntegerArray_int_array(interp, raw_sig, return_array);
     if (!PMC_IS_NULL(result_sig))
@@ -1795,7 +1783,7 @@
                 }
                 return_index++;
             }
-            VTABLE_set_pmc_keyed_int(interp, result_list, result_index, collect_positional);
+            csr_set_pmc_keyed_int(interp, call_object, result_index, collect_positional);
             result_index++;
             break; /* Terminate the positional return loop. */
         }
@@ -1811,7 +1799,7 @@
                 if (!(result_flags & PARROT_ARG_STRING))
                     Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
                             "named results must have a name specified 1683");
-                result_name = VTABLE_get_string_keyed_int(interp, result_list, result_index);
+                result_name = csr_get_string_keyed_int(interp, call_object, result_index);
                 named_count++;
                 result_index++;
                 if (result_index >= result_count)
@@ -1835,26 +1823,26 @@
             switch (PARROT_ARG_TYPE_MASK_MASK(return_flags)) {
                 case PARROT_ARG_INTVAL:
                     if (constant)
-                        VTABLE_set_integer_keyed_int(interp, result_list, result_index,
+                        csr_set_integer_keyed_int(interp, call_object, result_index,
                             accessor->intval_constant(interp, return_info, return_index));
                     else
-                        VTABLE_set_integer_keyed_int(interp, result_list, result_index,
+                        csr_set_integer_keyed_int(interp, call_object, result_index,
                             accessor->intval(interp, return_info, return_index));
                     break;
                 case PARROT_ARG_FLOATVAL:
                     if (constant)
-                        VTABLE_set_number_keyed_int(interp, result_list, result_index,
+                        csr_set_number_keyed_int(interp, call_object, result_index,
                             accessor->numval_constant(interp, return_info, return_index));
                     else
-                        VTABLE_set_number_keyed_int(interp, result_list, result_index,
+                        csr_set_number_keyed_int(interp, call_object, result_index,
                             accessor->numval(interp, return_info, return_index));
                     break;
                 case PARROT_ARG_STRING:
                     if (constant)
-                        VTABLE_set_string_keyed_int(interp, result_list, result_index,
+                        csr_set_string_keyed_int(interp, call_object, result_index,
                             accessor->string_constant(interp, return_info, return_index));
                     else
-                        VTABLE_set_string_keyed_int(interp, result_list, result_index,
+                        csr_set_string_keyed_int(interp, call_object, result_index,
                             accessor->string(interp, return_info, return_index));
                     break;
                 case PARROT_ARG_PMC:
@@ -1887,7 +1875,7 @@
                                 return_index--; /* we want to stay on the same item */
                             }
                         }
-                        VTABLE_set_pmc_keyed_int(interp, result_list, result_index, return_item);
+                        csr_set_pmc_keyed_int(interp, call_object, result_index, return_item);
                         break;
                     }
                 default:
@@ -1904,7 +1892,7 @@
                     next_result_flags = result_array[result_index + 1];
                     if (next_result_flags & PARROT_ARG_OPT_FLAG) {
                         result_index++;
-                        VTABLE_set_integer_keyed_int(interp, result_list, result_index, 1);
+                        csr_set_integer_keyed_int(interp, call_object, result_index, 1);
                     }
                 }
             }
@@ -1919,7 +1907,7 @@
             if (result_flags & PARROT_ARG_NAME)
                 break;
 
-            assign_default_result_value(interp, result_list, result_index, result_flags);
+            assign_default_result_value(interp, call_object, result_index, result_flags);
 
             /* Mark the option flag for the result to FALSE, it was filled
              * with a default value. */
@@ -1927,7 +1915,7 @@
                 next_result_flags = result_array[result_index + 1];
                 if (next_result_flags & PARROT_ARG_OPT_FLAG) {
                     result_index++;
-                    VTABLE_set_integer_keyed_int(interp, result_list, result_index, 0);
+                    csr_set_integer_keyed_int(interp, call_object, result_index, 0);
                 }
             }
         }
@@ -2046,7 +2034,7 @@
                 named_return_list = pmc_new(interp,
                         Parrot_get_ctx_HLL_type(interp, enum_class_Hash));
 
-            VTABLE_set_pmc_keyed_int(interp, result_list, result_index, named_return_list);
+            csr_set_pmc_keyed_int(interp, call_object, result_index, named_return_list);
             break; /* End of named results. */
         }
 
@@ -2054,7 +2042,7 @@
         if (!(result_flags & PARROT_ARG_STRING))
             Parrot_ex_throw_from_c_args(interp, NULL, EXCEPTION_INVALID_OPERATION,
                     "named results must have a name specified 1926");
-        result_name = VTABLE_get_string_keyed_int(interp, result_list, result_index);
+        result_name = csr_get_string_keyed_int(interp, call_object, result_index);
 
         if (!STRING_IS_NULL(result_name)) {
             /* The next result is the actual value. */
@@ -2070,19 +2058,19 @@
                 /* Fill the named result. */
                 switch (PARROT_ARG_TYPE_MASK_MASK(result_flags)) {
                     case PARROT_ARG_INTVAL:
-                        VTABLE_set_integer_keyed_int(interp, result_list, result_index,
+                        csr_set_integer_keyed_int(interp, call_object, result_index,
                             VTABLE_get_integer_keyed_str(interp, named_return_list, result_name));
                         break;
                     case PARROT_ARG_FLOATVAL:
-                        VTABLE_set_number_keyed_int(interp, result_list, result_index,
+                        csr_set_number_keyed_int(interp, call_object, result_index,
                             VTABLE_get_number_keyed_str(interp, named_return_list, result_name));
                         break;
                     case PARROT_ARG_STRING:
-                        VTABLE_set_string_keyed_int(interp, result_list, result_index,
+                        csr_set_string_keyed_int(interp, call_object, result_index,
                             VTABLE_get_string_keyed_str(interp, named_return_list, result_name));
                         break;
                     case PARROT_ARG_PMC:
-                        VTABLE_set_pmc_keyed_int(interp, result_list, result_index,
+                        csr_set_pmc_keyed_int(interp, call_object, result_index,
                             VTABLE_get_pmc_keyed_str(interp, named_return_list, result_name));
                         break;
                     default:
@@ -2100,7 +2088,7 @@
                         next_result_flags = return_array[result_index + 1];
                         if (next_result_flags & PARROT_ARG_OPT_FLAG) {
                             result_index++;
-                            VTABLE_set_integer_keyed_int(interp, result_list, result_index, 1);
+                            csr_set_integer_keyed_int(interp, call_object, result_index, 1);
                         }
                     }
                 }
@@ -2108,7 +2096,7 @@
             else if (result_flags & PARROT_ARG_OPTIONAL) {
                 INTVAL next_result_flags;
 
-                assign_default_result_value(interp, result_list, result_index, result_flags);
+                assign_default_result_value(interp, call_object, result_index, result_flags);
 
                 /* Mark the option flag for the result to FALSE, it was filled
                  * with a default value. */
@@ -2116,7 +2104,7 @@
                     next_result_flags = result_array[result_index + 1];
                     if (next_result_flags & PARROT_ARG_OPT_FLAG) {
                         result_index++;
-                        VTABLE_set_integer_keyed_int(interp, result_list, result_index, 1);
+                        csr_set_integer_keyed_int(interp, call_object, result_index, 1);
                     }
                 }
             }
@@ -2461,11 +2449,20 @@
         return;
     else {
         /* Broke encapuslation. Direct poking into CallSignature is much faster */
-        PMC * results;
+        /* FIXME We are leaking like sieve!!! We have do destroy old returns_values */
+        void ** returns_values;
+        INTVAL  returns_size;
+        INTVAL  returns_resize_threshold;
+
         PMC * return_flags;
-        GETATTR_CallSignature_results(interp, parent, results);
+        GETATTR_CallSignature_returns_values(interp, parent, returns_values);
+        GETATTR_CallSignature_returns_size(interp, parent, returns_size);
+        GETATTR_CallSignature_returns_resize_threshold(interp, parent, returns_resize_threshold);
         GETATTR_CallSignature_return_flags(interp, parent, return_flags);
-        SETATTR_CallSignature_results(interp, tailcall, results);
+
+        SETATTR_CallSignature_returns_values(interp, tailcall, returns_values);
+        SETATTR_CallSignature_returns_size(interp, tailcall, returns_size);
+        SETATTR_CallSignature_returns_resize_threshold(interp, tailcall, returns_resize_threshold);
         SETATTR_CallSignature_return_flags(interp, tailcall, return_flags);
     }
 }


More information about the parrot-commits mailing list