summaryrefslogtreecommitdiff
path: root/src/ltable.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/ltable.js')
-rw-r--r--src/ltable.js84
1 files changed, 51 insertions, 33 deletions
diff --git a/src/ltable.js b/src/ltable.js
index cf8b1da..d5ae6e6 100644
--- a/src/ltable.js
+++ b/src/ltable.js
@@ -1,13 +1,31 @@
"use strict";
-const assert = require('assert');
-
-const defs = require('./defs.js');
+const {
+ constant_types: {
+ LUA_TBOOLEAN,
+ LUA_TCCL,
+ LUA_TLCF,
+ LUA_TLCL,
+ LUA_TLIGHTUSERDATA,
+ LUA_TLNGSTR,
+ LUA_TNIL,
+ LUA_TNUMFLT,
+ LUA_TNUMINT,
+ LUA_TSHRSTR,
+ LUA_TTABLE,
+ LUA_TTHREAD,
+ LUA_TUSERDATA
+ },
+ to_luastring
+} = require('./defs.js');
+const { lua_assert } = require('./llimits.js');
const ldebug = require('./ldebug.js');
const lobject = require('./lobject.js');
-const lstring = require('./lstring.js');
+const {
+ luaS_hashlongstr,
+ TString
+} = require('./lstring.js');
const lstate = require('./lstate.js');
-const CT = defs.constant_types;
/* used to prevent conflicts with lightuserdata keys */
let lightuserdata_hashes = new WeakMap();
@@ -24,25 +42,25 @@ const get_lightuserdata_hash = function(v) {
const table_hash = function(L, key) {
switch(key.type) {
- case CT.LUA_TNIL:
- return ldebug.luaG_runerror(L, defs.to_luastring("table index is nil", true));
- case CT.LUA_TNUMFLT:
+ case LUA_TNIL:
+ return ldebug.luaG_runerror(L, to_luastring("table index is nil", true));
+ case LUA_TNUMFLT:
if (isNaN(key.value))
- return ldebug.luaG_runerror(L, defs.to_luastring("table index is NaN", true));
+ return ldebug.luaG_runerror(L, to_luastring("table index is NaN", true));
/* fall through */
- case CT.LUA_TNUMINT: /* takes advantage of floats and integers being same in JS */
- case CT.LUA_TBOOLEAN:
- case CT.LUA_TTABLE:
- case CT.LUA_TLCL:
- case CT.LUA_TLCF:
- case CT.LUA_TCCL:
- case CT.LUA_TUSERDATA:
- case CT.LUA_TTHREAD:
+ case LUA_TNUMINT: /* takes advantage of floats and integers being same in JS */
+ case LUA_TBOOLEAN:
+ case LUA_TTABLE:
+ case LUA_TLCL:
+ case LUA_TLCF:
+ case LUA_TCCL:
+ case LUA_TUSERDATA:
+ case LUA_TTHREAD:
return key.value;
- case CT.LUA_TSHRSTR:
- case CT.LUA_TLNGSTR:
- return lstring.luaS_hashlongstr(key.tsvalue());
- case CT.LUA_TLIGHTUSERDATA: {
+ case LUA_TSHRSTR:
+ case LUA_TLNGSTR:
+ return luaS_hashlongstr(key.tsvalue());
+ case LUA_TLIGHTUSERDATA: {
let v = key.value;
switch(typeof v) {
case "string":
@@ -151,17 +169,17 @@ const getgeneric = function(t, hash) {
};
const luaH_getint = function(t, key) {
- assert(typeof key == "number" && (key|0) === key);
+ lua_assert(typeof key == "number" && (key|0) === key);
return getgeneric(t, key);
};
const luaH_getstr = function(t, key) {
- assert(key instanceof lstring.TString);
- return getgeneric(t, lstring.luaS_hashlongstr(key));
+ lua_assert(key instanceof TString);
+ return getgeneric(t, luaS_hashlongstr(key));
};
const luaH_get = function(L, t, key) {
- assert(key instanceof lobject.TValue);
+ lua_assert(key instanceof lobject.TValue);
if (key.ttisnil() || (key.ttisfloat() && isNaN(key.value)))
return lobject.luaO_nilobject;
return getgeneric(t, table_hash(L, key));
@@ -175,17 +193,17 @@ const setgeneric = function(t, hash, key) {
let kv = key.value;
if ((key.ttisfloat() && (kv|0) === kv)) { /* does index fit in an integer? */
/* insert it as an integer */
- key = new lobject.TValue(CT.LUA_TNUMINT, kv);
+ key = new lobject.TValue(LUA_TNUMINT, kv);
} else {
key = new lobject.TValue(key.type, kv);
}
- let tv = new lobject.TValue(CT.LUA_TNIL, null);
+ let tv = new lobject.TValue(LUA_TNIL, null);
add(t, hash, key, tv);
return tv;
};
const luaH_setint = function(t, key, value) {
- assert(typeof key == "number" && (key|0) === key && value instanceof lobject.TValue);
+ lua_assert(typeof key == "number" && (key|0) === key && value instanceof lobject.TValue);
let hash = key; /* table_hash known result */
if (value.ttisnil()) {
mark_dead(t, hash);
@@ -196,20 +214,20 @@ const luaH_setint = function(t, key, value) {
let tv = v.value;
tv.setfrom(value);
} else {
- let k = new lobject.TValue(CT.LUA_TNUMINT, key);
+ let k = new lobject.TValue(LUA_TNUMINT, key);
let v = new lobject.TValue(value.type, value.value);
add(t, hash, k, v);
}
};
const luaH_set = function(L, t, key) {
- assert(key instanceof lobject.TValue);
+ lua_assert(key instanceof lobject.TValue);
let hash = table_hash(L, key);
return setgeneric(t, hash, key);
};
const luaH_delete = function(L, t, key) {
- assert(key instanceof lobject.TValue);
+ lua_assert(key instanceof lobject.TValue);
let hash = table_hash(L, key);
return mark_dead(t, hash);
};
@@ -234,7 +252,7 @@ const luaH_next = function(L, table, keyI) {
let keyO = L.stack[keyI];
let entry;
- if (keyO.type === CT.LUA_TNIL) {
+ if (keyO.type === LUA_TNIL) {
entry = table.f;
if (!entry)
return false;
@@ -252,7 +270,7 @@ const luaH_next = function(L, table, keyI) {
entry = (table.dead_weak && table.dead_weak.get(hash)) || table.dead_strong.get(hash);
if (!entry)
/* item not in table */
- return ldebug.luaG_runerror(L, defs.to_luastring("invalid key to 'next'"));
+ return ldebug.luaG_runerror(L, to_luastring("invalid key to 'next'"));
/* Iterate until either out of keys, or until finding a non-dead key */
do {
entry = entry.n;