On Sun, Sep 30, 2001 at 11:31:21AM -0400, Gregor N. Purdy wrote: > And, BTW, the current PackFile_Constant type isn't using a union. > It has separate members for each type of constant. This could be > changed once things are working. There's probably a few other > things that could use some cleanup/refinement too, such as > documentation.
Here is a patch for macros for accessing constants from ops. This uses (INT|STR|NUM)_PCONST(i) for the relevant types. Best to avoid filling opcode definitions with manual structure dereferences. /* SET Nx, CONSTANT */ AUTO_OP set_n_nc { NUM_REG(P1) = PCONST(P2)->number; } is now /* SET Nx, CONSTANT */ AUTO_OP set_n_nc { NUM_REG(P1) = NUM_PCONST(P2); } -- Jason
Index: basic_opcodes.ops =================================================================== RCS file: /home/perlcvs/parrot/basic_opcodes.ops,v retrieving revision 1.27 diff -u -r1.27 basic_opcodes.ops --- basic_opcodes.ops 2001/09/30 20:25:22 1.27 +++ basic_opcodes.ops 2001/10/01 03:25:53 @@ -191,7 +191,7 @@ /* SET Nx, CONSTANT */ AUTO_OP set_n_nc { - NUM_REG(P1) = PCONST(P2)->number; + NUM_REG(P1) = NUM_PCONST(P2); } /* SET Nx, Nx */ @@ -232,7 +232,7 @@ /* EQ Nx, CONSTANT, EQ_BRANCH */ MANUAL_OP eq_nc_ic { - if (NUM_REG(P1) == PCONST(P2)->number) { + if (NUM_REG(P1) == NUM_PCONST(P2)) { RETURN(P3); } } @@ -246,7 +246,7 @@ /* NE Nx, CONSTANT, NE_BRANCH */ MANUAL_OP ne_nc_ic { - if (NUM_REG(P1) != PCONST(P2)->number) { + if (NUM_REG(P1) != NUM_PCONST(P2)) { RETURN(P3); } } @@ -260,7 +260,7 @@ /* LT Nx, CONSTANT, LT_BRANCH */ MANUAL_OP lt_nc_ic { - if (NUM_REG(P1) < PCONST(P2)->number) { + if (NUM_REG(P1) < NUM_PCONST(P2)) { RETURN(P3); } } @@ -274,7 +274,7 @@ /* LE Nx, CONSTANT, LE_BRANCH */ MANUAL_OP le_nc_ic { - if (NUM_REG(P1) <= PCONST(P2)->number) { + if (NUM_REG(P1) <= NUM_PCONST(P2)) { RETURN(P3); } } @@ -288,7 +288,7 @@ /* GT Nx, CONSTANT, GT_BRANCH */ MANUAL_OP gt_nc_ic { - if (NUM_REG(P1) > PCONST(P2)->number) { + if (NUM_REG(P1) > NUM_PCONST(P2)) { RETURN(P3); } } @@ -302,7 +302,7 @@ /* GE Nx, CONSTANT, GE_BRANCH */ MANUAL_OP ge_nc_ic { - if (NUM_REG(P1) >= PCONST(P2)->number) { + if (NUM_REG(P1) >= NUM_PCONST(P2)) { RETURN(P3); } } @@ -326,7 +326,7 @@ /* PRINT nc */ AUTO_OP print_nc { - printf("%f", PCONST(P1)->number); + printf("%f", NUM_PCONST(P1)); } /* INC Nx */ @@ -336,7 +336,7 @@ /* INC Nx, nnn */ AUTO_OP inc_n_nc { - NUM_REG(P1) += PCONST(P2)->number; + NUM_REG(P1) += NUM_PCONST(P2); } /* DEC Nx */ @@ -346,7 +346,7 @@ /* DEC Nx, nnn */ AUTO_OP dec_n_nc { - NUM_REG(P1) -= PCONST(P2)->number; + NUM_REG(P1) -= NUM_PCONST(P2); } /* ITON Nx, Iy */ @@ -425,7 +425,7 @@ /* SET Sx, CONSTANT */ AUTO_OP set_s_sc { - STR_REG(P1) = PCONST(P2)->string; + STR_REG(P1) = STR_PCONST(P2); } /* PRINT Sx */ @@ -436,7 +436,7 @@ /* PRINT sc */ AUTO_OP print_sc { - STRING *s = PCONST(P1)->string; + STRING *s = STR_PCONST(P1); IV l = string_length(s); printf("%.*s",(int)l, (char *)s->bufstart); } Index: interpreter.c =================================================================== RCS file: /home/perlcvs/parrot/interpreter.c,v retrieving revision 1.20 diff -u -r1.20 interpreter.c --- interpreter.c 2001/09/26 18:13:50 1.20 +++ interpreter.c 2001/10/01 03:25:53 @@ -30,8 +30,8 @@ const char * fp_data; IV fp_len; - fp_data = PCONST(0)->string->bufstart; - fp_len = PCONST(0)->string->buflen; + fp_data = STR_PCONST(0)->bufstart; + fp_len = STR_PCONST(0)->buflen; if (strncmp(OPCODE_FINGERPRINT, fp_data, fp_len)) { fprintf(stderr, "Error: Opcode table fingerprint in bytecode does not match interpreter!\n"); Index: include/parrot/interpreter.h =================================================================== RCS file: /home/perlcvs/parrot/include/parrot/interpreter.h,v retrieving revision 1.5 diff -u -r1.5 interpreter.h --- include/parrot/interpreter.h 2001/09/26 18:13:50 1.5 +++ include/parrot/interpreter.h 2001/10/01 03:25:53 @@ -47,6 +47,10 @@ #define PCONST(i) PF_CONST(interpreter->code, (i)) #define PNCONST PF_NCONST(interpreter->code) +#define INT_PCONST(i) PFC_INT(PCONST(i)) +#define NUM_PCONST(i) PFC_NUM(PCONST(i)) +#define STR_PCONST(i) PFC_STR(PCONST(i)) + struct Parrot_Interp * make_interpreter(); Index: include/parrot/packfile.h =================================================================== RCS file: /home/perlcvs/parrot/include/parrot/packfile.h,v retrieving revision 1.4 diff -u -r1.4 packfile.h --- include/parrot/packfile.h 2001/09/30 20:25:24 1.4 +++ include/parrot/packfile.h 2001/10/01 03:25:53 @@ -25,6 +25,10 @@ #define PFC_NUMBER 'n' #define PFC_STRING 's' +#define PFC_INT(pfc) (pfc)->integer +#define PFC_NUM(pfc) (pfc)->number +#define PFC_STR(pfc) (pfc)->string + struct PackFile_Constant { IV type; IV integer;