blob: 4769866c3e21a38d9c8161a3627f8a3b07c550eb (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
"use strict";
const {
is_luastring,
luastring_eq,
luastring_from,
to_luastring
} = require('./defs.js');
const { lua_assert } = require("./llimits.js");
class TString {
constructor(L, str) {
this.hash = null;
this.realstring = str;
}
getstr() {
return this.realstring;
}
tsslen() {
return this.realstring.length;
}
}
const luaS_eqlngstr = function(a, b) {
lua_assert(a instanceof TString);
lua_assert(b instanceof TString);
return a == b || luastring_eq(a.realstring, b.realstring);
};
/* converts strings (arrays) to a consistent map key
make sure this doesn't conflict with any of the anti-collision strategies in ltable */
const luaS_hash = function(str) {
lua_assert(is_luastring(str));
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) {
lua_assert(ts instanceof TString);
if(ts.hash === null) {
ts.hash = luaS_hash(ts.getstr());
}
return ts.hash;
};
/* variant that takes ownership of array */
const luaS_bless = function(L, str) {
lua_assert(str instanceof Uint8Array);
return new TString(L, str);
};
/* makes a copy */
const luaS_new = function(L, str) {
return luaS_bless(L, luastring_from(str));
};
/* takes a js string */
const luaS_newliteral = function(L, str) {
return luaS_bless(L, to_luastring(str));
};
module.exports.luaS_eqlngstr = luaS_eqlngstr;
module.exports.luaS_hash = luaS_hash;
module.exports.luaS_hashlongstr = luaS_hashlongstr;
module.exports.luaS_bless = luaS_bless;
module.exports.luaS_new = luaS_new;
module.exports.luaS_newliteral = luaS_newliteral;
module.exports.TString = TString;
|