jseption 0.0.0-stage → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +191 -2
  3. package/dist/atoms.d.ts +255 -0
  4. package/dist/atoms.js +445 -0
  5. package/dist/atoms.js.map +1 -0
  6. package/dist/builtins/array.d.ts +3 -0
  7. package/dist/builtins/array.js +116 -0
  8. package/dist/builtins/array.js.map +1 -0
  9. package/dist/builtins/bigint.d.ts +3 -0
  10. package/dist/builtins/bigint.js +122 -0
  11. package/dist/builtins/bigint.js.map +1 -0
  12. package/dist/builtins/boolean.d.ts +2 -0
  13. package/dist/builtins/boolean.js +26 -0
  14. package/dist/builtins/boolean.js.map +1 -0
  15. package/dist/builtins/date.d.ts +3 -0
  16. package/dist/builtins/date.js +1046 -0
  17. package/dist/builtins/date.js.map +1 -0
  18. package/dist/builtins/error.d.ts +2 -0
  19. package/dist/builtins/error.js +154 -0
  20. package/dist/builtins/error.js.map +1 -0
  21. package/dist/builtins/function.d.ts +5 -0
  22. package/dist/builtins/function.js +164 -0
  23. package/dist/builtins/function.js.map +1 -0
  24. package/dist/builtins/global.d.ts +2 -0
  25. package/dist/builtins/global.js +29 -0
  26. package/dist/builtins/global.js.map +1 -0
  27. package/dist/builtins/index.d.ts +3 -0
  28. package/dist/builtins/index.js +139 -0
  29. package/dist/builtins/index.js.map +1 -0
  30. package/dist/builtins/json.d.ts +6 -0
  31. package/dist/builtins/json.js +984 -0
  32. package/dist/builtins/json.js.map +1 -0
  33. package/dist/builtins/mapset.d.ts +4 -0
  34. package/dist/builtins/mapset.js +234 -0
  35. package/dist/builtins/mapset.js.map +1 -0
  36. package/dist/builtins/math.d.ts +2 -0
  37. package/dist/builtins/math.js +62 -0
  38. package/dist/builtins/math.js.map +1 -0
  39. package/dist/builtins/native.d.ts +22 -0
  40. package/dist/builtins/native.js +250 -0
  41. package/dist/builtins/native.js.map +1 -0
  42. package/dist/builtins/number.d.ts +4 -0
  43. package/dist/builtins/number.js +76 -0
  44. package/dist/builtins/number.js.map +1 -0
  45. package/dist/builtins/object.d.ts +12 -0
  46. package/dist/builtins/object.js +575 -0
  47. package/dist/builtins/object.js.map +1 -0
  48. package/dist/builtins/promise.d.ts +13 -0
  49. package/dist/builtins/promise.js +582 -0
  50. package/dist/builtins/promise.js.map +1 -0
  51. package/dist/builtins/proxy.d.ts +3 -0
  52. package/dist/builtins/proxy.js +226 -0
  53. package/dist/builtins/proxy.js.map +1 -0
  54. package/dist/builtins/reflect.d.ts +2 -0
  55. package/dist/builtins/reflect.js +109 -0
  56. package/dist/builtins/reflect.js.map +1 -0
  57. package/dist/builtins/regexp.d.ts +2 -0
  58. package/dist/builtins/regexp.js +203 -0
  59. package/dist/builtins/regexp.js.map +1 -0
  60. package/dist/builtins/string.d.ts +4 -0
  61. package/dist/builtins/string.js +135 -0
  62. package/dist/builtins/string.js.map +1 -0
  63. package/dist/builtins/symbol.d.ts +3 -0
  64. package/dist/builtins/symbol.js +98 -0
  65. package/dist/builtins/symbol.js.map +1 -0
  66. package/dist/builtins/typedarray.d.ts +15 -0
  67. package/dist/builtins/typedarray.js +1838 -0
  68. package/dist/builtins/typedarray.js.map +1 -0
  69. package/dist/builtins/weakref.d.ts +18 -0
  70. package/dist/builtins/weakref.js +130 -0
  71. package/dist/builtins/weakref.js.map +1 -0
  72. package/dist/dump.d.ts +2 -0
  73. package/dist/dump.js +124 -0
  74. package/dist/dump.js.map +1 -0
  75. package/dist/embed.d.ts +18 -0
  76. package/dist/embed.js +286 -0
  77. package/dist/embed.js.map +1 -0
  78. package/dist/interpreter.d.ts +81 -0
  79. package/dist/interpreter.js +3768 -0
  80. package/dist/interpreter.js.map +1 -0
  81. package/dist/jit.d.ts +59 -0
  82. package/dist/jit.js +3440 -0
  83. package/dist/jit.js.map +1 -0
  84. package/dist/jit_hook.d.ts +21 -0
  85. package/dist/jit_hook.js +4 -0
  86. package/dist/jit_hook.js.map +1 -0
  87. package/dist/jit_runtime.d.ts +104 -0
  88. package/dist/jit_runtime.js +721 -0
  89. package/dist/jit_runtime.js.map +1 -0
  90. package/dist/jit_stack.d.ts +24 -0
  91. package/dist/jit_stack.js +227 -0
  92. package/dist/jit_stack.js.map +1 -0
  93. package/dist/jseption.d.ts +15 -0
  94. package/dist/jseption.js +61 -0
  95. package/dist/jseption.js.map +1 -0
  96. package/dist/opcodes.d.ts +347 -0
  97. package/dist/opcodes.js +322 -0
  98. package/dist/opcodes.js.map +1 -0
  99. package/dist/parser.d.ts +283 -0
  100. package/dist/parser.js +9752 -0
  101. package/dist/parser.js.map +1 -0
  102. package/dist/qjs.d.ts +2 -0
  103. package/dist/qjs.js +122 -0
  104. package/dist/qjs.js.map +1 -0
  105. package/dist/quickjs.d.ts +460 -0
  106. package/dist/quickjs.js +3408 -0
  107. package/dist/quickjs.js.map +1 -0
  108. package/dist/std.d.ts +4 -0
  109. package/dist/std.js +273 -0
  110. package/dist/std.js.map +1 -0
  111. package/dist/values.d.ts +447 -0
  112. package/dist/values.js +461 -0
  113. package/dist/values.js.map +1 -0
  114. package/package.json +59 -4
