Author: leo
Date: Thu Feb 9 03:44:02 2006
New Revision: 11480
Modified:
trunk/include/parrot/inter_call.h
trunk/src/pic.c
Log:
Argument passing cleanup 1
* Create a set of macros which hide the details of the signature PMC
and access to it
* use it in pic.c
Modified: trunk/include/parrot/inter_call.h
==============================================================================
--- trunk/include/parrot/inter_call.h (original)
+++ trunk/include/parrot/inter_call.h Thu Feb 9 03:44:02 2006
@@ -122,6 +122,14 @@ INTVAL set_retval_i(Interp*, int sig_ret
} \
} while (0)
+#define ASSERT_SIG_PMC(sig) \
+ assert(PObj_is_PMC_TEST(sig) && \
+ sig->vtable->base_type == enum_class_FixedIntegerArray)
+
+#define SIG_ELEMS(sig) PMC_int_val(sig)
+#define SIG_ARRAY(sig) (INTVAL*)PMC_data(sig)
+#define SIG_ITEM(sig, idx) (SIG_ARRAY(sig))[idx]
+
#endif /* PARROT_INTER_CALL_H_GUARD */
/*
Modified: trunk/src/pic.c
==============================================================================
--- trunk/src/pic.c (original)
+++ trunk/src/pic.c Thu Feb 9 03:44:02 2006
@@ -268,7 +268,7 @@ pass_int(Interp *interpreter, PMC *sig,
char *dest_base, void **dest)
{
INTVAL arg;
- int i, n = PMC_int_val(sig);
+ int i, n = SIG_ELEMS(sig);
for (i = 2 ; n; ++i, --n) {
arg = *(INTVAL *)(src_base + ((opcode_t*)src)[i]);
*(INTVAL *)(dest_base + ((opcode_t*)dest)[i])= arg;
@@ -281,7 +281,7 @@ pass_num(Interp *interpreter, PMC *sig,
char *dest_base, void **dest)
{
FLOATVAL arg;
- int i, n = PMC_int_val(sig);
+ int i, n = SIG_ELEMS(sig);
for (i = 2 ; n; ++i, --n) {
arg = *(FLOATVAL *)(src_base + ((opcode_t*)src)[i]);
*(FLOATVAL *)(dest_base + ((opcode_t*)dest)[i])= arg;
@@ -294,7 +294,7 @@ pass_str(Interp *interpreter, PMC *sig,
char *dest_base, void **dest)
{
STRING* arg;
- int i, n = PMC_int_val(sig);
+ int i, n = SIG_ELEMS(sig);
for (i = 2 ; n; ++i, --n) {
arg = *(STRING* *)(src_base + ((opcode_t*)src)[i]);
*(STRING* *)(dest_base + ((opcode_t*)dest)[i])= arg;
@@ -307,7 +307,7 @@ pass_pmc(Interp *interpreter, PMC *sig,
char *dest_base, void **dest)
{
PMC* arg;
- int i, n = PMC_int_val(sig);
+ int i, n = SIG_ELEMS(sig);
for (i = 2 ; n; ++i, --n) {
arg = *(PMC* *)(src_base + ((opcode_t*)src)[i]);
*(PMC* *)(dest_base + ((opcode_t*)dest)[i])= arg;
@@ -320,15 +320,14 @@ pass_mixed(Interp *interpreter, PMC *sig
char *dest_base, void **dest)
{
PMC* argP;
- int i, n = PMC_int_val(sig);
+ int i, n = SIG_ELEMS(sig);
INTVAL *bitp, bits;
INTVAL argI;
FLOATVAL argN;
STRING *argS;
- assert(PObj_is_PMC_TEST(sig));
- assert(sig->vtable->base_type == enum_class_FixedIntegerArray);
- bitp = PMC_data(sig);
+ ASSERT_SIG_PMC(sig);
+ bitp = SIG_ARRAY(sig);
for (i = 2 ; n; ++i, --n) {
bits = *bitp++;
switch (bits) {
@@ -380,20 +379,18 @@ pic_check_sig(Interp *interpreter, PMC *
{
int i, n, t0, t1, t2;
- assert(PObj_is_PMC_TEST(sig1));
- assert(sig1->vtable->base_type == enum_class_FixedIntegerArray);
- assert(PObj_is_PMC_TEST(sig2));
- assert(sig2->vtable->base_type == enum_class_FixedIntegerArray);
- n = VTABLE_elements(interpreter, sig1);
- if (n != VTABLE_elements(interpreter, sig2))
+ ASSERT_SIG_PMC(sig1);
+ ASSERT_SIG_PMC(sig2);
+ n = SIG_ELEMS(sig1);
+ if (n != SIG_ELEMS(sig2))
return -1;
if (!n) {
*type = 0;
return 0;
}
for (i = 0; i < n; ++i) {
- t1 = VTABLE_get_integer_keyed_int(interpreter, sig1, i);
- t2 = VTABLE_get_integer_keyed_int(interpreter, sig2, i);
+ t1 = SIG_ITEM(sig1, i);
+ t2 = SIG_ITEM(sig2, i);
if (!i) {
t0 = t1 & PARROT_ARG_TYPE_MASK;
*type = t0;
@@ -451,7 +448,7 @@ is_pic_param(Interp *interpreter, void *
return 0;
}
else {
- if (VTABLE_elements(interpreter, sig1) == 0) {
+ if (SIG_ELEMS(sig1) == 0) {
sig2 = NULL;
type = n = 0;
}
@@ -552,9 +549,8 @@ is_pic_func(Interp *interpreter, void **
base = (char*)interpreter->ctx.bp.regs_i;
ctx = CONTEXT(interpreter->ctx);
sig = (PMC*)(pc[1]);
- assert(PObj_is_PMC_TEST(sig));
- assert(sig->vtable->base_type == enum_class_FixedIntegerArray);
- n = VTABLE_elements(interpreter, sig);
+ ASSERT_SIG_PMC(sig);
+ n = SIG_ELEMS(sig);
interpreter->current_args = (opcode_t*)pc + ctx->pred_offset;
pc += 2 + n;
op = (opcode_t*)pc + ctx->pred_offset;