RPA Toolkit
7a654cd68a63d7ce17f687dbef8b8dd49b8fc74b
[rpatk.git] / rjs / rjscompiler.h
1 #ifndef _RJSCOMPILER_H_
2 #define _RJSCOMPILER_H_
3
4
5 #ifdef __cplusplus
6 extern "C" {
7 #endif
8
9 #include "rtypes.h"
10 #include "rarray.h"
11 #include "rvmcodegen.h"
12 #include "rvmscope.h"
13 #include "rvmcpu.h"
14 #include "rjsuids.h"
15 #include "rparecord.h"
16
17 #define RJS_COMPILER_NHANDLERS 128
18 #define RJS_COMPILER_CODEGENKEEP (1 << 0)
19
20 #define RJS_COCTX_NONE 0
21 #define RJS_COCTX_GLOBAL (1 << 1)
22 #define RJS_COCTX_FUNCTION (1 << 2)
23 #define RJS_COCTX_FUNCTIONCALL (1 << 3)
24 #define RJS_COCTX_IFSTATEMENT (1 << 4)
25 #define RJS_COCTX_ITERATION (1 << 5)
26 #define RJS_COCTX_OPERATION (1 << 5)
27
28 #define RJS_ERROR_NONE 0
29 #define RJS_ERROR_UNDEFINED 1
30 #define RJS_ERROR_SYNTAX 2
31 #define RJS_ERROR_NOTAFUNCTION 3
32 #define RJS_ERROR_NOTAFUNCTIONCALL 4
33 #define RJS_ERROR_NOTALOOP 5
34 #define RJS_ERROR_NOTAIFSTATEMENT 6
35
36 typedef struct rjs_coctx_s {
37         rulong type;
38 } rjs_coctx_t;
39
40
41 typedef struct rjs_coctx_global_s {
42         rjs_coctx_t base;
43 } rjs_coctx_global_t;
44
45
46 typedef struct rjs_coctx_function_s {
47         rjs_coctx_t base;
48         rlong start;
49         rlong execidx;
50         rlong endidx;
51         rlong allocsidx;
52         rlong execoff;
53         rsize_t allocs;
54 } rjs_coctx_function_t;
55
56
57 typedef struct rjs_coctx_operation_s {
58         rjs_coctx_t base;
59         rlong opcode;
60 } rjs_coctx_operation_t;
61
62
63 typedef struct rjs_coctx_functioncall_s {
64         rjs_coctx_t base;
65         rsize_t arguments;
66         ruchar setthis;
67 } rjs_coctx_functioncall_t;
68
69
70 typedef struct rjs_coctx_ifstatement_s {
71         rjs_coctx_t base;
72         rlong start;
73         rlong trueidx;
74         rlong falseidx;
75         rlong endidx;
76 } rjs_coctx_ifstatement_t;
77
78
79 typedef struct rjs_coctx_iteration_s {
80         rjs_coctx_t base;
81         rlong start;
82         rlong iterationidx;
83         rlong continueidx;
84         rlong endidx;
85 } rjs_coctx_iteration_t;
86
87
88 typedef struct rjs_coerror_s {
89         rlong code;
90         const rchar *script;
91         rlong scriptsize;
92 } rjs_coerror_t;
93
94
95 typedef struct rjs_compiler_s rjs_compiler_t;
96 typedef rint (*RJS_COMPILER_RH)(rjs_compiler_t *co, rarray_t *records, rlong rec);
97
98 struct rjs_compiler_s {
99         rvmcpu_t *cpu;
100         rvm_codegen_t *cg;
101         rvm_scope_t *scope;
102         rarray_t *coctx;
103         rarray_t *errors;
104         rchar *temp;
105         rlong headoff;
106         rlong opcode;
107         rulong debug:1;
108         RJS_COMPILER_RH handlers[RJS_COMPILER_NHANDLERS];
109 };
110
111
112 rjs_compiler_t *rjs_compiler_create(rvmcpu_t *cpu);
113 void rjs_compiler_destroy(rjs_compiler_t *co);
114 rint rjs_compiler_compile(rjs_compiler_t *co, rarray_t *records, rvm_codegen_t *cg);
115 rjs_coctx_t *rjs_compiler_getctx(rjs_compiler_t *co, rulong type);
116
117 #ifdef __cplusplus
118 }
119 #endif
120
121 #endif