summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordaurnimator <quae@daurnimator.com>2017-05-11 15:37:05 +1000
committerdaurnimator <quae@daurnimator.com>2017-05-11 15:37:10 +1000
commit63b6b09a6cbab4446f42b5b7a8c85e6109cac9f6 (patch)
tree3c4b092284d583fd6d59bc96045f1c19a987fc08
parentfb1de39c6b9a5812e229aa8ad4f87e594f8ea179 (diff)
downloadfengari-63b6b09a6cbab4446f42b5b7a8c85e6109cac9f6.tar.gz
fengari-63b6b09a6cbab4446f42b5b7a8c85e6109cac9f6.tar.bz2
fengari-63b6b09a6cbab4446f42b5b7a8c85e6109cac9f6.zip
src/lvm.js: Setting nil should delete from table
Closes #37
-rw-r--r--src/lvm.js10
-rw-r--r--tests/ltablib.js2
2 files changed, 9 insertions, 3 deletions
diff --git a/src/lvm.js b/src/lvm.js
index 0d30484..4484bf2 100644
--- a/src/lvm.js
+++ b/src/lvm.js
@@ -1079,7 +1079,10 @@ const settable = function(L, table, key, v, recur) {
let element = ltable.luaH_set(table.value, key);
if (!element.ttisnil()) {
- element.setfrom(v);
+ if (v.ttisnil())
+ ltable.luaH_delete(table.value, key);
+ else
+ element.setfrom(v);
} else {
luaV_finishset(L, table, key, v, element, recur);
}
@@ -1094,7 +1097,10 @@ const luaV_finishset = function(L, t, key, val, slot, recur) {
assert(slot.ttisnil());
tm = ltm.luaT_gettmbyobj(L, t, ltm.TMS.TM_NEWINDEX); // TODO: fasttm
if (tm.ttisnil()) {
- slot.setfrom(val);
+ if (val.ttisnil())
+ ltable.luaH_delete(t.value, key);
+ else
+ slot.setfrom(val);
return;
}
} else { /* not a table; check metamethod */
diff --git a/tests/ltablib.js b/tests/ltablib.js
index 8789f9e..e209db3 100644
--- a/tests/ltablib.js
+++ b/tests/ltablib.js
@@ -184,7 +184,7 @@ test('table.remove', function (t) {
[...lua.lua_topointer(L, -1).strong.entries()]
.filter(e => typeof e[0] === 'number')
.map(e => e[1].value.value).sort(),
- [1, 2, 3, 4, null, null],
+ [1, 2, 3, 4],
"Correct element(s) on the stack"
);
});