diff options
-rw-r--r-- | src/defs.js | 9 | ||||
-rw-r--r-- | src/lstring.js | 6 |
2 files changed, 13 insertions, 2 deletions
diff --git a/src/defs.js b/src/defs.js index b96dcf5..c0b3bda 100644 --- a/src/defs.js +++ b/src/defs.js @@ -159,7 +159,14 @@ const is_luastring = function(s) { /* test two lua strings for equality */ const luastring_eq = function(a, b) { - return a === b || (a.length === b.length && a.toString() === b.toString()); + if (a !== b) { + let len = a.length; + if (len !== b.length) return false; + /* XXX: Should this be a constant time algorithm? */ + for (let i=0; i<len; i++) + if (a[i] !== b[i]) return false; + } + return true; }; const to_jsstring = function(value, from, to) { diff --git a/src/lstring.js b/src/lstring.js index 84754f0..d65fc6a 100644 --- a/src/lstring.js +++ b/src/lstring.js @@ -31,7 +31,11 @@ const luaS_eqlngstr = function(a, b) { make sure this doesn't conflict with any of the anti-collision strategies in ltable */ const luaS_hash = function(str) { assert(defs.is_luastring(str)); - return '|'+str.toString(); + let len = str.length; + let s = "|"; + for (let i=0; i<len; i++) + s += str[i].toString(16); + return s; }; const luaS_hashlongstr = function(ts) { |