Coverage Report

Created: 2025-12-30 07:10

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
2.14M
{
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
2.14M
    char* result = C_NULL;
605
2.14M
    pthread_attr_t attrs;
606
2.14M
    pthread_attr_init(&attrs);
607
2.14M
    if (pthread_getattr_np(pthread_self(), &attrs) == 0) {
608
2.14M
        void* stackAddr;
609
2.14M
        size_t stackSize;
610
2.14M
      if (pthread_attr_getstack(&attrs, &stackAddr, &stackSize) == 0) {
611
2.14M
        result = (char*)stackAddr + (128 * 1024) + mxASANStackMargin;
612
2.14M
      }
613
2.14M
    }
614
2.14M
    pthread_attr_destroy(&attrs);
615
2.14M
    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
2.14M
}
627
628
#endif
629
630
void fxDeleteScript(txScript* script)
631
1.02M
{
632
1.02M
  if (script) {
633
996k
    if (script->symbolsBuffer)
634
996k
      c_free(script->symbolsBuffer);
635
996k
    if (script->hostsBuffer)
636
0
      c_free(script->hostsBuffer);
637
996k
    if (script->codeBuffer)
638
996k
      c_free(script->codeBuffer);
639
996k
    c_free(script);
640
996k
  }
641
1.02M
}
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
6.23M
{
659
6.23M
  #define mxIdentifierFirstCount 1358
660
6.23M
  static const txU2 gxIdentifierFirstTable[mxIdentifierFirstCount] ICACHE_RODATA_ATTR = {
661
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    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
6.23M
    7,221,3,5761,15,7472,16,621,2467,541,1507,4938,6,4191,
704
6.23M
  };
705
6.23M
  const txU2* p = gxIdentifierFirstTable;
706
6.23M
  const txU2* q = p + mxIdentifierFirstCount;
707
6.23M
  txU4 s = 0;
708
81.2M
  while (p < q) {
709
81.2M
    s += c_read16(p++);
710
81.2M
    if (c < s)
711
964k
      return 0;
712
80.2M
    s += c_read16(p++);
713
80.2M
    if (c <= s)
714
5.25M
      return 1;
715
80.2M
  }
716
14.0k
  return 0;
717
6.23M
}
718
719
txBoolean fxIsIdentifierNext(txU4 c)
720
24.3M
{
721
24.3M
  #define mxIdentifierNextCount 1586
722
24.3M
  static const txU2 gxIdentifierNextTable[mxIdentifierNextCount] ICACHE_RODATA_ATTR = {
723
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    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
24.3M
    1031,42719,33,4153,7,221,3,5761,15,7472,16,621,2467,541,1507,4938,6,4191,
773
24.3M
  };
774
24.3M
  const txU2* p = gxIdentifierNextTable;
775
24.3M
  const txU2* q = p + mxIdentifierNextCount;
776
24.3M
  txU4 s = 0;
777
212M
  while (p < q) {
778
211M
    s += c_read16(p++);
779
211M
    if (c < s)
780
5.13M
      return 0;
781
206M
    s += c_read16(p++);
782
206M
    if (c <= s)
783
19.1M
      return 1;
784
206M
  }
785
98.5k
  s += 712017;
786
98.5k
  if (c < s)
787
1.43k
    return 0;
788
97.1k
  s += 239;
789
97.1k
  if (c <= s)
790
10
    return 1;
791
97.1k
  return 0;
792
97.1k
}
793
794
txBoolean fxIsSpace(txInteger character)
795
34.1M
{
796
34.1M
  static const txU4 spaces[27] ICACHE_RODATA_ATTR = {
797
34.1M
    0x00000009,
798
34.1M
        0x0000000A,
799
34.1M
        0x0000000B,
800
34.1M
        0x0000000C,
801
34.1M
        0x0000000D,
802
34.1M
    0x00000020,
803
34.1M
    0x000000A0,
804
34.1M
    0x00001680,
805
34.1M
    0x00002000,
806
34.1M
    0x00002001,
807
34.1M
    0x00002002,
808
34.1M
    0x00002003,
809
34.1M
    0x00002004,
810
34.1M
    0x00002005,
811
34.1M
    0x00002006,
812
34.1M
    0x00002007,
813
34.1M
    0x00002008,
814
34.1M
    0x00002009,
815
34.1M
    0x0000200A,
816
34.1M
    0x00002028,
817
34.1M
    0x00002029,
818
34.1M
    0x0000202F,
819
34.1M
    0x0000205F,
820
34.1M
    0x00003000,
821
34.1M
    0x0000FEFF,
822
34.1M
    0xFFFFFFFF,
823
34.1M
    0x00000000,
824
34.1M
  };
825
34.1M
  const txU4 *p = spaces;
826
34.1M
  txU4 c = (txU4)character;
827
34.1M
  txU4 s;
828
247M
  while ((s = *p++)) {
829
247M
    if (c < s)
830
33.3M
      return 0;
831
213M
    if (c == s)
832
754k
      return 1;
833
213M
  }
834
0
  return 0;
835
34.1M
}
836
837
txBoolean fxParseHex(txU1 c, txU4* value)
838
4.34M
{
839
4.34M
  if (('0' <= c) && (c <= '9'))
840
1.76M
    *value = (*value * 16) + (c - '0');
841
2.58M
  else if (('a' <= c) && (c <= 'f'))
842
554k
    *value = (*value * 16) + (10 + c - 'a');
843
2.02M
  else if (('A' <= c) && (c <= 'F'))
844
1.51M
    *value = (*value * 16) + (10 + c - 'A');
845
516k
  else
846
516k
    return 0;
847
3.83M
  return 1;
848
4.34M
}
849
850
txBoolean fxParseHexEscape(txString* string, txInteger* character)
851
2.17M
{
852
2.17M
  txU1* p = *((txU1**)string);
853
2.17M
  txU4 value = 0;
854
2.17M
  txU1 i, c;
855
5.61M
  for (i = 0; i < 2; i++) {
856
3.90M
    c = c_read8(p);
857
3.90M
    if (!fxParseHex(c, &value))
858
472k
      return 0;
859
3.43M
    p++;
860
3.43M
  }
861
1.70M
  *character = (txInteger)value;
862
1.70M
  *string = (txString)p;
863
1.70M
  return 1;
864
2.17M
}
865
866
txBoolean fxParseUnicodeEscape(txString* string, txInteger* character, txInteger braces, txInteger separator)
867
117k
{
868
117k
  txU1* p = *((txU1**)string);
869
117k
  txU4 value = 0;
870
117k
  txU1 c;
871
117k
  txInteger i;
872
  
873
117k
  c = c_read8(p++);
874
117k
  if (braces && (c == '{')) {
875
5.72k
    c = c_read8(p++);
876
15.3k
    for (i = 0; value < 0x00110000; i++) {
877
14.5k
      if (fxParseHex(c, &value)) {
878
9.58k
        c = c_read8(p++);
879
9.58k
      }
880
4.96k
      else
881
4.96k
        break;
882
14.5k
    }
883
5.72k
    if ((c == '}') && (i > 0) && (value < 0x00110000)) {
884
1.09k
      *character = (txInteger)value;
885
1.09k
      *string = (txString)p;
886
1.09k
      return 1;
887
1.09k
    }
888
4.62k
    return 0;
889
5.72k
  }
890
111k
  if (!fxParseHex(c, &value)) return 0;
891
100k
  c = c_read8(p++);
892
100k
  if (!fxParseHex(c, &value)) return 0;
893
91.5k
  c = c_read8(p++);
894
91.5k
  if (!fxParseHex(c, &value)) return 0;
895
81.6k
  c = c_read8(p++);
896
81.6k
  if (!fxParseHex(c, &value)) return 0;
897
76.1k
  *character = (txInteger)value;
898
76.1k
  *string = (txString)p;
899
76.1k
  c = c_read8(p++);
900
76.1k
  if (c && (c == separator) && (0x0000D800 <= value) && (value <= 0x0000DBFF)) {
901
11.6k
    c = c_read8(p++);
902
11.6k
    if (c == 'u') {
903
11.1k
      txU4 other = 0;
904
11.1k
      c = c_read8(p++);
905
11.1k
      if (!fxParseHex(c, &other)) return 1;
906
10.6k
      c = c_read8(p++);
907
10.6k
      if (!fxParseHex(c, &other)) return 1;
908
9.37k
      c = c_read8(p++);
909
9.37k
      if (!fxParseHex(c, &other)) return 1;
910
8.47k
      c = c_read8(p++);
911
8.47k
      if (!fxParseHex(c, &other)) return 1;
912
7.76k
      if ((0x0000DC00 <= other) && (other <= 0x0000DFFF)) {
913
1.14k
        *character = (txInteger)(0x00010000 + ((value & 0x03FF) << 10) + (other & 0x03FF));
914
1.14k
        *string = (txString)p;
915
1.14k
      }
916
7.76k
    }
917
11.6k
  }
918
72.7k
  return 1;
919
76.1k
}
920
921
txString fxSkipSpaces(txString string) 
922
45.4M
{
923
45.4M
  txString p = string;
924
45.4M
  txString q = p;
925
45.4M
  txInteger c;
926
46.2M
  while (((q = fxUTF8Decode(q, &c))) && (c != C_EOF)) {
927
34.1M
    if (fxIsSpace(c))
928
754k
      p = q;
929
33.3M
    else
930
33.3M
      break;
931
34.1M
  }
932
45.4M
  return p;
933
45.4M
}
934
935
txString fxStringifyHexEscape(txString string, txInteger character)
936
1.14M
{
937
1.14M
  const char* digits = gxHexUpper;
938
1.14M
  txU1* p = (txU1*)string;
939
1.14M
  *p++ = c_read8(digits + ((character & 0x000000F0) >> 4));
940
1.14M
  *p++ = c_read8(digits + (character & 0x0000000F));
941
1.14M
  return (txString)p;
942
1.14M
}
943
944
txString fxStringifyUnicodeEscape(txString string, txInteger character, txInteger separator)
945
7.00M
{
946
7.00M
  const char* digits = (separator == '%') ? gxHexUpper : gxHexLower;
947
7.00M
  txU1* p = (txU1*)string;
948
7.00M
  txInteger surrogate;
949
7.00M
  if (character > 0xFFFF) {
950
1.04k
    character -= 0x10000;
951
1.04k
    surrogate = 0xDC00 | (character & 0x3FF);
952
1.04k
    character = 0xD800 | (character >> 10);
953
1.04k
  }
954
7.00M
  else
955
7.00M
    surrogate = 0;
956
7.00M
  *p++ = c_read8(digits + ((character & 0x0000F000) >> 12));
957
7.00M
  *p++ = c_read8(digits + ((character & 0x00000F00) >> 8));
958
7.00M
  *p++ = c_read8(digits + ((character & 0x000000F0) >> 4));
959
7.00M
  *p++ = c_read8(digits + (character & 0x0000000F));
960
7.00M
  if (surrogate) {
961
1.04k
    *p++ = separator;
962
1.04k
    *p++ = 'u';
963
1.04k
    *p++ = c_read8(digits + ((surrogate & 0x0000F000) >> 12));
964
1.04k
    *p++ = c_read8(digits + ((surrogate & 0x00000F00) >> 8));
965
1.04k
    *p++ = c_read8(digits + ((surrogate & 0x000000F0) >> 4));
966
1.04k
    *p++ = c_read8(digits + (surrogate & 0x0000000F));
967
1.04k
  }
968
7.00M
  return (txString)p;
969
7.00M
}
970
971
int fxUTF8Compare(txString p1, txString p2)
972
644k
{
973
644k
  register const unsigned char *s1 = (const unsigned char *) p1;
974
644k
  register const unsigned char *s2 = (const unsigned char *) p2;
975
644k
  unsigned char c1, c2;
976
2.65M
  do {
977
2.65M
    c1 = (unsigned char) *s1++;
978
2.65M
    c2 = (unsigned char) *s2++;
979
2.65M
    if (c1 == '\0')
980
244k
      return c1 - c2;
981
2.65M
  }
982
2.40M
  while (c1 == c2);
983
399k
  if (c2 == '\0')
984
71.2k
    return c1 - c2;
985
328k
  if ((c1 == 0xC0) && (*s1 == 0x80))
986
1.03k
    return 0 - c2;
987
327k
  if ((c2 == 0xC0) && (*s2 == 0x80))
988
1.64k
    return c1 - 0;
989
326k
  return c1 - c2;
990
327k
}
991
992
txString fxUTF8Decode(txString string, txInteger* character)
993
599M
{
994
599M
  txU1* p = (txU1*)string;
995
599M
  txU4 c = c_read8(p++);
996
599M
  if (c) {
997
536M
    if (c & 0x80) {
998
228M
      const txUTF8Sequence *sequence;
999
228M
      txS4 size;
1000
632M
      for (sequence = gxUTF8Sequences; sequence->size; sequence++) {
1001
632M
        if ((c & sequence->cmask) == sequence->cval)
1002
228M
          break;
1003
632M
      }
1004
228M
      size = sequence->size - 1;
1005
632M
      while (size > 0) {
1006
404M
        size--;
1007
404M
        c = (c << 6) | (c_read8(p++) & 0x3F);
1008
404M
      }
1009
228M
      c &= sequence->lmask;
1010
228M
    }
1011
536M
    *character = (txInteger)c;
1012
536M
    return (txString)p;
1013
536M
  }
1014
63.9M
  *character = C_EOF;
1015
63.9M
  return (txString)p;
1016
599M
}
1017
1018
txString fxUTF8Encode(txString string, txInteger character)
1019
17.0M
{
1020
17.0M
  txU1* p = (txU1*)string;
1021
17.0M
  if (character < 0) {
1022
0
  }
1023
17.0M
  else if (character == 0) {
1024
2.61M
    *p++ = 0xC0;
1025
2.61M
    *p++ = 0x80;
1026
2.61M
  }
1027
14.4M
  else if (character < 0x80) {
1028
8.06M
    *p++ = (txU1)character;
1029
8.06M
  }
1030
6.35M
  else if (character < 0x800) {
1031
81.3k
    *p++ = (txU1)(0xC0 | (((txU4)character) >> 6));
1032
81.3k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1033
81.3k
  }
1034
6.27M
  else if (character < 0x10000) {
1035
6.26M
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1036
6.26M
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1037
6.26M
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1038
6.26M
  }
1039
12.3k
  else if (character < 0x110000) {
1040
12.3k
    *p++ = (txU1)(0xF0 | (((txU4)character) >> 18));
1041
12.3k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 12) & 0x3F));
1042
12.3k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1043
12.3k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1044
12.3k
  }
