Coverage Report

Created: 2025-10-12 07:05

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gpac/src/quickjs/quickjs-opcode.h
Line
Count
Source
1
/*
2
 * QuickJS opcode definitions
3
 * 
4
 * Copyright (c) 2017-2018 Fabrice Bellard
5
 * Copyright (c) 2017-2018 Charlie Gordon
6
 *
7
 * Permission is hereby granted, free of charge, to any person obtaining a copy
8
 * of this software and associated documentation files (the "Software"), to deal
9
 * in the Software without restriction, including without limitation the rights
10
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
 * copies of the Software, and to permit persons to whom the Software is
12
 * furnished to do so, subject to the following conditions:
13
 *
14
 * The above copyright notice and this permission notice shall be included in
15
 * all copies or substantial portions of the Software.
16
 *
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23
 * THE SOFTWARE.
24
 */
25
26
#ifdef FMT
27
FMT(none)
28
FMT(none_int)
29
FMT(none_loc)
30
FMT(none_arg)
31
FMT(none_var_ref)
32
FMT(u8)
33
FMT(i8)
34
FMT(loc8)
35
FMT(const8)
36
FMT(label8)
37
FMT(u16)
38
FMT(i16)
39
FMT(label16)
40
FMT(npop)
41
FMT(npopx)
42
FMT(npop_u16)
43
FMT(loc)
44
FMT(arg)
45
FMT(var_ref)
46
FMT(u32)
47
FMT(i32)
48
FMT(const)
49
FMT(label)
50
FMT(atom)
51
FMT(atom_u8)
52
FMT(atom_u16)
53
FMT(atom_label_u8)
54
FMT(atom_label_u16)
55
FMT(label_u16)
56
#undef FMT
57
#endif /* FMT */
58
59
0
#ifdef DEF
60
61
#ifndef def
62
#define def(id, size, n_pop, n_push, f) DEF(id, size, n_pop, n_push, f)
63
#endif
64
65
0
DEF(invalid, 1, 0, 0, none) /* never emitted */
66
67
/* push values */
68
0
DEF(       push_i32, 5, 0, 1, i32)
69
0
DEF(     push_const, 5, 0, 1, const)
70
0
DEF(       fclosure, 5, 0, 1, const) /* must follow push_const */
71
0
DEF(push_atom_value, 5, 0, 1, atom)
72
0
DEF( private_symbol, 5, 0, 1, atom)
73
0
DEF(      undefined, 1, 0, 1, none)
74
0
DEF(           null, 1, 0, 1, none)
75
0
DEF(      push_this, 1, 0, 1, none) /* only used at the start of a function */
76
0
DEF(     push_false, 1, 0, 1, none)
77
0
DEF(      push_true, 1, 0, 1, none)
78
0
DEF(         object, 1, 0, 1, none)
79
0
DEF( special_object, 2, 0, 1, u8) /* only used at the start of a function */
80
0
DEF(           rest, 3, 0, 1, u16) /* only used at the start of a function */
81
82
0
DEF(           drop, 1, 1, 0, none) /* a -> */
83
0
DEF(            nip, 1, 2, 1, none) /* a b -> b */
84
0
DEF(           nip1, 1, 3, 2, none) /* a b c -> b c */
85
0
DEF(            dup, 1, 1, 2, none) /* a -> a a */
86
0
DEF(           dup1, 1, 2, 3, none) /* a b -> a a b */
87
0
DEF(           dup2, 1, 2, 4, none) /* a b -> a b a b */
88
0
DEF(           dup3, 1, 3, 6, none) /* a b c -> a b c a b c */
89
0
DEF(        insert2, 1, 2, 3, none) /* obj a -> a obj a (dup_x1) */
90
0
DEF(        insert3, 1, 3, 4, none) /* obj prop a -> a obj prop a (dup_x2) */
91
0
DEF(        insert4, 1, 4, 5, none) /* this obj prop a -> a this obj prop a */
92
0
DEF(          perm3, 1, 3, 3, none) /* obj a b -> a obj b */
93
0
DEF(          perm4, 1, 4, 4, none) /* obj prop a b -> a obj prop b */
94
0
DEF(          perm5, 1, 5, 5, none) /* this obj prop a b -> a this obj prop b */
95
0
DEF(           swap, 1, 2, 2, none) /* a b -> b a */
96
0
DEF(          swap2, 1, 4, 4, none) /* a b c d -> c d a b */
97
0
DEF(          rot3l, 1, 3, 3, none) /* x a b -> a b x */
98
0
DEF(          rot3r, 1, 3, 3, none) /* a b x -> x a b */
99
0
DEF(          rot4l, 1, 4, 4, none) /* x a b c -> a b c x */
100
0
DEF(          rot5l, 1, 5, 5, none) /* x a b c d -> a b c d x */
101
102
0
DEF(call_constructor, 3, 2, 1, npop) /* func new.target args -> ret. arguments are not counted in n_pop */
103
0
DEF(           call, 3, 1, 1, npop) /* arguments are not counted in n_pop */
104
0
DEF(      tail_call, 3, 1, 0, npop) /* arguments are not counted in n_pop */
105
0
DEF(    call_method, 3, 2, 1, npop) /* arguments are not counted in n_pop */
106
0
DEF(tail_call_method, 3, 2, 0, npop) /* arguments are not counted in n_pop */
107
0
DEF(     array_from, 3, 0, 1, npop) /* arguments are not counted in n_pop */
108
0
DEF(          apply, 3, 3, 1, u16)
109
0
DEF(         return, 1, 1, 0, none)
110
0
DEF(   return_undef, 1, 0, 0, none)
111
0
DEF(check_ctor_return, 1, 1, 2, none)
112
0
DEF(     check_ctor, 1, 0, 0, none)
113
0
DEF(    check_brand, 1, 2, 2, none) /* this_obj func -> this_obj func */
114
0
DEF(      add_brand, 1, 2, 0, none) /* this_obj home_obj -> */
115
0
DEF(   return_async, 1, 1, 0, none)
116
0
DEF(          throw, 1, 1, 0, none)
117
0
DEF(    throw_error, 6, 0, 0, atom_u8)
118
0
DEF(           eval, 5, 1, 1, npop_u16) /* func args... -> ret_val */
119
0
DEF(     apply_eval, 3, 2, 1, u16) /* func array -> ret_eval */
120
0
DEF(         regexp, 1, 2, 1, none) /* create a RegExp object from the pattern and a
121
                                       bytecode string */
