RPA Toolkit
work on the RJS code segments
authorMartin Stoilov <martin@rpasearch.com>
Mon, 16 May 2011 06:52:29 +0000 (23:52 -0700)
committerMartin Stoilov <martin@rpasearch.com>
Mon, 16 May 2011 06:52:29 +0000 (23:52 -0700)
rjs/rjs.c
rjs/rjs.h
rjs/rjscompiler.c
rjs/rjscompiler.h
rjs/rjsexec.c
rvm/rvmcodegen.h

index 4544483..6176100 100644 (file)
--- a/rjs/rjs.c
+++ b/rjs/rjs.c
@@ -1,6 +1,7 @@
 #include "rmem.h"
 #include "rjsobject.h"
 #include "rjs.h"
+#include "rvmcodegen.h"
 
 
 static void rjs_engine_print(rvmcpu_t *cpu, rvm_asmins_t *ins);
@@ -29,6 +30,7 @@ rjs_engine_t *rjs_engine_create()
        jse->pa = rjs_parser_create();
        jse->cpu = rvm_cpu_create_default();
        jse->co = rjs_compiler_create(jse->cpu);
+       jse->cgs = r_array_create(sizeof(rvm_codegen_t*));
        rvm_cpu_addswitable(jse->cpu, "rjsswitable", rjsswitable);
 
        tp = rvm_cpu_alloc_global(jse->cpu);
