new way to code CALLs + passing multiple arguments between function calls

This commit is contained in:
Roberto Ierusalimschy 1999-11-25 16:59:43 -02:00
parent d29ce75737
commit 33b8a01032
3 changed files with 22 additions and 32 deletions

View File

@ -1,5 +1,5 @@
/*
** $Id: lopcodes.h,v 1.32 1999/03/10 14:09:45 roberto Exp roberto $
** $Id: lopcodes.h,v 1.33 1999/06/17 17:04:03 roberto Exp roberto $
** Opcodes for Lua virtual machine
** See Copyright Notice in lua.h
*/
@ -20,12 +20,12 @@ typedef enum {
ENDCODE,/* - - (return) */
RETCODE,/* b - (return) */
CALL,/* b c v_c...v_1 f r_b...r_1 f(v1,...,v_c) */
CALL,/* b c v_n-v_1 f(at c) r_b-r_1 f(v1,...,v_n) */
TAILCALL,/* b c v_c...v_1 f (return) f(v1,...,v_c) */
TAILCALL,/* b c v_c-v_1 f (return) f(v1,...,v_c) */
PUSHNIL,/* b - nil_0...nil_b */
POP,/* b a_b...a_1 - */
PUSHNIL,/* b - nil_0-nil_b */
POP,/* b a_b-a_1 - */
PUSHNUMBERW,/* w - (float)w */
PUSHNUMBER,/* b - (float)b */
@ -61,12 +61,12 @@ SETGLOBAL,/* b x - VAR[CNST[b]]=x */
SETTABLEPOP,/* - v i t - t[i]=v */
SETTABLE,/* b v a_b...a_1 i t a_b...a_1 i t t[i]=v */
SETTABLE,/* b v a_b-a_1 i t a_b-a_1 i t t[i]=v */
SETLISTW,/* w c v_c...v_1 t t t[i+w*FPF]=v_i */
SETLIST,/* b c v_c...v_1 t t t[i+b*FPF]=v_i */
SETLISTW,/* w c v_c-v_1 t t t[i+w*FPF]=v_i */
SETLIST,/* b c v_c-v_1 t t t[i+b*FPF]=v_i */
SETMAP,/* b v_b k_b ...v_0 k_0 t t t[k_i]=v_i */
SETMAP,/* b v_b k_b - v_0 k_0 t t t[k_i]=v_i */
NEQOP,/* - y x (x~=y)? 1 : nil */
EQOP,/* - y x (x==y)? 1 : nil */
@ -96,16 +96,14 @@ IFTUPJMP,/* b x - (x!=nil)? PC-=b */
IFFUPJMPW,/* w x - (x==nil)? PC-=w */
IFFUPJMP,/* b x - (x==nil)? PC-=b */
CLOSUREW,/* w c v_c...v_1 closure(CNST[w], v_c...v_1) */
CLOSURE,/* b c v_c...v_1 closure(CNST[b], v_c...v_1) */
CLOSUREW,/* w c v_c-v_1 closure(CNST[w], v_c-v_1) */
CLOSURE,/* b c v_c-v_1 closure(CNST[b], v_c-v_1) */
SETLINEW,/* w - - LINE=w */
SETLINE,/* b - - LINE=b */
LONGARGW,/* w (add w*(1<<16) to arg of next instruction) */
LONGARG,/* b (add b*(1<<16) to arg of next instruction) */
CHECKSTACK /* b (assert #temporaries == b; only for internal debuging!) */
LONGARG /* b (add b*(1<<16) to arg of next instruction) */
} OpCode;

View File

@ -1,5 +1,5 @@
/*
** $Id: lparser.c,v 1.42 1999/11/04 17:23:12 roberto Exp roberto $
** $Id: lparser.c,v 1.43 1999/11/22 13:12:07 roberto Exp roberto $
** LL(1) Parser and code generator for Lua
** See Copyright Notice in lua.h
*/
@ -426,12 +426,9 @@ static void close_exp (LexState *ls, int pc, int nresults) {
if (pc > 0) { /* expression is an open function call? */
Byte *code = ls->fs->f->code;
code[pc-1] = (Byte)nresults; /* set nresults */
/* push results, pop params (at code[pc]) and function */
deltastack(ls, nresults-(code[pc]+1));
if (nresults != MULT_RET)
deltastack(ls, nresults); /* push results */
}
#ifdef DEBUG
code_oparg(ls, CHECKSTACK, ls->fs->stacksize, 0);
#endif
}
@ -1152,7 +1149,7 @@ static void var_or_func_tail (LexState *ls, vardesc *v) {
static int funcparams (LexState *ls, int slf) {
FuncState *fs = ls->fs;
int nparams = 1; /* in cases STRING and constructor */
int slevel = fs->stacksize - slf - 1; /* where is func in the stack */
switch (ls->token) {
case '(': { /* funcparams -> '(' explist ')' */
int line = ls->linenumber;
@ -1160,8 +1157,7 @@ static int funcparams (LexState *ls, int slf) {
next(ls);
explist(ls, &e);
check_match(ls, ')', '(', line);
close_exp(ls, e.pc, 1);
nparams = e.n;
close_exp(ls, e.pc, MULT_RET); /* close 1 for old semantics */
break;
}
@ -1180,7 +1176,8 @@ static int funcparams (LexState *ls, int slf) {
}
code_byte(ls, CALL);
code_byte(ls, 0); /* save space for nresult */
code_byte(ls, (Byte)(nparams+slf));
code_byte(ls, (Byte)slevel);
fs->stacksize = slevel; /* call will remove func and params */
return fs->pc-1;
}

11
lvm.c
View File

@ -1,5 +1,5 @@
/*
** $Id: lvm.c,v 1.65 1999/11/04 17:22:26 roberto Exp roberto $
** $Id: lvm.c,v 1.66 1999/11/22 13:12:07 roberto Exp roberto $
** Lua virtual machine
** See Copyright Notice in lua.h
*/
@ -325,11 +325,11 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf, StkId
goto ret;
case CALL: aux = *pc++;
luaD_calln(L, *pc++, aux);
luaD_call(L, (S->stack+base) + *pc++, aux);
break;
case TAILCALL: aux = *pc++;
luaD_calln(L, *pc++, MULT_RET);
luaD_call(L, (S->stack+base) + *pc++, MULT_RET);
base += aux;
goto ret;
@ -604,11 +604,6 @@ StkId luaV_execute (lua_State *L, const Closure *cl, const TProtoFunc *tf, StkId
aux = highbyte(L, highbyte(L, aux));
goto switchentry; /* do not reset "aux" */
case CHECKSTACK: aux = *pc++;
LUA_ASSERT(L, (S->top-S->stack)-base == aux && S->last >= S->top,
"wrong stack size");
break;
}
} ret:
if (L->callhook)