• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef CPP_ABCKIT_DYNAMIC_ISA_H
17 #define CPP_ABCKIT_DYNAMIC_ISA_H
18 
19 #include "instruction.h"
20 #include "core/import_descriptor.h"
21 #include "config.h"
22 
23 #include <cstdint>
24 #include <string_view>
25 
26 namespace abckit {
27 
28 /**
29  * @brief DynamicIsa class containing API's for dynamic ISA manipulation
30  */
31 class DynamicIsa final {
32     /// @brief To access private constructor
33     friend class abckit::Graph;
34 
35 public:
36     /**
37      * @brief Deleted constructor
38      * @param other
39      */
40     DynamicIsa(const DynamicIsa &other) = delete;
41 
42     /**
43      * @brief Deleted constructor
44      * @param other
45      * @return DynamicIsa
46      */
47     DynamicIsa &operator=(const DynamicIsa &other) = delete;
48 
49     /**
50      * @brief Deleted constructor
51      * @param other
52      */
53     DynamicIsa(DynamicIsa &&other) = delete;
54 
55     /**
56      * @brief Deleted constructor
57      * @param other
58      * @return DynamicIsa
59      */
60     DynamicIsa &operator=(DynamicIsa &&other) = delete;
61 
62     /**
63      * @brief Destructor
64      */
65     ~DynamicIsa() = default;
66 
67     // Rvalue annotated so we can call it only in callchain context
68 
69     /**
70      * @brief Creates instruction with opcode LOAD_STRING. This instruction loads the string `string` into `acc`.
71      * @return Instruction
72      * @param string to load
73      */
74     Instruction CreateLoadString(std::string_view string) &&;
75 
76     /**
77      * @brief Creates instruction with opcode SUB2. This instruction computes the binary operation `input0 - acc`, and
78      * stores the result in returned instruction.
79      * @return Instruction
80      * @param [ in ] acc - Inst containing right operand.
81      * @param [ in ] input0 - Inst containing left operand.
82      */
83     Instruction CreateSub2(Instruction acc, Instruction input0) &&;
84 
85     /**
86      * @brief Retruns Module for `inst`.
87      * @return Instruction
88      * @param [ in ] inst - Inst to be inspected.
89      */
90     core::Module GetModule(Instruction inst) &&;
91 
92     /**
93      * @brief Sets Module for `inst`.
94      * @return Instruction which is new state for inst.
95      * @param [ in ] inst - Inst to be modified.
96      * @param [ in ] mdl - Module to be set.
97      */
98     Instruction SetModule(Instruction inst, core::Module mdl) &&;
99 
100     /**
101      * @brief Returns condition code of `inst`.
102      * @return enum value of `AbckitIsaApiDynamicConditionCode`.
103      * @param [ in ] inst - Inst to be inspected.
104      */
105     AbckitIsaApiDynamicConditionCode GetConditionCode(Instruction inst) &&;
106 
107     /**
108      * @brief Sets condition code of `inst`.
109      * @return Instruction which is new state for inst.
110      * @param [ in ] inst - Inst to be modified.
111      * @param [ in ] cc - Condition code to be set.
112      */
113     Instruction SetConditionCode(Instruction inst, enum AbckitIsaApiDynamicConditionCode cc) &&;
114 
115     /**
116      * @brief Returns opcode of `inst`.
117      * @return `AbckitIsaApiDynamicOpcode` enum value.
118      * @param [ in ] inst - Inst to be inspected.
119      */
120     AbckitIsaApiDynamicOpcode GetOpcode(Instruction inst) &&;
121 
122     /**
123      * @brief Returns import descriptor of `inst`.
124      * @return ImportDescriptor
125      * @param [ in ] inst - Inst to be inspected.
126      */
127     core::ImportDescriptor GetImportDescriptor(Instruction inst) &&;
128 
129     /**
130      * @brief Sets import descriptor of `inst`.
131      * @return Instruction which is new state for inst.
132      * @param [ in ] inst - Inst to be modified.
133      * @param [ in ] descr - Import descriptor to be set.
134      */
135     Instruction SetImportDescriptor(Instruction inst, core::ImportDescriptor descr) &&;
136 
137     /**
138      * @brief Returns export descriptor of `inst`.
139      * @return `core::ExportDescriptor`
140      * @param [ in ] inst - Inst to be inspected.
141      */
142     core::ExportDescriptor GetExportDescriptor(Instruction inst) &&;
143 
144     /**
145      * @brief Sets export descriptor of `inst`.
146      * @return Instruction which is new state for inst.
147      * @param [ in ] inst - Inst to be modified.
148      * @param [ in ] descr - Export descriptor to be set.
149      */
150     Instruction SetExportDescriptor(Instruction inst, core::ExportDescriptor descr) &&;
151 
152     /**
153      * @brief Creates instruction with opcode LDNAN. This instruction loads the `nan` into `acc`.
154      * @return Instruction
155      */
156     Instruction CreateLdnan() &&;
157 
158     /**
159      * @brief Creates instruction with opcode LDINFINITY. This instruction loads the `infinity` into `acc`.
160      * @return Instruction
161      */
162     Instruction CreateLdinfinity() &&;
163 
164     /**
165      * @brief Creates instruction with opcode LDUNDEFINED. This instruction loads the `undefined` into `acc`.
166      * @return Instruction
167      */
168     Instruction CreateLdundefined() &&;
169 
170     /**
171      * @brief Creates instruction with opcode LDNULL. This instruction loads the `null` into `acc`.
172      * @return Instruction
173      */
174     Instruction CreateLdnull() &&;
175 
176     /**
177      * @brief Creates instruction with opcode LDSYMBOL. This instruction loads the object `Symbol` in `acc`.
178      * @return Instruction
179      */
180     Instruction CreateLdsymbol() &&;
181 
182     /**
183      * @brief Creates instruction with opcode LDGLOBAL. This instruction loads the object `global` into `acc`.
184      * @return Instruction
185      */
186     Instruction CreateLdglobal() &&;
187 
188     /**
189      * @brief Creates instruction with opcode LDTRUE. This instruction loads `true` into `acc`.
190      * @return Instruction
191      */
192     Instruction CreateLdtrue() &&;
193 
194     /**
195      * @brief Creates instruction with opcode LDFALSE. This instruction loads `false` into `acc`.
196      * @return Instruction
197      */
198     Instruction CreateLdfalse() &&;
199 
200     /**
201      * @brief Creates instruction with opcode LDHOLE. This instruction loads `hole` into `acc`.
202      * @return Instruction
203      */
204     Instruction CreateLdhole() &&;
205 
206     /**
207      * @brief Creates instruction with opcode LDNEWTARGET. This instruction loads the implicit parameter `new.target` of
208      * the current function into `acc`.
209      * @return Instruction
210      */
211     Instruction CreateLdnewtarget() &&;
212 
213     /**
214      * @brief Creates instruction with opcode LDTHIS. This instruction loads `this` into `acc`.
215      * @return Instruction
216      */
217     Instruction CreateLdthis() &&;
218 
219     /**
220      * @brief Creates instruction with opcode POPLEXENV. This instruction pops the current lexical environment.
221      * @return Instruction
222      */
223     Instruction CreatePoplexenv() &&;
224 
225     /**
226      * @brief Creates instruction with opcode GETUNMAPPEDARGS. This instruction loads the arguments object of the
227      * current function into `acc`.
228      * @return Instruction
229      */
230     Instruction CreateGetunmappedargs() &&;
231 
232     /**
233      * @brief Creates instruction with opcode ASYNCFUNCTIONENTER. This instruction creates an async function object,
234      * and store the object in `acc`.
235      * @return Instruction
236      */
237     Instruction CreateAsyncfunctionenter() &&;
238 
239     /**
240      * @brief Creates instruction with opcode LDFUNCTION. This instruction loads the current function object in `acc`.
241      * @return Instruction
242      */
243     Instruction CreateLdfunction() &&;
244 
245     /**
246      * @brief Creates instruction with opcode DEBUGGER. This instruction pauses execution during debugging.
247      * @return Instruction
248      */
249     Instruction CreateDebugger() &&;
250 
251     /**
252      * @brief Creates instruction with opcode GETPROPITERATOR. This instruction loads `acc`'s for-in iterator into
253      * `acc`.
254      * @return Instruction
255      * @param [ in ] acc - Inst containing object.
256      */
257     Instruction CreateGetpropiterator(Instruction acc) &&;
258     /**
259      * @brief Creates instruction with opcode GETITERATOR. This instruction executes GetIterator(acc, sync), and stores
260      * the result into `acc`.
261      * @return Instruction
262      * @param [ in ] acc - Inst containing object.
263      */
264     Instruction CreateGetiterator(Instruction acc) &&;
265     /**
266      * @brief Creates instruction with opcode GETASYNCITERATOR. This instruction executes GetIterator(acc, sync), and
267      * stores the result into `acc`.
268      * @return Instruction
269      * @param [ in ] acc - Inst containing object.
270      */
271     Instruction CreateGetasynciterator(Instruction acc) &&;
272 
273     /**
274      * @brief Creates instruction with opcode LDPRIVATEPROPERTY. This instruction loads the property of `acc` of the
275      * key obtained from the specified lexical position into `acc`.
276      * @return Instruction
277      * @param [ in ] acc - Inst containing object.
278      * @param [ in ] imm0 - Lexical environment level.
279      * @param [ in ] imm1 - Slot number.
280      */
281     Instruction CreateLdprivateproperty(Instruction acc, uint64_t imm0, uint64_t imm1) &&;
282 
283     /**
284      * @brief Creates instruction with opcode STPRIVATEPROPERTY. This instruction loads the property of `input0` of the
285      * key obtained from the specified lexical position into `acc`.
286      * @return Instruction
287      * @param [ in ] acc - ??????????.
288      * @param [ in ] imm0 - Lexical environment level.
289      * @param [ in ] imm1 - Slot number.
290      * @param [ in ] input0 - Inst containing object.
291      */
292     Instruction CreateStprivateproperty(Instruction acc, uint64_t imm0, uint64_t imm1, Instruction input0) &&;
293 
294     /**
295      * @brief Creates instruction with opcode TESTIN. This instruction loads a token from the specified lexical
296      * position, checks whether it is a property of the object stored in `acc`.
297      * @return Instruction
298      * @param [ in ] acc - Inst containing object.
299      * @param [ in ] imm0 - Lexical environment level.
300      * @param [ in ] imm1 - Slot number.
301      */
302     Instruction CreateTestin(Instruction acc, uint64_t imm0, uint64_t imm1) &&;
303 
304     /**
305      * @brief Creates instruction with opcode DEFINEFIELDBYNAME. This instruction defines a property named 'string` for
306      * object `input0`, and stores value `acc` in `string`
307      * @return Instruction
308      * @param [ in ] acc - Value to be stored.
309      * @param [ in ] string - Field name.
310      * @param [ in ] input0 - Inst containing object.
311      */
312     Instruction CreateDefinefieldbyname(Instruction acc, std::string_view string, Instruction input0) &&;
313 
314     /**
315      * @brief Creates instruction with opcode DEFINEPROPERTYBYNAME.
316      * @return Instruction
317      * @param [ in ] acc - Value to be stored.
318      * @param [ in ] string - Property name.
319      * @param [ in ] input0 - Inst containing object.
320      */
321     Instruction CreateDefinepropertybyname(Instruction acc, std::string_view string, Instruction input0) &&;
322 
323     /**
324      * @brief Creates instruction with opcode CREATEEMPTYOBJECT. This instruction creates an empty object, and stores
325      * it in `acc`.
326      * @return Instruction
327      */
328     Instruction CreateCreateemptyobject() &&;
329 
330     /**
331      * @brief Creates instruction with opcode CREATEEMPTYARRAY. This instruction creates an empty array, and stores
332      * it in `acc`.
333      * @return Instruction
334      */
335     Instruction CreateCreateemptyarray() &&;
336 
337     /**
338      * @brief Creates instruction with opcode CREATEGENERATOROBJ. This instruction creates a generator with the
339      * function object `input0`, and stores it in `acc`.
340      * @return Instruction
341      * @param [ in ] input0 - Inst containing function object.
342      */
343     Instruction CreateCreategeneratorobj(Instruction input0) &&;
344 
345     /**
346      * @brief Creates instruction with opcode CREATEITERRESULTOBJ. This instruction executes `CreateIterResultObject`
347      * with arguments `value` `input0` and `done` `input1`.
348      * @return Instruction
349      * @param [ in ] input0 - Inst containing object.
350      * @param [ in ] input1 - Inst containing boolean.
351      */
352     Instruction CreateCreateiterresultobj(Instruction input0, Instruction input1) &&;
353 
354     /**
355      * @brief Creates instruction with opcode CREATEOBJECTWITHEXCLUDEDKEYS. This instruction creates an object based on
356      * object `input0` with excluded properties of the keys `input1`, `inputs[0]`, ..., `inputs[imm0-1]`, and stores
357      * it in `acc`.
358      * @return Instruction
359      * @param [ in ] input0 - Inst containing object.
360      * @param [ in ] input1 - Inst containing first `key`.
361      * @param [ in ] imm0 - Number of optional insts containing `key`s.
362      * @param [ in ] args - Optional insts containing `key`s.
363      */
364     template <typename... Args>
365     Instruction CreateCreateobjectwithexcludedkeys(Instruction input0, Instruction input1, uint64_t imm0,
366                                                    Args... args) &&;
367 
368     /**
369      * @brief Creates instruction with opcode WIDE_CREATEOBJECTWITHEXCLUDEDKEYS. This instruction creates an object
370      * based on object `input0` with excluded properties of the keys `input1`, `inputs[0]`, ..., `inputs[imm0-1]`, and
371      * stores it in `acc`.
372      * @return Instruction
373      * @param [ in ] input0 - Inst containing object.
374      * @param [ in ] input1 - Inst containing first `key`.
375      * @param [ in ] imm0 - Number of optional insts containing `key`s.
376      * @param [ in ] args - Optional insts containing `key`s.
377      */
378     template <typename... Args>
379     Instruction CreateWideCreateobjectwithexcludedkeys(Instruction input0, Instruction input1, uint64_t imm0,
380                                                        Args... args) &&;
381 
382     /**
383      * @brief Creates instruction with opcode CREATEARRAYWITHBUFFER. This instruction creates an array using literal
384      * array indexed by `literalArray`, and stores it in `acc`.
385      * @return Instruction
386      * @param [ in ] literalArray - Literal array used in array creation.
387      */
388     Instruction CreateCreatearraywithbuffer(LiteralArray literalArray) &&;
389 
390     /**
391      * @brief Creates instruction with opcode CREATEOBJECTWITHBUFFER. This instruction creates an object using literal
392      * array indexed by `literalArray`, and stores it in `acc`.
393      * @return Instruction
394      * @param [ in ] literalArray - Literal array used in object creation.
395      */
396     Instruction CreateCreateobjectwithbuffer(LiteralArray literalArray) &&;
397 
398     /**
399      * @brief Creates instruction with opcode NEWOBJAPPLY. This instruction creates an instance of `input0` with
400      * arguments list `acc`, and stores the instance in `acc`.
401      * @return Instruction
402      * @param [ in ] acc - Inst containing parameter list.
403      * @param [ in ] input0 - Inst containing class object.
404      */
405     Instruction CreateNewobjapply(Instruction acc, Instruction input0) &&;
406 
407     /**
408      * @brief Creates instruction with opcode NEWOBJRANGE. This instruction invokes the constructor of `inputs[0]` with
409      * arguments `inputs[1]`, ..., `inputs[argCount-1]` to create a class instance, and stores the instance in `acc`.
410      * @return Instruction
411      * @param [ in ] input0 - Class object.
412      * @param [ in ] args - Number of insts containing arguments.
413      */
414     template <typename... Args>
415     Instruction CreateNewobjrange(Instruction input0, Args... args) &&;
416 
417     /**
418      * @brief Creates instruction with opcode NEWOBJRANGE. This instruction invokes the constructor of `inputs[0]` with
419      * arguments `inputs[1]`, ..., `inputs[argCount-1]` to create a class instance, and stores the instance in `acc`.
420      * @return Instruction
421      * @param [ in ] input0 - Class object.
422      * @param [ in ] args - Number of insts containing arguments.
423      */
424     template <typename... Args>
425     Instruction CreateWideNewobjrange(Instruction input0, Args... args) &&;
426 
427     /**
428      * @brief Creates instruction with opcode NEWLEXENV. This instruction creates a lexical environment with `imm0`
429      * slots, and stores it in `acc`.
430      * @return Instruction
431      * @param [ in ] imm0 - Number of slots in the lexical environment.
432      */
433     Instruction CreateNewlexenv(uint64_t imm0) &&;
434 
435     /**
436      * @brief Creates instruction with opcode WIDE_NEWLEXENV. This instruction creates a lexical environment with `imm0`
437      * slots, and stores it in `acc`.
438      * @return Instruction
439      * @param [ in ] imm0 - Number of slots in the lexical environment.
440      */
441     Instruction CreateWideNewlexenv(uint64_t imm0) &&;
442 
443     /**
444      * @brief Creates instruction with opcode NEWLEXENVWITHNAME. This instruction creates a lexical environment with
445      * `imm0` slots using the names of lexical variables stored in literal array `literalArray`, and stores the
446      * created environment in `acc`.
447      * @return Instruction
448      * @param [ in ] imm0 - Number of slots in the lexical environment.
449      * @param [ in ] literalArray - Literal array with names of lexical variables.
450      */
451     Instruction CreateNewlexenvwithname(uint64_t imm0, LiteralArray literalArray) &&;
452 
453     /**
454      * @brief Creates instruction with opcode WIDE_NEWLEXENVWITHNAME. This instruction creates a lexical environment
455      * with `imm0` slots using the names of lexical variables stored in literal array `literalArray`, and stores the
456      * created environment in `acc`.
457      * @return Instruction
458      * @param [ in ] imm0 - Number of slots in the lexical environment.
459      * @param [ in ] literalArray - Literal array with names of lexical variables.
460      */
461     Instruction CreateWideNewlexenvwithname(uint64_t imm0, LiteralArray literalArray) &&;
462 
463     /**
464      * @brief Creates instruction with opcode CREATEASYNCGENERATOROBJ. This instruction creates an async generator
465      * function object with the function object `input0`, and stores the generator in `acc`.
466      * @return Instruction
467      * @param [ in ] input0 - Inst containing function object.
468      */
469     Instruction CreateCreateasyncgeneratorobj(Instruction input0) &&;
470 
471     /**
472      * @brief Creates instruction with opcode ASYNCGENERATORRESOLVE. This instruction executes `AsyncGeneratorResolve`
473      * with arguments `generator input0`, `value input1`, and `done input2`.
474      * @return Instruction
475      * @param [ in ] input0 - Inst containing `generator`.
476      * @param [ in ] input1 - Inst containing `value` object.
477      * @param [ in ] input2 - Inst containing `done` boolean.
478      */
479     Instruction CreateAsyncgeneratorresolve(Instruction input0, Instruction input1, Instruction input2) &&;
480 
481     /**
482      * @brief Creates instruction with opcode ADD2. This instruction computes the binary operation `input0 + acc`, and
483      * stores the result in `acc`.
484      * @return Instruction
485      * @param [ in ] acc - Inst containing right operand.
486      * @param [ in ] input0 - Inst containing left operand.
487      */
488     Instruction CreateAdd2(Instruction acc, Instruction input0) &&;
489 
490     /**
491      * @brief Creates instruction with opcode MUL2. This instruction computes the binary operation `input0 * acc`, and
492      * stores the result in `acc`.
493      * @return Instruction
494      * @param [ in ] acc - Inst containing right operand.
495      * @param [ in ] input0 - Inst containing left operand.
496      */
497     Instruction CreateMul2(Instruction acc, Instruction input0) &&;
498 
499     /**
500      * @brief Creates instruction with opcode DIV2. This instruction computes the binary operation `input0 / acc`, and
501      * stores the result in `acc`.
502      * @return Instruction
503      * @param [ in ] acc - Inst containing right operand.
504      * @param [ in ] input0 - Inst containing left operand.
505      */
506     Instruction CreateDiv2(Instruction acc, Instruction input0) &&;
507 
508     /**
509      * @brief Creates instruction with opcode MOD2. This instruction computes the binary operation `input0 % acc`, and
510      * stores the result in `acc`.
511      * @return Instruction
512      * @param [ in ] acc - Inst containing right operand.
513      * @param [ in ] input0 - Inst containing left operand.
514      */
515     Instruction CreateMod2(Instruction acc, Instruction input0) &&;
516 
517     /**
518      * @brief Creates instruction with opcode EQ. This instruction computes the binary operation `input0 == acc`, and
519      * stores the result in `acc`.
520      * @return Instruction
521      * @param [ in ] acc - Inst containing right operand.
522      * @param [ in ] input0 - Inst containing left operand.
523      */
524     Instruction CreateEq(Instruction acc, Instruction input0) &&;
525 
526     /**
527      * @brief Creates instruction with opcode NOTEQ. This instruction computes the binary operation `input0 != acc`, and
528      * stores the result in `acc`.
529      * @return Instruction
530      * @param [ in ] acc - Inst containing right operand.
531      * @param [ in ] input0 - Inst containing left operand.
532      */
533     Instruction CreateNoteq(Instruction acc, Instruction input0) &&;
534 
535     /**
536      * @brief Creates instruction with opcode LESS. This instruction computes the binary operation `input0 < acc`, and
537      * stores the result in `acc`.
538      * @return Instruction
539      * @param [ in ] acc - Inst containing right operand.
540      * @param [ in ] input0 - Inst containing left operand.
541      */
542     Instruction CreateLess(Instruction acc, Instruction input0) &&;
543 
544     /**
545      * @brief Creates instruction with opcode LESSEQ. This instruction computes the binary operation `input0 <= acc`.
546      * @return Instruction
547      * @param [ in ] acc - Inst containing right operand.
548      * @param [ in ] input0 - Inst containing left operand.
549      */
550     Instruction CreateLesseq(Instruction acc, Instruction input0) &&;
551 
552     /**
553      * @brief Creates instruction with opcode GREATER. This instruction computes the binary operation `input0 > acc`.
554      * @return Instruction
555      * @param [ in ] acc - Inst containing right operand.
556      * @param [ in ] input0 - Inst containing left operand.
557      */
558     Instruction CreateGreater(Instruction acc, Instruction input0) &&;
559 
560     /**
561      * @brief Creates instruction with opcode GREATEREQ. This instruction computes the binary operation `input0 >= acc`.
562      * @return Instruction
563      * @param [ in ] acc - Inst containing right operand.
564      * @param [ in ] input0 - Inst containing left operand.
565      */
566     Instruction CreateGreatereq(Instruction acc, Instruction input0) &&;
567 
568     /**
569      * @brief Creates instruction with opcode SHL2. This instruction computes the binary operation `input0 << acc`.
570      * @return Instruction
571      * @param [ in ] acc - Inst containing right operand.
572      * @param [ in ] input0 - Inst containing left operand.
573      */
574     Instruction CreateShl2(Instruction acc, Instruction input0) &&;
575 
576     /**
577      * @brief Creates instruction with opcode SHR2. This instruction computes the binary operation `input0 >> acc`.
578      * @return Instruction
579      * @param [ in ] acc - Inst containing right operand.
580      * @param [ in ] input0 - Inst containing left operand.
581      */
582     Instruction CreateShr2(Instruction acc, Instruction input0) &&;
583 
584     /**
585      * @brief Creates instruction with opcode ASHR2. This instruction computes the binary operation `input0 >>> acc`.
586      * @return Instruction
587      * @param [ in ] acc - Inst containing right operand.
588      * @param [ in ] input0 - Inst containing left operand.
589      */
590     Instruction CreateAshr2(Instruction acc, Instruction input0) &&;
591 
592     /**
593      * @brief Creates instruction with opcode AND2. This instruction computes the binary operation `input0 & acc`.
594      * @return Instruction
595      * @param [ in ] acc - Inst containing right operand.
596      * @param [ in ] input0 - Inst containing left operand.
597      */
598     Instruction CreateAnd2(Instruction acc, Instruction input0) &&;
599 
600     /**
601      * @brief Creates instruction with opcode OR2. This instruction computes the binary operation `input0 | acc`.
602      * @return Instruction
603      * @param [ in ] acc - Inst containing right operand.
604      * @param [ in ] input0 - Inst containing left operand.
605      */
606     Instruction CreateOr2(Instruction acc, Instruction input0) &&;
607 
608     /**
609      * @brief Creates instruction with opcode XOR2. This instruction computes the binary operation `input0 ^ acc`.
610      * @return Instruction
611      * @param [ in ] acc - Inst containing right operand.
612      * @param [ in ] input0 - Inst containing left operand.
613      */
614     Instruction CreateXor2(Instruction acc, Instruction input0) &&;
615 
616     /**
617      * @brief Creates instruction with opcode EXP. This instruction computes the binary operation `input0 ** acc`.
618      * @return Instruction
619      * @param [ in ] acc - Inst containing right operand.
620      * @param [ in ] input0 - Inst containing left operand.
621      */
622     Instruction CreateExp(Instruction acc, Instruction input0) &&;
623 
624     /**
625      * @brief Creates instruction with opcode TYPEOF. This instruction computes `typeof acc`.
626      * @return Instruction
627      * @param [ in ] acc - Inst containing object to be inspected.
628      */
629     Instruction CreateTypeof(Instruction acc) &&;
630 
631     /**
632      * @brief Creates instruction with opcode TONUMBER. This instruction executes `ToNumber` with argument `acc`, and
633      * stores the result in `acc`.
634      * @return Instruction
635      * @param [ in ] acc - Inst containing object.
636      */
637     Instruction CreateTonumber(Instruction acc) &&;
638 
639     /**
640      * @brief Creates instruction with opcode TONUMERIC. This instruction executes `ToNumeric` with argument `acc`, and
641      * stores the result in `acc`.
642      * @return Instruction
643      * @param [ in ] acc - Inst containing object.
644      */
645     Instruction CreateTonumeric(Instruction acc) &&;
646 
647     /**
648      * @brief Creates instruction with opcode NEG. This instruction computes `-acc`.
649      * @return Instruction
650      * @param [ in ] acc - Inst containing operand.
651      */
652     Instruction CreateNeg(Instruction acc) &&;
653 
654     /**
655      * @brief Creates instruction with opcode NOT. This instruction computes `!acc`.
656      * @return Instruction
657      * @param [ in ] acc - Inst containing operand.
658      */
659     Instruction CreateNot(Instruction acc) &&;
660 
661     /**
662      * @brief Creates instruction with opcode INC. This instruction computes `acc + 1`.
663      * @return Instruction
664      * @param [ in ] acc - Inst containing operand.
665      */
666     Instruction CreateInc(Instruction acc) &&;
667 
668     /**
669      * @brief Creates instruction with opcode DEC. This instruction computes `acc - 1`.
670      * @return Instruction
671      * @param [ in ] acc - Inst containing operand.
672      */
673     Instruction CreateDec(Instruction acc) &&;
674 
675     /**
676      * @brief Creates instruction with opcode ISTRUE. This instruction computes `acc == true`.
677      * @return Instruction
678      * @param [ in ] acc - Inst containing object.
679      */
680     Instruction CreateIstrue(Instruction acc) &&;
681 
682     /**
683      * @brief Creates instruction with opcode ISFALSE. This instruction computes `acc == false`.
684      * @return Instruction
685      * @param [ in ] acc - Inst containing object.
686      */
687     Instruction CreateIsfalse(Instruction acc) &&;
688 
689     /**
690      * @brief Creates instruction with opcode ISIN. This instruction computes `input0 in acc`.
691      * @return Instruction
692      * @param [ in ] acc - Inst containing object.
693      * @param [ in ] input0 - Inst containing object.
694      */
695     Instruction CreateIsin(Instruction acc, Instruction input0) &&;
696 
697     /**
698      * @brief Creates instruction with opcode INSTANCEOF. This instruction computes `input0 instanceof acc`, and stores
699      * the result in `acc`.
700      * @return Instruction
701      * @param [ in ] acc - Inst containing object.
702      * @param [ in ] input0 - Inst containing object.
703      */
704     Instruction CreateInstanceof(Instruction acc, Instruction input0) &&;
705 
706     /**
707      * @brief Creates instruction with opcode STRICTNOTEQ. This instruction computes `input0 !== acc`, and stores
708      * the result in `acc`.
709      * @return Instruction
710      * @param [ in ] acc - Inst containing object.
711      * @param [ in ] input0 - Inst containing object.
712      */
713     Instruction CreateStrictnoteq(Instruction acc, Instruction input0) &&;
714 
715     /**
716      * @brief Creates instruction with opcode STRICTEQ. This instruction computes `input0 === acc`, and stores
717      * the result in `acc`.
718      * @return Instruction
719      * @param [ in ] acc - Inst containing object.
720      * @param [ in ] input0 - Inst containing object.
721      */
722     Instruction CreateStricteq(Instruction acc, Instruction input0) &&;
723 
724     /**
725      * @brief Creates instruction with opcode CALLRUNTIME_NOTIFYCONCURRENTRESULT. This instruction notifies runtime with
726      * the return value of the underlying concurrent function. This instruction appears only in concurrent functions.
727      * @return Instruction
728      * @param [ in ] acc - Inst containing concurrent function result.
729      */
730     Instruction CreateCallruntimeNotifyconcurrentresult(Instruction acc) &&;
731 
732     /**
733      * @brief Creates instruction with opcode CALLRUNTIME_DEFINEFIELDBYVALUE. This instruction defines a property with
734      * key `input0` for object `input1`, and stores the value of `acc` in it.
735      * @return Instruction
736      * @param [ in ] acc - Inst containing value for a property.
737      * @param [ in ] input0 - Inst containing key for property.
738      * @param [ in ] input1 - Inst containing object to be modified.
739      */
740     Instruction CreateCallruntimeDefinefieldbyvalue(Instruction acc, Instruction input0, Instruction input1) &&;
741 
742     /**
743      * @brief Creates instruction with opcode CALLRUNTIME_DEFINEFIELDBYINDEX. This instruction defines a property with
744      * key `imm0` for object `input0`, and stores the value of `acc` in it.
745      * @return Instruction
746      * @param [ in ] acc - Inst containing value for a property.
747      * @param [ in ] imm0 - Key for property.
748      * @param [ in ] input0 - Inst containing object to be modified.
749      */
750     Instruction CreateCallruntimeDefinefieldbyindex(Instruction acc, uint64_t imm0, Instruction input0) &&;
751 
752     /**
753      * @brief Creates instruction with opcode CALLRUNTIME_TOPROPERTYKEY. This instruction converts `acc` to property
754      * key, if fails, throw an exception.
755      * @return Instruction
756      * @param [ in ] acc - Inst containing value.
757      */
758     Instruction CreateCallruntimeTopropertykey(Instruction acc) &&;
759 
760     /**
761      * @brief Creates instruction with opcode CALLRUNTIME_CREATEPRIVATEPROPERTY. This instruction creates `imm0`
762      * symbols. Obtains the stored private method according to the literal array `literalArray`. If a private instance
763      * method exists, creates an additional symbol ("method"). Puts all the created symbols at the end of the lexical
764      * environment of the current class according to the creation sequence. This instruction appears only in the
765      * class definition.
766      * @return Instruction
767      * @param [ in ] imm0 - Number of symbols to create.
768      * @param [ in ] literalArray - Literal array of symbols.
769      */
770     Instruction CreateCallruntimeCreateprivateproperty(uint64_t imm0, LiteralArray literalArray) &&;
771 
772     /**
773      * @brief Creates instruction with opcode CALLRUNTIME_DEFINEPRIVATEPROPERTY. This instruction gets a token from the
774      * specified lexical position, and appends it to object `input0` as a property.
775      * @return Instruction
776      * @param [ in ] acc - Inst containing a value of a property.
777      * @param [ in ] imm0 - Lexical environment layer number.
778      * @param [ in ] imm1 - Slot number.
779      * @param [ in ] input0 - Inst containing object.
780      */
781     Instruction CreateCallruntimeDefineprivateproperty(Instruction acc, uint64_t imm0, uint64_t imm1,
782                                                        Instruction input0) &&;
783 
784     /**
785      * @brief Creates instruction with opcode CALLRUNTIME_CALLINIT. This instruction sets the value of this as `input0`,
786      * invokes the function object stored in `acc` with no argument.
787      * @return Instruction
788      * @param [ in ] acc - Inst containing function object.
789      * @param [ in ] input0 - Inst containing object.
790      */
791     Instruction CreateCallruntimeCallinit(Instruction acc, Instruction input0) &&;
792 
793     /**
794      * @brief Creates instruction with opcode CALLRUNTIME_DEFINESENDABLECLASS. This instruction creates a sendable class
795      * object of `function` with literal `literalArray` and superclass `input0`, and stores it in `acc`.
796      * @return Instruction
797      * @param [ in ] function - Method of the constructor of the sendable class.
798      * @param [ in ] literalArray - Literal array.
799      * @param [ in ] imm0 - Number of formal parameters of method.
800      * @param [ in ] input0 - Inst contatining superclass object.
801      */
802     Instruction CreateCallruntimeDefinesendableclass(core::Function function, LiteralArray literalArray, uint64_t imm0,
803                                                      Instruction input0) &&;
804 
805     /**
806      * @brief Creates instruction with opcode CALLRUNTIME_LDSENDABLECLASS. This instruction loads the sendable class in
807      * lexical environment `imm0` into `acc`.
808      * @return Instruction
809      * @param [ in ] imm0 - Lexical environment.
810      */
811     Instruction CreateCallruntimeLdsendableclass(uint64_t imm0) &&;
812 
813     /**
814      * @brief Creates instruction with opcode CALLRUNTIME_LDSENDABLEEXTERNALMODULEVAR.
815      * @return Instruction
816      * @param [ in ] imm0 - Index
817      */
818     Instruction CreateCallruntimeLdsendableexternalmodulevar(uint64_t imm0) &&;
819 
820     /**
821      * @brief Creates instruction with opcode CALLRUNTIME_WIDELDSENDABLEEXTERNALMODULEVAR.
822      * @return Instruction
823      * @param [ in ] imm0 - Index
824      */
825     Instruction CreateCallruntimeWideldsendableexternalmodulevar(uint64_t imm0) &&;
826 
827     /**
828      * @brief Creates instruction with opcode CALLRUNTIME_WIDENEWSENDABLEENV.
829      * @return Instruction
830      * @param [ in ] imm0 - Number of variables.
831      */
832     Instruction CreateCallruntimeNewsendableenv(uint64_t imm0) &&;
833 
834     /**
835      * @brief Creates instruction with opcode CALLRUNTIME_WIDENEWSENDABLEENV.
836      * @return Instruction
837      * @param [ in ] imm0 - Number of variables.
838      */
839     Instruction CreateCallruntimeWidenewsendableenv(uint64_t imm0) &&;
840 
841     /**
842      * @brief Creates instruction with opcode CALLRUNTIME_STSENDABLEVAR.
843      * @return Instruction
844      * @param [ in ] acc - Object to store.
845      * @param [ in ] imm0 - Lexical environment level.
846      * @param [ in ] imm1 - Slot number.
847      */
848     Instruction CreateCallruntimeStsendablevar(Instruction acc, uint64_t imm0, uint64_t imm1) &&;
849 
850     /**
851      * @brief Creates instruction with opcode CALLRUNTIME_WIDESTSENDABLEVAR.
852      * @return Instruction
853      * @param [ in ] acc - Object to store.
854      * @param [ in ] imm0 - Lexical environment level.
855      * @param [ in ] imm1 - Slot number.
856      */
857     Instruction CreateCallruntimeWidestsendablevar(Instruction acc, uint64_t imm0, uint64_t imm1) &&;
858 
859     /**
860      * @brief Creates instruction with opcode CALLRUNTIME_LDSENDABLEVAR.
861      * @return Instruction
862      * @param [ in ] imm0 - Lexical environment level.
863      * @param [ in ] imm1 - Slot number.
864      */
865     Instruction CreateCallruntimeLdsendablevar(uint64_t imm0, uint64_t imm1) &&;
866 
867     /**
868      * @brief Creates instruction with opcode CALLRUNTIME_WIDELDSENDABLEVAR.
869      * @return Instruction
870      * @param [ in ] imm0 - Lexical environment level.
871      * @param [ in ] imm1 - Slot number.
872      */
873     Instruction CreateCallruntimeWideldsendablevar(uint64_t imm0, uint64_t imm1) &&;
874 
875     /**
876      * @brief Creates instruction with opcode CALLRUNTIME_ISTRUE.
877      * @return Instruction
878      * @param [ in ] acc - Input object.
879      */
880     Instruction CreateCallruntimeIstrue(Instruction acc) &&;
881 
882     /**
883      * @brief Creates instruction with opcode CALLRUNTIME_ISFALSE.
884      * @return Instruction
885      * @param [ in ] acc - Input object.
886      */
887     Instruction CreateCallruntimeIsfalse(Instruction acc) &&;
888 
889     /**
890      * @brief Creates instruction with opcode THROW. This instruction throws the exception stored in `acc`.
891      * @return Instruction
892      * @param [ in ] acc - Inst containing exception.
893      */
894     Instruction CreateThrow(Instruction acc) &&;
895 
896     /**
897      * @brief Creates instruction with opcode THROW_NOTEXISTS. This instruction throws the exception that the method is
898      * undefined.
899      * @return Instruction
900      */
901     Instruction CreateThrowNotexists() &&;
902 
903     /**
904      * @brief Creates instruction with opcode THROW_PATTERNNONCOERCIBLE. This instruction throws the exception that the
905      * object is not coercible.
906      * @return Instruction
907      */
908     Instruction CreateThrowPatternnoncoercible() &&;
909 
910     /**
911      * @brief Creates instruction with opcode THROW_DELETESUPERPROPERTY. This instruction throws the exception of
912      * deleting the property of the superclass.
913      * @return Instruction
914      */
915     Instruction CreateThrowDeletesuperproperty() &&;
916 
917     /**
918      * @brief Creates instruction with opcode THROW_CONSTASSIGNMENT. This instruction throws the exception of
919      * assignment to the const variable `input0`.
920      * @return Instruction
921      * @param [ in ] input0 - Inst containing name of a const variable.
922      */
923     Instruction CreateThrowConstassignment(Instruction input0) &&;
924 
925     /**
926      * @brief Creates instruction with opcode THROW_IFNOTOBJECT. This instruction throws exception if `input0` is not an
927      * object.
928      * @return Instruction
929      * @param [ in ] input0 - Inst containing name of a const variable.
930      */
931     Instruction CreateThrowIfnotobject(Instruction input0) &&;
932 
933     /**
934      * @brief Creates instruction with opcode THROW_UNDEFINEDIFHOLE. This instruction throws the exception that `input1`
935      * is `undefined` if `input0` is hole.
936      * @return Instruction
937      * @param [ in ] input0 - Inst containing value of the object.
938      * @param [ in ] input1 - Inst containing name of the object.
939      */
940     Instruction CreateThrowUndefinedifhole(Instruction input0, Instruction input1) &&;
941 
942     /**
943      * @brief Creates instruction with opcode THROW_IFSUPERNOTCORRECTCALL. This instruction throws the exception if
944      * `super()` is not called correctly.
945      * @return Instruction
946      * @param [ in ] acc - Inst containing class object.
947      * @param [ in ] imm0 - Error type.
948      */
949     Instruction CreateThrowIfsupernotcorrectcall(Instruction acc, uint64_t imm0) &&;
950 
951     /**
952      * @brief Creates instruction with opcode THROW_UNDEFINEDIFHOLEWITHNAME. This instruction throws the exception that
953      * `string` is `undefined` if `acc` is hole.
954      * @return Instruction
955      * @param [ in ] acc - Inst containing value of the object.
956      * @param [ in ] string - String for exception.
957      */
958     Instruction CreateThrowUndefinedifholewithname(Instruction acc, std::string_view string) &&;
959 
960     /**
961      * @brief Creates instruction with opcode CALLARG0. This instruction invokes the function object stored in `acc`
962      * with no argument.
963      * @return Instruction
964      * @param [ in ] acc - Inst containing function object.
965      */
966     Instruction CreateCallarg0(Instruction acc) &&;
967 
968     /**
969      * @brief Creates instruction with opcode CALLARG1. This instruction invokes the function object stored in `acc`
970      * with `input0` argument.
971      * @return Instruction
972      * @param [ in ] acc - Inst containing function object.
973      * @param [ in ] input0 - Inst containing argument.
974      */
975     Instruction CreateCallarg1(Instruction acc, Instruction input0) &&;
976 
977     /**
978      * @brief Creates instruction with opcode CALLARGS2. This instruction invokes the function object stored in `acc`
979      * with `input0` and `input1` arguments.
980      * @return Instruction
981      * @param [ in ] acc - Inst containing function object.
982      * @param [ in ] input0 - Inst containing first argument.
983      * @param [ in ] input1 - Inst containing second argument.
984      */
985     Instruction CreateCallargs2(Instruction acc, Instruction input0, Instruction input1) &&;
986 
987     /**
988      * @brief Creates instruction with opcode CALLARGS3. This instruction invokes the function object stored in `acc`
989      * with `input0`, `input1`, `input2` arguments.
990      * @return Instruction
991      * @param [ in ] acc - Inst containing function object.
992      * @param [ in ] input0 - Inst containing first argument.
993      * @param [ in ] input1 - Inst containing second argument.
994      * @param [ in ] input2 - Inst containing third argument.
995      */
996     Instruction CreateCallargs3(Instruction acc, Instruction input0, Instruction input1, Instruction input2) &&;
997 
998     /**
999      * @brief Creates instruction with opcode CALLRANGE. This instruction invokes `acc` with arguments `inputs[0]`, ...,
1000      * `inputs[argCount-1]`.
1001      * @return Instruction
1002      * @param [ in ] acc - Inst containing function object.
1003      * @param [ in ] instrs - Arguments.
1004      */
1005     template <typename... Args>
1006     Instruction CreateCallrange(Instruction acc, Args... instrs) &&;
1007 
1008     /**
1009      * @brief Creates instruction with opcode WIDE_CALLRANGE. This instruction invokes `acc` with arguments `inputs[0]`,
1010      * ..., `inputs[argCount-1]`.
1011      * @return Instruction
1012      * @param [ in ] acc - Inst containing function object.
1013      * @param [ in ] instrs - Arguments.
1014      */
1015     template <typename... Args>
1016     Instruction CreateWideCallrange(Instruction acc, Args... instrs) &&;
1017 
1018     /**
1019      * @brief Creates instruction with opcode SUPERCALLSPREAD. This instruction invokes `acc`'s superclass constructor
1020      * with argument list `input0`.
1021      * @return Instruction
1022      * @param [ in ] acc - Inst containing class object.
1023      * @param [ in ] input0 - Inst containing parameter list.
1024      */
1025     Instruction CreateSupercallspread(Instruction acc, Instruction input0) &&;
1026 
1027     /**
1028      * @brief Creates instruction with opcode APPLY.
1029      * Sets the value of this as `input0`,
1030      * invokes the function object stored in `acc` with arguments list `input1`.
1031      * @return Instruction
1032      * @param [ in ] acc - Function object.
1033      * @param [ in ] input0 - This object .
1034      * @param [ in ] input1 - Arguments object.
1035      */
1036     Instruction CreateApply(Instruction acc, Instruction input0, Instruction input1) &&;
1037 
1038     /**
1039      * @brief Creates instruction with opcode CALLTHIS0.
1040      * Sets the value of this as `input0`, invokes the function object stored in `acc`.
1041      * @return Instruction
1042      * @param [ in ] acc - Function object.
1043      * @param [ in ] input0 - This object.
1044      */
1045     Instruction CreateCallthis0(Instruction acc, Instruction input0) &&;
1046 
1047     /**
1048      * @brief Creates instruction with opcode CALLTHIS1.
1049      * Sets the value of this as `input0`,
1050      * invokes the function object stored in `acc` with argument `input1`.
1051      * @return Instruction
1052      * @param [ in ] acc - Function object.
1053      * @param [ in ] input0 - This object.
1054      * @param [ in ] input1 - First argument.
1055      */
1056     Instruction CreateCallthis1(Instruction acc, Instruction input0, Instruction input1) &&;
1057 
1058     /**
1059      * @brief Creates instruction with opcode CALLTHIS2.
1060      * Sets the value of this as `input0`,
1061      * invokes the function object stored in `acc` with arguments `input1`, `input2`.
1062      * @return Instruction
1063      * @param [ in ] acc - Function object.
1064      * @param [ in ] input0 - This object.
1065      * @param [ in ] input1 - First argument.
1066      * @param [ in ] input2 - Second argument.
1067      */
1068     Instruction CreateCallthis2(Instruction acc, Instruction input0, Instruction input1, Instruction input2) &&;
1069 
1070     /**
1071      * @brief Creates instruction with opcode CALLTHIS3.
1072      * Sets the value of this as `input0`,
1073      * invokes the function object stored in `acc` with arguments `input1`, `input2`, and `input3`.
1074      * @return Instruction
1075      * @param [ in ] acc - Function object.
1076      * @param [ in ] input0 - This object.
1077      * @param [ in ] input1 - First argument.
1078      * @param [ in ] input2 - Second argument.
1079      * @param [ in ] input3 - Third argument.
1080      */
1081     Instruction CreateCallthis3(Instruction acc, Instruction input0, Instruction input1, Instruction input2,
1082                                 Instruction input3) &&;
1083 
1084     /**
1085      * @brief Creates instruction with opcode CALLTHISRANGE.
1086      * Sets the value of this as first variadic argument, invokes the function object stored in `acc` with arguments
1087      * `...`.
1088      * @return Instruction
1089      * @param [ in ] acc - Function object.
1090      * @param [ in ] instrs - Object + arguments.
1091      */
1092     template <typename... Args>
1093     Instruction CreateCallthisrange(Instruction acc, Args... instrs) &&;
1094 
1095     /**
1096      * @brief Creates instruction with opcode WIDE_CALLTHISRANGE.
1097      * Sets the value of this as first variadic argument, invokes the function object stored in `acc` with arguments
1098      * `...`.
1099      * @return Instruction
1100      * @param [ in ] acc - Function object.
1101      * @param [ in ] instrs - Object + arguments.
1102      */
1103     template <typename... Args>
1104     Instruction CreateWideCallthisrange(Instruction acc, Args... instrs) &&;
1105 
1106     /**
1107      * @brief Creates instruction with opcode SUPERCALLTHISRANGE.
1108      * Invokes super with arguments ...
1109      * This instruction appears only in non-arrow functions.
1110      * @return Instruction
1111      * @param [ in ] instrs - Parameters.
1112      */
1113     template <typename... Args>
1114     Instruction CreateSupercallthisrange(Args... instrs) &&;
1115 
1116     /**
1117      * @brief Creates instruction with opcode WIDE_SUPERCALLTHISRANGE.
1118      * Invokes super with arguments ...
1119      * This instruction appears only in non-arrow functions.
1120      * @return Instruction
1121      * @param [ in ] instrs - Parameters.
1122      */
1123     template <typename... Args>
1124     Instruction CreateWideSupercallthisrange(Args... instrs) &&;
1125 
1126     /**
1127      * @brief Creates instruction with opcode SUPERCALLARROWRANGE.
1128      * Invokes `acc`'s superclass constructor with arguments `...`.
1129      * This instruction appears only in arrow functions.
1130      * @return Instruction
1131      * @param [ in ] acc - Class object.
1132      * @param [ in ] instrs - Parameters.
1133      */
1134     template <typename... Args>
1135     Instruction CreateSupercallarrowrange(Instruction acc, Args... instrs) &&;
1136 
1137     /**
1138      * @brief Creates instruction with opcode WIDE_SUPERCALLARROWRANGE.
1139      * Invokes `acc`'s superclass constructor with arguments `...`.
1140      * This instruction appears only in arrow functions.
1141      * @return Instruction
1142      * @param [ in ] acc - Class object.
1143      * @param [ in ] instrs - Parameters.
1144      */
1145     template <typename... Args>
1146     Instruction CreateWideSupercallarrowrange(Instruction acc, Args... instrs) &&;
1147 
1148     /**
1149      * @brief Creates instruction with opcode DEFINEGETTERSETTERBYVALUE.
1150      * Defines accessors for `input0`'s property of the key `input1` with getter method `input2`
1151      * and setter method `input3`. If `input2` (`input3`) is undefined, then getter (setter) will not be set.
1152      * @return Instruction
1153      * @param [ in ] acc - Whether to set a name for the accessor.
1154      * @param [ in ] input0 - Destination object.
1155      * @param [ in ] input1 - Property key value.
1156      * @param [ in ] input2 - Getter function object.
1157      * @param [ in ] input3 - Setter function object.
1158      */
1159     Instruction CreateDefinegettersetterbyvalue(Instruction acc, Instruction input0, Instruction input1,
1160                                                 Instruction input2, Instruction input3) &&;
1161 
1162     /**
1163      * @brief Creates instruction with opcode DEFINEFUNC. Creates a function instance of `function`.
1164      * @return Instruction
1165      * @param [ in ] function - Pointer to AbckitFunction.
1166      * @param [ in ] imm0 - Number of form parameters.
1167      */
1168     Instruction CreateDefinefunc(core::Function function, uint64_t imm0) &&;
1169 
1170     /**
1171      * @brief Creates instruction with opcode DEFINEMETHOD.
1172      * Creates a class method instance of `function` for the prototype `acc`.
1173      * @return Instruction
1174      * @param [ in ] acc - Prototype object of the class.
1175      * @param [ in ] function - Method.
1176      * @param [ in ] imm0 - Number of formal parameters.
1177      */
1178     Instruction CreateDefinemethod(Instruction acc, core::Function function, uint64_t imm0) &&;
1179 
1180     /**
1181      * @brief Creates instruction with opcode DEFINECLASSWITHBUFFER.
1182      * Creates a class object of `function` with literal `literalArray` and superclass `input0`.
1183      * @return Instruction
1184      * @param [ in ] function - Class constructor.
1185      * @param [ in ] literalArray - Literal array.
1186      * @param [ in ] imm0 - parameter count of `function`.
1187      * @param [ in ] input0 - Object containing parent class.
1188      */
1189     Instruction CreateDefineclasswithbuffer(core::Function function, LiteralArray literalArray, uint64_t imm0,
1190                                             Instruction input0) &&;
1191 
1192     /**
1193      * @brief Creates instruction with opcode RESUMEGENERATOR. Executes `GeneratorResume` for the generator `acc`.
1194      * @return Instruction
1195      * @param [ in ] acc - Generator object.
1196      */
1197     Instruction CreateResumegenerator(Instruction acc) &&;
1198 
1199     /**
1200      * @brief Creates instruction with opcode GETRESUMEMODE.
1201      * Gets the type of completion resumption value for the generator `acc`.
1202      * @return Instruction
1203      * @param [ in ] acc - Generator object.
1204      */
1205     Instruction CreateGetresumemode(Instruction acc) &&;
1206 
1207     /**
1208      * @brief Creates instruction with opcode Gettemplateobject.
1209      * Executes `GetTemplateObject` with argument `acc` of type templateLiteral.
1210      * @return Instruction
1211      * @param [ in ]  acc - Argument object.
1212      */
1213     Instruction CreateGettemplateobject(Instruction acc) &&;
1214 
1215     /**
1216      * @brief Creates instruction with opcode GETNEXTPROPNAME.
1217      * Executes the `next()` method of the for-in iterator `input0`.
1218      * @return Instruction
1219      * @param [ in ] input0 - Iterator object.
1220      */
1221     Instruction CreateGetnextpropname(Instruction input0) &&;
1222 
1223     /**
1224      * @brief Creates instruction with opcode DELOBJPROP. Delete the `input0`'s property of the key `acc`.
1225      * @return Instruction
1226      * @param [ in ] acc - Key.
1227      * @param [ in ] input0 - Object to delete property from.
1228      */
1229     Instruction CreateDelobjprop(Instruction acc, Instruction input0) &&;
1230 
1231     /**
1232      * @brief Creates instruction with opcode SUSPENDGENERATOR. Suspends the generator `input0` with value `acc`.
1233      * @return Instruction
1234      * @param [ in ] acc - Value.
1235      * @param [ in ] input0 - Generator object.
1236      */
1237     Instruction CreateSuspendgenerator(Instruction acc, Instruction input0) &&;
1238 
1239     /**
1240      * @brief Creates instruction with opcode ASYNCFUNCTIONAWAITUNCAUGHT.
1241      * Executes `AwaitExpression` with function object `input0` and value `acc`.
1242      * @return Instruction
1243      * @param [ in ] acc - Value.
1244      * @param [ in ] input0 - Function object.
1245      */
1246     Instruction CreateAsyncfunctionawaituncaught(Instruction acc, Instruction input0) &&;
1247 
1248     /**
1249      * @brief Creates instruction with opcode COPYDATAPROPERTIES. Copies the properties of `acc` into `input0`.
1250      * @return Instruction
1251      * @param [ in ] acc - Object to load properties from.
1252      * @param [ in ] input0 - Destintaion object.
1253      */
1254     Instruction CreateCopydataproperties(Instruction acc, Instruction input0) &&;
1255 
1256     /**
1257      * @brief Creates instruction with opcode STARRAYSPREAD.
1258      * Stores `acc` in spreading way into `input0`'s elements starting from the index `input1`.
1259      * @return Instruction
1260      * @param [ in ] acc - Object to store.
1261      * @param [ in ] input0 - Destination object.
1262      * @param [ in ] input1 - Index.
1263      */
1264     Instruction CreateStarrayspread(Instruction acc, Instruction input0, Instruction input1) &&;
1265 
1266     /**
1267      * @brief Creates instruction with opcode SETOBJECTWITHPROTO. Set `acc`'s `__proto__` property as `input0`.
1268      * @return Instruction
1269      * @param [ in ] acc - Destination object.
1270      * @param [ in ] input0 - Object to store.
1271      */
1272     Instruction CreateSetobjectwithproto(Instruction acc, Instruction input0) &&;
1273 
1274     /**
1275      * @brief Creates instruction with opcode LDOBJBYVALUE. Loads `input0`'s property of the key `acc`.
1276      * @return Instruction
1277      * @param [ in ] acc - Key.
1278      * @param [ in ] input0 - Object to load from.
1279      */
1280     Instruction CreateLdobjbyvalue(Instruction acc, Instruction input0) &&;
1281 
1282     /**
1283      * @brief Creates instruction with opcode STOBJBYVALUE. Stores `acc` to `input0`'s property of the key `input1`.
1284      * @return Instruction
1285      * @param [ in ] acc - Object to store.
1286      * @param [ in ] input0 - Destonation object.
1287      * @param [ in ] input1 - Key.
1288      */
1289     Instruction CreateStobjbyvalue(Instruction acc, Instruction input0, Instruction input1) &&;
1290 
1291     /**
1292      * @brief Creates instruction with opcode STOWNBYVALUE. Stores `acc` to object `input0`'s property of the key
1293      * `input1`.
1294      * @return Instruction
1295      * @param [ in ] acc - Object to store .
1296      * @param [ in ] input0 - Destination object.
1297      * @param [ in ] input1 - Key.
1298      */
1299     Instruction CreateStownbyvalue(Instruction acc, Instruction input0, Instruction input1) &&;
1300 
1301     /**
1302      * @brief Creates instruction with opcode LDSUPERBYVALUE. Loads the property of `input0`'s superclass of the key
1303      * acc.
1304      * @return Instruction
1305      * @param [ in ] acc - Key .
1306      * @param [ in ] input0 - Object to load from.
1307      */
1308     Instruction CreateLdsuperbyvalue(Instruction acc, Instruction input0) &&;
1309 
1310     /**
1311      * @brief Creates instruction with opcode STSUPERBYVALUE.
1312      * Stores `acc` to the property of `input0`'s superclass of the key `input1`.
1313      * @return Instruction
1314      * @param [ in ] acc - Object to store.
1315      * @param [ in ] input0 - Destination object.
1316      * @param [ in ] input1 - Key.
1317      */
1318     Instruction CreateStsuperbyvalue(Instruction acc, Instruction input0, Instruction input1) &&;
1319 
1320     /**
1321      * @brief Creates instruction with opcode LDOBJBYINDEX. Loads `acc`'s property of the key `imm0`.
1322      * @return Instruction
1323      * @param [ in ] acc - Object to load from.
1324      * @param [ in ] imm0 - Index.
1325      */
1326     Instruction CreateLdobjbyindex(Instruction acc, uint64_t imm0) &&;
1327 
1328     /**
1329      * @brief Creates instruction with opcode WIDE_LDOBJBYINDEX. Loads `acc`'s property of the key `imm0`.
1330      * @return Instruction
1331      * @param [ in ] acc - Object to load from.
1332      * @param [ in ] imm0 - Index.
1333      */
1334     Instruction CreateWideLdobjbyindex(Instruction acc, uint64_t imm0) &&;
1335 
1336     /**
1337      * @brief Creates instruction with opcode STOBJBYINDEX. Stores `acc` to `input0`'s property of the key `imm0`.
1338      * @return Instruction
1339      * @param [ in ] acc - Object to store .
1340      * @param [ in ] input0 - Destination object .
1341      * @param [ in ] imm0 - Index.
1342      */
1343     Instruction CreateStobjbyindex(Instruction acc, Instruction input0, uint64_t imm0) &&;
1344 
1345     /**
1346      * @brief Creates instruction with opcode WIDE_STOBJBYINDEX. Stores `acc` to `input0`'s property of the key `imm0`.
1347      * @return Instruction
1348      * @param [ in ] acc - Object to store .
1349      * @param [ in ] input0 - Destination object .
1350      * @param [ in ] imm0 - Index.
1351      */
1352     Instruction CreateWideStobjbyindex(Instruction acc, Instruction input0, uint64_t imm0) &&;
1353 
1354     /**
1355      * @brief Creates instruction with opcode STOWNBYINDEX. Stores `acc` to object `input0`'s property of the key
1356      * `imm0`.
1357      * @return Instruction
1358      * @param [ in ] acc - Object to store.
1359      * @param [ in ] input0 - Destination object.
1360      * @param [ in ] imm0 - Index.
1361      */
1362     Instruction CreateStownbyindex(Instruction acc, Instruction input0, uint64_t imm0) &&;
1363 
1364     /**
1365      * @brief Creates instruction with opcode WIDE_STOWNBYINDEX. Stores `acc` to object `input0`'s property of the key
1366      * `imm0`.
1367      * @return Instruction
1368      * @param [ in ] acc - Object to store.
1369      * @param [ in ] input0 - Destination object.
1370      * @param [ in ] imm0 - Index.
1371      */
1372     Instruction CreateWideStownbyindex(Instruction acc, Instruction input0, uint64_t imm0) &&;
1373 
1374     /**
1375      * @brief Creates instruction with opcode Asyncfunctionresolve. Resolves the Promise object of `input0` with value
1376      * `acc`.
1377      * @return Instruction
1378      * @param [ in ] acc - Value.
1379      * @param [ in ] input0 - Promise object.
1380      */
1381     Instruction CreateAsyncfunctionresolve(Instruction acc, Instruction input0) &&;
1382 
1383     /**
1384      * @brief Creates instruction with opcode ASYNCFUNCTIONREJECT. Rejects the Promise object of `input0` with value
1385      * `acc`.
1386      * @return Instruction
1387      * @param [ in ] acc - Value.
1388      * @param [ in ] input0 - Promise object.
1389      */
1390     Instruction CreateAsyncfunctionreject(Instruction acc, Instruction input0) &&;
1391 
1392     /**
1393      * @brief Creates instruction with opcode COPYRESTARGS. Copies the rest parameters.
1394      * @return Instruction
1395      * @param [ in ] imm0 - The order in which the remaining parameters in the parameter list start.
1396      */
1397     Instruction CreateCopyrestargs(uint64_t imm0) &&;
1398 
1399     /**
1400      * @brief Creates instruction with opcode WIDE_COPYRESTARGS. Copies the rest parameters.
1401      * @return Instruction
1402      * @param [ in ] imm0 - The order in which the remaining parameters in the parameter list start.
1403      */
1404     Instruction CreateWideCopyrestargs(uint64_t imm0) &&;
1405 
1406     /**
1407      * @brief Creates instruction with opcode LDLEXVAR.
1408      * Loads the value at the `imm1`-th slot of the lexical environment beyond level `imm0`.
1409      * @return Instruction
1410      * @param [ in ] imm0 - Lexical environment level.
1411      * @param [ in ] imm1 - Slot number.
1412      */
1413     Instruction CreateLdlexvar(uint64_t imm0, uint64_t imm1) &&;
1414 
1415     /**
1416      * @brief Creates instruction with opcode WIDE_LDLEXVAR.
1417      * Loads the value at the `imm1`-th slot of the lexical environment beyond level `imm0`.
1418      * @return Instruction
1419      * @param [ in ] imm0 - Lexical environment level.
1420      * @param [ in ] imm1 - Slot number.
1421      */
1422     Instruction CreateWideLdlexvar(uint64_t imm0, uint64_t imm1) &&;
1423 
1424     /**
1425      * @brief Creates instruction with opcode STLEXVAR.
1426      * Stores `acc` in the `imm1`-th slot of the lexical environment beyond `imm0` level.
1427      * @return Instruction
1428      * @param [ in ] acc - Object to store.
1429      * @param [ in ] imm0 - Lexical environment level.
1430      * @param [ in ] imm1 - Slot number.
1431      */
1432     Instruction CreateStlexvar(Instruction acc, uint64_t imm0, uint64_t imm1) &&;
1433 
1434     /**
1435      * @brief Creates instruction with opcode WIDE_STLEXVAR.
1436      * Stores `acc` in the `imm1`-th slot of the lexical environment beyond `imm0` level.
1437      * @return Instruction
1438      * @param [ in ] acc - Object to store.
1439      * @param [ in ] imm0 - Lexical environment level.
1440      * @param [ in ] imm1 - Slot number.
1441      */
1442     Instruction CreateWideStlexvar(Instruction acc, uint64_t imm0, uint64_t imm1) &&;
1443 
1444     /**
1445      * @brief Creates instruction with opcode GETMODULENAMESPACE. Executes GetModuleNamespace for the `md`.
1446      * @return Instruction
1447      * @param [ in ] md - Module descriptor.
1448      */
1449     Instruction CreateGetmodulenamespace(core::Module md) &&;
1450 
1451     /**
1452      * @brief Creates instruction with opcode WIDE_GETMODULENAMESPACE. Executes GetModuleNamespace for the `md`.
1453      * @return Instruction
1454      * @param [ in ] md - Module descriptor.
1455      */
1456     Instruction CreateWideGetmodulenamespace(core::Module md) &&;
1457 
1458     /**
1459      * @brief Creates instruction with opcode STMODULEVAR. Stores `acc` to the module variable in the `ed`.
1460      * @return Instruction
1461      * @param [ in ] acc - Object to store.
1462      * @param [ in ] ed - Destination export descriptor.
1463      */
1464     Instruction CreateStmodulevar(Instruction acc, core::ExportDescriptor ed) &&;
1465 
1466     /**
1467      * @brief Creates instruction with opcode WIDE_STMODULEVAR. Stores `acc` to the module variable in the `ed`.
1468      * @return Instruction
1469      * @param [ in ] acc - Object to store.
1470      * @param [ in ] ed - Destination export descriptor.
1471      */
1472     Instruction CreateWideStmodulevar(Instruction acc, core::ExportDescriptor ed) &&;
1473 
1474     /**
1475      * @brief Creates instruction with opcode TRYLDGLOBALBYNAME. Loads the global variable of the name `string`.
1476      * If the global variable `string` does not exist, an exception is thrown.
1477      * @return Instruction
1478      * @param [ in ] string to load
1479      */
1480     Instruction CreateTryldglobalbyname(std::string_view string) &&;
1481 
1482     /**
1483      * @brief Creates instruction with opcode TRYSTGLOBALBYNAME. Stores `acc` to the global variable of the name
1484      * `string`. If the global variable `string` does not exist, an exception is thrown.
1485      * @return Instruction
1486      * @param [ in ] acc - Object to store.
1487      * @param [ in ] string - String containing name of global variable.
1488      */
1489     Instruction CreateTrystglobalbyname(Instruction acc, std::string_view string) &&;
1490 
1491     /**
1492      * @brief Creates instruction with opcode LDGLOBALVAR. Loads the global variable of the name `string`.
1493      * This variable must exist.
1494      * @return Instruction
1495      * @param [ in ] string - String containing name of global variable.
1496      */
1497     Instruction CreateLdglobalvar(std::string_view string) &&;
1498 
1499     /**
1500      * @brief Creates instruction with opcode STGLOBALVAR. Stores `acc` to the global variable of the name `string`.
1501      * This variable must exist.
1502      * @return Instruction
1503      * @param [ in ] acc - Object to store.
1504      * @param [ in ] string - String containing name of global variable.
1505      */
1506     Instruction CreateStglobalvar(Instruction acc, std::string_view string) &&;
1507 
1508     /**
1509      * @brief Creates instruction with opcode LDOBJBYNAME. Loads `acc`'s property of the key `string`.
1510      * @return Instruction
1511      * @param [ in ] acc - Object to load property from.
1512      * @param [ in ] string - String containing property key.
1513      */
1514     Instruction CreateLdobjbyname(Instruction acc, std::string_view string) &&;
1515 
1516     /**
1517      * @brief Creates instruction with opcode STOBJBYNAME. Stores `acc` to `input0`'s property of the key `string`.
1518      * @return Instruction
1519      * @param [ in ] acc - Object to store.
1520      * @param [ in ] string - String containing property key.
1521      * @param [ in ] input0 - Destination object.
1522      */
1523     Instruction CreateStobjbyname(Instruction acc, std::string_view string, Instruction input0) &&;
1524 
1525     /**
1526      * @brief Creates instruction with opcode STOWNBYNAME. Stores `acc` to `input0`'s property of the key `string`.
1527      * @return Instruction
1528      * @param [ in ] acc - Object to store.
1529      * @param [ in ] string - String containing property key.
1530      * @param [ in ] input0 - Destination object.
1531      */
1532     Instruction CreateStownbyname(Instruction acc, std::string_view string, Instruction input0) &&;
1533 
1534     /**
1535      * @brief Creates instruction with opcode LDSUPERBYNAME. Load the property of `acc`'s superclass of the key
1536      * `string`.
1537      * @return Instruction
1538      * @param [ in ] acc - Object to load property from.
1539      * @param [ in ] string - String containing property key.
1540      */
1541     Instruction CreateLdsuperbyname(Instruction acc, std::string_view string) &&;
1542 
1543     /**
1544      * @brief Creates instruction with opcode STSUPERBYNAME.
1545      * Stores `acc` to the property of `input0`'s superclass of the key `string`.
1546      * @return Instruction
1547      * @param [ in ] acc - Object to store.
1548      * @param [ in ] string - String containing property key.
1549      * @param [ in ] input0 - Destination object.
1550      */
1551     Instruction CreateStsuperbyname(Instruction acc, std::string_view string, Instruction input0) &&;
1552 
1553     /**
1554      * @brief Creates instruction with opcode LDLOCALMODULEVAR. Loads the local module variable.
1555      * @return Instruction
1556      * @param [ in ] ed - Export descriptor to load.
1557      */
1558     Instruction CreateLdlocalmodulevar(core::ExportDescriptor ed) &&;
1559 
1560     /**
1561      * @brief Creates instruction with opcode WIDE_LDLOCALMODULEVAR. Loads the local module variable.
1562      * @return Instruction
1563      * @param [ in ] ed - Export descriptor to load.
1564      */
1565     Instruction CreateWideLdlocalmodulevar(core::ExportDescriptor ed) &&;
1566 
1567     /**
1568      * @brief Creates instruction with opcode LDEXTERNALMODULEVAR. Loads the external module variable.
1569      * @return Instruction
1570      * @param [ in ] id - Import descriptor to load.
1571      */
1572     Instruction CreateLdexternalmodulevar(core::ImportDescriptor id) &&;
1573 
1574     /**
1575      * @brief Creates instruction with opcode WIDE_LDEXTERNALMODULEVAR. Loads the external module variable.
1576      * @return Instruction
1577      * @param [ in ] id - Import descriptor to load.
1578      */
1579     Instruction CreateWideLdexternalmodulevar(core::ImportDescriptor id) &&;
1580 
1581     /**
1582      * @brief Creates instruction with opcode STOWNBYVALUEWITHNAMESET.
1583      * Stores `acc` to object `input0`'s property of the key `input1`.
1584      * @return Instruction
1585      * @param [ in ] acc - Object to store.
1586      * @param [ in ] input0 - Destination object.
1587      * @param [ in ] input1 - Property key.
1588      */
1589     Instruction CreateStownbyvaluewithnameset(Instruction acc, Instruction input0, Instruction input1) &&;
1590 
1591     /**
1592      * @brief Creates instruction with opcode STOWNBYNAMEWITHNAMESET.
1593      * Stores `acc` to `input0`'s property of the key `string`.
1594      * @return Instruction
1595      * @param [ in ] acc - Object to store.
1596      * @param [ in ] string - String containing property key.
1597      * @param [ in ] input0 - Destination object.
1598      */
1599     Instruction CreateStownbynamewithnameset(Instruction acc, std::string_view string, Instruction input0) &&;
1600 
1601     /**
1602      * @brief Creates instruction with opcode LDBIGINT. Loads the BigInt instance defined by the `string`.
1603      * @return Instruction
1604      * @param [ in ] string - String containing value.
1605      */
1606     Instruction CreateLdbigint(std::string_view string) &&;
1607 
1608     /**
1609      * @brief Creates instruction with opcode LDTHISBYNAME. Loads this 's property of the key `string`, and stores it in
1610      * `acc`.
1611      * @return Instruction
1612      * @param [ in ] string - String containing the key.
1613      */
1614     Instruction CreateLdthisbyname(std::string_view string) &&;
1615 
1616     /**
1617      * @brief Creates instruction with opcode STTHISBYNAME. Stores `acc` to this's property of the key `string`.
1618      * @return Instruction
1619      * @param [ in ] acc - Inst containing attribute key value.
1620      * @param [ in ] string - String containing the key.
1621      */
1622     Instruction CreateStthisbyname(Instruction acc, std::string_view string) &&;
1623 
1624     /**
1625      * @brief Creates instruction with opcode LDTHISBYVALUE. Loads this's property of the key `acc`, and stores it in
1626      * `acc`.
1627      * @return Instruction
1628      * @param [ in ] acc - Inst containing attribute key value.
1629      */
1630     Instruction CreateLdthisbyvalue(Instruction acc) &&;
1631 
1632     /**
1633      * @brief Creates instruction with opcode STTHISBYVALUE. Stores `acc` to this's property of the key `input0`.
1634      * @return Instruction
1635      * @param [ in ] acc - Inst containing value.
1636      * @param [ in ] input0  - Inst containing attribute key value.
1637      */
1638     Instruction CreateStthisbyvalue(Instruction acc, Instruction input0) &&;
1639 
1640     /**
1641      * @brief Creates instruction with opcode WIDE_LDPATCHVAR. Load` the patch variable in the `imm0`-th slot into
1642      * `acc`.
1643      * @return Instruction
1644      * @param [ in ] imm0 - Long value containing patch variable index.
1645      */
1646     Instruction CreateWideLdpatchvar(uint64_t imm0) &&;
1647 
1648     /**
1649      * @brief Creates instruction with opcode WIDE_STPATCHVAR. Stores `acc` to the patch variable at the `imm0`-th slot.
1650      * @return Instruction
1651      * @param [ in ] acc - Inst containing value.
1652      * @param [ in ] imm0 - Long value containing patch variable index.
1653      */
1654     Instruction CreateWideStpatchvar(Instruction acc, uint64_t imm0) &&;
1655 
1656     /**
1657      * @brief Creates instruction with opcode DYNAMICIMPORT. Executes ImportCall with argument `acc`, and stores the
1658      * result in `acc`.
1659      * @return Instruction
1660      * @param [ in ] acc - Inst containing argument for ImportCall.
1661      */
1662     Instruction CreateDynamicimport(Instruction acc) &&;
1663 
1664     /**
1665      * @brief Creates instruction with opcode ASYNCGENERATORREJECT. Executes the abstract operation AsyncGeneratorReject
1666      * with generator `input0` and exception `acc`.
1667      * @return Instruction
1668      * @param [ in ] acc - Inst containing exception object.
1669      * @param [ in ] input0 - Inst containing generator object.
1670      */
1671     Instruction CreateAsyncgeneratorreject(Instruction acc, Instruction input0) &&;
1672 
1673     /**
1674      * @brief Creates instruction with opcode SETGENERATORSTATE. Sets the state of acc as B.
1675      * @return Instruction
1676      * @param [ in ] acc - Inst containing generator object.
1677      * @param [ in ] imm0 - Long value that is generator status.
1678      */
1679     Instruction CreateSetgeneratorstate(Instruction acc, uint64_t imm0) &&;
1680 
1681     /**
1682      * @brief Creates instruction with opcode RETURN. This instruction returns `acc`.
1683      * @return Instruction
1684      * @param [ in ] acc - Instruction to be returned.
1685      */
1686     Instruction CreateReturn(Instruction acc) &&;
1687 
1688     /**
1689      * @brief Creates instruction with opcode RETURNUNDEFINED.
1690      * @return Instruction
1691      */
1692     Instruction CreateReturnundefined() &&;
1693 
1694     /**
1695      * @brief Creates instruction with opcode IF.
1696      * @return Instruction
1697      * @param [ in ] acc - Instruction that will be compared to zero.
1698      * @param [ in ] cc - Condition code.
1699      */
1700     Instruction CreateIf(Instruction acc, enum AbckitIsaApiDynamicConditionCode cc) &&;
1701 
1702 private:
DynamicIsa(const Graph & graph)1703     explicit DynamicIsa(const Graph &graph) : graph_(graph) {};
1704     const Graph &graph_;
1705 };
1706 
1707 }  // namespace abckit
1708 
1709 #endif  // CPP_ABCKIT_DYNAMIC_ISA_H
1710