diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-01-27 14:56:33 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-01-27 14:56:33 -0200 |
commit | 5bd8d388de6704cc7f0eb60de33636a4dfcd61bd (patch) | |
tree | b0d226562331d8667847908dc957a4e01f811dd5 /lvm.c | |
parent | 28f215ecf8b8d987f0bf64f3154b0e2fbc5e5168 (diff) | |
download | lua-5bd8d388de6704cc7f0eb60de33636a4dfcd61bd.tar.gz lua-5bd8d388de6704cc7f0eb60de33636a4dfcd61bd.tar.bz2 lua-5bd8d388de6704cc7f0eb60de33636a4dfcd61bd.zip |
OP_CONCAT does not move its result (to simplify its execution)
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 24 |
1 files changed, 7 insertions, 17 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 2.333 2018/01/10 19:19:27 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 2.334 2018/01/14 17:27:50 roberto Exp roberto $ |
3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -717,15 +717,13 @@ void luaV_finishOp (lua_State *L) { | |||
717 | } | 717 | } |
718 | case OP_CONCAT: { | 718 | case OP_CONCAT: { |
719 | StkId top = L->top - 1; /* top when 'luaT_trybinTM' was called */ | 719 | StkId top = L->top - 1; /* top when 'luaT_trybinTM' was called */ |
720 | int b = GETARG_B(inst); /* first element to concatenate */ | 720 | int a = GETARG_A(inst); /* first element to concatenate */ |
721 | int total = cast_int(top - 1 - (base + b)); /* yet to concatenate */ | 721 | int total = cast_int(top - 1 - (base + a)); /* yet to concatenate */ |
722 | setobjs2s(L, top - 2, top); /* put TM result in proper position */ | 722 | setobjs2s(L, top - 2, top); /* put TM result in proper position */ |
723 | if (total > 1) { /* are there elements to concat? */ | 723 | if (total > 1) { /* are there elements to concat? */ |
724 | L->top = top - 1; /* top is one after last element (at top-2) */ | 724 | L->top = top - 1; /* top is one after last element (at top-2) */ |
725 | luaV_concat(L, total); /* concat them (may yield again) */ | 725 | luaV_concat(L, total); /* concat them (may yield again) */ |
726 | } | 726 | } |
727 | /* move final result to final position */ | ||
728 | setobjs2s(L, ci->func + 1 + GETARG_A(inst), L->top - 1); | ||
729 | break; | 727 | break; |
730 | } | 728 | } |
731 | case OP_TFORCALL: case OP_CALL: case OP_TAILCALL: | 729 | case OP_TFORCALL: case OP_CALL: case OP_TAILCALL: |
@@ -1376,18 +1374,10 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
1376 | vmbreak; | 1374 | vmbreak; |
1377 | } | 1375 | } |
1378 | vmcase(OP_CONCAT) { | 1376 | vmcase(OP_CONCAT) { |
1379 | int b = GETARG_B(i); | 1377 | int n = GETARG_B(i); /* number of elements to concatenate */ |
1380 | int c = GETARG_C(i); | 1378 | L->top = ra + n; /* mark the end of concat operands */ |
1381 | StkId rb; | 1379 | ProtectNT(luaV_concat(L, n)); |
1382 | L->top = base + c + 1; /* mark the end of concat operands */ | 1380 | checkGC(L, L->top); /* 'luaV_concat' ensures correct top */ |
1383 | ProtectNT(luaV_concat(L, c - b + 1)); | ||
1384 | if (trap) { /* 'luaV_concat' may move the stack */ | ||
1385 | updatebase(ci); | ||
1386 | ra = RA(i); | ||
1387 | } | ||
1388 | rb = base + b; | ||
1389 | setobjs2s(L, ra, rb); | ||
1390 | checkGC(L, (ra >= rb ? ra + 1 : rb)); | ||
1391 | vmbreak; | 1381 | vmbreak; |
1392 | } | 1382 | } |
1393 | vmcase(OP_CLOSE) { | 1383 | vmcase(OP_CLOSE) { |