1#ifndef js_compile_h
2#define js_compile_h
3
4enum js_OpCode
5{
6 OP_POP, /* A -- */
7 OP_DUP, /* A -- A A */
8 OP_DUP2, /* A B -- A B A B */
9 OP_ROT2, /* A B -- B A */
10 OP_ROT3, /* A B C -- C A B */
11 OP_ROT4, /* A B C D -- D A B C */
12
13 OP_INTEGER, /* -K- (number-32768) */
14 OP_NUMBER, /* -N- <number> */
15 OP_STRING, /* -S- <string> */
16 OP_CLOSURE, /* -F- <closure> */
17
18 OP_NEWARRAY,
19 OP_NEWOBJECT,
20 OP_NEWREGEXP, /* -S,opts- <regexp> */
21
22 OP_UNDEF,
23 OP_NULL,
24 OP_TRUE,
25 OP_FALSE,
26
27 OP_THIS,
28 OP_CURRENT, /* currently executing function object */
29
30 OP_GETLOCAL, /* -K- <value> */
31 OP_SETLOCAL, /* <value> -K- <value> */
32 OP_DELLOCAL, /* -K- false */
33
34 OP_HASVAR, /* -S- ( <value> | undefined ) */
35 OP_GETVAR, /* -S- <value> */
36 OP_SETVAR, /* <value> -S- <value> */
37 OP_DELVAR, /* -S- <success> */
38
39 OP_IN, /* <name> <obj> -- <exists?> */
40
41 OP_INITPROP, /* <obj> <key> <val> -- <obj> */
42 OP_INITGETTER, /* <obj> <key> <closure> -- <obj> */
43 OP_INITSETTER, /* <obj> <key> <closure> -- <obj> */
44
45 OP_GETPROP, /* <obj> <name> -- <value> */
46 OP_GETPROP_S, /* <obj> -S- <value> */
47 OP_SETPROP, /* <obj> <name> <value> -- <value> */
48 OP_SETPROP_S, /* <obj> <value> -S- <value> */
49 OP_DELPROP, /* <obj> <name> -- <success> */
50 OP_DELPROP_S, /* <obj> -S- <success> */
51
52 OP_ITERATOR, /* <obj> -- <iobj> */
53 OP_NEXTITER, /* <iobj> -- ( <iobj> <name> true | false ) */
54
55 OP_EVAL, /* <args...> -(numargs)- <returnvalue> */
56 OP_CALL, /* <closure> <this> <args...> -(numargs)- <returnvalue> */
57 OP_NEW, /* <closure> <args...> -(numargs)- <returnvalue> */
58
59 OP_TYPEOF,
60 OP_POS,
61 OP_NEG,
62 OP_BITNOT,
63 OP_LOGNOT,
64 OP_INC, /* <x> -- ToNumber(x)+1 */
65 OP_DEC, /* <x> -- ToNumber(x)-1 */
66 OP_POSTINC, /* <x> -- ToNumber(x)+1 ToNumber(x) */
67 OP_POSTDEC, /* <x> -- ToNumber(x)-1 ToNumber(x) */
68
69 OP_MUL,
70 OP_DIV,
71 OP_MOD,
72 OP_ADD,
73 OP_SUB,
74 OP_SHL,
75 OP_SHR,
76 OP_USHR,
77 OP_LT,
78 OP_GT,
79 OP_LE,
80 OP_GE,
81 OP_EQ,
82 OP_NE,
83 OP_STRICTEQ,
84 OP_STRICTNE,
85 OP_JCASE,
86 OP_BITAND,
87 OP_BITXOR,
88 OP_BITOR,
89
90 OP_INSTANCEOF,
91
92 OP_THROW,
93
94 OP_TRY, /* -ADDR- /jump/ or -ADDR- <exception> */
95 OP_ENDTRY,
96
97 OP_CATCH, /* push scope chain with exception variable */
98 OP_ENDCATCH,
99
100 OP_WITH,
101 OP_ENDWITH,
102
103 OP_DEBUGGER,
104 OP_JUMP,
105 OP_JTRUE,
106 OP_JFALSE,
107 OP_RETURN,
108};
109
110struct js_Function
111{
112 const char *name;
113 int script;
114 int lightweight;
115 int strict;
116 int arguments;
117 int numparams;
118
119 js_Instruction *code;
120 int codecap, codelen;
121
122 js_Function **funtab;
123 int funcap, funlen;
124
125 double *numtab;
126 int numcap, numlen;
127
128 const char **strtab;
129 int strcap, strlen;
130
131 const char **vartab;
132 int varcap, varlen;
133
134 const char *filename;
135 int line, lastline;
136
137 js_Function *gcnext;
138 int gcmark;
139};
140
141js_Function *jsC_compilefunction(js_State *J, js_Ast *prog);
142js_Function *jsC_compilescript(js_State *J, js_Ast *prog, int default_strict);
143const char *jsC_opcodestring(enum js_OpCode opcode);
144void jsC_dumpfunction(js_State *J, js_Function *fun);
145
146#endif
147