@@ -42,7 +44,12 @@ rjs_engine_t *rjs_engine_create()
 
 void rjs_engine_destroy(rjs_engine_t *jse)
 {
+       rlong i;
        if (jse) {
+               for (i = 0; i < r_array_length(jse->cgs); i++) {
+//                     rvm_codegen_destroy(r_array_index(jse->cgs, i, rvm_codegen_t*));
+               }
+               r_array_destroy(jse->cgs);
                rjs_parser_destroy(jse->pa);
                rvm_cpu_destroy(jse->cpu);
                rjs_compiler_destroy(jse->co);
@@ -67,10 +74,8 @@ static rint rjs_engine_parse(rjs_engine_t *jse, const rchar *script, rsize_t siz
 
 rint rjs_engine_compile(rjs_engine_t *jse, const rchar *script, rsize_t size)
 {
+       rvm_codegen_t *topcg = NULL;
        rarray_t *records = NULL;
-//     if (jse->co)
-//             rjs_compiler_destroy(jse->co);
-//     jse->co = rjs_compiler_create(jse->cpu);
        jse->co->debug = jse->debugcompile;
 
        if (rjs_engine_parse(jse, script, size, &records) < 0) {
@@ -78,8 +83,18 @@ rint rjs_engine_compile(rjs_engine_t *jse, const rchar *script, rsize_t size)
                goto err;
        }
 
-       if (rjs_compiler_compile(jse->co, records) < 0) {
-
+       topcg =  r_array_empty(jse->cgs) ? NULL : r_array_last(jse->cgs, rvm_codegen_t*);
+       if (!topcg || (topcg->userdata & RJS_COMPILER_CODEGENKEEP) == 0) {
+               topcg = rvm_codegen_create();
+               r_array_add(jse->cgs, &topcg);
+       } else {
+               topcg->userdata = 0;
+               rvm_codegen_clear(topcg);
+       }
+       r_printf("cgs size: %ld\n", r_array_length(jse->cgs));
+       topcg->userdata = 0;
+       if (rjs_compiler_compile(jse->co, records, topcg) < 0) {
+               topcg->userdata = 0;
                goto err;
        }
 
@@ -128,15 +143,16 @@ rint rjs_engine_close(rjs_engine_t *jse)
 rint rjs_engine_run(rjs_engine_t *jse)
 {
        rint res = 0;
+       rvm_codegen_t *cg = r_array_empty(jse->cgs) ? NULL : r_array_last(jse->cgs, rvm_codegen_t*);
 
-       if (!jse->co) {
+       if (!cg) {
 
                return -1;
        }
        if (jse->debugexec) {
-               res = rvm_cpu_exec_debug(jse->cpu, rvm_codegen_getcode(jse->co->cg, 0), 0);
+               res = rvm_cpu_exec_debug(jse->cpu, rvm_codegen_getcode(cg, 0), 0);
        } else {
-               res = rvm_cpu_exec(jse->cpu, rvm_codegen_getcode(jse->co->cg, 0), 0);
+               res = rvm_cpu_exec(jse->cpu, rvm_codegen_getcode(cg, 0), 0);
        }
        return res;
 }
index 121abd1..5070116 100644 (file)
--- a/rjs/rjs.h
+++ b/rjs/rjs.h
@@ -14,6 +14,7 @@ extern "C" {
 typedef struct rjs_engine_s {
        rjs_parser_t *pa;
        rjs_compiler_t *co;
+       rarray_t *cgs;
        rvmcpu_t *cpu;
        rlong debugcompile:1;
        rlong debugexec:1;
index eefac20..0a9ac19 100644 (file)
@@ -726,6 +726,7 @@ rint rjs_compiler_rh_functiondeclaration(rjs_compiler_t *co, rarray_t *records,
        rvm_codegen_redefinepointer(co->cg, allocsidx, (rpointer)ctx.allocs);
        rjs_compiler_debugtail(co, records, rec);
 
+       co->cg->userdata = RJS_COMPILER_CODEGENKEEP;
        rvm_scope_pop(co->scope);
        r_array_removelast(co->coctx);
        return 0;
@@ -1525,7 +1526,6 @@ rjs_compiler_t *rjs_compiler_create(rvmcpu_t *cpu)
 {
        rjs_compiler_t *co = (rjs_compiler_t *) r_zmalloc(sizeof(*co));
 
-       co->cg = rvm_codegen_create();
        co->scope = rvm_scope_create();
        co->coctx = r_array_create(sizeof(rjs_coctx_t *));
        co->errors = r_array_create(sizeof(rjs_coerror_t));
@@ -1595,7 +1595,6 @@ rjs_compiler_t *rjs_compiler_create(rvmcpu_t *cpu)
 void rjs_compiler_destroy(rjs_compiler_t *co)
 {
        if (co) {
-               rvm_codegen_destroy(co->cg);
                rvm_scope_destroy(co->scope);
                r_array_destroy(co->coctx);
                r_array_destroy(co->errors);
@@ -1663,17 +1662,18 @@ static rint rjs_compiler_playrecord(rjs_compiler_t *co, rarray_t *records, rlong
 }
 
 
-rint rjs_compiler_compile(rjs_compiler_t *co, rarray_t *records)
+rint rjs_compiler_compile(rjs_compiler_t *co, rarray_t *records, rvm_codegen_t *cg)
 {
        rlong i;
        rvm_codelabel_t *labelerr;
 
-       if (!co || !records || r_array_empty(records)) {
+       if (!co || !records || !cg || r_array_empty(records)) {
                /*
                 * TBD
                 */
                return -1;
        }
+       co->cg = cg;
 
        r_array_setlength(co->errors, 0);
        for (i = 0; i >= 0; i = rpa_recordtree_next(records, i, RPA_RECORD_START)) {
index 2dcf0ad..7a654cd 100644 (file)
@@ -15,6 +15,7 @@ extern "C" {
 #include "rparecord.h"
 
 #define RJS_COMPILER_NHANDLERS 128
+#define RJS_COMPILER_CODEGENKEEP (1 << 0)
 
 #define RJS_COCTX_NONE 0
 #define RJS_COCTX_GLOBAL (1 << 1)
@@ -110,7 +111,7 @@ struct rjs_compiler_s {
 
 rjs_compiler_t *rjs_compiler_create(rvmcpu_t *cpu);
 void rjs_compiler_destroy(rjs_compiler_t *co);
-rint rjs_compiler_compile(rjs_compiler_t *co, rarray_t *records);
+rint rjs_compiler_compile(rjs_compiler_t *co, rarray_t *records, rvm_codegen_t *cg);
 rjs_coctx_t *rjs_compiler_getctx(rjs_compiler_t *co, rulong type);
 
 #ifdef __cplusplus
index b1d82b2..238313d 100644 (file)
@@ -200,6 +200,6 @@ end:
        if (unmapscript)
                rjs_unmap_file(unmapscript);
        if (statinfo)
-               fprintf(stdout, "\nRJS Version: %s, memory: %ld KB (leaked %ld Bytes)\n", rjs_version(), (rlong)r_debug_get_maxmem()/1000, (rlong)r_debug_get_allocmem());
+               fprintf(stdout, "\nRJS Version: %s, memory: %ld Bytes (leaked %ld Bytes)\n", rjs_version(), (rlong)r_debug_get_maxmem(), (rlong)r_debug_get_allocmem());
        return 0;
 }
index 26263ca..960c4db 100644 (file)
 extern "C" {
 #endif
 
+
 #define RVM_CODEGEN_FUNCINITOFFSET 3
 #define RVM_CODEGEN_E_NONE 0
 
+
 typedef struct rvm_codegen_s {
        rarray_t *code;
        rarray_t *data;
        ruint codeoff;
        rvm_codemap_t *codemap;
        rvm_relocmap_t *relocmap;
+       rulong userdata;
 } rvm_codegen_t;