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

Reply via email to