Coverage Report

Created: 2025-12-14 06:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/moddable/xs/sources/xsCommon.c
Line
Count
Source
1
/*
2
 * Copyright (c) 2016-2025  Moddable Tech, Inc.
3
 *
4
 *   This file is part of the Moddable SDK Runtime.
5
 * 
6
 *   The Moddable SDK Runtime is free software: you can redistribute it and/or modify
7
 *   it under the terms of the GNU Lesser General Public License as published by
8
 *   the Free Software Foundation, either version 3 of the License, or
9
 *   (at your option) any later version.
10
 * 
11
 *   The Moddable SDK Runtime is distributed in the hope that it will be useful,
12
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *   GNU Lesser General Public License for more details.
15
 * 
16
 *   You should have received a copy of the GNU Lesser General Public License
17
 *   along with the Moddable SDK Runtime.  If not, see <http://www.gnu.org/licenses/>.
18
 *
19
 * This file incorporates work covered by the following copyright and  
20
 * permission notice:  
21
 *
22
 *       Copyright (C) 2010-2016 Marvell International Ltd.
23
 *       Copyright (C) 2002-2010 Kinoma, Inc.
24
 *
25
 *       Licensed under the Apache License, Version 2.0 (the "License");
26
 *       you may not use this file except in compliance with the License.
27
 *       You may obtain a copy of the License at
28
 *
29
 *        http://www.apache.org/licenses/LICENSE-2.0
30
 *
31
 *       Unless required by applicable law or agreed to in writing, software
32
 *       distributed under the License is distributed on an "AS IS" BASIS,
33
 *       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
34
 *       See the License for the specific language governing permissions and
35
 *       limitations under the License.
36
 */
37
38
#define _GNU_SOURCE
39
#include "xsCommon.h"
40
#ifndef mxUseDefaultCStackLimit
41
  #define mxUseDefaultCStackLimit 1