@@ -0,0 +1,3768 @@
1
+ /*
2
+ * jseption: TypeScript port of QuickJS
3
+ *
4
+ * Port of the bytecode interpreter of quickjs.c: JS_CallInternal, closures,
5
+ * variable references, the arguments objects, private fields/brands,
6
+ * class definition, generators, async functions and async generators.
7
+ */
8
+ import { jit_hooks, JIT_NOT_COMPILED } from "./jit_hook.js";
9
+ import { JS_EXCEPTION, JS_UNINITIALIZED, JS_IsException, JS_IsUndefined, JS_IsObject, JS_IsUninitialized, JS_IsCatchOffset, JS_NewCatchOffset, JSFunctionData, JSVarRef, JSStackFrame, EMPTY_VAR_REFS, JSAsyncFunctionState, JSGeneratorData, JS_CALL_FLAG_CONSTRUCTOR, JS_CALL_FLAG_COPY_ARGV, JS_CALL_FLAG_GENERATOR, JS_MODE_STRICT, JS_MODE_ASYNC, JS_PROP_CONFIGURABLE, JS_PROP_WRITABLE, JS_PROP_ENUMERABLE, JS_PROP_C_W_E, JS_PROP_THROW, JS_PROP_THROW_STRICT, JS_PROP_HAS_GET, JS_PROP_HAS_SET, JS_PROP_HAS_VALUE, JS_PROP_HAS_WRITABLE, JS_PROP_HAS_CONFIGURABLE, JS_PROP_HAS_ENUMERABLE, JS_EVAL_TYPE_DIRECT, JS_EVAL_FLAG_STRICT, js_meta, js_get_meta, js_new_host_function, js_take_exception, js_call_host_function, js_call_c_function, js_c_function_data_call, JS_GetFunctionData, js_privates, JS_AtomToKey, js_host_exception_to_guest, JS_ATOM_NULL, JS_ATOM_length, JS_ATOM_name, JS_ATOM_prototype, JS_ATOM_constructor, JS_ATOM_callee, JS_ATOM_Symbol_iterator, JS_ATOM_Symbol_unscopables, JS_ATOM_Private_brand, JS_ATOM_brand, JS_ATOM_empty_string, JS_ATOM_next, JS_ATOM_return, JS_ATOM_throw, JS_ATOM_undefined, JS_ATOM_function, JS_ATOM_TYPE_PRIVATE, JS_ATOM_Symbol_toStringTag, hooks, JS_Throw, JS_GetException, JS_ThrowTypeError, JS_ThrowTypeErrorAtom, JS_ThrowTypeErrorNotAnObject, JS_ThrowTypeErrorNotASymbol, JS_ThrowReferenceError, JS_ThrowReferenceErrorNotDefined, JS_ThrowReferenceErrorUninitialized, JS_ThrowReferenceErrorUninitialized2, JS_ThrowSyntaxErrorAtom, JS_ThrowInternalError, JS_ThrowStackOverflow, JS_ThrowTypeErrorReadOnly, JS_IsUncatchableError, JS_SetUncatchableError, build_backtrace, is_strict_mode, JS_NewObject, JS_NewObjectProto, JS_NewObjectProtoClass, JS_NewObjectClass, JS_NewArray, JS_NewSymbolFromAtom, JS_AtomToValue, JS_AtomToString, JS_ValueToAtom, JS_NewCFunctionData, JS_GetProperty, JS_GetPropertyInternal, JS_GetPropertyValue, JS_SetPropertyInternal, JS_SetPropertyValue, JS_HasProperty, JS_DefineProperty, JS_DefinePropertyValue, JS_DefinePropertyValueValue, JS_DefinePropertyValueUint32, JS_DeleteProperty, JS_GetPrototype, JS_SetPrototypeInternal, JS_IsFunction, JS_IsConstructor, JS_CheckGlobalVar, JS_GetGlobalVar, JS_SetGlobalVar, JS_GetGlobalVarRef, JS_DefineGlobalVar, JS_CheckDefineGlobalVar, JS_DefineGlobalFunction, JS_CopyDataProperties, JS_Call, JS_CallFree, JS_CallConstructorInternal, JS_CallConstructor2, js_create_from_ctor, JS_GetOpaque, JS_SetOpaque, JS_ToBoolFree, JS_ToObject, JS_ToPropertyKey, JS_ToNumericFree, js_add_slow, js_binary_arith_slow, js_unary_arith_slow, js_relational_op, js_loose_eq, js_strict_eq2, JS_IsInstanceOf, js_operator_typeof, js_operator_in, JS_GetIterator, JS_IteratorNext, JS_IteratorClose, JS_IteratorGetCompleteValue, build_arg_list, build_for_in_iterator, js_for_in_next, js_create_iterator_result, js_get_fast_array, js_get_length64, async_hooks, JS_ITERATOR_NEXT_DEF, JS_CFUNC_MAGIC_DEF, JS_PROP_STRING_DEF, JS_NewArrayFrom, } from "./quickjs.js";
10
+ import { OP_DEFINE_METHOD_METHOD, OP_DEFINE_METHOD_GETTER, OP_DEFINE_METHOD_ENUMERABLE, JS_DEFINE_CLASS_HAS_HERITAGE, JS_THROW_VAR_RO, JS_THROW_VAR_REDECL, JS_THROW_VAR_UNINITIALIZED, JS_THROW_ERROR_DELETE_SUPER, JS_THROW_ERROR_ITERATOR_THROW, FUNC_RET_AWAIT, FUNC_RET_YIELD, FUNC_RET_YIELD_STAR, FUNC_RET_INITIAL_YIELD, get_i8, get_u16, get_i16, get_u32, get_i32, } from "./opcodes.js";
11
+ import { JS_NewPromiseCapability, js_promise_resolve, perform_promise_then } from "./builtins/promise.js";
12
+ export const ARG_SCOPE_END = -2;
13
+ export const GEN_MAGIC_NEXT = 0;
14
+ export const GEN_MAGIC_RETURN = 1;
15
+ export const GEN_MAGIC_THROW = 2;
16
+ /* ---------------------------------------------------------------------
17
+ Variable references
18
+ --------------------------------------------------------------------- */
19
+ export function js_class_has_bytecode(class_id) {
20
+ return class_id === 13 /* JSClassID.BYTECODE_FUNCTION */ || class_id === 16 /* JSClassID.GENERATOR_FUNCTION */ ||
21
+ class_id === 48 /* JSClassID.ASYNC_FUNCTION */ || class_id === 52 /* JSClassID.ASYNC_GENERATOR_FUNCTION */;
22
+ }
23
+ export function get_var_ref(ctx, sf, var_idx, is_arg) {
24
+ for (const vr of sf.var_refs) {
25
+ if (!vr.is_detached && vr.is_arg === is_arg && vr.var_idx === var_idx)
26
+ return vr;
27
+ }
28
+ const vr = new JSVarRef(sf, is_arg, var_idx);
29
+ if (sf.var_refs === EMPTY_VAR_REFS)
30
+ sf.var_refs = [];
31
+ sf.var_refs.push(vr);
32
+ return vr;
33
+ }
34
+ export function close_var_refs(rt, sf) {
35
+ if (sf.var_refs === EMPTY_VAR_REFS)
36
+ return;
37
+ for (const vr of sf.var_refs)
38
+ vr.detach();
39
+ sf.var_refs.length = 0;
40
+ }
41
+ export function close_lexical_var(ctx, sf, var_idx) {
42
+ const refs = sf.var_refs;
43
+ for (let i = refs.length - 1; i >= 0; i--) {
44
+ const vr = refs[i];
45
+ if (!vr.is_arg && vr.var_idx === var_idx) {
46
+ vr.detach();
47
+ refs.splice(i, 1);
48
+ }
49
+ }
50
+ }
51
+ /* ---------------------------------------------------------------------
52
+ Closures
53
+ --------------------------------------------------------------------- */
54
+ function func_kind_to_class_id(kind) {
55
+ switch (kind) {
56
+ case 1 /* JSFunctionKind.GENERATOR */: return 16 /* JSClassID.GENERATOR_FUNCTION */;
57
+ case 2 /* JSFunctionKind.ASYNC */: return 48 /* JSClassID.ASYNC_FUNCTION */;
58
+ case 3 /* JSFunctionKind.ASYNC_GENERATOR */: return 52 /* JSClassID.ASYNC_GENERATOR_FUNCTION */;
59
+ default: return 13 /* JSClassID.BYTECODE_FUNCTION */;
60
+ }
61
+ }
62
+ /* collect the variable references of a closure from the current frame */
63
+ function js_build_var_refs(ctx, b, cur_var_refs, sf) {
64
+ const var_refs = [];
65
+ for (let i = 0; i < b.closure_var.length; i++) {
66
+ const cv = b.closure_var[i];
67
+ if (cv.is_local) {
68
+ /* reuse the existing variable reference if it already exists */
69
+ if (!sf) {
70
+ JS_ThrowInternalError(ctx, 'closure without stack frame');
71
+ return null;
72
+ }
73
+ var_refs.push(get_var_ref(ctx, sf, cv.var_idx, cv.is_arg));
74
+ }
75
+ else {
76
+ if (!cur_var_refs) {
77
+ JS_ThrowInternalError(ctx, 'closure without parent var refs');
78
+ return null;
79
+ }
80
+ var_refs.push(cur_var_refs[cv.var_idx]);
81
+ }
82
+ }
83
+ return var_refs;
84
+ }
85
+ /* Create the guest function object of a bytecode function with the given
86
+ variable references. The object is a strict host wrapper whose
87
+ implementation runs the interpreter (or the compiled code). */
88
+ export function js_closure_from_refs(ctx, b, var_refs, proto, is_ctor) {
89
+ /* compiled tier: a retargetable wrapper that switches to the compiled body once it exists */
90
+ if (jit_hooks.make_wrapper !== null && b.func_kind === 0 /* JSFunctionKind.NORMAL */ && !b.no_jit) {
91
+ const w = jit_hooks.make_wrapper(ctx, b, var_refs, proto, is_ctor);
92
+ if (w !== null)
93
+ return w;
94
+ }
95
+ let fobj;
96
+ const impl = (this_val, new_target, args) => {
97
+ let ret;
98
+ if (new_target !== undefined)
99
+ ret = JS_CallInternal(ctx, fobj, new_target, new_target, args, JS_CALL_FLAG_CONSTRUCTOR);
100
+ else
101
+ ret = JS_CallInternal(ctx, fobj, this_val, undefined, args, 0);
102
+ if (ret === JS_EXCEPTION)
103
+ throw js_take_exception(ctx);
104
+ return ret;
105
+ };
106
+ fobj = js_new_host_function(ctx, impl, is_ctor, '', b.defined_arg_count, proto, func_kind_to_class_id(b.func_kind));
107
+ const m = js_meta.get(fobj);
108
+ m.func = new JSFunctionData(b, var_refs);
109
+ m.realm = b.realm ?? ctx;
110
+ return fobj;
111
+ }
112
+ export function js_closure2(ctx, b, cur_var_refs, sf, proto, is_ctor) {
113
+ const var_refs = js_build_var_refs(ctx, b, cur_var_refs, sf);
114
+ if (!var_refs)
115
+ return JS_EXCEPTION;
116
+ return js_closure_from_refs(ctx, b, var_refs, proto, is_ctor);
117
+ }
118
+ function js_instantiate_prototype(ctx, p) {
119
+ const obj = JS_NewObject(ctx);
120
+ if (JS_IsException(obj))
121
+ return JS_EXCEPTION;
122
+ if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_constructor, p, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE) < 0)
123
+ return JS_EXCEPTION;
124
+ return obj;
125
+ }
126
+ export function js_function_set_properties(ctx, func_obj, name, len) {
127
+ JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_length, len, JS_PROP_CONFIGURABLE);
128
+ JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_name, JS_AtomToString(ctx, name), JS_PROP_CONFIGURABLE);
129
+ }
130
+ export function js_closure(ctx, b, cur_var_refs, sf) {
131
+ const class_id = func_kind_to_class_id(b.func_kind);
132
+ const proto = ctx.class_proto[class_id] ?? ctx.function_proto;
133
+ const func_obj = js_closure2(ctx, b, cur_var_refs, sf, proto, b.has_prototype);
134
+ if (JS_IsException(func_obj))
135
+ return JS_EXCEPTION;
136
+ let name_atom = b.func_name;
137
+ if (name_atom === JS_ATOM_NULL)
138
+ name_atom = JS_ATOM_empty_string;
139
+ js_function_set_properties(ctx, func_obj, name_atom, b.defined_arg_count);
140
+ if (b.func_kind & 1 /* JSFunctionKind.GENERATOR */) {
141
+ /* generators have a prototype field which is used as prototype for the generator object */
142
+ const proto_class_id = (b.func_kind === 3 /* JSFunctionKind.ASYNC_GENERATOR */) ? 53 /* JSClassID.ASYNC_GENERATOR */ : 43 /* JSClassID.GENERATOR */;
143
+ const gproto = JS_NewObjectProto(ctx, ctx.class_proto[proto_class_id]);
144
+ if (JS_IsException(gproto))
145
+ return JS_EXCEPTION;
146
+ JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_prototype, gproto, JS_PROP_WRITABLE);
147
+ }
148
+ else if (b.has_prototype) {
149
+ const proto_obj = js_instantiate_prototype(ctx, func_obj);
150
+ if (JS_IsException(proto_obj))
151
+ return JS_EXCEPTION;
152
+ JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_prototype, proto_obj, JS_PROP_WRITABLE);
153
+ }
154
+ return func_obj;
155
+ }
156
+ /* ---------------------------------------------------------------------
157
+ Arguments objects
158
+ --------------------------------------------------------------------- */
159
+ export function js_build_arguments(ctx, argc, argv) {
160
+ const val = JS_NewObjectProtoClass(ctx, ctx.class_proto[1 /* JSClassID.OBJECT */], 8 /* JSClassID.ARGUMENTS */);
161
+ if (JS_IsException(val))
162
+ return val;
163
+ for (let i = 0; i < argc; i++) {
164
+ Reflect.defineProperty(val, i, { value: argv[i], writable: true, enumerable: true, configurable: true });
165
+ }
166
+ JS_DefinePropertyValue(ctx, val, JS_ATOM_length, argc, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
167
+ JS_DefinePropertyValue(ctx, val, JS_ATOM_Symbol_iterator, ctx.array_proto_values, JS_PROP_CONFIGURABLE | JS_PROP_WRITABLE);
168
+ /* add callee property to throw a TypeError in strict mode */
169
+ JS_DefineProperty(ctx, val, JS_ATOM_callee, undefined, ctx.throw_type_error ?? undefined, ctx.throw_type_error ?? undefined, JS_PROP_HAS_GET | JS_PROP_HAS_SET);
170
+ return val;
171
+ }
172
+ /* legacy arguments object: add references to the function arguments */
173
+ export function js_build_mapped_arguments(ctx, argc, argv, sf, arg_count) {
174
+ const val = JS_NewObjectProtoClass(ctx, ctx.class_proto[1 /* JSClassID.OBJECT */], 9 /* JSClassID.MAPPED_ARGUMENTS */);
175
+ if (JS_IsException(val))
176
+ return val;
177
+ JS_DefinePropertyValue(ctx, val, JS_ATOM_length, argc, JS_PROP_WRITABLE | JS_PROP_CONFIGURABLE);
178
+ /* the mapped arguments alias the variables through accessor properties */
179
+ for (let i = 0; i < arg_count; i++) {
180
+ const var_ref = get_var_ref(ctx, sf, i, true);
181
+ const getter = js_new_host_function(ctx, () => var_ref.get(), false, '', 0, ctx.function_proto, 12 /* JSClassID.C_FUNCTION */);
182
+ const setter = js_new_host_function(ctx, (_t, _nt, args) => { var_ref.set(args[0]); return undefined; }, false, '', 1, ctx.function_proto, 12 /* JSClassID.C_FUNCTION */);
183
+ Reflect.defineProperty(val, i, { get: getter, set: setter, enumerable: true, configurable: true });
184
+ }
185
+ /* the arguments not mapped to the arguments of the function can be normal properties */
186
+ for (let i = arg_count; i < argc; i++) {
187
+ if (JS_DefinePropertyValueUint32(ctx, val, i, argv[i], JS_PROP_C_W_E) < 0)
188
+ return JS_EXCEPTION;
189
+ }
190
+ JS_DefinePropertyValue(ctx, val, JS_ATOM_Symbol_iterator, ctx.array_proto_values, JS_PROP_CONFIGURABLE | JS_PROP_WRITABLE);
191
+ /* callee returns this function in non strict mode */
192
+ JS_DefinePropertyValue(ctx, val, JS_ATOM_callee, sf.cur_func, JS_PROP_CONFIGURABLE | JS_PROP_WRITABLE);
193
+ return val;
194
+ }
195
+ function __atom_from_idx(i) { return i + 0x80000000; }
196
+ export function js_build_rest(ctx, first, argc, argv) {
197
+ return JS_NewArrayFrom(ctx, first < argc ? argv.slice(first, argc) : []);
198
+ }
199
+ /* ---------------------------------------------------------------------
200
+ Private fields and brands
201
+ --------------------------------------------------------------------- */
202
+ function JS_ThrowTypeErrorPrivateNotFound(ctx, atom) {
203
+ return JS_ThrowTypeErrorAtom(ctx, "private class field '%s' does not exist", atom);
204
+ }
205
+ /* private fields and brands live in a side table keyed by the object, so
206
+ they are invisible to Reflect.ownKeys and proxy traps */
207
+ function js_private_map(obj, create) {
208
+ let m = js_privates.get(obj);
209
+ if (!m && create) {
210
+ m = new Map();
211
+ js_privates.set(obj, m);
212
+ }
213
+ return m;
214
+ }
215
+ function js_private_atom(ctx, name) {
216
+ return ctx.rt.atoms.symbolToAtom(name);
217
+ }
218
+ export function JS_DefinePrivateField(ctx, obj, name, val) {
219
+ if (!JS_IsObject(obj)) {
220
+ JS_ThrowTypeErrorNotAnObject(ctx);
221
+ return -1;
222
+ }
223
+ if (typeof name !== 'symbol') {
224
+ JS_ThrowTypeErrorNotASymbol(ctx);
225
+ return -1;
226
+ }
227
+ const m = js_private_map(obj, true);
228
+ if (m.has(name)) {
229
+ JS_ThrowTypeErrorAtom(ctx, "private class field '%s' already exists", js_private_atom(ctx, name));
230
+ return -1;
231
+ }
232
+ m.set(name, val);
233
+ return 0;
234
+ }
235
+ export function JS_GetPrivateField(ctx, obj, name) {
236
+ if (!JS_IsObject(obj))
237
+ return JS_ThrowTypeErrorNotAnObject(ctx);
238
+ if (typeof name !== 'symbol')
239
+ return JS_ThrowTypeErrorNotASymbol(ctx);
240
+ const m = js_private_map(obj, false);
241
+ if (!m || !m.has(name))
242
+ return JS_ThrowTypeErrorPrivateNotFound(ctx, js_private_atom(ctx, name));
243
+ return m.get(name);
244
+ }
245
+ export function JS_SetPrivateField(ctx, obj, name, val) {
246
+ if (!JS_IsObject(obj)) {
247
+ JS_ThrowTypeErrorNotAnObject(ctx);
248
+ return -1;
249
+ }
250
+ if (typeof name !== 'symbol') {
251
+ JS_ThrowTypeErrorNotASymbol(ctx);
252
+ return -1;
253
+ }
254
+ const m = js_private_map(obj, false);
255
+ if (!m || !m.has(name)) {
256
+ JS_ThrowTypeErrorPrivateNotFound(ctx, js_private_atom(ctx, name));
257
+ return -1;
258
+ }
259
+ m.set(name, val);
260
+ return 0;
261
+ }
262
+ /* add a private brand field to 'home_obj' if not already present and
263
+ if obj is != null add a private brand to it */
264
+ export function JS_AddBrand(ctx, obj, home_obj) {
265
+ if (!JS_IsObject(home_obj)) {
266
+ JS_ThrowTypeErrorNotAnObject(ctx);
267
+ return -1;
268
+ }
269
+ const brand_key = ctx.rt.atoms.getSymbol(JS_ATOM_Private_brand);
270
+ const hm = js_private_map(home_obj, true);
271
+ let brand = hm.get(brand_key);
272
+ if (brand === undefined) {
273
+ /* if the brand is not present, add it */
274
+ brand = JS_NewSymbolFromAtom(ctx, JS_ATOM_brand, JS_ATOM_TYPE_PRIVATE);
275
+ hm.set(brand_key, brand);
276
+ }
277
+ if (JS_IsObject(obj)) {
278
+ const m = js_private_map(obj, true);
279
+ if (m.has(brand)) {
280
+ JS_ThrowTypeError(ctx, 'private method is already present');
281
+ return -1;
282
+ }
283
+ m.set(brand, undefined);
284
+ }
285
+ return 0;
286
+ }
287
+ /* return a boolean telling if the brand of the home object of 'func'
288
+ is present on 'obj' or -1 in case of exception */
289
+ export function JS_CheckBrand(ctx, obj, func) {
290
+ const fd = JS_GetFunctionData(func);
291
+ if (!fd || !fd.home_object) {
292
+ JS_ThrowTypeErrorNotAnObject(ctx);
293
+ return -1;
294
+ }
295
+ const brand_key = ctx.rt.atoms.getSymbol(JS_ATOM_Private_brand);
296
+ const brand = js_private_map(fd.home_object, false)?.get(brand_key);
297
+ if (brand === undefined) {
298
+ JS_ThrowTypeError(ctx, 'expecting <brand> private field');
299
+ return -1;
300
+ }
301
+ if (typeof brand !== 'symbol') {
302
+ JS_ThrowTypeErrorNotAnObject(ctx);
303
+ return -1;
304
+ }
305
+ if (!JS_IsObject(obj)) {
306
+ JS_ThrowTypeErrorNotAnObject(ctx);
307
+ return -1;
308
+ }
309
+ return js_private_map(obj, false)?.has(brand) ? 1 : 0;
310
+ }
311
+ /* op1 = object, op2 = field name or method function; returns -1/0/1 */
312
+ export function js_operator_private_in(ctx, op1, op2) {
313
+ if (!JS_IsObject(op1)) {
314
+ JS_ThrowTypeError(ctx, "invalid 'in' operand");
315
+ return -1;
316
+ }
317
+ if (JS_IsObject(op2)) {
318
+ /* method: use the brand */
319
+ return JS_CheckBrand(ctx, op1, op2);
320
+ }
321
+ if (typeof op2 !== 'symbol') {
322
+ JS_ThrowTypeErrorNotASymbol(ctx);
323
+ return -1;
324
+ }
325
+ return js_private_map(op1, false)?.has(op2) ? 1 : 0;
326
+ }
327
+ /* ---------------------------------------------------------------------
328
+ Methods, names and classes
329
+ --------------------------------------------------------------------- */
330
+ export function js_method_set_home_object(ctx, func_obj, home_obj) {
331
+ const fd = JS_GetFunctionData(func_obj);
332
+ if (!fd)
333
+ return;
334
+ if (fd.function_bytecode.need_home_object) {
335
+ fd.home_object = JS_IsObject(home_obj) ? home_obj : null;
336
+ }
337
+ }
338
+ export function js_get_function_name(ctx, name) {
339
+ const name_str = JS_AtomToString(ctx, name);
340
+ if (ctx.rt.atoms.isSymbol(name)) {
341
+ const sym = ctx.rt.atoms.getSymbol(name);
342
+ if (sym.description !== undefined)
343
+ return '[' + name_str + ']';
344
+ return '';
345
+ }
346
+ return name_str;
347
+ }
348
+ /* Modify the name of a method according to the atom and 'flags'
349
+ (bitmask of JS_PROP_HAS_GET and JS_PROP_HAS_SET). Also set the home
350
+ object of the method. Return < 0 if exception. */
351
+ export function js_method_set_properties(ctx, func_obj, name, flags, home_obj) {
352
+ let name_str = js_get_function_name(ctx, name);
353
+ if (flags & JS_PROP_HAS_GET)
354
+ name_str = 'get ' + name_str;
355
+ else if (flags & JS_PROP_HAS_SET)
356
+ name_str = 'set ' + name_str;
357
+ if (JS_DefinePropertyValue(ctx, func_obj, JS_ATOM_name, name_str, JS_PROP_CONFIGURABLE) < 0)
358
+ return -1;
359
+ js_method_set_home_object(ctx, func_obj, home_obj);
360
+ return 0;
361
+ }
362
+ /* return TRUE if 'obj' has a non empty 'name' string */
363
+ function js_object_has_name(ctx, obj) {
364
+ let d;
365
+ try {
366
+ d = Reflect.getOwnPropertyDescriptor(obj, 'name');
367
+ }
368
+ catch {
369
+ return true;
370
+ }
371
+ if (!d)
372
+ return false;
373
+ if ('get' in d || 'set' in d)
374
+ return true;
375
+ if (typeof d.value !== 'string')
376
+ return true;
377
+ return d.value.length !== 0;
378
+ }
379
+ export function JS_DefineObjectName(ctx, obj, name, flags) {
380
+ if (name !== JS_ATOM_NULL && JS_IsObject(obj) && !js_object_has_name(ctx, obj) &&
381
+ JS_DefinePropertyValue(ctx, obj, JS_ATOM_name, JS_AtomToString(ctx, name), flags) < 0) {
382
+ return -1;
383
+ }
384
+ return 0;
385
+ }
386
+ export function JS_DefineObjectNameComputed(ctx, obj, str, flags) {
387
+ if (JS_IsObject(obj) && !js_object_has_name(ctx, obj)) {
388
+ const prop = JS_ValueToAtom(ctx, str);
389
+ if (prop === JS_ATOM_NULL)
390
+ return -1;
391
+ const name_str = js_get_function_name(ctx, prop);
392
+ if (JS_DefinePropertyValue(ctx, obj, JS_ATOM_name, name_str, flags) < 0)
393
+ return -1;
394
+ }
395
+ return 0;
396
+ }
397
+ /* Define a class: returns [ctor, proto] or null on exception. 'var_refs'
398
+ are the variable references of the constructor closure (already built;
399
+ see js_build_var_refs). 'computed_name' is the class name value when
400
+ the name is computed (class_name is then ignored). */
401
+ export function js_define_class(ctx, class_name, class_flags, parent_class, b, var_refs, is_computed_name, computed_name) {
402
+ let parent_proto;
403
+ if (class_flags & JS_DEFINE_CLASS_HAS_HERITAGE) {
404
+ if (parent_class === null) {
405
+ parent_proto = null;
406
+ parent_class = ctx.function_proto;
407
+ }
408
+ else {
409
+ if (!JS_IsConstructor(ctx, parent_class)) {
410
+ JS_ThrowTypeError(ctx, 'parent class must be constructor');
411
+ return null;
412
+ }
413
+ parent_proto = JS_GetProperty(ctx, parent_class, JS_ATOM_prototype);
414
+ if (JS_IsException(parent_proto))
415
+ return null;
416
+ if (parent_proto !== null && !JS_IsObject(parent_proto)) {
417
+ JS_ThrowTypeError(ctx, 'parent prototype must be an object or null');
418
+ return null;
419
+ }
420
+ }
421
+ }
422
+ else {
423
+ /* parent_class is JS_UNDEFINED in this case */
424
+ parent_proto = ctx.class_proto[1 /* JSClassID.OBJECT */];
425
+ parent_class = ctx.function_proto;
426
+ }
427
+ const proto = JS_NewObjectProto(ctx, parent_proto);
428
+ if (JS_IsException(proto))
429
+ return null;
430
+ const ctor = js_closure_from_refs(ctx, b, var_refs, parent_class, true);
431
+ if (JS_IsException(ctor))
432
+ return null;
433
+ js_method_set_home_object(ctx, ctor, proto);
434
+ const m = js_meta.get(ctor);
435
+ m.is_constructor = true;
436
+ m.is_class = true;
437
+ JS_DefinePropertyValue(ctx, ctor, JS_ATOM_length, b.defined_arg_count, JS_PROP_CONFIGURABLE);
438
+ if (is_computed_name) {
439
+ if (JS_DefineObjectNameComputed(ctx, ctor, computed_name, JS_PROP_CONFIGURABLE) < 0)
440
+ return null;
441
+ }
442
+ else {
443
+ if (JS_DefineObjectName(ctx, ctor, class_name, JS_PROP_CONFIGURABLE) < 0)
444
+ return null;
445
+ }
446
+ /* the constructor property must be first. It can be overriden by computed property names */
447
+ if (JS_DefinePropertyValue(ctx, proto, JS_ATOM_constructor, ctor, JS_PROP_CONFIGURABLE | JS_PROP_WRITABLE | JS_PROP_THROW) < 0)
448
+ return null;
449
+ /* set the prototype property */
450
+ if (JS_DefinePropertyValue(ctx, ctor, JS_ATOM_prototype, proto, JS_PROP_THROW) < 0)
451
+ return null;
452
+ return [ctor, proto];
453
+ }
454
+ /* stack: [name] parent ctor_bytecode -> [name] ctor proto */
455
+ function js_op_define_class(ctx, stack, sp, class_name, class_flags, cur_var_refs, sf, is_computed_name) {
456
+ const parent_class = stack[sp - 2];
457
+ const bfunc = stack[sp - 1];
458
+ const fail = () => { stack[sp - 2] = undefined; stack[sp - 1] = undefined; return -1; };
459
+ const var_refs = js_build_var_refs(ctx, bfunc, cur_var_refs, sf);
460
+ if (!var_refs)
461
+ return fail();
462
+ const r = js_define_class(ctx, class_name, class_flags, parent_class, bfunc, var_refs, is_computed_name, is_computed_name ? stack[sp - 3] : undefined);
463
+ if (!r)
464
+ return fail();
465
+ stack[sp - 2] = r[0];
466
+ stack[sp - 1] = r[1];
467
+ return 0;
468
+ }
469
+ /* ---------------------------------------------------------------------
470
+ Iteration helpers
471
+ --------------------------------------------------------------------- */
472
+ /* stack: obj -> iter next (returns -1 on exception) */
473
+ function js_for_of_start(ctx, stack, sp, is_async) {
474
+ const op1 = stack[sp - 1];
475
+ const obj = JS_GetIterator(ctx, op1, is_async);
476
+ if (JS_IsException(obj))
477
+ return -1;
478
+ stack[sp - 1] = obj;
479
+ const method = JS_GetProperty(ctx, obj, JS_ATOM_next);
480
+ if (JS_IsException(method))
481
+ return -1;
482
+ stack[sp] = method;
483
+ return 0;
484
+ }
485
+ /* enum_rec [objs] -> enum_rec [objs] value done. There are 'offset'
486
+ objs. If 'done' is true or in case of exception, 'enum_rec' is set
487
+ to undefined. If 'done' is true, 'value' is always set to undefined. */
488
+ function js_for_of_next(ctx, stack, sp, offset) {
489
+ let value = undefined;
490
+ let done = 1;
491
+ const iter = stack[sp + offset];
492
+ if (!JS_IsUndefined(iter)) {
493
+ const pdone = { done: 0 };
494
+ value = JS_IteratorNext(ctx, iter, stack[sp + offset + 1], [], pdone);
495
+ if (JS_IsException(value))
496
+ done = -1;
497
+ else
498
+ done = pdone.done;
499
+ if (done) {
500
+ /* replace the iteration object with undefined */
501
+ stack[sp + offset] = undefined;
502
+ if (done < 0)
503
+ return -1;
504
+ value = undefined;
505
+ }
506
+ }
507
+ stack[sp] = value;
508
+ stack[sp + 1] = done !== 0;
509
+ return 0;
510
+ }
511
+ /* stack: iter next catch_offset -> iter next catch_offset obj */
512
+ function js_for_await_of_next(ctx, stack, sp) {
513
+ stack[sp - 1] = undefined; /* disable the catch offset so that exceptions do not close the iterator */
514
+ const iter = stack[sp - 3];
515
+ const next = stack[sp - 2];
516
+ const obj = JS_Call(ctx, next, iter, []);
517
+ if (JS_IsException(obj))
518
+ return -1;
519
+ stack[sp] = obj;
520
+ return 0;
521
+ }
522
+ /* stack: catch_offset obj -> catch_offset value done */
523
+ function js_iterator_get_value_done(ctx, stack, sp) {
524
+ const obj = stack[sp - 1];
525
+ if (!JS_IsObject(obj)) {
526
+ JS_ThrowTypeError(ctx, 'iterator must return an object');
527
+ return -1;
528
+ }
529
+ const pdone = { done: 0 };
530
+ const value = JS_IteratorGetCompleteValue(ctx, obj, pdone);
531
+ if (JS_IsException(value))
532
+ return -1;
533
+ /* put again the catch offset so that exceptions close the iterator */
534
+ stack[sp - 2] = JS_NewCatchOffset(0);
535
+ stack[sp - 1] = value;
536
+ stack[sp] = pdone.done !== 0;
537
+ return 0;
538
+ }
539
+ /* stack: array pos enumobj -> array pos enumobj (pos updated) */
540
+ function js_append_enumerate(ctx, stack, sp) {
541
+ if (typeof stack[sp - 2] !== 'number') {
542
+ JS_ThrowInternalError(ctx, 'invalid index for append');
543
+ return -1;
544
+ }
545
+ let pos = stack[sp - 2];
546
+ const src = stack[sp - 1];
547
+ const target = stack[sp - 3];
548
+ const iterator = JS_GetProperty(ctx, src, JS_ATOM_Symbol_iterator);
549
+ if (JS_IsException(iterator))
550
+ return -1;
551
+ const is_array_iterator = iterator !== undefined && iterator === ctx.array_proto_values;
552
+ const enumobj = JS_GetIterator(ctx, src, false);
553
+ if (JS_IsException(enumobj))
554
+ return -1;
555
+ const method = JS_GetProperty(ctx, enumobj, JS_ATOM_next);
556
+ if (JS_IsException(method))
557
+ return -1;
558
+ const fast = js_get_fast_array(ctx, src);
559
+ let fast_ok = false;
560
+ if (is_array_iterator && fast && ctx.array_iterator_proto && Reflect.getPrototypeOf(enumobj) === ctx.array_iterator_proto) {
561
+ const next_d = Reflect.getOwnPropertyDescriptor(ctx.array_iterator_proto, 'next');
562
+ if (next_d && 'value' in next_d && next_d.value === method) {
563
+ const len = js_get_length64(ctx, src);
564
+ if (len < 0) {
565
+ JS_IteratorClose(ctx, enumobj, true);
566
+ return -1;
567
+ }
568
+ /* if len > count, the elements >= count might be read in the prototypes */
569
+ if (len === fast.length)
570
+ fast_ok = true;
571
+ }
572
+ }
573
+ if (fast_ok) {
574
+ const count = fast.length;
575
+ for (let i = 0; i < count; i++) {
576
+ if (JS_DefinePropertyValueUint32(ctx, target, pos++, fast[i], JS_PROP_C_W_E) < 0) {
577
+ JS_IteratorClose(ctx, enumobj, true);
578
+ return -1;
579
+ }
580
+ }
581
+ }
582
+ else {
583
+ const pdone = { done: 0 };
584
+ for (;;) {
585
+ const value = JS_IteratorNext(ctx, enumobj, method, [], pdone);
586
+ if (JS_IsException(value)) {
587
+ JS_IteratorClose(ctx, enumobj, true);
588
+ return -1;
589
+ }
590
+ if (pdone.done)
591
+ break;
592
+ if (JS_DefinePropertyValueUint32(ctx, target, pos++, value, JS_PROP_C_W_E) < 0) {
593
+ JS_IteratorClose(ctx, enumobj, true);
594
+ return -1;
595
+ }
596
+ }
597
+ }
598
+ stack[sp - 2] = pos;
599
+ return 0;
600
+ }
601
+ function js_has_unscopable(ctx, obj, atom) {
602
+ const arr = JS_GetProperty(ctx, obj, JS_ATOM_Symbol_unscopables);
603
+ if (JS_IsException(arr))
604
+ return -1;
605
+ let ret = 0;
606
+ if (JS_IsObject(arr)) {
607
+ const val = JS_GetProperty(ctx, arr, atom);
608
+ if (JS_IsException(val))
609
+ return -1;
610
+ ret = JS_ToBoolFree(ctx, val) ? 1 : 0;
611
+ }
612
+ return ret;
613
+ }
614
+ /* Function.prototype.apply / Reflect.apply / Reflect.construct helper
615
+ magic: 0 = apply, 1 = construct (this_arg is new_target), 2 = Reflect.apply (array required) */
616
+ export function js_function_apply(ctx, this_val, argv, magic) {
617
+ if (!JS_IsFunction(ctx, this_val))
618
+ return JS_ThrowTypeError(ctx, 'not a function');
619
+ const this_arg = argv[0];
620
+ const array_arg = argv[1];
621
+ if ((array_arg === undefined || array_arg === null) && magic !== 2) {
622
+ return JS_Call(ctx, this_val, this_arg, []);
623
+ }
624
+ const tab = build_arg_list(ctx, array_arg);
625
+ if (!tab)
626
+ return JS_EXCEPTION;
627
+ if (magic & 1)
628
+ return JS_CallConstructor2(ctx, this_val, this_arg, tab);
629
+ return JS_Call(ctx, this_val, this_arg, tab);
630
+ }
631
+ function JS_EvalObject(ctx, this_obj, val, flags, scope_idx) {
632
+ if (typeof val !== 'string')
633
+ return val;
634
+ return hooks.JS_EvalInternal(ctx, this_obj, val, '<input>', flags, scope_idx);
635
+ }
636
+ /* interrupt polling: return -1 if an interrupt was requested */
637
+ function js_poll_interrupts(ctx) {
638
+ if (--ctx.interrupt_counter <= 0) {
639
+ ctx.interrupt_counter = 10000;
640
+ const rt = ctx.rt;
641
+ if (rt.interrupt_handler) {
642
+ if (rt.interrupt_handler(rt, rt.interrupt_opaque)) {
643
+ /* XXX: should set a specific flag to avoid catching */
644
+ JS_ThrowInternalError(ctx, 'interrupted');
645
+ JS_SetUncatchableError(ctx, rt.current_exception, true);
646
+ return -1;
647
+ }
648
+ }
649
+ }
650
+ return 0;
651
+ }
652
+ function is_backtrace_needed(ctx, obj) {
653
+ const m = js_get_meta(obj);
654
+ return m !== undefined && m.class_id === 3 /* JSClassID.ERROR */ && !m.has_backtrace;
655
+ }
656
+ /* ---------------------------------------------------------------------
657
+ JS_CallInternal
658
+ --------------------------------------------------------------------- */
659
+ export function JS_CallInternal(ctx, func_obj, this_obj, new_target, argv, flags) {
660
+ if (typeof func_obj !== 'function')
661
+ return JS_ThrowTypeError(ctx, 'not a function');
662
+ const m = js_meta.get(func_obj);
663
+ if (m !== undefined) {
664
+ const fd = m.func;
665
+ if (fd !== null) {
666
+ const b = fd.function_bytecode;
667
+ /* compiled tier (src/jit.ts): compiles hot functions and calls the direct entry */
668
+ if (jit_hooks.try_call !== null && b.func_kind === 0 /* JSFunctionKind.NORMAL */) {
669
+ const r = jit_hooks.try_call(ctx, func_obj, fd, b, this_obj, new_target, argv, flags);
670
+ if (r !== JIT_NOT_COMPILED)
671
+ return r;
672
+ }
673
+ if (b.compiled === null) {
674
+ switch (b.func_kind) {
675
+ case 0 /* JSFunctionKind.NORMAL */:
676
+ return js_call_internal(ctx, func_obj, this_obj, new_target, argv, flags, null, true);
677
+ case 1 /* JSFunctionKind.GENERATOR */:
678
+ return js_generator_function_call(ctx, func_obj, this_obj, argv, flags);
679
+ case 2 /* JSFunctionKind.ASYNC */:
680
+ return js_async_function_call(ctx, func_obj, this_obj, argv, flags);
681
+ case 3 /* JSFunctionKind.ASYNC_GENERATOR */:
682
+ return js_async_generator_function_call(ctx, func_obj, this_obj, argv, flags);
683
+ }
684
+ }
685
+ }
686
+ else if (m.cfunc !== null) {
687
+ return js_call_c_function(ctx, func_obj, this_obj, argv, flags);
688
+ }
689
+ else if (m.class_id === 15 /* JSClassID.C_FUNCTION_DATA */) {
690
+ return js_c_function_data_call(ctx, func_obj, this_obj, argv, flags);
691
+ }
692
+ }
693
+ return js_call_host_function(ctx, func_obj, this_obj, new_target, argv, flags);
694
+ }
695
+ /* backward jumps taken in a function's interpreter frames (cumulated over its calls) before the
696
+ compiled tier is asked to replace the running frame (jit_hooks.osr) */
697
+ export let jit_osr_threshold = 500;
698
+ export function jit_set_osr_threshold(n) { jit_osr_threshold = n; }
699
+ function js_call_internal(caller_ctx, func_obj, this_obj, new_target, argv, flags, gen_state, jit_checked = false) {
700
+ if (gen_state === null) {
701
+ /* only interpreted normal bytecode functions are executed here */
702
+ const m = typeof func_obj === 'function' ? js_meta.get(func_obj) : undefined;
703
+ if (m === undefined || m.func === null || m.func.function_bytecode.compiled !== null ||
704
+ m.func.function_bytecode.func_kind !== 0 /* JSFunctionKind.NORMAL */) {
705
+ return JS_CallInternal(caller_ctx, func_obj, this_obj, new_target, argv, flags);
706
+ }
707
+ /* compiled tier: counts the call and compiles the function once it is hot (JS_CallInternal
708
+ has asked already when it calls here) */
709
+ if (!jit_checked && jit_hooks.try_call !== null) {
710
+ const r = jit_hooks.try_call(caller_ctx, func_obj, m.func, m.func.function_bytecode, this_obj, new_target, argv, flags);
711
+ if (r !== JIT_NOT_COMPILED)
712
+ return r;
713
+ }
714
+ if (flags & JS_CALL_FLAG_CONSTRUCTOR) {
715
+ /* legacy constructor behavior: create 'this' from new_target */
716
+ if (m.func.function_bytecode.is_derived_class_constructor) {
717
+ this_obj = undefined;
718
+ }
719
+ else {
720
+ const obj = js_create_from_ctor(caller_ctx, new_target, 1 /* JSClassID.OBJECT */);
721
+ if (JS_IsException(obj))
722
+ return JS_EXCEPTION;
723
+ const ret = js_interpret(caller_ctx, func_obj, obj, new_target, argv, flags & ~JS_CALL_FLAG_CONSTRUCTOR, null);
724
+ if (JS_IsObject(ret) || JS_IsException(ret))
725
+ return ret;
726
+ return obj;
727
+ }
728
+ }
729
+ }
730
+ return js_interpret(caller_ctx, func_obj, this_obj, new_target, argv, flags, gen_state);
731
+ }
732
+ /* Runs the bytecode of a function in a new interpreter frame, or resumes the frame of a
733
+ generator. Exactly one host frame of this function exists per interpreter frame: its name
734
+ identifies interpreter frames on the host stack (src/jit_stack.ts). */
735
+ function js_interpret(caller_ctx, func_obj, this_obj, new_target, argv, flags, gen_state) {
736
+ const rt = caller_ctx.rt;
737
+ let ctx;
738
+ let p;
739
+ let fd;
740
+ let b;
741
+ let sf;
742
+ let pc;
743
+ let sp;
744
+ let argc;
745
+ let var_refs;
746
+ let arg_buf;
747
+ let var_buf;
748
+ let stack;
749
+ let ret_val = undefined;
750
+ let flow = 0 /* Flow.NORMAL */;
751
+ if (js_poll_interrupts(caller_ctx))
752
+ return JS_EXCEPTION;
753
+ if (gen_state !== null) {
754
+ /* the stack frame is already allocated (generator / async function resume) */
755
+ const s = gen_state;
756
+ sf = s.frame;
757
+ p = sf.cur_func;
758
+ fd = JS_GetFunctionData(p);
759
+ b = fd.function_bytecode;
760
+ ctx = b.realm ?? caller_ctx;
761
+ var_refs = fd.var_refs;
762
+ arg_buf = sf.arg_buf;
763
+ var_buf = sf.var_buf;
764
+ stack = sf.stack_buf;
765
+ argc = s.argc;
766
+ argv = arg_buf;
767
+ this_obj = s.this_val;
768
+ new_target = sf.new_target;
769
+ sp = sf.cur_sp;
770
+ sf.cur_sp = -1; /* cur_sp is -1 if the function is running */
771
+ pc = sf.cur_pc;
772
+ sf.prev_frame = rt.current_stack_frame;
773
+ rt.current_stack_frame = sf;
774
+ rt.stack_depth++;
775
+ if (s.throw_flag)
776
+ flow = 1 /* Flow.EXCEPTION */;
777
+ }
778
+ else {
779
+ p = func_obj;
780
+ fd = js_meta.get(p).func;
781
+ b = fd.function_bytecode;
782
+ if (rt.stack_depth >= rt.max_stack_depth)
783
+ return JS_ThrowStackOverflow(caller_ctx);
784
+ argc = argv.length;
785
+ sf = new JSStackFrame();
786
+ sf.js_mode = b.js_mode;
787
+ sf.arg_count = argc;
788
+ sf.cur_func = func_obj;
789
+ var_refs = fd.var_refs;
790
+ if (argc < b.arg_count || (flags & JS_CALL_FLAG_COPY_ARGV)) {
791
+ const n = Math.min(argc, b.arg_count);
792
+ arg_buf = new Array(Math.max(argc, b.arg_count));
793
+ for (let i = 0; i < argc; i++)
794
+ arg_buf[i] = argv[i];
795
+ for (let i = n; i < b.arg_count; i++)
796
+ arg_buf[i] = undefined;
797
+ /* keep the extra arguments (for 'arguments' and rest) */
798
+ }
799
+ else {
800
+ arg_buf = argv;
801
+ }
802
+ var_buf = new Array(b.var_count);
803
+ for (let i = 0; i < b.var_count; i++)
804
+ var_buf[i] = undefined;
805
+ stack = new Array(b.stack_size);
806
+ sf.arg_buf = arg_buf;
807
+ sf.var_buf = var_buf;
808
+ sf.stack_buf = stack;
809
+ sf.this_obj = this_obj;
810
+ sf.new_target = new_target;
811
+ sp = 0;
812
+ pc = 0;
813
+ sf.prev_frame = rt.current_stack_frame;
814
+ rt.current_stack_frame = sf;
815
+ rt.stack_depth++;
816
+ ctx = b.realm ?? caller_ctx; /* set the current realm */
817
+ argv = arg_buf;
818
+ }
819
+ const buf = b.byte_code_buf;
820
+ const cpool = b.cpool;
821
+ /* Host exceptions escaping from the engine helpers (host stack overflow
822
+ while handling an exception, host natives, bugs) are converted to
823
+ guest exceptions here so that they never leave the interpreter. */
824
+ outer: for (;;) {
825
+ try {
826
+ main: for (;;) {
827
+ if (flow === 1 /* Flow.EXCEPTION */) {
828
+ /* exception handling */
829
+ if (is_backtrace_needed(ctx, rt.current_exception)) {
830
+ sf.cur_pc = pc;
831
+ build_backtrace(ctx, rt.current_exception, null, 0, 0, 0);
832
+ }
833
+ flow = 0 /* Flow.NORMAL */;
834
+ let handled = false;
835
+ if (!JS_IsUncatchableError(ctx, rt.current_exception)) {
836
+ while (sp > 0) {
837
+ const val = stack[--sp];
838
+ if (JS_IsCatchOffset(val)) {
839
+ const pos = val.v;
840
+ if (pos === 0) {
841
+ /* enumerator: close it with a throw */
842
+ sp--; /* drop the next method */
843
+ JS_IteratorClose(ctx, stack[sp - 1], true);
844
+ }
845
+ else {
846
+ stack[sp++] = rt.current_exception;
847
+ rt.current_exception = JS_UNINITIALIZED;
848
+ rt.exception_pending = false;
849
+ pc = pos;
850
+ handled = true;
851
+ break;
852
+ }
853
+ }
854
+ }
855
+ }
856
+ if (!handled) {
857
+ ret_val = JS_EXCEPTION;
858
+ flow = b.func_kind !== 0 /* JSFunctionKind.NORMAL */ ? 3 /* Flow.DONE_GENERATOR */ : 2 /* Flow.DONE */;
859
+ break main;
860
+ }
861
+ }
862
+ const opcode = buf[pc++];
863
+ sw: switch (opcode) {
864
+ case 1 /* OP.push_i32 */:
865
+ stack[sp++] = get_i32(buf, pc);
866
+ pc += 4;
867
+ break;
868
+ case 180 /* OP.push_bigint_i32 */:
869
+ stack[sp++] = BigInt(get_i32(buf, pc));
870
+ pc += 4;
871
+ break;
872
+ case 2 /* OP.push_const */:
873
+ stack[sp++] = cpool[get_u32(buf, pc)];
874
+ pc += 4;
875
+ break;
876
+ case 182 /* OP.push_minus1 */:
877
+ case 183 /* OP.push_0 */:
878
+ case 184 /* OP.push_1 */:
879
+ case 185 /* OP.push_2 */:
880
+ case 186 /* OP.push_3 */:
881
+ case 187 /* OP.push_4 */:
882
+ case 188 /* OP.push_5 */:
883
+ case 189 /* OP.push_6 */:
884
+ case 190 /* OP.push_7 */:
885
+ stack[sp++] = opcode - 183 /* OP.push_0 */;
886
+ break;
887
+ case 191 /* OP.push_i8 */:
888
+ stack[sp++] = get_i8(buf, pc);
889
+ pc += 1;
890
+ break;
891
+ case 192 /* OP.push_i16 */:
892
+ stack[sp++] = get_i16(buf, pc);
893
+ pc += 2;
894
+ break;
895
+ case 193 /* OP.push_const8 */:
896
+ stack[sp++] = cpool[buf[pc++]];
897
+ break;
898
+ case 194 /* OP.fclosure8 */: {
899
+ const v = js_closure(ctx, cpool[buf[pc++]], var_refs, sf);
900
+ if (JS_IsException(v)) {
901
+ flow = 1 /* Flow.EXCEPTION */;
902
+ break;
903
+ }
904
+ stack[sp++] = v;
905
+ break;
906
+ }
907
+ case 195 /* OP.push_empty_string */:
908
+ stack[sp++] = '';
909
+ break;
910
+ case 235 /* OP.get_length */: {
911
+ sf.cur_pc = pc;
912
+ const val = JS_GetProperty(ctx, stack[sp - 1], JS_ATOM_length);
913
+ if (JS_IsException(val)) {
914
+ flow = 1 /* Flow.EXCEPTION */;
915
+ break;
916
+ }
917
+ stack[sp - 1] = val;
918
+ break;
919
+ }
920
+ case 4 /* OP.push_atom_value */:
921
+ stack[sp++] = JS_AtomToValue(ctx, get_u32(buf, pc));
922
+ pc += 4;
923
+ break;
924
+ case 6 /* OP.undefined */:
925
+ stack[sp++] = undefined;
926
+ break;
927
+ case 7 /* OP.null */:
928
+ stack[sp++] = null;
929
+ break;
930
+ case 8 /* OP.push_this */: {
931
+ /* OP_push_this is only called at the start of a function */
932
+ let val;
933
+ if (!(b.js_mode & JS_MODE_STRICT)) {
934
+ if (JS_IsObject(this_obj)) {
935
+ val = this_obj;
936
+ }
937
+ else if (this_obj === null || this_obj === undefined) {
938
+ val = ctx.global_obj;
939
+ }
940
+ else {
941
+ val = JS_ToObject(ctx, this_obj);
942
+ if (JS_IsException(val)) {
943
+ flow = 1 /* Flow.EXCEPTION */;
944
+ break;
945
+ }
946
+ }
947
+ }
948
+ else {
949
+ val = this_obj;
950
+ }
951
+ stack[sp++] = val;
952
+ break;
953
+ }
954
+ case 9 /* OP.push_false */:
955
+ stack[sp++] = false;
956
+ break;
957
+ case 10 /* OP.push_true */:
958
+ stack[sp++] = true;
959
+ break;
960
+ case 11 /* OP.object */: {
961
+ const v = JS_NewObject(ctx);
962
+ if (JS_IsException(v)) {
963
+ flow = 1 /* Flow.EXCEPTION */;
964
+ break;
965
+ }
966
+ stack[sp++] = v;
967
+ break;
968
+ }
969
+ case 12 /* OP.special_object */: {
970
+ const arg = buf[pc++];
971
+ let v;
972
+ switch (arg) {
973
+ case 0 /* OPSpecialObject.ARGUMENTS */:
974
+ v = js_build_arguments(ctx, argc, argv);
975
+ break;
976
+ case 1 /* OPSpecialObject.MAPPED_ARGUMENTS */:
977
+ v = js_build_mapped_arguments(ctx, argc, argv, sf, Math.min(argc, b.arg_count));
978
+ break;
979
+ case 2 /* OPSpecialObject.THIS_FUNC */:
980
+ v = sf.cur_func;
981
+ break;
982
+ case 3 /* OPSpecialObject.NEW_TARGET */:
983
+ v = new_target;
984
+ break;
985
+ case 4 /* OPSpecialObject.HOME_OBJECT */:
986
+ v = fd.home_object ?? undefined;
987
+ break;
988
+ case 5 /* OPSpecialObject.VAR_OBJECT */:
989
+ v = JS_NewObjectProto(ctx, null);
990
+ break;
991
+ case 6 /* OPSpecialObject.IMPORT_META */:
992
+ v = JS_ThrowTypeError(ctx, 'import.meta is not supported');
993
+ break;
994
+ default:
995
+ v = JS_ThrowInternalError(ctx, 'invalid special object ' + arg);
996
+ break;
997
+ }
998
+ if (JS_IsException(v)) {
999
+ flow = 1 /* Flow.EXCEPTION */;
1000
+ break;
1001
+ }
1002
+ stack[sp++] = v;
1003
+ break;
1004
+ }
1005
+ case 13 /* OP.rest */: {
1006
+ const first = get_u16(buf, pc);
1007
+ pc += 2;
1008
+ const v = js_build_rest(ctx, first, argc, argv);
1009
+ if (JS_IsException(v)) {
1010
+ flow = 1 /* Flow.EXCEPTION */;
1011
+ break;
1012
+ }
1013
+ stack[sp++] = v;
1014
+ break;
1015
+ }
1016
+ case 14 /* OP.drop */:
1017
+ sp--;
1018
+ break;
1019
+ case 15 /* OP.nip */: /* a b -> b */
1020
+ stack[sp - 2] = stack[sp - 1];
1021
+ sp--;
1022
+ break;
1023
+ case 16 /* OP.nip1 */: /* a b c -> b c */
1024
+ stack[sp - 3] = stack[sp - 2];
1025
+ stack[sp - 2] = stack[sp - 1];
1026
+ sp--;
1027
+ break;
1028
+ case 17 /* OP.dup */:
1029
+ stack[sp] = stack[sp - 1];
1030
+ sp++;
1031
+ break;
1032
+ case 19 /* OP.dup2 */: /* a b -> a b a b */
1033
+ stack[sp] = stack[sp - 2];
1034
+ stack[sp + 1] = stack[sp - 1];
1035
+ sp += 2;
1036
+ break;
1037
+ case 20 /* OP.dup3 */: /* a b c -> a b c a b c */
1038
+ stack[sp] = stack[sp - 3];
1039
+ stack[sp + 1] = stack[sp - 2];
1040
+ stack[sp + 2] = stack[sp - 1];
1041
+ sp += 3;
1042
+ break;
1043
+ case 18 /* OP.dup1 */: /* a b -> a a b */
1044
+ stack[sp] = stack[sp - 1];
1045
+ stack[sp - 1] = stack[sp - 2];
1046
+ sp++;
1047
+ break;
1048
+ case 21 /* OP.insert2 */: /* obj a -> a obj a (dup_x1) */
1049
+ stack[sp] = stack[sp - 1];
1050
+ stack[sp - 1] = stack[sp - 2];
1051
+ stack[sp - 2] = stack[sp];
1052
+ sp++;
1053
+ break;
1054
+ case 22 /* OP.insert3 */: /* obj prop a -> a obj prop a (dup_x2) */
1055
+ stack[sp] = stack[sp - 1];
1056
+ stack[sp - 1] = stack[sp - 2];
1057
+ stack[sp - 2] = stack[sp - 3];
1058
+ stack[sp - 3] = stack[sp];
1059
+ sp++;
1060
+ break;
1061
+ case 23 /* OP.insert4 */: /* this obj prop a -> a this obj prop a */
1062
+ stack[sp] = stack[sp - 1];
1063
+ stack[sp - 1] = stack[sp - 2];
1064
+ stack[sp - 2] = stack[sp - 3];
1065
+ stack[sp - 3] = stack[sp - 4];
1066
+ stack[sp - 4] = stack[sp];
1067
+ sp++;
1068
+ break;
1069
+ case 24 /* OP.perm3 */: { /* obj a b -> a obj b (213) */
1070
+ const tmp = stack[sp - 2];
1071
+ stack[sp - 2] = stack[sp - 3];
1072
+ stack[sp - 3] = tmp;
1073
+ break;
1074
+ }
1075
+ case 29 /* OP.rot3l */: { /* x a b -> a b x (231) */
1076
+ const tmp = stack[sp - 3];
1077
+ stack[sp - 3] = stack[sp - 2];
1078
+ stack[sp - 2] = stack[sp - 1];
1079
+ stack[sp - 1] = tmp;
1080
+ break;
1081
+ }
1082
+ case 31 /* OP.rot4l */: { /* x a b c -> a b c x */
1083
+ const tmp = stack[sp - 4];
1084
+ stack[sp - 4] = stack[sp - 3];
1085
+ stack[sp - 3] = stack[sp - 2];
1086
+ stack[sp - 2] = stack[sp - 1];
1087
+ stack[sp - 1] = tmp;
1088
+ break;
1089
+ }
1090
+ case 32 /* OP.rot5l */: { /* x a b c d -> a b c d x */
1091
+ const tmp = stack[sp - 5];
1092
+ stack[sp - 5] = stack[sp - 4];
1093
+ stack[sp - 4] = stack[sp - 3];
1094
+ stack[sp - 3] = stack[sp - 2];
1095
+ stack[sp - 2] = stack[sp - 1];
1096
+ stack[sp - 1] = tmp;
1097
+ break;
1098
+ }
1099
+ case 30 /* OP.rot3r */: { /* a b x -> x a b (312) */
1100
+ const tmp = stack[sp - 1];
1101
+ stack[sp - 1] = stack[sp - 2];
1102
+ stack[sp - 2] = stack[sp - 3];
1103
+ stack[sp - 3] = tmp;
1104
+ break;
1105
+ }
1106
+ case 25 /* OP.perm4 */: { /* obj prop a b -> a obj prop b */
1107
+ const tmp = stack[sp - 2];
1108
+ stack[sp - 2] = stack[sp - 3];
1109
+ stack[sp - 3] = stack[sp - 4];
1110
+ stack[sp - 4] = tmp;
1111
+ break;
1112
+ }
1113
+ case 26 /* OP.perm5 */: { /* this obj prop a b -> a this obj prop b */
1114
+ const tmp = stack[sp - 2];
1115
+ stack[sp - 2] = stack[sp - 3];
1116
+ stack[sp - 3] = stack[sp - 4];
1117
+ stack[sp - 4] = stack[sp - 5];
1118
+ stack[sp - 5] = tmp;
1119
+ break;
1120
+ }
1121
+ case 27 /* OP.swap */: { /* a b -> b a */
1122
+ const tmp = stack[sp - 2];
1123
+ stack[sp - 2] = stack[sp - 1];
1124
+ stack[sp - 1] = tmp;
1125
+ break;
1126
+ }
1127
+ case 28 /* OP.swap2 */: { /* a b c d -> c d a b */
1128
+ const tmp1 = stack[sp - 4];
1129
+ const tmp2 = stack[sp - 3];
1130
+ stack[sp - 4] = stack[sp - 2];
1131
+ stack[sp - 3] = stack[sp - 1];
1132
+ stack[sp - 2] = tmp1;
1133
+ stack[sp - 1] = tmp2;
1134
+ break;
1135
+ }
1136
+ case 3 /* OP.fclosure */: {
1137
+ const bfunc = cpool[get_u32(buf, pc)];
1138
+ pc += 4;
1139
+ const v = js_closure(ctx, bfunc, var_refs, sf);
1140
+ if (JS_IsException(v)) {
1141
+ flow = 1 /* Flow.EXCEPTION */;
1142
+ break;
1143
+ }
1144
+ stack[sp++] = v;
1145
+ break;
1146
+ }
1147
+ case 240 /* OP.call0 */:
1148
+ case 241 /* OP.call1 */:
1149
+ case 242 /* OP.call2 */:
1150
+ case 243 /* OP.call3 */:
1151
+ case 34 /* OP.call */:
1152
+ case 35 /* OP.tail_call */: {
1153
+ let call_argc;
1154
+ if (opcode === 34 /* OP.call */ || opcode === 35 /* OP.tail_call */) {
1155
+ call_argc = get_u16(buf, pc);
1156
+ pc += 2;
1157
+ }
1158
+ else {
1159
+ call_argc = opcode - 240 /* OP.call0 */;
1160
+ }
1161
+ const call_argv = stack.slice(sp - call_argc, sp);
1162
+ sf.cur_pc = pc;
1163
+ ret_val = js_call_internal(ctx, stack[sp - call_argc - 1], undefined, undefined, call_argv, 0, null);
1164
+ if (JS_IsException(ret_val)) {
1165
+ flow = 1 /* Flow.EXCEPTION */;
1166
+ break;
1167
+ }
1168
+ if (opcode === 35 /* OP.tail_call */) {
1169
+ flow = 2 /* Flow.DONE */;
1170
+ break main;
1171
+ }
1172
+ sp -= call_argc + 1;
1173
+ stack[sp++] = ret_val;
1174
+ break;
1175
+ }
1176
+ case 33 /* OP.call_constructor */: {
1177
+ const call_argc = get_u16(buf, pc);
1178
+ pc += 2;
1179
+ const call_argv = stack.slice(sp - call_argc, sp);
1180
+ sf.cur_pc = pc;
1181
+ ret_val = JS_CallConstructorInternal(ctx, stack[sp - call_argc - 2], stack[sp - call_argc - 1], call_argv, 0);
1182
+ if (JS_IsException(ret_val)) {
1183
+ flow = 1 /* Flow.EXCEPTION */;
1184
+ break;
1185
+ }
1186
+ sp -= call_argc + 2;
1187
+ stack[sp++] = ret_val;
1188
+ break;
1189
+ }
1190
+ case 36 /* OP.call_method */:
1191
+ case 37 /* OP.tail_call_method */: {
1192
+ const call_argc = get_u16(buf, pc);
1193
+ pc += 2;
1194
+ const call_argv = stack.slice(sp - call_argc, sp);
1195
+ sf.cur_pc = pc;
1196
+ ret_val = js_call_internal(ctx, stack[sp - call_argc - 1], stack[sp - call_argc - 2], undefined, call_argv, 0, null);
1197
+ if (JS_IsException(ret_val)) {
1198
+ flow = 1 /* Flow.EXCEPTION */;
1199
+ break;
1200
+ }
1201
+ if (opcode === 37 /* OP.tail_call_method */) {
1202
+ flow = 2 /* Flow.DONE */;
1203
+ break main;
1204
+ }
1205
+ sp -= call_argc + 2;
1206
+ stack[sp++] = ret_val;
1207
+ break;
1208
+ }
1209
+ case 38 /* OP.array_from */: {
1210
+ const call_argc = get_u16(buf, pc);
1211
+ pc += 2;
1212
+ const arr = JS_NewArray(ctx);
1213
+ if (JS_IsException(arr)) {
1214
+ flow = 1 /* Flow.EXCEPTION */;
1215
+ break;
1216
+ }
1217
+ const base = sp - call_argc;
1218
+ let err = false;
1219
+ for (let i = 0; i < call_argc; i++) {
1220
+ if (JS_DefinePropertyValue(ctx, arr, __atom_from_idx(i), stack[base + i], JS_PROP_C_W_E | JS_PROP_THROW) < 0) {
1221
+ err = true;
1222
+ break;
1223
+ }
1224
+ }
1225
+ if (err) {
1226
+ flow = 1 /* Flow.EXCEPTION */;
1227
+ break;
1228
+ }
1229
+ sp -= call_argc;
1230
+ stack[sp++] = arr;
1231
+ break;
1232
+ }
1233
+ case 39 /* OP.apply */: {
1234
+ const magic = get_u16(buf, pc);
1235
+ pc += 2;
1236
+ sf.cur_pc = pc;
1237
+ ret_val = js_function_apply(ctx, stack[sp - 3], [stack[sp - 2], stack[sp - 1]], magic);
1238
+ if (JS_IsException(ret_val)) {
1239
+ flow = 1 /* Flow.EXCEPTION */;
1240
+ break;
1241
+ }
1242
+ sp -= 3;
1243
+ stack[sp++] = ret_val;
1244
+ break;
1245
+ }
1246
+ case 40 /* OP.return */:
1247
+ ret_val = stack[--sp];
1248
+ flow = 2 /* Flow.DONE */;
1249
+ break main;
1250
+ case 41 /* OP.return_undef */:
1251
+ ret_val = undefined;
1252
+ flow = 2 /* Flow.DONE */;
1253
+ break main;
1254
+ case 42 /* OP.check_ctor_return */:
1255
+ /* return TRUE if 'this' should be returned */
1256
+ if (!JS_IsObject(stack[sp - 1])) {
1257
+ if (!JS_IsUndefined(stack[sp - 1])) {
1258
+ JS_ThrowTypeError(caller_ctx, 'derived class constructor must return an object or undefined');
1259
+ flow = 1 /* Flow.EXCEPTION */;
1260
+ break;
1261
+ }
1262
+ stack[sp] = true;
1263
+ }
1264
+ else {
1265
+ stack[sp] = false;
1266
+ }
1267
+ sp++;
1268
+ break;
1269
+ case 43 /* OP.check_ctor */:
1270
+ if (JS_IsUndefined(new_target)) {
1271
+ JS_ThrowTypeError(ctx, "class constructors must be invoked with 'new'");
1272
+ flow = 1 /* Flow.EXCEPTION */;
1273
+ break;
1274
+ }
1275
+ break;
1276
+ case 44 /* OP.init_ctor */: {
1277
+ sf.cur_pc = pc;
1278
+ if (JS_IsUndefined(new_target)) {
1279
+ JS_ThrowTypeError(ctx, "class constructors must be invoked with 'new'");
1280
+ flow = 1 /* Flow.EXCEPTION */;
1281
+ break;
1282
+ }
1283
+ const sup = JS_GetPrototype(ctx, sf.cur_func);
1284
+ if (JS_IsException(sup)) {
1285
+ flow = 1 /* Flow.EXCEPTION */;
1286
+ break;
1287
+ }
1288
+ const ret = JS_CallConstructor2(ctx, sup, new_target, argv.slice(0, argc));
1289
+ if (JS_IsException(ret)) {
1290
+ flow = 1 /* Flow.EXCEPTION */;
1291
+ break;
1292
+ }
1293
+ stack[sp++] = ret;
1294
+ break;
1295
+ }
1296
+ case 45 /* OP.check_brand */: {
1297
+ const ret = JS_CheckBrand(ctx, stack[sp - 2], stack[sp - 1]);
1298
+ if (ret < 0) {
1299
+ flow = 1 /* Flow.EXCEPTION */;
1300
+ break;
1301
+ }
1302
+ if (!ret) {
1303
+ JS_ThrowTypeError(ctx, 'invalid brand on object');
1304
+ flow = 1 /* Flow.EXCEPTION */;
1305
+ break;
1306
+ }
1307
+ break;
1308
+ }
1309
+ case 46 /* OP.add_brand */:
1310
+ if (JS_AddBrand(ctx, stack[sp - 2], stack[sp - 1]) < 0) {
1311
+ flow = 1 /* Flow.EXCEPTION */;
1312
+ break;
1313
+ }
1314
+ sp -= 2;
1315
+ break;
1316
+ case 48 /* OP.throw */:
1317
+ JS_Throw(ctx, stack[--sp]);
1318
+ flow = 1 /* Flow.EXCEPTION */;
1319
+ break;
1320
+ case 49 /* OP.throw_error */: {
1321
+ const atom = get_u32(buf, pc);
1322
+ const type = buf[pc + 4];
1323
+ pc += 5;
1324
+ if (type === JS_THROW_VAR_RO)
1325
+ JS_ThrowTypeErrorReadOnly(ctx, JS_PROP_THROW, atom);
1326
+ else if (type === JS_THROW_VAR_REDECL)
1327
+ JS_ThrowSyntaxErrorAtom(ctx, "redeclaration of '%s'", atom);
1328
+ else if (type === JS_THROW_VAR_UNINITIALIZED)
1329
+ JS_ThrowReferenceErrorUninitialized(ctx, atom);
1330
+ else if (type === JS_THROW_ERROR_DELETE_SUPER)
1331
+ JS_ThrowReferenceError(ctx, "unsupported reference to 'super'");
1332
+ else if (type === JS_THROW_ERROR_ITERATOR_THROW)
1333
+ JS_ThrowTypeError(ctx, 'iterator does not have a throw method');
1334
+ else
1335
+ JS_ThrowInternalError(ctx, 'invalid throw var type ' + type);
1336
+ flow = 1 /* Flow.EXCEPTION */;
1337
+ break;
1338
+ }
1339
+ case 50 /* OP.eval */: {
1340
+ const call_argc = get_u16(buf, pc);
1341
+ const scope_idx = get_u16(buf, pc + 2) + ARG_SCOPE_END;
1342
+ pc += 4;
1343
+ const call_argv = stack.slice(sp - call_argc, sp);
1344
+ sf.cur_pc = pc;
1345
+ const fn = stack[sp - call_argc - 1];
1346
+ if (fn !== undefined && fn === ctx.eval_obj) {
1347
+ const obj = call_argc >= 1 ? call_argv[0] : undefined;
1348
+ ret_val = JS_EvalObject(ctx, this_obj, obj, JS_EVAL_TYPE_DIRECT | ((sf.js_mode & JS_MODE_STRICT) ? JS_EVAL_FLAG_STRICT : 0), scope_idx);
1349
+ }
1350
+ else {
1351
+ ret_val = js_call_internal(ctx, fn, undefined, undefined, call_argv, 0, null);
1352
+ }
1353
+ if (JS_IsException(ret_val)) {
1354
+ flow = 1 /* Flow.EXCEPTION */;
1355
+ break;
1356
+ }
1357
+ sp -= call_argc + 1;
1358
+ stack[sp++] = ret_val;
1359
+ break;
1360
+ }
1361
+ case 51 /* OP.apply_eval */: {
1362
+ const scope_idx = get_u16(buf, pc) + ARG_SCOPE_END;
1363
+ pc += 2;
1364
+ sf.cur_pc = pc;
1365
+ const tab = build_arg_list(ctx, stack[sp - 1]);
1366
+ if (!tab) {
1367
+ flow = 1 /* Flow.EXCEPTION */;
1368
+ break;
1369
+ }
1370
+ const fn = stack[sp - 2];
1371
+ if (fn !== undefined && fn === ctx.eval_obj) {
1372
+ const obj = tab.length >= 1 ? tab[0] : undefined;
1373
+ ret_val = JS_EvalObject(ctx, this_obj, obj, JS_EVAL_TYPE_DIRECT | ((sf.js_mode & JS_MODE_STRICT) ? JS_EVAL_FLAG_STRICT : 0), scope_idx);
1374
+ }
1375
+ else {
1376
+ ret_val = JS_Call(ctx, fn, undefined, tab);
1377
+ }
1378
+ if (JS_IsException(ret_val)) {
1379
+ flow = 1 /* Flow.EXCEPTION */;
1380
+ break;
1381
+ }
1382
+ sp -= 2;
1383
+ stack[sp++] = ret_val;
1384
+ break;
1385
+ }
1386
+ case 52 /* OP.regexp */: {
1387
+ sf.cur_pc = pc;
1388
+ if (!hooks.js_regexp_constructor_internal) {
1389
+ JS_ThrowInternalError(ctx, 'RegExp is not available');
1390
+ flow = 1 /* Flow.EXCEPTION */;
1391
+ break;
1392
+ }
1393
+ const v = hooks.js_regexp_constructor_internal(ctx, undefined, stack[sp - 2], stack[sp - 1]);
1394
+ if (JS_IsException(v)) {
1395
+ flow = 1 /* Flow.EXCEPTION */;
1396
+ break;
1397
+ }
1398
+ stack[sp - 2] = v;
1399
+ sp--;
1400
+ break;
1401
+ }
1402
+ case 53 /* OP.get_super */: {
1403
+ sf.cur_pc = pc;
1404
+ const proto = JS_GetPrototype(ctx, stack[sp - 1]);
1405
+ if (JS_IsException(proto)) {
1406
+ flow = 1 /* Flow.EXCEPTION */;
1407
+ break;
1408
+ }
1409
+ stack[sp - 1] = proto;
1410
+ break;
1411
+ }
1412
+ case 54 /* OP.import */:
1413
+ sf.cur_pc = pc;
1414
+ JS_ThrowTypeError(ctx, 'dynamic import is not supported');
1415
+ flow = 1 /* Flow.EXCEPTION */;
1416
+ break;
1417
+ case 55 /* OP.check_var */: {
1418
+ const atom = get_u32(buf, pc);
1419
+ pc += 4;
1420
+ sf.cur_pc = pc;
1421
+ const ret = JS_CheckGlobalVar(ctx, atom);
1422
+ if (ret < 0) {
1423
+ flow = 1 /* Flow.EXCEPTION */;
1424
+ break;
1425
+ }
1426
+ stack[sp++] = ret !== 0;
1427
+ break;
1428
+ }
1429
+ case 56 /* OP.get_var_undef */:
1430
+ case 57 /* OP.get_var */: {
1431
+ const atom = get_u32(buf, pc);
1432
+ pc += 4;
1433
+ sf.cur_pc = pc;
1434
+ const val = JS_GetGlobalVar(ctx, atom, opcode - 56 /* OP.get_var_undef */);
1435
+ if (JS_IsException(val)) {
1436
+ flow = 1 /* Flow.EXCEPTION */;
1437
+ break;
1438
+ }
1439
+ stack[sp++] = val;
1440
+ break;
1441
+ }
1442
+ case 58 /* OP.put_var */:
1443
+ case 59 /* OP.put_var_init */: {
1444
+ const atom = get_u32(buf, pc);
1445
+ pc += 4;
1446
+ sf.cur_pc = pc;
1447
+ const ret = JS_SetGlobalVar(ctx, atom, stack[sp - 1], opcode - 58 /* OP.put_var */);
1448
+ sp--;
1449
+ if (ret < 0) {
1450
+ flow = 1 /* Flow.EXCEPTION */;
1451
+ break;
1452
+ }
1453
+ break;
1454
+ }
1455
+ case 60 /* OP.put_var_strict */: {
1456
+ const atom = get_u32(buf, pc);
1457
+ pc += 4;
1458
+ sf.cur_pc = pc;
1459
+ /* stack[sp-2] is JS_TRUE or JS_FALSE */
1460
+ if (!stack[sp - 2]) {
1461
+ JS_ThrowReferenceErrorNotDefined(ctx, atom);
1462
+ flow = 1 /* Flow.EXCEPTION */;
1463
+ break;
1464
+ }
1465
+ const ret = JS_SetGlobalVar(ctx, atom, stack[sp - 1], 2);
1466
+ sp -= 2;
1467
+ if (ret < 0) {
1468
+ flow = 1 /* Flow.EXCEPTION */;
1469
+ break;
1470
+ }
1471
+ break;
1472
+ }
1473
+ case 64 /* OP.check_define_var */: {
1474
+ const atom = get_u32(buf, pc);
1475
+ const fl = buf[pc + 4];
1476
+ pc += 5;
1477
+ sf.cur_pc = pc;
1478
+ if (JS_CheckDefineGlobalVar(ctx, atom, fl)) {
1479
+ flow = 1 /* Flow.EXCEPTION */;
1480
+ break;
1481
+ }
1482
+ break;
1483
+ }
1484
+ case 63 /* OP.define_var */: {
1485
+ const atom = get_u32(buf, pc);
1486
+ const fl = buf[pc + 4];
1487
+ pc += 5;
1488
+ sf.cur_pc = pc;
1489
+ if (JS_DefineGlobalVar(ctx, atom, fl) < 0) {
1490
+ flow = 1 /* Flow.EXCEPTION */;
1491
+ break;
1492
+ }
1493
+ break;
1494
+ }
1495
+ case 65 /* OP.define_func */: {
1496
+ const atom = get_u32(buf, pc);
1497
+ const fl = buf[pc + 4];
1498
+ pc += 5;
1499
+ sf.cur_pc = pc;
1500
+ if (JS_DefineGlobalFunction(ctx, atom, stack[sp - 1], fl) < 0) {
1501
+ flow = 1 /* Flow.EXCEPTION */;
1502
+ break;
1503
+ }
1504
+ sp--;
1505
+ break;
1506
+ }
1507
+ case 89 /* OP.get_loc */: {
1508
+ const idx = get_u16(buf, pc);
1509
+ pc += 2;
1510
+ stack[sp++] = var_buf[idx];
1511
+ break;
1512
+ }
1513
+ case 90 /* OP.put_loc */: {
1514
+ const idx = get_u16(buf, pc);
1515
+ pc += 2;
1516
+ var_buf[idx] = stack[--sp];
1517
+ break;
1518
+ }
1519
+ case 91 /* OP.set_loc */: {
1520
+ const idx = get_u16(buf, pc);
1521
+ pc += 2;
1522
+ var_buf[idx] = stack[sp - 1];
1523
+ break;
1524
+ }
1525
+ case 92 /* OP.get_arg */: {
1526
+ const idx = get_u16(buf, pc);
1527
+ pc += 2;
1528
+ stack[sp++] = arg_buf[idx];
1529
+ break;
1530
+ }
1531
+ case 93 /* OP.put_arg */: {
1532
+ const idx = get_u16(buf, pc);
1533
+ pc += 2;
1534
+ arg_buf[idx] = stack[--sp];
1535
+ break;
1536
+ }
1537
+ case 94 /* OP.set_arg */: {
1538
+ const idx = get_u16(buf, pc);
1539
+ pc += 2;
1540
+ arg_buf[idx] = stack[sp - 1];
1541
+ break;
1542
+ }
1543
+ case 196 /* OP.get_loc8 */:
1544
+ stack[sp++] = var_buf[buf[pc++]];
1545
+ break;
1546
+ case 197 /* OP.put_loc8 */:
1547
+ var_buf[buf[pc++]] = stack[--sp];
1548
+ break;
1549
+ case 198 /* OP.set_loc8 */:
1550
+ var_buf[buf[pc++]] = stack[sp - 1];
1551
+ break;
1552
+ case 199 /* OP.get_loc0 */:
1553
+ stack[sp++] = var_buf[0];
1554
+ break;
1555
+ case 200 /* OP.get_loc1 */:
1556
+ stack[sp++] = var_buf[1];
1557
+ break;
1558
+ case 201 /* OP.get_loc2 */:
1559
+ stack[sp++] = var_buf[2];
1560
+ break;
1561
+ case 202 /* OP.get_loc3 */:
1562
+ stack[sp++] = var_buf[3];
1563
+ break;
1564
+ case 203 /* OP.put_loc0 */:
1565
+ var_buf[0] = stack[--sp];
1566
+ break;
1567
+ case 204 /* OP.put_loc1 */:
1568
+ var_buf[1] = stack[--sp];
1569
+ break;
1570
+ case 205 /* OP.put_loc2 */:
1571
+ var_buf[2] = stack[--sp];
1572
+ break;
1573
+ case 206 /* OP.put_loc3 */:
1574
+ var_buf[3] = stack[--sp];
1575
+ break;
1576
+ case 207 /* OP.set_loc0 */:
1577
+ var_buf[0] = stack[sp - 1];
1578
+ break;
1579
+ case 208 /* OP.set_loc1 */:
1580
+ var_buf[1] = stack[sp - 1];
1581
+ break;
1582
+ case 209 /* OP.set_loc2 */:
1583
+ var_buf[2] = stack[sp - 1];
1584
+ break;
1585
+ case 210 /* OP.set_loc3 */:
1586
+ var_buf[3] = stack[sp - 1];
1587
+ break;
1588
+ case 211 /* OP.get_arg0 */:
1589
+ stack[sp++] = arg_buf[0];
1590
+ break;
1591
+ case 212 /* OP.get_arg1 */:
1592
+ stack[sp++] = arg_buf[1];
1593
+ break;
1594
+ case 213 /* OP.get_arg2 */:
1595
+ stack[sp++] = arg_buf[2];
1596
+ break;
1597
+ case 214 /* OP.get_arg3 */:
1598
+ stack[sp++] = arg_buf[3];
1599
+ break;
1600
+ case 215 /* OP.put_arg0 */:
1601
+ arg_buf[0] = stack[--sp];
1602
+ break;
1603
+ case 216 /* OP.put_arg1 */:
1604
+ arg_buf[1] = stack[--sp];
1605
+ break;
1606
+ case 217 /* OP.put_arg2 */:
1607
+ arg_buf[2] = stack[--sp];
1608
+ break;
1609
+ case 218 /* OP.put_arg3 */:
1610
+ arg_buf[3] = stack[--sp];
1611
+ break;
1612
+ case 219 /* OP.set_arg0 */:
1613
+ arg_buf[0] = stack[sp - 1];
1614
+ break;
1615
+ case 220 /* OP.set_arg1 */:
1616
+ arg_buf[1] = stack[sp - 1];
1617
+ break;
1618
+ case 221 /* OP.set_arg2 */:
1619
+ arg_buf[2] = stack[sp - 1];
1620
+ break;
1621
+ case 222 /* OP.set_arg3 */:
1622
+ arg_buf[3] = stack[sp - 1];
1623
+ break;
1624
+ case 223 /* OP.get_var_ref0 */:
1625
+ stack[sp++] = var_refs[0].get();
1626
+ break;
1627
+ case 224 /* OP.get_var_ref1 */:
1628
+ stack[sp++] = var_refs[1].get();
1629
+ break;
1630
+ case 225 /* OP.get_var_ref2 */:
1631
+ stack[sp++] = var_refs[2].get();
1632
+ break;
1633
+ case 226 /* OP.get_var_ref3 */:
1634
+ stack[sp++] = var_refs[3].get();
1635
+ break;
1636
+ case 227 /* OP.put_var_ref0 */:
1637
+ var_refs[0].set(stack[--sp]);
1638
+ break;
1639
+ case 228 /* OP.put_var_ref1 */:
1640
+ var_refs[1].set(stack[--sp]);
1641
+ break;
1642
+ case 229 /* OP.put_var_ref2 */:
1643
+ var_refs[2].set(stack[--sp]);
1644
+ break;
1645
+ case 230 /* OP.put_var_ref3 */:
1646
+ var_refs[3].set(stack[--sp]);
1647
+ break;
1648
+ case 231 /* OP.set_var_ref0 */:
1649
+ var_refs[0].set(stack[sp - 1]);
1650
+ break;
1651
+ case 232 /* OP.set_var_ref1 */:
1652
+ var_refs[1].set(stack[sp - 1]);
1653
+ break;
1654
+ case 233 /* OP.set_var_ref2 */:
1655
+ var_refs[2].set(stack[sp - 1]);
1656
+ break;
1657
+ case 234 /* OP.set_var_ref3 */:
1658
+ var_refs[3].set(stack[sp - 1]);
1659
+ break;
1660
+ case 95 /* OP.get_var_ref */: {
1661
+ const idx = get_u16(buf, pc);
1662
+ pc += 2;
1663
+ stack[sp++] = var_refs[idx].get();
1664
+ break;
1665
+ }
1666
+ case 96 /* OP.put_var_ref */: {
1667
+ const idx = get_u16(buf, pc);
1668
+ pc += 2;
1669
+ var_refs[idx].set(stack[--sp]);
1670
+ break;
1671
+ }
1672
+ case 97 /* OP.set_var_ref */: {
1673
+ const idx = get_u16(buf, pc);
1674
+ pc += 2;
1675
+ var_refs[idx].set(stack[sp - 1]);
1676
+ break;
1677
+ }
1678
+ case 103 /* OP.get_var_ref_check */: {
1679
+ const idx = get_u16(buf, pc);
1680
+ pc += 2;
1681
+ const val = var_refs[idx].get();
1682
+ if (JS_IsUninitialized(val)) {
1683
+ JS_ThrowReferenceErrorUninitialized2(ctx, b, idx, true);
1684
+ flow = 1 /* Flow.EXCEPTION */;
1685
+ break;
1686
+ }
1687
+ stack[sp++] = val;
1688
+ break;
1689
+ }
1690
+ case 104 /* OP.put_var_ref_check */: {
1691
+ const idx = get_u16(buf, pc);
1692
+ pc += 2;
1693
+ if (JS_IsUninitialized(var_refs[idx].get())) {
1694
+ JS_ThrowReferenceErrorUninitialized2(ctx, b, idx, true);
1695
+ flow = 1 /* Flow.EXCEPTION */;
1696
+ break;
1697
+ }
1698
+ var_refs[idx].set(stack[--sp]);
1699
+ break;
1700
+ }
1701
+ case 105 /* OP.put_var_ref_check_init */: {
1702
+ const idx = get_u16(buf, pc);
1703
+ pc += 2;
1704
+ if (!JS_IsUninitialized(var_refs[idx].get())) {
1705
+ JS_ThrowReferenceErrorUninitialized2(ctx, b, idx, true);
1706
+ flow = 1 /* Flow.EXCEPTION */;
1707
+ break;
1708
+ }
1709
+ var_refs[idx].set(stack[--sp]);
1710
+ break;
1711
+ }
1712
+ case 98 /* OP.set_loc_uninitialized */: {
1713
+ const idx = get_u16(buf, pc);
1714
+ pc += 2;
1715
+ var_buf[idx] = JS_UNINITIALIZED;
1716
+ break;
1717
+ }
1718
+ case 99 /* OP.get_loc_check */: {
1719
+ const idx = get_u16(buf, pc);
1720
+ pc += 2;
1721
+ if (JS_IsUninitialized(var_buf[idx])) {
1722
+ JS_ThrowReferenceErrorUninitialized2(ctx, b, idx, false);
1723
+ flow = 1 /* Flow.EXCEPTION */;
1724
+ break;
1725
+ }
1726
+ stack[sp++] = var_buf[idx];
1727
+ break;
1728
+ }
1729
+ case 102 /* OP.get_loc_checkthis */: {
1730
+ const idx = get_u16(buf, pc);
1731
+ pc += 2;
1732
+ if (JS_IsUninitialized(var_buf[idx])) {
1733
+ JS_ThrowReferenceErrorUninitialized2(caller_ctx, b, idx, false);
1734
+ flow = 1 /* Flow.EXCEPTION */;
1735
+ break;
1736
+ }
1737
+ stack[sp++] = var_buf[idx];
1738
+ break;
1739
+ }
1740
+ case 100 /* OP.put_loc_check */: {
1741
+ const idx = get_u16(buf, pc);
1742
+ pc += 2;
1743
+ if (JS_IsUninitialized(var_buf[idx])) {
1744
+ JS_ThrowReferenceErrorUninitialized2(ctx, b, idx, false);
1745
+ flow = 1 /* Flow.EXCEPTION */;
1746
+ break;
1747
+ }
1748
+ var_buf[idx] = stack[--sp];
1749
+ break;
1750
+ }
1751
+ case 101 /* OP.put_loc_check_init */: {
1752
+ const idx = get_u16(buf, pc);
1753
+ pc += 2;
1754
+ if (!JS_IsUninitialized(var_buf[idx])) {
1755
+ JS_ThrowReferenceError(ctx, "'this' can be initialized only once");
1756
+ flow = 1 /* Flow.EXCEPTION */;
1757
+ break;
1758
+ }
1759
+ var_buf[idx] = stack[--sp];
1760
+ break;
1761
+ }
1762
+ case 106 /* OP.close_loc */: {
1763
+ const idx = get_u16(buf, pc);
1764
+ pc += 2;
1765
+ close_lexical_var(ctx, sf, idx);
1766
+ break;
1767
+ }
1768
+ case 122 /* OP.make_loc_ref */:
1769
+ case 123 /* OP.make_arg_ref */:
1770
+ case 124 /* OP.make_var_ref_ref */: {
1771
+ const atom = get_u32(buf, pc);
1772
+ const idx = get_u16(buf, pc + 4);
1773
+ pc += 6;
1774
+ /* internal reference object (never visible to guest code): an
1775
+ accessor property aliasing the variable */
1776
+ const obj = Object.create(null);
1777
+ let var_ref;
1778
+ if (opcode === 124 /* OP.make_var_ref_ref */)
1779
+ var_ref = var_refs[idx];
1780
+ else
1781
+ var_ref = get_var_ref(ctx, sf, idx, opcode === 123 /* OP.make_arg_ref */);
1782
+ Reflect.defineProperty(obj, JS_AtomToKey(ctx, atom), {
1783
+ get: () => var_ref.get(), set: (v) => { var_ref.set(v); }, enumerable: true, configurable: true,
1784
+ });
1785
+ stack[sp++] = obj;
1786
+ stack[sp++] = JS_AtomToValue(ctx, atom);
1787
+ break;
1788
+ }
1789
+ case 125 /* OP.make_var_ref */: {
1790
+ const atom = get_u32(buf, pc);
1791
+ pc += 4;
1792
+ sf.cur_pc = pc;
1793
+ const r = JS_GetGlobalVarRef(ctx, atom);
1794
+ if (!r) {
1795
+ flow = 1 /* Flow.EXCEPTION */;
1796
+ break;
1797
+ }
1798
+ stack[sp++] = r[0];
1799
+ stack[sp++] = r[1];
1800
+ break;
1801
+ }
1802
+ case 109 /* OP.goto */: {
1803
+ const diff = get_i32(buf, pc);
1804
+ pc += diff;
1805
+ if (js_poll_interrupts(ctx)) {
1806
+ flow = 1 /* Flow.EXCEPTION */;
1807
+ break;
1808
+ }
1809
+ if (diff < 0 && jit_hooks.osr !== null && ++b.loop_count >= jit_osr_threshold && gen_state === null) {
1810
+ const r = jit_hooks.osr(ctx, func_obj, b, sf, pc, sp);
1811
+ if (r !== JIT_NOT_COMPILED) {
1812
+ ret_val = r;
1813
+ flow = 2 /* Flow.DONE */;
1814
+ break main;
1815
+ }
1816
+ }
1817
+ break;
1818
+ }
1819
+ case 239 /* OP.goto16 */: {
1820
+ const diff = get_i16(buf, pc);
1821
+ pc += diff;
1822
+ if (js_poll_interrupts(ctx)) {
1823
+ flow = 1 /* Flow.EXCEPTION */;
1824
+ break;
1825
+ }
1826
+ if (diff < 0 && jit_hooks.osr !== null && ++b.loop_count >= jit_osr_threshold && gen_state === null) {
1827
+ const r = jit_hooks.osr(ctx, func_obj, b, sf, pc, sp);
1828
+ if (r !== JIT_NOT_COMPILED) {
1829
+ ret_val = r;
1830
+ flow = 2 /* Flow.DONE */;
1831
+ break main;
1832
+ }
1833
+ }
1834
+ break;
1835
+ }
1836
+ case 238 /* OP.goto8 */: {
1837
+ const diff = get_i8(buf, pc);
1838
+ pc += diff;
1839
+ if (js_poll_interrupts(ctx)) {
1840
+ flow = 1 /* Flow.EXCEPTION */;
1841
+ break;
1842
+ }
1843
+ if (diff < 0 && jit_hooks.osr !== null && ++b.loop_count >= jit_osr_threshold && gen_state === null) {
1844
+ const r = jit_hooks.osr(ctx, func_obj, b, sf, pc, sp);
1845
+ if (r !== JIT_NOT_COMPILED) {
1846
+ ret_val = r;
1847
+ flow = 2 /* Flow.DONE */;
1848
+ break main;
1849
+ }
1850
+ }
1851
+ break;
1852
+ }
1853
+ case 108 /* OP.if_true */: {
1854
+ const op1 = stack[--sp];
1855
+ pc += 4;
1856
+ const res = typeof op1 === 'boolean' ? op1 : JS_ToBoolFree(ctx, op1);
1857
+ if (res) {
1858
+ const diff = get_i32(buf, pc - 4) - 4;
1859
+ pc += diff;
1860
+ if (diff < 0 && jit_hooks.osr !== null && ++b.loop_count >= jit_osr_threshold && gen_state === null) {
1861
+ if (js_poll_interrupts(ctx)) {
1862
+ flow = 1 /* Flow.EXCEPTION */;
1863
+ break;
1864
+ }
1865
+ const r = jit_hooks.osr(ctx, func_obj, b, sf, pc, sp);
1866
+ if (r !== JIT_NOT_COMPILED) {
1867
+ ret_val = r;
1868
+ flow = 2 /* Flow.DONE */;
1869
+ break main;
1870
+ }
1871
+ }
1872
+ }
1873
+ if (js_poll_interrupts(ctx)) {
1874
+ flow = 1 /* Flow.EXCEPTION */;
1875
+ break;
1876
+ }
1877
+ break;
1878
+ }
1879
+ case 107 /* OP.if_false */: {
1880
+ const op1 = stack[--sp];
1881
+ pc += 4;
1882
+ const res = typeof op1 === 'boolean' ? op1 : JS_ToBoolFree(ctx, op1);
1883
+ if (!res) {
1884
+ const diff = get_i32(buf, pc - 4) - 4;
1885
+ pc += diff;
1886
+ if (diff < 0 && jit_hooks.osr !== null && ++b.loop_count >= jit_osr_threshold && gen_state === null) {
1887
+ if (js_poll_interrupts(ctx)) {
1888
+ flow = 1 /* Flow.EXCEPTION */;
1889
+ break;
1890
+ }
1891
+ const r = jit_hooks.osr(ctx, func_obj, b, sf, pc, sp);
1892
+ if (r !== JIT_NOT_COMPILED) {
1893
+ ret_val = r;
1894
+ flow = 2 /* Flow.DONE */;
1895
+ break main;
1896
+ }
1897
+ }
1898
+ }
1899
+ if (js_poll_interrupts(ctx)) {
1900
+ flow = 1 /* Flow.EXCEPTION */;
1901
+ break;
1902
+ }
1903
+ break;
1904
+ }
1905
+ case 237 /* OP.if_true8 */: {
1906
+ const op1 = stack[--sp];
1907
+ pc += 1;
1908
+ const res = typeof op1 === 'boolean' ? op1 : JS_ToBoolFree(ctx, op1);
1909
+ if (res) {
1910
+ const diff = get_i8(buf, pc - 1) - 1;
1911
+ pc += diff;
1912
+ if (diff < 0 && jit_hooks.osr !== null && ++b.loop_count >= jit_osr_threshold && gen_state === null) {
1913
+ if (js_poll_interrupts(ctx)) {
1914
+ flow = 1 /* Flow.EXCEPTION */;
1915
+ break;
1916
+ }
1917
+ const r = jit_hooks.osr(ctx, func_obj, b, sf, pc, sp);
1918
+ if (r !== JIT_NOT_COMPILED) {
1919
+ ret_val = r;
1920
+ flow = 2 /* Flow.DONE */;
1921
+ break main;
1922
+ }
1923
+ }
1924
+ }
1925
+ if (js_poll_interrupts(ctx)) {
1926
+ flow = 1 /* Flow.EXCEPTION */;
1927
+ break;
1928
+ }
1929
+ break;
1930
+ }
1931
+ case 236 /* OP.if_false8 */: {
1932
+ const op1 = stack[--sp];
1933
+ pc += 1;
1934
+ const res = typeof op1 === 'boolean' ? op1 : JS_ToBoolFree(ctx, op1);
1935
+ if (!res) {
1936
+ const diff = get_i8(buf, pc - 1) - 1;
1937
+ pc += diff;
1938
+ if (diff < 0 && jit_hooks.osr !== null && ++b.loop_count >= jit_osr_threshold && gen_state === null) {
1939
+ if (js_poll_interrupts(ctx)) {
1940
+ flow = 1 /* Flow.EXCEPTION */;
1941
+ break;
1942
+ }
1943
+ const r = jit_hooks.osr(ctx, func_obj, b, sf, pc, sp);
1944
+ if (r !== JIT_NOT_COMPILED) {
1945
+ ret_val = r;
1946
+ flow = 2 /* Flow.DONE */;
1947
+ break main;
1948
+ }
1949
+ }
1950
+ }
1951
+ if (js_poll_interrupts(ctx)) {
1952
+ flow = 1 /* Flow.EXCEPTION */;
1953
+ break;
1954
+ }
1955
+ break;
1956
+ }
1957
+ case 110 /* OP.catch */: {
1958
+ const diff = get_i32(buf, pc);
1959
+ stack[sp++] = JS_NewCatchOffset(pc + diff);
1960
+ pc += 4;
1961
+ break;
1962
+ }
1963
+ case 111 /* OP.gosub */: {
1964
+ const diff = get_i32(buf, pc);
1965
+ stack[sp++] = pc + 4;
1966
+ pc += diff;
1967
+ break;
1968
+ }
1969
+ case 112 /* OP.ret */: {
1970
+ const op1 = stack[sp - 1];
1971
+ if (typeof op1 !== 'number' || !Number.isInteger(op1) || op1 < 0 || op1 >= b.byte_code_len) {
1972
+ JS_ThrowInternalError(ctx, 'invalid ret value');
1973
+ flow = 1 /* Flow.EXCEPTION */;
1974
+ break;
1975
+ }
1976
+ sp--;
1977
+ pc = op1;
1978
+ break;
1979
+ }
1980
+ case 126 /* OP.for_in_start */: {
1981
+ sf.cur_pc = pc;
1982
+ const v = build_for_in_iterator(ctx, stack[sp - 1]);
1983
+ if (JS_IsException(v)) {
1984
+ flow = 1 /* Flow.EXCEPTION */;
1985
+ break;
1986
+ }
1987
+ stack[sp - 1] = v;
1988
+ break;
1989
+ }
1990
+ case 129 /* OP.for_in_next */: {
1991
+ sf.cur_pc = pc;
1992
+ const pdone = { done: 0 };
1993
+ const v = js_for_in_next(ctx, stack[sp - 1], pdone);
1994
+ if (JS_IsException(v)) {
1995
+ flow = 1 /* Flow.EXCEPTION */;
1996
+ break;
1997
+ }
1998
+ stack[sp++] = v;
1999
+ stack[sp++] = pdone.done !== 0;
2000
+ break;
2001
+ }
2002
+ case 127 /* OP.for_of_start */:
2003
+ sf.cur_pc = pc;
2004
+ if (js_for_of_start(ctx, stack, sp, false)) {
2005
+ flow = 1 /* Flow.EXCEPTION */;
2006
+ break;
2007
+ }
2008
+ sp += 1;
2009
+ stack[sp++] = JS_NewCatchOffset(0);
2010
+ break;
2011
+ case 130 /* OP.for_of_next */: {
2012
+ const offset = -3 - buf[pc];
2013
+ pc += 1;
2014
+ sf.cur_pc = pc;
2015
+ if (js_for_of_next(ctx, stack, sp, offset)) {
2016
+ flow = 1 /* Flow.EXCEPTION */;
2017
+ break;
2018
+ }
2019
+ sp += 2;
2020
+ break;
2021
+ }
2022
+ case 131 /* OP.for_await_of_next */:
2023
+ sf.cur_pc = pc;
2024
+ if (js_for_await_of_next(ctx, stack, sp)) {
2025
+ flow = 1 /* Flow.EXCEPTION */;
2026
+ break;
2027
+ }
2028
+ sp++;
2029
+ break;
2030
+ case 128 /* OP.for_await_of_start */:
2031
+ sf.cur_pc = pc;
2032
+ if (js_for_of_start(ctx, stack, sp, true)) {
2033
+ flow = 1 /* Flow.EXCEPTION */;
2034
+ break;
2035
+ }
2036
+ sp += 1;
2037
+ stack[sp++] = JS_NewCatchOffset(0);
2038
+ break;
2039
+ case 133 /* OP.iterator_get_value_done */:
2040
+ sf.cur_pc = pc;
2041
+ if (js_iterator_get_value_done(ctx, stack, sp)) {
2042
+ flow = 1 /* Flow.EXCEPTION */;
2043
+ break;
2044
+ }
2045
+ sp += 1;
2046
+ break;
2047
+ case 132 /* OP.iterator_check_object */:
2048
+ if (!JS_IsObject(stack[sp - 1])) {
2049
+ JS_ThrowTypeError(ctx, 'iterator must return an object');
2050
+ flow = 1 /* Flow.EXCEPTION */;
2051
+ break;
2052
+ }
2053
+ break;
2054
+ case 134 /* OP.iterator_close */:
2055
+ /* iter_obj next catch_offset -> */
2056
+ sp--; /* drop the catch offset to avoid getting caught by exception */
2057
+ sp--; /* drop the next method */
2058
+ if (!JS_IsUndefined(stack[sp - 1])) {
2059
+ sf.cur_pc = pc;
2060
+ if (JS_IteratorClose(ctx, stack[sp - 1], false)) {
2061
+ flow = 1 /* Flow.EXCEPTION */;
2062
+ break;
2063
+ }
2064
+ }
2065
+ sp--;
2066
+ break;
2067
+ case 113 /* OP.nip_catch */: {
2068
+ /* catch_offset ... ret_val -> ret_eval */
2069
+ const rv = stack[--sp];
2070
+ while (sp > 0 && !JS_IsCatchOffset(stack[sp - 1]))
2071
+ sp--;
2072
+ if (sp === 0) {
2073
+ JS_ThrowInternalError(ctx, 'nip_catch');
2074
+ flow = 1 /* Flow.EXCEPTION */;
2075
+ break;
2076
+ }
2077
+ stack[sp - 1] = rv;
2078
+ break;
2079
+ }
2080
+ case 135 /* OP.iterator_next */: {
2081
+ /* stack: iter_obj next catch_offset val */
2082
+ sf.cur_pc = pc;
2083
+ const ret = JS_Call(ctx, stack[sp - 3], stack[sp - 4], [stack[sp - 1]]);
2084
+ if (JS_IsException(ret)) {
2085
+ flow = 1 /* Flow.EXCEPTION */;
2086
+ break;
2087
+ }
2088
+ stack[sp - 1] = ret;
2089
+ break;
2090
+ }
2091
+ case 136 /* OP.iterator_call */: {
2092
+ /* stack: iter_obj next catch_offset val */
2093
+ const fl = buf[pc++];
2094
+ sf.cur_pc = pc;
2095
+ const method = JS_GetProperty(ctx, stack[sp - 4], (fl & 1) ? JS_ATOM_throw : JS_ATOM_return);
2096
+ if (JS_IsException(method)) {
2097
+ flow = 1 /* Flow.EXCEPTION */;
2098
+ break;
2099
+ }
2100
+ let ret_flag;
2101
+ if (method === undefined || method === null) {
2102
+ ret_flag = true;
2103
+ }
2104
+ else {
2105
+ let ret;
2106
+ if (fl & 2)
2107
+ ret = JS_CallFree(ctx, method, stack[sp - 4], []);
2108
+ else
2109
+ ret = JS_CallFree(ctx, method, stack[sp - 4], [stack[sp - 1]]);
2110
+ if (JS_IsException(ret)) {
2111
+ flow = 1 /* Flow.EXCEPTION */;
2112
+ break;
2113
+ }
2114
+ stack[sp - 1] = ret;
2115
+ ret_flag = false;
2116
+ }
2117
+ stack[sp++] = ret_flag;
2118
+ break;
2119
+ }
2120
+ case 152 /* OP.lnot */: {
2121
+ const op1 = stack[sp - 1];
2122
+ const res = typeof op1 === 'boolean' ? op1 : JS_ToBoolFree(ctx, op1);
2123
+ stack[sp - 1] = !res;
2124
+ break;
2125
+ }
2126
+ case 66 /* OP.get_field */: {
2127
+ const atom = get_u32(buf, pc);
2128
+ pc += 4;
2129
+ sf.cur_pc = pc;
2130
+ const val = JS_GetProperty(ctx, stack[sp - 1], atom);
2131
+ if (JS_IsException(val)) {
2132
+ flow = 1 /* Flow.EXCEPTION */;
2133
+ break;
2134
+ }
2135
+ stack[sp - 1] = val;
2136
+ break;
2137
+ }
2138
+ case 67 /* OP.get_field2 */: {
2139
+ const atom = get_u32(buf, pc);
2140
+ pc += 4;
2141
+ sf.cur_pc = pc;
2142
+ const val = JS_GetProperty(ctx, stack[sp - 1], atom);
2143
+ if (JS_IsException(val)) {
2144
+ flow = 1 /* Flow.EXCEPTION */;
2145
+ break;
2146
+ }
2147
+ stack[sp++] = val;
2148
+ break;
2149
+ }
2150
+ case 68 /* OP.put_field */: {
2151
+ const atom = get_u32(buf, pc);
2152
+ pc += 4;
2153
+ sf.cur_pc = pc;
2154
+ const ret = JS_SetPropertyInternal(ctx, stack[sp - 2], atom, stack[sp - 1], stack[sp - 2], JS_PROP_THROW_STRICT);
2155
+ sp -= 2;
2156
+ if (ret < 0) {
2157
+ flow = 1 /* Flow.EXCEPTION */;
2158
+ break;
2159
+ }
2160
+ break;
2161
+ }
2162
+ case 5 /* OP.private_symbol */: {
2163
+ const atom = get_u32(buf, pc);
2164
+ pc += 4;
2165
+ stack[sp++] = JS_NewSymbolFromAtom(ctx, atom, JS_ATOM_TYPE_PRIVATE);
2166
+ break;
2167
+ }
2168
+ case 69 /* OP.get_private_field */: {
2169
+ const val = JS_GetPrivateField(ctx, stack[sp - 2], stack[sp - 1]);
2170
+ stack[sp - 2] = val;
2171
+ sp--;
2172
+ if (JS_IsException(val)) {
2173
+ flow = 1 /* Flow.EXCEPTION */;
2174
+ break;
2175
+ }
2176
+ break;
2177
+ }
2178
+ case 70 /* OP.put_private_field */: {
2179
+ /* obj value prop -> */
2180
+ const ret = JS_SetPrivateField(ctx, stack[sp - 3], stack[sp - 1], stack[sp - 2]);
2181
+ sp -= 3;
2182
+ if (ret < 0) {
2183
+ flow = 1 /* Flow.EXCEPTION */;
2184
+ break;
2185
+ }
2186
+ break;
2187
+ }
2188
+ case 71 /* OP.define_private_field */: {
2189
+ /* obj prop value -> obj */
2190
+ const ret = JS_DefinePrivateField(ctx, stack[sp - 3], stack[sp - 2], stack[sp - 1]);
2191
+ sp -= 2;
2192
+ if (ret < 0) {
2193
+ flow = 1 /* Flow.EXCEPTION */;
2194
+ break;
2195
+ }
2196
+ break;
2197
+ }
2198
+ case 77 /* OP.define_field */: {
2199
+ const atom = get_u32(buf, pc);
2200
+ pc += 4;
2201
+ const ret = JS_DefinePropertyValue(ctx, stack[sp - 2], atom, stack[sp - 1], JS_PROP_C_W_E | JS_PROP_THROW);
2202
+ sp--;
2203
+ if (ret < 0) {
2204
+ flow = 1 /* Flow.EXCEPTION */;
2205
+ break;
2206
+ }
2207
+ break;
2208
+ }
2209
+ case 78 /* OP.set_name */: {
2210
+ const atom = get_u32(buf, pc);
2211
+ pc += 4;
2212
+ if (JS_DefineObjectName(ctx, stack[sp - 1], atom, JS_PROP_CONFIGURABLE) < 0) {
2213
+ flow = 1 /* Flow.EXCEPTION */;
2214
+ break;
2215
+ }
2216
+ break;
2217
+ }
2218
+ case 79 /* OP.set_name_computed */:
2219
+ if (JS_DefineObjectNameComputed(ctx, stack[sp - 1], stack[sp - 2], JS_PROP_CONFIGURABLE) < 0) {
2220
+ flow = 1 /* Flow.EXCEPTION */;
2221
+ break;
2222
+ }
2223
+ break;
2224
+ case 80 /* OP.set_proto */: {
2225
+ sf.cur_pc = pc;
2226
+ const proto = stack[sp - 1];
2227
+ if (JS_IsObject(proto) || proto === null) {
2228
+ if (JS_SetPrototypeInternal(ctx, stack[sp - 2], proto, true) < 0) {
2229
+ flow = 1 /* Flow.EXCEPTION */;
2230
+ break;
2231
+ }
2232
+ }
2233
+ sp--;
2234
+ break;
2235
+ }
2236
+ case 81 /* OP.set_home_object */:
2237
+ js_method_set_home_object(ctx, stack[sp - 1], stack[sp - 2]);
2238
+ break;
2239
+ case 85 /* OP.define_method */:
2240
+ case 86 /* OP.define_method_computed */: {
2241
+ const is_computed = (opcode === 86 /* OP.define_method_computed */);
2242
+ let atom;
2243
+ if (is_computed) {
2244
+ atom = JS_ValueToAtom(ctx, stack[sp - 2]);
2245
+ if (atom === JS_ATOM_NULL) {
2246
+ flow = 1 /* Flow.EXCEPTION */;
2247
+ break;
2248
+ }
2249
+ }
2250
+ else {
2251
+ atom = get_u32(buf, pc);
2252
+ pc += 4;
2253
+ }
2254
+ let op_flags = buf[pc++];
2255
+ const obj = stack[sp - 2 - (is_computed ? 1 : 0)];
2256
+ let fl = JS_PROP_HAS_CONFIGURABLE | JS_PROP_CONFIGURABLE | JS_PROP_HAS_ENUMERABLE | JS_PROP_THROW;
2257
+ if (op_flags & OP_DEFINE_METHOD_ENUMERABLE)
2258
+ fl |= JS_PROP_ENUMERABLE;
2259
+ op_flags &= 3;
2260
+ let value = undefined, getter = undefined, setter = undefined;
2261
+ if (op_flags === OP_DEFINE_METHOD_METHOD) {
2262
+ value = stack[sp - 1];
2263
+ fl |= JS_PROP_HAS_VALUE | JS_PROP_HAS_WRITABLE | JS_PROP_WRITABLE;
2264
+ }
2265
+ else if (op_flags === OP_DEFINE_METHOD_GETTER) {
2266
+ getter = stack[sp - 1];
2267
+ fl |= JS_PROP_HAS_GET;
2268
+ }
2269
+ else {
2270
+ setter = stack[sp - 1];
2271
+ fl |= JS_PROP_HAS_SET;
2272
+ }
2273
+ let ret = js_method_set_properties(ctx, stack[sp - 1], atom, fl, obj);
2274
+ if (ret >= 0)
2275
+ ret = JS_DefineProperty(ctx, obj, atom, value, getter, setter, fl);
2276
+ sp -= 1 + (is_computed ? 1 : 0);
2277
+ if (ret < 0) {
2278
+ flow = 1 /* Flow.EXCEPTION */;
2279
+ break;
2280
+ }
2281
+ break;
2282
+ }
2283
+ case 87 /* OP.define_class */:
2284
+ case 88 /* OP.define_class_computed */: {
2285
+ const atom = get_u32(buf, pc);
2286
+ const class_flags = buf[pc + 4];
2287
+ pc += 5;
2288
+ sf.cur_pc = pc;
2289
+ if (js_op_define_class(ctx, stack, sp, atom, class_flags, var_refs, sf, opcode === 88 /* OP.define_class_computed */) < 0) {
2290
+ flow = 1 /* Flow.EXCEPTION */;
2291
+ break;
2292
+ }
2293
+ break;
2294
+ }
2295
+ case 72 /* OP.get_array_el */: {
2296
+ sf.cur_pc = pc;
2297
+ const val = JS_GetPropertyValue(ctx, stack[sp - 2], stack[sp - 1]);
2298
+ stack[sp - 2] = val;
2299
+ sp--;
2300
+ if (JS_IsException(val)) {
2301
+ flow = 1 /* Flow.EXCEPTION */;
2302
+ break;
2303
+ }
2304
+ break;
2305
+ }
2306
+ case 73 /* OP.get_array_el2 */: {
2307
+ sf.cur_pc = pc;
2308
+ const val = JS_GetPropertyValue(ctx, stack[sp - 2], stack[sp - 1]);
2309
+ stack[sp - 1] = val;
2310
+ if (JS_IsException(val)) {
2311
+ flow = 1 /* Flow.EXCEPTION */;
2312
+ break;
2313
+ }
2314
+ break;
2315
+ }
2316
+ case 61 /* OP.get_ref_value */: {
2317
+ sf.cur_pc = pc;
2318
+ const atom = JS_ValueToAtom(ctx, stack[sp - 1]);
2319
+ if (atom === JS_ATOM_NULL) {
2320
+ flow = 1 /* Flow.EXCEPTION */;
2321
+ break;
2322
+ }
2323
+ if (JS_IsUndefined(stack[sp - 2])) {
2324
+ JS_ThrowReferenceErrorNotDefined(ctx, atom);
2325
+ flow = 1 /* Flow.EXCEPTION */;
2326
+ break;
2327
+ }
2328
+ const ret = JS_HasProperty(ctx, stack[sp - 2], atom);
2329
+ let val;
2330
+ if (ret <= 0) {
2331
+ if (ret < 0) {
2332
+ flow = 1 /* Flow.EXCEPTION */;
2333
+ break;
2334
+ }
2335
+ if (is_strict_mode(ctx)) {
2336
+ JS_ThrowReferenceErrorNotDefined(ctx, atom);
2337
+ flow = 1 /* Flow.EXCEPTION */;
2338
+ break;
2339
+ }
2340
+ val = undefined;
2341
+ }
2342
+ else {
2343
+ val = JS_GetProperty(ctx, stack[sp - 2], atom);
2344
+ }
2345
+ if (JS_IsException(val)) {
2346
+ flow = 1 /* Flow.EXCEPTION */;
2347
+ break;
2348
+ }
2349
+ stack[sp++] = val;
2350
+ break;
2351
+ }
2352
+ case 75 /* OP.get_super_value */: {
2353
+ /* this obj prop -> value */
2354
+ sf.cur_pc = pc;
2355
+ const atom = JS_ValueToAtom(ctx, stack[sp - 1]);
2356
+ if (atom === JS_ATOM_NULL) {
2357
+ flow = 1 /* Flow.EXCEPTION */;
2358
+ break;
2359
+ }
2360
+ const val = JS_GetPropertyInternal(ctx, stack[sp - 2], atom, stack[sp - 3], false);
2361
+ if (JS_IsException(val)) {
2362
+ flow = 1 /* Flow.EXCEPTION */;
2363
+ break;
2364
+ }
2365
+ stack[sp - 3] = val;
2366
+ sp -= 2;
2367
+ break;
2368
+ }
2369
+ case 74 /* OP.put_array_el */: {
2370
+ sf.cur_pc = pc;
2371
+ const ret = JS_SetPropertyValue(ctx, stack[sp - 3], stack[sp - 2], stack[sp - 1], JS_PROP_THROW_STRICT);
2372
+ sp -= 3;
2373
+ if (ret < 0) {
2374
+ flow = 1 /* Flow.EXCEPTION */;
2375
+ break;
2376
+ }
2377
+ break;
2378
+ }
2379
+ case 62 /* OP.put_ref_value */: {
2380
+ sf.cur_pc = pc;
2381
+ const atom = JS_ValueToAtom(ctx, stack[sp - 2]);
2382
+ if (atom === JS_ATOM_NULL) {
2383
+ flow = 1 /* Flow.EXCEPTION */;
2384
+ break;
2385
+ }
2386
+ if (JS_IsUndefined(stack[sp - 3])) {
2387
+ if (is_strict_mode(ctx)) {
2388
+ JS_ThrowReferenceErrorNotDefined(ctx, atom);
2389
+ flow = 1 /* Flow.EXCEPTION */;
2390
+ break;
2391
+ }
2392
+ stack[sp - 3] = ctx.global_obj;
2393
+ }
2394
+ const ret = JS_HasProperty(ctx, stack[sp - 3], atom);
2395
+ if (ret <= 0) {
2396
+ if (ret < 0) {
2397
+ flow = 1 /* Flow.EXCEPTION */;
2398
+ break;
2399
+ }
2400
+ if (is_strict_mode(ctx)) {
2401
+ JS_ThrowReferenceErrorNotDefined(ctx, atom);
2402
+ flow = 1 /* Flow.EXCEPTION */;
2403
+ break;
2404
+ }
2405
+ }
2406
+ const r2 = JS_SetPropertyInternal(ctx, stack[sp - 3], atom, stack[sp - 1], stack[sp - 3], JS_PROP_THROW_STRICT);
2407
+ sp -= 3;
2408
+ if (r2 < 0) {
2409
+ flow = 1 /* Flow.EXCEPTION */;
2410
+ break;
2411
+ }
2412
+ break;
2413
+ }
2414
+ case 76 /* OP.put_super_value */: {
2415
+ /* this obj prop value -> */
2416
+ sf.cur_pc = pc;
2417
+ if (!JS_IsObject(stack[sp - 3])) {
2418
+ JS_ThrowTypeErrorNotAnObject(ctx);
2419
+ flow = 1 /* Flow.EXCEPTION */;
2420
+ break;
2421
+ }
2422
+ const atom = JS_ValueToAtom(ctx, stack[sp - 2]);
2423
+ if (atom === JS_ATOM_NULL) {
2424
+ flow = 1 /* Flow.EXCEPTION */;
2425
+ break;
2426
+ }
2427
+ const ret = JS_SetPropertyInternal(ctx, stack[sp - 3], atom, stack[sp - 1], stack[sp - 4], JS_PROP_THROW_STRICT);
2428
+ sp -= 4;
2429
+ if (ret < 0) {
2430
+ flow = 1 /* Flow.EXCEPTION */;
2431
+ break;
2432
+ }
2433
+ break;
2434
+ }
2435
+ case 82 /* OP.define_array_el */: {
2436
+ const ret = JS_DefinePropertyValueValue(ctx, stack[sp - 3], stack[sp - 2], stack[sp - 1], JS_PROP_C_W_E | JS_PROP_THROW);
2437
+ sp -= 1;
2438
+ if (ret < 0) {
2439
+ flow = 1 /* Flow.EXCEPTION */;
2440
+ break;
2441
+ }
2442
+ break;
2443
+ }
2444
+ case 83 /* OP.append */: /* array pos enumobj -- array pos */
2445
+ sf.cur_pc = pc;
2446
+ if (js_append_enumerate(ctx, stack, sp)) {
2447
+ flow = 1 /* Flow.EXCEPTION */;
2448
+ break;
2449
+ }
2450
+ sp--;
2451
+ break;
2452
+ case 84 /* OP.copy_data_properties */: { /* target source excludeList */
2453
+ /* stack offsets (-1 based): 2 bits for target, 3 bits for source, 2 bits for exclusionList */
2454
+ const mask = buf[pc++];
2455
+ sf.cur_pc = pc;
2456
+ if (JS_CopyDataProperties(ctx, stack[sp - 1 - (mask & 3)], stack[sp - 1 - ((mask >> 2) & 7)], stack[sp - 1 - ((mask >> 5) & 7)], false)) {
2457
+ flow = 1 /* Flow.EXCEPTION */;
2458
+ break;
2459
+ }
2460
+ break;
2461
+ }
2462
+ case 159 /* OP.add */: {
2463
+ const op1 = stack[sp - 2], op2 = stack[sp - 1];
2464
+ if (typeof op1 === 'number' && typeof op2 === 'number') {
2465
+ stack[sp - 2] = op1 + op2;
2466
+ sp--;
2467
+ }
2468
+ else if (typeof op1 === 'string' && typeof op2 === 'string') {
2469
+ stack[sp - 2] = op1 + op2;
2470
+ sp--;
2471
+ }
2472
+ else {
2473
+ sf.cur_pc = pc;
2474
+ const r = js_add_slow(ctx, op1, op2);
2475
+ if (JS_IsException(r)) {
2476
+ flow = 1 /* Flow.EXCEPTION */;
2477
+ break;
2478
+ }
2479
+ stack[sp - 2] = r;
2480
+ sp--;
2481
+ }
2482
+ break;
2483
+ }
2484
+ case 150 /* OP.add_loc */: {
2485
+ const idx = buf[pc++];
2486
+ const op2 = stack[sp - 1];
2487
+ const pv = var_buf[idx];
2488
+ if (typeof pv === 'number' && typeof op2 === 'number') {
2489
+ var_buf[idx] = pv + op2;
2490
+ sp--;
2491
+ }
2492
+ else if (typeof pv === 'string' && typeof op2 === 'string') {
2493
+ var_buf[idx] = pv + op2;
2494
+ sp--;
2495
+ }
2496
+ else {
2497
+ sf.cur_pc = pc;
2498
+ sp--;
2499
+ const r = js_add_slow(ctx, pv, op2);
2500
+ if (JS_IsException(r)) {
2501
+ flow = 1 /* Flow.EXCEPTION */;
2502
+ break;
2503
+ }
2504
+ var_buf[idx] = r;
2505
+ }
2506
+ break;
2507
+ }
2508
+ case 160 /* OP.sub */:
2509
+ case 156 /* OP.mul */:
2510
+ case 157 /* OP.div */:
2511
+ case 158 /* OP.mod */:
2512
+ case 161 /* OP.pow */: {
2513
+ const op1 = stack[sp - 2], op2 = stack[sp - 1];
2514
+ if (typeof op1 === 'number' && typeof op2 === 'number') {
2515
+ let r;
2516
+ switch (opcode) {
2517
+ case 160 /* OP.sub */:
2518
+ r = op1 - op2;
2519
+ break;
2520
+ case 156 /* OP.mul */:
2521
+ r = op1 * op2;
2522
+ break;
2523
+ case 157 /* OP.div */:
2524
+ r = op1 / op2;
2525
+ break;
2526
+ case 158 /* OP.mod */:
2527
+ r = op1 % op2;
2528
+ break;
2529
+ default:
2530
+ r = Math.pow(op1, op2);
2531
+ break;
2532
+ }
2533
+ stack[sp - 2] = r;
2534
+ sp--;
2535
+ }
2536
+ else {
2537
+ sf.cur_pc = pc;
2538
+ let aop;
2539
+ switch (opcode) {
2540
+ case 160 /* OP.sub */:
2541
+ aop = 1 /* JSArithOp.SUB */;
2542
+ break;
2543
+ case 156 /* OP.mul */:
2544
+ aop = 2 /* JSArithOp.MUL */;
2545
+ break;
2546
+ case 157 /* OP.div */:
2547
+ aop = 3 /* JSArithOp.DIV */;
2548
+ break;
2549
+ case 158 /* OP.mod */:
2550
+ aop = 4 /* JSArithOp.MOD */;
2551
+ break;
2552
+ default:
2553
+ aop = 5 /* JSArithOp.POW */;
2554
+ break;
2555
+ }
2556
+ const r = js_binary_arith_slow(ctx, aop, op1, op2);
2557
+ if (JS_IsException(r)) {
2558
+ flow = 1 /* Flow.EXCEPTION */;
2559
+ break;
2560
+ }
2561
+ stack[sp - 2] = r;
2562
+ sp--;
2563
+ }
2564
+ break;
2565
+ }
2566
+ case 143 /* OP.plus */: {
2567
+ const op1 = stack[sp - 1];
2568
+ if (typeof op1 !== 'number') {
2569
+ sf.cur_pc = pc;
2570
+ const r = js_unary_arith_slow(ctx, 1 /* JSUnaryOp.PLUS */, op1);
2571
+ if (JS_IsException(r)) {
2572
+ flow = 1 /* Flow.EXCEPTION */;
2573
+ break;
2574
+ }
2575
+ stack[sp - 1] = r;
2576
+ }
2577
+ break;
2578
+ }
2579
+ case 142 /* OP.neg */: {
2580
+ const op1 = stack[sp - 1];
2581
+ if (typeof op1 === 'number') {
2582
+ stack[sp - 1] = -op1;
2583
+ }
2584
+ else {
2585
+ sf.cur_pc = pc;
2586
+ const r = js_unary_arith_slow(ctx, 0 /* JSUnaryOp.NEG */, op1);
2587
+ if (JS_IsException(r)) {
2588
+ flow = 1 /* Flow.EXCEPTION */;
2589
+ break;
2590
+ }
2591
+ stack[sp - 1] = r;
2592
+ }
2593
+ break;
2594
+ }
2595
+ case 145 /* OP.inc */: {
2596
+ const op1 = stack[sp - 1];
2597
+ if (typeof op1 === 'number') {
2598
+ stack[sp - 1] = op1 + 1;
2599
+ }
2600
+ else {
2601
+ sf.cur_pc = pc;
2602
+ const r = js_unary_arith_slow(ctx, 2 /* JSUnaryOp.INC */, op1);
2603
+ if (JS_IsException(r)) {
2604
+ flow = 1 /* Flow.EXCEPTION */;
2605
+ break;
2606
+ }
2607
+ stack[sp - 1] = r;
2608
+ }
2609
+ break;
2610
+ }
2611
+ case 144 /* OP.dec */: {
2612
+ const op1 = stack[sp - 1];
2613
+ if (typeof op1 === 'number') {
2614
+ stack[sp - 1] = op1 - 1;
2615
+ }
2616
+ else {
2617
+ sf.cur_pc = pc;
2618
+ const r = js_unary_arith_slow(ctx, 3 /* JSUnaryOp.DEC */, op1);
2619
+ if (JS_IsException(r)) {
2620
+ flow = 1 /* Flow.EXCEPTION */;
2621
+ break;
2622
+ }
2623
+ stack[sp - 1] = r;
2624
+ }
2625
+ break;
2626
+ }
2627
+ case 147 /* OP.post_inc */:
2628
+ case 146 /* OP.post_dec */: {
2629
+ sf.cur_pc = pc;
2630
+ const op1 = JS_ToNumericFree(ctx, stack[sp - 1]);
2631
+ if (JS_IsException(op1)) {
2632
+ stack[sp - 1] = undefined;
2633
+ flow = 1 /* Flow.EXCEPTION */;
2634
+ break;
2635
+ }
2636
+ stack[sp - 1] = op1;
2637
+ const r = js_unary_arith_slow(ctx, opcode === 147 /* OP.post_inc */ ? 2 /* JSUnaryOp.INC */ : 3 /* JSUnaryOp.DEC */, op1);
2638
+ if (JS_IsException(r)) {
2639
+ flow = 1 /* Flow.EXCEPTION */;
2640
+ break;
2641
+ }
2642
+ stack[sp++] = r;
2643
+ break;
2644
+ }
2645
+ case 149 /* OP.inc_loc */: {
2646
+ const idx = buf[pc++];
2647
+ const op1 = var_buf[idx];
2648
+ if (typeof op1 === 'number') {
2649
+ var_buf[idx] = op1 + 1;
2650
+ }
2651
+ else {
2652
+ sf.cur_pc = pc;
2653
+ const r = js_unary_arith_slow(ctx, 2 /* JSUnaryOp.INC */, op1);
2654
+ if (JS_IsException(r)) {
2655
+ flow = 1 /* Flow.EXCEPTION */;
2656
+ break;
2657
+ }
2658
+ var_buf[idx] = r;
2659
+ }
2660
+ break;
2661
+ }
2662
+ case 148 /* OP.dec_loc */: {
2663
+ const idx = buf[pc++];
2664
+ const op1 = var_buf[idx];
2665
+ if (typeof op1 === 'number') {
2666
+ var_buf[idx] = op1 - 1;
2667
+ }
2668
+ else {
2669
+ sf.cur_pc = pc;
2670
+ const r = js_unary_arith_slow(ctx, 3 /* JSUnaryOp.DEC */, op1);
2671
+ if (JS_IsException(r)) {
2672
+ flow = 1 /* Flow.EXCEPTION */;
2673
+ break;
2674
+ }
2675
+ var_buf[idx] = r;
2676
+ }
2677
+ break;
2678
+ }
2679
+ case 151 /* OP.not */: {
2680
+ const op1 = stack[sp - 1];
2681
+ if (typeof op1 === 'number') {
2682
+ stack[sp - 1] = ~op1;
2683
+ }
2684
+ else {
2685
+ sf.cur_pc = pc;
2686
+ const r = js_unary_arith_slow(ctx, 4 /* JSUnaryOp.NOT */, op1);
2687
+ if (JS_IsException(r)) {
2688
+ flow = 1 /* Flow.EXCEPTION */;
2689
+ break;
2690
+ }
2691
+ stack[sp - 1] = r;
2692
+ }
2693
+ break;
2694
+ }
2695
+ case 162 /* OP.shl */:
2696
+ case 163 /* OP.sar */:
2697
+ case 164 /* OP.shr */:
2698
+ case 175 /* OP.and */:
2699
+ case 177 /* OP.or */:
2700
+ case 176 /* OP.xor */: {
2701
+ const op1 = stack[sp - 2], op2 = stack[sp - 1];
2702
+ if (typeof op1 === 'number' && typeof op2 === 'number') {
2703
+ let r;
2704
+ switch (opcode) {
2705
+ case 162 /* OP.shl */:
2706
+ r = op1 << op2;
2707
+ break;
2708
+ case 163 /* OP.sar */:
2709
+ r = op1 >> op2;
2710
+ break;
2711
+ case 164 /* OP.shr */:
2712
+ r = op1 >>> op2;
2713
+ break;
2714
+ case 175 /* OP.and */:
2715
+ r = op1 & op2;
2716
+ break;
2717
+ case 177 /* OP.or */:
2718
+ r = op1 | op2;
2719
+ break;
2720
+ default:
2721
+ r = op1 ^ op2;
2722
+ break;
2723
+ }
2724
+ stack[sp - 2] = r;
2725
+ sp--;
2726
+ }
2727
+ else {
2728
+ sf.cur_pc = pc;
2729
+ let aop;
2730
+ switch (opcode) {
2731
+ case 162 /* OP.shl */:
2732
+ aop = 6 /* JSArithOp.SHL */;
2733
+ break;
2734
+ case 163 /* OP.sar */:
2735
+ aop = 7 /* JSArithOp.SAR */;
2736
+ break;
2737
+ case 164 /* OP.shr */:
2738
+ aop = 8 /* JSArithOp.SHR */;
2739
+ break;
2740
+ case 175 /* OP.and */:
2741
+ aop = 9 /* JSArithOp.AND */;
2742
+ break;
2743
+ case 177 /* OP.or */:
2744
+ aop = 10 /* JSArithOp.OR */;
2745
+ break;
2746
+ default:
2747
+ aop = 11 /* JSArithOp.XOR */;
2748
+ break;
2749
+ }
2750
+ const r = js_binary_arith_slow(ctx, aop, op1, op2);
2751
+ if (JS_IsException(r)) {
2752
+ flow = 1 /* Flow.EXCEPTION */;
2753
+ break;
2754
+ }
2755
+ stack[sp - 2] = r;
2756
+ sp--;
2757
+ }
2758
+ break;
2759
+ }
2760
+ case 165 /* OP.lt */:
2761
+ case 166 /* OP.lte */:
2762
+ case 167 /* OP.gt */:
2763
+ case 168 /* OP.gte */: {
2764
+ const op1 = stack[sp - 2], op2 = stack[sp - 1];
2765
+ if (typeof op1 === 'number' && typeof op2 === 'number') {
2766
+ let r;
2767
+ switch (opcode) {
2768
+ case 165 /* OP.lt */:
2769
+ r = op1 < op2;
2770
+ break;
2771
+ case 166 /* OP.lte */:
2772
+ r = op1 <= op2;
2773
+ break;
2774
+ case 167 /* OP.gt */:
2775
+ r = op1 > op2;
2776
+ break;
2777
+ default:
2778
+ r = op1 >= op2;
2779
+ break;
2780
+ }
2781
+ stack[sp - 2] = r;
2782
+ sp--;
2783
+ }
2784
+ else {
2785
+ sf.cur_pc = pc;
2786
+ let rop;
2787
+ switch (opcode) {
2788
+ case 165 /* OP.lt */:
2789
+ rop = 0 /* JSRelOp.LT */;
2790
+ break;
2791
+ case 166 /* OP.lte */:
2792
+ rop = 1 /* JSRelOp.LTE */;
2793
+ break;
2794
+ case 167 /* OP.gt */:
2795
+ rop = 2 /* JSRelOp.GT */;
2796
+ break;
2797
+ default:
2798
+ rop = 3 /* JSRelOp.GTE */;
2799
+ break;
2800
+ }
2801
+ const r = js_relational_op(ctx, rop, op1, op2);
2802
+ if (r < 0) {
2803
+ flow = 1 /* Flow.EXCEPTION */;
2804
+ break;
2805
+ }
2806
+ stack[sp - 2] = r !== 0;
2807
+ sp--;
2808
+ }
2809
+ break;
2810
+ }
2811
+ case 171 /* OP.eq */:
2812
+ case 172 /* OP.neq */: {
2813
+ const op1 = stack[sp - 2], op2 = stack[sp - 1];
2814
+ let r;
2815
+ if (typeof op1 === typeof op2 && typeof op1 !== 'object') {
2816
+ r = op1 === op2 ? 1 : 0;
2817
+ }
2818
+ else {
2819
+ sf.cur_pc = pc;
2820
+ r = js_loose_eq(ctx, op1, op2);
2821
+ if (r < 0) {
2822
+ flow = 1 /* Flow.EXCEPTION */;
2823
+ break;
2824
+ }
2825
+ }
2826
+ stack[sp - 2] = opcode === 171 /* OP.eq */ ? r !== 0 : r === 0;
2827
+ sp--;
2828
+ break;
2829
+ }
2830
+ case 173 /* OP.strict_eq */:
2831
+ case 174 /* OP.strict_neq */: {
2832
+ const r = js_strict_eq2(ctx, stack[sp - 2], stack[sp - 1], 0 /* JSStrictEqMode.STRICT */);
2833
+ stack[sp - 2] = opcode === 173 /* OP.strict_eq */ ? r : !r;
2834
+ sp--;
2835
+ break;
2836
+ }
2837
+ case 170 /* OP.in */: {
2838
+ sf.cur_pc = pc;
2839
+ const r = js_operator_in(ctx, stack[sp - 2], stack[sp - 1]);
2840
+ if (r < 0) {
2841
+ flow = 1 /* Flow.EXCEPTION */;
2842
+ break;
2843
+ }
2844
+ stack[sp - 2] = r !== 0;
2845
+ sp--;
2846
+ break;
2847
+ }
2848
+ case 179 /* OP.private_in */: {
2849
+ sf.cur_pc = pc;
2850
+ const r = js_operator_private_in(ctx, stack[sp - 2], stack[sp - 1]);
2851
+ if (r < 0) {
2852
+ flow = 1 /* Flow.EXCEPTION */;
2853
+ break;
2854
+ }
2855
+ stack[sp - 2] = r !== 0;
2856
+ sp--;
2857
+ break;
2858
+ }
2859
+ case 169 /* OP.instanceof */: {
2860
+ sf.cur_pc = pc;
2861
+ const r = JS_IsInstanceOf(ctx, stack[sp - 2], stack[sp - 1]);
2862
+ if (r < 0) {
2863
+ flow = 1 /* Flow.EXCEPTION */;
2864
+ break;
2865
+ }
2866
+ stack[sp - 2] = r !== 0;
2867
+ sp--;
2868
+ break;
2869
+ }
2870
+ case 153 /* OP.typeof */:
2871
+ stack[sp - 1] = JS_AtomToString(ctx, js_operator_typeof(ctx, stack[sp - 1]));
2872
+ break;
2873
+ case 154 /* OP.delete */: {
2874
+ sf.cur_pc = pc;
2875
+ const atom = JS_ValueToAtom(ctx, stack[sp - 1]);
2876
+ if (atom === JS_ATOM_NULL) {
2877
+ flow = 1 /* Flow.EXCEPTION */;
2878
+ break;
2879
+ }
2880
+ const r = JS_DeleteProperty(ctx, stack[sp - 2], atom, JS_PROP_THROW_STRICT);
2881
+ if (r < 0) {
2882
+ flow = 1 /* Flow.EXCEPTION */;
2883
+ break;
2884
+ }
2885
+ stack[sp - 2] = r !== 0;
2886
+ sp--;
2887
+ break;
2888
+ }
2889
+ case 155 /* OP.delete_var */: {
2890
+ const atom = get_u32(buf, pc);
2891
+ pc += 4;
2892
+ sf.cur_pc = pc;
2893
+ const r = JS_DeleteProperty(ctx, ctx.global_obj, atom, 0);
2894
+ if (r < 0) {
2895
+ flow = 1 /* Flow.EXCEPTION */;
2896
+ break;
2897
+ }
2898
+ stack[sp++] = r !== 0;
2899
+ break;
2900
+ }
2901
+ case 114 /* OP.to_object */:
2902
+ if (!JS_IsObject(stack[sp - 1])) {
2903
+ sf.cur_pc = pc;
2904
+ const v = JS_ToObject(ctx, stack[sp - 1]);
2905
+ if (JS_IsException(v)) {
2906
+ flow = 1 /* Flow.EXCEPTION */;
2907
+ break;
2908
+ }
2909
+ stack[sp - 1] = v;
2910
+ }
2911
+ break;
2912
+ case 115 /* OP.to_propkey */: {
2913
+ const v = stack[sp - 1];
2914
+ if (!(typeof v === 'number' && Number.isInteger(v)) && typeof v !== 'string' && typeof v !== 'symbol') {
2915
+ sf.cur_pc = pc;
2916
+ const r = JS_ToPropertyKey(ctx, v);
2917
+ if (JS_IsException(r)) {
2918
+ flow = 1 /* Flow.EXCEPTION */;
2919
+ break;
2920
+ }
2921
+ stack[sp - 1] = r;
2922
+ }
2923
+ break;
2924
+ }
2925
+ case 116 /* OP.to_propkey2 */: {
2926
+ /* must be tested first */
2927
+ if (stack[sp - 2] === undefined || stack[sp - 2] === null) {
2928
+ JS_ThrowTypeError(ctx, 'value has no property');
2929
+ flow = 1 /* Flow.EXCEPTION */;
2930
+ break;
2931
+ }
2932
+ const v = stack[sp - 1];
2933
+ if (!(typeof v === 'number' && Number.isInteger(v)) && typeof v !== 'string' && typeof v !== 'symbol') {
2934
+ sf.cur_pc = pc;
2935
+ const r = JS_ToPropertyKey(ctx, v);
2936
+ if (JS_IsException(r)) {
2937
+ flow = 1 /* Flow.EXCEPTION */;
2938
+ break;
2939
+ }
2940
+ stack[sp - 1] = r;
2941
+ }
2942
+ break;
2943
+ }
2944
+ case 117 /* OP.with_get_var */:
2945
+ case 118 /* OP.with_put_var */:
2946
+ case 119 /* OP.with_delete_var */:
2947
+ case 120 /* OP.with_make_ref */:
2948
+ case 121 /* OP.with_get_ref */: {
2949
+ const atom = get_u32(buf, pc);
2950
+ const diff = get_i32(buf, pc + 4);
2951
+ const is_with = buf[pc + 8];
2952
+ pc += 9;
2953
+ sf.cur_pc = pc;
2954
+ const obj = stack[sp - 1];
2955
+ let ret = JS_HasProperty(ctx, obj, atom);
2956
+ if (ret < 0) {
2957
+ flow = 1 /* Flow.EXCEPTION */;
2958
+ break;
2959
+ }
2960
+ let no_with = !ret;
2961
+ if (ret && is_with) {
2962
+ ret = js_has_unscopable(ctx, obj, atom);
2963
+ if (ret < 0) {
2964
+ flow = 1 /* Flow.EXCEPTION */;
2965
+ break;
2966
+ }
2967
+ if (ret)
2968
+ no_with = true;
2969
+ }
2970
+ if (!no_with) {
2971
+ switch (opcode) {
2972
+ case 117 /* OP.with_get_var */: {
2973
+ /* in Object Environment Records, GetBindingValue() calls HasProperty() */
2974
+ ret = JS_HasProperty(ctx, obj, atom);
2975
+ if (ret < 0) {
2976
+ flow = 1 /* Flow.EXCEPTION */;
2977
+ break sw;
2978
+ }
2979
+ let val;
2980
+ if (!ret) {
2981
+ if (is_strict_mode(ctx)) {
2982
+ JS_ThrowReferenceErrorNotDefined(ctx, atom);
2983
+ flow = 1 /* Flow.EXCEPTION */;
2984
+ break sw;
2985
+ }
2986
+ val = undefined;
2987
+ }
2988
+ else {
2989
+ val = JS_GetProperty(ctx, obj, atom);
2990
+ if (JS_IsException(val)) {
2991
+ flow = 1 /* Flow.EXCEPTION */;
2992
+ break sw;
2993
+ }
2994
+ }
2995
+ stack[sp - 1] = val;
2996
+ break;
2997
+ }
2998
+ case 118 /* OP.with_put_var */: {
2999
+ ret = JS_HasProperty(ctx, obj, atom);
3000
+ if (ret < 0) {
3001
+ flow = 1 /* Flow.EXCEPTION */;
3002
+ break sw;
3003
+ }
3004
+ if (!ret && is_strict_mode(ctx)) {
3005
+ JS_ThrowReferenceErrorNotDefined(ctx, atom);
3006
+ flow = 1 /* Flow.EXCEPTION */;
3007
+ break sw;
3008
+ }
3009
+ ret = JS_SetPropertyInternal(ctx, obj, atom, stack[sp - 2], obj, JS_PROP_THROW_STRICT);
3010
+ sp -= 2;
3011
+ if (ret < 0) {
3012
+ flow = 1 /* Flow.EXCEPTION */;
3013
+ break sw;
3014
+ }
3015
+ break;
3016
+ }
3017
+ case 119 /* OP.with_delete_var */: {
3018
+ ret = JS_DeleteProperty(ctx, obj, atom, 0);
3019
+ if (ret < 0) {
3020
+ flow = 1 /* Flow.EXCEPTION */;
3021
+ break sw;
3022
+ }
3023
+ stack[sp - 1] = ret !== 0;
3024
+ break;
3025
+ }
3026
+ case 120 /* OP.with_make_ref */:
3027
+ /* produce a pair object/propname on the stack */
3028
+ stack[sp++] = JS_AtomToValue(ctx, atom);
3029
+ break;
3030
+ case 121 /* OP.with_get_ref */: {
3031
+ /* produce a pair object/method on the stack */
3032
+ ret = JS_HasProperty(ctx, obj, atom);
3033
+ if (ret < 0) {
3034
+ flow = 1 /* Flow.EXCEPTION */;
3035
+ break sw;
3036
+ }
3037
+ let val;
3038
+ if (!ret) {
3039
+ val = undefined;
3040
+ }
3041
+ else {
3042
+ val = JS_GetProperty(ctx, obj, atom);
3043
+ if (JS_IsException(val)) {
3044
+ flow = 1 /* Flow.EXCEPTION */;
3045
+ break sw;
3046
+ }
3047
+ }
3048
+ stack[sp++] = val;
3049
+ break;
3050
+ }
3051
+ }
3052
+ pc += diff - 5;
3053
+ }
3054
+ else {
3055
+ /* if not jumping, drop the object argument */
3056
+ sp--;
3057
+ }
3058
+ break;
3059
+ }
3060
+ case 141 /* OP.await */:
3061
+ ret_val = FUNC_RET_AWAIT;
3062
+ flow = 3 /* Flow.DONE_GENERATOR */;
3063
+ break main;
3064
+ case 138 /* OP.yield */:
3065
+ ret_val = FUNC_RET_YIELD;
3066
+ flow = 3 /* Flow.DONE_GENERATOR */;
3067
+ break main;
3068
+ case 139 /* OP.yield_star */:
3069
+ case 140 /* OP.async_yield_star */:
3070
+ ret_val = FUNC_RET_YIELD_STAR;
3071
+ flow = 3 /* Flow.DONE_GENERATOR */;
3072
+ break main;
3073
+ case 47 /* OP.return_async */:
3074
+ ret_val = undefined;
3075
+ flow = 3 /* Flow.DONE_GENERATOR */;
3076
+ break main;
3077
+ case 137 /* OP.initial_yield */:
3078
+ ret_val = FUNC_RET_INITIAL_YIELD;
3079
+ flow = 3 /* Flow.DONE_GENERATOR */;
3080
+ break main;
3081
+ case 181 /* OP.nop */:
3082
+ break;
3083
+ case 178 /* OP.is_undefined_or_null */:
3084
+ stack[sp - 1] = (stack[sp - 1] === undefined || stack[sp - 1] === null);
3085
+ break;
3086
+ case 244 /* OP.is_undefined */:
3087
+ stack[sp - 1] = (stack[sp - 1] === undefined);
3088
+ break;
3089
+ case 245 /* OP.is_null */:
3090
+ stack[sp - 1] = (stack[sp - 1] === null);
3091
+ break;
3092
+ case 246 /* OP.typeof_is_undefined */:
3093
+ /* different from OP_is_undefined because of isHTMLDDA */
3094
+ stack[sp - 1] = (js_operator_typeof(ctx, stack[sp - 1]) === JS_ATOM_undefined);
3095
+ break;
3096
+ case 247 /* OP.typeof_is_function */:
3097
+ stack[sp - 1] = (js_operator_typeof(ctx, stack[sp - 1]) === JS_ATOM_function);
3098
+ break;
3099
+ case 0 /* OP.invalid */:
3100
+ default:
3101
+ JS_ThrowInternalError(ctx, `invalid opcode: pc=${pc - 1} opcode=0x${opcode.toString(16).padStart(2, '0')}`);
3102
+ flow = 1 /* Flow.EXCEPTION */;
3103
+ break;
3104
+ }
3105
+ }
3106
+ break outer;
3107
+ }
3108
+ catch (e) {
3109
+ js_host_exception_to_guest(ctx, e);
3110
+ flow = 1 /* Flow.EXCEPTION */;
3111
+ }
3112
+ }
3113
+ /* done / done_generator */
3114
+ if (flow === 3 /* Flow.DONE_GENERATOR */ || (flow === 2 /* Flow.DONE */ && b.func_kind !== 0 /* JSFunctionKind.NORMAL */)) {
3115
+ /* the local variables are kept by the generator state */
3116
+ sf.cur_pc = pc;
3117
+ sf.cur_sp = sp;
3118
+ }
3119
+ else {
3120
+ if (sf.var_refs.length !== 0) {
3121
+ /* variable references reference the stack: must close them */
3122
+ close_var_refs(rt, sf);
3123
+ }
3124
+ }
3125
+ rt.current_stack_frame = sf.prev_frame;
3126
+ rt.stack_depth--;
3127
+ return ret_val;
3128
+ }
3129
+ /* ---------------------------------------------------------------------
3130
+ JSAsyncFunctionState (used by generator and async functions)
3131
+ --------------------------------------------------------------------- */
3132
+ export function async_func_init(ctx, func_obj, this_obj, argv) {
3133
+ const s = new JSAsyncFunctionState();
3134
+ const sf = s.frame;
3135
+ const b = JS_GetFunctionData(func_obj).function_bytecode;
3136
+ const argc = argv.length;
3137
+ sf.js_mode = b.js_mode | JS_MODE_ASYNC;
3138
+ sf.cur_pc = 0;
3139
+ const arg_buf_len = Math.max(b.arg_count, argc);
3140
+ sf.arg_buf = new Array(arg_buf_len);
3141
+ for (let i = 0; i < argc; i++)
3142
+ sf.arg_buf[i] = argv[i];
3143
+ for (let i = argc; i < arg_buf_len; i++)
3144
+ sf.arg_buf[i] = undefined;
3145
+ sf.var_buf = new Array(b.var_count);
3146
+ for (let i = 0; i < b.var_count; i++)
3147
+ sf.var_buf[i] = undefined;
3148
+ sf.stack_buf = new Array(b.stack_size);
3149
+ sf.cur_func = func_obj;
3150
+ sf.this_obj = this_obj;
3151
+ sf.new_target = undefined;
3152
+ sf.arg_count = arg_buf_len;
3153
+ sf.cur_sp = 0;
3154
+ s.func_obj = func_obj;
3155
+ s.this_val = this_obj;
3156
+ s.argc = argc;
3157
+ s.resolving_funcs = [undefined, undefined];
3158
+ s.is_completed = false;
3159
+ return s;
3160
+ }
3161
+ /* resume the execution; returns FUNC_RET_xxx (number) when suspended,
3162
+ the return value when the function completed normally, or JS_EXCEPTION */
3163
+ export function async_func_resume(ctx, s) {
3164
+ const rt = ctx.rt;
3165
+ const sf = s.frame;
3166
+ let ret;
3167
+ if (s.is_completed)
3168
+ return JS_ThrowInternalError(ctx, 'async function already completed');
3169
+ if (rt.stack_depth >= rt.max_stack_depth) {
3170
+ ret = JS_ThrowStackOverflow(ctx);
3171
+ }
3172
+ else {
3173
+ ret = js_call_internal(ctx, s.func_obj, s.this_val, undefined, [], JS_CALL_FLAG_GENERATOR, s);
3174
+ }
3175
+ if (JS_IsException(ret) || JS_IsUndefined(ret)) {
3176
+ if (JS_IsUndefined(ret)) {
3177
+ /* OP_return_async: the return value is at the top of the stack */
3178
+ ret = sf.stack_buf[sf.cur_sp - 1];
3179
+ sf.stack_buf[sf.cur_sp - 1] = undefined;
3180
+ }
3181
+ /* end of execution */
3182
+ s.is_completed = true;
3183
+ /* close the closure variables. */
3184
+ close_var_refs(rt, sf);
3185
+ sf.stack_buf = [];
3186
+ }
3187
+ return ret;
3188
+ }
3189
+ /* ---------------------------------------------------------------------
3190
+ Generators
3191
+ --------------------------------------------------------------------- */
3192
+ function free_generator_stack(ctx, s) {
3193
+ if (s.state === 4 /* JSGeneratorState.COMPLETED */)
3194
+ return;
3195
+ s.func_state = null;
3196
+ s.state = 4 /* JSGeneratorState.COMPLETED */;
3197
+ }
3198
+ export function js_generator_next(ctx, this_val, argv, pdone, magic) {
3199
+ const s = JS_GetOpaque(this_val, 43 /* JSClassID.GENERATOR */);
3200
+ pdone.done = 1;
3201
+ if (!s)
3202
+ return JS_ThrowTypeError(ctx, 'not a generator');
3203
+ let ret;
3204
+ switch (s.state) {
3205
+ default:
3206
+ case 0 /* JSGeneratorState.SUSPENDED_START */:
3207
+ if (magic !== GEN_MAGIC_NEXT) {
3208
+ free_generator_stack(ctx, s);
3209
+ return generator_done(ctx, argv, magic);
3210
+ }
3211
+ s.func_state.throw_flag = false;
3212
+ return generator_exec(ctx, s, pdone);
3213
+ case 2 /* JSGeneratorState.SUSPENDED_YIELD_STAR */:
3214
+ case 1 /* JSGeneratorState.SUSPENDED_YIELD */: {
3215
+ const sf = s.func_state.frame;
3216
+ /* cur_sp[-1] was set to JS_UNDEFINED in the previous call */
3217
+ ret = argv[0];
3218
+ if (magic === GEN_MAGIC_THROW && s.state === 1 /* JSGeneratorState.SUSPENDED_YIELD */) {
3219
+ JS_Throw(ctx, ret);
3220
+ s.func_state.throw_flag = true;
3221
+ }
3222
+ else {
3223
+ sf.stack_buf[sf.cur_sp - 1] = ret;
3224
+ sf.stack_buf[sf.cur_sp] = magic;
3225
+ sf.cur_sp++;
3226
+ s.func_state.throw_flag = false;
3227
+ }
3228
+ return generator_exec(ctx, s, pdone);
3229
+ }
3230
+ case 4 /* JSGeneratorState.COMPLETED */:
3231
+ return generator_done(ctx, argv, magic);
3232
+ case 3 /* JSGeneratorState.EXECUTING */:
3233
+ return JS_ThrowTypeError(ctx, 'cannot invoke a running generator');
3234
+ }
3235
+ }
3236
+ function generator_done(ctx, argv, magic) {
3237
+ /* execution is finished */
3238
+ switch (magic) {
3239
+ default:
3240
+ case GEN_MAGIC_NEXT: return undefined;
3241
+ case GEN_MAGIC_RETURN: return argv[0];
3242
+ case GEN_MAGIC_THROW: return JS_Throw(ctx, argv[0]);
3243
+ }
3244
+ }
3245
+ function generator_exec(ctx, s, pdone) {
3246
+ const fs = s.func_state;
3247
+ const sf = fs.frame;
3248
+ s.state = 3 /* JSGeneratorState.EXECUTING */;
3249
+ const func_ret = async_func_resume(ctx, fs);
3250
+ s.state = 1 /* JSGeneratorState.SUSPENDED_YIELD */;
3251
+ if (fs.is_completed) {
3252
+ /* finalize the execution in case of exception or normal return */
3253
+ free_generator_stack(ctx, s);
3254
+ return func_ret;
3255
+ }
3256
+ /* get the returned yield value at the top of the stack */
3257
+ const ret = sf.stack_buf[sf.cur_sp - 1];
3258
+ sf.stack_buf[sf.cur_sp - 1] = undefined;
3259
+ if (func_ret === FUNC_RET_YIELD_STAR) {
3260
+ s.state = 2 /* JSGeneratorState.SUSPENDED_YIELD_STAR */;
3261
+ /* return (value, done) object */
3262
+ pdone.done = 2;
3263
+ }
3264
+ else {
3265
+ pdone.done = 0;
3266
+ }
3267
+ return ret;
3268
+ }
3269
+ export function js_generator_function_call(ctx, func_obj, this_obj, argv, flags) {
3270
+ const s = new JSGeneratorData();
3271
+ s.state = 0 /* JSGeneratorState.SUSPENDED_START */;
3272
+ s.func_state = async_func_init(ctx, func_obj, this_obj, argv);
3273
+ /* execute the function up to 'OP_initial_yield' */
3274
+ const func_ret = async_func_resume(ctx, s.func_state);
3275
+ if (JS_IsException(func_ret)) {
3276
+ free_generator_stack(ctx, s);
3277
+ return JS_EXCEPTION;
3278
+ }
3279
+ const obj = js_create_from_ctor(ctx, func_obj, 43 /* JSClassID.GENERATOR */);
3280
+ if (JS_IsException(obj)) {
3281
+ free_generator_stack(ctx, s);
3282
+ return JS_EXCEPTION;
3283
+ }
3284
+ JS_SetOpaque(obj, s);
3285
+ return obj;
3286
+ }
3287
+ export const js_generator_proto_funcs = [
3288
+ JS_ITERATOR_NEXT_DEF('next', 1, js_generator_next, GEN_MAGIC_NEXT),
3289
+ JS_ITERATOR_NEXT_DEF('return', 1, js_generator_next, GEN_MAGIC_RETURN),
3290
+ JS_ITERATOR_NEXT_DEF('throw', 1, js_generator_next, GEN_MAGIC_THROW),
3291
+ JS_PROP_STRING_DEF(JS_ATOM_Symbol_toStringTag, 'Generator', JS_PROP_CONFIGURABLE),
3292
+ ];
3293
+ export const js_generator_function_proto_funcs = [
3294
+ JS_PROP_STRING_DEF(JS_ATOM_Symbol_toStringTag, 'GeneratorFunction', JS_PROP_CONFIGURABLE),
3295
+ ];
3296
+ /* ---------------------------------------------------------------------
3297
+ Async functions
3298
+ --------------------------------------------------------------------- */
3299
+ function js_async_function_resolve_create(ctx, s) {
3300
+ const funcs = [undefined, undefined];
3301
+ for (let i = 0; i < 2; i++) {
3302
+ const is_reject = i === 1;
3303
+ const impl = (_this_val, _new_target, args) => {
3304
+ js_async_function_resolve_call(ctx, s, is_reject, args.length > 0 ? args[0] : undefined);
3305
+ return undefined;
3306
+ };
3307
+ const f = js_new_host_function(ctx, impl, false, '', 1, ctx.function_proto, (49 /* JSClassID.ASYNC_FUNCTION_RESOLVE */ + i));
3308
+ js_meta.get(f).u = s;
3309
+ funcs[i] = f;
3310
+ }
3311
+ return funcs;
3312
+ }
3313
+ function js_async_function_resume(ctx, s) {
3314
+ const func_ret = async_func_resume(ctx, s);
3315
+ if (s.is_completed) {
3316
+ if (JS_IsException(func_ret)) {
3317
+ const error = JS_GetException(ctx);
3318
+ JS_Call(ctx, s.resolving_funcs[1], undefined, [error]); /* XXX: what to do if exception ? */
3319
+ }
3320
+ else {
3321
+ /* normal return */
3322
+ JS_Call(ctx, s.resolving_funcs[0], undefined, [func_ret]);
3323
+ }
3324
+ return;
3325
+ }
3326
+ /* await */
3327
+ const sf = s.frame;
3328
+ const value = sf.stack_buf[sf.cur_sp - 1];
3329
+ sf.stack_buf[sf.cur_sp - 1] = undefined;
3330
+ const fail = () => {
3331
+ const error = JS_GetException(ctx);
3332
+ JS_Call(ctx, s.resolving_funcs[1], undefined, [error]);
3333
+ };
3334
+ const promise = js_promise_resolve(ctx, ctx.promise_ctor ?? undefined, [value], 0);
3335
+ if (JS_IsException(promise)) {
3336
+ fail();
3337
+ return;
3338
+ }
3339
+ const resolving_funcs = js_async_function_resolve_create(ctx, s);
3340
+ if (!resolving_funcs) {
3341
+ fail();
3342
+ return;
3343
+ }
3344
+ /* Note: no need to create 'thrownawayCapability' as in the spec */
3345
+ const res = perform_promise_then(ctx, promise, resolving_funcs, [undefined, undefined]);
3346
+ if (res)
3347
+ fail();
3348
+ }
3349
+ function js_async_function_resolve_call(ctx, s, is_reject, arg) {
3350
+ s.throw_flag = is_reject;
3351
+ if (is_reject) {
3352
+ JS_Throw(ctx, arg);
3353
+ }
3354
+ else {
3355
+ /* return value of await */
3356
+ s.frame.stack_buf[s.frame.cur_sp - 1] = arg;
3357
+ }
3358
+ js_async_function_resume(ctx, s);
3359
+ return undefined;
3360
+ }
3361
+ export function js_async_function_call(ctx, func_obj, this_obj, argv, flags) {
3362
+ const s = async_func_init(ctx, func_obj, this_obj, argv);
3363
+ const promise = JS_NewPromiseCapability(ctx, s.resolving_funcs);
3364
+ if (JS_IsException(promise))
3365
+ return JS_EXCEPTION;
3366
+ s.promise = promise;
3367
+ js_async_function_resume(ctx, s);
3368
+ return promise;
3369
+ }
3370
+ export const js_async_function_proto_funcs = [
3371
+ JS_PROP_STRING_DEF(JS_ATOM_Symbol_toStringTag, 'AsyncFunction', JS_PROP_CONFIGURABLE),
3372
+ ];
3373
+ export class JSAsyncGeneratorRequest {
3374
+ completion_type; /* GEN_MAGIC_x */
3375
+ result;
3376
+ promise;
3377
+ resolving_funcs;
3378
+ constructor(completion_type, result, promise, resolving_funcs) {
3379
+ this.completion_type = completion_type;
3380
+ this.result = result;
3381
+ this.promise = promise;
3382
+ this.resolving_funcs = resolving_funcs;
3383
+ }
3384
+ }
3385
+ export class JSAsyncGeneratorData {
3386
+ generator = null; /* back pointer to the object */
3387
+ state = 0 /* JSAsyncGeneratorState.SUSPENDED_START */;
3388
+ /* func_state is null in state AWAITING_RETURN and COMPLETED */
3389
+ func_state = null;
3390
+ queue = [];
3391
+ }
3392
+ function js_async_generator_resolve_function_create(ctx, generator, is_resume_next) {
3393
+ const funcs = [undefined, undefined];
3394
+ for (let i = 0; i < 2; i++) {
3395
+ const func = JS_NewCFunctionData(ctx, js_async_generator_resolve_function, 1, i + (is_resume_next ? 2 : 0), [generator]);
3396
+ if (JS_IsException(func))
3397
+ return null;
3398
+ funcs[i] = func;
3399
+ }
3400
+ return funcs;
3401
+ }
3402
+ function js_async_generator_await(ctx, s, value) {
3403
+ const promise = js_promise_resolve(ctx, ctx.promise_ctor ?? undefined, [value], 0);
3404
+ if (JS_IsException(promise))
3405
+ return -1;
3406
+ const resolving_funcs = js_async_generator_resolve_function_create(ctx, s.generator, false);
3407
+ if (!resolving_funcs)
3408
+ return -1;
3409
+ /* Note: no need to create 'thrownawayCapability' as in the spec */
3410
+ const res = perform_promise_then(ctx, promise, resolving_funcs, [undefined, undefined]);
3411
+ if (res)
3412
+ return -1;
3413
+ return 0;
3414
+ }
3415
+ function js_async_generator_resolve_or_reject(ctx, s, result, is_reject) {
3416
+ const next = s.queue.shift();
3417
+ JS_Call(ctx, next.resolving_funcs[is_reject], undefined, [result]);
3418
+ }
3419
+ function js_async_generator_resolve(ctx, s, value, done) {
3420
+ const result = js_create_iterator_result(ctx, value, done);
3421
+ /* XXX: better exception handling ? */
3422
+ js_async_generator_resolve_or_reject(ctx, s, result, 0);
3423
+ }
3424
+ function js_async_generator_reject(ctx, s, exception) {
3425
+ js_async_generator_resolve_or_reject(ctx, s, exception, 1);
3426
+ }
3427
+ function js_async_generator_complete(ctx, s) {
3428
+ if (s.state !== 5 /* JSAsyncGeneratorState.COMPLETED */) {
3429
+ s.state = 5 /* JSAsyncGeneratorState.COMPLETED */;
3430
+ s.func_state = null;
3431
+ }
3432
+ }
3433
+ function js_async_generator_completed_return(ctx, s, value) {
3434
+ // Can fail looking up JS_ATOM_constructor when is_reject==0.
3435
+ let promise = js_promise_resolve(ctx, ctx.promise_ctor ?? undefined, [value], 0);
3436
+ // A poisoned .constructor property is observable and the resulting
3437
+ // exception should be delivered to the catch handler.
3438
+ if (JS_IsException(promise)) {
3439
+ const err = JS_GetException(ctx);
3440
+ promise = js_promise_resolve(ctx, ctx.promise_ctor ?? undefined, [err], 1);
3441
+ if (JS_IsException(promise))
3442
+ return -1;
3443
+ }
3444
+ const resolving_funcs1 = js_async_generator_resolve_function_create(ctx, s.generator, true);
3445
+ if (!resolving_funcs1)
3446
+ return -1;
3447
+ return perform_promise_then(ctx, promise, resolving_funcs1, [undefined, undefined]);
3448
+ }
3449
+ function js_async_generator_resume_next(ctx, s) {
3450
+ for (;;) {
3451
+ if (s.queue.length === 0)
3452
+ break;
3453
+ const next = s.queue[0];
3454
+ let resume_exec = false;
3455
+ switch (s.state) {
3456
+ case 3 /* JSAsyncGeneratorState.EXECUTING */:
3457
+ /* only happens when restarting execution after await() */
3458
+ resume_exec = true;
3459
+ break;
3460
+ case 4 /* JSAsyncGeneratorState.AWAITING_RETURN */:
3461
+ return;
3462
+ case 0 /* JSAsyncGeneratorState.SUSPENDED_START */:
3463
+ if (next.completion_type === GEN_MAGIC_NEXT) {
3464
+ s.func_state.throw_flag = false;
3465
+ s.state = 3 /* JSAsyncGeneratorState.EXECUTING */;
3466
+ resume_exec = true;
3467
+ }
3468
+ else {
3469
+ js_async_generator_complete(ctx, s);
3470
+ }
3471
+ break;
3472
+ case 5 /* JSAsyncGeneratorState.COMPLETED */:
3473
+ if (next.completion_type === GEN_MAGIC_NEXT) {
3474
+ js_async_generator_resolve(ctx, s, undefined, true);
3475
+ }
3476
+ else if (next.completion_type === GEN_MAGIC_RETURN) {
3477
+ s.state = 4 /* JSAsyncGeneratorState.AWAITING_RETURN */;
3478
+ js_async_generator_completed_return(ctx, s, next.result);
3479
+ }
3480
+ else {
3481
+ js_async_generator_reject(ctx, s, next.result);
3482
+ }
3483
+ return;
3484
+ case 1 /* JSAsyncGeneratorState.SUSPENDED_YIELD */:
3485
+ case 2 /* JSAsyncGeneratorState.SUSPENDED_YIELD_STAR */: {
3486
+ const value = next.result;
3487
+ const sf = s.func_state.frame;
3488
+ if (next.completion_type === GEN_MAGIC_THROW && s.state === 1 /* JSAsyncGeneratorState.SUSPENDED_YIELD */) {
3489
+ JS_Throw(ctx, value);
3490
+ s.func_state.throw_flag = true;
3491
+ }
3492
+ else {
3493
+ /* 'yield' returns a value. 'yield *' also returns a value in case the 'throw' method is called */
3494
+ sf.stack_buf[sf.cur_sp - 1] = value;
3495
+ sf.stack_buf[sf.cur_sp] = next.completion_type;
3496
+ sf.cur_sp++;
3497
+ s.func_state.throw_flag = false;
3498
+ }
3499
+ s.state = 3 /* JSAsyncGeneratorState.EXECUTING */;
3500
+ resume_exec = true;
3501
+ break;
3502
+ }
3503
+ default:
3504
+ throw new Error('invalid async generator state');
3505
+ }
3506
+ if (!resume_exec)
3507
+ continue;
3508
+ for (;;) {
3509
+ const fs = s.func_state;
3510
+ const func_ret = async_func_resume(ctx, fs);
3511
+ if (fs.is_completed) {
3512
+ if (JS_IsException(func_ret)) {
3513
+ const value = JS_GetException(ctx);
3514
+ js_async_generator_complete(ctx, s);
3515
+ js_async_generator_reject(ctx, s, value);
3516
+ }
3517
+ else {
3518
+ /* end of function */
3519
+ js_async_generator_complete(ctx, s);
3520
+ js_async_generator_resolve(ctx, s, func_ret, true);
3521
+ }
3522
+ break;
3523
+ }
3524
+ const func_ret_code = func_ret;
3525
+ const sf = fs.frame;
3526
+ const value = sf.stack_buf[sf.cur_sp - 1];
3527
+ sf.stack_buf[sf.cur_sp - 1] = undefined;
3528
+ if (func_ret_code === FUNC_RET_YIELD || func_ret_code === FUNC_RET_YIELD_STAR) {
3529
+ s.state = (func_ret_code === FUNC_RET_YIELD_STAR) ? 2 /* JSAsyncGeneratorState.SUSPENDED_YIELD_STAR */ : 1 /* JSAsyncGeneratorState.SUSPENDED_YIELD */;
3530
+ js_async_generator_resolve(ctx, s, value, false);
3531
+ break;
3532
+ }
3533
+ else if (func_ret_code === FUNC_RET_AWAIT) {
3534
+ const ret = js_async_generator_await(ctx, s, value);
3535
+ if (ret < 0) {
3536
+ /* exception: throw it */
3537
+ fs.throw_flag = true;
3538
+ continue; /* resume_exec */
3539
+ }
3540
+ return;
3541
+ }
3542
+ else {
3543
+ throw new Error('invalid async generator return code');
3544
+ }
3545
+ }
3546
+ }
3547
+ }
3548
+ function js_async_generator_resolve_function(ctx, this_obj, argv, magic, func_data) {
3549
+ const is_reject = (magic & 1) !== 0;
3550
+ const s = JS_GetOpaque(func_data[0], 53 /* JSClassID.ASYNC_GENERATOR */);
3551
+ const arg = argv[0];
3552
+ if (!s)
3553
+ return undefined;
3554
+ if (magic >= 2) {
3555
+ /* resume next case in AWAITING_RETURN state */
3556
+ s.state = 5 /* JSAsyncGeneratorState.COMPLETED */;
3557
+ if (is_reject)
3558
+ js_async_generator_reject(ctx, s, arg);
3559
+ else
3560
+ js_async_generator_resolve(ctx, s, arg, true);
3561
+ }
3562
+ else {
3563
+ /* restart function execution after await() */
3564
+ const fs = s.func_state;
3565
+ fs.throw_flag = is_reject;
3566
+ if (is_reject) {
3567
+ JS_Throw(ctx, arg);
3568
+ }
3569
+ else {
3570
+ /* return value of await */
3571
+ fs.frame.stack_buf[fs.frame.cur_sp - 1] = arg;
3572
+ }
3573
+ js_async_generator_resume_next(ctx, s);
3574
+ }
3575
+ return undefined;
3576
+ }
3577
+ /* magic = GEN_MAGIC_x */
3578
+ export function js_async_generator_next(ctx, this_val, argv, magic) {
3579
+ const s = JS_GetOpaque(this_val, 53 /* JSClassID.ASYNC_GENERATOR */);
3580
+ const resolving_funcs = [undefined, undefined];
3581
+ const promise = JS_NewPromiseCapability(ctx, resolving_funcs);
3582
+ if (JS_IsException(promise))
3583
+ return JS_EXCEPTION;
3584
+ if (!s) {
3585
+ JS_ThrowTypeError(ctx, 'not an AsyncGenerator object');
3586
+ const err = JS_GetException(ctx);
3587
+ JS_Call(ctx, resolving_funcs[1], undefined, [err]);
3588
+ return promise;
3589
+ }
3590
+ s.queue.push(new JSAsyncGeneratorRequest(magic, argv[0], promise, resolving_funcs));
3591
+ if (s.state !== 3 /* JSAsyncGeneratorState.EXECUTING */) {
3592
+ js_async_generator_resume_next(ctx, s);
3593
+ }
3594
+ return promise;
3595
+ }
3596
+ export function js_async_generator_function_call(ctx, func_obj, this_obj, argv, flags) {
3597
+ const s = new JSAsyncGeneratorData();
3598
+ s.state = 0 /* JSAsyncGeneratorState.SUSPENDED_START */;
3599
+ s.func_state = async_func_init(ctx, func_obj, this_obj, argv);
3600
+ /* execute the function up to 'OP_initial_yield' (no yield nor await are possible) */
3601
+ const func_ret = async_func_resume(ctx, s.func_state);
3602
+ if (JS_IsException(func_ret))
3603
+ return JS_EXCEPTION;
3604
+ const obj = js_create_from_ctor(ctx, func_obj, 53 /* JSClassID.ASYNC_GENERATOR */);
3605
+ if (JS_IsException(obj))
3606
+ return JS_EXCEPTION;
3607
+ s.generator = obj;
3608
+ JS_SetOpaque(obj, s);
3609
+ return obj;
3610
+ }
3611
+ export const js_async_generator_proto_funcs = [
3612
+ JS_CFUNC_MAGIC_DEF('next', 1, js_async_generator_next, GEN_MAGIC_NEXT),
3613
+ JS_CFUNC_MAGIC_DEF('return', 1, js_async_generator_next, GEN_MAGIC_RETURN),
3614
+ JS_CFUNC_MAGIC_DEF('throw', 1, js_async_generator_next, GEN_MAGIC_THROW),
3615
+ JS_PROP_STRING_DEF(JS_ATOM_Symbol_toStringTag, 'AsyncGenerator', JS_PROP_CONFIGURABLE),
3616
+ ];
3617
+ export const js_async_generator_function_proto_funcs = [
3618
+ JS_PROP_STRING_DEF(JS_ATOM_Symbol_toStringTag, 'AsyncGeneratorFunction', JS_PROP_CONFIGURABLE),
3619
+ ];
3620
+ /* ---------------------------------------------------------------------
3621
+ AsyncFromSyncIterator
3622
+ --------------------------------------------------------------------- */
3623
+ export class JSAsyncFromSyncIteratorData {
3624
+ sync_iter;
3625
+ next_method;
3626
+ constructor(sync_iter, next_method) { this.sync_iter = sync_iter; this.next_method = next_method; }
3627
+ }
3628
+ export function JS_CreateAsyncFromSyncIterator(ctx, sync_iter) {
3629
+ const next_method = JS_GetProperty(ctx, sync_iter, JS_ATOM_next);
3630
+ if (JS_IsException(next_method))
3631
+ return JS_EXCEPTION;
3632
+ const async_iter = JS_NewObjectClass(ctx, 51 /* JSClassID.ASYNC_FROM_SYNC_ITERATOR */);
3633
+ if (JS_IsException(async_iter))
3634
+ return async_iter;
3635
+ JS_SetOpaque(async_iter, new JSAsyncFromSyncIteratorData(sync_iter, next_method));
3636
+ return async_iter;
3637
+ }
3638
+ async_hooks.JS_CreateAsyncFromSyncIterator = JS_CreateAsyncFromSyncIterator;
3639
+ function js_async_from_sync_iterator_unwrap(ctx, this_val, argv, magic, func_data) {
3640
+ return js_create_iterator_result(ctx, argv[0], JS_ToBoolFree(ctx, func_data[0]));
3641
+ }
3642
+ function js_async_from_sync_iterator_unwrap_func_create(ctx, done) {
3643
+ return JS_NewCFunctionData(ctx, js_async_from_sync_iterator_unwrap, 1, 0, [done]);
3644
+ }
3645
+ function js_async_from_sync_iterator_close_wrap(ctx, this_val, argv, magic, func_data) {
3646
+ JS_Throw(ctx, argv[0]);
3647
+ JS_IteratorClose(ctx, func_data[0], true);
3648
+ return JS_EXCEPTION;
3649
+ }
3650
+ function js_async_from_sync_iterator_close_wrap_func_create(ctx, sync_iter) {
3651
+ return JS_NewCFunctionData(ctx, js_async_from_sync_iterator_close_wrap, 1, 0, [sync_iter]);
3652
+ }
3653
+ function js_async_from_sync_iterator_next(ctx, this_val, argv, magic) {
3654
+ const resolving_funcs = [undefined, undefined];
3655
+ const promise = JS_NewPromiseCapability(ctx, resolving_funcs);
3656
+ if (JS_IsException(promise))
3657
+ return JS_EXCEPTION;
3658
+ const reject = () => {
3659
+ const err = JS_GetException(ctx);
3660
+ JS_Call(ctx, resolving_funcs[1], undefined, [err]);
3661
+ return promise;
3662
+ };
3663
+ const s = JS_GetOpaque(this_val, 51 /* JSClassID.ASYNC_FROM_SYNC_ITERATOR */);
3664
+ if (!s) {
3665
+ JS_ThrowTypeError(ctx, 'not an Async-from-Sync Iterator');
3666
+ return reject();
3667
+ }
3668
+ let method;
3669
+ if (magic === GEN_MAGIC_NEXT) {
3670
+ method = s.next_method;
3671
+ }
3672
+ else {
3673
+ method = JS_GetProperty(ctx, s.sync_iter, magic === GEN_MAGIC_RETURN ? JS_ATOM_return : JS_ATOM_throw);
3674
+ if (JS_IsException(method))
3675
+ return reject();
3676
+ if (method === undefined || method === null) {
3677
+ if (magic === GEN_MAGIC_RETURN) {
3678
+ const res = js_create_iterator_result(ctx, argv[0], true);
3679
+ JS_Call(ctx, resolving_funcs[0], undefined, [res]);
3680
+ return promise;
3681
+ }
3682
+ else {
3683
+ if (JS_IteratorClose(ctx, s.sync_iter, false))
3684
+ return reject();
3685
+ JS_ThrowTypeError(ctx, 'throw is not a method');
3686
+ return reject();
3687
+ }
3688
+ }
3689
+ }
3690
+ const obj = JS_Call(ctx, method, s.sync_iter, argv.length >= 1 ? [argv[0]] : []);
3691
+ if (JS_IsException(obj))
3692
+ return reject();
3693
+ if (!JS_IsObject(obj)) {
3694
+ JS_ThrowTypeError(ctx, 'iterator must return an object');
3695
+ return reject();
3696
+ }
3697
+ const pdone = { done: 0 };
3698
+ const value = JS_IteratorGetCompleteValue(ctx, obj, pdone);
3699
+ if (JS_IsException(value))
3700
+ return reject();
3701
+ const done = pdone.done !== 0;
3702
+ const value_wrapper_promise = js_promise_resolve(ctx, ctx.promise_ctor ?? undefined, [value], 0);
3703
+ if (JS_IsException(value_wrapper_promise)) {
3704
+ if (magic !== GEN_MAGIC_RETURN && !done)
3705
+ JS_IteratorClose(ctx, s.sync_iter, true);
3706
+ return reject();
3707
+ }
3708
+ const resolve_reject = [undefined, undefined];
3709
+ resolve_reject[0] = js_async_from_sync_iterator_unwrap_func_create(ctx, done);
3710
+ if (JS_IsException(resolve_reject[0]))
3711
+ return JS_EXCEPTION;
3712
+ if (done || magic === GEN_MAGIC_RETURN) {
3713
+ resolve_reject[1] = undefined;
3714
+ }
3715
+ else {
3716
+ resolve_reject[1] = js_async_from_sync_iterator_close_wrap_func_create(ctx, s.sync_iter);
3717
+ if (JS_IsException(resolve_reject[1]))
3718
+ return JS_EXCEPTION;
3719
+ }
3720
+ const res = perform_promise_then(ctx, value_wrapper_promise, resolve_reject, resolving_funcs);
3721
+ if (res)
3722
+ return JS_EXCEPTION;
3723
+ return promise;
3724
+ }
3725
+ export const js_async_from_sync_iterator_proto_funcs = [
3726
+ JS_CFUNC_MAGIC_DEF('next', 1, js_async_from_sync_iterator_next, GEN_MAGIC_NEXT),
3727
+ JS_CFUNC_MAGIC_DEF('return', 1, js_async_from_sync_iterator_next, GEN_MAGIC_RETURN),
3728
+ JS_CFUNC_MAGIC_DEF('throw', 1, js_async_from_sync_iterator_next, GEN_MAGIC_THROW),
3729
+ ];
3730
+ /* ---------------------------------------------------------------------
3731
+ Runtime / hooks installation
3732
+ --------------------------------------------------------------------- */
3733
+ hooks.JS_CallInternal = JS_CallInternal;
3734
+ hooks.js_closure = js_closure;
3735
+ /* ---------------------------------------------------------------------
3736
+ Value based helpers for the compiled tier (no operand stack)
3737
+ --------------------------------------------------------------------- */
3738
+ /* GetIterator + next method: returns [iterator, next] or null on exception */
3739
+ export function js_for_of_start_value(ctx, obj, is_async) {
3740
+ const iter = JS_GetIterator(ctx, obj, is_async);
3741
+ if (JS_IsException(iter))
3742
+ return null;
3743
+ const method = JS_GetProperty(ctx, iter, JS_ATOM_next);
3744
+ if (JS_IsException(method))
3745
+ return null;
3746
+ return [iter, method];
3747
+ }
3748
+ /* IteratorStep: returns {value, done} or null on exception */
3749
+ export function js_for_of_next_value(ctx, iter, next) {
3750
+ const pdone = { done: 0 };
3751
+ const value = JS_IteratorNext(ctx, iter, next, [], pdone);
3752
+ if (JS_IsException(value))
3753
+ return null;
3754
+ return { value: pdone.done ? undefined : value, done: pdone.done !== 0 };
3755
+ }
3756
+ /* spread: append the elements of the iterable 'src' to 'target' starting
3757
+ at index 'pos'; returns the next position or -1 on exception */
3758
+ export function js_append_enumerate_value(ctx, target, pos, src) {
3759
+ const stack = [target, pos, src];
3760
+ if (js_append_enumerate(ctx, stack, 3))
3761
+ return -1;
3762
+ return stack[1];
3763
+ }
3764
+ /* unmapped arguments object from an argument list (compiled functions) */
3765
+ export function js_build_arguments_value(ctx, argv) {
3766
+ return js_build_arguments(ctx, argv.length, argv);
3767
+ }
3768
+ //# sourceMappingURL=interpreter.js.map