122
0
DEF(      get_super, 1, 1, 1, none)
123
0
DEF(         import, 1, 1, 1, none) /* dynamic module import */
124
125
0
DEF(      check_var, 5, 0, 1, atom) /* check if a variable exists */
126
0
DEF(  get_var_undef, 5, 0, 1, atom) /* push undefined if the variable does not exist */
127
0
DEF(        get_var, 5, 0, 1, atom) /* throw an exception if the variable does not exist */
128
0
DEF(        put_var, 5, 1, 0, atom) /* must come after get_var */
129
0
DEF(   put_var_init, 5, 1, 0, atom) /* must come after put_var. Used to initialize a global lexical variable */
130
0
DEF( put_var_strict, 5, 2, 0, atom) /* for strict mode variable write */
131
132
0
DEF(  get_ref_value, 1, 2, 3, none)
133
0
DEF(  put_ref_value, 1, 3, 0, none)
134
135
0
DEF(     define_var, 6, 0, 0, atom_u8)
136
0
DEF(check_define_var, 6, 0, 0, atom_u8)
137
0
DEF(    define_func, 6, 1, 0, atom_u8)
138
0
DEF(      get_field, 5, 1, 1, atom)
139
0
DEF(     get_field2, 5, 1, 2, atom)
140
0
DEF(      put_field, 5, 2, 0, atom)
141
0
DEF( get_private_field, 1, 2, 1, none) /* obj prop -> value */
142
0
DEF( put_private_field, 1, 3, 0, none) /* obj value prop -> */
143
0
DEF(define_private_field, 1, 3, 1, none) /* obj prop value -> obj */
144
0
DEF(   get_array_el, 1, 2, 1, none)
145
0
DEF(  get_array_el2, 1, 2, 2, none) /* obj prop -> obj value */
146
0
DEF(   put_array_el, 1, 3, 0, none)
147
0
DEF(get_super_value, 1, 3, 1, none) /* this obj prop -> value */
148
0
DEF(put_super_value, 1, 4, 0, none) /* this obj prop value -> */
149
0
DEF(   define_field, 5, 2, 1, atom)
150
0
DEF(       set_name, 5, 1, 1, atom)
151
0
DEF(set_name_computed, 1, 2, 2, none)
152
0
DEF(      set_proto, 1, 2, 1, none)
153
0
DEF(set_home_object, 1, 2, 2, none)
154
0
DEF(define_array_el, 1, 3, 2, none)
155
0
DEF(         append, 1, 3, 2, none) /* append enumerated object, update length */
156
0
DEF(copy_data_properties, 2, 3, 3, u8)
157
0
DEF(  define_method, 6, 2, 1, atom_u8)
158
0
DEF(define_method_computed, 2, 3, 1, u8) /* must come after define_method */
159
0
DEF(   define_class, 6, 2, 2, atom_u8) /* parent ctor -> ctor proto */
160
0
DEF(   define_class_computed, 6, 3, 3, atom_u8) /* field_name parent ctor -> field_name ctor proto (class with computed name) */
161
162
0
DEF(        get_loc, 3, 0, 1, loc)
163
0
DEF(        put_loc, 3, 1, 0, loc) /* must come after get_loc */
164
0
DEF(        set_loc, 3, 1, 1, loc) /* must come after put_loc */
165
0
DEF(        get_arg, 3, 0, 1, arg)
166
0
DEF(        put_arg, 3, 1, 0, arg) /* must come after get_arg */
167
0
DEF(        set_arg, 3, 1, 1, arg) /* must come after put_arg */
168
0
DEF(    get_var_ref, 3, 0, 1, var_ref) 
169
0
DEF(    put_var_ref, 3, 1, 0, var_ref) /* must come after get_var_ref */
170
0
DEF(    set_var_ref, 3, 1, 1, var_ref) /* must come after put_var_ref */
171
0
DEF(set_loc_uninitialized, 3, 0, 0, loc)
172
0
DEF(  get_loc_check, 3, 0, 1, loc)
173
0
DEF(  put_loc_check, 3, 1, 0, loc) /* must come after get_loc_check */
174
0
DEF(  put_loc_check_init, 3, 1, 0, loc)
175
0
DEF(get_var_ref_check, 3, 0, 1, var_ref) 
176
0
DEF(put_var_ref_check, 3, 1, 0, var_ref) /* must come after get_var_ref_check */
177
0
DEF(put_var_ref_check_init, 3, 1, 0, var_ref)
178
0
DEF(      close_loc, 3, 0, 0, loc)
179
0
DEF(       if_false, 5, 1, 0, label)
180
0
DEF(        if_true, 5, 1, 0, label) /* must come after if_false */
181
0
DEF(           goto, 5, 0, 0, label) /* must come after if_true */
182
0
DEF(          catch, 5, 0, 1, label)
183
0
DEF(          gosub, 5, 0, 0, label) /* used to execute the finally block */
184
0
DEF(            ret, 1, 1, 0, none) /* used to return from the finally block */
185
186
0
DEF(      to_object, 1, 1, 1, none)
187
//DEF(      to_string, 1, 1, 1, none)
188
0
DEF(     to_propkey, 1, 1, 1, none)
189
0
DEF(    to_propkey2, 1, 2, 2, none)
190
191
0
DEF(   with_get_var, 10, 1, 0, atom_label_u8)     /* must be in the same order as scope_xxx */
192
0
DEF(   with_put_var, 10, 2, 1, atom_label_u8)     /* must be in the same order as scope_xxx */
193
0
DEF(with_delete_var, 10, 1, 0, atom_label_u8)     /* must be in the same order as scope_xxx */
194
0
DEF(  with_make_ref, 10, 1, 0, atom_label_u8)     /* must be in the same order as scope_xxx */
195
0
DEF(   with_get_ref, 10, 1, 0, atom_label_u8)     /* must be in the same order as scope_xxx */
196
0
DEF(with_get_ref_undef, 10, 1, 0, atom_label_u8)
197
198
0
DEF(   make_loc_ref, 7, 0, 2, atom_u16)
199
0
DEF(   make_arg_ref, 7, 0, 2, atom_u16)
200
0
DEF(make_var_ref_ref, 7, 0, 2, atom_u16)
201
0
DEF(   make_var_ref, 5, 0, 2, atom)
202
203
0
DEF(   for_in_start, 1, 1, 1, none)
204
0
DEF(   for_of_start, 1, 1, 3, none)
205
0
DEF(for_await_of_start, 1, 1, 3, none)
206
0
DEF(    for_in_next, 1, 1, 3, none)
207
0
DEF(    for_of_next, 2, 3, 5, u8)
208
0
DEF(iterator_check_object, 1, 1, 1, none)
209
0
DEF(iterator_get_value_done, 1, 1, 2, none)
210
0
DEF( iterator_close, 1, 3, 0, none)
211
0
DEF(iterator_close_return, 1, 4, 4, none)
212
0
DEF(  iterator_next, 1, 4, 4, none)
213
0
DEF(  iterator_call, 2, 4, 5, u8)
214
0
DEF(  initial_yield, 1, 0, 0, none)
215
0
DEF(          yield, 1, 1, 2, none)
216
0
DEF(     yield_star, 1, 1, 2, none)
217
0
DEF(async_yield_star, 1, 1, 2, none)
218
0
DEF(          await, 1, 1, 1, none)
219
220
/* arithmetic/logic operations */
221
0
DEF(            neg, 1, 1, 1, none)
222
0
DEF(           plus, 1, 1, 1, none)
223
0
DEF(            dec, 1, 1, 1, none)
224
0
DEF(            inc, 1, 1, 1, none)
225
0
DEF(       post_dec, 1, 1, 2, none)
226
0
DEF(       post_inc, 1, 1, 2, none)
227
0
DEF(        dec_loc, 2, 0, 0, loc8)
228
0
DEF(        inc_loc, 2, 0, 0, loc8)
229
0
DEF(        add_loc, 2, 1, 0, loc8)
230
0
DEF(            not, 1, 1, 1, none)
231
0
DEF(           lnot, 1, 1, 1, none)
232
0
DEF(         typeof, 1, 1, 1, none)
233
0
DEF(         delete, 1, 2, 1, none)
234
0
DEF(     delete_var, 5, 0, 1, atom)
235
236
0
DEF(            mul, 1, 2, 1, none)
237
0
DEF(            div, 1, 2, 1, none)
238
0
DEF(            mod, 1, 2, 1, none)
239
0
DEF(            add, 1, 2, 1, none)
240
0
DEF(            sub, 1, 2, 1, none)
241
0
DEF(            pow, 1, 2, 1, none)
242
0
DEF(            shl, 1, 2, 1, none)
243
0
DEF(            sar, 1, 2, 1, none)
244
0
DEF(            shr, 1, 2, 1, none)
245
0
DEF(             lt, 1, 2, 1, none)
246
0
DEF(            lte, 1, 2, 1, none)
247
0
DEF(             gt, 1, 2, 1, none)
248
0
DEF(            gte, 1, 2, 1, none)
249
0
DEF(     instanceof, 1, 2, 1, none)
250
0
DEF(             in, 1, 2, 1, none)
251
0
DEF(             eq, 1, 2, 1, none)
252
0
DEF(            neq, 1, 2, 1, none)
253
0
DEF(      strict_eq, 1, 2, 1, none)
254
0
DEF(     strict_neq, 1, 2, 1, none)
255
0
DEF(            and, 1, 2, 1, none)
256
0
DEF(            xor, 1, 2, 1, none)
257
0
DEF(             or, 1, 2, 1, none)
258
0
DEF(is_undefined_or_null, 1, 1, 1, none)
259
#ifdef CONFIG_BIGNUM
260
DEF(      mul_pow10, 1, 2, 1, none)
261
DEF(       math_mod, 1, 2, 1, none)
262
#endif
263
/* must be the last non short and non temporary opcode */
264
0
DEF(            nop, 1, 0, 0, none) 
265
266
/* temporary opcodes: never emitted in the final bytecode */
267
268
0
def(    enter_scope, 3, 0, 0, u16)  /* emitted in phase 1, removed in phase 2 */
269
0
def(    leave_scope, 3, 0, 0, u16)  /* emitted in phase 1, removed in phase 2 */
270
271
0
def(          label, 5, 0, 0, label) /* emitted in phase 1, removed in phase 3 */
272
273
0
def(scope_get_var_undef, 7, 0, 1, atom_u16) /* emitted in phase 1, removed in phase 2 */
274
0
def(  scope_get_var, 7, 0, 1, atom_u16) /* emitted in phase 1, removed in phase 2 */
275
0
def(  scope_put_var, 7, 1, 0, atom_u16) /* emitted in phase 1, removed in phase 2 */
276
0
def(scope_delete_var, 7, 0, 1, atom_u16) /* emitted in phase 1, removed in phase 2 */
277
0
def( scope_make_ref, 11, 0, 2, atom_label_u16) /* emitted in phase 1, removed in phase 2 */
278
0
def(  scope_get_ref, 7, 0, 2, atom_u16) /* emitted in phase 1, removed in phase 2 */
279
0
def(scope_put_var_init, 7, 0, 2, atom_u16) /* emitted in phase 1, removed in phase 2 */
280
0
def(scope_get_private_field, 7, 1, 1, atom_u16) /* obj -> value, emitted in phase 1, removed in phase 2 */
281
0
def(scope_get_private_field2, 7, 1, 2, atom_u16) /* obj -> obj value, emitted in phase 1, removed in phase 2 */
282
0
def(scope_put_private_field, 7, 1, 1, atom_u16) /* obj value ->, emitted in phase 1, removed in phase 2 */
283
284
0
def( set_class_name, 5, 1, 1, u32) /* emitted in phase 1, removed in phase 2 */
285
    
