Coverage Report

Created: 2025-09-04 06:38

/src/moddable/xs/sources/xsCommon.c
Line
Count
Source (jump to first uncovered line)
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
1.81M
{
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
1.81M
    char* result = C_NULL;
605
1.81M
    pthread_attr_t attrs;
606
1.81M
    pthread_attr_init(&attrs);
607
1.81M
    if (pthread_getattr_np(pthread_self(), &attrs) == 0) {
608
1.81M
        void* stackAddr;
609
1.81M
        size_t stackSize;
610
1.81M
      if (pthread_attr_getstack(&attrs, &stackAddr, &stackSize) == 0) {
611
1.81M
        result = (char*)stackAddr + (128 * 1024) + mxASANStackMargin;
612
1.81M
      }
613
1.81M
    }
614
1.81M
    pthread_attr_destroy(&attrs);
615
1.81M
    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
1.81M
}
627
628
#endif
629
630
void fxDeleteScript(txScript* script)
631
942k
{
632
942k
  if (script) {
633
909k
    if (script->symbolsBuffer)
634
909k
      c_free(script->symbolsBuffer);
635
909k
    if (script->hostsBuffer)
636
0
      c_free(script->hostsBuffer);
637
909k
    if (script->codeBuffer)
638
909k
      c_free(script->codeBuffer);
639
909k
    c_free(script);
640
909k
  }
641
942k
}
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
5.92M
{
659
5.92M
  #define mxIdentifierFirstCount 1358
660
5.92M
  static const txU2 gxIdentifierFirstTable[mxIdentifierFirstCount] ICACHE_RODATA_ATTR = {
661
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    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
5.92M
    7,221,3,5761,15,7472,16,621,2467,541,1507,4938,6,4191,
704
5.92M
  };
705
5.92M
  const txU2* p = gxIdentifierFirstTable;
706
5.92M
  const txU2* q = p + mxIdentifierFirstCount;
707
5.92M
  txU4 s = 0;
708
72.4M
  while (p < q) {
709
72.4M
    s += c_read16(p++);
710
72.4M
    if (c < s)
711
940k
      return 0;
712
71.4M
    s += c_read16(p++);
713
71.4M
    if (c <= s)
714
4.97M
      return 1;
715
71.4M
  }
716
12.9k
  return 0;
717
5.92M
}
718
719
txBoolean fxIsIdentifierNext(txU4 c)
720
23.6M
{
721
23.6M
  #define mxIdentifierNextCount 1586
722
23.6M
  static const txU2 gxIdentifierNextTable[mxIdentifierNextCount] ICACHE_RODATA_ATTR = {
723
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    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
23.6M
    1031,42719,33,4153,7,221,3,5761,15,7472,16,621,2467,541,1507,4938,6,4191,
773
23.6M
  };
774
23.6M
  const txU2* p = gxIdentifierNextTable;
775
23.6M
  const txU2* q = p + mxIdentifierNextCount;
776
23.6M
  txU4 s = 0;
777
184M
  while (p < q) {
778
183M
    s += c_read16(p++);
779
183M
    if (c < s)
780
4.87M
      return 0;
781
179M
    s += c_read16(p++);
782
179M
    if (c <= s)
783
18.6M
      return 1;
784
179M
  }
785
82.5k
  s += 712017;
786
82.5k
  if (c < s)
787
723
    return 0;
788
81.8k
  s += 239;
789
81.8k
  if (c <= s)
790
1
    return 1;
791
81.8k
  return 0;
792
81.8k
}
793
794
txBoolean fxIsSpace(txInteger character)
795
38.6M
{
796
38.6M
  static const txU4 spaces[27] ICACHE_RODATA_ATTR = {
797
38.6M
    0x00000009,
798
38.6M
        0x0000000A,
799
38.6M
        0x0000000B,
800
38.6M
        0x0000000C,
801
38.6M
        0x0000000D,
802
38.6M
    0x00000020,
803
38.6M
    0x000000A0,
804
38.6M
    0x00001680,
805
38.6M
    0x00002000,
806
38.6M
    0x00002001,
807
38.6M
    0x00002002,
808
38.6M
    0x00002003,
809
38.6M
    0x00002004,
810
38.6M
    0x00002005,
811
38.6M
    0x00002006,
812
38.6M
    0x00002007,
813
38.6M
    0x00002008,
814
38.6M
    0x00002009,
815
38.6M
    0x0000200A,
816
38.6M
    0x00002028,
817
38.6M
    0x00002029,
818
38.6M
    0x0000202F,
819
38.6M
    0x0000205F,
820
38.6M
    0x00003000,
821
38.6M
    0x0000FEFF,
822
38.6M
    0xFFFFFFFF,
823
38.6M
    0x00000000,
824
38.6M
  };
825
38.6M
  const txU4 *p = spaces;
826
38.6M
  txU4 c = (txU4)character;
827
38.6M
  txU4 s;
828
278M
  while ((s = *p++)) {
829
278M
    if (c < s)
830
38.5M
      return 0;
831
240M
    if (c == s)
832
116k
      return 1;
833
240M
  }
834
0
  return 0;
835
38.6M
}
836
837
txBoolean fxParseHex(txU1 c, txU4* value)
838
3.54M
{
839
3.54M
  if (('0' <= c) && (c <= '9'))
840
1.56M
    *value = (*value * 16) + (c - '0');
841
1.98M
  else if (('a' <= c) && (c <= 'f'))
842
675k
    *value = (*value * 16) + (10 + c - 'a');
843
1.30M
  else if (('A' <= c) && (c <= 'F'))
844
1.10M
    *value = (*value * 16) + (10 + c - 'A');
845
200k
  else
846
200k
    return 0;
847
3.34M
  return 1;
848
3.54M
}
849
850
txBoolean fxParseHexEscape(txString* string, txInteger* character)
851
1.58M
{
852
1.58M
  txU1* p = *((txU1**)string);
853
1.58M
  txU4 value = 0;
854
1.58M
  txU1 i, c;
855
4.50M
  for (i = 0; i < 2; i++) {
856
3.07M
    c = c_read8(p);
857
3.07M
    if (!fxParseHex(c, &value))
858
160k
      return 0;
859
2.91M
    p++;
860
2.91M
  }
861
1.42M
  *character = (txInteger)value;
862
1.42M
  *string = (txString)p;
863
1.42M
  return 1;
864
1.58M
}
865
866
txBoolean fxParseUnicodeEscape(txString* string, txInteger* character, txInteger braces, txInteger separator)
867
119k
{
868
119k
  txU1* p = *((txU1**)string);
869
119k
  txU4 value = 0;
870
119k
  txU1 c;
871
119k
  txInteger i;
872
  
873
119k
  c = c_read8(p++);
874
119k
  if (braces && (c == '{')) {
875
4.21k
    c = c_read8(p++);
876
11.5k
    for (i = 0; value < 0x00110000; i++) {
877
11.2k
      if (fxParseHex(c, &value)) {
878
7.37k
        c = c_read8(p++);
879
7.37k
      }
880
3.85k
      else
881
3.85k
        break;
882
11.2k
    }
883
4.21k
    if ((c == '}') && (i > 0) && (value < 0x00110000)) {
884
870
      *character = (txInteger)value;
885
870
      *string = (txString)p;
886
870
      return 1;
887
870
    }
888
3.34k
    return 0;
889
4.21k
  }
890
115k
  if (!fxParseHex(c, &value)) return 0;
891
105k
  c = c_read8(p++);
892
105k
  if (!fxParseHex(c, &value)) return 0;
893
97.3k
  c = c_read8(p++);
894
97.3k
  if (!fxParseHex(c, &value)) return 0;
895
84.7k
  c = c_read8(p++);
896
84.7k
  if (!fxParseHex(c, &value)) return 0;
897
79.7k
  *character = (txInteger)value;
898
79.7k
  *string = (txString)p;
899
79.7k
  c = c_read8(p++);
900
79.7k
  if (c && (c == separator) && (0x0000D800 <= value) && (value <= 0x0000DBFF)) {
901
15.0k
    c = c_read8(p++);
902
15.0k
    if (c == 'u') {
903
14.6k
      txU4 other = 0;
904
14.6k
      c = c_read8(p++);
905
14.6k
      if (!fxParseHex(c, &other)) return 1;
906
14.3k
      c = c_read8(p++);
907
14.3k
      if (!fxParseHex(c, &other)) return 1;
908
14.0k
      c = c_read8(p++);
909
14.0k
      if (!fxParseHex(c, &other)) return 1;
910
13.8k
      c = c_read8(p++);
911
13.8k
      if (!fxParseHex(c, &other)) return 1;
912
13.5k
      if ((0x0000DC00 <= other) && (other <= 0x0000DFFF)) {
913
8.64k
        *character = (txInteger)(0x00010000 + ((value & 0x03FF) << 10) + (other & 0x03FF));
914
8.64k
        *string = (txString)p;
915
8.64k
      }
916
13.5k
    }
917
15.0k
  }
918
78.7k
  return 1;
919
79.7k
}
920
921
txString fxSkipSpaces(txString string) 
922
51.8M
{
923
51.8M
  txString p = string;
924
51.8M
  txString q = p;
925
51.8M
  txInteger c;
926
51.9M
  while (((q = fxUTF8Decode(q, &c))) && (c != C_EOF)) {
927
38.6M
    if (fxIsSpace(c))
928
116k
      p = q;
929
38.5M
    else
930
38.5M
      break;
931
38.6M
  }
932
51.8M
  return p;
933
51.8M
}
934
935
txString fxStringifyHexEscape(txString string, txInteger character)
936
654k
{
937
654k
  const char* digits = gxHexUpper;
938
654k
  txU1* p = (txU1*)string;
939
654k
  *p++ = c_read8(digits + ((character & 0x000000F0) >> 4));
940
654k
  *p++ = c_read8(digits + (character & 0x0000000F));
941
654k
  return (txString)p;
942
654k
}
943
944
txString fxStringifyUnicodeEscape(txString string, txInteger character, txInteger separator)
945
6.23M
{
946
6.23M
  const char* digits = (separator == '%') ? gxHexUpper : gxHexLower;
947
6.23M
  txU1* p = (txU1*)string;
948
6.23M
  txInteger surrogate;
949
6.23M
  if (character > 0xFFFF) {
950
55
    character -= 0x10000;
951
55
    surrogate = 0xDC00 | (character & 0x3FF);
952
55
    character = 0xD800 | (character >> 10);
953
55
  }
954
6.23M
  else
955
6.23M
    surrogate = 0;
956
6.23M
  *p++ = c_read8(digits + ((character & 0x0000F000) >> 12));
957
6.23M
  *p++ = c_read8(digits + ((character & 0x00000F00) >> 8));
958
6.23M
  *p++ = c_read8(digits + ((character & 0x000000F0) >> 4));
959
6.23M
  *p++ = c_read8(digits + (character & 0x0000000F));
960
6.23M
  if (surrogate) {
961
55
    *p++ = separator;
962
55
    *p++ = 'u';
963
55
    *p++ = c_read8(digits + ((surrogate & 0x0000F000) >> 12));
964
55
    *p++ = c_read8(digits + ((surrogate & 0x00000F00) >> 8));
965
55
    *p++ = c_read8(digits + ((surrogate & 0x000000F0) >> 4));
966
55
    *p++ = c_read8(digits + (surrogate & 0x0000000F));
967
55
  }
968
6.23M
  return (txString)p;
969
6.23M
}
970
971
int fxUTF8Compare(txString p1, txString p2)
972
292k
{
973
292k
  register const unsigned char *s1 = (const unsigned char *) p1;
974
292k
  register const unsigned char *s2 = (const unsigned char *) p2;
975
292k
  unsigned char c1, c2;
976
1.97M
  do {
977
1.97M
    c1 = (unsigned char) *s1++;
978
1.97M
    c2 = (unsigned char) *s2++;
979
1.97M
    if (c1 == '\0')
980
192k
      return c1 - c2;
981
1.97M
  }
982
1.78M
  while (c1 == c2);
983
99.5k
  if (c2 == '\0')
984
84.6k
    return c1 - c2;
985
14.8k
  if ((c1 == 0xC0) && (*s1 == 0x80))
986
18
    return 0 - c2;
987
14.8k
  if ((c2 == 0xC0) && (*s2 == 0x80))
988
253
    return c1 - 0;
989
14.6k
  return c1 - c2;
990
14.8k
}
991
992
txString fxUTF8Decode(txString string, txInteger* character)
993
590M
{
994
590M
  txU1* p = (txU1*)string;
995
590M
  txU4 c = c_read8(p++);
996
590M
  if (c) {
997
532M
    if (c & 0x80) {
998
196M
      const txUTF8Sequence *sequence;
999
196M
      txS4 size;
1000
537M
      for (sequence = gxUTF8Sequences; sequence->size; sequence++) {
1001
537M
        if ((c & sequence->cmask) == sequence->cval)
1002
196M
          break;
1003
537M
      }
1004
196M
      size = sequence->size - 1;
1005
537M
      while (size > 0) {
1006
341M
        size--;
1007
341M
        c = (c << 6) | (c_read8(p++) & 0x3F);
1008
341M
      }
1009
196M
      c &= sequence->lmask;
1010
196M
    }
1011
532M
    *character = (txInteger)c;
1012
532M
    return (txString)p;
1013
532M
  }
1014
57.9M
  *character = C_EOF;
1015
57.9M
  return (txString)p;
1016
590M
}
1017
1018
txString fxUTF8Encode(txString string, txInteger character)
1019
13.3M
{
1020
13.3M
  txU1* p = (txU1*)string;
1021
13.3M
  if (character < 0) {
1022
0
  }
1023
13.3M
  else if (character == 0) {
1024
1.83M
    *p++ = 0xC0;
1025
1.83M
    *p++ = 0x80;
1026
1.83M
  }
1027
11.5M
  else if (character < 0x80) {
1028
6.09M
    *p++ = (txU1)character;
1029
6.09M
  }
1030
5.41M
  else if (character < 0x800) {
1031
59.1k
    *p++ = (txU1)(0xC0 | (((txU4)character) >> 6));
1032
59.1k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1033
59.1k
  }
1034
5.35M
  else if (character < 0x10000) {
1035
5.34M
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1036
5.34M
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1037
5.34M
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1038
5.34M
  }
1039
13.5k
  else if (character < 0x110000) {
1040
13.5k
    *p++ = (txU1)(0xF0 | (((txU4)character) >> 18));
1041
13.5k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 12) & 0x3F));
1042
13.5k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1043
13.5k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1044
13.5k
  }
