Coverage Report

Created: 2026-03-30 06:30

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/moddable/xs/sources/xsCommon.c
Line
Count
Source
1
/*
2
 * Copyright (c) 2016-2025  Moddable Tech, Inc.
3
 *
4
 *   This file is part of the Moddable SDK Runtime.
5
 * 
6
 *   The Moddable SDK Runtime is free software: you can redistribute it and/or modify
7
 *   it under the terms of the GNU Lesser General Public License as published by
8
 *   the Free Software Foundation, either version 3 of the License, or
9
 *   (at your option) any later version.
10
 * 
11
 *   The Moddable SDK Runtime is distributed in the hope that it will be useful,
12
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *   GNU Lesser General Public License for more details.
15
 * 
16
 *   You should have received a copy of the GNU Lesser General Public License
17
 *   along with the Moddable SDK Runtime.  If not, see <http://www.gnu.org/licenses/>.
18
 *
19
 * This file incorporates work covered by the following copyright and  
20
 * permission notice:  
21
 *
22
 *       Copyright (C) 2010-2016 Marvell International Ltd.
23
 *       Copyright (C) 2002-2010 Kinoma, Inc.
24
 *
25
 *       Licensed under the Apache License, Version 2.0 (the "License");
26
 *       you may not use this file except in compliance with the License.
27
 *       You may obtain a copy of the License at
28
 *
29
 *        http://www.apache.org/licenses/LICENSE-2.0
30
 *
31
 *       Unless required by applicable law or agreed to in writing, software
32
 *       distributed under the License is distributed on an "AS IS" BASIS,
33
 *       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
34
 *       See the License for the specific language governing permissions and
35
 *       limitations under the License.
36
 */
37
38
#define _GNU_SOURCE
39
#include "xsCommon.h"
40
#ifndef mxUseDefaultCStackLimit
41
  #define mxUseDefaultCStackLimit 1