42
#endif
43
44
const txString gxCodeNames[XS_CODE_COUNT] = {
45
  "",
46
  /* XS_CODE_ADD */ "add",
47
  /* XS_CODE_ARGUMENT */ "argument",
48
  /* XS_CODE_ARGUMENTS */ "arguments",
49
  /* XS_CODE_ARGUMENTS_SLOPPY */ "arguments_sloppy",
50
  /* XS_CODE_ARGUMENTS_STRICT */ "arguments_strict",
51
  /* XS_CODE_ARRAY */ "array",
52
  /* XS_CODE_ASYNC_FUNCTION */ "async_function",
53
  /* XS_CODE_ASYNC_GENERATOR_FUNCTION */ "async_generator_function",
54
  /* XS_CODE_AT */ "at",
55
  /* XS_CODE_AWAIT */ "await",
56
  /* XS_CODE_BEGIN_SLOPPY */ "begin_sloppy",
57
  /* XS_CODE_BEGIN_STRICT */ "begin_strict",
58
  /* XS_CODE_BEGIN_STRICT_BASE */ "begin_strict_base",
59
  /* XS_CODE_BEGIN_STRICT_DERIVED */ "begin_strict_derived",
60
  /* XS_CODE_BEGIN_STRICT_FIELD */ "begin_strict_field",
61
  /* XS_CODE_BIGINT_1 */ "bigint",
62
  /* XS_CODE_BIGINT_2 */ "bigint_2",
63
  /* XS_CODE_BIT_AND */ "bit_and",
64
  /* XS_CODE_BIT_NOT */ "bit_not",
65
  /* XS_CODE_BIT_OR */ "bit_or",
66
  /* XS_CODE_BIT_XOR */ "bit_xor",
67
  /* XS_CODE_BRANCH_1 */ "branch",
68
  /* XS_CODE_BRANCH_2 */ "branch_2",
69
  /* XS_CODE_BRANCH_4 */ "branch_4",
70
  /* XS_CODE_BRANCH_CHAIN_1 */ "branch_chain",
71
  /* XS_CODE_BRANCH_CHAIN_2 */ "branch_chain_2",
72
  /* XS_CODE_BRANCH_CHAIN_4 */ "branch_chain_4",
73
  /* XS_CODE_BRANCH_COALESCE_1 */ "branch_coalesce",
74
  /* XS_CODE_BRANCH_COALESCE_2 */ "branch_coalesce_2",
75
  /* XS_CODE_BRANCH_COALESCE_4 */ "branch_coalesce_4",
76
  /* XS_CODE_BRANCH_ELSE_1 */ "branch_else",
77
  /* XS_CODE_BRANCH_ELSE_2 */ "branch_else_2",
78
  /* XS_CODE_BRANCH_ELSE_4 */ "branch_else_4",
79
  /* XS_CODE_BRANCH_IF_1 */ "branch_if",
80
  /* XS_CODE_BRANCH_IF_2 */ "branch_if_2",
81
  /* XS_CODE_BRANCH_IF_4 */ "branch_if_4",
82
  /* XS_CODE_BRANCH_STATUS_1 */ "branch_status",
83
  /* XS_CODE_BRANCH_STATUS_2 */ "branch_status_2",
84
  /* XS_CODE_BRANCH_STATUS_4 */ "branch_status_4",
85
  /* XS_CODE_CALL */ "call",
86
  /* XS_CODE_CATCH_1 */ "catch",
87
  /* XS_CODE_CATCH_2 */ "catch_2",
88
  /* XS_CODE_CATCH_4 */ "catch_4",
89
  /* XS_CODE_CHECK_INSTANCE */ "check_instance",
90
  /* XS_CODE_CLASS */ "class",
91
  /* XS_CODE_CODE_1 */ "code",
92
  /* XS_CODE_CODE_2 */ "code_2",
93
  /* XS_CODE_CODE_4 */ "code_4",
94
  /* XS_CODE_CODE_ARCHIVE_1 */ "code_archive",
95
  /* XS_CODE_CODE_ARCHIVE_2 */ "code_archive_2",
96
  /* XS_CODE_CODE_ARCHIVE_4 */ "code_archive_4",
97
  /* XS_CODE_CONST_CLOSURE_1 */ "const_closure",
98
  /* XS_CODE_CONST_CLOSURE_2 */ "const_closure_2",
99
  /* XS_CODE_CONST_LOCAL_1 */ "const_local",
100
  /* XS_CODE_CONST_LOCAL_2 */ "const_local_2",
101
  /* XS_CODE_CONSTRUCTOR_FUNCTION */ "constructor_function",
102
  /* XS_CODE_COPY_OBJECT */ "copy_object",
103
  /* XS_CODE_CURRENT */ "current",
104
  /* XS_CODE_DEBUGGER */ "debugger",
105
  /* XS_CODE_DECREMENT */ "decrement",
106
  /* XS_CODE_DELETE_PROPERTY */ "delete_property",
107
  /* XS_CODE_DELETE_PROPERTY_AT */ "delete_property_at",
108
  /* XS_CODE_DELETE_SUPER */ "delete_super",
109
  /* XS_CODE_DELETE_SUPER_AT */ "delete_super_at",
110
  /* XS_CODE_DIVIDE */ "divide",
111
  /* XS_CODE_DUB */ "dub",
112
  /* XS_CODE_DUB_AT */ "dub_at",
113
  /* XS_CODE_END */ "end",
114
  /* XS_CODE_END_ARROW */ "end_arrow",
115
  /* XS_CODE_END_BASE */ "end_base",
116
  /* XS_CODE_END_DERIVED */ "end_derived",
117
  /* XS_CODE_ENVIRONMENT */ "environment",
118
  /* XS_CODE_EQUAL */ "equal",
119
  /* XS_CODE_EVAL */ "eval",
120
  /* XS_CODE_EVAL_ENVIRONMENT */ "eval_environment",
121
  /* XS_CODE_EVAL_PRIVATE */ "eval_private",
122
  /* XS_CODE_EVAL_REFERENCE */ "eval_reference",
123
  /* XS_CODE_EVAL_TAIL */ "eval_tail",
124
  /* XS_CODE_EXCEPTION */ "exception",
125
  /* XS_CODE_EXPONENTIATION */ "exponentiation",
126
  /* XS_CODE_EXTEND */ "extend",
127
  /* XS_CODE_FALSE */ "false",
128
  /* XS_CODE_FILE */ "file",
129
  /* XS_CODE_FOR_AWAIT_OF */ "for_await_of",
130
  /* XS_CODE_FOR_IN */ "for_in",
131
  /* XS_CODE_FOR_OF */ "for_of",
132
  /* XS_CODE_FUNCTION */ "function",
133
  /* XS_CODE_FUNCTION_ENVIRONMENT */ "function_environment",
134
  /* XS_CODE_GENERATOR_FUNCTION */ "generator",
135
  /* XS_CODE_GET_CLOSURE_1 */ "get_closure",
136
  /* XS_CODE_GET_CLOSURE_2 */ "get_closure_2",
137
  /* XS_CODE_GET_LOCAL_1 */ "get_local",
138
  /* XS_CODE_GET_LOCAL_2 */ "get_local_2",
139
  /* XS_CODE_GET_PRIVATE_1 */ "get_private",
140
  /* XS_CODE_GET_PRIVATE_2 */ "get_private_2",
141
  /* XS_CODE_GET_PROPERTY */ "get_property",
142
  /* XS_CODE_GET_PROPERTY_AT */ "get_property_at",
143
  /* XS_CODE_GET_RESULT */ "get_result",
144
  /* XS_CODE_GET_SUPER */ "get_super",
145
  /* XS_CODE_GET_SUPER_AT */ "get_super_at",
146
  /* XS_CODE_GET_THIS */ "get_this",
147
  /* XS_CODE_GET_THIS_VARIABLE */ "get_this_variable",
148
  /* XS_CODE_GET_VARIABLE */ "get_variable",
149
  /* XS_CODE_GLOBAL */ "global",
150
  /* XS_CODE_HAS_PRIVATE_1 */ "has_private",
151
  /* XS_CODE_HAS_PRIVATE_2 */ "has_private_2",
152
  /* XS_CODE_HOST */ "host",
153
  /* XS_CODE_IMPORT */ "import",
154
  /* XS_CODE_IMPORT_META */ "import.meta",
155
  /* XS_CODE_IN */ "in",
156
  /* XS_CODE_INCREMENT */ "increment",
157
  /* XS_CODE_INSTANCEOF */ "instanceof",
158
  /* XS_CODE_INSTANTIATE */ "instantiate",
159
  /* XS_CODE_INTEGER_1 */ "integer",
160
  /* XS_CODE_INTEGER_2 */ "integer_2",
161
  /* XS_CODE_INTEGER_4 */ "integer_4",
162
  /* XS_CODE_LEFT_SHIFT */ "left_shift",
163
  /* XS_CODE_LESS */ "less",
164
  /* XS_CODE_LESS_EQUAL */ "less_equal",
165
  /* XS_CODE_LET_CLOSURE_1 */ "let_closure",
166
  /* XS_CODE_LET_CLOSURE_2 */ "let_closure_2",
167
  /* XS_CODE_LET_LOCAL_1 */ "let_local",
168
  /* XS_CODE_LET_LOCAL_2 */ "let_local_2",
169
  /* XS_CODE_LINE */ "line",
170
  /* XS_CODE_MINUS */ "minus",
171
  /* XS_CODE_MODULE */ "module",
172
  /* XS_CODE_MODULO */ "modulo",
173
  /* XS_CODE_MORE */ "more",
174
  /* XS_CODE_MORE_EQUAL */ "more_equal",
175
  /* XS_CODE_MULTIPLY */ "multiply",
176
  /* XS_CODE_NAME */ "name",
177
  /* XS_CODE_NEW */ "new",
178
  /* XS_CODE_NEW_CLOSURE */ "new_closure",
179
  /* XS_CODE_NEW_LOCAL */ "new_local",
180
  /* XS_CODE_NEW_PRIVATE_1 */ "new_private",
181
  /* XS_CODE_NEW_PRIVATE_2 */ "new_private_2",
182
  /* XS_CODE_NEW_PROPERTY */ "new_property",
183
  /* XS_CODE_NEW_PROPERTY_AT */ "new_property_at",
184
  /* XS_CODE_NEW_TEMPORARY */ "new_temporary",
185
  /* XS_CODE_NOT */ "not",
186
  /* XS_CODE_NOT_EQUAL */ "not_equal",
187
  /* XS_CODE_NULL */ "null",
188
  /* XS_CODE_NUMBER */ "number",
189
  /* XS_CODE_OBJECT */ "object",
190
  /* XS_CODE_PLUS */ "plus",
191
  /* XS_CODE_POP */ "pop",
192
  /* XS_CODE_PROGRAM_ENVIRONMENT */ "program_environment",
193
  /* XS_CODE_PROGRAM_REFERENCE */ "program_reference",
194
  /* XS_CODE_PULL_CLOSURE_1 */ "pull_closure",
195
  /* XS_CODE_PULL_CLOSURE_2 */ "pull_closure_2",
196
  /* XS_CODE_PULL_LOCAL_1 */ "pull_local",
197
  /* XS_CODE_PULL_LOCAL_2 */ "pull_local_2",
198
  /* XS_CODE_REFRESH_CLOSURE_1 */ "refresh_closure",
199
  /* XS_CODE_REFRESH_CLOSURE_2 */ "refresh_closure_2",
200
  /* XS_CODE_REFRESH_LOCAL_1 */ "refresh_local",
201
  /* XS_CODE_REFRESH_LOCAL_2 */ "refresh_local_2",
202
  /* XS_CODE_REGEXP */ "regexp",
203
  /* XS_CODE_RESERVE_1 */ "reserve",
204
  /* XS_CODE_RESERVE_2 */ "reserve_2",
205
  /* XS_CODE_RESET_CLOSURE_1 */ "reset_closure",
206
  /* XS_CODE_RESET_CLOSURE_2 */ "reset_closure_2",
207
  /* XS_CODE_RESET_LOCAL_1 */ "reset_local",
208
  /* XS_CODE_RESET_LOCAL_2 */ "reset_local_2",
209
  /* XS_CODE_RETHROW */ "rethrow",
210
  /* XS_CODE_RETRIEVE_1 */ "retrieve",
211
  /* XS_CODE_RETRIEVE_2 */ "retrieve_2",
212
  /* XS_CODE_RETRIEVE_TARGET */ "retrieve_target",
213
  /* XS_CODE_RETRIEVE_THIS */ "retrieve_this",
214
  /* XS_CODE_RETURN */ "return",
215
  /* XS_CODE_RUN */ "run",
216
  /* XS_CODE_RUN_1 */ "run_1",
217
  /* XS_CODE_RUN_2 */ "run_2",
218
  /* XS_CODE_RUN_4 */ "run_4",
219
  /* XS_CODE_RUN_TAIL */ "run_tail",
220
  /* XS_CODE_RUN_TAIL_1 */ "run_tail_1",
221
  /* XS_CODE_RUN_TAIL_2 */ "run_tail_2",
222
  /* XS_CODE_RUN_TAIL_4 */ "run_tail_4",
223
  /* XS_CODE_SET_CLOSURE_1 */ "set_closure",
224
  /* XS_CODE_SET_CLOSURE_2 */ "set_closure_2",
225
  /* XS_CODE_SET_HOME */ "set_home",
226
  /* XS_CODE_SET_LOCAL_1 */ "set_local",
227
  /* XS_CODE_SET_LOCAL_2 */ "set_local_2",
228
  /* XS_CODE_SET_PRIVATE_1 */ "set_private",
229
  /* XS_CODE_SET_PRIVATE_2 */ "set_private_2",
230
  /* XS_CODE_SET_PROPERTY */ "set_property",
231
  /* XS_CODE_SET_PROPERTY_AT */ "set_property_at",
232
  /* XS_CODE_SET_RESULT */ "set_result",
233
  /* XS_CODE_SET_SUPER */ "set_super",
234
  /* XS_CODE_SET_SUPER_AT */ "set_super_at",
235
  /* XS_CODE_SET_THIS */ "set_this",
236
  /* XS_CODE_SET_VARIABLE */ "set_variable",
237
  /* XS_CODE_SIGNED_RIGHT_SHIFT */ "signed_right_shift",
238
  /* XS_CODE_START_ASYNC */ "start_async",
239
  /* XS_CODE_START_ASYNC_GENERATOR */ "start_async_generator",
240
  /* XS_CODE_START_GENERATOR */ "start_generator",
241
  /* XS_CODE_STORE_1 */ "store_1",
242
  /* XS_CODE_STORE_2 */ "store_2",
243
  /* XS_CODE_STORE_ARROW */ "store_arrow",
244
  /* XS_CODE_STRICT_EQUAL */ "strict_equal",
245
  /* XS_CODE_STRICT_NOT_EQUAL */ "strict_not_equal",
246
  /* XS_CODE_STRING_1 */ "string",
247
  /* XS_CODE_STRING_2 */ "string_2",
248
  /* XS_CODE_STRING_4 */ "string_4",
249
  /* XS_CODE_STRING_ARCHIVE_1 */ "string_archive",
250
  /* XS_CODE_STRING_ARCHIVE_2 */ "string_archive_2",
251
  /* XS_CODE_STRING_ARCHIVE_4 */ "string_archive_4",
252
  /* XS_CODE_SUBTRACT */ "subtract",
253
  /* XS_CODE_SUPER */ "super",
254
  /* XS_CODE_SWAP */ "swap",
255
  /* XS_CODE_SYMBOL */ "symbol",
256
  /* XS_CODE_TARGET */ "target",
257
  /* XS_CODE_TEMPLATE */ "template",
258
  /* XS_CODE_TEMPLATE_CACHE */ "template_cache",
259
  /* XS_CODE_THIS */ "this",
260
  /* XS_CODE_THROW */ "throw",
261
  /* XS_CODE_THROW_STATUS */ "throw_status",
262
  /* XS_CODE_TO_INSTANCE */ "to_instance",
263
  /* XS_CODE_TO_NUMERIC */ "to_numeric",
264
  /* XS_CODE_TO_STRING */ "to_string",
265
  /* XS_CODE_TRANSFER */ "transfer",
266
  /* XS_CODE_TRUE */ "true",
267
  /* XS_CODE_TYPEOF */ "typeof",
268
  /* XS_CODE_UNCATCH */ "uncatch",
269
  /* XS_CODE_UNDEFINED */ "undefined",
270
  /* XS_CODE_UNSIGNED_RIGHT_SHIFT */ "unsigned_right_shift",
271
  /* XS_CODE_UNWIND_1 */ "unwind",
272
  /* XS_CODE_UNWIND_2 */ "unwind_2",
273
  /* XS_CODE_VAR_CLOSURE_1 */ "var_closure_1",
274
  /* XS_CODE_VAR_CLOSURE_2 */ "var_closure_2",
275
  /* XS_CODE_VAR_LOCAL_1 */ "var_local_1",
276
  /* XS_CODE_VAR_LOCAL_2 */ "var_local_2",
277
  /* XS_CODE_VOID */ "void",
278
  /* XS_CODE_WITH */ "with",
279
  /* XS_CODE_WITHOUT */ "without",
280
  /* XS_CODE_YIELD */ "yield",
281
  /* XS_CODE_PROFILE */ "profile",
282
  /* XS_CODE_YIELD_STAR */ "yield*",
283
// mxExplicitResourceManagement 
284
  /* XS_CODE_USED_1 */ "used_1",
285
  /* XS_CODE_USED_2 */ "used_2",
286
  /* XS_CODE_USING */ "using",
287
  /* XS_CODE_USING_ASYNC */ "await using",
288
  /* XS_CODE_AT_2 */ "at_2",
289
  /* XS_CODE_SUPER_AT */ "super_at",
290
  /* XS_CODE_SUPER_AT_2 */ "super_at_2",
291
  /* XS_CODE_TRANSFER_JSON */ "transfer_json",
292
};
293
294
const txS1 gxCodeSizes[XS_CODE_COUNT] ICACHE_FLASH_ATTR = {
295
  1 /* XS_NO_CODE */,
296
  1 /* XS_CODE_ADD */,
297
  2 /* XS_CODE_ARGUMENT */,
298
  2 /* XS_CODE_ARGUMENTS */,
299
  2 /* XS_CODE_ARGUMENTS_SLOPPY */,
300
  2 /* XS_CODE_ARGUMENTS_STRICT */,
301
  1 /* XS_CODE_ARRAY */,
302
  0 /* XS_CODE_ASYNC_FUNCTION */,
303
  0 /* XS_CODE_ASYNC_GENERATOR_FUNCTION */,
304
  1 /* XS_CODE_AT */,
305
  1 /* XS_CODE_AWAIT */,
306
  2 /* XS_CODE_BEGIN_SLOPPY */,
307
  2 /* XS_CODE_BEGIN_STRICT */,
308
  2 /* XS_CODE_BEGIN_STRICT_BASE */,
309
  2 /* XS_CODE_BEGIN_STRICT_DERIVED */,
310
  2 /* XS_CODE_BEGIN_STRICT_FIELD */,
311
  -1 /* XS_CODE_BIGINT_1 */,
312
  -2 /* XS_CODE_BIGINT_2 */,
313
  1 /* XS_CODE_BIT_AND */,
314
  1 /* XS_CODE_BIT_NOT */,
315
  1 /* XS_CODE_BIT_OR */,
316
  1 /* XS_CODE_BIT_XOR */,
317
  2 /* XS_CODE_BRANCH_1 */,
318
  3 /* XS_CODE_BRANCH_2 */,
319
  5 /* XS_CODE_BRANCH_4 */,
320
  2 /* XS_CODE_BRANCH_CHAIN_1 */,
321
  3 /* XS_CODE_BRANCH_CHAIN_2 */,
322
  5 /* XS_CODE_BRANCH_CHAIN_4 */,
323
  2 /* XS_CODE_BRANCH_COALESCE_1 */,
324
  3 /* XS_CODE_BRANCH_COALESCE_2 */,
325
  5 /* XS_CODE_BRANCH_COALESCE_4 */,
326
  2 /* XS_CODE_BRANCH_ELSE_1 */,
327
  3 /* XS_CODE_BRANCH_ELSE_2 */,
328
  5 /* XS_CODE_BRANCH_ELSE_4 */,
329
  2 /* XS_CODE_BRANCH_IF_1 */,
330
  3 /* XS_CODE_BRANCH_IF_2 */,
331
  5 /* XS_CODE_BRANCH_IF_4 */,
332
  2 /* XS_CODE_BRANCH_STATUS_1 */,
333
  3 /* XS_CODE_BRANCH_STATUS_2 */,
334
  5 /* XS_CODE_BRANCH_STATUS_4 */,
335
  1 /* XS_CODE_CALL */,
336
  2 /* XS_CODE_CATCH_1 */,
337
  3 /* XS_CODE_CATCH_2 */,
338
  5 /* XS_CODE_CATCH_4 */,
339
  1 /* XS_CODE_CLASS */,
340
  1 /* XS_CODE_CHECK_INSTANCE */,
341
  2 /* XS_CODE_CODE_1 */,
342
  3 /* XS_CODE_CODE_2 */,
343
  5 /* XS_CODE_CODE_4 */,
344
  2 /* XS_CODE_CODE_ARCHIVE_1 */,
345
  3 /* XS_CODE_CODE_ARCHIVE_2 */,
346
  5 /* XS_CODE_CODE_ARCHIVE_4 */,
347
  2 /* XS_CODE_CONST_CLOSURE_1 */,
348
  3 /* XS_CODE_CONST_CLOSURE_2 */,
349
  2 /* XS_CODE_CONST_LOCAL_1 */,
350
  3 /* XS_CODE_CONST_LOCAL_2 */,
351
  0 /* XS_CODE_CONSTRUCTOR_FUNCTION */,
352
  1 /* XS_CODE_COPY_OBJECT */,
353
  1 /* XS_CODE_CURRENT */,
354
  1 /* XS_CODE_DEBUGGER */,
355
  1 /* XS_CODE_DECREMENT */,
356
  0 /* XS_CODE_DELETE_PROPERTY */,
357
  1 /* XS_CODE_DELETE_PROPERTY_AT */,
358
  0 /* XS_CODE_DELETE_SUPER */,
359
  1 /* XS_CODE_DELETE_SUPER_AT */,
360
  1 /* XS_CODE_DIVIDE */,
361
  1 /* XS_CODE_DUB */,
362
  1 /* XS_CODE_DUB_AT */,
363
  1 /* XS_CODE_END */,
364
  1 /* XS_CODE_END_ARROW */,
365
  1 /* XS_CODE_END_BASE */,
366
  1 /* XS_CODE_END_DERIVED */,
367
  1 /* XS_CODE_ENVIRONMENT */,
368
  1 /* XS_CODE_EQUAL */,
369
  1 /* XS_CODE_EVAL */,
370
  1 /* XS_CODE_EVAL_ENVIRONMENT */,
371
  0 /* XS_CODE_EVAL_PRIVATE */,
372
  0 /* XS_CODE_EVAL_REFERENCE */,
373
  1 /* XS_CODE_EVAL_TAIL */,
374
  1 /* XS_CODE_EXCEPTION */,
375
  1 /* XS_CODE_EXPONENTIATION */,
376
  1 /* XS_CODE_EXTEND */,
377
  1 /* XS_CODE_FALSE */,
378
  0 /* XS_CODE_FILE */,
379
  1 /* XS_CODE_FOR_AWAIT_OF */,
380
  1 /* XS_CODE_FOR_IN */,
381
  1 /* XS_CODE_FOR_OF */,
382
  0 /* XS_CODE_FUNCTION */,
383
  1 /* XS_CODE_FUNCTION_ENVIRONMENT */,
384
  0 /* XS_CODE_GENERATOR_FUNCTION */,
385
  2 /* XS_CODE_GET_CLOSURE_1 */,
386
  3 /* XS_CODE_GET_CLOSURE_2 */,
387
  2 /* XS_CODE_GET_LOCAL_1 */,
388
  3 /* XS_CODE_GET_LOCAL_2 */,
389
  2 /* XS_CODE_GET_PRIVATE_1 */,
390
  3 /* XS_CODE_GET_PRIVATE_2 */,
391
  0 /* XS_CODE_GET_PROPERTY */,
392
  1 /* XS_CODE_GET_PROPERTY_AT */,
393
  1 /* XS_CODE_GET_RESULT */,
394
  0 /* XS_CODE_GET_SUPER */,
395
  1 /* XS_CODE_GET_SUPER_AT */,
396
  1 /* XS_CODE_GET_THIS */,
397
  0 /* XS_CODE_GET_THIS_VARIABLE */,
398
  0 /* XS_CODE_GET_VARIABLE */,
399
  1 /* XS_CODE_GLOBAL */,
400
  2 /* XS_CODE_HAS_PRIVATE_1 */,
401
  3 /* XS_CODE_HAS_PRIVATE_2 */,
402
  3 /* XS_CODE_HOST */,
403
  1 /* XS_CODE_IMPORT */,
404
  1 /* XS_CODE_IMPORT_META */,
405
  1 /* XS_CODE_IN */,
406
  1 /* XS_CODE_INCREMENT */,
407
  1 /* XS_CODE_INSTANCEOF */,
408
  1 /* XS_CODE_INSTANTIATE */,
409
  2 /* XS_CODE_INTEGER_1 */,
410
  3 /* XS_CODE_INTEGER_2 */,
411
  5 /* XS_CODE_INTEGER_4 */,
412
  1 /* XS_CODE_LEFT_SHIFT */,
413
  1 /* XS_CODE_LESS */,
414
  1 /* XS_CODE_LESS_EQUAL */,
415
  2 /* XS_CODE_LET_CLOSURE_1 */,
416
  3 /* XS_CODE_LET_CLOSURE_2 */,
417
  2 /* XS_CODE_LET_LOCAL_1 */,
418
  3 /* XS_CODE_LET_LOCAL_2 */,
419
  3 /* XS_CODE_LINE */,
420
  1 /* XS_CODE_MINUS */,
421
  2 /* XS_CODE_MODULE */,
422
  1 /* XS_CODE_MODULO */,
423
  1 /* XS_CODE_MORE */,
424
  1 /* XS_CODE_MORE_EQUAL */,
425
  1 /* XS_CODE_MULTIPLY */,
426
  0 /* XS_CODE_NAME */,
427
  1 /* XS_CODE_NEW */,
428
  0 /* XS_CODE_NEW_CLOSURE */,
429
  0 /* XS_CODE_NEW_LOCAL */,
430
  2 /* XS_CODE_NEW_PRIVATE_1 */,
431
  3 /* XS_CODE_NEW_PRIVATE_2 */,
432
  0 /* XS_CODE_NEW_PROPERTY */,
433
  1 /* XS_CODE_NEW_PROPERTY_AT */,
434
  1 /* XS_CODE_NEW_TEMPORARY */,
435
  1 /* XS_CODE_NOT */,
436
  1 /* XS_CODE_NOT_EQUAL */,
437
  1 /* XS_CODE_NULL */,
438
  9 /* XS_CODE_NUMBER */,
439
  1 /* XS_CODE_OBJECT */,
440
  1 /* XS_CODE_PLUS */,
441
  1 /* XS_CODE_POP */,
442
  1 /* XS_CODE_PROGRAM_ENVIRONMENT */,
443
  0 /* XS_CODE_PROGRAM_REFERENCE */,
444
  2 /* XS_CODE_PULL_CLOSURE_1 */,
445
  3 /* XS_CODE_PULL_CLOSURE_2 */,
446
  2 /* XS_CODE_PULL_LOCAL_1 */,
447
  3 /* XS_CODE_PULL_LOCAL_2 */,
448
  2 /* XS_CODE_REFRESH_CLOSURE_1 */,
449
  3 /* XS_CODE_REFRESH_CLOSURE_2 */,
450
  2 /* XS_CODE_REFRESH_LOCAL_1 */,
451
  3 /* XS_CODE_REFRESH_LOCAL_2 */,
452
  1 /* XS_CODE_REGEXP */,
453
  2 /* XS_CODE_RESERVE_1 */,
454
  3 /* XS_CODE_RESERVE_2 */,
455
  2 /* XS_CODE_RESET_CLOSURE_1 */,
456
  3 /* XS_CODE_RESET_CLOSURE_2 */,
457
  2 /* XS_CODE_RESET_LOCAL_1 */,
458
  3 /* XS_CODE_RESET_LOCAL_2 */,
459
  1 /* XS_CODE_RETHROW */,
460
  2 /* XS_CODE_RETRIEVE_1 */,
461
  3 /* XS_CODE_RETRIEVE_2 */,
462
  1 /* XS_CODE_RETRIEVE_TARGET */,
463
  1 /* XS_CODE_RETRIEVE_THIS */,
464
  1 /* XS_CODE_RETURN */,
465
  1 /* XS_CODE_RUN */,
466
  2 /* XS_CODE_RUN_1 */,
467
  3 /* XS_CODE_RUN_2 */,
468
  5 /* XS_CODE_RUN_4 */,
469
  1 /* XS_CODE_RUN_TAIL */,
470
  2 /* XS_CODE_RUN_TAIL_1 */,
471
  3 /* XS_CODE_RUN_TAIL_2 */,
472
  5 /* XS_CODE_RUN_TAIL_4 */,
473
  2 /* XS_CODE_SET_CLOSURE_1 */,
474
  3 /* XS_CODE_SET_CLOSURE_2 */,
475
  1 /* XS_CODE_SET_HOME */,
476
  2 /* XS_CODE_SET_LOCAL_1 */,
477
  3 /* XS_CODE_SET_LOCAL_2 */,
478
  2 /* XS_CODE_SET_PRIVATE_1 */,
479
  3 /* XS_CODE_SET_PRIVATE_2 */,
480
  0 /* XS_CODE_SET_PROPERTY */,
481
  1 /* XS_CODE_SET_PROPERTY_AT */,
482
  1 /* XS_CODE_SET_RESULT */,
483
  0 /* XS_CODE_SET_SUPER */,
484
  1 /* XS_CODE_SET_SUPER_AT */,
485
  1 /* XS_CODE_SET_THIS */,
486
  0 /* XS_CODE_SET_VARIABLE */,
487
  1 /* XS_CODE_SIGNED_RIGHT_SHIFT */,
488
  1 /* XS_CODE_START_ASYNC */,
489
  1 /* XS_CODE_START_ASYNC_GENERATOR */,
490
  1 /* XS_CODE_START_GENERATOR */,
491
  2 /* XS_CODE_STORE_1 */,
492
  3 /* XS_CODE_STORE_2 */,
493
  1 /* XS_CODE_STORE_ARROW */,
494
  1 /* XS_CODE_STRICT_EQUAL */,
495
  1 /* XS_CODE_STRICT_NOT_EQUAL */,
496
  -1 /* XS_CODE_STRING_1 */,
497
  -2 /* XS_CODE_STRING_2 */,
498
  -4 /* XS_CODE_STRING_4 */,
499
  -1 /* XS_CODE_STRING_ARCHIVE_1 */,
500
  -2 /* XS_CODE_STRING_ARCHIVE_2 */,
501
  -4 /* XS_CODE_STRING_ARCHIVE_4 */,
502
  1 /* XS_CODE_SUBTRACT */,
503
  1 /* XS_CODE_SUPER */,
504
  1 /* XS_CODE_SWAP */,
505
  0 /* XS_CODE_SYMBOL */,
506
  1 /* XS_CODE_TARGET */,
507
  1 /* XS_CODE_TEMPLATE */,
508
  1 /* XS_CODE_TEMPLATE_CACHE */,
509
  1 /* XS_CODE_THIS */,
510
  1 /* XS_CODE_THROW */,
511
  1 /* XS_CODE_THROW_STATUS */,
512
  1 /* XS_CODE_TO_INSTANCE */,
513
  1 /* XS_CODE_TO_NUMERIC */,
514
  1 /* XS_CODE_TO_STRING */,
515
  1 /* XS_CODE_TRANSFER */,
516
  1 /* XS_CODE_TRUE */,
517
  1 /* XS_CODE_TYPEOF */,
518
  1 /* XS_CODE_UNCATCH */,
519
  1 /* XS_CODE_UNDEFINED */,
520
  1 /* XS_CODE_UNSIGNED_RIGHT_SHIFT */,
521
  2 /* XS_CODE_UNWIND_1 */,
522
  3 /* XS_CODE_UNWIND_2 */,
523
  2 /* XS_CODE_VAR_CLOSURE_1 */,
524
  3 /* XS_CODE_VAR_CLOSURE_2 */,
525
  2 /* XS_CODE_VAR_LOCAL_1 */,
526
  3 /* XS_CODE_VAR_LOCAL_2 */,
527
  1 /* XS_CODE_VOID */,
528
  1 /* XS_CODE_WITH */,
529
  1 /* XS_CODE_WITHOUT */,
530
  1 /* XS_CODE_YIELD */,
531
#ifdef mx32bitID
532
  5 /* XS_CODE_PROFILE */,
533
#else
534
  3 /* XS_CODE_PROFILE */,
535
#endif
536
  1 /* XS_CODE_YIELD_STAR */,
537
// mxExplicitResourceManagement 
538
  2 /* XS_CODE_USED_1 */,
539
  3 /* XS_CODE_USED_2 */,
540
  1 /* XS_CODE_USING */,
541
  1 /* XS_CODE_USING_ASYNC */,
542
  1 /* XS_CODE_AT_2 */,
543
  1 /* XS_CODE_SUPER_AT */,
544
  1 /* XS_CODE_SUPER_AT_2 */,
545
  1 /* XS_CODE_TRANSFER_JSON */,
546
};
547
548
#if mxUseDefaultCStackLimit
549
550
#ifdef __ets__
551
  #if ESP32
