# New Ticket Created by Matt Fowles # Please include the string: [perl #24913] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=24913 >
All~ This patch is similar in concept to the first one I sent; however, it is based off of the new register.c. I did not fix the manifest because I don't know how. So that needs to be done. Matt
Index: register.c =================================================================== RCS file: /cvs/public/parrot/src/register.c,v retrieving revision 1.37 diff -u -r1.37 register.c --- register.c 13 Jan 2004 11:03:19 -0000 1.37 +++ register.c 15 Jan 2004 04:40:04 -0000 @@ -173,193 +173,6 @@ } } -/*=for api register Parrot_push_i - pushes a new integer register frame onto the corresponding frame stack -*/ -void -Parrot_push_i(struct Parrot_Interp *interpreter, void *where) -{ - struct RegisterChunkBuf* top; - top = regstack_push_entry(interpreter, &interpreter->ctx.int_reg_stack); - memcpy(&((struct IRegChunkBuf*)top->data.bufstart)-> - IRegFrame[top->used-1].registers, - where, sizeof(struct IRegFrame)); -} - -/*=for api register Parrot_pop_i - pops an integer register frame from the corresponding frame stack -*/ -void -Parrot_pop_i(struct Parrot_Interp *interpreter, void *where) -{ - struct RegisterChunkBuf* top = interpreter->ctx.int_reg_stack.top; - /* Do we even have anything? */ - if (top->used > 0) { - memcpy(where, - &((struct IRegChunkBuf*)top->data.bufstart)-> - IRegFrame[top->used-1], - sizeof(struct IRegFrame)); - regstack_pop_entry(interpreter, &interpreter->ctx.int_reg_stack); - } - /* Nope. So pitch a fit */ - else { - internal_exception(NO_REG_FRAMES, "No more I register frames to pop!"); - } -} - -/*=for api register Parrot_clear_i - sets each integer register in the current set to 0 -*/ -void -Parrot_clear_i(struct Parrot_Interp *interpreter) -{ - int i; - for (i = 0; i < NUM_REGISTERS; i++) { - interpreter->int_reg.registers[i] = 0; - } -} - -/*=for api register Parrot_push_s - pushes a new string register frame onto the corresponding frame stack -*/ -void -Parrot_push_s(struct Parrot_Interp *interpreter, void *where) -{ - struct RegisterChunkBuf* top; - top = regstack_push_entry(interpreter, &interpreter->ctx.string_reg_stack); - memcpy(&((struct SRegChunkBuf*)top->data.bufstart)-> - SRegFrame[top->used-1].registers, - where, sizeof(struct SRegFrame)); -} - -/*=for api register Parrot_pop_s - pops a string register frame from the corresponding frame stack -*/ -void -Parrot_pop_s(struct Parrot_Interp *interpreter, void *where) -{ - struct RegisterChunkBuf* top = interpreter->ctx.string_reg_stack.top; - /* Do we even have anything? */ - if (top->used > 0) { - struct SRegFrame* irf = &((struct SRegChunkBuf*)top->data.bufstart)-> - SRegFrame[top->used-1]; - memcpy(where, - &irf->registers, - sizeof(struct SRegFrame)); - regstack_pop_entry(interpreter, &interpreter->ctx.string_reg_stack); - } - /* Nope. So pitch a fit */ - else { - internal_exception(NO_REG_FRAMES, "No more S register frames to pop!"); - } -} - -/*=for api register Parrot_clear_s - sets each string register in the current set to NULL -*/ -void -Parrot_clear_s(struct Parrot_Interp *interpreter) -{ - int i; - for (i = 0; i < NUM_REGISTERS; i++) { - interpreter->string_reg.registers[i] = NULL; - } -} - -/*=for api register Parrot_push_n - pushes a new numeric register frame onto the corresponding frame stack -*/ -void -Parrot_push_n(struct Parrot_Interp *interpreter, void *where) -{ - struct RegisterChunkBuf* top; - top = regstack_push_entry(interpreter, &interpreter->ctx.num_reg_stack); - memcpy(&((struct NRegChunkBuf*)top->data.bufstart)-> - NRegFrame[top->used-1].registers, - where, sizeof(struct NRegFrame)); -} - -/*=for api register Parrot_pop_n - pops a numeric register frame from the corresponding frame stack -*/ -void -Parrot_pop_n(struct Parrot_Interp *interpreter, void *where) -{ - struct RegisterChunkBuf* top = interpreter->ctx.num_reg_stack.top; - /* Do we even have anything? */ - if (top->used > 0) { - struct NRegFrame* irf = &((struct NRegChunkBuf*)top->data.bufstart)-> - NRegFrame[top->used-1]; - memcpy(where, - &irf->registers, - sizeof(struct NRegFrame)); - regstack_pop_entry(interpreter, &interpreter->ctx.num_reg_stack); - } - /* Nope. So pitch a fit */ - else { - internal_exception(NO_REG_FRAMES, "No more N register frames to pop!"); - } -} - -/*=for api register Parrot_clear_n - sets each numeric register in the current set to 0.0 -*/ -void -Parrot_clear_n(struct Parrot_Interp *interpreter) -{ - int i; - for (i = 0; i < NUM_REGISTERS; i++) { - interpreter->num_reg.registers[i] = 0.0; - } -} - -/*=for api register Parrot_push_p - pushes a new PMC register frame onto the corresponding frame stack -*/ -void -Parrot_push_p(struct Parrot_Interp *interpreter, void *where) -{ - struct RegisterChunkBuf* top; - top = regstack_push_entry(interpreter, &interpreter->ctx.pmc_reg_stack); - memcpy(&((struct PRegChunkBuf*)top->data.bufstart)-> - PRegFrame[top->used-1].registers, - where, sizeof(struct PRegFrame)); -} - -/*=for api register Parrot_pop_p - pops a PMC register frame from the corresponding frame stack -*/ -void -Parrot_pop_p(struct Parrot_Interp *interpreter, void *where) -{ - struct RegisterChunkBuf* top = interpreter->ctx.pmc_reg_stack.top; - /* Do we even have anything? */ - if (top->used > 0) { - struct PRegFrame* irf = &((struct PRegChunkBuf*)top->data.bufstart)-> - PRegFrame[top->used-1]; - memcpy(where, - &irf->registers, - sizeof(struct PRegFrame)); - regstack_pop_entry(interpreter, &interpreter->ctx.pmc_reg_stack); - } - /* Nope. So pitch a fit */ - else { - internal_exception(NO_REG_FRAMES, "No more P register frames to pop!"); - } -} - -/*=for api register Parrot_clear_p - sets each pmc register in the current set to NULL -*/ -void -Parrot_clear_p(struct Parrot_Interp *interpreter) -{ - int i; - for (i = 0; i < NUM_REGISTERS; i++) { - interpreter->pmc_reg.registers[i] = PMCNULL; - } -} - /*=for api register Parrot_push_on_stack pushes something on the parrot stack */ @@ -380,6 +193,51 @@ UNUSED(thing); UNUSED(type); } + +#define REG_PUSH Parrot_push_i +#define REG_POP Parrot_pop_i +#define REG_CLEAR Parrot_clear_i +#define REG_STACK int_reg_stack +#define REG_TYPE int_reg +#define REG_CHUNK_BUF IRegChunkBuf +#define REG_FRAME IRegFrame +#define REG_EXCEPTION_STRING "No more I register frames to pop!" +#define REG_NULL 0 +#include "generic_register.c" + +#define REG_PUSH Parrot_push_s +#define REG_POP Parrot_pop_s +#define REG_CLEAR Parrot_clear_s +#define REG_STACK string_reg_stack +#define REG_TYPE string_reg +#define REG_CHUNK_BUF SRegChunkBuf +#define REG_FRAME SRegFrame +#define REG_EXCEPTION_STRING "No more S register frames to pop!" +#define REG_NULL NULL +#include "generic_register.c" + +#define REG_PUSH Parrot_push_n +#define REG_POP Parrot_pop_n +#define REG_CLEAR Parrot_clear_n +#define REG_STACK num_reg_stack +#define REG_TYPE num_reg +#define REG_CHUNK_BUF NRegChunkBuf +#define REG_FRAME NRegFrame +#define REG_EXCEPTION_STRING "No more N register frames to pop!" +#define REG_NULL 0.0 +#include "generic_register.c" + +#define REG_PUSH Parrot_push_p +#define REG_POP Parrot_pop_p +#define REG_CLEAR Parrot_clear_p +#define REG_STACK pmc_reg_stack +#define REG_TYPE pmc_reg +#define REG_CHUNK_BUF PRegChunkBuf +#define REG_FRAME PRegFrame +#define REG_EXCEPTION_STRING "No more P register frames to pop!" +#define REG_NULL PMCNULL +#include "generic_register.c" + /* * Local variables: --- /dev/null 2003-12-20 00:23:52.000000000 -0500 +++ generic_register.c 2004-01-14 20:04:32.000000000 -0500 @@ -0,0 +1,81 @@ +/* generic_register.c + * Copyright: 2001-2003 The Perl Foundation. All Rights Reserved. + * CVS Info + * $Id: register.c,v 1.37 2004/01/14 11:03:19 Matt Fowles Exp $ + * Overview: + * This the generalized register handling routines, it uses macros + * to define the things that are not common to all of the register + * stacks, and then undefines the macros at the end of the file. + * + * Uage: + * #define REG_PUSH Parrot_push_p + * #define REG_POP Parrot_pop_p + * #define REG_CLEAR Parrot_clear_p + * #define REG_STACK pmc_reg_stack + * #define REG_TYPE pmc_reg + * #define REG_CHUNK_BUF PRegChunkBuf + * #define REG_FRAME PRegFrame + * #define REG_EXCEPTION_STRING "No more P register frames to pop!" + * #define REG_NULL PMCNULL + * #include "generic_register.c" + * + * Data Structure and Algorithms: + * History: + * Notes: + * References: + */ + +#include "parrot/parrot.h" + + +/*=for api register REG_PUSH + pushes a new register frame onto the corresponding frame stack +*/ +void +REG_PUSH(struct Parrot_Interp *interpreter, void *where) +{ + struct RegisterChunkBuf* top; + top = regstack_push_entry(interpreter, &interpreter->ctx.REG_STACK); + memcpy(&((struct REG_CHUNK_BUF*)top->data.bufstart)-> + REG_FRAME[top->used-1].registers, + where, + sizeof(struct REG_FRAME)); +} + +/*=for api register REG_POP + pops a register frame from the corresponding frame stack +*/ +void +REG_POP(struct Parrot_Interp *interpreter, void *where) +{ + struct RegisterChunkBuf* top = interpreter->ctx.REG_STACK.top; + /* Do we even have anything? */ + if (top->used > 0) { + memcpy(where, + &((struct REG_CHUNK_BUF*)top->data.bufstart)-> + REG_FRAME[top->used-1].registers, + sizeof(struct REG_FRAME)); + regstack_pop_entry(interpreter, &interpreter->ctx.REG_STACK); + } + /* Nope. So pitch a fit */ + else { + internal_exception(NO_REG_FRAMES, REG_EXCEPTION_STRING); + } +} + +/*=for api register REG_CLEAR + sets each register in the current set to REG_NULL +*/ +void +REG_CLEAR(struct Parrot_Interp *interpreter) +{ + int i; + for (i = 0; i < NUM_REGISTERS; i++) { + interpreter->REG_TYPE.registers[i] = REG_NULL; + } +} + +#undef REG_PUSH +#undef REG_POP +#undef REG_CLEAR +#undef REG_STACK +#undef REG_TYPE +#undef REG_CHUNK_BUF +#undef REG_FRAME +#undef REG_EXCEPTION_STRING +#undef REG_NULL + +/* + * Local variables: + * c-indentation-style: bsd + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * + * vim: expandtab shiftwidth=4: +*/