Coverage Report

Created: 2025-10-29 06:21

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
#ifdef __ets__
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.39k
{
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.39k
    char* result = C_NULL;
605
6.39k
    pthread_attr_t attrs;
606
6.39k
    pthread_attr_init(&attrs);
607
6.39k
    if (pthread_getattr_np(pthread_self(), &attrs) == 0) {
608
6.39k
        void* stackAddr;
609
6.39k
        size_t stackSize;
610
6.39k
      if (pthread_attr_getstack(&attrs, &stackAddr, &stackSize) == 0) {
611
6.39k
        result = (char*)stackAddr + (128 * 1024) + mxASANStackMargin;
612
6.39k
      }
613
6.39k
    }
614
6.39k
    pthread_attr_destroy(&attrs);
615
6.39k
    return result;
616
  #elif defined(__ets__) && !ESP32
617
    extern cont_t g_cont;
618
    return 192 + (char *)g_cont.stack;
619
  #elif defined(__ets__) && ESP32
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.39k
}
627
628
#endif
629
630
void fxDeleteScript(txScript* script)
631
6.39k
{
632
6.39k
  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.39k
}
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 1358
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,5,18,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,3,0,3,1,31,0,5,7,2,2,2,22,2,9,2,4,4,0,32,1,
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,66,3,1,2,0,2,7,22,15,2,2,2,3,2,22,30,51,15,49,63,5,
681
0
    4,0,2,1,12,27,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,
682
0
    2,0,4,1,3,4,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,
683
0
    30,11171,13,22,5,48,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,
684
0
    19,63,3,53,41,11,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,
685
0
    2,14,3,13,35,122,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,
686
0
    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,25,5,2,41,
687
0
    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,71,55,7,1,65,0,
688
0
    16,3,2,2,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,
689
0
    10,22,251,41,7,1,17,2,60,28,11,0,9,21,43,17,47,20,28,22,13,52,58,1,3,0,14,44,33,24,27,35,
690
0
    30,0,3,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,
691
0
    8,46,39,7,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,
692
0
    2,0,45,52,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,
693
0
    117,63,32,7,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,
694
0
    12,45,20,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,
695
0
    328,18,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,
696
0
    18,78,18,29,19,47,17,3,32,20,6,18,433,44,212,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,1237,42,9,
697
0
    8936,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,2,70,2,1,
698
0
    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,4,6,2,339,
699
0
    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,147,44,11,6,
700
0
    17,0,322,29,19,43,485,27,229,29,3,0,496,6,2,3,2,1,2,14,2,196,60,67,8,0,1205,3,2,26,2,1,
701
0
    2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,
702
0
    2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42719,33,4153,
703
0
    7,221,3,5761,15,7472,16,621,2467,541,1507,4938,6,4191,
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 1586
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,5,9,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,3,0,
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,7,1,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,15,50,76,4,9,
740
0
    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,2,0,
741
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,20,0,
742
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,3,3,
743
0
    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,2,6,
744
0
    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,513,6591,
745
0
    65,22156,68,45,3,268,4,27,21,47,5,9,2,114,38,8,3,102,3,66,3,1,2,0,2,7,22,53,5,0,20,51,
746
0
    13,69,11,9,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,
747
0
    3,15,3,4,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,
748
0
    3,105,39,6,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,
749
0
    4,1,25,2,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,
750
0
    2,1,2,14,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,
751
0
    43,157,3,9,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,
752
0
    10,21,11,7,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,
753
0
    11,25,71,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,
754
0
    11,18,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,2,56,32,11,0,
755
0
    9,32,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,
756
0
    5,3,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,
757
0
    3,21,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,
758
0
    2,9,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,
759
0
    4,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,
760
0
    2,1,3,8,13,9,71,7,3,45,3,7,2,1,28,62,9,0,9,73,4,0,19,72,200,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,311,22,10,16,2,40,4,4,14,10,86,0,80,921,103,110,18,195,2637,96,16,1071,17,21,11,3994,6,582,
763
0
    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,4,9,199,63,
