xref: /aosp_15_r20/external/lua/src/lcode.h (revision 088332b5b69e7ab13924864b272aabfc2509d2d5)
1*088332b5SXin Li /*
2*088332b5SXin Li ** $Id: lcode.h $
3*088332b5SXin Li ** Code generator for Lua
4*088332b5SXin Li ** See Copyright Notice in lua.h
5*088332b5SXin Li */
6*088332b5SXin Li 
7*088332b5SXin Li #ifndef lcode_h
8*088332b5SXin Li #define lcode_h
9*088332b5SXin Li 
10*088332b5SXin Li #include "llex.h"
11*088332b5SXin Li #include "lobject.h"
12*088332b5SXin Li #include "lopcodes.h"
13*088332b5SXin Li #include "lparser.h"
14*088332b5SXin Li 
15*088332b5SXin Li 
16*088332b5SXin Li /*
17*088332b5SXin Li ** Marks the end of a patch list. It is an invalid value both as an absolute
18*088332b5SXin Li ** address, and as a list link (would link an element to itself).
19*088332b5SXin Li */
20*088332b5SXin Li #define NO_JUMP (-1)
21*088332b5SXin Li 
22*088332b5SXin Li 
23*088332b5SXin Li /*
24*088332b5SXin Li ** grep "ORDER OPR" if you change these enums  (ORDER OP)
25*088332b5SXin Li */
26*088332b5SXin Li typedef enum BinOpr {
27*088332b5SXin Li   /* arithmetic operators */
28*088332b5SXin Li   OPR_ADD, OPR_SUB, OPR_MUL, OPR_MOD, OPR_POW,
29*088332b5SXin Li   OPR_DIV, OPR_IDIV,
30*088332b5SXin Li   /* bitwise operators */
31*088332b5SXin Li   OPR_BAND, OPR_BOR, OPR_BXOR,
32*088332b5SXin Li   OPR_SHL, OPR_SHR,
33*088332b5SXin Li   /* string operator */
34*088332b5SXin Li   OPR_CONCAT,
35*088332b5SXin Li   /* comparison operators */
36*088332b5SXin Li   OPR_EQ, OPR_LT, OPR_LE,
37*088332b5SXin Li   OPR_NE, OPR_GT, OPR_GE,
38*088332b5SXin Li   /* logical operators */
39*088332b5SXin Li   OPR_AND, OPR_OR,
40*088332b5SXin Li   OPR_NOBINOPR
41*088332b5SXin Li } BinOpr;
42*088332b5SXin Li 
43*088332b5SXin Li 
44*088332b5SXin Li /* true if operation is foldable (that is, it is arithmetic or bitwise) */
45*088332b5SXin Li #define foldbinop(op)	((op) <= OPR_SHR)
46*088332b5SXin Li 
47*088332b5SXin Li 
48*088332b5SXin Li #define luaK_codeABC(fs,o,a,b,c)	luaK_codeABCk(fs,o,a,b,c,0)
49*088332b5SXin Li 
50*088332b5SXin Li 
51*088332b5SXin Li typedef enum UnOpr { OPR_MINUS, OPR_BNOT, OPR_NOT, OPR_LEN, OPR_NOUNOPR } UnOpr;
52*088332b5SXin Li 
53*088332b5SXin Li 
54*088332b5SXin Li /* get (pointer to) instruction of given 'expdesc' */
55*088332b5SXin Li #define getinstruction(fs,e)	((fs)->f->code[(e)->u.info])
56*088332b5SXin Li 
57*088332b5SXin Li 
58*088332b5SXin Li #define luaK_setmultret(fs,e)	luaK_setreturns(fs, e, LUA_MULTRET)
59*088332b5SXin Li 
60*088332b5SXin Li #define luaK_jumpto(fs,t)	luaK_patchlist(fs, luaK_jump(fs), t)
61*088332b5SXin Li 
62*088332b5SXin Li LUAI_FUNC int luaK_code (FuncState *fs, Instruction i);
63*088332b5SXin Li LUAI_FUNC int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx);
64*088332b5SXin Li LUAI_FUNC int luaK_codeAsBx (FuncState *fs, OpCode o, int A, int Bx);
65*088332b5SXin Li LUAI_FUNC int luaK_codeABCk (FuncState *fs, OpCode o, int A,
66*088332b5SXin Li                                             int B, int C, int k);
67*088332b5SXin Li LUAI_FUNC int luaK_isKint (expdesc *e);
68*088332b5SXin Li LUAI_FUNC int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v);
69*088332b5SXin Li LUAI_FUNC void luaK_fixline (FuncState *fs, int line);
70*088332b5SXin Li LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n);
71*088332b5SXin Li LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n);
72*088332b5SXin Li LUAI_FUNC void luaK_checkstack (FuncState *fs, int n);
73*088332b5SXin Li LUAI_FUNC void luaK_int (FuncState *fs, int reg, lua_Integer n);
74*088332b5SXin Li LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e);
75*088332b5SXin Li LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e);
76*088332b5SXin Li LUAI_FUNC void luaK_exp2anyregup (FuncState *fs, expdesc *e);
77*088332b5SXin Li LUAI_FUNC void luaK_exp2nextreg (FuncState *fs, expdesc *e);
78*088332b5SXin Li LUAI_FUNC void luaK_exp2val (FuncState *fs, expdesc *e);
79*088332b5SXin Li LUAI_FUNC int luaK_exp2RK (FuncState *fs, expdesc *e);
80*088332b5SXin Li LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key);
81*088332b5SXin Li LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k);
82*088332b5SXin Li LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e);
83*088332b5SXin Li LUAI_FUNC void luaK_goiffalse (FuncState *fs, expdesc *e);
84*088332b5SXin Li LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e);
85*088332b5SXin Li LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults);
86*088332b5SXin Li LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e);
87*088332b5SXin Li LUAI_FUNC int luaK_jump (FuncState *fs);
88*088332b5SXin Li LUAI_FUNC void luaK_ret (FuncState *fs, int first, int nret);
89*088332b5SXin Li LUAI_FUNC void luaK_patchlist (FuncState *fs, int list, int target);
90*088332b5SXin Li LUAI_FUNC void luaK_patchtohere (FuncState *fs, int list);
91*088332b5SXin Li LUAI_FUNC void luaK_concat (FuncState *fs, int *l1, int l2);
92*088332b5SXin Li LUAI_FUNC int luaK_getlabel (FuncState *fs);
93*088332b5SXin Li LUAI_FUNC void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v, int line);
94*088332b5SXin Li LUAI_FUNC void luaK_infix (FuncState *fs, BinOpr op, expdesc *v);
95*088332b5SXin Li LUAI_FUNC void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1,
96*088332b5SXin Li                             expdesc *v2, int line);
97*088332b5SXin Li LUAI_FUNC void luaK_settablesize (FuncState *fs, int pc,
98*088332b5SXin Li                                   int ra, int asize, int hsize);
99*088332b5SXin Li LUAI_FUNC void luaK_setlist (FuncState *fs, int base, int nelems, int tostore);
100*088332b5SXin Li LUAI_FUNC void luaK_finish (FuncState *fs);
101*088332b5SXin Li LUAI_FUNC l_noret luaK_semerror (LexState *ls, const char *msg);
102*088332b5SXin Li 
103*088332b5SXin Li 
104*088332b5SXin Li #endif
105