summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/defs.js9
-rw-r--r--src/lstring.js6
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) {