[svn:parrot] r42909 - branches/cs_csr_cleanup/src/call
bacek at svn.parrot.org
bacek at svn.parrot.org
Sun Dec 6 09:21:47 UTC 2009
Author: bacek
Date: Sun Dec 6 09:21:46 2009
New Revision: 42909
URL: https://trac.parrot.org/parrot/changeset/42909
Log:
Merge csr_set_pointer_keyed_int and csr_push_integer into single function. We are not limitied by very narrow VTABLE functions anymore.
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:10:37 2009 (r42908)
+++ branches/cs_csr_cleanup/src/call/args.c Sun Dec 6 09:21:46 2009 (r42909)
@@ -139,10 +139,6 @@
__attribute__nonnull__(1)
__attribute__nonnull__(2);
-static void csr_push_integer(PARROT_INTERP, ARGIN(PMC *self), INTVAL type)
- __attribute__nonnull__(1)
- __attribute__nonnull__(2);
-
static void csr_reallocate_return_values(PARROT_INTERP,
ARGIN(PMC *self),
INTVAL size)
@@ -153,10 +149,11 @@
__attribute__nonnull__(1)
__attribute__nonnull__(2);
-static void csr_set_pointer_keyed_int(PARROT_INTERP,
+static void csr_set_pointer(PARROT_INTERP,
ARGIN(PMC *self),
INTVAL key,
- ARGIN_NULLOK(void *value))
+ ARGIN_NULLOK(void *value),
+ INTVAL type)
__attribute__nonnull__(1)
__attribute__nonnull__(2);
@@ -439,16 +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_push_integer __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 = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(self))
#define ASSERT_ARGS_csr_returns_count __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
PARROT_ASSERT_ARG(interp) \
, PARROT_ASSERT_ARG(self))
-#define ASSERT_ARGS_csr_set_pointer_keyed_int __attribute__unused__ int _ASSERT_ARGS_CHECK = (\
+#define ASSERT_ARGS_csr_set_pointer __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 = (\
@@ -848,33 +842,29 @@
* the result back to the caller. */
switch (PARROT_ARG_TYPE_MASK_MASK(arg_flags)) {
case PARROT_ARG_INTVAL:
- csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
- &(CTX_REG_INT(ctx, raw_index)));
- csr_push_integer(interp, call_object, PARROT_ARG_INTVAL);
+ csr_set_pointer(interp, call_object, returns_pos++,
+ &(CTX_REG_INT(ctx, raw_index)), PARROT_ARG_INTVAL);
break;
case PARROT_ARG_FLOATVAL:
- csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
- &(CTX_REG_NUM(ctx, raw_index)));
- csr_push_integer(interp, call_object, PARROT_ARG_FLOATVAL);
+ csr_set_pointer(interp, call_object, returns_pos++,
+ &(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_keyed_int(interp, call_object, returns_pos++,
- string_val);
+ csr_set_pointer(interp, call_object, returns_pos++,
+ string_val, PARROT_ARG_STRING);
}
else {
- csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
- &(CTX_REG_STR(ctx, raw_index)));
- csr_push_integer(interp, call_object, PARROT_ARG_STRING);
+ csr_set_pointer(interp, call_object, returns_pos++,
+ &(CTX_REG_STR(ctx, raw_index)), PARROT_ARG_STRING);
}
break;
case PARROT_ARG_PMC:
- csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
- &(CTX_REG_PMC(ctx, raw_index)));
- csr_push_integer(interp, call_object, PARROT_ARG_PMC);
+ csr_set_pointer(interp, call_object, returns_pos++,
+ &(CTX_REG_PMC(ctx, raw_index)), PARROT_ARG_PMC);
break;
default:
break;
@@ -933,24 +923,20 @@
* the result back to the caller. */
switch (type) {
case 'I':
- csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
- (void *)va_arg(args, INTVAL *));
- csr_push_integer(interp, call_object, PARROT_ARG_INTVAL);
+ csr_set_pointer(interp, call_object, returns_pos++,
+ (void *)va_arg(args, INTVAL *), PARROT_ARG_INTVAL);
break;
case 'N':
- csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
- (void *)va_arg(args, FLOATVAL *));
- csr_push_integer(interp, call_object, PARROT_ARG_FLOATVAL);
+ csr_set_pointer(interp, call_object, returns_pos++,
+ (void *)va_arg(args, FLOATVAL *), PARROT_ARG_FLOATVAL);
break;
case 'S':
- csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
- (void *)va_arg(args, STRING **));
- csr_push_integer(interp, call_object, PARROT_ARG_STRING);
+ csr_set_pointer(interp, call_object, returns_pos++,
+ (void *)va_arg(args, STRING **), PARROT_ARG_STRING);
break;
case 'P':
- csr_set_pointer_keyed_int(interp, call_object, returns_pos++,
- (void *)va_arg(args, PMC **));
- csr_push_integer(interp, call_object, PARROT_ARG_PMC);
+ csr_set_pointer(interp, call_object, returns_pos++,
+ (void *)va_arg(args, PMC **), PARROT_ARG_PMC);
break;
default:
Parrot_ex_throw_from_c_args(interp, NULL,
@@ -2962,24 +2948,27 @@
/*
-=item C<static void csr_set_pointer_keyed_int(PARROT_INTERP, PMC *self, INTVAL
-key, void *value)>
+=item C<static void csr_set_pointer(PARROT_INTERP, PMC *self, INTVAL key, void
+*value, INTVAL type)>
Sets the pointer at position key. 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.
+PMC, or STRING storage location. C<type> is type of pointer.
=cut
*/
static void
-csr_set_pointer_keyed_int(PARROT_INTERP, ARGIN(PMC *self), INTVAL key, ARGIN_NULLOK(void *value))
+csr_set_pointer(PARROT_INTERP, ARGIN(PMC *self), INTVAL key,
+ ARGIN_NULLOK(void *value), INTVAL type)
{
- ASSERT_ARGS(csr_set_pointer_keyed_int)
+ ASSERT_ARGS(csr_set_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);
@@ -2997,37 +2986,8 @@
else if (key >= size)
csr_reallocate_return_values(interp, self, key + 1);
- values[key] = value;
-}
-
-/*
-
-=item C<static void csr_push_integer(PARROT_INTERP, PMC *self, INTVAL type)>
-
-Set type of last pushed pointer.
-
-=cut
-
-*/
-
-static void
-csr_push_integer(PARROT_INTERP, ARGIN(PMC *self), INTVAL type)
-{
- ASSERT_ARGS(csr_push_integer)
- void **values;
- INTVAL idx;
-
- GETATTR_CallSignature_returns_size(interp, self, idx);
-
- /* last index is size - 1, of course */
- idx--;
-
- PARROT_ASSERT((type >= 0 && type < 4) || !"Wrong pointer type");
-
- GETATTR_CallSignature_returns_values(interp, self, values);
-
- values[idx] = INTVAL2PTR(void *,
- PTR2INTVAL(UNTAG_CELL(values[idx])) | type);
+ /* Tag pointer */
+ values[key] = INTVAL2PTR(void *, PTR2INTVAL(value) | type);
}
@@ -3224,6 +3184,7 @@
STRING *full_sig;
PMC *return_flags;
INTVAL return_flags_size;
+ INTVAL int_type;
Parrot_String return_flags_name = Parrot_str_new_constant(interp, "return_flags");
Parrot_String sig_name = Parrot_str_new_constant(interp, "signature");
@@ -3233,8 +3194,6 @@
Parrot_str_concat(interp, full_sig, Parrot_str_new_constant(interp, "->"), 0);
Parrot_str_concat(interp, full_sig, type, 0);
- csr_set_pointer_keyed_int(interp, sig_object, csr_returns_count(interp, sig_object), result);
-
/* Update returns_flag */
return_flags = VTABLE_get_attr_str(interp, sig_object, return_flags_name);
if (PMC_IS_NULL(return_flags)) {
@@ -3253,22 +3212,22 @@
case 'I':
VTABLE_set_integer_keyed_int(interp, return_flags, return_flags_size,
PARROT_ARG_INTVAL);
- csr_push_integer(interp, sig_object, PARROT_ARG_INTVAL);
+ int_type = PARROT_ARG_INTVAL;
break;
case 'N':
VTABLE_set_integer_keyed_int(interp, return_flags, return_flags_size,
PARROT_ARG_FLOATVAL);
- csr_push_integer(interp, sig_object, PARROT_ARG_FLOATVAL);
+ int_type = PARROT_ARG_FLOATVAL;
break;
case 'S':
VTABLE_set_integer_keyed_int(interp, return_flags, return_flags_size,
PARROT_ARG_STRING);
- csr_push_integer(interp, sig_object, PARROT_ARG_STRING);
+ int_type = PARROT_ARG_STRING;
break;
case 'P':
VTABLE_set_integer_keyed_int(interp, return_flags, return_flags_size,
PARROT_ARG_PMC);
- csr_push_integer(interp, sig_object, PARROT_ARG_PMC);
+ int_type = PARROT_ARG_PMC;
break;
default:
Parrot_ex_throw_from_c_args(interp, NULL,
@@ -3276,6 +3235,7 @@
"invalid signature string element!");
}
+ csr_set_pointer(interp, sig_object, csr_returns_count(interp, sig_object), result, int_type);
}
/*
More information about the parrot-commits
mailing list