Coverage Report

Created: 2026-03-16 06:17

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