From d625665cde1f38496b3bf3ac36d71c7d758f8018 Mon Sep 17 00:00:00 2001 From: Larry Masinter Date: Mon, 24 May 2021 12:26:31 -0700 Subject: [PATCH] WIP still, trying for a fix --- bin/makefile-linux.x86_64-x | 2 +- inc/stack.h | 8 ++++---- src/hardrtn.c | 9 +++++++-- src/mvs.c | 13 +++++++++---- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/bin/makefile-linux.x86_64-x b/bin/makefile-linux.x86_64-x index f280cba..f2dafe3 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 7aac6c4..4f3606a 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 6ed187e..0ddfa61 100644 --- a/src/hardrtn.c +++ b/src/hardrtn.c @@ -211,8 +211,13 @@ retry: /* this is retry entry after MAKE_FXCOPY etc */ } 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 dd92d34..b4de634 100644 --- a/src/mvs.c +++ b/src/mvs.c @@ -100,9 +100,14 @@ newpc: /* 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; @@ -287,8 +292,8 @@ void simulate_unbind(FX2 *frame, int unbind_count, FX2 *returner) { 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. */ }