aboutsummaryrefslogtreecommitdiff
path: root/lcode.c
diff options
context:
space:
mode:
Diffstat (limited to 'lcode.c')
-rw-r--r--lcode.c28
1 files changed, 21 insertions, 7 deletions
diff --git a/lcode.c b/lcode.c
index e9bcb5f1..8ea811d8 100644
--- a/lcode.c
+++ b/lcode.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lcode.c,v 2.1 2003/12/10 12:13:36 roberto Exp roberto $ 2** $Id: lcode.c,v 2.2 2004/04/30 20:13:38 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*/
@@ -252,13 +252,26 @@ static int nil_constant (FuncState *fs) {
252} 252}
253 253
254 254
255void luaK_setcallreturns (FuncState *fs, expdesc *e, int nresults) { 255void luaK_setreturns (FuncState *fs, expdesc *e, int nresults) {
256 if (e->k == VCALL) { /* expression is an open function call? */ 256 if (e->k == VCALL) { /* expression is an open function call? */
257 SETARG_C(getcode(fs, e), nresults+1); 257 SETARG_C(getcode(fs, e), nresults+1);
258 if (nresults == 1) { /* `regular' expression? */ 258 }
259 e->k = VNONRELOC; 259 else if (e->k == VVARARG) {
260 e->info = GETARG_A(getcode(fs, e)); 260 SETARG_B(getcode(fs, e), nresults+1);
261 } 261 SETARG_A(getcode(fs, e), fs->freereg);
262 luaK_reserveregs(fs, 1);
263 }
264}
265
266
267void luaK_setoneret (FuncState *fs, expdesc *e) {
268 if (e->k == VCALL) { /* expression is an open function call? */
269 e->k = VNONRELOC;
270 e->info = GETARG_A(getcode(fs, e));
271 }
272 else if (e->k == VVARARG) {
273 SETARG_B(getcode(fs, e), 2);
274 e->k = VRELOCABLE; /* can relocate its simple result */
262 } 275 }
263} 276}
264 277
@@ -286,8 +299,9 @@ void luaK_dischargevars (FuncState *fs, expdesc *e) {
286 e->k = VRELOCABLE; 299 e->k = VRELOCABLE;
287 break; 300 break;
288 } 301 }
302 case VVARARG:
289 case VCALL: { 303 case VCALL: {
290 luaK_setcallreturns(fs, e, 1); 304 luaK_setoneret(fs, e);
291 break; 305 break;
292 } 306 }
293 default: break; /* there is one value available (somewhere) */ 307 default: break; /* there is one value available (somewhere) */