5 static void rjs_engine_print(rvmcpu_t *cpu, rvm_asmins_t *ins);
6 static void rjs_engine_dbgprint(rvmcpu_t *cpu, rvm_asmins_t *ins);
7 static void rjs_engine_object(rvmcpu_t *cpu, rvm_asmins_t *ins);
8 static rvm_switable_t rjsswitable[] = {
9 {"print", rjs_engine_print},
10 {"dbgprint", rjs_engine_dbgprint},
11 {"Object", rjs_engine_object},
12 {"Array", rjs_engine_object},
17 const rchar *rjs_version()
19 return RJS_VERSION_STRING;
23 rjs_engine_t *rjs_engine_create()
25 rjs_engine_t *jse = (rjs_engine_t *) r_zmalloc(sizeof(*jse));
27 jse->pa = rjs_parser_create();
28 jse->cpu = rvm_cpu_create_default();
29 rvm_cpu_addswitable(jse->cpu, "rjsswitable", rjsswitable);
34 void rjs_engine_destroy(rjs_engine_t *jse)
37 rjs_parser_destroy(jse->pa);
38 rvm_cpu_destroy(jse->cpu);
39 rjs_compiler_destroy(jse->co);
45 rint rjs_engine_open(rjs_engine_t *jse)
51 static rint rjs_engine_parse(rjs_engine_t *jse, const rchar *script, rsize_t size, rarray_t **records)
54 res = rjs_parser_exec(jse->pa, script, size, records);
59 rint rjs_engine_compile(rjs_engine_t *jse, const rchar *script, rsize_t size)
61 rarray_t *records = NULL;
63 rjs_compiler_destroy(jse->co);
64 jse->co = rjs_compiler_create(jse->cpu);
65 jse->co->debug = jse->debugcompile;
67 if (rjs_engine_parse(jse, script, size, &records) < 0) {
72 if (rjs_compiler_compile(jse->co, records) < 0) {
77 r_array_destroy(records);
81 r_array_destroy(records);
86 rint rjs_engine_dumpast(rjs_engine_t *jse, const rchar *script, rsize_t size)
88 rarray_t *records = NULL;
89 if (rjs_engine_parse(jse, script, size, &records) < 0) {
97 for (i = 0; i < r_array_length(records); i++)
98 rpa_record_dump(records, i);
101 r_array_destroy(records);
106 rint rjs_engine_compile_s(rjs_engine_t *jse, const rchar *script)
108 return rjs_engine_compile(jse, script, r_strlen(script));
112 rint rjs_engine_close(rjs_engine_t *jse)
119 rint rjs_engine_run(rjs_engine_t *jse)
127 if (jse->debugexec) {
128 res = rvm_cpu_exec_debug(jse->cpu, rvm_codegen_getcode(jse->co->cg, 0), 0);
130 res = rvm_cpu_exec(jse->cpu, rvm_codegen_getcode(jse->co->cg, 0), 0);
136 static void rjs_engine_print(rvmcpu_t *cpu, rvm_asmins_t *ins)
138 rvmreg_t *r = (rvmreg_t *)RVM_STACK_ADDR(cpu->stack, RVM_CPUREG_GETU(cpu, FP) + 1);
140 if (rvm_reg_gettype(r) == RVM_DTYPE_UNSIGNED)
141 r_printf("%lu\n", RVM_REG_GETU(r));
142 else if (rvm_reg_gettype(r) == RVM_DTYPE_NAN)
144 else if (rvm_reg_gettype(r) == RVM_DTYPE_UNDEF)
145 r_printf("undefined\n");
146 else if (rvm_reg_gettype(r) == RVM_DTYPE_BOOLEAN)
147 r_printf("%s\n", RVM_REG_GETU(r) ? "true" : "false");
148 else if (rvm_reg_gettype(r) == RVM_DTYPE_POINTER)
149 r_printf("%p\n", RVM_REG_GETP(r));
150 else if (rvm_reg_gettype(r) == RVM_DTYPE_LONG)
151 r_printf("%ld\n", RVM_REG_GETL(r));
152 else if (rvm_reg_gettype(r) == RVM_DTYPE_DOUBLE)
153 r_printf("%f\n", RVM_REG_GETD(r));
154 else if (rvm_reg_gettype(r) == RVM_DTYPE_STRING)
155 r_printf("%s\n", ((rstring_t*) RVM_REG_GETP(r))->s.str);
156 else if (rvm_reg_gettype(r) == RVM_DTYPE_JSOBJECT)
157 r_printf("(object) %p\n",RVM_REG_GETP(r));
158 else if (rvm_reg_gettype(r) == RVM_DTYPE_HARRAY)
159 r_printf("(hashed array) %p\n",RVM_REG_GETP(r));
160 else if (rvm_reg_gettype(r) == RVM_DTYPE_SWIID)
161 r_printf("(function) %p\n",RVM_REG_GETP(r));
163 r_printf("%p\n", RVM_REG_GETP(r));
167 static void rjs_engine_dbgprint(rvmcpu_t *cpu, rvm_asmins_t *ins)
169 rvmreg_t *r = (rvmreg_t *)RVM_STACK_ADDR(cpu->stack, RVM_CPUREG_GETU(cpu, FP) + 1);
171 if (rvm_reg_gettype(r) == RVM_DTYPE_UNSIGNED)
172 r_printf("(UNSIGNED) %lu\n", RVM_REG_GETU(r));
173 else if (rvm_reg_gettype(r) == RVM_DTYPE_NAN)
174 r_printf("(NAN) NaN\n");
175 else if (rvm_reg_gettype(r) == RVM_DTYPE_UNDEF)
176 r_printf("(UNDEF) undefined\n");
177 else if (rvm_reg_gettype(r) == RVM_DTYPE_BOOLEAN)
178 r_printf("(BOOLEAN) %s\n", RVM_REG_GETU(r) ? "true" : "false");
179 else if (rvm_reg_gettype(r) == RVM_DTYPE_POINTER)
180 r_printf("(POINTER) %p\n", RVM_REG_GETP(r));
181 else if (rvm_reg_gettype(r) == RVM_DTYPE_LONG)
182 r_printf("(LONG) %ld\n", RVM_REG_GETL(r));
183 else if (rvm_reg_gettype(r) == RVM_DTYPE_DOUBLE)
184 r_printf("(DOUBLE) %f\n", RVM_REG_GETD(r));
185 else if (rvm_reg_gettype(r) == RVM_DTYPE_STRING)
186 r_printf("(STRING) %s\n", ((rstring_t*) RVM_REG_GETP(r))->s.str);
187 else if (rvm_reg_gettype(r) == RVM_DTYPE_JSOBJECT)
188 r_printf("(object) %p\n",RVM_REG_GETP(r));
189 else if (rvm_reg_gettype(r) == RVM_DTYPE_HARRAY)
190 r_printf("(hashed array) %p\n",RVM_REG_GETP(r));
191 else if (rvm_reg_gettype(r) == RVM_DTYPE_SWIID)
192 r_printf("(function) %p\n",RVM_REG_GETP(r));
194 r_printf("%p\n", RVM_REG_GETP(r));
198 static void rjs_engine_object(rvmcpu_t *cpu, rvm_asmins_t *ins)