42
#endif
43
44
const txString gxCodeNames[XS_CODE_COUNT] = {
45
  "",
46
  /* XS_CODE_ADD */ "add",
47
  /* XS_CODE_ARGUMENT */ "argument",
48
  /* XS_CODE_ARGUMENTS */ "arguments",
49
  /* XS_CODE_ARGUMENTS_SLOPPY */ "arguments_sloppy",
50
  /* XS_CODE_ARGUMENTS_STRICT */ "arguments_strict",
51
  /* XS_CODE_ARRAY */ "array",
52
  /* XS_CODE_ASYNC_FUNCTION */ "async_function",
53
  /* XS_CODE_ASYNC_GENERATOR_FUNCTION */ "async_generator_function",
54
  /* XS_CODE_AT */ "at",
55
  /* XS_CODE_AWAIT */ "await",
56
  /* XS_CODE_BEGIN_SLOPPY */ "begin_sloppy",
57
  /* XS_CODE_BEGIN_STRICT */ "begin_strict",
58
  /* XS_CODE_BEGIN_STRICT_BASE */ "begin_strict_base",
59
  /* XS_CODE_BEGIN_STRICT_DERIVED */ "begin_strict_derived",
60
  /* XS_CODE_BEGIN_STRICT_FIELD */ "begin_strict_field",
61
  /* XS_CODE_BIGINT_1 */ "bigint",
62
  /* XS_CODE_BIGINT_2 */ "bigint_2",
63
  /* XS_CODE_BIT_AND */ "bit_and",
64
  /* XS_CODE_BIT_NOT */ "bit_not",
65
  /* XS_CODE_BIT_OR */ "bit_or",
66
  /* XS_CODE_BIT_XOR */ "bit_xor",
67
  /* XS_CODE_BRANCH_1 */ "branch",
68
  /* XS_CODE_BRANCH_2 */ "branch_2",
69
  /* XS_CODE_BRANCH_4 */ "branch_4",
70
  /* XS_CODE_BRANCH_CHAIN_1 */ "branch_chain",
71
  /* XS_CODE_BRANCH_CHAIN_2 */ "branch_chain_2",
72
  /* XS_CODE_BRANCH_CHAIN_4 */ "branch_chain_4",
73
  /* XS_CODE_BRANCH_COALESCE_1 */ "branch_coalesce",
74
  /* XS_CODE_BRANCH_COALESCE_2 */ "branch_coalesce_2",
75
  /* XS_CODE_BRANCH_COALESCE_4 */ "branch_coalesce_4",
76
  /* XS_CODE_BRANCH_ELSE_1 */ "branch_else",
77
  /* XS_CODE_BRANCH_ELSE_2 */ "branch_else_2",
78
  /* XS_CODE_BRANCH_ELSE_4 */ "branch_else_4",
79
  /* XS_CODE_BRANCH_IF_1 */ "branch_if",
80
  /* XS_CODE_BRANCH_IF_2 */ "branch_if_2",
81
  /* XS_CODE_BRANCH_IF_4 */ "branch_if_4",
82
  /* XS_CODE_BRANCH_STATUS_1 */ "branch_status",
83
  /* XS_CODE_BRANCH_STATUS_2 */ "branch_status_2",
84
  /* XS_CODE_BRANCH_STATUS_4 */ "branch_status_4",
85
  /* XS_CODE_CALL */ "call",
86
  /* XS_CODE_CATCH_1 */ "catch",
87
  /* XS_CODE_CATCH_2 */ "catch_2",
88
  /* XS_CODE_CATCH_4 */ "catch_4",
89
  /* XS_CODE_CHECK_INSTANCE */ "check_instance",
90
  /* XS_CODE_CLASS */ "class",
91
  /* XS_CODE_CODE_1 */ "code",
92
  /* XS_CODE_CODE_2 */ "code_2",
93
  /* XS_CODE_CODE_4 */ "code_4",
94
  /* XS_CODE_CODE_ARCHIVE_1 */ "code_archive",
95
  /* XS_CODE_CODE_ARCHIVE_2 */ "code_archive_2",
96
  /* XS_CODE_CODE_ARCHIVE_4 */ "code_archive_4",
97
  /* XS_CODE_CONST_CLOSURE_1 */ "const_closure",
98
  /* XS_CODE_CONST_CLOSURE_2 */ "const_closure_2",
99
  /* XS_CODE_CONST_LOCAL_1 */ "const_local",
100
  /* XS_CODE_CONST_LOCAL_2 */ "const_local_2",
101
  /* XS_CODE_CONSTRUCTOR_FUNCTION */ "constructor_function",
102
  /* XS_CODE_COPY_OBJECT */ "copy_object",
103
  /* XS_CODE_CURRENT */ "current",
104
  /* XS_CODE_DEBUGGER */ "debugger",
105
  /* XS_CODE_DECREMENT */ "decrement",
106
  /* XS_CODE_DELETE_PROPERTY */ "delete_property",
107
  /* XS_CODE_DELETE_PROPERTY_AT */ "delete_property_at",
108
  /* XS_CODE_DELETE_SUPER */ "delete_super",
109
  /* XS_CODE_DELETE_SUPER_AT */ "delete_super_at",
110
  /* XS_CODE_DIVIDE */ "divide",
111
  /* XS_CODE_DUB */ "dub",
112
  /* XS_CODE_DUB_AT */ "dub_at",
113
  /* XS_CODE_END */ "end",
114
  /* XS_CODE_END_ARROW */ "end_arrow",
115
  /* XS_CODE_END_BASE */ "end_base",
116
  /* XS_CODE_END_DERIVED */ "end_derived",
117
  /* XS_CODE_ENVIRONMENT */ "environment",
118
  /* XS_CODE_EQUAL */ "equal",
119
  /* XS_CODE_EVAL */ "eval",
120
  /* XS_CODE_EVAL_ENVIRONMENT */ "eval_environment",
121
  /* XS_CODE_EVAL_PRIVATE */ "eval_private",
122
  /* XS_CODE_EVAL_REFERENCE */ "eval_reference",
123
  /* XS_CODE_EVAL_TAIL */ "eval_tail",
124
  /* XS_CODE_EXCEPTION */ "exception",
125
  /* XS_CODE_EXPONENTIATION */ "exponentiation",
126
  /* XS_CODE_EXTEND */ "extend",
127
  /* XS_CODE_FALSE */ "false",
128
  /* XS_CODE_FILE */ "file",
129
  /* XS_CODE_FOR_AWAIT_OF */ "for_await_of",
130
  /* XS_CODE_FOR_IN */ "for_in",
131
  /* XS_CODE_FOR_OF */ "for_of",
132
  /* XS_CODE_FUNCTION */ "function",
133
  /* XS_CODE_FUNCTION_ENVIRONMENT */ "function_environment",
134
  /* XS_CODE_GENERATOR_FUNCTION */ "generator",
135
  /* XS_CODE_GET_CLOSURE_1 */ "get_closure",
136
  /* XS_CODE_GET_CLOSURE_2 */ "get_closure_2",
137
  /* XS_CODE_GET_LOCAL_1 */ "get_local",
138
  /* XS_CODE_GET_LOCAL_2 */ "get_local_2",
139
  /* XS_CODE_GET_PRIVATE_1 */ "get_private",
140
  /* XS_CODE_GET_PRIVATE_2 */ "get_private_2",
141
  /* XS_CODE_GET_PROPERTY */ "get_property",
142
  /* XS_CODE_GET_PROPERTY_AT */ "get_property_at",
143
  /* XS_CODE_GET_RESULT */ "get_result",
144
  /* XS_CODE_GET_SUPER */ "get_super",
145
  /* XS_CODE_GET_SUPER_AT */ "get_super_at",
146
  /* XS_CODE_GET_THIS */ "get_this",
147
  /* XS_CODE_GET_THIS_VARIABLE */ "get_this_variable",
148
  /* XS_CODE_GET_VARIABLE */ "get_variable",
149
  /* XS_CODE_GLOBAL */ "global",
150
  /* XS_CODE_HAS_PRIVATE_1 */ "has_private",
151
  /* XS_CODE_HAS_PRIVATE_2 */ "has_private_2",
152
  /* XS_CODE_HOST */ "host",
153
  /* XS_CODE_IMPORT */ "import",
154
  /* XS_CODE_IMPORT_META */ "import.meta",
155
  /* XS_CODE_IN */ "in",
156
  /* XS_CODE_INCREMENT */ "increment",
157
  /* XS_CODE_INSTANCEOF */ "instanceof",
158
  /* XS_CODE_INSTANTIATE */ "instantiate",
159
  /* XS_CODE_INTEGER_1 */ "integer",
160
  /* XS_CODE_INTEGER_2 */ "integer_2",
161
  /* XS_CODE_INTEGER_4 */ "integer_4",
162
  /* XS_CODE_LEFT_SHIFT */ "left_shift",
163
  /* XS_CODE_LESS */ "less",
164
  /* XS_CODE_LESS_EQUAL */ "less_equal",
165
  /* XS_CODE_LET_CLOSURE_1 */ "let_closure",
166
  /* XS_CODE_LET_CLOSURE_2 */ "let_closure_2",
167
  /* XS_CODE_LET_LOCAL_1 */ "let_local",
168
  /* XS_CODE_LET_LOCAL_2 */ "let_local_2",
169
  /* XS_CODE_LINE */ "line",
170
  /* XS_CODE_MINUS */ "minus",
171
  /* XS_CODE_MODULE */ "module",
172
  /* XS_CODE_MODULO */ "modulo",
173
  /* XS_CODE_MORE */ "more",
174
  /* XS_CODE_MORE_EQUAL */ "more_equal",
175
  /* XS_CODE_MULTIPLY */ "multiply",
176
  /* XS_CODE_NAME */ "name",
177
  /* XS_CODE_NEW */ "new",
178
  /* XS_CODE_NEW_CLOSURE */ "new_closure",
179
  /* XS_CODE_NEW_LOCAL */ "new_local",
180
  /* XS_CODE_NEW_PRIVATE_1 */ "new_private",
181
  /* XS_CODE_NEW_PRIVATE_2 */ "new_private_2",
182
  /* XS_CODE_NEW_PROPERTY */ "new_property",
183
  /* XS_CODE_NEW_PROPERTY_AT */ "new_property_at",
184
  /* XS_CODE_NEW_TEMPORARY */ "new_temporary",
185
  /* XS_CODE_NOT */ "not",
186
  /* XS_CODE_NOT_EQUAL */ "not_equal",
187
  /* XS_CODE_NULL */ "null",
188
  /* XS_CODE_NUMBER */ "number",
189
  /* XS_CODE_OBJECT */ "object",
190
  /* XS_CODE_PLUS */ "plus",
191
  /* XS_CODE_POP */ "pop",
192
  /* XS_CODE_PROGRAM_ENVIRONMENT */ "program_environment",
193
  /* XS_CODE_PROGRAM_REFERENCE */ "program_reference",
194
  /* XS_CODE_PULL_CLOSURE_1 */ "pull_closure",
195
  /* XS_CODE_PULL_CLOSURE_2 */ "pull_closure_2",
196
  /* XS_CODE_PULL_LOCAL_1 */ "pull_local",
197
  /* XS_CODE_PULL_LOCAL_2 */ "pull_local_2",
198
  /* XS_CODE_REFRESH_CLOSURE_1 */ "refresh_closure",
199
  /* XS_CODE_REFRESH_CLOSURE_2 */ "refresh_closure_2",
200
  /* XS_CODE_REFRESH_LOCAL_1 */ "refresh_local",
201
  /* XS_CODE_REFRESH_LOCAL_2 */ "refresh_local_2",
202
  /* XS_CODE_REGEXP */ "regexp",
203
  /* XS_CODE_RESERVE_1 */ "reserve",
204
  /* XS_CODE_RESERVE_2 */ "reserve_2",
205
  /* XS_CODE_RESET_CLOSURE_1 */ "reset_closure",
206
  /* XS_CODE_RESET_CLOSURE_2 */ "reset_closure_2",
207
  /* XS_CODE_RESET_LOCAL_1 */ "reset_local",
208
  /* XS_CODE_RESET_LOCAL_2 */ "reset_local_2",
209
  /* XS_CODE_RETHROW */ "rethrow",
210
  /* XS_CODE_RETRIEVE_1 */ "retrieve",
211
  /* XS_CODE_RETRIEVE_2 */ "retrieve_2",
212
  /* XS_CODE_RETRIEVE_TARGET */ "retrieve_target",
213
  /* XS_CODE_RETRIEVE_THIS */ "retrieve_this",
214
  /* XS_CODE_RETURN */ "return",
215
  /* XS_CODE_RUN */ "run",
216
  /* XS_CODE_RUN_1 */ "run_1",
217
  /* XS_CODE_RUN_2 */ "run_2",
218
  /* XS_CODE_RUN_4 */ "run_4",
219
  /* XS_CODE_RUN_TAIL */ "run_tail",
220
  /* XS_CODE_RUN_TAIL_1 */ "run_tail_1",
221
  /* XS_CODE_RUN_TAIL_2 */ "run_tail_2",
222
  /* XS_CODE_RUN_TAIL_4 */ "run_tail_4",
223
  /* XS_CODE_SET_CLOSURE_1 */ "set_closure",
224
  /* XS_CODE_SET_CLOSURE_2 */ "set_closure_2",
225
  /* XS_CODE_SET_HOME */ "set_home",
226
  /* XS_CODE_SET_LOCAL_1 */ "set_local",
227
  /* XS_CODE_SET_LOCAL_2 */ "set_local_2",
228
  /* XS_CODE_SET_PRIVATE_1 */ "set_private",
229
  /* XS_CODE_SET_PRIVATE_2 */ "set_private_2",
230
  /* XS_CODE_SET_PROPERTY */ "set_property",
231
  /* XS_CODE_SET_PROPERTY_AT */ "set_property_at",
232
  /* XS_CODE_SET_RESULT */ "set_result",
233
  /* XS_CODE_SET_SUPER */ "set_super",
234
  /* XS_CODE_SET_SUPER_AT */ "set_super_at",
235
  /* XS_CODE_SET_THIS */ "set_this",
236
  /* XS_CODE_SET_VARIABLE */ "set_variable",
237
  /* XS_CODE_SIGNED_RIGHT_SHIFT */ "signed_right_shift",
238
  /* XS_CODE_START_ASYNC */ "start_async",
239
  /* XS_CODE_START_ASYNC_GENERATOR */ "start_async_generator",
240
  /* XS_CODE_START_GENERATOR */ "start_generator",
241
  /* XS_CODE_STORE_1 */ "store_1",
242
  /* XS_CODE_STORE_2 */ "store_2",
243
  /* XS_CODE_STORE_ARROW */ "store_arrow",
244
  /* XS_CODE_STRICT_EQUAL */ "strict_equal",
245
  /* XS_CODE_STRICT_NOT_EQUAL */ "strict_not_equal",
246
  /* XS_CODE_STRING_1 */ "string",
247
  /* XS_CODE_STRING_2 */ "string_2",
248
  /* XS_CODE_STRING_4 */ "string_4",
249
  /* XS_CODE_STRING_ARCHIVE_1 */ "string_archive",
250
  /* XS_CODE_STRING_ARCHIVE_2 */ "string_archive_2",
251
  /* XS_CODE_STRING_ARCHIVE_4 */ "string_archive_4",
252
  /* XS_CODE_SUBTRACT */ "subtract",
253
  /* XS_CODE_SUPER */ "super",
254
  /* XS_CODE_SWAP */ "swap",
255
  /* XS_CODE_SYMBOL */ "symbol",
256
  /* XS_CODE_TARGET */ "target",
257
  /* XS_CODE_TEMPLATE */ "template",
258
  /* XS_CODE_TEMPLATE_CACHE */ "template_cache",
259
  /* XS_CODE_THIS */ "this",
260
  /* XS_CODE_THROW */ "throw",
261
  /* XS_CODE_THROW_STATUS */ "throw_status",
262
  /* XS_CODE_TO_INSTANCE */ "to_instance",
263
  /* XS_CODE_TO_NUMERIC */ "to_numeric",
264
  /* XS_CODE_TO_STRING */ "to_string",
265
  /* XS_CODE_TRANSFER */ "transfer",
266
  /* XS_CODE_TRUE */ "true",
267
  /* XS_CODE_TYPEOF */ "typeof",
268
  /* XS_CODE_UNCATCH */ "uncatch",
269
  /* XS_CODE_UNDEFINED */ "undefined",
270
  /* XS_CODE_UNSIGNED_RIGHT_SHIFT */ "unsigned_right_shift",
271
  /* XS_CODE_UNWIND_1 */ "unwind",
272
  /* XS_CODE_UNWIND_2 */ "unwind_2",
273
  /* XS_CODE_VAR_CLOSURE_1 */ "var_closure_1",
274
  /* XS_CODE_VAR_CLOSURE_2 */ "var_closure_2",
275
  /* XS_CODE_VAR_LOCAL_1 */ "var_local_1",
276
  /* XS_CODE_VAR_LOCAL_2 */ "var_local_2",
277
  /* XS_CODE_VOID */ "void",
278
  /* XS_CODE_WITH */ "with",
279
  /* XS_CODE_WITHOUT */ "without",
280
  /* XS_CODE_YIELD */ "yield",
281
  /* XS_CODE_PROFILE */ "profile",
282
  /* XS_CODE_YIELD_STAR */ "yield*",
283
// mxExplicitResourceManagement 
284
  /* XS_CODE_USED_1 */ "used_1",
285
  /* XS_CODE_USED_2 */ "used_2",
286
  /* XS_CODE_USING */ "using",
287
  /* XS_CODE_USING_ASYNC */ "await using",
288
  /* XS_CODE_AT_2 */ "at_2",
289
  /* XS_CODE_SUPER_AT */ "super_at",
290
  /* XS_CODE_SUPER_AT_2 */ "super_at_2",
291
  /* XS_CODE_TRANSFER_JSON */ "transfer_json",
292
};
293
294
const txS1 gxCodeSizes[XS_CODE_COUNT] ICACHE_FLASH_ATTR = {
295
  1 /* XS_NO_CODE */,
296
  1 /* XS_CODE_ADD */,
297
  2 /* XS_CODE_ARGUMENT */,
298
  2 /* XS_CODE_ARGUMENTS */,
299
  2 /* XS_CODE_ARGUMENTS_SLOPPY */,
300
  2 /* XS_CODE_ARGUMENTS_STRICT */,
301
  1 /* XS_CODE_ARRAY */,
302
  0 /* XS_CODE_ASYNC_FUNCTION */,
303
  0 /* XS_CODE_ASYNC_GENERATOR_FUNCTION */,
304
  1 /* XS_CODE_AT */,
305
  1 /* XS_CODE_AWAIT */,
306
  2 /* XS_CODE_BEGIN_SLOPPY */,
307
  2 /* XS_CODE_BEGIN_STRICT */,
308
  2 /* XS_CODE_BEGIN_STRICT_BASE */,
309
  2 /* XS_CODE_BEGIN_STRICT_DERIVED */,
310
  2 /* XS_CODE_BEGIN_STRICT_FIELD */,
311
  -1 /* XS_CODE_BIGINT_1 */,
312
  -2 /* XS_CODE_BIGINT_2 */,
313
  1 /* XS_CODE_BIT_AND */,
314
  1 /* XS_CODE_BIT_NOT */,
315
  1 /* XS_CODE_BIT_OR */,
316
  1 /* XS_CODE_BIT_XOR */,
317
  2 /* XS_CODE_BRANCH_1 */,
318
  3 /* XS_CODE_BRANCH_2 */,
319
  5 /* XS_CODE_BRANCH_4 */,
320
  2 /* XS_CODE_BRANCH_CHAIN_1 */,
321
  3 /* XS_CODE_BRANCH_CHAIN_2 */,
322
  5 /* XS_CODE_BRANCH_CHAIN_4 */,
323
  2 /* XS_CODE_BRANCH_COALESCE_1 */,
324
  3 /* XS_CODE_BRANCH_COALESCE_2 */,
325
  5 /* XS_CODE_BRANCH_COALESCE_4 */,
326
  2 /* XS_CODE_BRANCH_ELSE_1 */,
327
  3 /* XS_CODE_BRANCH_ELSE_2 */,
328
  5 /* XS_CODE_BRANCH_ELSE_4 */,
329
  2 /* XS_CODE_BRANCH_IF_1 */,
330
  3 /* XS_CODE_BRANCH_IF_2 */,
331
  5 /* XS_CODE_BRANCH_IF_4 */,
332
  2 /* XS_CODE_BRANCH_STATUS_1 */,
333
  3 /* XS_CODE_BRANCH_STATUS_2 */,
334
  5 /* XS_CODE_BRANCH_STATUS_4 */,
335
  1 /* XS_CODE_CALL */,
336
  2 /* XS_CODE_CATCH_1 */,
337
  3 /* XS_CODE_CATCH_2 */,
338
  5 /* XS_CODE_CATCH_4 */,
339
  1 /* XS_CODE_CLASS */,
340
  1 /* XS_CODE_CHECK_INSTANCE */,
341
  2 /* XS_CODE_CODE_1 */,
342
  3 /* XS_CODE_CODE_2 */,
343
  5 /* XS_CODE_CODE_4 */,
344
  2 /* XS_CODE_CODE_ARCHIVE_1 */,
345
  3 /* XS_CODE_CODE_ARCHIVE_2 */,
346
  5 /* XS_CODE_CODE_ARCHIVE_4 */,
347
  2 /* XS_CODE_CONST_CLOSURE_1 */,
348
  3 /* XS_CODE_CONST_CLOSURE_2 */,
349
  2 /* XS_CODE_CONST_LOCAL_1 */,
350
  3 /* XS_CODE_CONST_LOCAL_2 */,
351
  0 /* XS_CODE_CONSTRUCTOR_FUNCTION */,
352
  1 /* XS_CODE_COPY_OBJECT */,
353
  1 /* XS_CODE_CURRENT */,
354
  1 /* XS_CODE_DEBUGGER */,
355
  1 /* XS_CODE_DECREMENT */,
356
  0 /* XS_CODE_DELETE_PROPERTY */,
357
  1 /* XS_CODE_DELETE_PROPERTY_AT */,
358
  0 /* XS_CODE_DELETE_SUPER */,
359
  1 /* XS_CODE_DELETE_SUPER_AT */,
360
  1 /* XS_CODE_DIVIDE */,
361
  1 /* XS_CODE_DUB */,
362
  1 /* XS_CODE_DUB_AT */,
363
  1 /* XS_CODE_END */,
364
  1 /* XS_CODE_END_ARROW */,
365
  1 /* XS_CODE_END_BASE */,
366
  1 /* XS_CODE_END_DERIVED */,
367
  1 /* XS_CODE_ENVIRONMENT */,
368
  1 /* XS_CODE_EQUAL */,
369
  1 /* XS_CODE_EVAL */,
370
  1 /* XS_CODE_EVAL_ENVIRONMENT */,
371
  0 /* XS_CODE_EVAL_PRIVATE */,
372
  0 /* XS_CODE_EVAL_REFERENCE */,
373
  1 /* XS_CODE_EVAL_TAIL */,
374
  1 /* XS_CODE_EXCEPTION */,
375
  1 /* XS_CODE_EXPONENTIATION */,
376
  1 /* XS_CODE_EXTEND */,
377
  1 /* XS_CODE_FALSE */,
378
  0 /* XS_CODE_FILE */,
379
  1 /* XS_CODE_FOR_AWAIT_OF */,
380
  1 /* XS_CODE_FOR_IN */,
381
  1 /* XS_CODE_FOR_OF */,
382
  0 /* XS_CODE_FUNCTION */,
383
  1 /* XS_CODE_FUNCTION_ENVIRONMENT */,
384
  0 /* XS_CODE_GENERATOR_FUNCTION */,
385
  2 /* XS_CODE_GET_CLOSURE_1 */,
386
  3 /* XS_CODE_GET_CLOSURE_2 */,
387
  2 /* XS_CODE_GET_LOCAL_1 */,
388
  3 /* XS_CODE_GET_LOCAL_2 */,
389
  2 /* XS_CODE_GET_PRIVATE_1 */,
390
  3 /* XS_CODE_GET_PRIVATE_2 */,
391
  0 /* XS_CODE_GET_PROPERTY */,
392
  1 /* XS_CODE_GET_PROPERTY_AT */,
393
  1 /* XS_CODE_GET_RESULT */,
394
  0 /* XS_CODE_GET_SUPER */,
395
  1 /* XS_CODE_GET_SUPER_AT */,
396
  1 /* XS_CODE_GET_THIS */,
397
  0 /* XS_CODE_GET_THIS_VARIABLE */,
398
  0 /* XS_CODE_GET_VARIABLE */,
399
  1 /* XS_CODE_GLOBAL */,
400
  2 /* XS_CODE_HAS_PRIVATE_1 */,
401
  3 /* XS_CODE_HAS_PRIVATE_2 */,
402
  3 /* XS_CODE_HOST */,
403
  1 /* XS_CODE_IMPORT */,
404
  1 /* XS_CODE_IMPORT_META */,
405
  1 /* XS_CODE_IN */,
406
  1 /* XS_CODE_INCREMENT */,
407
  1 /* XS_CODE_INSTANCEOF */,
408
  1 /* XS_CODE_INSTANTIATE */,
409
  2 /* XS_CODE_INTEGER_1 */,
410
  3 /* XS_CODE_INTEGER_2 */,
411
  5 /* XS_CODE_INTEGER_4 */,
412
  1 /* XS_CODE_LEFT_SHIFT */,
413
  1 /* XS_CODE_LESS */,
414
  1 /* XS_CODE_LESS_EQUAL */,
415
  2 /* XS_CODE_LET_CLOSURE_1 */,
416
  3 /* XS_CODE_LET_CLOSURE_2 */,
417
  2 /* XS_CODE_LET_LOCAL_1 */,
418
  3 /* XS_CODE_LET_LOCAL_2 */,
419
  3 /* XS_CODE_LINE */,
420
  1 /* XS_CODE_MINUS */,
421
  2 /* XS_CODE_MODULE */,
422
  1 /* XS_CODE_MODULO */,
423
  1 /* XS_CODE_MORE */,
424
  1 /* XS_CODE_MORE_EQUAL */,
425
  1 /* XS_CODE_MULTIPLY */,
426
  0 /* XS_CODE_NAME */,
427
  1 /* XS_CODE_NEW */,
428
  0 /* XS_CODE_NEW_CLOSURE */,
429
  0 /* XS_CODE_NEW_LOCAL */,
430
  2 /* XS_CODE_NEW_PRIVATE_1 */,
431
  3 /* XS_CODE_NEW_PRIVATE_2 */,
432
  0 /* XS_CODE_NEW_PROPERTY */,
433
  1 /* XS_CODE_NEW_PROPERTY_AT */,
434
  1 /* XS_CODE_NEW_TEMPORARY */,
435
  1 /* XS_CODE_NOT */,
436
  1 /* XS_CODE_NOT_EQUAL */,
437
  1 /* XS_CODE_NULL */,
438
  9 /* XS_CODE_NUMBER */,
439
  1 /* XS_CODE_OBJECT */,
440
  1 /* XS_CODE_PLUS */,
441
  1 /* XS_CODE_POP */,
442
  1 /* XS_CODE_PROGRAM_ENVIRONMENT */,
443
  0 /* XS_CODE_PROGRAM_REFERENCE */,
444
  2 /* XS_CODE_PULL_CLOSURE_1 */,
445
  3 /* XS_CODE_PULL_CLOSURE_2 */,
446
  2 /* XS_CODE_PULL_LOCAL_1 */,
447
  3 /* XS_CODE_PULL_LOCAL_2 */,
448
  2 /* XS_CODE_REFRESH_CLOSURE_1 */,
449
  3 /* XS_CODE_REFRESH_CLOSURE_2 */,
450
  2 /* XS_CODE_REFRESH_LOCAL_1 */,
451
  3 /* XS_CODE_REFRESH_LOCAL_2 */,
452
  1 /* XS_CODE_REGEXP */,
453
  2 /* XS_CODE_RESERVE_1 */,
454
  3 /* XS_CODE_RESERVE_2 */,
455
  2 /* XS_CODE_RESET_CLOSURE_1 */,
456
  3 /* XS_CODE_RESET_CLOSURE_2 */,
457
  2 /* XS_CODE_RESET_LOCAL_1 */,
458
  3 /* XS_CODE_RESET_LOCAL_2 */,
459
  1 /* XS_CODE_RETHROW */,
460
  2 /* XS_CODE_RETRIEVE_1 */,
461
  3 /* XS_CODE_RETRIEVE_2 */,
462
  1 /* XS_CODE_RETRIEVE_TARGET */,
463
  1 /* XS_CODE_RETRIEVE_THIS */,
464
  1 /* XS_CODE_RETURN */,
465
  1 /* XS_CODE_RUN */,
466
  2 /* XS_CODE_RUN_1 */,
467
  3 /* XS_CODE_RUN_2 */,
468
  5 /* XS_CODE_RUN_4 */,
469
  1 /* XS_CODE_RUN_TAIL */,
470
  2 /* XS_CODE_RUN_TAIL_1 */,
471
  3 /* XS_CODE_RUN_TAIL_2 */,
472
  5 /* XS_CODE_RUN_TAIL_4 */,
473
  2 /* XS_CODE_SET_CLOSURE_1 */,
474
  3 /* XS_CODE_SET_CLOSURE_2 */,
475
  1 /* XS_CODE_SET_HOME */,
476
  2 /* XS_CODE_SET_LOCAL_1 */,
477
  3 /* XS_CODE_SET_LOCAL_2 */,
478
  2 /* XS_CODE_SET_PRIVATE_1 */,
479
  3 /* XS_CODE_SET_PRIVATE_2 */,
480
  0 /* XS_CODE_SET_PROPERTY */,
481
  1 /* XS_CODE_SET_PROPERTY_AT */,
482
  1 /* XS_CODE_SET_RESULT */,
483
  0 /* XS_CODE_SET_SUPER */,
484
  1 /* XS_CODE_SET_SUPER_AT */,
485
  1 /* XS_CODE_SET_THIS */,
486
  0 /* XS_CODE_SET_VARIABLE */,
487
  1 /* XS_CODE_SIGNED_RIGHT_SHIFT */,
488
  1 /* XS_CODE_START_ASYNC */,
489
  1 /* XS_CODE_START_ASYNC_GENERATOR */,
490
  1 /* XS_CODE_START_GENERATOR */,
491
  2 /* XS_CODE_STORE_1 */,
492
  3 /* XS_CODE_STORE_2 */,
493
  1 /* XS_CODE_STORE_ARROW */,
494
  1 /* XS_CODE_STRICT_EQUAL */,
495
  1 /* XS_CODE_STRICT_NOT_EQUAL */,
496
  -1 /* XS_CODE_STRING_1 */,
497
  -2 /* XS_CODE_STRING_2 */,
498
  -4 /* XS_CODE_STRING_4 */,
499
  -1 /* XS_CODE_STRING_ARCHIVE_1 */,
500
  -2 /* XS_CODE_STRING_ARCHIVE_2 */,
501
  -4 /* XS_CODE_STRING_ARCHIVE_4 */,
502
  1 /* XS_CODE_SUBTRACT */,
503
  1 /* XS_CODE_SUPER */,
504
  1 /* XS_CODE_SWAP */,
505
  0 /* XS_CODE_SYMBOL */,
506
  1 /* XS_CODE_TARGET */,
507
  1 /* XS_CODE_TEMPLATE */,
508
  1 /* XS_CODE_TEMPLATE_CACHE */,
509
  1 /* XS_CODE_THIS */,
510
  1 /* XS_CODE_THROW */,
511
  1 /* XS_CODE_THROW_STATUS */,
512
  1 /* XS_CODE_TO_INSTANCE */,
513
  1 /* XS_CODE_TO_NUMERIC */,
514
  1 /* XS_CODE_TO_STRING */,
515
  1 /* XS_CODE_TRANSFER */,
516
  1 /* XS_CODE_TRUE */,
517
  1 /* XS_CODE_TYPEOF */,
518
  1 /* XS_CODE_UNCATCH */,
519
  1 /* XS_CODE_UNDEFINED */,
520
  1 /* XS_CODE_UNSIGNED_RIGHT_SHIFT */,
521
  2 /* XS_CODE_UNWIND_1 */,
522
  3 /* XS_CODE_UNWIND_2 */,
523
  2 /* XS_CODE_VAR_CLOSURE_1 */,
524
  3 /* XS_CODE_VAR_CLOSURE_2 */,
525
  2 /* XS_CODE_VAR_LOCAL_1 */,
526
  3 /* XS_CODE_VAR_LOCAL_2 */,
527
  1 /* XS_CODE_VOID */,
528
  1 /* XS_CODE_WITH */,
529
  1 /* XS_CODE_WITHOUT */,
530
  1 /* XS_CODE_YIELD */,
531
#ifdef mx32bitID
532
  5 /* XS_CODE_PROFILE */,
533
#else
534
  3 /* XS_CODE_PROFILE */,
535
#endif
536
  1 /* XS_CODE_YIELD_STAR */,
537
// mxExplicitResourceManagement 
538
  2 /* XS_CODE_USED_1 */,
539
  3 /* XS_CODE_USED_2 */,
540
  1 /* XS_CODE_USING */,
541
  1 /* XS_CODE_USING_ASYNC */,
542
  1 /* XS_CODE_AT_2 */,
543
  1 /* XS_CODE_SUPER_AT */,
544
  1 /* XS_CODE_SUPER_AT_2 */,
545
  1 /* XS_CODE_TRANSFER_JSON */,
546
};
547
548
#if mxUseDefaultCStackLimit
549
550
#if defined(__ets__) && !defined(__ZEPHYR__)
551
  #if ESP32
