RPA Toolkit
work on RJS object introspection.
[rpatk.git] / rjs / rjscompiler.h
1 /*
2  *  Regular Pattern Analyzer (RPA)
3  *  Copyright (c) 2009-2010 Martin Stoilov
4  *
5  *  This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation, either version 3 of the License, or
8  *  (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
17  *
18  *  Martin Stoilov <martin@rpasearch.com>
19  */
20
21 #ifndef _RJSCOMPILER_H_
22 #define _RJSCOMPILER_H_
23
24
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28
29 #include "rtypes.h"
30 #include "rlib/rarray.h"
31 #include "rvm/rvmcodegen.h"
32 #include "rvm/rvmscope.h"
33 #include "rvm/rvmcpu.h"
34 #include "rjs/rjsuids.h"
35 #include "rpa/rparecord.h"
36 #include "rjs/rjserror.h"
37
38 #define RJS_COMPILER_NHANDLERS 128
39 #define RJS_COMPILER_CODEGENKEEP (1 << 0)
40
41 #define RJS_COCTX_NONE 0
42 #define RJS_COCTX_GLOBAL (1 << 1)
43 #define RJS_COCTX_FUNCTION (1 << 2)
44 #define RJS_COCTX_FUNCTIONCALL (1 << 3)
45 #define RJS_COCTX_IFSTATEMENT (1 << 4)
46 #define RJS_COCTX_ITERATION (1 << 5)
47 #define RJS_COCTX_OPERATION (1 << 5)
48 #define RJS_COCTX_DELETE (1 << 6)
49
50
51 typedef struct rjs_coctx_s {
52         unsigned long type;
53 } rjs_coctx_t;
54
55
56 typedef struct rjs_coctx_global_s {
57         rjs_coctx_t base;
58         unsigned long stackallocs;
59 } rjs_coctx_global_t;
60
61
62 typedef struct rjs_coctx_function_s {
63         rjs_coctx_t base;
64         long start;
65         long execidx;
66         long endidx;
67         long allocsidx;
68         long execoff;
69         unsigned long stackallocs;
70 } rjs_coctx_function_t;
71
72
73 typedef struct rjs_coctx_operation_s {
74         rjs_coctx_t base;
75         long opcode;
76 } rjs_coctx_operation_t;
77
78
79 typedef struct rjs_coctx_functioncall_s {
80         rjs_coctx_t base;
81         unsigned long arguments;
82         unsigned char setthis;
83 } rjs_coctx_functioncall_t;
84
85
86 typedef struct rjs_coctx_ifstatement_s {
87         rjs_coctx_t base;
88         long start;
89         long trueidx;
90         long falseidx;
91         long endidx;
92 } rjs_coctx_ifstatement_t;
93
94
95 typedef struct rjs_coctx_iteration_s {
96         rjs_coctx_t base;
97         long start;
98         long iterationidx;
99         long continueidx;
100         long endidx;
101 } rjs_coctx_iteration_t;
102
103
104
105 typedef struct rjs_compiler_s rjs_compiler_t;
106 typedef int (*RJS_COMPILER_RH)(rjs_compiler_t *co, rarray_t *records, long rec);
107
108 struct rjs_compiler_s {
109         rvmcpu_t *cpu;
110         rvm_codegen_t *cg;
111         rvm_scope_t *scope;
112         rjs_error_t *error;
113         rarray_t *coctx;
114         char *temp;
115         rstr_t stringcharacters;
116         const char *script;
117         unsigned long scriptsize;
118         long headoff;
119         long opcode;
120         unsigned long debug:1;
121         RJS_COMPILER_RH handlers[RJS_COMPILER_NHANDLERS];
122 };
123
124
125 rjs_compiler_t *rjs_compiler_create(rvmcpu_t *cpu);
126 void rjs_compiler_destroy(rjs_compiler_t *co);
127 int rjs_compiler_compile(rjs_compiler_t *co, const char *script, unsigned long scriptsize, rarray_t *records, rvm_codegen_t *cg, rjs_error_t *error);
128 rjs_coctx_t *rjs_compiler_getctx(rjs_compiler_t *co, unsigned long type);
129
130 #ifdef __cplusplus
131 }
132 #endif
133
134 #endif