1045
13.3M
  return (txString)p;
1046
13.3M
}
1047
1048
txSize fxUTF8Length(txInteger character)
1049
26.5M
{
1050
26.5M
  txSize length;
1051
26.5M
  if (character < 0)
1052
0
    length = 0;
1053
26.5M
  else if (character == 0)
1054
3.67M
    length = 2;
1055
22.8M
  else if (character < 0x80)
1056
12.1M
    length = 1;
1057
10.6M
  else if (character < 0x800)
1058
118k
    length = 2;
1059
10.5M
  else if (character < 0x10000)
1060
10.5M
    length = 3;
1061
9.49k
  else if (character < 0x110000)
1062
9.49k
    length = 4;
1063
0
  else
1064
0
    length = 0;
1065
26.5M
  return length;
1066
26.5M
}
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
409M
{
1086
409M
  txInteger result;
1087
409M
  string = fxUTF8Decode(string, &result);
1088
409M
  if ((0x0000D800 <= result) && (result <= 0x0000DBFF)) {
1089
933k
    txString former = string;
1090
933k
    txInteger surrogate;
1091
933k
    string = fxUTF8Decode(former, &surrogate);
1092
933k
    if ((0x0000DC00 <= surrogate) && (surrogate <= 0x0000DFFF))
1093
329k
      result = 0x00010000 + ((result & 0x000003FF) << 10) + (surrogate & 0x000003FF);
1094
604k
    else
1095
604k
      string = former;
1096
933k
  }
1097
409M
  *character = result;
1098
409M
  return string;
1099
409M
}
1100
1101
txString fxCESU8Encode(txString string, txInteger character)
1102
187M
{
1103
187M
  txU1* p = (txU1*)string;
1104
187M
  if (character < 0) {
1105
304
  }
1106
187M
  else if (character == 0) {
1107
13.2M
    *p++ = 0xC0;
1108
13.2M
    *p++ = 0x80;
1109
13.2M
  }
1110
173M
  else if (character < 0x80) {
1111
130M
    *p++ = (txU1)character;
1112
130M
  }
1113
43.5M
  else if (character < 0x800) {
1114
930k
    *p++ = (txU1)(0xC0 | (((txU4)character) >> 6));
1115
930k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1116
930k
  }
1117
42.6M
  else if (character < 0x10000) {
1118
42.5M
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1119
42.5M
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1120
42.5M
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1121
42.5M
  }
1122
89.2k
  else if (character < 0x110000) {
1123
89.1k
    txInteger surrogate;
1124
89.1k
    character -= 0x00010000;
1125
89.1k
    surrogate = 0xDC00 | (character & 0x3FF);
1126
89.1k
    character = 0xD800 | ((character >> 10) & 0x3FF);
1127
89.1k
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1128
89.1k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1129
89.1k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1130
89.1k
    *p++ = (txU1)(0xE0 | (((txU4)surrogate) >> 12));
1131
89.1k
    *p++ = (txU1)(0x80 | ((((txU4)surrogate) >> 6) & 0x3F));
1132
89.1k
    *p++ = (txU1)(0x80 | (((txU4)surrogate) & 0x3F));
1133
89.1k
  }
1134
187M
  return (txString)p;
1135
187M
}
1136
1137
txSize fxCESU8Length(txInteger character)
1138
240M
{
1139
240M
  txSize length;
1140
240M
  if (character < 0)
1141
304
    length = 0;
1142
240M
  else if (character == 0)
1143
13.2M
    length = 2;
1144
227M
  else if (character < 0x80)
1145
179M
    length = 1;
1146
48.1M
  else if (character < 0x800)
1147
930k
    length = 2;
1148
47.2M
  else if (character < 0x10000)
1149
47.1M
    length = 3;
1150
100k
  else if (character < 0x110000)
1151
99.9k
    length = 6;
1152
73
  else
1153
73
    length = 0;
1154
240M
  return length;
1155
240M
}
1156
#endif
1157
1158
txSize fxUTF8ToUnicodeOffset(txString theString, txSize theOffset)
1159
647k
{
1160
647k
  txU1* p = (txU1*)theString;
1161
647k
  txU1 c;
1162
647k
  txSize unicodeOffset = 0;
1163
647k
  txSize utf8Offset = 0;
1164
  
1165
292M
  while ((c = c_read8(p++))) {
1166
291M
    if ((c & 0xC0) != 0x80) {
1167
195M
      if (utf8Offset == theOffset)
1168
343k
        return unicodeOffset;
1169
195M
      unicodeOffset++;
1170
195M
    }
1171
291M
    utf8Offset++;
1172
291M
  }
1173
303k
  if (utf8Offset == theOffset)
1174
14
    return unicodeOffset;
1175
303k
  else
1176
303k
    return -1;
1177
303k
}
1178
1179
#if 1
1180
txSize fxUnicodeLength(txString theString, txSize* byteLength)
1181
12.3M
{
1182
12.3M
  txU1* p = (txU1*)theString;
1183
12.3M
  txU1 c;
1184
12.3M
  txSize unicodeLength = 0;
1185
12.3M
  txSize utf8Length = 0;
1186
  
1187
2.91G
  while ((c = c_read8(p++))) {
1188
2.90G
    if ((c & 0xC0) != 0x80)
1189
1.56G
      unicodeLength++;
1190
2.90G
    utf8Length++;
1191
2.90G
  }
1192
12.3M
  if (byteLength)
1193
4.29M
    *byteLength = utf8Length;
1194
12.3M
  return unicodeLength;
1195
12.3M
}
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
94.9M
{
1258
94.9M
  txU1* p = (txU1*)theString;
1259
94.9M
  txU1 c;
1260
94.9M
  txSize unicodeOffset = 0;
1261
94.9M
  txSize utf8Offset = 0;
1262
  
1263
279M
    while ((c = c_read8(p++))) {
1264
278M
    if ((c & 0xC0) != 0x80) {
1265
202M
      if (unicodeOffset == theOffset)
1266
93.3M
        return utf8Offset;
1267
108M
      unicodeOffset++;
1268
108M
    }
1269
184M
        utf8Offset++;
1270
184M
  }
1271
1.60M
  if (unicodeOffset == theOffset)
1272
1.52M
    return utf8Offset;
1273
87.3k
  else
1274
87.3k
    return -1;
1275
1.60M
}
1276
1277
txFlag fxIntegerToIndex(void* the, txInteger theInteger, txIndex* theIndex)
1278
17.3M
{
1279
17.3M
  if (0 <= theInteger) {
1280
17.3M
    *theIndex = (txIndex)theInteger;
1281
17.3M
    return 1;
1282
17.3M
  }
1283
45.2k
  return 0;
1284
17.3M
}
1285
1286
txFlag fxNumberToIndex(void* the, txNumber number, txIndex* theIndex)
1287
28.6M
{
1288
28.6M
  txIndex integer = (txIndex)number;
1289
28.6M
  txNumber check = integer;
1290
28.6M
  if ((number == check) && (integer < 4294967295u)) {
1291
26.2M
    *theIndex = integer;
1292
26.2M
    return 1;
1293
26.2M
  }
1294
2.44M
  return 0;
1295
28.6M
}
1296
1297
txFlag fxStringToIndex(void* the, txString theString, txIndex* theIndex)
1298
5.98M
{
1299
5.98M
  char buffer[256], c;
1300
5.98M
  txNumber number;
1301
5.98M
  txIndex integer;
1302
5.98M
  txNumber check;
1303
1304
5.98M
  c = c_read8(theString);
1305
5.98M
  if (('+' != c) && ('-' != c) && ('.' != c) && !(('0' <= c) && ('9' >= c)))
1306
1.00M
    return 0;
1307
4.98M
  number = fxStringToNumber(the, theString, 1);
1308
4.98M
  integer = (txIndex)number;
1309
4.98M
  check = integer;
1310
4.98M
  if ((number == check) && (integer < 4294967295u)) {
1311
2.47M
    fxNumberToString(the, number, buffer, sizeof(buffer), 0, 0);
1312
2.47M
    if (!c_strcmp(theString, buffer)) {
1313
2.44M
      *theIndex = integer;
1314
2.44M
      return 1;
1315
2.44M
    }
1316
2.47M
  }
1317
2.53M
  return 0;
1318
4.98M
}
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
};