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
[email protected]
https://mail.gna.org/listinfo/warzone-dev