286
0
def(       line_num, 5, 0, 0, u32) /* emitted in phase 1, removed in phase 3 */
287
288
0
#if SHORT_OPCODES
289
0
DEF(    push_minus1, 1, 0, 1, none_int)
290
0
DEF(         push_0, 1, 0, 1, none_int)
291
0
DEF(         push_1, 1, 0, 1, none_int)
292
0
DEF(         push_2, 1, 0, 1, none_int)
293
0
DEF(         push_3, 1, 0, 1, none_int)
294
0
DEF(         push_4, 1, 0, 1, none_int)
295
0
DEF(         push_5, 1, 0, 1, none_int)
296
0
DEF(         push_6, 1, 0, 1, none_int)
297
0
DEF(         push_7, 1, 0, 1, none_int)
298
0
DEF(        push_i8, 2, 0, 1, i8)
299
0
DEF(       push_i16, 3, 0, 1, i16)
300
0
DEF(    push_const8, 2, 0, 1, const8)
301
0
DEF(      fclosure8, 2, 0, 1, const8) /* must follow push_const8 */
302
0
DEF(push_empty_string, 1, 0, 1, none)
303
304
0
DEF(       get_loc8, 2, 0, 1, loc8)
305
0
DEF(       put_loc8, 2, 1, 0, loc8)
306
0
DEF(       set_loc8, 2, 1, 1, loc8)
307
308
0
DEF(       get_loc0, 1, 0, 1, none_loc)
309
0
DEF(       get_loc1, 1, 0, 1, none_loc)
310
0
DEF(       get_loc2, 1, 0, 1, none_loc)
311
0
DEF(       get_loc3, 1, 0, 1, none_loc)
312
0
DEF(       put_loc0, 1, 1, 0, none_loc)
313
0
DEF(       put_loc1, 1, 1, 0, none_loc)
314
0
DEF(       put_loc2, 1, 1, 0, none_loc)
315
0
DEF(       put_loc3, 1, 1, 0, none_loc)
316
0
DEF(       set_loc0, 1, 1, 1, none_loc)
317
0
DEF(       set_loc1, 1, 1, 1, none_loc)
318
0
DEF(       set_loc2, 1, 1, 1, none_loc)
319
0
DEF(       set_loc3, 1, 1, 1, none_loc)
320
0
DEF(       get_arg0, 1, 0, 1, none_arg)
321
0
DEF(       get_arg1, 1, 0, 1, none_arg)
322
0
DEF(       get_arg2, 1, 0, 1, none_arg)
323
0
DEF(       get_arg3, 1, 0, 1, none_arg)
324
0
DEF(       put_arg0, 1, 1, 0, none_arg)
325
0
DEF(       put_arg1, 1, 1, 0, none_arg)
326
0
DEF(       put_arg2, 1, 1, 0, none_arg)
327
0
DEF(       put_arg3, 1, 1, 0, none_arg)
328
0
DEF(       set_arg0, 1, 1, 1, none_arg)
329
0
DEF(       set_arg1, 1, 1, 1, none_arg)
330
0
DEF(       set_arg2, 1, 1, 1, none_arg)
331
0
DEF(       set_arg3, 1, 1, 1, none_arg)
332
0
DEF(   get_var_ref0, 1, 0, 1, none_var_ref)
333
0
DEF(   get_var_ref1, 1, 0, 1, none_var_ref)
334
0
DEF(   get_var_ref2, 1, 0, 1, none_var_ref)
335
0
DEF(   get_var_ref3, 1, 0, 1, none_var_ref)
336
0
DEF(   put_var_ref0, 1, 1, 0, none_var_ref)
337
0
DEF(   put_var_ref1, 1, 1, 0, none_var_ref)
338
0
DEF(   put_var_ref2, 1, 1, 0, none_var_ref)
339
0
DEF(   put_var_ref3, 1, 1, 0, none_var_ref)
340
0
DEF(   set_var_ref0, 1, 1, 1, none_var_ref)
341
0
DEF(   set_var_ref1, 1, 1, 1, none_var_ref)
342
0
DEF(   set_var_ref2, 1, 1, 1, none_var_ref)
343
0
DEF(   set_var_ref3, 1, 1, 1, none_var_ref)
344
345
0
DEF(     get_length, 1, 1, 1, none)
346
347
0
DEF(      if_false8, 2, 1, 0, label8)
348
0
DEF(       if_true8, 2, 1, 0, label8) /* must come after if_false8 */
349
0
DEF(          goto8, 2, 0, 0, label8) /* must come after if_true8 */
350
0
DEF(         goto16, 3, 0, 0, label16)
351
352
0
DEF(          call0, 1, 1, 1, npopx)
353
0
DEF(          call1, 1, 1, 1, npopx)
354
0
DEF(          call2, 1, 1, 1, npopx)
355
0
DEF(          call3, 1, 1, 1, npopx)
356
357
0
DEF(   is_undefined, 1, 1, 1, none)
358
0
DEF(        is_null, 1, 1, 1, none)
359
0
DEF(typeof_is_undefined, 1, 1, 1, none)
360
0
DEF( typeof_is_function, 1, 1, 1, none)
361
0
#endif
362
363
0
#undef DEF
364
0
#undef def
365
0
#endif  /* DEF */