[svn:parrot] r42911 - branches/cs_csr_cleanup/src/call

bacek at svn.parrot.org bacek at svn.parrot.org
Sun Dec 6 09:42:17 UTC 2009


Author: bacek
Date: Sun Dec  6 09:42:17 2009
New Revision: 42911
URL: https://trac.parrot.org/parrot/changeset/42911

Log:
Change semantic of csr_set_pointer to csr_push_pointer. It simplified it a lot.

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

Modified: branches/cs_csr_cleanup/src/call/args.c
==============================================================================
--- branches/cs_csr_cleanup/src/call/args.c	Sun Dec  6 09:41:58 2009	(r42910)
+++ branches/cs_csr_cleanup/src/call/args.c	Sun Dec  6 09:42:17 2009	(r42911)
@@ -139,6 +139,13 @@
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
 
+static void csr_push_pointer(PARROT_INTERP,
+    ARGIN(PMC *self),
+    ARGIN_NULLOK(void *value),
+    INTVAL type)
+        __attribute__nonnull__(1)
+        __attribute__nonnull__(2);
+
 PARROT_CANNOT_RETURN_NULL
 static void** csr_reallocate_return_values(PARROT_INTERP,
     ARGIN(PMC *self),
@@ -150,14 +157,6 @@
         __attribute__nonnull__(1)
         __attribute__nonnull__(2);
 
-static void csr_set_pointer(PARROT_INTERP,
-    ARGIN(PMC *self),
-    INTVAL key,
-    ARGIN_NULLOK(void *value),
-    INTVAL type)
-        __attribute__nonnull__(1)
-        __attribute__nonnull__(2);
-
 PARROT_CANNOT_RETURN_NULL
 static void dissect_aggregate_arg(PARROT_INTERP,
     ARGMOD(PMC *call_object),
@@ -437,13 +436,13 @@
 #define ASSERT_ARGS_csr_get_string_keyed_int __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(self))
-#define ASSERT_ARGS_csr_reallocate_return_values __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+#define ASSERT_ARGS_csr_push_pointer __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(self))
-#define ASSERT_ARGS_csr_returns_count __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+#define ASSERT_ARGS_csr_reallocate_return_values __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(self))
-#define ASSERT_ARGS_csr_set_pointer __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+#define ASSERT_ARGS_csr_returns_count __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
        PARROT_ASSERT_ARG(interp) \
     , PARROT_ASSERT_ARG(self))
 #define ASSERT_ARGS_dissect_aggregate_arg __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
@@ -843,29 +842,28 @@
          * the result back to the caller. */
         switch (PARROT_ARG_TYPE_MASK_MASK(arg_flags)) {
             case PARROT_ARG_INTVAL:
-                csr_set_pointer(interp, call_object, returns_pos++,
-                        &(CTX_REG_INT(ctx, raw_index)), PARROT_ARG_INTVAL);
+                csr_push_pointer(interp, call_object, &(CTX_REG_INT(ctx, raw_index)),
+                        PARROT_ARG_INTVAL);
                 break;
             case PARROT_ARG_FLOATVAL:
-                csr_set_pointer(interp, call_object, returns_pos++,
-                        &(CTX_REG_NUM(ctx, raw_index)), PARROT_ARG_FLOATVAL);
+                csr_push_pointer(interp, call_object, &(CTX_REG_NUM(ctx, raw_index)),
+                        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);
-                    csr_set_pointer(interp, call_object, returns_pos++,
-                            string_val, PARROT_ARG_STRING);
+                    csr_push_pointer(interp, call_object, string_val, PARROT_ARG_STRING);
                 }
                 else {
-                    csr_set_pointer(interp, call_object, returns_pos++,
+                    csr_push_pointer(interp, call_object,
                             &(CTX_REG_STR(ctx, raw_index)), PARROT_ARG_STRING);
                 }
                 break;
             case PARROT_ARG_PMC:
-                csr_set_pointer(interp, call_object, returns_pos++,
-                        &(CTX_REG_PMC(ctx, raw_index)), PARROT_ARG_PMC);
+                csr_push_pointer(interp, call_object, &(CTX_REG_PMC(ctx, raw_index)),
+                        PARROT_ARG_PMC);
                 break;
             default:
                 break;
@@ -905,7 +903,6 @@
     INTVAL       in_return_sig      = 0;
     INTVAL       i;
     int          append_pi          = 1;
-    INTVAL       returns_pos        = 0;
 
     if (!sig_len)
         return call_object;
@@ -924,19 +921,19 @@
              * the result back to the caller. */
             switch (type) {
                 case 'I':
-                    csr_set_pointer(interp, call_object, returns_pos++,
+                    csr_push_pointer(interp, call_object,
                             (void *)va_arg(args, INTVAL *), PARROT_ARG_INTVAL);
                     break;
                 case 'N':
-                    csr_set_pointer(interp, call_object, returns_pos++,
+                    csr_push_pointer(interp, call_object,
                             (void *)va_arg(args, FLOATVAL *), PARROT_ARG_FLOATVAL);
                     break;
                 case 'S':
-                    csr_set_pointer(interp, call_object, returns_pos++,
+                    csr_push_pointer(interp, call_object,
                             (void *)va_arg(args, STRING **), PARROT_ARG_STRING);
                     break;
                 case 'P':
-                    csr_set_pointer(interp, call_object, returns_pos++,
+                    csr_push_pointer(interp, call_object,
                             (void *)va_arg(args, PMC **), PARROT_ARG_PMC);
                     break;
                 default:
@@ -2863,6 +2860,7 @@
     void **values = (void **)Parrot_gc_allocate_fixed_size_storage(interp,
                                  8 * sizeof (void *));
 
+    SETATTR_CallSignature_returns_values(interp, self, values);
     SETATTR_CallSignature_returns_resize_threshold(interp, self, 8);
     return values;
 }
@@ -2950,46 +2948,33 @@
 
 /*
 
-=item C<static void csr_set_pointer(PARROT_INTERP, PMC *self, INTVAL key, void
-*value, INTVAL type)>
+=item C<static void csr_push_pointer(PARROT_INTERP, PMC *self, void *value,
+INTVAL type)>
 
-Sets the pointer at position key.  The pointer should point to a storage
+Push pointer to results.  The pointer should point to a storage
 location for a return value -- it must be a pointer to an INTVAL, FLOATVAL,
 PMC, or STRING storage location. C<type> is type of pointer.
 
+TODO Rephrase doc. It's weird.
+
 =cut
 
 */
 
 static void
-csr_set_pointer(PARROT_INTERP, ARGIN(PMC *self), INTVAL key,
-        ARGIN_NULLOK(void *value), INTVAL type)
+csr_push_pointer(PARROT_INTERP, ARGIN(PMC *self), ARGIN_NULLOK(void *value), INTVAL type)
 {
-    ASSERT_ARGS(csr_set_pointer)
+    ASSERT_ARGS(csr_push_pointer)
     void   **values;
     INTVAL   size;
 
     PARROT_ASSERT((type >= 0 && type < 4) || !"Wrong pointer type");
 
-    GETATTR_CallSignature_returns_values(interp, self, values);
-    GETATTR_CallSignature_returns_size(interp,   self, size);
-
-    if (!values) {
-        if (key < 8) {
-            values = csr_allocate_initial_values(interp, self);
-            SETATTR_CallSignature_returns_values(interp, self, values);
-            SETATTR_CallSignature_returns_size(interp, self, key + 1);
-        }
-        else {
-            csr_reallocate_return_values(interp, self, key + 1);
-            GETATTR_CallSignature_returns_values(interp, self, values);
-        }
-    }
-    else if (key >= size)
-        csr_reallocate_return_values(interp, self, key + 1);
+    GETATTR_CallSignature_returns_size(interp, self, size);
+    values = csr_reallocate_return_values(interp, self, size + 1);
 
     /* Tag pointer */
-    values[key] = INTVAL2PTR(void *, PTR2INTVAL(value) | type);
+    values[size] = INTVAL2PTR(void *, PTR2INTVAL(value) | type);
 }
 
 
@@ -3237,7 +3222,7 @@
                 "invalid signature string element!");
     }
 
-    csr_set_pointer(interp, sig_object, csr_returns_count(interp, sig_object), result, int_type);
+    csr_push_pointer(interp, sig_object, result, int_type);
 }
 
 /*


More information about the parrot-commits mailing list