On Mon, Mar 10, 2008 at 8:17 PM, Tony Balinski <[EMAIL PROTECTED]> wrote:
> If you have another idea, I'm open to suggestions!
Access the values like in the GLOBAL_SYM case. See attached patch.
Bert
>
> Tony
---
source/interpret.c | 47 ++++++++++++-----------------------------------
1 file changed, 12 insertions(+), 35 deletions(-)
diff --quilt old/source/interpret.c new/source/interpret.c
--- old/source/interpret.c
+++ new/source/interpret.c
@@ -208,11 +208,11 @@ static int (*OpFns[N_OPS])() = {returnNo
assign, callSubroutine, fetchRetVal, branch, branchTrue, branchFalse,
branchNever, arrayRef, arrayAssign, beginArrayIter, arrayIter, inArray,
deleteArrayElement, pushArraySymVal,
arrayRefAndAssignSetup, pushArgVal, pushArgCount, pushArgArray};
-/* Stack-> symN-sym0(FP), argArray, nArgs, oldFP, retPC, argN-arg1, next, ...
*/
+/* Stack-> [FrapeP], argArray, nArgs, oldFP, retPC, argN-arg1, next, ... */
#define FP_ARG_ARRAY_CACHE_INDEX (-1)
#define FP_ARG_COUNT_INDEX (-2)
#define FP_OLD_FP_INDEX (-3)
#define FP_RET_PC_INDEX (-4)
#define FP_TO_ARGS_DIST (4) /* should be 0 - (above index) */
@@ -221,12 +221,10 @@ static int (*OpFns[N_OPS])() = {returnNo
#define FP_GET_ARG_COUNT(xFrameP) (FP_GET_ITEM(xFrameP,
FP_ARG_COUNT_INDEX).val.n)
#define FP_GET_OLD_FP(xFrameP) ((FP_GET_ITEM(xFrameP,
FP_OLD_FP_INDEX)).val.dataval)
#define FP_GET_RET_PC(xFrameP) ((FP_GET_ITEM(xFrameP,
FP_RET_PC_INDEX)).val.inst)
#define FP_ARG_START_INDEX(xFrameP) (-(FP_GET_ARG_COUNT(xFrameP) +
FP_TO_ARGS_DIST))
#define FP_GET_ARG_N(xFrameP,xN) (FP_GET_ITEM(xFrameP, xN +
FP_ARG_START_INDEX(xFrameP)))
-#define FP_GET_SYM_N(xFrameP,xN) (FP_GET_ITEM(xFrameP, xN))
-#define FP_GET_SYM_VAL(xFrameP,xSym) (FP_GET_SYM_N(xFrameP, xSym->value.val.n))
/*
** Initialize macro language global variables. Must be called before
** any macros are even parsed, because the parser uses action routine
** symbols to comprehend hyphenated names.
@@ -287,25 +285,20 @@ void BeginCreatingProgram(void)
** program must be freed with FreeProgram.
*/
Program *FinishCreatingProgram(void)
{
Program *newProg;
- int progLen, fpOffset = 0;
+ int progLen;
Symbol *s;
newProg = (Program *)XtMalloc(sizeof(Program));
progLen = ((char *)ProgP) - ((char *)Prog);
newProg->code = (Inst *)XtMalloc(progLen);
memcpy(newProg->code, Prog, progLen);
newProg->localSymList = LocalSymList;
LocalSymList = NULL;
- /* Local variables' values are stored on the stack. Here we assign
- frame pointer offsets to them. */
- for (s = newProg->localSymList; s != NULL; s = s->next)
- s->value.val.n = fpOffset++;
-
DISASM(newProg->code, ProgP - Prog);
return newProg;
}
@@ -500,14 +493,13 @@ int ExecuteMacro(WindowInfo *window, Pro
*(context->stackP++) = noValue; /* cached arg array */
context->frameP = context->stackP;
- /* Initialize and make room on the stack for local variables */
+ /* Initialize local variables */
for (s = prog->localSymList; s != NULL; s = s->next) {
- FP_GET_SYM_VAL(context->frameP, s) = noValue;
- context->stackP++;
+ s->value = noValue;
}
/* Begin execution, return on error or preemption */
return ContinueMacro(context, result, msg);
}
@@ -600,12 +592,11 @@ void RunMacroAsSubrCall(Program *prog)
*(StackP++) = noValue; /* cached arg array */
FrameP = StackP;
PC = prog->code;
for (s = prog->localSymList; s != NULL; s = s->next) {
- FP_GET_SYM_VAL(FrameP, s) = noValue;
- StackP++;
+ s->value = noValue;
}
}
void FreeRestartData(RestartData *context)
{
@@ -1152,13 +1143,11 @@ static int pushSymVal(void)
STACKDUMP(0, 3);
s = PC->sym;
PC++;
- if (s->type == LOCAL_SYM) {
- *StackP = FP_GET_SYM_VAL(FrameP, s);
- } else if (s->type == GLOBAL_SYM || s->type == CONST_SYM) {
+ if (s->type == LOCAL_SYM || s->type == GLOBAL_SYM || s->type == CONST_SYM)
{
*StackP = s->value;
} else if (s->type == ARG_SYM) {
nArgs = FP_GET_ARG_COUNT(FrameP);
argNum = s->value.val.n;
if (argNum >= nArgs) {
@@ -1268,14 +1257,11 @@ static int pushArraySymVal(void)
sym = PC->sym;
PC++;
initEmpty = PC->value;
PC++;
- if (sym->type == LOCAL_SYM) {
- dataPtr = &FP_GET_SYM_VAL(FrameP, sym);
- }
- else if (sym->type == GLOBAL_SYM) {
+ if (sym->type == LOCAL_SYM || sym->type == GLOBAL_SYM) {
dataPtr = &sym->value;
}
else {
return execError("assigning to non-lvalue array or non-array: %s",
sym->name);
}
@@ -1330,16 +1316,11 @@ static int assign(void)
}
if (StackP == TheStack) {
return execError(StackUnderflowMsg, "");
}
--StackP;
- if (sym->type == LOCAL_SYM) {
- dataPtr = &FP_GET_SYM_VAL(FrameP, sym);
- }
- else {
- dataPtr = &sym->value;
- }
+ dataPtr = &sym->value;
if (StackP->tag == ARRAY_TAG) {
ArrayCopy(dataPtr, StackP);
}
else {
*dataPtr = *StackP;
@@ -1935,12 +1916,11 @@ static int callSubroutine(void)
FrameP = StackP;
prog = (Program *)sym->value.val.str.rep;
PC = prog->code;
for (s = prog->localSymList; s != NULL; s = s->next) {
- FP_GET_SYM_VAL(FrameP, s) = noValue;
- StackP++;
+ s->value = noValue;
}
return STAT_OK;
}
/*
@@ -2598,11 +2578,11 @@ static int beginArrayIter(void)
PC++;
POP(arrayVal)
if (iterator->type == LOCAL_SYM) {
- iteratorValPtr = &FP_GET_SYM_VAL(FrameP, iterator);
+ iteratorValPtr = &iterator->value;
}
else {
return(execError("bad temporary iterator: %s", iterator->name));
}
@@ -2654,23 +2634,20 @@ static int arrayIter(void)
iterator = PC->sym;
PC++;
branchAddr = PC + PC->value;
PC++;
- if (item->type == LOCAL_SYM) {
- itemValPtr = &FP_GET_SYM_VAL(FrameP, item);
- }
- else if (item->type == GLOBAL_SYM) {
+ if (item->type == LOCAL_SYM || item->type == GLOBAL_SYM) {
itemValPtr = &(item->value);
}
else {
return(execError("can't assign to: %s", item->name));
}
itemValPtr->tag = NO_TAG;
if (iterator->type == LOCAL_SYM) {
- iteratorValPtr = &FP_GET_SYM_VAL(FrameP, iterator);
+ iteratorValPtr = &iterator->value;
}
else {
return(execError("bad temporary iterator: %s", iterator->name));
}
--
NEdit Develop mailing list - [email protected]
http://www.nedit.org/mailman/listinfo/develop