552
    #include "freertos/task.h"
553
  #else
554
    #include "cont.h"
555
  #endif
556
#endif
557
558
#ifndef mxASANStackMargin
559
  #define mxASANStackMargin 0
560
#endif
561
562
#if mxWindows
563
ULONG GetCurrentThreadStackLimits_Win7( _Out_ PULONG_PTR LowLimit, _Out_ PULONG_PTR HighLimit )
564
{
565
    static void (WINAPI* GetCurrentThreadStackLimits)(PULONG_PTR , PULONG_PTR);
566
567
    if (!GetCurrentThreadStackLimits)
568
    {
569
        *(void**)&GetCurrentThreadStackLimits = GetProcAddress(GetModuleHandle("kernel32"), "GetCurrentThreadStackLimits");
570
571
        if (!GetCurrentThreadStackLimits)
572
        {
573
            NT_TIB* tib = (NT_TIB*)NtCurrentTeb();
574
            *HighLimit = (ULONG_PTR)tib->StackBase;
575
576
            MEMORY_BASIC_INFORMATION mbi;
577
            if (VirtualQuery(tib->StackLimit, &mbi, sizeof(mbi)))
578
            {
579
                *LowLimit = (ULONG_PTR)mbi.AllocationBase;
580
                return 0;
581
            }
582
583
            return GetLastError();
584
        }
585
    }
586
587
    GetCurrentThreadStackLimits(LowLimit, HighLimit);
588
    return 0;
589
}
590
#endif
591
592
char* fxCStackLimit()
593
6.60k
{
594
  #if mxWindows
595
    ULONG_PTR low, high;
596
    GetCurrentThreadStackLimits_Win7(&low, &high);
597
    return (char*)low + (32 * 1024);
598
  #elif mxMacOSX
599
    pthread_t self = pthread_self();
600
      void* stackAddr = pthread_get_stackaddr_np(self);
601
      size_t stackSize = pthread_get_stacksize_np(self);
602
    return (char*)stackAddr - stackSize + (128 * 1024) + mxASANStackMargin;
603
  #elif mxLinux
604
6.60k
    char* result = C_NULL;
605
6.60k
    pthread_attr_t attrs;
606
6.60k
    pthread_attr_init(&attrs);
607
6.60k
    if (pthread_getattr_np(pthread_self(), &attrs) == 0) {
608
6.60k
        void* stackAddr;
609
6.60k
        size_t stackSize;
610
6.60k
      if (pthread_attr_getstack(&attrs, &stackAddr, &stackSize) == 0) {
611
6.60k
        result = (char*)stackAddr + (128 * 1024) + mxASANStackMargin;
612
6.60k
      }
613
6.60k
    }
614
6.60k
    pthread_attr_destroy(&attrs);
615
6.60k
    return result;
616
  #elif defined(__ets__) && !ESP32 && !defined(__ZEPHYR__)
617
    extern cont_t g_cont;
618
    return 192 + (char *)g_cont.stack;
619
  #elif defined(__ets__) && ESP32 && !defined(__ZEPHYR__)
620
    TaskStatus_t info;
621
    vTaskGetInfo(NULL, &info, pdFALSE, eReady);
622
    return 512 + (char *)info.pxStackBase;
623
  #else
624
    return C_NULL;
625
  #endif
626
6.60k
}
627
628
#endif
629
630
void fxDeleteScript(txScript* script)
631
6.60k
{
632
6.60k
  if (script) {
633
0
    if (script->symbolsBuffer)
634
0
      c_free(script->symbolsBuffer);
635
0
    if (script->hostsBuffer)
636
0
      c_free(script->hostsBuffer);
637
0
    if (script->codeBuffer)
638
0
      c_free(script->codeBuffer);
639
0
    c_free(script);
640
0
  }
641
6.60k
}
642
643
644
const txUTF8Sequence gxUTF8Sequences[] ICACHE_RODATA_ATTR = {
645
  {1, 0x80, 0x00, 0*6, 0x0000007F},
646
  {2, 0xE0, 0xC0, 1*6, 0x000007FF},
647
  {3, 0xF0, 0xE0, 2*6, 0x0000FFFF},
648
  {4, 0xF8, 0xF0, 3*6, 0x001FFFFF},
649
  {5, 0xFC, 0xF8, 4*6, 0x03FFFFFF},
650
  {6, 0xFE, 0xFC, 5*6, 0x7FFFFFFF},
651
  {0, 0, 0, 0, 0},
652
};
653
654
static const char gxHexLower[] ICACHE_FLASH_ATTR = "0123456789abcdef";
655
static const char gxHexUpper[] ICACHE_FLASH_ATTR = "0123456789ABCDEF";
656
657
txBoolean fxIsIdentifierFirst(txU4 c)
658
0
{
659
0
  #define mxIdentifierFirstCount 1372
660
0
  static const txU2 gxIdentifierFirstTable[mxIdentifierFirstCount] ICACHE_RODATA_ATTR = {
661
0
    36,0,29,25,5,0,2,25,48,0,11,0,5,0,6,22,2,30,2,457,5,11,15,4,8,0,2,0,130,4,2,1,
662
0
    3,3,2,0,7,0,2,2,2,0,2,19,2,82,2,138,9,165,2,37,3,0,7,40,72,26,5,3,46,42,36,1,
663
0
    2,98,2,0,16,1,8,1,11,2,3,0,17,0,2,29,30,88,12,0,25,32,10,1,5,0,6,21,5,0,10,0,
664
0
    4,0,24,24,8,10,6,23,2,6,17,41,59,53,4,0,19,0,8,9,16,15,5,7,3,1,3,21,2,6,2,0,
665
0
    4,3,4,0,17,0,14,1,2,2,15,1,11,0,9,5,5,1,3,21,2,6,2,1,2,1,2,1,32,3,2,0,
666
0
    20,2,17,8,2,2,2,21,2,6,2,1,2,4,4,0,19,0,16,1,24,0,12,7,3,1,3,21,2,6,2,1,
667
0
    2,4,4,0,31,1,2,2,16,0,18,0,2,5,4,2,2,3,4,1,2,0,2,1,4,1,4,2,4,11,23,0,
668
0
    53,7,2,2,2,22,2,15,4,0,27,2,2,1,3,1,31,0,5,7,2,2,2,22,2,9,2,4,4,0,31,2,
669
0
    2,1,16,1,18,8,2,2,2,40,3,0,17,0,6,2,9,2,25,5,6,17,4,23,2,8,2,0,3,6,59,47,
670
0
    2,1,13,6,59,1,2,0,2,4,2,23,2,0,2,9,2,1,10,0,3,4,2,0,22,3,33,0,64,7,2,35,
671
0
    28,4,116,42,21,0,17,5,5,3,4,0,4,1,8,2,5,12,13,0,18,37,2,0,6,0,3,42,2,332,2,3,
672
0
    3,6,2,0,2,3,3,40,2,3,3,32,2,3,3,6,2,0,2,3,3,14,2,56,2,3,3,66,38,15,17,85,
673
0
    3,5,4,619,3,16,2,25,6,74,4,10,8,17,14,18,15,17,15,12,2,2,16,51,36,0,5,0,68,88,8,40,
674
0
    2,0,6,69,11,30,50,29,3,4,12,43,5,25,55,22,10,52,83,0,94,46,18,7,55,29,14,1,11,43,27,35,
675
0
    42,2,11,35,3,10,6,42,3,2,42,3,2,5,2,1,4,0,6,191,65,277,3,5,3,37,3,5,3,7,2,0,
676
0
    2,0,2,0,2,30,3,52,2,6,2,0,4,2,2,6,4,3,3,5,5,12,6,2,2,6,117,0,14,0,17,12,
677
0
    102,0,5,0,3,9,2,0,3,5,7,0,2,0,2,0,2,15,3,3,6,4,5,0,18,40,2680,228,7,3,4,1,
678
0
    13,37,2,0,6,0,3,55,8,0,17,22,10,6,2,6,2,6,2,6,2,6,2,6,2,6,2,6,551,2,26,8,
679
0
    8,4,3,4,5,85,5,4,2,89,2,3,6,42,2,93,18,31,49,15,513,6591,65,22156,68,45,3,268,4,15,11,1,
680
0
    21,46,17,30,3,79,40,8,3,102,3,81,21,16,2,2,2,3,2,22,30,51,15,49,63,5,4,0,2,1,12,27,
681
0
    11,22,26,28,8,46,29,0,17,4,2,9,11,4,2,40,24,2,2,7,21,22,4,0,4,49,2,0,4,1,3,4,
682
0
    3,0,2,0,25,2,3,10,8,2,13,5,3,5,3,5,10,6,2,6,2,42,2,13,7,114,30,11171,13,22,5,48,
683
0
    8453,365,3,105,39,6,13,4,6,0,2,9,2,12,2,4,2,0,2,1,2,1,2,107,34,362,19,63,3,53,41,11,
684
0
    117,4,2,134,37,25,7,25,12,88,4,5,3,5,3,5,3,2,36,11,2,25,2,18,2,1,2,14,3,13,35,122,
685
0
    70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,13,10,
686
0
    2,14,2,6,2,1,2,10,2,14,2,6,2,1,4,51,13,310,10,21,11,7,25,5,2,41,2,8,70,5,3,0,
687
0
    2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,7,25,39,55,7,1,65,0,16,3,2,2,
688
0
    2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,39,27,10,22,251,41,
689
0
    7,1,17,5,57,28,11,0,9,21,43,17,47,20,28,22,13,52,58,1,3,0,14,44,33,24,27,35,30,0,3,0,
690
0
    9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,20,1,64,6,2,0,2,3,2,14,2,9,8,46,39,7,
691
0
    3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,31,9,2,0,3,0,2,37,2,0,26,0,2,0,45,52,
692
0
    19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,38,6,186,43,117,63,32,7,
693
0
    3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,
694
0
    19,72,200,32,32,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,24,43,261,18,
695
0
    16,0,2,12,2,33,125,0,80,921,103,110,18,195,2637,96,16,1071,18,5,26,3994,6,582,6842,29,1763,568,8,30,18,78,
696
0
    18,29,19,47,17,3,32,20,6,18,433,44,212,63,33,24,3,24,45,74,6,0,67,12,65,1,2,0,15,4,10,7381,
697
0
    42,31,98,114,8702,3,2,6,2,1,2,290,16,0,30,2,3,0,15,3,9,395,2309,106,6,12,4,8,8,9,5991,84,
698
0
    2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,
699
0
    4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,1845,30,7,5,262,61,
700
0
    147,44,11,6,17,0,322,29,19,43,485,27,229,29,3,0,208,30,2,2,2,1,2,6,3,4,10,1,225,6,2,3,
701
0
    2,1,2,14,2,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,
702
0
    2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,
703
0
    2,0,2,9,2,16,6,2,2,4,2,16,4421,42719,33,4381,3,5773,3,7472,16,621,2467,541,1507,4938,6,8489,
704
0
  };
705
0
  const txU2* p = gxIdentifierFirstTable;
706
0
  const txU2* q = p + mxIdentifierFirstCount;
707
0
  txU4 s = 0;
708
0
  while (p < q) {
709
0
    s += c_read16(p++);
710
0
    if (c < s)
711
0
      return 0;
712
0
    s += c_read16(p++);
713
0
    if (c <= s)
714
0
      return 1;
715
0
  }
716
0
  return 0;
717
0
}
718
719
txBoolean fxIsIdentifierNext(txU4 c)
720
0
{
721
0
  #define mxIdentifierNextCount 1598
722
0
  static const txU2 gxIdentifierNextTable[mxIdentifierNextCount] ICACHE_RODATA_ATTR = {
723
0
    36,0,12,9,8,25,5,0,2,25,48,0,11,0,2,0,3,0,6,22,2,30,2,457,5,11,15,4,8,0,2,0,
724
0
    18,116,2,1,3,3,2,0,7,4,2,0,2,19,2,82,2,138,2,4,3,165,2,37,3,0,7,40,9,44,2,0,
725
0
    2,1,2,1,2,0,9,26,5,3,30,10,6,73,5,101,2,7,3,9,2,18,3,0,17,58,3,100,15,53,5,0,
726
0
    3,0,3,45,19,27,5,10,6,23,2,6,8,74,2,128,3,9,2,18,2,7,3,1,3,21,2,6,2,0,4,3,
727
0
    3,8,3,1,3,3,9,0,5,1,2,4,3,11,11,0,2,0,3,2,2,5,5,1,3,21,2,6,2,1,2,1,
728
0
    2,1,3,0,2,4,5,1,3,2,4,0,8,3,2,0,8,15,12,2,2,8,2,2,2,21,2,6,2,1,2,4,
729
0
    3,9,2,2,2,2,3,0,16,3,3,9,10,6,2,2,2,7,3,1,3,21,2,6,2,1,2,4,3,8,3,1,
730
0
    3,2,8,2,5,1,2,4,3,9,2,0,17,1,2,5,4,2,2,3,4,1,2,0,2,1,4,1,4,2,4,11,
731
0
    5,4,4,2,2,3,3,0,7,0,15,9,17,12,2,2,2,22,2,15,3,8,2,2,2,3,8,1,2,2,2,1,
732
0
    3,3,3,9,17,3,2,7,2,2,2,22,2,9,2,4,3,8,2,2,2,3,8,1,6,2,2,3,3,9,2,2,
733
0
    13,12,2,2,2,50,2,2,2,4,6,3,8,4,3,9,11,5,2,2,2,17,4,23,2,8,2,0,3,6,4,0,
734
0
    5,5,2,0,2,7,7,9,3,1,14,57,6,14,2,9,40,1,2,0,2,4,2,23,2,0,2,22,3,4,2,0,
735
0
    2,6,2,9,3,3,33,0,24,1,7,9,12,0,2,0,2,0,5,9,2,35,5,19,2,17,2,35,10,0,58,73,
736
0
    7,77,3,37,2,0,6,0,3,42,2,332,2,3,3,6,2,0,2,3,3,40,2,3,3,32,2,3,3,6,2,0,
737
0
    2,3,3,14,2,56,2,3,3,66,3,2,10,8,15,15,17,85,3,5,4,619,3,16,2,25,6,74,4,10,8,21,
738
0
    10,21,12,19,13,12,2,2,2,1,13,83,4,0,5,1,3,9,34,2,2,10,7,88,8,42,6,69,11,30,2,11,
739
0
    5,11,11,39,3,4,12,43,5,25,7,10,38,27,5,62,2,28,3,10,7,9,14,0,9,13,2,30,3,11,21,76,
740
0
    4,9,18,8,13,115,13,55,9,9,4,48,3,10,6,42,3,2,17,2,2,38,6,533,3,5,3,37,3,5,3,7,
741
0
    2,0,2,0,2,0,2,30,3,52,2,6,2,0,4,2,2,6,4,3,3,5,5,12,6,2,2,6,16,1,50,1,
742
0
    20,0,29,0,14,0,17,12,52,12,5,0,4,11,18,0,5,0,3,9,2,0,3,5,7,0,2,0,2,0,2,15,
743
0
    3,3,6,4,5,0,18,40,2680,228,7,8,13,37,2,0,6,0,3,55,8,0,16,23,10,6,2,6,2,6,2,6,
744
0
    2,6,2,6,2,6,2,6,2,31,518,2,26,14,2,4,3,4,5,85,3,6,2,94,6,42,2,93,18,31,49,15,
745
0
    513,6591,65,22156,68,45,3,268,4,27,21,47,5,9,2,114,38,8,3,102,3,81,21,54,5,0,20,51,13,69,11,9,
746
0
    7,23,4,0,2,48,3,35,13,28,4,64,15,10,7,30,2,54,10,13,3,9,7,22,4,72,25,2,3,15,3,4,
747
0
    11,5,3,5,3,5,10,6,2,6,2,42,2,13,7,122,2,1,3,9,7,11171,13,22,5,48,8453,365,3,105,39,6,
748
0
    13,4,6,11,2,12,2,4,2,0,2,1,2,1,2,107,34,362,19,63,3,53,41,11,5,15,17,15,4,1,25,2,
749
0
    33,4,2,134,20,9,8,25,5,0,2,25,11,89,4,5,3,5,3,5,3,2,36,11,2,25,2,18,2,1,2,14,
750
0
    3,13,35,122,70,52,137,0,131,28,4,48,16,0,32,31,14,29,6,42,6,29,3,35,5,7,2,4,43,157,3,9,
751
0
    7,35,5,35,5,39,9,51,13,10,2,14,2,6,2,1,2,10,2,14,2,6,2,1,4,51,13,310,10,21,11,7,
752
0
    25,5,2,41,2,8,70,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,7,25,
753
0
    39,55,7,1,65,3,2,1,6,7,2,2,2,28,3,2,5,0,33,28,4,28,36,7,2,29,26,53,11,21,11,18,
754
0
    14,17,111,72,56,50,14,50,14,39,9,9,7,37,4,4,2,22,251,41,2,1,4,1,17,5,51,34,11,0,9,32,
755
0
    32,21,43,20,28,22,10,70,32,15,10,59,8,0,14,24,8,9,7,52,2,9,5,3,9,35,3,0,10,68,5,3,
756
0
    2,12,2,0,36,17,2,36,7,3,63,6,2,0,2,3,2,14,2,9,8,58,6,9,7,3,2,7,3,1,3,21,
757
0
    2,6,2,1,2,4,2,9,3,1,3,2,3,0,7,0,6,6,3,6,4,4,12,9,2,0,3,0,2,37,2,9,
758
0
    2,0,3,0,2,3,2,7,14,1,30,74,6,9,5,3,31,69,2,0,9,9,167,53,3,8,24,5,35,64,4,0,
759
0
    12,9,39,56,8,9,7,19,29,26,3,14,5,9,7,6,186,58,102,73,22,7,3,0,3,7,2,1,2,29,2,1,
760
0
    3,8,13,9,71,7,3,45,3,7,2,1,28,62,9,0,9,73,4,0,19,72,104,7,89,32,16,9,7,8,2,44,
761
0
    2,8,16,9,25,29,3,21,2,13,74,6,2,1,2,43,4,0,2,1,2,8,9,9,7,5,2,1,2,36,2,1,
762
0
    2,5,8,9,7,43,5,9,247,22,10,16,2,40,4,4,14,10,86,0,80,921,103,110,18,195,2637,96,16,1071,17,21,
763
0
    11,3994,6,582,6842,57,1735,568,8,30,2,9,7,78,2,9,7,29,3,4,12,54,10,3,13,9,10,20,6,18,433,44,
764
0
    4,9,199,63,33,24,3,24,45,74,5,56,8,16,65,1,2,1,12,6,10,7381,42,31,98,114,8702,3,2,6,2,1,
765
0
    2,290,16,0,30,2,3,0,15,3,9,395,2309,106,6,12,4,8,8,9,4,1,4178,9,519,45,3,22,543,4,4,5,
766
0
    9,7,3,6,31,3,149,2,444,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,
767
0
    2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,
768
0
    2,24,2,7,3,49,513,54,5,49,9,0,15,0,23,4,2,14,1105,30,7,5,214,6,2,16,3,6,2,1,2,4,
769
0
    6,61,34,0,113,44,4,13,3,9,5,0,322,30,18,57,471,41,215,42,198,30,2,21,9,1,225,6,2,3,2,1,
770
0
    2,14,2,196,12,6,42,75,5,9,1191,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,
771
0
    2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,
772
0
    2,0,2,9,2,16,6,2,2,4,2,16,3381,9,1031,42719,33,4381,3,5773,3,7472,16,621,2467,541,1507,4938,6,8489,
773
0
  };
774
0
  const txU2* p = gxIdentifierNextTable;
775
0
  const txU2* q = p + mxIdentifierNextCount;
776
0
  txU4 s = 0;
777
0
  while (p < q) {
778
0
    s += c_read16(p++);
779
0
    if (c < s)
780
0
      return 0;
781
0
    s += c_read16(p++);
782
0
    if (c <= s)
783
0
      return 1;
784
0
  }
785
0
  s += 707719;
786
0
  if (c < s)
787
0
    return 0;
788
0
  s += 239;
789
0
  if (c <= s)
790
0
    return 1;
791
0
  return 0;
792
0
}
793
794
txBoolean fxIsSpace(txInteger character)
795
12.0M
{
796
12.0M
  static const txU4 spaces[27] ICACHE_RODATA_ATTR = {
797
12.0M
    0x00000009,
798
12.0M
        0x0000000A,
799
12.0M
        0x0000000B,
800
12.0M
        0x0000000C,
801
12.0M
        0x0000000D,
802
12.0M
    0x00000020,
803
12.0M
    0x000000A0,
804
12.0M
    0x00001680,
805
12.0M
    0x00002000,
806
12.0M
    0x00002001,
807
12.0M
    0x00002002,
808
12.0M
    0x00002003,
809
12.0M
    0x00002004,
810
12.0M
    0x00002005,
811
12.0M
    0x00002006,
812
12.0M
    0x00002007,
813
12.0M
    0x00002008,
814
12.0M
    0x00002009,
815
12.0M
    0x0000200A,
816
12.0M
    0x00002028,
817
12.0M
    0x00002029,
818
12.0M
    0x0000202F,
819
12.0M
    0x0000205F,
820
12.0M
    0x00003000,
821
12.0M
    0x0000FEFF,
822
12.0M
    0xFFFFFFFF,
823
12.0M
    0x00000000,
824
12.0M
  };
825
12.0M
  const txU4 *p = spaces;
826
12.0M
  txU4 c = (txU4)character;
827
12.0M
  txU4 s;
828
85.6M
  while ((s = *p++)) {
829
85.6M
    if (c < s)
830
12.0M
      return 0;
831
73.6M
    if (c == s)
832
2.46k
      return 1;
833
73.6M
  }
834
0
  return 0;
835
12.0M
}
836
837
txBoolean fxParseHex(txU1 c, txU4* value)
838
81.8k
{
839
81.8k
  if (('0' <= c) && (c <= '9'))
840
39.0k
    *value = (*value * 16) + (c - '0');
841
42.8k
  else if (('a' <= c) && (c <= 'f'))
842
12.9k
    *value = (*value * 16) + (10 + c - 'a');
843
29.9k
  else if (('A' <= c) && (c <= 'F'))
844
29.7k
    *value = (*value * 16) + (10 + c - 'A');
845
206
  else
846
206
    return 0;
847
81.6k
  return 1;
848
81.8k
}
849
850
txBoolean fxParseHexEscape(txString* string, txInteger* character)
851
0
{
852
0
  txU1* p = *((txU1**)string);
853
0
  txU4 value = 0;
854
0
  txU1 i, c;
855
0
  for (i = 0; i < 2; i++) {
856
0
    c = c_read8(p);
857
0
    if (!fxParseHex(c, &value))
858
0
      return 0;
859
0
    p++;
860
0
  }
861
0
  *character = (txInteger)value;
862
0
  *string = (txString)p;
863
0
  return 1;
864
0
}
865
866
txBoolean fxParseUnicodeEscape(txString* string, txInteger* character, txInteger braces, txInteger separator)
867
15.5k
{
868
15.5k
  txU1* p = *((txU1**)string);
869
15.5k
  txU4 value = 0;
870
15.5k
  txU1 c;
871
15.5k
  txInteger i;
872
  
873
15.5k
  c = c_read8(p++);
874
15.5k
  if (braces && (c == '{')) {
875
0
    c = c_read8(p++);
876
0
    for (i = 0; value < 0x00110000; i++) {
877
0
      if (fxParseHex(c, &value)) {
878
0
        c = c_read8(p++);
879
0
      }
880
0
      else
881
0
        break;
882
0
    }
883
0
    if ((c == '}') && (i > 0) && (value < 0x00110000)) {
884
0
      *character = (txInteger)value;
885
0
      *string = (txString)p;
886
0
      return 1;
887
0
    }
888
0
    return 0;
889
0
  }
890
15.5k
  if (!fxParseHex(c, &value)) return 0;
891
15.4k
  c = c_read8(p++);
892
15.4k
  if (!fxParseHex(c, &value)) return 0;
893
15.4k
  c = c_read8(p++);
894
15.4k
  if (!fxParseHex(c, &value)) return 0;
895
15.3k
  c = c_read8(p++);
896
15.3k
  if (!fxParseHex(c, &value)) return 0;
897
15.3k
  *character = (txInteger)value;
898
15.3k
  *string = (txString)p;
899
15.3k
  c = c_read8(p++);
900
15.3k
  if (c && (c == separator) && (0x0000D800 <= value) && (value <= 0x0000DBFF)) {
901
5.25k
    c = c_read8(p++);
902
5.25k
    if (c == 'u') {
903
5.04k
      txU4 other = 0;
904
5.04k
      c = c_read8(p++);
905
5.04k
      if (!fxParseHex(c, &other)) return 1;
906
5.01k
      c = c_read8(p++);
907
5.01k
      if (!fxParseHex(c, &other)) return 1;
908
5.01k
      c = c_read8(p++);
909
5.01k
      if (!fxParseHex(c, &other)) return 1;
910
5.00k
      c = c_read8(p++);
911
5.00k
      if (!fxParseHex(c, &other)) return 1;
912
5.00k
      if ((0x0000DC00 <= other) && (other <= 0x0000DFFF)) {
913
3.66k
        *character = (txInteger)(0x00010000 + ((value & 0x03FF) << 10) + (other & 0x03FF));
914
3.66k
        *string = (txString)p;
915
3.66k
      }
916
5.00k
    }
917
5.25k
  }
918
15.3k
  return 1;
919
15.3k
}
920
921
txString fxSkipSpaces(txString string) 
922
14.1M
{
923
14.1M
  txString p = string;
924
14.1M
  txString q = p;
925
14.1M
  txInteger c;
926
14.1M
  while (((q = fxUTF8Decode(q, &c))) && (c != C_EOF)) {
927
12.0M
    if (fxIsSpace(c))
928
2.46k
      p = q;
929
12.0M
    else
930
12.0M
      break;
931
12.0M
  }
932
14.1M
  return p;
933
14.1M
}
934
935
txString fxStringifyHexEscape(txString string, txInteger character)
936
0
{
937
0
  const char* digits = gxHexUpper;
938
0
  txU1* p = (txU1*)string;
939
0
  *p++ = c_read8(digits + ((character & 0x000000F0) >> 4));
940
0
  *p++ = c_read8(digits + (character & 0x0000000F));
941
0
  return (txString)p;
942
0
}
943
944
txString fxStringifyUnicodeEscape(txString string, txInteger character, txInteger separator)
945
0
{
946
0
  const char* digits = (separator == '%') ? gxHexUpper : gxHexLower;
947
0
  txU1* p = (txU1*)string;
948
0
  txInteger surrogate;
949
0
  if (character > 0xFFFF) {
950
0
    character -= 0x10000;
951
0
    surrogate = 0xDC00 | (character & 0x3FF);
952
0
    character = 0xD800 | (character >> 10);
953
0
  }
954
0
  else
955
0
    surrogate = 0;
956
0
  *p++ = c_read8(digits + ((character & 0x0000F000) >> 12));
957
0
  *p++ = c_read8(digits + ((character & 0x00000F00) >> 8));
958
0
  *p++ = c_read8(digits + ((character & 0x000000F0) >> 4));
959
0
  *p++ = c_read8(digits + (character & 0x0000000F));
960
0
  if (surrogate) {
961
0
    *p++ = separator;
962
0
    *p++ = 'u';
963
0
    *p++ = c_read8(digits + ((surrogate & 0x0000F000) >> 12));
964
0
    *p++ = c_read8(digits + ((surrogate & 0x00000F00) >> 8));
965
0
    *p++ = c_read8(digits + ((surrogate & 0x000000F0) >> 4));
966
0
    *p++ = c_read8(digits + (surrogate & 0x0000000F));
967
0
  }
968
0
  return (txString)p;
969
0
}
970
971
int fxUTF8Compare(txString p1, txString p2)
972
0
{
973
0
  register const unsigned char *s1 = (const unsigned char *) p1;
974
0
  register const unsigned char *s2 = (const unsigned char *) p2;
975
0
  unsigned char c1, c2;
976
0
  do {
977
0
    c1 = (unsigned char) *s1++;
978
0
    c2 = (unsigned char) *s2++;
979
0
    if (c1 == '\0')
980
0
      return c1 - c2;
981
0
  }
982
0
  while (c1 == c2);
983
0
  if (c2 == '\0')
984
0
    return c1 - c2;
985
0
  if ((c1 == 0xC0) && (*s1 == 0x80))
986
0
    return 0 - c2;
987
0
  if ((c2 == 0xC0) && (*s2 == 0x80))
988
0
    return c1 - 0;
989
0
  return c1 - c2;
990
0
}
991
992
txString fxUTF8Decode(txString string, txInteger* character)
993
81.2M
{
994
81.2M
  txU1* p = (txU1*)string;
995
81.2M
  txU4 c = c_read8(p++);
996
81.2M
  if (c) {
997
79.1M
    if (c & 0x80) {
998
3.03M
      const txUTF8Sequence *sequence;
999
3.03M
      txS4 size;
1000
9.12M
      for (sequence = gxUTF8Sequences; sequence->size; sequence++) {
1001
9.12M
        if ((c & sequence->cmask) == sequence->cval)
1002
3.03M
          break;
1003
9.12M
      }
1004
3.03M
      size = sequence->size - 1;
1005
9.12M
      while (size > 0) {
1006
6.08M
        size--;
1007
6.08M
        c = (c << 6) | (c_read8(p++) & 0x3F);
1008
6.08M
      }
1009
3.03M
      c &= sequence->lmask;
1010
3.03M
    }
1011
79.1M
    *character = (txInteger)c;
1012
79.1M
    return (txString)p;
1013
79.1M
  }
1014
2.10M
  *character = C_EOF;
1015
2.10M
  return (txString)p;
1016
81.2M
}
1017
1018
txString fxUTF8Encode(txString string, txInteger character)
1019
21.5k
{
1020
21.5k
  txU1* p = (txU1*)string;
1021
21.5k
  if (character < 0) {
1022
0
  }
1023
21.5k
  else if (character == 0) {
1024
0
    *p++ = 0xC0;
1025
0
    *p++ = 0x80;
1026
0
  }
1027
21.5k
  else if (character < 0x80) {
1028
0
    *p++ = (txU1)character;
1029
0
  }
1030
21.5k
  else if (character < 0x800) {
1031
0
    *p++ = (txU1)(0xC0 | (((txU4)character) >> 6));
1032
0
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1033
0
  }
1034
21.5k
  else if (character < 0x10000) {
1035
21.5k
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1036
21.5k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1037
21.5k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1038
21.5k
  }
1039
0
  else if (character < 0x110000) {
1040
0
    *p++ = (txU1)(0xF0 | (((txU4)character) >> 18));
1041
0
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 12) & 0x3F));
1042
0
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1043
0
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1044
0
  }