1045
17.0M
  return (txString)p;
1046
17.0M
}
1047
1048
txSize fxUTF8Length(txInteger character)
1049
33.9M
{
1050
33.9M
  txSize length;
1051
33.9M
  if (character < 0)
1052
0
    length = 0;
1053
33.9M
  else if (character == 0)
1054
5.23M
    length = 2;
1055
28.7M
  else if (character < 0x80)
1056
16.1M
    length = 1;
1057
12.5M
  else if (character < 0x800)
1058
162k
    length = 2;
1059
12.4M
  else if (character < 0x10000)
1060
12.4M
    length = 3;
1061
19.9k
  else if (character < 0x110000)
1062
19.9k
    length = 4;
1063
0
  else
1064
0
    length = 0;
1065
33.9M
  return length;
1066
33.9M
}
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
400M
{
1086
400M
  txInteger result;
1087
400M
  string = fxUTF8Decode(string, &result);
1088
400M
  if ((0x0000D800 <= result) && (result <= 0x0000DBFF)) {
1089
900k
    txString former = string;
1090
900k
    txInteger surrogate;
1091
900k
    string = fxUTF8Decode(former, &surrogate);
1092
900k
    if ((0x0000DC00 <= surrogate) && (surrogate <= 0x0000DFFF))
1093
346k
      result = 0x00010000 + ((result & 0x000003FF) << 10) + (surrogate & 0x000003FF);
1094
553k
    else
1095
553k
      string = former;
1096
900k
  }
1097
400M
  *character = result;
1098
400M
  return string;
1099
400M
}
1100
1101
txString fxCESU8Encode(txString string, txInteger character)
1102
201M
{
1103
201M
  txU1* p = (txU1*)string;
1104
201M
  if (character < 0) {
1105
137
  }
1106
201M
  else if (character == 0) {
1107
8.39M
    *p++ = 0xC0;
1108
8.39M
    *p++ = 0x80;
1109
8.39M
  }
1110
193M
  else if (character < 0x80) {
1111
128M
    *p++ = (txU1)character;
1112
128M
  }
1113
65.1M
  else if (character < 0x800) {
1114
1.68M
    *p++ = (txU1)(0xC0 | (((txU4)character) >> 6));
1115
1.68M
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1116
1.68M
  }
1117
63.4M
  else if (character < 0x10000) {
1118
63.4M
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1119
63.4M
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1120
63.4M
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1121
63.4M
  }
1122
79.8k
  else if (character < 0x110000) {
1123
79.8k
    txInteger surrogate;
1124
79.8k
    character -= 0x00010000;
1125
79.8k
    surrogate = 0xDC00 | (character & 0x3FF);
1126
79.8k
    character = 0xD800 | ((character >> 10) & 0x3FF);
1127
79.8k
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1128
79.8k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1129
79.8k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1130
79.8k
    *p++ = (txU1)(0xE0 | (((txU4)surrogate) >> 12));
1131
79.8k
    *p++ = (txU1)(0x80 | ((((txU4)surrogate) >> 6) & 0x3F));
1132
79.8k
    *p++ = (txU1)(0x80 | (((txU4)surrogate) & 0x3F));
1133
79.8k
  }
1134
201M
  return (txString)p;
1135
201M
}
1136
1137
txSize fxCESU8Length(txInteger character)
1138
201M
{
1139
201M
  txSize length;
1140
201M
  if (character < 0)
1141
137
    length = 0;
1142
201M
  else if (character == 0)
1143
8.37M
    length = 2;
1144
193M
  else if (character < 0x80)
1145
128M
    length = 1;
1146
65.0M
  else if (character < 0x800)
1147
1.68M
    length = 2;
1148
63.3M
  else if (character < 0x10000)
1149
63.3M
    length = 3;
1150
76.2k
  else if (character < 0x110000)
1151
76.1k
    length = 6;
1152
35
  else
1153
35
    length = 0;
1154
201M
  return length;
1155
201M
}
1156
#endif
1157
1158
txSize fxUTF8ToUnicodeOffset(txString theString, txSize theOffset)
1159
1.03M
{
1160
1.03M
  txU1* p = (txU1*)theString;
1161
1.03M
  txU1 c;
1162
1.03M
  txSize unicodeOffset = 0;
1163
1.03M
  txSize utf8Offset = 0;
1164
  
1165
127M
  while ((c = c_read8(p++))) {
1166
126M
    if ((c & 0xC0) != 0x80) {
1167
63.4M
      if (utf8Offset == theOffset)
1168
880k
        return unicodeOffset;
1169
62.5M
      unicodeOffset++;
1170
62.5M
    }
1171
126M
    utf8Offset++;
1172
126M
  }
1173
153k
  if (utf8Offset == theOffset)
1174
91.9k
    return unicodeOffset;
1175
61.7k
  else
1176
61.7k
    return -1;
1177
153k
}
1178
1179
#if 1
1180
txSize fxUnicodeLength(txString theString, txSize* byteLength)
1181
14.2M
{
1182
14.2M
  txU1* p = (txU1*)theString;
1183
14.2M
  txU1 c;
1184
14.2M
  txSize unicodeLength = 0;
1185
14.2M
  txSize utf8Length = 0;
1186
  
1187
3.65G
  while ((c = c_read8(p++))) {
1188
3.64G
    if ((c & 0xC0) != 0x80)
1189
2.09G
      unicodeLength++;
1190
3.64G
    utf8Length++;
1191
3.64G
  }
1192
14.2M
  if (byteLength)
1193
4.02M
    *byteLength = utf8Length;
1194
14.2M
  return unicodeLength;
1195
14.2M
}
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
106M
{
1258
106M
  txU1* p = (txU1*)theString;
1259
106M
  txU1 c;
1260
106M
  txSize unicodeOffset = 0;
1261
106M
  txSize utf8Offset = 0;
1262
  
1263
346M
    while ((c = c_read8(p++))) {
1264
344M
    if ((c & 0xC0) != 0x80) {
1265
243M
      if (unicodeOffset == theOffset)
1266
104M
        return utf8Offset;
1267
139M
      unicodeOffset++;
1268
139M
    }
1269
239M
        utf8Offset++;
1270
239M
  }
1271
1.76M
  if (unicodeOffset == theOffset)
1272
1.69M
    return utf8Offset;
1273
71.7k
  else
1274
71.7k
    return -1;
1275
1.76M
}
1276
1277
txFlag fxIntegerToIndex(void* the, txInteger theInteger, txIndex* theIndex)
1278
28.1M
{
1279
28.1M
  if (0 <= theInteger) {
1280
27.9M
    *theIndex = (txIndex)theInteger;
1281
27.9M
    return 1;
1282
27.9M
  }
1283
209k
  return 0;
1284
28.1M
}
1285
1286
txFlag fxNumberToIndex(void* the, txNumber number, txIndex* theIndex)
1287
30.1M
{
1288
30.1M
  txIndex integer = (txIndex)number;
1289
30.1M
  txNumber check = integer;
1290
30.1M
  if ((number == check) && (integer < 4294967295u)) {
1291
27.6M
    *theIndex = integer;
1292
27.6M
    return 1;
1293
27.6M
  }
1294
2.46M
  return 0;
1295
30.1M
}
1296
1297
txFlag fxStringToIndex(void* the, txString theString, txIndex* theIndex)
1298
4.47M
{
1299
4.47M
  char buffer[256], c;
1300
4.47M
  txNumber number;
1301
4.47M
  txIndex integer;
1302
4.47M
  txNumber check;
1303
1304
4.47M
  c = c_read8(theString);
1305
4.47M
  if (('+' != c) && ('-' != c) && ('.' != c) && !(('0' <= c) && ('9' >= c)))
1306
1.53M
    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
242k
    fxNumberToString(the, number, buffer, sizeof(buffer), 0, 0);
1312
242k
    if (!c_strcmp(theString, buffer)) {
1313
232k
      *theIndex = integer;
1314
232k
      return 1;
1315
232k
    }
1316
242k
  }
1317
2.71M
  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
#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
};