| 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 | #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 | DEF(invalid, 1, 0, 0, none) /* never emitted */ |
| 66 | |
| 67 | /* push values */ |
| 68 | DEF( push_i32, 5, 0, 1, i32) |
| 69 | DEF( push_const, 5, 0, 1, const) |
| 70 | DEF( fclosure, 5, 0, 1, const) /* must follow push_const */ |
| 71 | DEF(push_atom_value, 5, 0, 1, atom) |
| 72 | DEF( private_symbol, 5, 0, 1, atom) |
| 73 | DEF( undefined, 1, 0, 1, none) |
| 74 | DEF( null, 1, 0, 1, none) |
| 75 | DEF( push_this, 1, 0, 1, none) /* only used at the start of a function */ |
| 76 | DEF( push_false, 1, 0, 1, none) |
| 77 | DEF( push_true, 1, 0, 1, none) |
| 78 | DEF( object, 1, 0, 1, none) |
| 79 | DEF( special_object, 2, 0, 1, u8) /* only used at the start of a function */ |
| 80 | DEF( rest, 3, 0, 1, u16) /* only used at the start of a function */ |
| 81 | |
| 82 | DEF( drop, 1, 1, 0, none) /* a -> */ |
| 83 | DEF( nip, 1, 2, 1, none) /* a b -> b */ |
| 84 | DEF( nip1, 1, 3, 2, none) /* a b c -> b c */ |
| 85 | DEF( dup, 1, 1, 2, none) /* a -> a a */ |
| 86 | DEF( dup1, 1, 2, 3, none) /* a b -> a a b */ |
| 87 | DEF( dup2, 1, 2, 4, none) /* a b -> a b a b */ |
| 88 | DEF( dup3, 1, 3, 6, none) /* a b c -> a b c a b c */ |
| 89 | DEF( insert2, 1, 2, 3, none) /* obj a -> a obj a (dup_x1) */ |
| 90 | DEF( insert3, 1, 3, 4, none) /* obj prop a -> a obj prop a (dup_x2) */ |
| 91 | DEF( insert4, 1, 4, 5, none) /* this obj prop a -> a this obj prop a */ |
| 92 | DEF( perm3, 1, 3, 3, none) /* obj a b -> a obj b */ |
| 93 | DEF( perm4, 1, 4, 4, none) /* obj prop a b -> a obj prop b */ |
| 94 | DEF( perm5, 1, 5, 5, none) /* this obj prop a b -> a this obj prop b */ |
| 95 | DEF( swap, 1, 2, 2, none) /* a b -> b a */ |
| 96 | DEF( swap2, 1, 4, 4, none) /* a b c d -> c d a b */ |
| 97 | DEF( rot3l, 1, 3, 3, none) /* x a b -> a b x */ |
| 98 | DEF( rot3r, 1, 3, 3, none) /* a b x -> x a b */ |
| 99 | DEF( rot4l, 1, 4, 4, none) /* x a b c -> a b c x */ |
| 100 | DEF( rot5l, 1, 5, 5, none) /* x a b c d -> a b c d x */ |
| 101 | |
| 102 | DEF(call_constructor, 3, 2, 1, npop) /* func new.target args -> ret. arguments are not counted in n_pop */ |
| 103 | DEF( call, 3, 1, 1, npop) /* arguments are not counted in n_pop */ |
| 104 | DEF( tail_call, 3, 1, 0, npop) /* arguments are not counted in n_pop */ |
| 105 | DEF( call_method, 3, 2, 1, npop) /* arguments are not counted in n_pop */ |
| 106 | DEF(tail_call_method, 3, 2, 0, npop) /* arguments are not counted in n_pop */ |
| 107 | DEF( array_from, 3, 0, 1, npop) /* arguments are not counted in n_pop */ |
| 108 | DEF( apply, 3, 3, 1, u16) |
| 109 | DEF( return, 1, 1, 0, none) |
| 110 | DEF( return_undef, 1, 0, 0, none) |
| 111 | DEF(check_ctor_return, 1, 1, 2, none) |
| 112 | DEF( check_ctor, 1, 0, 0, none) |
| 113 | DEF( init_ctor, 1, 0, 1, none) |
| 114 | DEF( check_brand, 1, 2, 2, none) /* this_obj func -> this_obj func */ |
| 115 | DEF( add_brand, 1, 2, 0, none) /* this_obj home_obj -> */ |
| 116 | DEF( return_async, 1, 1, 0, none) |
| 117 | DEF( throw, 1, 1, 0, none) |
| 118 | DEF( throw_error, 6, 0, 0, atom_u8) |
| 119 | DEF( eval, 5, 1, 1, npop_u16) /* func args... -> ret_val */ |
| 120 | DEF( apply_eval, 3, 2, 1, u16) /* func array -> ret_eval */ |
| 121 | DEF( regexp, 1, 2, 1, none) /* create a RegExp object from the pattern and a |
| 122 | bytecode string */ |
| 123 | DEF( get_super, 1, 1, 1, none) |
| 124 | DEF( import, 1, 1, 1, none) /* dynamic module import */ |
| 125 | |
| 126 | DEF( check_var, 5, 0, 1, atom) /* check if a variable exists */ |
| 127 | DEF( get_var_undef, 5, 0, 1, atom) /* push undefined if the variable does not exist */ |
| 128 | DEF( get_var, 5, 0, 1, atom) /* throw an exception if the variable does not exist */ |
| 129 | DEF( put_var, 5, 1, 0, atom) /* must come after get_var */ |
| 130 | DEF( put_var_init, 5, 1, 0, atom) /* must come after put_var. Used to initialize a global lexical variable */ |
| 131 | DEF( put_var_strict, 5, 2, 0, atom) /* for strict mode variable write */ |
| 132 | |
| 133 | DEF( get_ref_value, 1, 2, 3, none) |
| 134 | DEF( put_ref_value, 1, 3, 0, none) |
| 135 | |
| 136 | DEF( define_var, 6, 0, 0, atom_u8) |
| 137 | DEF(check_define_var, 6, 0, 0, atom_u8) |
| 138 | DEF( define_func, 6, 1, 0, atom_u8) |
| 139 | DEF( get_field, 5, 1, 1, atom) |
| 140 | DEF( get_field2, 5, 1, 2, atom) |
| 141 | DEF( put_field, 5, 2, 0, atom) |
| 142 | DEF( get_private_field, 1, 2, 1, none) /* obj prop -> value */ |
| 143 | DEF( put_private_field, 1, 3, 0, none) /* obj value prop -> */ |
| 144 | DEF(define_private_field, 1, 3, 1, none) /* obj prop value -> obj */ |
| 145 | DEF( get_array_el, 1, 2, 1, none) |
| 146 | DEF( get_array_el2, 1, 2, 2, none) /* obj prop -> obj value */ |
| 147 | DEF( put_array_el, 1, 3, 0, none) |
| 148 | DEF(get_super_value, 1, 3, 1, none) /* this obj prop -> value */ |
| 149 | DEF(put_super_value, 1, 4, 0, none) /* this obj prop value -> */ |
| 150 | DEF( define_field, 5, 2, 1, atom) |
| 151 | DEF( set_name, 5, 1, 1, atom) |
| 152 | DEF(set_name_computed, 1, 2, 2, none) |
| 153 | DEF( set_proto, 1, 2, 1, none) |
| 154 | DEF(set_home_object, 1, 2, 2, none) |
| 155 | DEF(define_array_el, 1, 3, 2, none) |
| 156 | DEF( append, 1, 3, 2, none) /* append enumerated object, update length */ |
| 157 | DEF(copy_data_properties, 2, 3, 3, u8) |
| 158 | DEF( define_method, 6, 2, 1, atom_u8) |
| 159 | DEF(define_method_computed, 2, 3, 1, u8) /* must come after define_method */ |
| 160 | DEF( define_class, 6, 2, 2, atom_u8) /* parent ctor -> ctor proto */ |
| 161 | DEF( define_class_computed, 6, 3, 3, atom_u8) /* field_name parent ctor -> field_name ctor proto (class with computed name) */ |
| 162 | |
| 163 | DEF( get_loc, 3, 0, 1, loc) |
| 164 | DEF( put_loc, 3, 1, 0, loc) /* must come after get_loc */ |
| 165 | DEF( set_loc, 3, 1, 1, loc) /* must come after put_loc */ |
| 166 | DEF( get_arg, 3, 0, 1, arg) |
| 167 | DEF( put_arg, 3, 1, 0, arg) /* must come after get_arg */ |
| 168 | DEF( set_arg, 3, 1, 1, arg) /* must come after put_arg */ |
| 169 | DEF( get_var_ref, 3, 0, 1, var_ref) |
| 170 | DEF( put_var_ref, 3, 1, 0, var_ref) /* must come after get_var_ref */ |
| 171 | DEF( set_var_ref, 3, 1, 1, var_ref) /* must come after put_var_ref */ |
| 172 | DEF(set_loc_uninitialized, 3, 0, 0, loc) |
| 173 | DEF( get_loc_check, 3, 0, 1, loc) |
| 174 | DEF( put_loc_check, 3, 1, 0, loc) /* must come after get_loc_check */ |
| 175 | DEF( put_loc_check_init, 3, 1, 0, loc) |
| 176 | DEF(get_loc_checkthis, 3, 0, 1, loc) |
| 177 | DEF(get_var_ref_check, 3, 0, 1, var_ref) |
| 178 | DEF(put_var_ref_check, 3, 1, 0, var_ref) /* must come after get_var_ref_check */ |
| 179 | DEF(put_var_ref_check_init, 3, 1, 0, var_ref) |
| 180 | DEF( close_loc, 3, 0, 0, loc) |
| 181 | DEF( if_false, 5, 1, 0, label) |
| 182 | DEF( if_true, 5, 1, 0, label) /* must come after if_false */ |
| 183 | DEF( goto, 5, 0, 0, label) /* must come after if_true */ |
| 184 | DEF( catch, 5, 0, 1, label) |
| 185 | DEF( gosub, 5, 0, 0, label) /* used to execute the finally block */ |
| 186 | DEF( ret, 1, 1, 0, none) /* used to return from the finally block */ |
| 187 | DEF( nip_catch, 1, 2, 1, none) /* catch ... a -> a */ |
| 188 | |
| 189 | DEF( to_object, 1, 1, 1, none) |
| 190 | //DEF( to_string, 1, 1, 1, none) |
| 191 | DEF( to_propkey, 1, 1, 1, none) |
| 192 | DEF( to_propkey2, 1, 2, 2, none) |
| 193 | |
| 194 | DEF( with_get_var, 10, 1, 0, atom_label_u8) /* must be in the same order as scope_xxx */ |
| 195 | DEF( with_put_var, 10, 2, 1, atom_label_u8) /* must be in the same order as scope_xxx */ |
| 196 | DEF(with_delete_var, 10, 1, 0, atom_label_u8) /* must be in the same order as scope_xxx */ |
| 197 | DEF( with_make_ref, 10, 1, 0, atom_label_u8) /* must be in the same order as scope_xxx */ |
| 198 | DEF( with_get_ref, 10, 1, 0, atom_label_u8) /* must be in the same order as scope_xxx */ |
| 199 | |
| 200 | DEF( make_loc_ref, 7, 0, 2, atom_u16) |
| 201 | DEF( make_arg_ref, 7, 0, 2, atom_u16) |
| 202 | DEF(make_var_ref_ref, 7, 0, 2, atom_u16) |
| 203 | DEF( make_var_ref, 5, 0, 2, atom) |
| 204 | |
| 205 | DEF( for_in_start, 1, 1, 1, none) |
| 206 | DEF( for_of_start, 1, 1, 3, none) |
| 207 | DEF(for_await_of_start, 1, 1, 3, none) |
| 208 | DEF( for_in_next, 1, 1, 3, none) |
| 209 | DEF( for_of_next, 2, 3, 5, u8) |
| 210 | DEF(for_await_of_next, 1, 3, 4, none) /* iter next catch_offset -> iter next catch_offset obj */ |
| 211 | DEF(iterator_check_object, 1, 1, 1, none) |
| 212 | DEF(iterator_get_value_done, 1, 2, 3, none) /* catch_offset obj -> catch_offset value done */ |
| 213 | DEF( iterator_close, 1, 3, 0, none) |
| 214 | DEF( iterator_next, 1, 4, 4, none) |
| 215 | DEF( iterator_call, 2, 4, 5, u8) |
| 216 | DEF( initial_yield, 1, 0, 0, none) |
| 217 | DEF( yield, 1, 1, 2, none) |
| 218 | DEF( yield_star, 1, 1, 2, none) |
| 219 | DEF(async_yield_star, 1, 1, 2, none) |
| 220 | DEF( await, 1, 1, 1, none) |
| 221 | |
| 222 | /* arithmetic/logic operations */ |
| 223 | DEF( neg, 1, 1, 1, none) |
| 224 | DEF( plus, 1, 1, 1, none) |
| 225 | DEF( dec, 1, 1, 1, none) |
| 226 | DEF( inc, 1, 1, 1, none) |
| 227 | DEF( post_dec, 1, 1, 2, none) |
| 228 | DEF( post_inc, 1, 1, 2, none) |
| 229 | DEF( dec_loc, 2, 0, 0, loc8) |
| 230 | DEF( inc_loc, 2, 0, 0, loc8) |
| 231 | DEF( add_loc, 2, 1, 0, loc8) |
| 232 | DEF( not, 1, 1, 1, none) |
| 233 | DEF( lnot, 1, 1, 1, none) |
| 234 | DEF( typeof, 1, 1, 1, none) |
| 235 | DEF( delete, 1, 2, 1, none) |
| 236 | DEF( delete_var, 5, 0, 1, atom) |
| 237 | |
| 238 | DEF( mul, 1, 2, 1, none) |
| 239 | DEF( div, 1, 2, 1, none) |
| 240 | DEF( mod, 1, 2, 1, none) |
| 241 | DEF( add, 1, 2, 1, none) |
| 242 | DEF( sub, 1, 2, 1, none) |
| 243 | DEF( pow, 1, 2, 1, none) |
| 244 | DEF( shl, 1, 2, 1, none) |
| 245 | DEF( sar, 1, 2, 1, none) |
| 246 | DEF( shr, 1, 2, 1, none) |
| 247 | DEF( lt, 1, 2, 1, none) |
| 248 | DEF( lte, 1, 2, 1, none) |
| 249 | DEF( gt, 1, 2, 1, none) |
| 250 | DEF( gte, 1, 2, 1, none) |
| 251 | DEF( instanceof, 1, 2, 1, none) |
| 252 | DEF( in, 1, 2, 1, none) |
| 253 | DEF( eq, 1, 2, 1, none) |
| 254 | DEF( neq, 1, 2, 1, none) |
| 255 | DEF( strict_eq, 1, 2, 1, none) |
| 256 | DEF( strict_neq, 1, 2, 1, none) |
| 257 | DEF( and, 1, 2, 1, none) |
| 258 | DEF( xor, 1, 2, 1, none) |
| 259 | DEF( or, 1, 2, 1, none) |
| 260 | DEF(is_undefined_or_null, 1, 1, 1, none) |
| 261 | DEF( private_in, 1, 2, 1, none) |
| 262 | DEF(push_bigint_i32, 5, 0, 1, i32) |
| 263 | /* must be the last non short and non temporary opcode */ |
| 264 | DEF( nop, 1, 0, 0, none) |
| 265 | |
| 266 | /* temporary opcodes: never emitted in the final bytecode */ |
| 267 | |
| 268 | def( enter_scope, 3, 0, 0, u16) /* emitted in phase 1, removed in phase 2 */ |
| 269 | def( leave_scope, 3, 0, 0, u16) /* emitted in phase 1, removed in phase 2 */ |
| 270 | |
| 271 | def( label, 5, 0, 0, label) /* emitted in phase 1, removed in phase 3 */ |
| 272 | |
| 273 | /* the following opcodes must be in the same order as the 'with_x' and |
| 274 | get_var_undef, get_var and put_var opcodes */ |
| 275 | def(scope_get_var_undef, 7, 0, 1, atom_u16) /* emitted in phase 1, removed in phase 2 */ |
| 276 | def( scope_get_var, 7, 0, 1, atom_u16) /* emitted in phase 1, removed in phase 2 */ |
| 277 | def( scope_put_var, 7, 1, 0, atom_u16) /* emitted in phase 1, removed in phase 2 */ |
| 278 | def(scope_delete_var, 7, 0, 1, atom_u16) /* emitted in phase 1, removed in phase 2 */ |
| 279 | def( scope_make_ref, 11, 0, 2, atom_label_u16) /* emitted in phase 1, removed in phase 2 */ |
| 280 | def( scope_get_ref, 7, 0, 2, atom_u16) /* emitted in phase 1, removed in phase 2 */ |
| 281 | def(scope_put_var_init, 7, 0, 2, atom_u16) /* emitted in phase 1, removed in phase 2 */ |
| 282 | def(scope_get_var_checkthis, 7, 0, 1, atom_u16) /* emitted in phase 1, removed in phase 2, only used to return 'this' in derived class constructors */ |
| 283 | def(scope_get_private_field, 7, 1, 1, atom_u16) /* obj -> value, emitted in phase 1, removed in phase 2 */ |
| 284 | def(scope_get_private_field2, 7, 1, 2, atom_u16) /* obj -> obj value, emitted in phase 1, removed in phase 2 */ |
| 285 | def(scope_put_private_field, 7, 2, 0, atom_u16) /* obj value ->, emitted in phase 1, removed in phase 2 */ |
| 286 | def(scope_in_private_field, 7, 1, 1, atom_u16) /* obj -> res emitted in phase 1, removed in phase 2 */ |
| 287 | def(get_field_opt_chain, 5, 1, 1, atom) /* emitted in phase 1, removed in phase 2 */ |
| 288 | def(get_array_el_opt_chain, 1, 2, 1, none) /* emitted in phase 1, removed in phase 2 */ |
| 289 | def( set_class_name, 5, 1, 1, u32) /* emitted in phase 1, removed in phase 2 */ |
| 290 | |
| 291 | def( line_num, 5, 0, 0, u32) /* emitted in phase 1, removed in phase 3 */ |
| 292 | |
| 293 | #if SHORT_OPCODES |
| 294 | DEF( push_minus1, 1, 0, 1, none_int) |
| 295 | DEF( push_0, 1, 0, 1, none_int) |
| 296 | DEF( push_1, 1, 0, 1, none_int) |
| 297 | DEF( push_2, 1, 0, 1, none_int) |
| 298 | DEF( push_3, 1, 0, 1, none_int) |
| 299 | DEF( push_4, 1, 0, 1, none_int) |
| 300 | DEF( push_5, 1, 0, 1, none_int) |
| 301 | DEF( push_6, 1, 0, 1, none_int) |
| 302 | DEF( push_7, 1, 0, 1, none_int) |
| 303 | DEF( push_i8, 2, 0, 1, i8) |
| 304 | DEF( push_i16, 3, 0, 1, i16) |
| 305 | DEF( push_const8, 2, 0, 1, const8) |
| 306 | DEF( fclosure8, 2, 0, 1, const8) /* must follow push_const8 */ |
| 307 | DEF(push_empty_string, 1, 0, 1, none) |
| 308 | |
| 309 | DEF( get_loc8, 2, 0, 1, loc8) |
| 310 | DEF( put_loc8, 2, 1, 0, loc8) |
| 311 | DEF( set_loc8, 2, 1, 1, loc8) |
| 312 | |
| 313 | DEF( get_loc0, 1, 0, 1, none_loc) |
| 314 | DEF( get_loc1, 1, 0, 1, none_loc) |
| 315 | DEF( get_loc2, 1, 0, 1, none_loc) |
| 316 | DEF( get_loc3, 1, 0, 1, none_loc) |
| 317 | DEF( put_loc0, 1, 1, 0, none_loc) |
| 318 | DEF( put_loc1, 1, 1, 0, none_loc) |
| 319 | DEF( put_loc2, 1, 1, 0, none_loc) |
| 320 | DEF( put_loc3, 1, 1, 0, none_loc) |
| 321 | DEF( set_loc0, 1, 1, 1, none_loc) |
| 322 | DEF( set_loc1, 1, 1, 1, none_loc) |
| 323 | DEF( set_loc2, 1, 1, 1, none_loc) |
| 324 | DEF( set_loc3, 1, 1, 1, none_loc) |
| 325 | DEF( get_arg0, 1, 0, 1, none_arg) |
| 326 | DEF( get_arg1, 1, 0, 1, none_arg) |
| 327 | DEF( get_arg2, 1, 0, 1, none_arg) |
| 328 | DEF( get_arg3, 1, 0, 1, none_arg) |
| 329 | DEF( put_arg0, 1, 1, 0, none_arg) |
| 330 | DEF( put_arg1, 1, 1, 0, none_arg) |
| 331 | DEF( put_arg2, 1, 1, 0, none_arg) |
| 332 | DEF( put_arg3, 1, 1, 0, none_arg) |
| 333 | DEF( set_arg0, 1, 1, 1, none_arg) |
| 334 | DEF( set_arg1, 1, 1, 1, none_arg) |
| 335 | DEF( set_arg2, 1, 1, 1, none_arg) |
| 336 | DEF( set_arg3, 1, 1, 1, none_arg) |
| 337 | DEF( get_var_ref0, 1, 0, 1, none_var_ref) |
| 338 | DEF( get_var_ref1, 1, 0, 1, none_var_ref) |
| 339 | DEF( get_var_ref2, 1, 0, 1, none_var_ref) |
| 340 | DEF( get_var_ref3, 1, 0, 1, none_var_ref) |
| 341 | DEF( put_var_ref0, 1, 1, 0, none_var_ref) |
| 342 | DEF( put_var_ref1, 1, 1, 0, none_var_ref) |
| 343 | DEF( put_var_ref2, 1, 1, 0, none_var_ref) |
| 344 | DEF( put_var_ref3, 1, 1, 0, none_var_ref) |
| 345 | DEF( set_var_ref0, 1, 1, 1, none_var_ref) |
| 346 | DEF( set_var_ref1, 1, 1, 1, none_var_ref) |
| 347 | DEF( set_var_ref2, 1, 1, 1, none_var_ref) |
| 348 | DEF( set_var_ref3, 1, 1, 1, none_var_ref) |
| 349 | |
| 350 | DEF( get_length, 1, 1, 1, none) |
| 351 | |
| 352 | DEF( if_false8, 2, 1, 0, label8) |
| 353 | DEF( if_true8, 2, 1, 0, label8) /* must come after if_false8 */ |
| 354 | DEF( goto8, 2, 0, 0, label8) /* must come after if_true8 */ |
| 355 | DEF( goto16, 3, 0, 0, label16) |
| 356 | |
| 357 | DEF( call0, 1, 1, 1, npopx) |
| 358 | DEF( call1, 1, 1, 1, npopx) |
| 359 | DEF( call2, 1, 1, 1, npopx) |
| 360 | DEF( call3, 1, 1, 1, npopx) |
| 361 | |
| 362 | DEF( is_undefined, 1, 1, 1, none) |
| 363 | DEF( is_null, 1, 1, 1, none) |
| 364 | DEF(typeof_is_undefined, 1, 1, 1, none) |
| 365 | DEF( typeof_is_function, 1, 1, 1, none) |
| 366 | #endif |
| 367 | |
| 368 | #undef DEF |
| 369 | #undef def |
| 370 | #endif /* DEF */ |
| 371 | |