RPA Toolkit
Work on the RJS error handlers.
authorMartin Stoilov <martin@rpasearch.com>
Fri, 13 May 2011 06:44:44 +0000 (23:44 -0700)
committerMartin Stoilov <martin@rpasearch.com>
Fri, 13 May 2011 06:44:44 +0000 (23:44 -0700)
rjs/rjs.c
rjs/rjscompiler.c
rjs/rjscompiler.h
rjs/rjsexec.c

index 1d5383e..b7c6b7a 100644 (file)
--- a/rjs/rjs.c
+++ b/rjs/rjs.c
@@ -32,6 +32,7 @@ rjs_engine_t *rjs_engine_create()
 
        tp = rvm_cpu_alloc_global(jse->cpu);
        rvm_reg_setjsobject(tp, (robject_t *)rjs_object_create(sizeof(rvmreg_t)));
+       rvm_gc_add(jse->cpu->gc, (robject_t*)RVM_REG_GETP(tp));
        rvm_cpu_setreg(jse->cpu, TP, tp);
 
        return jse;
index efe7c7c..26695d2 100644 (file)
@@ -24,6 +24,16 @@ void rjs_compiler_debugtail(rjs_compiler_t *co, rarray_t *records, rlong rec)
 }
 
 
+void rjs_compiler_adderror(rjs_compiler_t *co, rlong code, const rchar *script, rlong scriptsize)
+{
+       rjs_coerror_t error;
+       error.code = code;
+       error.script = script;
+       error.scriptsize = scriptsize;
+       r_array_add(co->errors, &error);
+}
+
+
 static const rchar *rjs_compiler_record2str(rjs_compiler_t *co, rarray_t *records, rlong rec)
 {
        rparecord_t *prec = (rparecord_t *)r_array_slot(records, rpa_recordtree_get(records, rec, RPA_RECORD_END));
@@ -91,10 +101,13 @@ static rlong rjs_compiler_record2identifer(rjs_compiler_t *co, rarray_t *records
                functx->allocs += 1;
                rvm_scope_addoffset(co->scope, prec->input, prec->inputsiz, functx->allocs);
        } else {
-               rjs_coctx_global_t *functx = (rjs_coctx_global_t *)ctx;
-               functx->allocs += 1;
-               r_carray_setlength(co->cpu->data, functx->allocs + 1);
-               rvm_scope_addpointer(co->scope, prec->input, prec->inputsiz, r_carray_slot(co->cpu->data, functx->allocs));
+//             rjs_coctx_global_t *globalctx = (rjs_coctx_global_t *)ctx;
+//             r_carray_setlength(co->cpu->data, globalctx->allocs + 1);
+//             rvm_scope_addpointer(co->scope, prec->input, prec->inputsiz, r_carray_slot(co->cpu->data, globalctx->allocs));
+
+//             rvm_scope_addpointer(co->scope, prec->input, prec->inputsiz, r_carray_slot_expand(co->cpu->data, r_carray_length(co->cpu->data)));
+//             r_carray_setlength(co->cpu->data, r_carray_length(co->cpu->data) + 1);
+               rvm_scope_addpointer(co->scope, prec->input, prec->inputsiz, rvm_cpu_alloc_global(co->cpu));
        }
        v = rvm_scope_tiplookup(co->scope, prec->input, prec->inputsiz);
        if (v->datatype == VARMAP_DATATYPE_OFFSET) {
@@ -331,7 +344,6 @@ rint rjs_compiler_rh_initializer(rjs_compiler_t *co, rarray_t *records, rlong re
 
 rint rjs_compiler_rh_identifier(rjs_compiler_t *co, rarray_t *records, rlong rec)
 {
-       rjs_coerror_t error;
        rvm_varmap_t *v;
        rparecord_t *prec;
        rlong swiid = -1;
@@ -356,10 +368,7 @@ rint rjs_compiler_rh_identifier(rjs_compiler_t *co, rarray_t *records, rlong rec
                        goto end;
                }
 
-               error.code = RJS_ERROR_UNDEFINED;
-               error.script = prec->input;
-               error.scriptsize = prec->inputsiz;
-               r_array_add(co->errors, &error);
+               rjs_compiler_adderror(co, RJS_ERROR_UNDEFINED, prec->input, prec->inputsiz);
                return 0;
        }
 
@@ -483,10 +492,16 @@ rint rjs_compiler_rh_stringcharacters(rjs_compiler_t *co, rarray_t *records, rlo
 {
        rparecord_t *prec;
        prec = (rparecord_t *)r_array_slot(records, rec);
+       rvmreg_t *strreg = rvm_cpu_alloc_global(co->cpu);
+       rstring_t *s = r_string_create_strsize((const rchar*)prec->input, prec->inputsiz);
+       rvm_gc_add(co->cpu->gc, (robject_t*)s);
+       rvm_reg_setstring(strreg, s);
+
        rjs_compiler_debughead(co, records, rec);
-       rvm_codegen_addins(co->cg, rvm_asmp(RVM_MOV, R1, DA, XX, (void*)prec->input));
-       rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R2, DA, XX, prec->inputsiz));
-       rvm_codegen_addins(co->cg, rvm_asm(RVM_ALLOCSTR, R0, R1, R2, 0));
+//     rvm_codegen_addins(co->cg, rvm_asmp(RVM_MOV, R1, DA, XX, (void*)prec->input));
+//     rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R2, DA, XX, prec->inputsiz));
+//     rvm_codegen_addins(co->cg, rvm_asm(RVM_ALLOCSTR, R0, R1, R2, 0));
+       rvm_codegen_addins(co->cg, rvm_asmp(RVM_LDRR, R0, DA, XX, strreg));
        rjs_compiler_debugtail(co, records, rec);
 
        if (rjs_compiler_playchildrecords(co, records, rec) < 0)
@@ -726,16 +741,19 @@ rint rjs_compiler_rh_functionparameter(rjs_compiler_t *co, rarray_t *records, rl
        rparecord_t *prec;
        rvm_varmap_t *v;
 
+       prec = (rparecord_t *)r_array_slot(records, rec);
+       rjs_compiler_debughead(co, records, rec);
        /*
         * First lets find out if we are within a function definition or
         * this is a global variable.
         */
        ctx = rjs_compiler_getctx(co, RJS_COCTX_FUNCTION);
+       if (!ctx) {
+               rjs_compiler_adderror(co, RJS_ERROR_NOTAFUNCTION, prec->input, prec->inputsiz);
+               return 0;
+       }
        R_ASSERT(ctx);
        functx = (rjs_coctx_function_t *)ctx;
-
-       prec = (rparecord_t *)r_array_slot(records, rec);
-       rjs_compiler_debughead(co, records, rec);
        rjs_compiler_debugtail(co, records, rec);
 
        if (rjs_compiler_playchildrecords(co, records, rec) < 0)
@@ -809,9 +827,13 @@ rint rjs_compiler_rh_argument(rjs_compiler_t *co, rarray_t *records, rlong rec)
        rparecord_t *prec;
        rjs_coctx_functioncall_t *ctx = (rjs_coctx_functioncall_t *)rjs_compiler_getctx(co, RJS_COCTX_FUNCTIONCALL);
 
-       R_ASSERT(ctx);
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
+       if (!ctx) {
+               rjs_compiler_adderror(co, RJS_ERROR_NOTAFUNCTIONCALL, prec->input, prec->inputsiz);
+               return 0;
+       }
+       R_ASSERT(ctx);
        rjs_compiler_debugtail(co, records, rec);
 
        if (rjs_compiler_playchildrecords(co, records, rec) < 0)
@@ -832,9 +854,13 @@ rint rjs_compiler_rh_arguments(rjs_compiler_t *co, rarray_t *records, rlong rec)
        rparecord_t *prec;
        rjs_coctx_functioncall_t *ctx = (rjs_coctx_functioncall_t *)rjs_compiler_getctx(co, RJS_COCTX_FUNCTIONCALL);
 
-       R_ASSERT(ctx);
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
+       if (!ctx) {
+               rjs_compiler_adderror(co, RJS_ERROR_NOTAFUNCTIONCALL, prec->input, prec->inputsiz);
+               return 0;
+       }
+       R_ASSERT(ctx);
        rjs_compiler_debugtail(co, records, rec);
 
        if (rjs_compiler_playchildrecords(co, records, rec) < 0)
@@ -908,9 +934,13 @@ rint rjs_compiler_rh_ifconditionop(rjs_compiler_t *co, rarray_t *records, rlong
        rparecord_t *prec;
        rjs_coctx_ifstatement_t *ctx = (rjs_coctx_ifstatement_t *)rjs_compiler_getctx(co, RJS_COCTX_IFSTATEMENT);
 
-       R_ASSERT(ctx);
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
+       if (!ctx) {
+               rjs_compiler_adderror(co, RJS_ERROR_NOTAIFSTATEMENT, prec->input, prec->inputsiz);
+               return 0;
+       }
+       R_ASSERT(ctx);
        rjs_compiler_debugtail(co, records, rec);
        if (rjs_compiler_playchildrecords(co, records, rec) < 0)
                return -1;
@@ -928,9 +958,13 @@ rint rjs_compiler_rh_iftruestatement(rjs_compiler_t *co, rarray_t *records, rlon
        rparecord_t *prec;
        rjs_coctx_ifstatement_t *ctx = (rjs_coctx_ifstatement_t *)rjs_compiler_getctx(co, RJS_COCTX_IFSTATEMENT);
 
-       R_ASSERT(ctx);
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
+       if (!ctx) {
+               rjs_compiler_adderror(co, RJS_ERROR_NOTAIFSTATEMENT, prec->input, prec->inputsiz);
+               return 0;
+       }
+       R_ASSERT(ctx);
        rjs_compiler_debugtail(co, records, rec);
 
        if (rjs_compiler_playchildrecords(co, records, rec) < 0)
@@ -950,9 +984,13 @@ rint rjs_compiler_rh_iffalsestatement(rjs_compiler_t *co, rarray_t *records, rlo
        rparecord_t *prec;
        rjs_coctx_ifstatement_t *ctx = (rjs_coctx_ifstatement_t *)rjs_compiler_getctx(co, RJS_COCTX_IFSTATEMENT);
 
-       R_ASSERT(ctx);
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
+       if (!ctx) {
+               rjs_compiler_adderror(co, RJS_ERROR_NOTAIFSTATEMENT, prec->input, prec->inputsiz);
+               return 0;
+       }
+       R_ASSERT(ctx);
        rvm_codegen_redefinelabel(co->cg, ctx->falseidx);
        rjs_compiler_debugtail(co, records, rec);
 
@@ -1127,9 +1165,13 @@ rint rjs_compiler_rh_dowhileexpressioncompare(rjs_compiler_t *co, rarray_t *reco
        rparecord_t *prec;
        rjs_coctx_iteration_t *ctx = (rjs_coctx_iteration_t *)rjs_compiler_getctx(co, RJS_COCTX_ITERATION);
 
-       R_ASSERT(ctx);
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
+       if (!ctx) {
+               rjs_compiler_adderror(co, RJS_ERROR_NOTALOOP, prec->input, prec->inputsiz);
+               return 0;
+       }
+       R_ASSERT(ctx);
        rvm_codegen_redefinelabel(co->cg, ctx->continueidx);
        rjs_compiler_debugtail(co, records, rec);
 
@@ -1150,9 +1192,13 @@ rint rjs_compiler_rh_forexpressioncompare(rjs_compiler_t *co, rarray_t *records,
        rparecord_t *prec;
        rjs_coctx_iteration_t *ctx = (rjs_coctx_iteration_t *)rjs_compiler_getctx(co, RJS_COCTX_ITERATION);
 
-       R_ASSERT(ctx);
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
+       if (!ctx) {
+               rjs_compiler_adderror(co, RJS_ERROR_NOTALOOP, prec->input, prec->inputsiz);
+               return 0;
+       }
+       R_ASSERT(ctx);
        rjs_compiler_debugtail(co, records, rec);
 
        if (rjs_compiler_playchildrecords(co, records, rec) < 0)
@@ -1172,9 +1218,13 @@ rint rjs_compiler_rh_forexpressionincrement(rjs_compiler_t *co, rarray_t *record
        rparecord_t *prec;
        rjs_coctx_iteration_t *ctx = (rjs_coctx_iteration_t *)rjs_compiler_getctx(co, RJS_COCTX_ITERATION);
 
-       R_ASSERT(ctx);
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
+       if (!ctx) {
+               rjs_compiler_adderror(co, RJS_ERROR_NOTALOOP, prec->input, prec->inputsiz);
+               return 0;
+       }
+       R_ASSERT(ctx);
        rjs_compiler_debugtail(co, records, rec);
 
        if (rjs_compiler_playchildrecords(co, records, rec) < 0)
@@ -1379,13 +1429,15 @@ rint rjs_compiler_rh_continue(rjs_compiler_t *co, rarray_t *records, rlong rec)
        rjs_coctx_t *ctx;
        rjs_coctx_iteration_t *iterctx;
 
-
        ctx = rjs_compiler_getctx(co, RJS_COCTX_ITERATION);
-       R_ASSERT(ctx);
-       iterctx = (rjs_coctx_iteration_t *)ctx;
-
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
+       if (!ctx) {
+               rjs_compiler_adderror(co, RJS_ERROR_NOTALOOP, prec->input, prec->inputsiz);
+               return 0;
+       }
+       R_ASSERT(ctx);
+       iterctx = (rjs_coctx_iteration_t *)ctx;
        rjs_compiler_debugtail(co, records, rec);
 
        if (rjs_compiler_playchildrecords(co, records, rec) < 0)
@@ -1408,11 +1460,14 @@ rint rjs_compiler_rh_break(rjs_compiler_t *co, rarray_t *records, rlong rec)
 
 
        ctx = rjs_compiler_getctx(co, RJS_COCTX_ITERATION);
-       R_ASSERT(ctx);
-       iterctx = (rjs_coctx_iteration_t *)ctx;
-
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
+       if (!ctx) {
+               rjs_compiler_adderror(co, RJS_ERROR_NOTALOOP, prec->input, prec->inputsiz);
+               return 0;
+       }
+       R_ASSERT(ctx);
+       iterctx = (rjs_coctx_iteration_t *)ctx;
        rjs_compiler_debugtail(co, records, rec);
 
        if (rjs_compiler_playchildrecords(co, records, rec) < 0)
@@ -1429,9 +1484,6 @@ rint rjs_compiler_rh_break(rjs_compiler_t *co, rarray_t *records, rlong rec)
 
 rint rjs_compiler_rh_syntaxerror(rjs_compiler_t *co, rarray_t *records, rlong rec)
 {
-       rjs_coerror_t error;
-
-       r_memset(&error, 0, sizeof(error));
        rparecord_t *prec;
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
@@ -1443,10 +1495,7 @@ rint rjs_compiler_rh_syntaxerror(rjs_compiler_t *co, rarray_t *records, rlong re
        rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
-       error.code = RJS_ERROR_SYNTAX;
-       error.script = prec->input;
-       error.scriptsize = prec->inputsiz;
-       r_array_add(co->errors, &error);
+       rjs_compiler_adderror(co, RJS_ERROR_SYNTAX, prec->input, prec->inputsiz);
        rjs_compiler_debugtail(co, records, rec);
        return 0;
 }
index 11ed985..fdf9f0d 100644 (file)
@@ -27,7 +27,10 @@ extern "C" {
 #define RJS_ERROR_NONE 0
 #define RJS_ERROR_UNDEFINED 1
 #define RJS_ERROR_SYNTAX 2
-
+#define RJS_ERROR_NOTAFUNCTION 3
+#define RJS_ERROR_NOTAFUNCTIONCALL 4
+#define RJS_ERROR_NOTALOOP 5
+#define RJS_ERROR_NOTAIFSTATEMENT 6
 
 typedef struct rjs_coctx_s {
        rulong type;
@@ -36,7 +39,6 @@ typedef struct rjs_coctx_s {
 
 typedef struct rjs_coctx_global_s {
        rjs_coctx_t base;
-       rsize_t allocs;
 } rjs_coctx_global_t;
 
 
index ffdecf0..58141bf 100644 (file)
@@ -19,6 +19,26 @@ static int compileonly = 0;
 static int debugcompileonly = 0;
 
 
+static rchar *errormsg[] = {
+       "OK",
+       "Undefined identifier",
+       "Syntax error",
+       "Not a function",
+       "Not a function call",
+       "Not a loop",
+       "Not a if statement",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+       "Unknown",
+};
+
 void rjs_unmap_file(rstr_t *buf)
 {
        if (buf) {
@@ -90,6 +110,20 @@ int rjs_exec_script(rjs_engine_t *jse, rstr_t  *script)
 }
 
 
+rlong jrs_offset2line(const rchar *script, rlong offset)
+{
+       rlong line = 0;
+       const rchar *ptr;
+
+       for (line = 1, ptr = script + offset; ptr >= script; --ptr) {
+               if (*ptr == '\n')
+                       line += 1;
+       }
+
+       return line;
+}
+
+
 void rjs_display_errors(rjs_engine_t *jse, rstr_t *script)
 {
        rlong line = 0;
@@ -98,15 +132,9 @@ void rjs_display_errors(rjs_engine_t *jse, rstr_t *script)
 
        for (i = 0; i < r_array_length(jse->co->errors); i++) {
                err = (rjs_coerror_t *)r_array_slot(jse->co->errors, i);
-               fprintf(stdout, "Line: %ld ", (rlong)line);
-               if (err->code == RJS_ERROR_SYNTAX) {
-                       fprintf(stdout, "Sytax Error");
-               } else if (err->code == RJS_ERROR_UNDEFINED) {
-                       fprintf(stdout, "Undefined Identifier");
-               } else {
-                       fprintf(stdout, "Error");
-               }
-               fprintf(stdout, "(%ld, %ld): ", (rlong)(err->script - script->str), (rlong)err->scriptsize);
+               line = jrs_offset2line(script->str, (rlong)(err->script - script->str));
+               fprintf(stdout, "Line: %ld (%ld, %ld), Error Code: %ld, ", (rlong)line, (rlong)(err->script - script->str), (rlong)err->scriptsize, err->code);
+               fprintf(stdout, "%s: ", errormsg[err->code]);
                fwrite(err->script, sizeof(rchar), err->scriptsize, stdout);
                fprintf(stdout, "\n");
        }
@@ -118,8 +146,9 @@ int main(int argc, char *argv[])
        rint i;
        rstr_t *script = NULL, *unmapscript = NULL;
        rstr_t line;
-       rjs_engine_t *jse = rjs_engine_create();
+       rjs_engine_t *jse;
 
+       jse = rjs_engine_create();
        for (i = 1; i < argc; i++) {
                if (r_strcmp(argv[i], "-L") == 0) {
 
@@ -137,7 +166,6 @@ int main(int argc, char *argv[])
                }
        }
 
-
        for (i = 1; i < argc; i++) {
                if (r_strcmp(argv[i], "-e") == 0) {
                        if (++i < argc) {