diff --git a/bin/makefile-linux.x86_64-x b/bin/makefile-linux.x86_64-x index f280cbad..f2dafe3a 100644 --- a/bin/makefile-linux.x86_64-x +++ b/bin/makefile-linux.x86_64-x @@ -17,7 +17,7 @@ XFILES = $(OBJECTDIR)xmkicon.o \ XFLAGS = -DXWINDOW # OPTFLAGS is normally -O2. -OPTFLAGS = -O2 -g3 +OPTFLAGS = -O0 -g3 DFLAGS = $(XFLAGS) -DRELEASE=351 LDFLAGS = -L/usr/X11/lib -lX11 -lc -lm diff --git a/inc/stack.h b/inc/stack.h index 7aac6c41..4f3606a0 100644 --- a/inc/stack.h +++ b/inc/stack.h @@ -78,7 +78,7 @@ typedef struct fnhead { typedef struct frameex1 { unsigned flags : 3; unsigned fast : 1; - unsigned nil2 : 1; /* not used, prev: This frame treats N-func */ + unsigned mvscase : 1; /* was not used, prev: This frame treats N-func */ unsigned incall : 1; unsigned validnametable : 1; /* 0: look for FunctionHeader @@ -109,7 +109,7 @@ typedef struct frameex1 { typedef struct frameex2 { unsigned flags : 3; unsigned fast : 1; - unsigned nil2 : 1; /* not used, prev: This frame treats N-func */ + unsigned mvscase : 1; /* not used, prev: This frame treats N-func */ unsigned incall : 1; unsigned validnametable : 1; /* 0: look for FunctionHeader @@ -200,7 +200,7 @@ typedef struct frameex1 { /* 0: look for FunctionHeader 1: look for NameTable on this FrameEx */ unsigned incall : 1; - unsigned nil2 : 1; /* not used, prev: This frame treats N-func */ + unsigned mvscase : 1; /* not used, prev: This frame treats N-func */ unsigned fast : 1; unsigned flags : 3; /* hi word */ @@ -235,7 +235,7 @@ typedef struct frameex2 { /* 0: look for FunctionHeader 1: look for NameTable on this FrameEx */ unsigned incall : 1; - unsigned nil2 : 1; /* not used, prev: This frame treats N-func */ + unsigned mvscase : 1; /* not used, prev: This frame treats N-func */ unsigned fast : 1; unsigned flags : 3; diff --git a/src/hardrtn.c b/src/hardrtn.c index 6ed187ed..0ddfa61b 100644 --- a/src/hardrtn.c +++ b/src/hardrtn.c @@ -211,8 +211,13 @@ int slowreturn(void) { } else { if (CURRENTFX->nopush) { CURRENTFX->nopush = NIL; - CurrentStackPTR = next68k - 2; - TopOfStack = *((LispPTR *)CurrentStackPTR); + if (CURRENTFX->mvscase) { + CurrentStackPTR = next68k; + CURRENTFX->mvscase = NIL; + } else { + CurrentStackPTR = next68k - 2; + TopOfStack = *((LispPTR *)CurrentStackPTR); + } CurrentStackPTR -= 2; } else diff --git a/src/mvs.c b/src/mvs.c index 90592d9c..b4de6347 100644 --- a/src/mvs.c +++ b/src/mvs.c @@ -69,6 +69,8 @@ LispPTR values(int arg_count, register LispPTR *args) { fnhead = (struct fnhead *)FuncObj; pc = (ByteCode *)PC + 3; /* to skip the miscn opcode we're in now */ } else { + unbind_count = 0; /* different frame */ + fnhead = (struct fnhead *)Addr68k_from_LADDR(POINTERMASK & SWA_FNHEAD((int)caller->fnheader)); pc = (ByteCode *)fnhead + (caller->pc); } @@ -98,9 +100,14 @@ LispPTR values(int arg_count, register LispPTR *args) { /* BUT 3's not enough for big atoms, so add diff between FN op size & MISCN op size */ if (caller == immediate_caller) PC = pc + (FN_OPCODE_SIZE - 3); #endif /* BIGATOMS */ - - else + else { caller->pc = (UNSIGNED)pc + FN_OPCODE_SIZE - (UNSIGNED)fnhead; + /* skip over FN opcode when we get there */ + prevcaller->fast = 0; + caller->mvscase = 1; + caller->nopush = 1; + } + return (make_value_list(arg_count, args)); } break; @@ -271,26 +278,22 @@ LispPTR make_value_list(int argcount, LispPTR *argarray) { void simulate_unbind(FX2 *frame, int unbind_count, FX2 *returner) { int unbind; - LispPTR *stackptr = (LispPTR *)(Stackspace + frame->nextblock); + LispPTR *stack_pointer = (LispPTR *)(Stackspace + frame->nextblock); for (unbind = 0; unbind < unbind_count; unbind++) { - register int value; - register LispPTR *lastpvar; - int bindnvalues; - for (; ((int)*--stackptr >= 0);) - ; /* find the binding mark */ - value = (int)*stackptr; - lastpvar = (LispPTR *)((DLword *)frame + FRAMESIZE + 2 + GetLoWord(value)); - ; - bindnvalues = (~value) >> 16; - for (value = bindnvalues; --value >= 0;) { *--lastpvar = 0xffffffff; } - /* This line caused \NSMAIL.READ.HEADING to smash memory, */ - /* so I removed it 21 Jul 91 --JDS. This was the only */ - /* difference between this function and the UNWIND code */ - /* in inlineC.h */ - /* MAKEFREEBLOCK(stackptr, (DLword *)stackptr-nextblock); */ + register int num; + register LispPTR *ppvar; + register int i; + register LispPTR value; + + for (; (((int)*--(stack_pointer)) >= 0);) + ; + value = *stack_pointer; + num = (~value) >> 16; + ppvar = (LispPTR *)((DLword *)frame + FRAMESIZE + 2 + GetLoWord(value)); + for (i = num; --i >= 0;) { *--ppvar = 0xffffffff; } } - if (returner) - returner->fast = 0; /* since we've destroyed contiguity */ + /* if (returner) + returner->fast = 0; since we've destroyed contiguity */ /* in the stack, but that only matters if there's a return. */ }