OK, this might work. Please check before applying, as I might have been too tired to get the pointer stuff correct. -- Enzymes are things invented by biologists that explain things which otherwise require harder thinking. -- Jerome Lettvin
Index: lib/script/interp.c =================================================================== --- lib/script/interp.c (revision 361) +++ lib/script/interp.c (working copy) @@ -19,8 +19,6 @@ // an infinite loop #define INTERP_MAXINSTRUCTIONS 100000 - - /* The size of each opcode */ SDWORD aOpSize[] = { @@ -329,7 +327,7 @@ case OP_FUNC: //debug( LOG_SCRIPT, "-OP_FUNC" ); //debug( LOG_SCRIPT, "OP_FUNC: remember event %d, ip=%d", CurEvent, (ip + 2) ); - if(!RetStackRemember(CurEvent, *(ip + 2))) //Remember where to jump back later + if(!RetStackRemember(CurEvent, (ip + 2))) //Remember where to jump back later { debug( LOG_ERROR, "interpRunScript() - RetStackRemember() failed."); return FALSE; @@ -727,6 +725,7 @@ if(!IsRetStackEmpty()) //There was a caller function before this one { + RETSTACK_TYPE *retstack; //debug(LOG_SCRIPT, "GetCallDepth = %d", GetCallDepth()); //reset local vars (since trigger can't be called, only local vars of an event can be reset here) @@ -736,20 +735,14 @@ goto exit_with_error; } - if(!PopRetStack((UDWORD *)&ip)) //Pop return address + if (!PopRetStack(&retstack)) { - debug( LOG_ERROR, "interpRunScript() - PopRetStack(): failed to pop return adress."); + debug( LOG_ERROR, "interpRunScript() - PopRetStack() failed."); return FALSE; } + ip = retstack->address; + CurEvent = retstack->event; - //debug(LOG_SCRIPT, "Return adress = %d", ip); - - if(!PopRetStack(&CurEvent)) //Pop event index - { - debug( LOG_ERROR, "interpRunScript() - PopRetStack(): failed to pop return event index."); - return FALSE; - } - //debug( LOG_SCRIPT, "RETURNED TO CALLER EVENT %d", CurEvent ); //Set new boundries @@ -930,7 +923,7 @@ /* Call stack stuff */ -static UDWORD retStack[200]; //Primitive stack +static RETSTACK_TYPE retStack[100]; //Primitive stack static SDWORD retStackPos; //Current Position, always points to the last valid element void retStackReset(void) @@ -939,19 +932,18 @@ } //Remember current script execution adress -UDWORD RetStackRemember(UDWORD EvTrigIndex, UDWORD address) +BOOL RetStackRemember(UDWORD EvTrigIndex, UDWORD *address) { //DbgMsg("To remember: %d, %d, %d", EvTrigIndex, address, retStackPos); - if (retStackPos >= 200) + if (retStackPos >= 100) { debug( LOG_ERROR, "RetStackRemember() - return address stack is full"); return FALSE; //Stack full } - retStackPos = retStackPos + 2; - retStack[retStackPos - 1] = EvTrigIndex; //First store event index - retStack[retStackPos] = address; //current ip + retStack[++retStackPos].event = EvTrigIndex; //First store event index + retStack[retStackPos].address = address; //current ip //debug( LOG_SCRIPT, "RetStackRemember: ip=%d, event=%d", address, EvTrigIndex); @@ -964,18 +956,16 @@ return FALSE; } -BOOL PopRetStack(UDWORD *psVal) +BOOL PopRetStack(RETSTACK_TYPE **psVal) { - if(retStackPos < 0) + if (retStackPos < 0) { debug( LOG_ERROR, "PopRetStack: retStackPos < 0"); return FALSE; } - *psVal = retStack[retStackPos]; + *psVal = &retStack[retStackPos--]; - retStackPos = retStackPos - 1; - //debug( LOG_SCRIPT, "PopRetStack: val=%d", *psVal); return TRUE; @@ -983,5 +973,5 @@ SDWORD GetCallDepth(void) { - return (retStackPos + 1) / 2; + return (retStackPos + 1); } Index: lib/script/script.h =================================================================== --- lib/script/script.h (revision 361) +++ lib/script/script.h (working copy) @@ -20,6 +20,12 @@ SCR_NODEBUG, // Do not generate debug info } SCR_DEBUGTYPE; +typedef struct _retstack_type +{ + UDWORD event; + UDWORD *address; +} RETSTACK_TYPE; + // If this is defined we save out the compiled scripts #define SCRIPTTYPE SCR_DEBUGINFO @@ -61,10 +67,10 @@ * Return stack stuff */ extern void retStackReset(void); -extern UDWORD RetStackRemember(UDWORD EvTrigIndex, UDWORD address); +extern BOOL RetStackRemember(UDWORD EvTrigIndex, UDWORD *address); extern BOOL IsRetStackEmpty(void); -extern BOOL PopRetStack(UDWORD *psVal); +extern BOOL PopRetStack(RETSTACK_TYPE **psVal); extern SDWORD GetCallDepth(void); /***********************************************************************************
_______________________________________________ Warzone-dev mailing list Warzone-dev@gna.org https://mail.gna.org/listinfo/warzone-dev