mirror of
https://github.com/Interlisp/maiko.git
synced 2026-03-15 22:37:22 +00:00
Compare commits
3 Commits
maiko-2109
...
multi-val-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d625665cde | ||
|
|
c0850ddb52 | ||
|
|
68d4a61bf1 |
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
43
src/mvs.c
43
src/mvs.c
@@ -69,6 +69,8 @@ newframe:
|
||||
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 @@ 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;
|
||||
@@ -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. */
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user