1045
21.5k
  return (txString)p;
1046
21.5k
}
1047
1048
txSize fxUTF8Length(txInteger character)
1049
0
{
1050
0
  txSize length;
1051
0
  if (character < 0)
1052
0
    length = 0;
1053
0
  else if (character == 0)
1054
0
    length = 2;
1055
0
  else if (character < 0x80)
1056
0
    length = 1;
1057
0
  else if (character < 0x800)
1058
0
    length = 2;
1059
0
  else if (character < 0x10000)
1060
0
    length = 3;
1061
0
  else if (character < 0x110000)
1062
0
    length = 4;
1063
0
  else
1064
0
    length = 0;
1065
0
  return length;
1066
0
}
1067
1068
#if mxCESU8
1069
1070
int fxCESU8Compare(txString p1, txString p2)
1071
0
{
1072
0
  txInteger c1, c2;
1073
0
  while (*p1 && *p2) {
1074
0
    p1 = fxCESU8Decode(p1, &c1);
1075
0
    p2 = fxCESU8Decode(p2, &c2);
1076
0
    if (c1 < c2) return -1;
1077
0
    if (c1 > c2) return 1;
1078
0
  }
1079
0
  if (*p1) return 1;
1080
0
  if (*p2) return -1;
1081
0
  return 0;
1082
0
}
1083
1084
txString fxCESU8Decode(txString string, txInteger* character)
1085
67.1M
{
1086
67.1M
  txInteger result;
1087
67.1M
  string = fxUTF8Decode(string, &result);
1088
67.1M
  if ((0x0000D800 <= result) && (result <= 0x0000DBFF)) {
1089
9.03k
    txString former = string;
1090
9.03k
    txInteger surrogate;
1091
9.03k
    string = fxUTF8Decode(former, &surrogate);
1092
9.03k
    if ((0x0000DC00 <= surrogate) && (surrogate <= 0x0000DFFF))
1093
8.08k
      result = 0x00010000 + ((result & 0x000003FF) << 10) + (surrogate & 0x000003FF);
1094
947
    else
1095
947
      string = former;
1096
9.03k
  }
1097
67.1M
  *character = result;
1098
67.1M
  return string;
1099
67.1M
}
1100
1101
txString fxCESU8Encode(txString string, txInteger character)
1102
51.9k
{
1103
51.9k
  txU1* p = (txU1*)string;
1104
51.9k
  if (character < 0) {
1105
0
  }
1106
51.9k
  else if (character == 0) {
1107
1.14k
    *p++ = 0xC0;
1108
1.14k
    *p++ = 0x80;
1109
1.14k
  }
1110
50.8k
  else if (character < 0x80) {
1111
44.6k
    *p++ = (txU1)character;
1112
44.6k
  }
1113
6.20k
  else if (character < 0x800) {
1114
290
    *p++ = (txU1)(0xC0 | (((txU4)character) >> 6));
1115
290
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1116
290
  }
1117
5.91k
  else if (character < 0x10000) {
1118
4.08k
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1119
4.08k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1120
4.08k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1121
4.08k
  }
1122
1.82k
  else if (character < 0x110000) {
1123
1.82k
    txInteger surrogate;
1124
1.82k
    character -= 0x00010000;
1125
1.82k
    surrogate = 0xDC00 | (character & 0x3FF);
1126
1.82k
    character = 0xD800 | ((character >> 10) & 0x3FF);
1127
1.82k
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1128
1.82k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1129
1.82k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1130
1.82k
    *p++ = (txU1)(0xE0 | (((txU4)surrogate) >> 12));
1131
1.82k
    *p++ = (txU1)(0x80 | ((((txU4)surrogate) >> 6) & 0x3F));
1132
1.82k
    *p++ = (txU1)(0x80 | (((txU4)surrogate) & 0x3F));
1133
1.82k
  }
1134
51.9k
  return (txString)p;
1135
51.9k
}
1136
1137
txSize fxCESU8Length(txInteger character)
1138
64.2M
{
1139
64.2M
  txSize length;
1140
64.2M
  if (character < 0)
1141
0
    length = 0;
1142
64.2M
  else if (character == 0)
1143
1.16k
    length = 2;
1144
64.2M
  else if (character < 0x80)
1145
61.2M
    length = 1;
1146
2.94M
  else if (character < 0x800)
1147
4.21k
    length = 2;
1148
2.94M
  else if (character < 0x10000)
1149
2.93M
    length = 3;
1150
9.92k
  else if (character < 0x110000)
1151
9.92k
    length = 6;
1152
0
  else
1153
0
    length = 0;
1154
64.2M
  return length;
1155
64.2M
}
1156
#endif
1157
1158
txSize fxUTF8ToUnicodeOffset(txString theString, txSize theOffset)
1159
0
{
1160
0
  txU1* p = (txU1*)theString;
1161
0
  txU1 c;
1162
0
  txSize unicodeOffset = 0;
1163
0
  txSize utf8Offset = 0;
1164
  
1165
0
  while ((c = c_read8(p++))) {
1166
0
    if ((c & 0xC0) != 0x80) {
1167
0
      if (utf8Offset == theOffset)
1168
0
        return unicodeOffset;
1169
0
      unicodeOffset++;
1170
0
    }
1171
0
    utf8Offset++;
1172
0
  }
1173
0
  if (utf8Offset == theOffset)
1174
0
    return unicodeOffset;
1175
0
  else
1176
0
    return -1;
1177
0
}
1178
1179
#if 1
1180
txSize fxUnicodeLength(txString theString, txSize* byteLength)
1181
0
{
1182
0
  txU1* p = (txU1*)theString;
1183
0
  txU1 c;
1184
0
  txSize unicodeLength = 0;
1185
0
  txSize utf8Length = 0;
1186
  
1187
0
  while ((c = c_read8(p++))) {
1188
0
    if ((c & 0xC0) != 0x80)
1189
0
      unicodeLength++;
1190
0
    utf8Length++;
1191
0
  }
1192
0
  if (byteLength)
1193
0
    *byteLength = utf8Length;
1194
0
  return unicodeLength;
1195
0
}
1196
#else
1197
 // http://www.daemonology.net/blog/2008-06-05-faster-utf8-strlen.html
