=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/stackmachine.c,v retrieving revision 1.28 retrieving revision 1.32 diff -u -p -r1.28 -r1.32 --- OpenXM/src/kan96xx/Kan/stackmachine.c 2004/09/17 02:42:57 1.28 +++ OpenXM/src/kan96xx/Kan/stackmachine.c 2005/07/03 11:08:54 1.32 @@ -1,7 +1,9 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.27 2004/09/16 23:53:44 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.31 2005/06/16 05:07:23 takayama Exp $ */ /* stackmachin.c */ #include +#include +#include #include "datatype.h" #include "stackm.h" #include "extern.h" @@ -52,7 +54,7 @@ struct context *CurrentContextp = &StandardContext; struct context *PrimitiveContextp = &StandardContext; -static struct object ObjTmp; /* for poor compiler */ +static struct object ObjTmp = OINIT; /* for poor compiler */ int Calling_ctrlC_hook = 0; @@ -74,6 +76,7 @@ static strToInteger(char *); static power(int s,int i); static void pstack(void); static struct object executableStringToExecutableArray(char *str); +static int isThereExecutableArrayOnStack(int n); extern int SerialCurrent; extern int QuoteMode; @@ -94,13 +97,14 @@ struct object * newObject() r->tag = 0; (r->lc).ival = 0; (r->rc).ival = 0; + r->attr = NULL; return(r); } struct object newObjectArray(size) int size; { - struct object rob; + struct object rob = OINIT; struct object *op; if (size < 0) return(NullObject); if (size > 0) { @@ -322,7 +326,7 @@ int putPrimitiveFunction(str,number) char *str; int number; { - struct object ob; + struct object ob = OINIT; ob.tag = Soperator; ob.lc.ival = number; return(putSystemDictionary(str,ob)); @@ -464,11 +468,37 @@ struct object peek(k) } } +static int isThereExecutableArray(struct object ob) { + int n,i; + struct object otmp = OINIT; + if (ob.tag == SexecutableArray) return(1); + if (ob.tag == Sarray) { + n = getoaSize(ob); + for (i=0; i=0; i--) { @@ -651,7 +681,7 @@ struct object showSystemDictionary(int f) { int maxl; char format[1000]; int nl; - struct object rob; + struct object rob = OINIT; rob = NullObject; if (f != 0) { rob = newObjectArray(Sdp); @@ -724,7 +754,7 @@ static struct object executableStringToExecutableArray char *s; { struct tokens *tokenArray; - struct object ob; + struct object ob = OINIT; int i; int size; tokenArray = decomposeToTokens(s,&size); @@ -743,7 +773,7 @@ static struct object executableStringToExecutableArray /**************** stack machine **************************/ void scanner() { struct tokens token; - struct object ob; + struct object ob = OINIT; extern int Quiet; extern void ctrlC(); int tmp, status; @@ -929,7 +959,7 @@ void ctrlC(sig) int executeToken(token) struct tokens token; { - struct object ob; + struct object ob = OINIT; int primitive; int size; int status; @@ -997,6 +1027,11 @@ int executeToken(token) if (RestrictedMode) { if (UD_attr & ATTR_EXPORT) { localRestrictedMode_saved = RestrictedMode; RestrictedMode = 0; + if (isThereExecutableArrayOnStack(5)) { + int i; + for (i=0; i<5; i++) { (void) Kpop(); } + errorStackmachine("Executable array is on the argument stack (restricted mode). They are automatically removed.\n"); + } }else{ tracePushName(token.token); errorStackmachine("You cannot execute this function in restricted mode.\n"); @@ -1147,7 +1182,7 @@ KSexecuteString(s) char *s; { struct tokens token; - struct object ob; + struct object ob = OINIT; int tmp; extern int CatchCtrlC; int jval; @@ -1239,7 +1274,7 @@ KSexecuteString(s) KSdefineMacros() { struct tokens token; int tmp; - struct object ob; + struct object ob = OINIT; if (StandardMacros && (strlen(SMacros))) { token.kind = EXECUTABLE_STRING; token.tflag = 0; @@ -1260,7 +1295,7 @@ KSdefineMacros() { void KSstart() { struct tokens token; int tmp; - struct object ob; + struct object ob = OINIT; extern int Quiet; stackmachine_init(); KinitKan(); @@ -1314,7 +1349,7 @@ struct object KSpeek(k) { char *KSstringPop() { /* pop a string */ - struct object rob; + struct object rob = OINIT; rob = Kpop(); if (rob.tag == Sdollar) { return(rob.lc.str); @@ -1384,8 +1419,8 @@ struct object popErrorStack(void) { } char *popErrorStackByString(void) { - struct object obj; - struct object eobj; + struct object obj = OINIT; + struct object eobj = OINIT; eobj = popErrorStack(); if (ectag(eobj) != CLASSNAME_ERROR_PACKET) { return(NULL); @@ -1414,7 +1449,7 @@ int KScheckErrorStack(void) struct object KnewErrorPacket(int serial,int no,char *message) { - struct object obj; + struct object obj = OINIT; struct object *myop; char *s; /* Set extended tag. */ @@ -1436,7 +1471,7 @@ struct object KnewErrorPacket(int serial,int no,char * struct object KnewErrorPacketObj(struct object ob1) { - struct object obj; + struct object obj = OINIT; struct object *myop; char *s; /* Set extended tag. */ @@ -1535,8 +1570,8 @@ int KSstackPointer() { } struct object KSdupErrors() { - struct object rob; - struct object ob; + struct object rob = OINIT; + struct object ob = OINIT; int i; int n; int m;