=================================================================== RCS file: /home/cvs/OpenXM/src/kan96xx/Kan/stackmachine.c,v retrieving revision 1.30 retrieving revision 1.39 diff -u -p -r1.30 -r1.39 --- OpenXM/src/kan96xx/Kan/stackmachine.c 2005/06/09 04:47:16 1.30 +++ OpenXM/src/kan96xx/Kan/stackmachine.c 2015/10/08 11:49:37 1.39 @@ -1,7 +1,9 @@ -/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.29 2004/09/19 00:47:47 takayama Exp $ */ +/* $OpenXM: OpenXM/src/kan96xx/Kan/stackmachine.c,v 1.38 2015/09/29 01:52:14 takayama Exp $ */ /* stackmachin.c */ #include +#include +#include #include "datatype.h" #include "stackm.h" #include "extern.h" @@ -10,6 +12,15 @@ #include #include +/* The msys2 seems to make a buffer overflow of EnvOfStackmachine[]. +The code +[(x) ring_of_differential_operators 11] define_ring +( Dx*(x+Dx) ) /ff set +causes the segfault because Mp_zero is borken. Is it a bug of msys2? +Anyway, the following definition seems to be a workaround. 2015.09 +Singnals do not work properly on msys2. (gcc -dM -E ... to see macros defs) +See stackm.h +*/ /* #define OPERAND_STACK_SIZE 2000 */ #define OPERAND_STACK_SIZE 30000 @@ -52,7 +63,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; @@ -87,6 +98,10 @@ int OXlockSaved = 0; char *UD_str; int UD_attr; +struct object *MsgStackTraceInArrayp = NULL; +char *MsgStackTrace = NULL; +char *MsgSourceTrace = NULL; + struct object * newObject() { struct object *r; @@ -102,7 +117,7 @@ struct object * newObject() struct object newObjectArray(size) int size; { - struct object rob; + struct object rob = OINIT; struct object *op; if (size < 0) return(NullObject); if (size > 0) { @@ -324,7 +339,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)); @@ -468,7 +483,7 @@ struct object peek(k) static int isThereExecutableArray(struct object ob) { int n,i; - struct object otmp; + struct object otmp = OINIT; if (ob.tag == SexecutableArray) return(1); if (ob.tag == Sarray) { n = getoaSize(ob); @@ -484,7 +499,7 @@ static int isThereExecutableArray(struct object ob) { } static int isThereExecutableArrayOnStack(int n) { int i; - struct object ob; + struct object ob = OINIT; for (i=0; i=0; i--) { @@ -679,7 +694,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); @@ -752,7 +767,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); @@ -771,7 +786,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; @@ -786,9 +801,9 @@ void scanner() { initSystemDictionary(); #if defined(__CYGWIN__) - if (sigsetjmp(EnvOfStackMachine,1)) { + if (MYSIGSETJMP(EnvOfStackMachine,1)) { #else - if (setjmp(EnvOfStackMachine)) { + if (MYSETJMP(EnvOfStackMachine)) { #endif /* do nothing in the case of error */ fprintf(stderr,"An error or interrupt in reading macros, files and command strings.\n"); @@ -850,9 +865,9 @@ void scanner() { for (;;) { #if defined(__CYGWIN__) - if (jval=sigsetjmp(EnvOfStackMachine,1)) { + if (jval=MYSIGSETJMP(EnvOfStackMachine,1)) { #else - if (jval=setjmp(EnvOfStackMachine)) { + if (jval=MYSETJMP(EnvOfStackMachine)) { #endif /* *** The following does not work properly. **** if (jval == 2) { @@ -948,16 +963,16 @@ void ctrlC(sig) getokenSM(INIT); /* It might fix the bug above. 1992/11/14 */ signal(SIGINT,ctrlC); #if defined(__CYGWIN__) - siglongjmp(EnvOfStackMachine,2); + MYSIGLONGJMP(EnvOfStackMachine,2); #else - longjmp(EnvOfStackMachine,2); /* returns 2 for ctrl-C */ + MYLONGJMP(EnvOfStackMachine,2); /* returns 2 for ctrl-C */ #endif } int executeToken(token) struct tokens token; { - struct object ob; + struct object ob = OINIT; int primitive; int size; int status; @@ -1059,21 +1074,24 @@ int executeToken(token) return(0); /* normal exit.*/ } } - if (WarningMessageMode == 1 || WarningMessageMode == 2) { + { char tmpc[1024]; if (strlen(token.token) < 900) { - sprintf(tmpc,"\n%%Warning: The identifier <<%s>> is not in the system dictionary\n%% nor in the user dictionaries. Push NullObject.\n",token.token); - }else {strcpy(tmpc,"Warning: identifier is not in the dictionaries.");} - pushErrorStack(KnewErrorPacket(SerialCurrent,-1,tmpc)); + sprintf(tmpc,"\n>>Warning: The identifier <<%s>> is not in the system dictionary\n>> nor in the user dictionaries. Push NullObject.\n",token.token); + }else {strcpy(tmpc,"\n>>Warning: identifier is not in the dictionaries.\n");} + /* do not use %% in a string. tmpc will be used as fprintf(stderr,tmpc); */ + if (WarningMessageMode == 1 || WarningMessageMode == 2) { + pushErrorStack(KnewErrorPacket(SerialCurrent,-1,tmpc)); + } + if (WarningMessageMode != 1) { + fprintf(Fstack,"%s",tmpc); + /*fprintf(Fstack,"(%d,%d)\n",h0,h1);*/ + } + if (Strict) { + errorStackmachine(tmpc); + } + Kpush(NullObject); } - if (WarningMessageMode != 1) { - fprintf(Fstack,"\n%%Warning: The identifier <<%s>> is not in the system dictionary\n%% nor in the user dictionaries. Push NullObject.\n",token.token); - /*fprintf(Fstack,"(%d,%d)\n",h0,h1);*/ - } - if (Strict) { - errorStackmachine("Warning: identifier is not in the dictionaries"); - } - Kpush(NullObject); } } } else if (token.kind == EXECUTABLE_STRING) { @@ -1109,6 +1127,8 @@ errorStackmachine(str) extern int RestrictedMode, RestrictedMode_saved; RestrictedMode = RestrictedMode_saved; cancelAlarm(); + MsgStackTrace = NULL; + MsgSourceTrace = NULL; if (ErrorMessageMode == 1 || ErrorMessageMode == 2) { pushErrorStack(KnewErrorPacket(SerialCurrent,-1,str)); } @@ -1142,7 +1162,9 @@ errorStackmachine(str) fprintf(stderr,str); } fprintf(stderr,"\n"); - (void) traceShowStack(); + MsgStackTraceInArrayp = traceNameStackToArrayp(); + MsgStackTrace = traceShowStack(); + MsgSourceTrace = traceShowScannerBuf(); } traceClearStack(); if (GotoP) { @@ -1152,7 +1174,7 @@ errorStackmachine(str) stdOperandStack(); contextControl(CCRESTORE); getokenSM(INIT); /* It might fix the bug. 1996/3/10 */ /* fprintf(stderr,"Now, Long jump!\n"); */ - longjmp(EnvOfStackMachine,1); + MYLONGJMP(EnvOfStackMachine,1); } warningStackmachine(str) @@ -1180,7 +1202,7 @@ KSexecuteString(s) char *s; { struct tokens token; - struct object ob; + struct object ob = OINIT; int tmp; extern int CatchCtrlC; int jval; @@ -1204,9 +1226,9 @@ KSexecuteString(s) if (KSPushEnvMode) { *saved_EnvOfStackMachine = *EnvOfStackMachine; #if defined(__CYGWIN__) - if (jval = sigsetjmp(EnvOfStackMachine,1)) { + if (jval = MYSIGSETJMP(EnvOfStackMachine,1)) { #else - if (jval = setjmp(EnvOfStackMachine)) { + if (jval = MYSETJMP(EnvOfStackMachine)) { #endif *EnvOfStackMachine = *saved_EnvOfStackMachine; if (jval == 2) { @@ -1228,9 +1250,9 @@ KSexecuteString(s) }else{ if (recursive == 0) { #if defined(__CYGWIN__) - if (jval=sigsetjmp(EnvOfStackMachine,1)) { + if (jval=MYSIGSETJMP(EnvOfStackMachine,1)) { #else - if (jval=setjmp(EnvOfStackMachine)) { + if (jval=MYSETJMP(EnvOfStackMachine)) { #endif if (jval == 2) { if (ErrorMessageMode == 1 || ErrorMessageMode == 2) { @@ -1272,7 +1294,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; @@ -1293,7 +1315,7 @@ KSdefineMacros() { void KSstart() { struct tokens token; int tmp; - struct object ob; + struct object ob = OINIT; extern int Quiet; stackmachine_init(); KinitKan(); @@ -1302,7 +1324,7 @@ void KSstart() { /* The following line may cause a core dump, if you do not setjmp properly after calling KSstart().*/ /* - if (setjmp(EnvOfStackMachine)) { + if (MYSETJMP(EnvOfStackMachine)) { fprintf(stderr,"KSstart(): An error or interrupt in reading macros, files and command strings.\n"); exit(10); } else { } */ @@ -1347,7 +1369,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); @@ -1387,6 +1409,10 @@ char *KSpopBinary(int *size) { return((char *)NULL); } +struct object KSnewObjectArray(int k) { + return newObjectArray(k); +} + int pushErrorStack(struct object obj) { if (CurrentOperandStack == &ErrorStack) { @@ -1417,8 +1443,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); @@ -1447,7 +1473,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. */ @@ -1469,7 +1495,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. */ @@ -1568,8 +1594,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; @@ -1625,6 +1651,17 @@ void traceClearStack(void) { char *tracePopName(void) { if (TraceNameStackp <= 0) return (char *) NULL; return TraceNameStack[--TraceNameStackp]; +} +struct object *traceNameStackToArrayp(void) { + int n,i; + struct object *op; + op = sGC_malloc(sizeof(struct object)); + n = TraceNameStackp; if (n < 0) n = 0; + *op = newObjectArray(n); + for (i=0; i