1198
1199
#define ONEMASK ((size_t)(-1) / 0xFF)
1200
1201
#if defined(__has_feature)
1202
  #if __has_feature(address_sanitizer)
1203
    __attribute__((no_sanitize("address"))) 
1204
  #endif
1205
#endif
1206
txSize fxUnicodeLength(txString _s, txSize* byteLength)
1207
{
1208
  const char * s;
1209
  size_t count = 0;
1210
  size_t u;
1211
  unsigned char b;
1212
1213
  /* Handle any initial misaligned bytes. */
1214
  for (s = _s; (uintptr_t)(s) & (sizeof(size_t) - 1); s++) {
1215
    b = c_read8(s);
1216
1217
    /* Exit if we hit a zero byte. */
1218
    if (b == '\0')
1219
      goto done;
1220
1221
    /* Is this byte NOT the first byte of a character? */
1222
    count += (b >> 7) & ((~b) >> 6);
1223
  }
1224
1225
  /* Handle complete blocks. */
1226
  for (; ; s += sizeof(size_t)) {
1227
    /* Grab 4 or 8 bytes of UTF-8 data. */
1228
    u = *(size_t *)(s);
1229
1230
    /* Exit the loop if there are any zero bytes. */
1231
    if ((u - ONEMASK) & (~u) & (ONEMASK * 0x80))
1232
      break;
1233
1234
    /* Count bytes which are NOT the first byte of a character. */
1235
    u = ((u & (ONEMASK * 0x80)) >> 7) & ((~u) >> 6);
1236
    count += (u * ONEMASK) >> ((sizeof(size_t) - 1) * 8);
1237
  }
1238
1239
  /* Take care of any left-over bytes. */
1240
  for (; ; s++) {
1241
    b = c_read8(s);
1242
1243
    /* Exit if we hit a zero byte. */
1244
    if (b == '\0')
1245
      break;
1246
1247
    /* Is this byte NOT the first byte of a character? */
1248
    count += (b >> 7) & ((~b) >> 6);
1249
  }
1250
1251
done:
1252
  return (txSize)((s - _s) - count);
1253
}
1254
#endif
1255
1256
txSize fxUnicodeToUTF8Offset(txString theString, txSize theOffset)
1257
0
{
1258
0
  txU1* p = (txU1*)theString;
1259
0
  txU1 c;
1260
0
  txSize unicodeOffset = 0;
1261
0
  txSize utf8Offset = 0;
1262
  
1263
0
    while ((c = c_read8(p++))) {
1264
0
    if ((c & 0xC0) != 0x80) {
1265
0
      if (unicodeOffset == theOffset)
1266
0
        return utf8Offset;
1267
0
      unicodeOffset++;
1268
0
    }
1269
0
        utf8Offset++;
1270
0
  }
1271
0
  if (unicodeOffset == theOffset)
1272
0
    return utf8Offset;
1273
0
  else
1274
0
    return -1;
1275
0
}
1276
1277
txFlag fxIntegerToIndex(void* the, txInteger theInteger, txIndex* theIndex)
1278
0
{
1279
0
  if (0 <= theInteger) {
1280
0
    *theIndex = (txIndex)theInteger;
1281
0
    return 1;
1282
0
  }
1283
0
  return 0;
1284
0
}
1285
1286
txFlag fxNumberToIndex(void* the, txNumber number, txIndex* theIndex)
1287
0
{
1288
0
  txIndex integer = (txIndex)number;
1289
0
  txNumber check = integer;
1290
0
  if ((number == check) && (integer < 4294967295u)) {
1291
0
    *theIndex = integer;
1292
0
    return 1;
1293
0
  }
1294
0
  return 0;
1295
0
}
1296
1297
txFlag fxStringToIndex(void* the, txString theString, txIndex* theIndex)
1298
2.50M
{
1299
2.50M
  char buffer[256], c;
1300
2.50M
  txNumber number;
1301
2.50M
  txIndex integer;
1302
2.50M
  txNumber check;
1303
1304
2.50M
  c = c_read8(theString);
1305
2.50M
  if (('+' != c) && ('-' != c) && ('.' != c) && !(('0' <= c) && ('9' >= c)))
1306
209k
    return 0;
1307
2.29M
  number = fxStringToNumber(the, theString, 1);
1308
2.29M
  integer = (txIndex)number;
1309
2.29M
  check = integer;
1310
2.29M
  if ((number == check) && (integer < 4294967295u)) {
1311
2.05M
    fxNumberToString(the, number, buffer, sizeof(buffer), 0, 0);
1312
2.05M
    if (!c_strcmp(theString, buffer)) {
1313
2.02M
      *theIndex = integer;
1314
2.02M
      return 1;
1315
2.02M
    }
1316
2.05M
  }
1317
265k
  return 0;
1318
2.29M
}
1319
1320
const txString gxIDStrings[XS_ID_COUNT] = {
1321
  "@",
1322
  "Symbol.asyncIterator",
1323
  "Symbol.hasInstance",
1324
  "Symbol.isConcatSpreadable",
1325
  "Symbol.iterator",
1326
  "Symbol.match",
1327
  "Symbol.matchAll",
1328
  "Symbol.replace",
1329
  "Symbol.search",
1330
  "Symbol.species",
1331
  "Symbol.split",
1332
  "Symbol.toPrimitive",
1333
  "Symbol.toStringTag",
1334
  "Symbol.unscopables",
1335
#if mxExplicitResourceManagement  
1336
  "Symbol.asyncDispose",
1337
  "Symbol.dispose",
1338
#endif
1339
  "AggregateError",
1340
  "Array",
1341
  "ArrayBuffer",
1342
  "Atomics",
1343
  "BigInt",
1344
  "BigInt64Array",
1345
  "BigUint64Array",
1346
  "Boolean",
1347
  "DataView",
1348
  "Date",
1349
  "Error",
1350
  "EvalError",
1351
  "FinalizationRegistry",
1352
  "Float32Array",
1353
  "Float64Array",
1354
  "Int16Array",
1355
  "Int32Array",
1356
  "Int8Array",
1357
  "JSON",
1358
  "Map",
1359
  "Math",
1360
  "ModuleSource",
1361
  "Number",
1362
  "Object",
1363
  "Promise",
1364
  "Proxy",
1365
  "RangeError",
1366
  "ReferenceError",
1367
  "Reflect",
1368
  "RegExp",
1369
  "Set",
1370
  "SharedArrayBuffer",
1371
  "String",
1372
  "Symbol",
1373
  "SyntaxError",
1374
  "TypeError",
1375
  "TypedArray",
1376
  "URIError",
1377
  "Uint16Array",
1378
  "Uint32Array",
1379
  "Uint8Array",
1380
  "Uint8ClampedArray",
1381
  "WeakMap",
1382
  "WeakRef",
1383
  "WeakSet",
1384
  "decodeURI",
1385
  "decodeURIComponent",
1386
  "encodeURI",
1387
  "encodeURIComponent",
1388
  "escape",
1389
  "isFinite",
1390
  "isNaN",
1391
  "parseFloat",
1392
  "parseInt",
1393
  "trace",
1394
  "unescape",
1395
#if mxECMAScript2025  
1396
  "Iterator",
1397
#endif
1398
#if mxExplicitResourceManagement  
1399
  "AsyncDisposableStack",
1400
  "DisposableStack",
1401
  "SuppressedError",
1402
#endif  
1403
#if mxFloat16
1404
  "Float16Array",
1405
#endif
1406
  "Infinity",
1407
  "NaN",
1408
  "undefined",
1409
  "Compartment",
1410
  "Function",
1411
#if mxModuleStuff
1412
  "ModuleStuff",
1413
#endif
1414
#if mxNative
1415
  "Native",
1416
  "native",
1417
#endif
1418
  "eval",
1419
  "AsyncFunction",
1420
  "AsyncGeneratorFunction",
1421
  "BYTES_PER_ELEMENT",
1422
  "E",
1423
  "EPSILON",
1424
  "Generator",
1425
  "GeneratorFunction",
1426
  "LN10",
1427
  "LN2",
1428
  "LOG10E",
1429
  "LOG2E",
1430
  "MAX_SAFE_INTEGER",
1431
  "MAX_VALUE",
1432
  "MIN_SAFE_INTEGER",
1433
  "MIN_VALUE",
1434
  "NEGATIVE_INFINITY",
1435
  "PI",
1436
  "POSITIVE_INFINITY",
1437
  "SQRT1_2",
1438
  "SQRT2",
1439
  "UTC",
1440
  "__defineGetter__",
1441
  "__defineSetter__",
1442
  "__lookupGetter__",
1443
  "__lookupSetter__",
1444
  "__proto__",
1445
  "abs",
1446
  "acos",
1447
  "acosh",
1448
  "add",
1449
  "aliases",
1450
  "all",
1451
  "allSettled",
1452
  "and",
1453
  "any",
1454
  "append",
1455
  "apply",
1456
  "arguments",
1457
  "as",
1458
  "asIntN",
1459
  "asUintN",
1460
  "asin",
1461
  "asinh",
1462
  "assign",
1463
  "asyncIterator",
1464
  "at",
1465
  "atan",
1466
  "atanh",
1467
  "atan2",
1468
  "bind",
1469
  "bindings",
1470
  "bitLength",
1471
  "boundArguments",
1472
  "boundFunction",
1473
  "boundThis",
1474
  "buffer",
1475
  "busy",
1476
  "byteLength",
1477
  "byteOffset",
1478
  "cache",
1479
  "call",
1480
  "callee",
1481
  "caller",
1482
  "catch",
1483
  "cause",
1484
  "cbrt",
1485
  "ceil",
1486
  "center",
1487
  "charAt",
1488
  "charCodeAt",
1489
  "chunk",
1490
  "chunkify",
1491
  "cleanupSome",
1492
  "clear",
1493
  "closure",
1494
  "clz32",
1495
  "codePointAt",
1496
  "compare",
1497
  "compareExchange",
1498
  "compile",
1499
  "concat",
1500
  "configurable",
1501
  "console",
1502
  "construct",
1503
  "constructor",
1504
  "copyWithin",
1505
  "cos",
1506
  "cosh",
1507
  "count",
1508
  "create",
1509
  "default",
1510
  "defineProperties",
1511
  "defineProperty",
1512
  "delete",
1513
  "deleteProperty",
1514
  "deref",
1515
  "description",
1516
  "done",
1517
  "dotAll",
1518
  "eachDown",
1519
  "eachUp",
1520
  "endsWith",
1521
  "entries",
1522
  "enumerable",
1523
  "enumerate",
1524
  "errors",
1525
  "evaluate",
1526
  "every",
1527
  "exchange",
1528
  "exec",
1529
  "exp",
1530
  "expm1",
1531
  "export",
1532
  "exports",
1533
  "fill",
1534
  "filter",
1535
  "finally",
1536
  "find",
1537
  "findIndex",
1538
  "findLast",
1539
  "findLastIndex",
1540
  "flags",
1541
  "flat",
1542
  "flatMap",
1543
  "floor",
1544
  "for",
1545
  "forEach",
1546
  "free",
1547
  "freeze",
1548
  "from",
1549
  "fromArrayBuffer",
1550
  "fromBigInt",
1551
  "fromCharCode",
1552
  "fromCodePoint",
1553
  "fromEntries",
1554
  "fromString",
1555
  "fround",
1556
  "function",
1557
  "get",
1558
  "getBigInt64",
1559
  "getBigUint64",
1560
  "getDate",
1561
  "getDay",
1562
  "getFloat32",
1563
  "getFloat64",
1564
  "getFullYear",
1565
  "getHours",
1566
  "getInt16",
1567
  "getInt32",
1568
  "getInt8",
1569
  "getMilliseconds",
1570
  "getMinutes",
1571
  "getMonth",
1572
  "getOwnPropertyDescriptor",
1573
  "getOwnPropertyDescriptors",
1574
  "getOwnPropertyNames",
1575
  "getOwnPropertySymbols",
1576
  "getPrototypeOf",
1577
  "getSeconds",
1578
  "getTime",
1579
  "getTimezoneOffset",
1580
  "getUTCDate",
1581
  "getUTCDay",
1582
  "getUTCFullYear",
1583
  "getUTCHours",
1584
  "getUTCMilliseconds",
1585
  "getUTCMinutes",
1586
  "getUTCMonth",
1587
  "getUTCSeconds",
1588
  "getUint16",
1589
  "getUint32",
1590
  "getUint8",
1591
  "getYear",
1592
  "global",
1593
  "globalThis",
1594
  "groups",
1595
  "grow",
1596
  "growable",
1597
  "has",
1598
  "hasIndices",
1599
  "hasInstance",
1600
  "hasOwn",
1601
  "hasOwnProperty",
1602
  "hypot",
1603
  "id",
1604
  "idiv",
1605
  "idivmod",
1606
  "ignoreCase",
1607
  "imod",
1608
  "import",
1609
  "importNow",
1610
  "imports",
1611
  "imul",
1612
  "imuldiv",
1613
  "includes",
1614
  "index",
1615
  "indexOf",
1616
  "indices",
1617
  "input",
1618
  "irem",
1619
  "is",
1620
  "isArray",
1621
  "isConcatSpreadable",
1622
  "isExtensible",
1623
  "isFrozen",
1624
  "isInteger",
1625
  "isLockFree",
1626
  "isPrototypeOf",
1627
  "isSafeInteger",
1628
  "isSealed",
1629
  "isView",
1630
  "iterable",
1631
  "iterator",
1632
  "join",
1633
  "keyFor",
1634
  "keys",
1635
  "lastIndex",
1636
  "lastIndexOf",
1637
  "left",
1638
  "length",
1639
  "line",
1640
  "load",
1641
  "local",
1642
  "localeCompare",
1643
  "log",
1644
  "log1p",
1645
  "log10",
1646
  "log2",
1647
  "map",
1648
  "match",
1649
  "matchAll",
1650
  "max",
1651
  "maxByteLength",
1652
  "message",
1653
  "min",
1654
  "mod",
1655
  "module",
1656
  "multiline",
1657
  "name",
1658
  "needsImport",
1659
  "needsImportMeta",
1660
  "new.target",
1661
  "next",
1662
  "normalize",
1663
  "notify",
1664
  "now",
1665
  "of",
1666
  "or",
1667
  "ownKeys",
1668
  "padEnd",
1669
  "padStart",
1670
  "parse",
1671
  "path",
1672
  "peek",
1673
  "poke",
1674
  "pop",
1675
  "pow",
1676
  "preventExtensions",
1677
  "propertyIsEnumerable",
1678
  "prototype",
1679
  "proxy",
1680
  "push",
1681
  "race",
1682
  "random",
1683
  "raw",
1684
  "reason",
1685
  "reduce",
1686
  "reduceRight",
1687
  "reexports",
1688
  "register",
1689
  "reject",
1690
  "repeat",
1691
  "replace",
1692
  "replaceAll",
1693
  "resizable",
1694
  "resize",
1695
  "resolve",
1696
  "result",
1697
  "return",
1698
  "reverse",
1699
  "revocable",
1700
  "revoke",
1701
  "right",
1702
  "round",
1703
  "seal",
1704
  "search",
1705
  "set",
1706
  "setBigInt64",
1707
  "setBigUint64",
1708
  "setDate",
1709
  "setFloat32",
1710
  "setFloat64",
1711
  "setFullYear",
1712
  "setHours",
1713
  "setInt16",
1714
  "setInt32",
1715
  "setInt8",
1716
  "setMilliseconds",
1717
  "setMinutes",
1718
  "setMonth",
1719
  "setPrototypeOf",
1720
  "setSeconds",
1721
  "setTime",
1722
  "setUTCDate",
1723
  "setUTCFullYear",
1724
  "setUTCHours",
1725
  "setUTCMilliseconds",
1726
  "setUTCMinutes",
1727
  "setUTCMonth",
1728
  "setUTCSeconds",
1729
  "setUint16",
1730
  "setUint32",
1731
  "setUint8",
1732
  "setYear",
1733
  "shift",
1734
  "sign",
1735
  "sin",
1736
  "sinh",
1737
  "size",
1738
  "slice",
1739
  "some",
1740
  "sort",
1741
  "source",
1742
  "species",
1743
  "splice",
1744
  "split",
1745
  "sqrt",
1746
  "stack",
1747
  "startsWith",
1748
  "status",
1749
  "sticky",
1750
  "store",
1751
  "stringify",
1752
  "sub",
1753
  "subarray",
1754
  "substr",
1755
  "substring",
1756
  "tan",
1757
  "tanh",
1758
  "test",
1759
  "then",
1760
  "this",
1761
  "throw",
1762
  "toDateString",
1763
  "toExponential",
1764
  "toFixed",
1765
  "toGMTString",
1766
  "toISOString",
1767
  "toJSON",
1768
  "toLocaleDateString",
1769
  "toLocaleLowerCase",
1770
  "toLocaleString",
1771
  "toLocaleTimeString",
1772
  "toLocaleUpperCase",
1773
  "toLowerCase",
1774
  "toPrecision",
1775
  "toPrimitive",
1776
  "toString",
1777
  "toStringTag",
1778
  "toTimeString",
1779
  "toUTCString",
1780
  "toUpperCase",
1781
  "transfer",
1782
  "transfers",
1783
  "trim",
1784
  "trimEnd",
1785
  "trimLeft",
1786
  "trimRight",
1787
  "trimStart",
1788
  "trunc",
1789
  "unicode",
1790
  "unregister",
1791
  "unscopables",
1792
  "unshift",
1793
  "uri",
1794
  "value",
1795
  "valueOf",
1796
  "values",
1797
  "wait",
1798
  "wake",
1799
  "weak",
1800
  "writable",
1801
  "xor",
1802
  "",
1803
  "<xsbug:script>",
1804
#if mxECMAScript2023  
1805
  "detached",
1806
  "irandom",
1807
  "toReversed",
1808
  "toSorted",
1809
  "toSpliced",
1810
  "with",
1811
#endif
1812
#if mxExplicitResourceManagement  
1813
  "adopt",
1814
  "asyncDispose",
1815
  "defer",
1816
  "dispose",
1817
  "disposeAsync",
1818
  "disposed",
1819
  "error",
1820
  "move",
1821
  "suppressed",
1822
  "use",
1823
#endif
1824
  "(onFullfilled)",
1825
  "(onRejected)",
1826
  "(result)",
1827
#if mxECMAScript2024
1828
  "async",
1829
  "groupBy",  
1830
  "isWellFormed", 
1831
  "promise",  
1832
  "toWellFormed", 
1833
  "transferToFixedLength",
1834
  "unicodeSets",
1835
  "waitAsync",  
1836
  "withResolvers",
1837
#endif
1838
#if mxUint8ArrayBase64
1839
  "alphabet",
1840
  "fromBase64",
1841
  "fromHex",
1842
  "lastChunkHandling",
1843
  "omitPadding",
1844
  "read",
1845
  "setFromBase64",
1846
  "setFromHex",
1847
  "toBase64",
1848
  "toHex",
1849
  "written",
1850
#endif
1851
#if mxECMAScript2025
1852
  "difference",
1853
  "drop",
1854
  "intersection",
1855
  "isDisjointFrom",
1856
  "isSubsetOf",
1857
  "isSupersetOf",
1858
  "options",
1859
  "symmetricDifference",
1860
  "take",
1861
  "toArray",
1862
  "try",
1863
  "type",
1864
  "union",
1865
#endif
1866
#if mxFloat16
1867
  "f16round",
1868
  "getFloat16",
1869
  "setFloat16",
1870
#endif
1871
#if mxImmutableArrayBuffers
1872
  "immutable",
1873
  "transferToImmutable",
1874
#endif
1875
#if mxErrorIsError
1876
  "isError",
1877
#endif
1878
#if mxECMAScript2026
1879
  "fromAsync",
1880
  "getOrInsert",
1881
  "getOrInsertComputed",
1882
  "isRawJSON",
1883
  "rawJSON",
1884
  "sumPrecise",
1885
#endif
1886
};