552
    #include "freertos/task.h"
553
  #else
554
    #include "cont.h"
555
  #endif
556
#endif
557
558
#ifndef mxASANStackMargin
559
  #define mxASANStackMargin 0
560
#endif
561
562
#if mxWindows
563
ULONG GetCurrentThreadStackLimits_Win7( _Out_ PULONG_PTR LowLimit, _Out_ PULONG_PTR HighLimit )
564
{
565
    static void (WINAPI* GetCurrentThreadStackLimits)(PULONG_PTR , PULONG_PTR);
566
567
    if (!GetCurrentThreadStackLimits)
568
    {
569
        *(void**)&GetCurrentThreadStackLimits = GetProcAddress(GetModuleHandle("kernel32"), "GetCurrentThreadStackLimits");
570
571
        if (!GetCurrentThreadStackLimits)
572
        {
573
            NT_TIB* tib = (NT_TIB*)NtCurrentTeb();
574
            *HighLimit = (ULONG_PTR)tib->StackBase;
575
576
            MEMORY_BASIC_INFORMATION mbi;
577
            if (VirtualQuery(tib->StackLimit, &mbi, sizeof(mbi)))
578
            {
579
                *LowLimit = (ULONG_PTR)mbi.AllocationBase;
580
                return 0;
581
            }
582
583
            return GetLastError();
584
        }
585
    }
586
587
    GetCurrentThreadStackLimits(LowLimit, HighLimit);
588
    return 0;
589
}
590
#endif
591
592
char* fxCStackLimit()
593
773k
{
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
773k
    char* result = C_NULL;
605
773k
    pthread_attr_t attrs;
606
773k
    pthread_attr_init(&attrs);
607
773k
    if (pthread_getattr_np(pthread_self(), &attrs) == 0) {
608
773k
        void* stackAddr;
609
773k
        size_t stackSize;
610
773k
      if (pthread_attr_getstack(&attrs, &stackAddr, &stackSize) == 0) {
611
773k
        result = (char*)stackAddr + (128 * 1024) + mxASANStackMargin;
612
773k
      }
613
773k
    }
614
773k
    pthread_attr_destroy(&attrs);
615
773k
    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
773k
}
627
628
#endif
629
630
void fxDeleteScript(txScript* script)
631
274k
{
632
274k
  if (script) {
633
250k
    if (script->symbolsBuffer)
634
250k
      c_free(script->symbolsBuffer);
635
250k
    if (script->hostsBuffer)
636
0
      c_free(script->hostsBuffer);
637
250k
    if (script->codeBuffer)
638
250k
      c_free(script->codeBuffer);
639
250k
    c_free(script);
640
250k
  }
641
274k
}
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
2.22M
{
659
2.22M
  #define mxIdentifierFirstCount 1358
660
2.22M
  static const txU2 gxIdentifierFirstTable[mxIdentifierFirstCount] ICACHE_RODATA_ATTR = {
661
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    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
2.22M
    7,221,3,5761,15,7472,16,621,2467,541,1507,4938,6,4191,
704
2.22M
  };
705
2.22M
  const txU2* p = gxIdentifierFirstTable;
706
2.22M
  const txU2* q = p + mxIdentifierFirstCount;
707
2.22M
  txU4 s = 0;
708
18.7M
  while (p < q) {
709
18.7M
    s += c_read16(p++);
710
18.7M
    if (c < s)
711
367k
      return 0;
712
18.3M
    s += c_read16(p++);
713
18.3M
    if (c <= s)
714
1.85M
      return 1;
715
18.3M
  }
716
2.33k
  return 0;
717
2.22M
}
718
719
txBoolean fxIsIdentifierNext(txU4 c)
720
9.22M
{
721
9.22M
  #define mxIdentifierNextCount 1586
722
9.22M
  static const txU2 gxIdentifierNextTable[mxIdentifierNextCount] ICACHE_RODATA_ATTR = {
723
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    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
9.22M
    1031,42719,33,4153,7,221,3,5761,15,7472,16,621,2467,541,1507,4938,6,4191,
773
9.22M
  };
774
9.22M
  const txU2* p = gxIdentifierNextTable;
775
9.22M
  const txU2* q = p + mxIdentifierNextCount;
776
9.22M
  txU4 s = 0;
777
57.3M
  while (p < q) {
778
57.3M
    s += c_read16(p++);
779
57.3M
    if (c < s)
780
1.83M
      return 0;
781
55.4M
    s += c_read16(p++);
782
55.4M
    if (c <= s)
783
7.38M
      return 1;
784
55.4M
  }
785
11.8k
  s += 712017;
786
11.8k
  if (c < s)
787
241
    return 0;
788
11.5k
  s += 239;
789
11.5k
  if (c <= s)
790
1
    return 1;
791
11.5k
  return 0;
792
11.5k
}
793
794
txBoolean fxIsSpace(txInteger character)
795
26.0M
{
796
26.0M
  static const txU4 spaces[27] ICACHE_RODATA_ATTR = {
797
26.0M
    0x00000009,
798
26.0M
        0x0000000A,
799
26.0M
        0x0000000B,
800
26.0M
        0x0000000C,
801
26.0M
        0x0000000D,
802
26.0M
    0x00000020,
803
26.0M
    0x000000A0,
804
26.0M
    0x00001680,
805
26.0M
    0x00002000,
806
26.0M
    0x00002001,
807
26.0M
    0x00002002,
808
26.0M
    0x00002003,
809
26.0M
    0x00002004,
810
26.0M
    0x00002005,
811
26.0M
    0x00002006,
812
26.0M
    0x00002007,
813
26.0M
    0x00002008,
814
26.0M
    0x00002009,
815
26.0M
    0x0000200A,
816
26.0M
    0x00002028,
817
26.0M
    0x00002029,
818
26.0M
    0x0000202F,
819
26.0M
    0x0000205F,
820
26.0M
    0x00003000,
821
26.0M
    0x0000FEFF,
822
26.0M
    0xFFFFFFFF,
823
26.0M
    0x00000000,
824
26.0M
  };
825
26.0M
  const txU4 *p = spaces;
826
26.0M
  txU4 c = (txU4)character;
827
26.0M
  txU4 s;
828
197M
  while ((s = *p++)) {
829
197M
    if (c < s)
830
25.8M
      return 0;
831
171M
    if (c == s)
832
201k
      return 1;
833
171M
  }
834
0
  return 0;
835
26.0M
}
836
837
txBoolean fxParseHex(txU1 c, txU4* value)
838
2.88M
{
839
2.88M
  if (('0' <= c) && (c <= '9'))
840
1.31M
    *value = (*value * 16) + (c - '0');
841
1.56M
  else if (('a' <= c) && (c <= 'f'))
842
528k
    *value = (*value * 16) + (10 + c - 'a');
843
1.03M
  else if (('A' <= c) && (c <= 'F'))
844
791k
    *value = (*value * 16) + (10 + c - 'A');
845
244k
  else
846
244k
    return 0;
847
2.63M
  return 1;
848
2.88M
}
849
850
txBoolean fxParseHexEscape(txString* string, txInteger* character)
851
1.36M
{
852
1.36M
  txU1* p = *((txU1**)string);
853
1.36M
  txU4 value = 0;
854
1.36M
  txU1 i, c;
855
3.74M
  for (i = 0; i < 2; i++) {
856
2.60M
    c = c_read8(p);
857
2.60M
    if (!fxParseHex(c, &value))
858
220k
      return 0;
859
2.37M
    p++;
860
2.37M
  }
861
1.14M
  *character = (txInteger)value;
862
1.14M
  *string = (txString)p;
863
1.14M
  return 1;
864
1.36M
}
865
866
txBoolean fxParseUnicodeEscape(txString* string, txInteger* character, txInteger braces, txInteger separator)
867
69.2k
{
868
69.2k
  txU1* p = *((txU1**)string);
869
69.2k
  txU4 value = 0;
870
69.2k
  txU1 c;
871
69.2k
  txInteger i;
872
  
873
69.2k
  c = c_read8(p++);
874
69.2k
  if (braces && (c == '{')) {
875
2.89k
    c = c_read8(p++);
876
13.0k
    for (i = 0; value < 0x00110000; i++) {
877
12.5k
      if (fxParseHex(c, &value)) {
878
10.1k
        c = c_read8(p++);
879
10.1k
      }
880
2.31k
      else
881
2.31k
        break;
882
12.5k
    }
883
2.89k
    if ((c == '}') && (i > 0) && (value < 0x00110000)) {
884
1.43k
      *character = (txInteger)value;
885
1.43k
      *string = (txString)p;
886
1.43k
      return 1;
887
1.43k
    }
888
1.45k
    return 0;
889
2.89k
  }
890
66.3k
  if (!fxParseHex(c, &value)) return 0;
891
58.8k
  c = c_read8(p++);
892
58.8k
  if (!fxParseHex(c, &value)) return 0;
893
52.9k
  c = c_read8(p++);
894
52.9k
  if (!fxParseHex(c, &value)) return 0;
895
48.0k
  c = c_read8(p++);
896
48.0k
  if (!fxParseHex(c, &value)) return 0;
897
46.5k
  *character = (txInteger)value;
898
46.5k
  *string = (txString)p;
899
46.5k
  c = c_read8(p++);
900
46.5k
  if (c && (c == separator) && (0x0000D800 <= value) && (value <= 0x0000DBFF)) {
901
12.2k
    c = c_read8(p++);
902
12.2k
    if (c == 'u') {
903
11.7k
      txU4 other = 0;
904
11.7k
      c = c_read8(p++);
905
11.7k
      if (!fxParseHex(c, &other)) return 1;
906
11.5k
      c = c_read8(p++);
907
11.5k
      if (!fxParseHex(c, &other)) return 1;
908
10.8k
      c = c_read8(p++);
909
10.8k
      if (!fxParseHex(c, &other)) return 1;
910
10.6k
      c = c_read8(p++);
911
10.6k
      if (!fxParseHex(c, &other)) return 1;
912
10.3k
      if ((0x0000DC00 <= other) && (other <= 0x0000DFFF)) {
913
7.83k
        *character = (txInteger)(0x00010000 + ((value & 0x03FF) << 10) + (other & 0x03FF));
914
7.83k
        *string = (txString)p;
915
7.83k
      }
916
10.3k
    }
917
12.2k
  }
918
45.1k
  return 1;
919
46.5k
}
920
921
txString fxSkipSpaces(txString string) 
922
33.5M
{
923
33.5M
  txString p = string;
924
33.5M
  txString q = p;
925
33.5M
  txInteger c;
926
33.7M
  while (((q = fxUTF8Decode(q, &c))) && (c != C_EOF)) {
927
26.0M
    if (fxIsSpace(c))
928
201k
      p = q;
929
25.8M
    else
930
25.8M
      break;
931
26.0M
  }
932
33.5M
  return p;
933
33.5M
}
934
935
txString fxStringifyHexEscape(txString string, txInteger character)
936
765k
{
937
765k
  const char* digits = gxHexUpper;
938
765k
  txU1* p = (txU1*)string;
939
765k
  *p++ = c_read8(digits + ((character & 0x000000F0) >> 4));
940
765k
  *p++ = c_read8(digits + (character & 0x0000000F));
941
765k
  return (txString)p;
942
765k
}
943
944
txString fxStringifyUnicodeEscape(txString string, txInteger character, txInteger separator)
945
3.56M
{
946
3.56M
  const char* digits = (separator == '%') ? gxHexUpper : gxHexLower;
947
3.56M
  txU1* p = (txU1*)string;
948
3.56M
  txInteger surrogate;
949
3.56M
  if (character > 0xFFFF) {
950
19
    character -= 0x10000;
951
19
    surrogate = 0xDC00 | (character & 0x3FF);
952
19
    character = 0xD800 | (character >> 10);
953
19
  }
954
3.56M
  else
955
3.56M
    surrogate = 0;
956
3.56M
  *p++ = c_read8(digits + ((character & 0x0000F000) >> 12));
957
3.56M
  *p++ = c_read8(digits + ((character & 0x00000F00) >> 8));
958
3.56M
  *p++ = c_read8(digits + ((character & 0x000000F0) >> 4));
959
3.56M
  *p++ = c_read8(digits + (character & 0x0000000F));
960
3.56M
  if (surrogate) {
961
19
    *p++ = separator;
962
19
    *p++ = 'u';
963
19
    *p++ = c_read8(digits + ((surrogate & 0x0000F000) >> 12));
964
19
    *p++ = c_read8(digits + ((surrogate & 0x00000F00) >> 8));
965
19
    *p++ = c_read8(digits + ((surrogate & 0x000000F0) >> 4));
966
19
    *p++ = c_read8(digits + (surrogate & 0x0000000F));
967
19
  }
968
3.56M
  return (txString)p;
969
3.56M
}
970
971
int fxUTF8Compare(txString p1, txString p2)
972
422k
{
973
422k
  register const unsigned char *s1 = (const unsigned char *) p1;
974
422k
  register const unsigned char *s2 = (const unsigned char *) p2;
975
422k
  unsigned char c1, c2;
976
1.88M
  do {
977
1.88M
    c1 = (unsigned char) *s1++;
978
1.88M
    c2 = (unsigned char) *s2++;
979
1.88M
    if (c1 == '\0')
980
158k
      return c1 - c2;
981
1.88M
  }
982
1.72M
  while (c1 == c2);
983
263k
  if (c2 == '\0')
984
60.3k
    return c1 - c2;
985
203k
  if ((c1 == 0xC0) && (*s1 == 0x80))
986
13
    return 0 - c2;
987
203k
  if ((c2 == 0xC0) && (*s2 == 0x80))
988
247
    return c1 - 0;
989
203k
  return c1 - c2;
990
203k
}
991
992
txString fxUTF8Decode(txString string, txInteger* character)
993
313M
{
994
313M
  txU1* p = (txU1*)string;
995
313M
  txU4 c = c_read8(p++);
996
313M
  if (c) {
997
279M
    if (c & 0x80) {
998
83.9M
      const txUTF8Sequence *sequence;
999
83.9M
      txS4 size;
1000
233M
      for (sequence = gxUTF8Sequences; sequence->size; sequence++) {
1001
233M
        if ((c & sequence->cmask) == sequence->cval)
1002
83.9M
          break;
1003
233M
      }
1004
83.9M
      size = sequence->size - 1;
1005
233M
      while (size > 0) {
1006
149M
        size--;
1007
149M
        c = (c << 6) | (c_read8(p++) & 0x3F);
1008
149M
      }
1009
83.9M
      c &= sequence->lmask;
1010
83.9M
    }
1011
279M
    *character = (txInteger)c;
1012
279M
    return (txString)p;
1013
279M
  }
1014
34.0M
  *character = C_EOF;
1015
34.0M
  return (txString)p;
1016
313M
}
1017
1018
txString fxUTF8Encode(txString string, txInteger character)
1019
3.82M
{
1020
3.82M
  txU1* p = (txU1*)string;
1021
3.82M
  if (character < 0) {
1022
0
  }
1023
3.82M
  else if (character == 0) {
1024
487k
    *p++ = 0xC0;
1025
487k
    *p++ = 0x80;
1026
487k
  }
1027
3.34M
  else if (character < 0x80) {
1028
1.81M
    *p++ = (txU1)character;
1029
1.81M
  }
1030
1.52M
  else if (character < 0x800) {
1031
18.4k
    *p++ = (txU1)(0xC0 | (((txU4)character) >> 6));
1032
18.4k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1033
18.4k
  }
1034
1.51M
  else if (character < 0x10000) {
1035
1.50M
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1036
1.50M
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1037
1.50M
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1038
1.50M
  }
1039
2.17k
  else if (character < 0x110000) {
1040
2.17k
    *p++ = (txU1)(0xF0 | (((txU4)character) >> 18));
1041
2.17k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 12) & 0x3F));
1042
2.17k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1043
2.17k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1044
2.17k
  }
