RPA Toolkit
727e91d55761538a7524a21d97459e79b14993a5
[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
19 #define RJS_COCTX_NONE 0
20 #define RJS_COCTX_GLOBAL (1 << 1)
21 #define RJS_COCTX_FUNCTION (1 << 2)
22 #define RJS_COCTX_FUNCTIONCALL (1 << 3)
23 #define RJS_COCTX_IFSTATEMENT (1 << 4)
24 #define RJS_COCTX_ITERATION (1 << 5)
25 #define RJS_COCTX_OPERATION (1 << 5)
26
27 typedef struct rjs_coctx_s {
28         rulong type;
29 } rjs_coctx_t;
30
31
32 typedef struct rjs_coctx_global_s {
33         rjs_coctx_t base;
34         rsize_t allocs;
35 } rjs_coctx_global_t;
36
37
38 typedef struct rjs_coctx_function_s {
39         rjs_coctx_t base;
40         rsize_t allocs;
41 } rjs_coctx_function_t;
42
43
44 typedef struct rjs_coctx_operation_s {
45         rjs_coctx_t base;
46         rlong opcode;
47 } rjs_coctx_operation_t;
48
49
50 typedef struct rjs_coctx_functioncall_s {
51         rjs_coctx_t base;
52         rsize_t arguments;
53         ruchar setthis;
54 } rjs_coctx_functioncall_t;
55
56
57 typedef struct rjs_coctx_ifstatement_s {
58         rjs_coctx_t base;
59         rlong start;
60         rlong trueidx;
61         rlong falseidx;
62         rlong endidx;
63 } rjs_coctx_ifstatement_t;
64
65
66 typedef struct rjs_coctx_iteration_s {
67         rjs_coctx_t base;
68         rlong start;
69         rlong iterationidx;
70         rlong continueidx;
71         rlong endidx;
72 } rjs_coctx_iteration_t;
73
74
75 typedef struct rjs_compiler_s rjs_compiler_t;
76 typedef rint (*RJS_COMPILER_RH)(rjs_compiler_t *co, rarray_t *records, rlong rec);
77
78 struct rjs_compiler_s {
79         rvmcpu_t *cpu;
80         rvm_codegen_t *cg;
81         rvm_scope_t *scope;
82         rarray_t *coctx;
83         rchar *temp;
84         rlong headoff;
85         rlong opcode;
86         rulong debug:1;
87         RJS_COMPILER_RH handlers[RJS_COMPILER_NHANDLERS];
88 };
89
90
91 rjs_compiler_t *rjs_compiler_create(rvmcpu_t *cpu);
92 void rjs_compiler_destroy(rjs_compiler_t *co);
93 rint rjs_compiler_compile(rjs_compiler_t *co, rarray_t *records);
94 rjs_coctx_t *rjs_compiler_getctx(rjs_compiler_t *co, rulong type);
95
96 #ifdef __cplusplus
97 }
98 #endif
99
100 #endif