764
0
    129,74,5,56,8,16,65,1,2,1,12,1,15,6135,9,1237,42,9,8936,3,2,6,2,1,2,290,16,0,30,2,3,0,
765
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,9,7,3,6,31,3,149,2,
766
0
    444,84,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,
767
0
    2,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,3,49,513,54,
768
0
    5,49,9,0,15,0,23,4,2,14,1105,30,7,5,214,6,2,16,3,6,2,1,2,4,6,61,34,0,113,44,4,13,
769
0
    3,9,5,0,322,30,18,57,471,41,215,42,486,6,2,3,2,1,2,14,2,196,12,6,42,75,5,9,1191,3,2,26,
770
0
    2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,
771
0
    2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,3381,9,
772
0
    1031,42719,33,4153,7,221,3,5761,15,7472,16,621,2467,541,1507,4938,6,4191,
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 += 712017;
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
11.6M
{
796
11.6M
  static const txU4 spaces[27] ICACHE_RODATA_ATTR = {
797
11.6M
    0x00000009,
798
11.6M
        0x0000000A,
799
11.6M
        0x0000000B,
800
11.6M
        0x0000000C,
801
11.6M
        0x0000000D,
802
11.6M
    0x00000020,
803
11.6M
    0x000000A0,
804
11.6M
    0x00001680,
805
11.6M
    0x00002000,
806
11.6M
    0x00002001,
807
11.6M
    0x00002002,
808
11.6M
    0x00002003,
809
11.6M
    0x00002004,
810
11.6M
    0x00002005,
811
11.6M
    0x00002006,
812
11.6M
    0x00002007,
813
11.6M
    0x00002008,
814
11.6M
    0x00002009,
815
11.6M
    0x0000200A,
816
11.6M
    0x00002028,
817
11.6M
    0x00002029,
818
11.6M
    0x0000202F,
819
11.6M
    0x0000205F,
820
11.6M
    0x00003000,
821
11.6M
    0x0000FEFF,
822
11.6M
    0xFFFFFFFF,
823
11.6M
    0x00000000,
824
11.6M
  };
825
11.6M
  const txU4 *p = spaces;
826
11.6M
  txU4 c = (txU4)character;
827
11.6M
  txU4 s;
828
83.4M
  while ((s = *p++)) {
829
83.4M
    if (c < s)
830
11.6M
      return 0;
831
71.8M
    if (c == s)
832
3.07k
      return 1;
833
71.8M
  }
834
0
  return 0;
835
11.6M
}
836
837
txBoolean fxParseHex(txU1 c, txU4* value)
838
63.0k
{
839
63.0k
  if (('0' <= c) && (c <= '9'))
840
25.6k
    *value = (*value * 16) + (c - '0');
841
37.4k
  else if (('a' <= c) && (c <= 'f'))
842
7.60k
    *value = (*value * 16) + (10 + c - 'a');
843
29.8k
  else if (('A' <= c) && (c <= 'F'))
844
29.6k
    *value = (*value * 16) + (10 + c - 'A');
845
175
  else
846
175
    return 0;
847
62.8k
  return 1;
848
63.0k
}
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
12.1k
{
868
12.1k
  txU1* p = *((txU1**)string);
869
12.1k
  txU4 value = 0;
870
12.1k
  txU1 c;
871
12.1k
  txInteger i;
872
  
873
12.1k
  c = c_read8(p++);
874
12.1k
  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
12.1k
  if (!fxParseHex(c, &value)) return 0;
891
12.1k
  c = c_read8(p++);
892
12.1k
  if (!fxParseHex(c, &value)) return 0;
893
12.1k
  c = c_read8(p++);
894
12.1k
  if (!fxParseHex(c, &value)) return 0;
895
12.0k
  c = c_read8(p++);
896
12.0k
  if (!fxParseHex(c, &value)) return 0;
897
12.0k
  *character = (txInteger)value;
898
12.0k
  *string = (txString)p;
899
12.0k
  c = c_read8(p++);
900
12.0k
  if (c && (c == separator) && (0x0000D800 <= value) && (value <= 0x0000DBFF)) {
901
3.87k
    c = c_read8(p++);
902
3.87k
    if (c == 'u') {
903
3.65k
      txU4 other = 0;
904
3.65k
      c = c_read8(p++);
905
3.65k
      if (!fxParseHex(c, &other)) return 1;
906
3.63k
      c = c_read8(p++);
907
3.63k
      if (!fxParseHex(c, &other)) return 1;
908
3.62k
      c = c_read8(p++);
909
3.62k
      if (!fxParseHex(c, &other)) return 1;
910
3.62k
      c = c_read8(p++);
911
3.62k
      if (!fxParseHex(c, &other)) return 1;
912
3.61k
      if ((0x0000DC00 <= other) && (other <= 0x0000DFFF)) {
913
2.45k
        *character = (txInteger)(0x00010000 + ((value & 0x03FF) << 10) + (other & 0x03FF));
914
2.45k
        *string = (txString)p;
915
2.45k
      }
916
3.61k
    }
917
3.87k
  }
918
12.0k
  return 1;
919
12.0k
}
920
921
txString fxSkipSpaces(txString string) 
922
14.3M
{
923
14.3M
  txString p = string;
924
14.3M
  txString q = p;
925
14.3M
  txInteger c;
926
14.3M
  while (((q = fxUTF8Decode(q, &c))) && (c != C_EOF)) {
927
11.6M
    if (fxIsSpace(c))
928
3.07k
      p = q;
929
11.6M
    else
930
11.6M
      break;
931
11.6M
  }
932
14.3M
  return p;
933
14.3M
}
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
90.3M
{
994
90.3M
  txU1* p = (txU1*)string;
995
90.3M
  txU4 c = c_read8(p++);
996
90.3M
  if (c) {
997
87.6M
    if (c & 0x80) {
998
3.59M
      const txUTF8Sequence *sequence;
999
3.59M
      txS4 size;
1000
10.8M
      for (sequence = gxUTF8Sequences; sequence->size; sequence++) {
1001
10.8M
        if ((c & sequence->cmask) == sequence->cval)
1002
3.59M
          break;
1003
10.8M
      }
1004
3.59M
      size = sequence->size - 1;
1005
10.8M
      while (size > 0) {
1006
7.20M
        size--;
1007
7.20M
        c = (c << 6) | (c_read8(p++) & 0x3F);
1008
7.20M
      }
1009
3.59M
      c &= sequence->lmask;
1010
3.59M
    }
1011
87.6M
    *character = (txInteger)c;
1012
87.6M
    return (txString)p;
1013
87.6M
  }
1014
2.71M
  *character = C_EOF;
1015
2.71M
  return (txString)p;
1016
90.3M
}
1017
1018
txString fxUTF8Encode(txString string, txInteger character)
1019
32.2k
{
1020
32.2k
  txU1* p = (txU1*)string;
1021
32.2k
  if (character < 0) {
1022
0
  }
1023
32.2k
  else if (character == 0) {
1024
0
    *p++ = 0xC0;
1025
0
    *p++ = 0x80;
1026
0
  }
1027
32.2k
  else if (character < 0x80) {
1028
0
    *p++ = (txU1)character;
1029
0
  }
1030
32.2k
  else if (character < 0x800) {
1031
0
    *p++ = (txU1)(0xC0 | (((txU4)character) >> 6));
1032
0
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1033
0
  }
1034
32.2k
  else if (character < 0x10000) {
1035
32.2k
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1036
32.2k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1037
32.2k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1038
32.2k
  }
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
32.2k
  return (txString)p;
1046
32.2k
}
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
76.0M
{
1086
76.0M
  txInteger result;
1087
76.0M
  string = fxUTF8Decode(string, &result);
1088
76.0M
  if ((0x0000D800 <= result) && (result <= 0x0000DBFF)) {
1089
14.6k
    txString former = string;
1090
14.6k
    txInteger surrogate;
1091
14.6k
    string = fxUTF8Decode(former, &surrogate);
1092
14.6k
    if ((0x0000DC00 <= surrogate) && (surrogate <= 0x0000DFFF))
1093
13.5k
      result = 0x00010000 + ((result & 0x000003FF) << 10) + (surrogate & 0x000003FF);
1094
1.11k
    else
1095
1.11k
      string = former;
1096
14.6k
  }
1097
76.0M
  *character = result;
1098
76.0M
  return string;
1099
76.0M
}
1100
1101
txString fxCESU8Encode(txString string, txInteger character)
1102
48.6k
{
1103
48.6k
  txU1* p = (txU1*)string;
1104
48.6k
  if (character < 0) {
1105
0
  }
1106
48.6k
  else if (character == 0) {
1107
776
    *p++ = 0xC0;
1108
776
    *p++ = 0x80;
1109
776
  }
1110
47.8k
  else if (character < 0x80) {
1111
42.9k
    *p++ = (txU1)character;
1112
42.9k
  }
1113
4.90k
  else if (character < 0x800) {
1114
298
    *p++ = (txU1)(0xC0 | (((txU4)character) >> 6));
1115
298
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1116
298
  }
1117
4.60k
  else if (character < 0x10000) {
1118
3.38k
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1119
3.38k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1120
3.38k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1121
3.38k
  }
1122
1.22k
  else if (character < 0x110000) {
1123
1.22k
    txInteger surrogate;
1124
1.22k
    character -= 0x00010000;
1125
1.22k
    surrogate = 0xDC00 | (character & 0x3FF);
1126
1.22k
    character = 0xD800 | ((character >> 10) & 0x3FF);
1127
1.22k
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1128
1.22k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1129
1.22k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1130
1.22k
    *p++ = (txU1)(0xE0 | (((txU4)surrogate) >> 12));
1131
1.22k
    *p++ = (txU1)(0x80 | ((((txU4)surrogate) >> 6) & 0x3F));
1132
1.22k
    *p++ = (txU1)(0x80 | (((txU4)surrogate) & 0x3F));
1133
1.22k
  }
1134
48.6k
  return (txString)p;
1135
48.6k
}
1136
1137
txSize fxCESU8Length(txInteger character)
1138
72.2M
{
1139
72.2M
  txSize length;
1140
72.2M
  if (character < 0)
1141
0
    length = 0;
1142
72.2M
  else if (character == 0)
1143
795
    length = 2;
1144
72.2M
  else if (character < 0x80)
1145
68.7M
    length = 1;
1146
3.45M
  else if (character < 0x800)
1147
3.41k
    length = 2;
1148
3.45M
  else if (character < 0x10000)
1149
3.43M
    length = 3;
1150
14.7k
  else if (character < 0x110000)
1151
14.7k
    length = 6;
1152
0
  else
1153
0
    length = 0;
1154
72.2M
  return length;
1155
72.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
3.17M
{
1299
3.17M
  char buffer[256], c;
1300
3.17M
  txNumber number;
1301
3.17M
  txIndex integer;
1302
3.17M
  txNumber check;
1303
1304
3.17M
  c = c_read8(theString);
1305
3.17M
  if (('+' != c) && ('-' != c) && ('.' != c) && !(('0' <= c) && ('9' >= c)))
1306
225k
    return 0;
1307
2.94M
  number = fxStringToNumber(the, theString, 1);
1308
2.94M
  integer = (txIndex)number;
1309
2.94M
  check = integer;
1310
2.94M
  if ((number == check) && (integer < 4294967295u)) {
1311
2.65M
    fxNumberToString(the, number, buffer, sizeof(buffer), 0, 0);
1312
2.65M
    if (!c_strcmp(theString, buffer)) {
1313
2.61M
      *theIndex = integer;
1314
2.61M
      return 1;
1315
2.61M
    }
1316
2.65M
  }
1317
330k
  return 0;
1318
2.94M
}
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
  "eval",
1415
  "AsyncFunction",
1416
  "AsyncGeneratorFunction",
1417
  "BYTES_PER_ELEMENT",
1418
  "E",
1419
  "EPSILON",
1420
  "Generator",
1421
  "GeneratorFunction",
1422
  "LN10",
1423
  "LN2",
1424
  "LOG10E",
1425
  "LOG2E",
1426
  "MAX_SAFE_INTEGER",
1427
  "MAX_VALUE",
1428
  "MIN_SAFE_INTEGER",
1429
  "MIN_VALUE",
1430
  "NEGATIVE_INFINITY",
1431
  "PI",
1432
  "POSITIVE_INFINITY",
1433
  "SQRT1_2",
1434
  "SQRT2",
1435
  "UTC",
1436
  "__defineGetter__",
1437
  "__defineSetter__",
1438
  "__lookupGetter__",
1439
  "__lookupSetter__",
1440
  "__proto__",
1441
  "abs",
1442
  "acos",
1443
  "acosh",
1444
  "add",
1445
  "aliases",
1446
  "all",
1447
  "allSettled",
1448
  "and",
1449
  "any",
1450
  "append",
1451
  "apply",
1452
  "arguments",
1453
  "as",
1454
  "asIntN",
1455
  "asUintN",
1456
  "asin",
1457
  "asinh",
1458
  "assign",
1459
  "asyncIterator",
1460
  "at",
1461
  "atan",
1462
  "atanh",
1463
  "atan2",
1464
  "bind",
1465
  "bindings",
1466
  "bitLength",
1467
  "boundArguments",
1468
  "boundFunction",
1469
  "boundThis",
1470
  "buffer",
1471
  "busy",
1472
  "byteLength",
1473
  "byteOffset",
1474
  "cache",
1475
  "call",
1476
  "callee",
1477
  "caller",
1478
  "catch",
1479
  "cause",
1480
  "cbrt",
1481
  "ceil",
1482
  "center",
1483
  "charAt",
1484
  "charCodeAt",
1485
  "chunk",
1486
  "chunkify",
1487
  "cleanupSome",
1488
  "clear",
1489
  "closure",
1490
  "clz32",
1491
  "codePointAt",
1492
  "compare",
1493
  "compareExchange",
1494
  "compile",
1495
  "concat",
1496
  "configurable",
1497
  "console",
1498
  "construct",
1499
  "constructor",
1500
  "copyWithin",
1501
  "cos",
1502
  "cosh",
1503
  "count",
1504
  "create",
1505
  "default",
1506
  "defineProperties",
1507
  "defineProperty",
1508
  "delete",
1509
  "deleteProperty",
1510
  "deref",
1511
  "description",
1512
  "done",
1513
  "dotAll",
1514
  "eachDown",
1515
  "eachUp",
1516
  "endsWith",
1517
  "entries",
1518
  "enumerable",
1519
  "enumerate",
1520
  "errors",
1521
  "evaluate",
1522
  "every",
1523
  "exchange",
1524
  "exec",
1525
  "exp",
1526
  "expm1",
1527
  "export",
1528
  "exports",
1529
  "fill",
1530
  "filter",
1531
  "finally",
1532
  "find",
1533
  "findIndex",
1534
  "findLast",
1535
  "findLastIndex",
1536
  "flags",
1537
  "flat",
1538
  "flatMap",
1539
  "floor",
1540
  "for",
1541
  "forEach",
1542
  "free",
1543
  "freeze",
1544
  "from",
1545
  "fromArrayBuffer",
1546
  "fromBigInt",
1547
  "fromCharCode",
1548
  "fromCodePoint",
1549
  "fromEntries",
1550
  "fromString",
1551
  "fround",
1552
  "function",
1553
  "get",
1554
  "getBigInt64",
1555
  "getBigUint64",
1556
  "getDate",
1557
  "getDay",
1558
  "getFloat32",
1559
  "getFloat64",
1560
  "getFullYear",
1561
  "getHours",
1562
  "getInt16",
1563
  "getInt32",
1564
  "getInt8",
1565
  "getMilliseconds",
1566
  "getMinutes",
1567
  "getMonth",
1568
  "getOwnPropertyDescriptor",
1569
  "getOwnPropertyDescriptors",
1570
  "getOwnPropertyNames",
1571
  "getOwnPropertySymbols",
1572
  "getPrototypeOf",
1573
  "getSeconds",
1574
  "getTime",
1575
  "getTimezoneOffset",
1576
  "getUTCDate",
1577
  "getUTCDay",
1578
  "getUTCFullYear",
1579
  "getUTCHours",
1580
  "getUTCMilliseconds",
1581
  "getUTCMinutes",
1582
  "getUTCMonth",
1583
  "getUTCSeconds",
1584
  "getUint16",
1585
  "getUint32",
1586
  "getUint8",
1587
  "getYear",
1588
  "global",
1589
  "globalThis",
1590
  "groups",
1591
  "grow",
1592
  "growable",
1593
  "has",
1594
  "hasIndices",
1595
  "hasInstance",
1596
  "hasOwn",
1597
  "hasOwnProperty",
1598
  "hypot",
1599
  "id",
1600
  "idiv",
1601
  "idivmod",
1602
  "ignoreCase",
1603
  "imod",
1604
  "import",
1605
  "importNow",
1606
  "imports",
1607
  "imul",
1608
  "imuldiv",
1609
  "includes",
1610
  "index",
1611
  "indexOf",
1612
  "indices",
1613
  "input",
1614
  "irem",
1615
  "is",
1616
  "isArray",
1617
  "isConcatSpreadable",
1618
  "isExtensible",
1619
  "isFrozen",
1620
  "isInteger",
1621
  "isLockFree",
1622
  "isPrototypeOf",
1623
  "isSafeInteger",
1624
  "isSealed",
1625
  "isView",
1626
  "iterable",
1627
  "iterator",
1628
  "join",
1629
  "keyFor",
1630
  "keys",
1631
  "lastIndex",
1632
  "lastIndexOf",
1633
  "left",
1634
  "length",
1635
  "line",
1636
  "load",
1637
  "local",
1638
  "localeCompare",
1639
  "log",
1640
  "log1p",
1641
  "log10",
1642
  "log2",
1643
  "map",
1644
  "match",
1645
  "matchAll",
1646
  "max",
1647
  "maxByteLength",
1648
  "message",
1649
  "min",
1650
  "mod",
1651
  "module",
1652
  "multiline",
1653
  "name",
1654
  "needsImport",
1655
  "needsImportMeta",
1656
  "new.target",
1657
  "next",
1658
  "normalize",
1659
  "notify",
1660
  "now",
1661
  "of",
1662
  "or",
1663
  "ownKeys",
1664
  "padEnd",
1665
  "padStart",
1666
  "parse",
1667
  "path",
1668
  "peek",
1669
  "poke",
1670
  "pop",
1671
  "pow",
1672
  "preventExtensions",
1673
  "propertyIsEnumerable",
1674
  "prototype",
1675
  "proxy",
1676
  "push",
1677
  "race",
1678
  "random",
1679
  "raw",
1680
  "reason",
1681
  "reduce",
1682
  "reduceRight",
1683
  "reexports",
1684
  "register",
1685
  "reject",
1686
  "repeat",
1687
  "replace",
1688
  "replaceAll",
1689
  "resizable",
1690
  "resize",
1691
  "resolve",
1692
  "result",
1693
  "return",
1694
  "reverse",
1695
  "revocable",
1696
  "revoke",
1697
  "right",
1698
  "round",
1699
  "seal",
1700
  "search",
1701
  "set",
1702
  "setBigInt64",
1703
  "setBigUint64",
1704
  "setDate",
1705
  "setFloat32",
1706
  "setFloat64",
1707
  "setFullYear",
1708
  "setHours",
1709
  "setInt16",
1710
  "setInt32",
1711
  "setInt8",
1712
  "setMilliseconds",
1713
  "setMinutes",
1714
  "setMonth",
1715
  "setPrototypeOf",
1716
  "setSeconds",
1717
  "setTime",
1718
  "setUTCDate",
1719
  "setUTCFullYear",
1720
  "setUTCHours",
1721
  "setUTCMilliseconds",
1722
  "setUTCMinutes",
1723
  "setUTCMonth",
1724
  "setUTCSeconds",
1725
  "setUint16",
1726
  "setUint32",
1727
  "setUint8",
1728
  "setYear",
1729
  "shift",
1730
  "sign",
1731
  "sin",
1732
  "sinh",
1733
  "size",
1734
  "slice",
1735
  "some",
1736
  "sort",
1737
  "source",
1738
  "species",
1739
  "splice",
1740
  "split",
1741
  "sqrt",
1742
  "stack",
1743
  "startsWith",
1744
  "status",
1745
  "sticky",
1746
  "store",
1747
  "stringify",
1748
  "sub",
1749
  "subarray",
1750
  "substr",
1751
  "substring",
1752
  "tan",
1753
  "tanh",
1754
  "test",
1755
  "then",
1756
  "this",
1757
  "throw",
1758
  "toDateString",
1759
  "toExponential",
1760
  "toFixed",
1761
  "toGMTString",
1762
  "toISOString",
1763
  "toJSON",
1764
  "toLocaleDateString",
1765
  "toLocaleLowerCase",
1766
  "toLocaleString",
1767
  "toLocaleTimeString",
1768
  "toLocaleUpperCase",
1769
  "toLowerCase",
1770
  "toPrecision",
1771
  "toPrimitive",
1772
  "toString",
1773
  "toStringTag",
1774
  "toTimeString",
1775
  "toUTCString",
1776
  "toUpperCase",
1777
  "transfer",
1778
  "transfers",
1779
  "trim",
1780
  "trimEnd",
1781
  "trimLeft",
1782
  "trimRight",
1783
  "trimStart",
1784
  "trunc",
1785
  "unicode",
1786
  "unregister",
1787
  "unscopables",
1788
  "unshift",
1789
  "uri",
1790
  "value",
1791
  "valueOf",
1792
  "values",
1793
  "wait",
1794
  "wake",
1795
  "weak",
1796
  "writable",
1797
  "xor",
1798
  "",
1799
  "<xsbug:script>",
1800
#if mxECMAScript2023  
1801
  "detached",
1802
  "irandom",
1803
  "toReversed",
1804
  "toSorted",
1805
  "toSpliced",
1806
  "with",
1807
#endif
1808
#if mxExplicitResourceManagement  
1809
  "adopt",
1810
  "asyncDispose",
1811
  "defer",
1812
  "dispose",
1813
  "disposeAsync",
1814
  "disposed",
1815
  "error",
1816
  "move",
1817
  "suppressed",
1818
  "use",
1819
#endif
1820
  "(onFullfilled)",
1821
  "(onRejected)",
1822
  "(result)",
1823
#if mxECMAScript2024
1824
  "async",
1825
  "groupBy",  
1826
  "isWellFormed", 
1827
  "promise",  
1828
  "toWellFormed", 
1829
  "transferToFixedLength",
1830
  "unicodeSets",
1831
  "waitAsync",  
1832
  "withResolvers",
1833
#endif
1834
#if mxUint8ArrayBase64
1835
  "alphabet",
1836
  "fromBase64",
1837
  "fromHex",
1838
  "lastChunkHandling",
1839
  "omitPadding",
1840
  "read",
1841
  "setFromBase64",
1842
  "setFromHex",
1843
  "toBase64",
1844
  "toHex",
1845
  "written",
1846
#endif
1847
#if mxECMAScript2025
1848
  "difference",
1849
  "drop",
1850
  "intersection",
1851
  "isDisjointFrom",
1852
  "isSubsetOf",
1853
  "isSupersetOf",
1854
  "options",
1855
  "symmetricDifference",
1856
  "take",
1857
  "toArray",
1858
  "try",
1859
  "type",
1860
  "union",
1861
#endif
1862
#if mxFloat16
1863
  "f16round",
1864
  "getFloat16",
1865
  "setFloat16",
1866
#endif
1867
#if mxImmutableArrayBuffers
1868
  "immutable",
1869
  "transferToImmutable",
1870
#endif
1871
#if mxErrorIsError
1872
  "isError",
1873
#endif
1874
};