1045
3.82M
  return (txString)p;
1046
3.82M
}
1047
1048
txSize fxUTF8Length(txInteger character)
1049
7.55M
{
1050
7.55M
  txSize length;
1051
7.55M
  if (character < 0)
1052
0
    length = 0;
1053
7.55M
  else if (character == 0)
1054
975k
    length = 2;
1055
6.57M
  else if (character < 0x80)
1056
3.62M
    length = 1;
1057
2.95M
  else if (character < 0x800)
1058
36.8k
    length = 2;
1059
2.91M
  else if (character < 0x10000)
1060
2.91M
    length = 3;
1061
3.49k
  else if (character < 0x110000)
1062
3.49k
    length = 4;
1063
0
  else
1064
0
    length = 0;
1065
7.55M
  return length;
1066
7.55M
}
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
225M
{
1086
225M
  txInteger result;
1087
225M
  string = fxUTF8Decode(string, &result);
1088
225M
  if ((0x0000D800 <= result) && (result <= 0x0000DBFF)) {
1089
639k
    txString former = string;
1090
639k
    txInteger surrogate;
1091
639k
    string = fxUTF8Decode(former, &surrogate);
1092
639k
    if ((0x0000DC00 <= surrogate) && (surrogate <= 0x0000DFFF))
1093
273k
      result = 0x00010000 + ((result & 0x000003FF) << 10) + (surrogate & 0x000003FF);
1094
366k
    else
1095
366k
      string = former;
1096
639k
  }
1097
225M
  *character = result;
1098
225M
  return string;
1099
225M
}
1100
1101
txString fxCESU8Encode(txString string, txInteger character)
1102
77.9M
{
1103
77.9M
  txU1* p = (txU1*)string;
1104
77.9M
  if (character < 0) {
1105
24
  }
1106
77.9M
  else if (character == 0) {
1107
2.10M
    *p++ = 0xC0;
1108
2.10M
    *p++ = 0x80;
1109
2.10M
  }
1110
75.8M
  else if (character < 0x80) {
1111
52.6M
    *p++ = (txU1)character;
1112
52.6M
  }
1113
23.1M
  else if (character < 0x800) {
1114
807k
    *p++ = (txU1)(0xC0 | (((txU4)character) >> 6));
1115
807k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1116
807k
  }
1117
22.3M
  else if (character < 0x10000) {
1118
22.1M
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1119
22.1M
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1120
22.1M
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1121
22.1M
  }
1122
192k
  else if (character < 0x110000) {
1123
192k
    txInteger surrogate;
1124
192k
    character -= 0x00010000;
1125
192k
    surrogate = 0xDC00 | (character & 0x3FF);
1126
192k
    character = 0xD800 | ((character >> 10) & 0x3FF);
1127
192k
    *p++ = (txU1)(0xE0 | (((txU4)character) >> 12));
1128
192k
    *p++ = (txU1)(0x80 | ((((txU4)character) >> 6) & 0x3F));
1129
192k
    *p++ = (txU1)(0x80 | (((txU4)character) & 0x3F));
1130
192k
    *p++ = (txU1)(0xE0 | (((txU4)surrogate) >> 12));
1131
192k
    *p++ = (txU1)(0x80 | ((((txU4)surrogate) >> 6) & 0x3F));
1132
192k
    *p++ = (txU1)(0x80 | (((txU4)surrogate) & 0x3F));
1133
192k
  }
1134
77.9M
  return (txString)p;
1135
77.9M
}
1136
1137
txSize fxCESU8Length(txInteger character)
1138
145M
{
1139
145M
  txSize length;
1140
145M
  if (character < 0)
1141
24
    length = 0;
1142
145M
  else if (character == 0)
1143
2.10M
    length = 2;
1144
143M
  else if (character < 0x80)
1145
116M
    length = 1;
1146
26.4M
  else if (character < 0x800)
1147
808k
    length = 2;
1148
25.6M
  else if (character < 0x10000)
1149
25.4M
    length = 3;
1150
205k
  else if (character < 0x110000)
1151
205k
    length = 6;
1152
15
  else
1153
15
    length = 0;
1154
145M
  return length;
1155
145M
}
1156
#endif
1157
1158
txSize fxUTF8ToUnicodeOffset(txString theString, txSize theOffset)
1159
392k
{
1160
392k
  txU1* p = (txU1*)theString;
1161
392k
  txU1 c;
1162
392k
  txSize unicodeOffset = 0;
1163
392k
  txSize utf8Offset = 0;
1164
  
1165
5.18M
  while ((c = c_read8(p++))) {
1166
5.13M
    if ((c & 0xC0) != 0x80) {
1167
3.32M
      if (utf8Offset == theOffset)
1168
343k
        return unicodeOffset;
1169
2.98M
      unicodeOffset++;
1170
2.98M
    }
1171
4.79M
    utf8Offset++;
1172
4.79M
  }
1173
49.5k
  if (utf8Offset == theOffset)
1174
47.8k
    return unicodeOffset;
1175
1.72k
  else
1176
1.72k
    return -1;
1177
49.5k
}
1178
1179
#if 1
1180
txSize fxUnicodeLength(txString theString, txSize* byteLength)
1181
3.91M
{
1182
3.91M
  txU1* p = (txU1*)theString;
1183
3.91M
  txU1 c;
1184
3.91M
  txSize unicodeLength = 0;
1185
3.91M
  txSize utf8Length = 0;
1186
  
1187
1.08G
  while ((c = c_read8(p++))) {
1188
1.07G
    if ((c & 0xC0) != 0x80)
1189
606M
      unicodeLength++;
1190
1.07G
    utf8Length++;
1191
1.07G
  }
1192
3.91M
  if (byteLength)
1193
1.63M
    *byteLength = utf8Length;
1194
3.91M
  return unicodeLength;
1195
3.91M
}
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
32.6M
{
1258
32.6M
  txU1* p = (txU1*)theString;
1259
32.6M
  txU1 c;
1260
32.6M
  txSize unicodeOffset = 0;
1261
32.6M
  txSize utf8Offset = 0;
1262
  
1263
95.8M
    while ((c = c_read8(p++))) {
1264
95.0M
    if ((c & 0xC0) != 0x80) {
1265
69.2M
      if (unicodeOffset == theOffset)
1266
31.8M
        return utf8Offset;
1267
37.3M
      unicodeOffset++;
1268
37.3M
    }
1269
63.1M
        utf8Offset++;
1270
63.1M
  }
1271
784k
  if (unicodeOffset == theOffset)
1272
713k
    return utf8Offset;
1273
70.8k
  else
1274
70.8k
    return -1;
1275
784k
}
1276
1277
txFlag fxIntegerToIndex(void* the, txInteger theInteger, txIndex* theIndex)
1278
12.8M
{
1279
12.8M
  if (0 <= theInteger) {
1280
12.8M
    *theIndex = (txIndex)theInteger;
1281
12.8M
    return 1;
1282
12.8M
  }
1283
66.4k
  return 0;
1284
12.8M
}
1285
1286
txFlag fxNumberToIndex(void* the, txNumber number, txIndex* theIndex)
1287
18.4M
{
1288
18.4M
  txIndex integer = (txIndex)number;
1289
18.4M
  txNumber check = integer;
1290
18.4M
  if ((number == check) && (integer < 4294967295u)) {
1291
17.2M
    *theIndex = integer;
1292
17.2M
    return 1;
1293
17.2M
  }
1294
1.16M
  return 0;
1295
18.4M
}
1296
1297
txFlag fxStringToIndex(void* the, txString theString, txIndex* theIndex)
1298
4.81M
{
1299
4.81M
  char buffer[256], c;
1300
4.81M
  txNumber number;
1301
4.81M
  txIndex integer;
1302
4.81M
  txNumber check;
1303
1304
4.81M
  c = c_read8(theString);
1305
4.81M
  if (('+' != c) && ('-' != c) && ('.' != c) && !(('0' <= c) && ('9' >= c)))
1306
879k
    return 0;
1307
3.93M
  number = fxStringToNumber(the, theString, 1);
1308
3.93M
  integer = (txIndex)number;
1309
3.93M
  check = integer;
1310
3.93M
  if ((number == check) && (integer < 4294967295u)) {
1311
2.62M
    fxNumberToString(the, number, buffer, sizeof(buffer), 0, 0);
1312
2.62M
    if (!c_strcmp(theString, buffer)) {
1313
2.58M
      *theIndex = integer;
1314
2.58M
      return 1;
1315
2.58M
    }
1316
2.62M
  }
1317
1.34M
  return 0;
1318
3.93M
}
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
};