aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-04-17 11:05:34 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-04-17 11:05:34 -0300
commit71219ccc3905931c5afb2646ff8c5de4145428f5 (patch)
tree111768a54045c6e71588b43d9febf3914d45437d
parent870f61d2998cc9a998b9599997ae8975879d9314 (diff)
downloadlua-71219ccc3905931c5afb2646ff8c5de4145428f5.tar.gz
lua-71219ccc3905931c5afb2646ff8c5de4145428f5.tar.bz2
lua-71219ccc3905931c5afb2646ff8c5de4145428f5.zip
simpler version of `luaK_tostack'
-rw-r--r--lcode.c65
1 files changed, 25 insertions, 40 deletions
diff --git a/lcode.c b/lcode.c
index 8fa8443e..437fe0a6 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lcode.c,v 1.25 2000/04/13 16:51:01 roberto Exp roberto $ 2** $Id: lcode.c,v 1.26 2000/04/14 17:47:24 roberto Exp roberto $
3** Code generator for Lua 3** Code generator for Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -311,54 +311,39 @@ static int code_label (FuncState *fs, OpCode op, int arg) {
311} 311}
312 312
313 313
314static void jump_to_value (FuncState *fs, expdesc *v, Instruction previous) {
315 int p_nil = NO_JUMP; /* position of an eventual PUSHNIL */
316 int p_1 = NO_JUMP; /* position of an eventual PUSHINT */
317 int final; /* position after whole expression */
318 if (ISJUMP(previous)) {
319 luaK_concat(fs, &v->u.l.t, fs->pc-1); /* put `previous' in true list */
320 p_nil = code_label(fs, OP_PUSHNILJMP, 0);
321 p_1 = code_label(fs, OP_PUSHINT, 1);
322 }
323 else { /* still may need a PUSHNIL or a PUSHINT */
324 int need_nil = need_value(fs, v->u.l.f, OP_JMPONF);
325 int need_1 = need_value(fs, v->u.l.t, OP_JMPONT);
326 if (need_nil && need_1) {
327 int j = code_label(fs, OP_JMP, 0); /* skip both pushes */
328 p_nil = code_label(fs, OP_PUSHNILJMP, 0);
329 p_1 = code_label(fs, OP_PUSHINT, 1);
330 luaK_patchlist(fs, j, luaK_getlabel(fs));
331 luaK_deltastack(fs, -1); /* previous PUSHINT may be skipped */
332 }
333 else if (need_nil || need_1) {
334 int j = code_label(fs, OP_JMP, 0); /* skip one push */
335 if (need_nil)
336 p_nil = code_label(fs, OP_PUSHNIL, 1);
337 else /* need_1 */
338 p_1 = code_label(fs, OP_PUSHINT, 1);
339 luaK_patchlist(fs, j, luaK_getlabel(fs));
340 luaK_deltastack(fs, -1); /* previous PUSHs may be skipped */
341 }
342 }
343 final = luaK_getlabel(fs);
344 luaK_patchlistaux(fs, v->u.l.f, p_nil, OP_JMPONF, final);
345 luaK_patchlistaux(fs, v->u.l.t, p_1, OP_JMPONT, final);
346 v->u.l.f = v->u.l.t = NO_JUMP;
347}
348
349
350void luaK_tostack (LexState *ls, expdesc *v, int onlyone) { 314void luaK_tostack (LexState *ls, expdesc *v, int onlyone) {
351 FuncState *fs = ls->fs; 315 FuncState *fs = ls->fs;
352 if (!discharge(fs, v)) { /* `v' is an expression? */ 316 if (!discharge(fs, v)) { /* `v' is an expression? */
353 OpCode previous = GET_OPCODE(fs->f->code[fs->pc-1]); 317 OpCode previous = GET_OPCODE(fs->f->code[fs->pc-1]);
354 LUA_ASSERT(L, previous != OP_SETLINE, "bad place to set line"); 318 LUA_ASSERT(L, previous != OP_SETLINE, "bad place to set line");
355 if (!ISJUMP(previous) && v->u.l.f == NO_JUMP && v->u.l.t == NO_JUMP) { 319 if (!ISJUMP(previous) && v->u.l.f == NO_JUMP && v->u.l.t == NO_JUMP) {
356 /* it is an expression without jumps */ 320 /* expression has no jumps */
357 if (onlyone) 321 if (onlyone)
358 luaK_setcallreturns(fs, 1); /* call must return 1 value */ 322 luaK_setcallreturns(fs, 1); /* call must return 1 value */
359 } 323 }
360 else /* expression has jumps... */ 324 else { /* expression has jumps */
361 jump_to_value(fs, v, previous); 325 int final; /* position after whole expression */
326 int j = NO_JUMP; /* eventual jump over values */
327 int p_nil = NO_JUMP; /* position of an eventual PUSHNIL */
328 int p_1 = NO_JUMP; /* position of an eventual PUSHINT */
329 if (ISJUMP(previous) || need_value(fs, v->u.l.f, OP_JMPONF) ||
330 need_value(fs, v->u.l.t, OP_JMPONT)) {
331 /* expression need values */
332 if (ISJUMP(previous))
333 luaK_concat(fs, &v->u.l.t, fs->pc-1); /* put `previous' in t. list */
334 else {
335 j = code_label(fs, OP_JMP, 0); /* to jump over both pushes */
336 luaK_deltastack(fs, -1); /* next PUSHes may be skipped */
337 }
338 p_nil = code_label(fs, OP_PUSHNILJMP, 0);
339 p_1 = code_label(fs, OP_PUSHINT, 1);
340 luaK_patchlist(fs, j, luaK_getlabel(fs));
341 }
342 final = luaK_getlabel(fs);
343 luaK_patchlistaux(fs, v->u.l.f, p_nil, OP_JMPONF, final);
344 luaK_patchlistaux(fs, v->u.l.t, p_1, OP_JMPONT, final);
345 v->u.l.f = v->u.l.t = NO_JUMP;
346 }
362 } 347 }
363} 348}
364 349