RPA Toolkit
2dcf0adfd6303d71512291866fb43f311a6542e3
[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 #define RJS_ERROR_NONE 0
28 #define RJS_ERROR_UNDEFINED 1
29 #define RJS_ERROR_SYNTAX 2
30 #define RJS_ERROR_NOTAFUNCTION 3
31 #define RJS_ERROR_NOTAFUNCTIONCALL 4
32 #define RJS_ERROR_NOTALOOP 5
33 #define RJS_ERROR_NOTAIFSTATEMENT 6
34
35 typedef struct rjs_coctx_s {
36         rulong type;
37 } rjs_coctx_t;
38
39
40 typedef struct rjs_coctx_global_s {
41         rjs_coctx_t base;
42 } rjs_coctx_global_t;
43
44
45 typedef struct rjs_coctx_function_s {
46         rjs_coctx_t base;
47         rlong start;
48         rlong execidx;
49         rlong endidx;
50         rlong allocsidx;
51         rlong execoff;
52         rsize_t allocs;
53 } rjs_coctx_function_t;
54
55
56 typedef struct rjs_coctx_operation_s {
57         rjs_coctx_t base;
58         rlong opcode;
59 } rjs_coctx_operation_t;
60
61
62 typedef struct rjs_coctx_functioncall_s {
63         rjs_coctx_t base;
64         rsize_t arguments;
65         ruchar setthis;
66 } rjs_coctx_functioncall_t;
67
68
69 typedef struct rjs_coctx_ifstatement_s {
70         rjs_coctx_t base;
71         rlong start;
72         rlong trueidx;
73         rlong falseidx;
74         rlong endidx;
75 } rjs_coctx_ifstatement_t;
76
77
78 typedef struct rjs_coctx_iteration_s {
79         rjs_coctx_t base;
80         rlong start;
81         rlong iterationidx;
82         rlong continueidx;
83         rlong endidx;
84 } rjs_coctx_iteration_t;
85
86
87 typedef struct rjs_coerror_s {
88         rlong code;
89         const rchar *script;
90         rlong scriptsize;
91 } rjs_coerror_t;
92
93
94 typedef struct rjs_compiler_s rjs_compiler_t;
95 typedef rint (*RJS_COMPILER_RH)(rjs_compiler_t *co, rarray_t *records, rlong rec);
96
97 struct rjs_compiler_s {
98         rvmcpu_t *cpu;
99         rvm_codegen_t *cg;
100         rvm_scope_t *scope;
101         rarray_t *coctx;
102         rarray_t *errors;
103         rchar *temp;
104         rlong headoff;
105         rlong opcode;
106         rulong debug:1;
107         RJS_COMPILER_RH handlers[RJS_COMPILER_NHANDLERS];
108 };
109
110
111 rjs_compiler_t *rjs_compiler_create(rvmcpu_t *cpu);
112 void rjs_compiler_destroy(rjs_compiler_t *co);
113 rint rjs_compiler_compile(rjs_compiler_t *co, rarray_t *records);
114 rjs_coctx_t *rjs_compiler_getctx(rjs_compiler_t *co, rulong type);
115
116 #ifdef __cplusplus
117 }
118 #endif
119
120 #endif