diff options
author | Benoit Giannangeli <giann008@gmail.com> | 2017-04-23 14:52:30 +0200 |
---|---|---|
committer | Benoit Giannangeli <giann008@gmail.com> | 2017-04-23 14:52:30 +0200 |
commit | 0133e556602950f71747ef518cdaa861fe422b32 (patch) | |
tree | 270ebdcb9dd2ad88fb93a913854bcbc3b427336c | |
parent | 8966842ba72fb1eef351355ead2e8950fd87141a (diff) | |
download | fengari-0133e556602950f71747ef518cdaa861fe422b32.tar.gz fengari-0133e556602950f71747ef518cdaa861fe422b32.tar.bz2 fengari-0133e556602950f71747ef518cdaa861fe422b32.zip |
Handle when no upvalue found
-rw-r--r-- | src/lapi.js | 23 | ||||
-rw-r--r-- | src/lfunc.js | 5 |
2 files changed, 18 insertions, 10 deletions
diff --git a/src/lapi.js b/src/lapi.js index 99b0859..0231597 100644 --- a/src/lapi.js +++ b/src/lapi.js @@ -507,26 +507,33 @@ const aux_upvalue = function(L, fi, n) { const lua_getupvalue = function(L, funcindex, n) { let up = aux_upvalue(L, index2addr(L, funcindex), n); - let name = up.name; - let val = up.val; - if (name) + if (up) { + let name = up.name; + let val = up.val; + L.stack[L.top++] = new TValue(val.type, val.value); - return name.value; + + return name.value; + } + return null; }; const lua_setupvalue = function(L, funcindex, n) { let fi = index2addr(L, funcindex); assert(1 < L.top - L.ci.funcOff, "not enough elements in the stack"); let aux = aux_upvalue(L, fi, n); - let name = aux.name; - let val = aux.val; - if (name) { + if (aux) { + let name = aux.name; + let val = aux.val; + L.top--; // TODO: what if it's not a pure TValue (closure, table) val.type = L.stack[L.top].type; val.value = L.stack[L.top].value; + + return name.value; } - return name.value; + return null; }; const lua_newtable = function(L) { diff --git a/src/lfunc.js b/src/lfunc.js index bc88702..bde96d7 100644 --- a/src/lfunc.js +++ b/src/lfunc.js @@ -43,9 +43,10 @@ class UpVal { } setval(L, ra) { + let o = L.stack[ra]; if (this.v !== null) { - this.L.stack[this.v] = L.stack[ra]; - } else this.u.value = L.stack[ra]; + this.L.stack[this.v] = new lobject.TValue(o.type, o.value); + } else this.u.value = new lobject.TValue(o.type, o.value); } isopen() { |