RPA Toolkit
reverted back to the original function declaration implementation
authorMartin Stoilov <martin@rpasearch.com>
Sun, 15 May 2011 05:53:54 +0000 (22:53 -0700)
committerMartin Stoilov <martin@rpasearch.com>
Sun, 15 May 2011 05:53:54 +0000 (22:53 -0700)
rjs/ecma262.rpa
rjs/rjscompiler.c
rjs/rjscompiler.h
rjs/rjsuids.h

index 84a2dbe..07317fb 100644 (file)
@@ -88,7 +88,6 @@
 #!emitid WhileExpressionCompare                        UID_WHILEEXPRESSIONCOMPARE                      58
 #!emitid DoWhileExpressionCompare              UID_DOWHILEEXPRESSIONCOMPARE            59
 #!emitid Program                                               UID_PROGRAM                                             60
-#!emitid FunctionNameAlloc                             UID_FUNCTIONNAMEALLOC                           61
 
 
 # 6 Source Text
@@ -428,9 +427,8 @@ DefaultClauseOp                                             ::= <DefaultKeywordOp> <S>? ':' <S>? <StatementList>?
 
 # 13 Function Definition
 FunctionName                                           ::= <IdentifierNoEmit>
-FunctionNameAlloc                                      ::= <IdentifierNoEmit>
-FunctionDeclaration                                    ::= ('function'-'function'<IdentifierPart>)<S>?<FunctionNameAlloc><S>?'('<S>?<FormalParameterList>?<S>?')'<S>?'{'<S>?<FunctionBody>?<S>?'}'
-FunctionExpression                                     ::= ('function'-'function'<IdentifierPart>)<S>?<FunctionNameAlloc>?<S>?'('<S>?<FormalParameterList>?<S>?')'<S>?'{'<S>?<FunctionBody>?<S>?'}'
+FunctionDeclaration                                    ::= ('function'-'function'<IdentifierPart>)<S>?<FunctionName><S>?'('<S>?<FormalParameterList>?<S>?')'<S>?'{'<S>?<FunctionBody>?<S>?'}'
+FunctionExpression                                     ::= ('function'-'function'<IdentifierPart>)<S>?<FunctionName>?<S>?'('<S>?<FormalParameterList>?<S>?')'<S>?'{'<S>?<FunctionBody>?<S>?'}'
 FormalParameterList                            ::= <FunctionParameter> ( <S>? ',' <S>? <FunctionParameter> )*
 FunctionParameter                                      ::= <IdentifierNoEmit>
 FunctionBody                                           ::= <SourceElements>
index 6d863cf..eefac20 100644 (file)
@@ -101,6 +101,12 @@ 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 *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);
@@ -264,7 +270,7 @@ rint rjs_compiler_rh_program(rjs_compiler_t *co, rarray_t *records, rlong rec)
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_redefinelabel(co->cg, mainidx);
+       rvm_codegen_redefinelabel_default(co->cg, mainidx);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BL, DA, XX, XX, start - rvm_codegen_getcodesize(co->cg)));
        rvm_codegen_addins(co->cg, rvm_asm(RVM_EXT, XX, XX, XX, 0));
        rjs_compiler_debugtail(co, records, rec);
@@ -355,19 +361,10 @@ rint rjs_compiler_rh_identifier(rjs_compiler_t *co, rarray_t *records, rlong rec
        rjs_compiler_debughead(co, records, rec);
        v = rvm_scope_lookup(co->scope, prec->input, prec->inputsiz);
        if (!v) {
-               if (rvm_codemap_lookup(co->cg->codemap, prec->input, prec->inputsiz) >= 0) {
-                       /*
-                        * First let see if this is a function
-                        */
-
-                       rvm_codegen_addrelocins(co->cg, RVM_RELOC_JUMP, prec->input, prec->inputsiz, rvm_asmp(RVM_MOV, R0, DA, XX, 0));
-                       rvm_codegen_addins(co->cg, rvm_asm(RVM_SETTYPE, R0, DA, XX, RVM_DTYPE_FUNCTION));
-                       goto end;
-               } else if ((swiid = rvm_cpu_swilookup(co->cpu, NULL, prec->input, prec->inputsiz)) >= 0) {
-                       /*
-                        * Let see if this is a swiid
-                        */
-
+               /*
+                * Let see if this is a swiid
+                */
+               if ((swiid = rvm_cpu_swilookup(co->cpu, NULL, prec->input, prec->inputsiz)) >= 0) {
                        rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R0, DA, XX, swiid));
                        rvm_codegen_addins(co->cg, rvm_asm(RVM_SETTYPE, R0, DA, XX, RVM_DTYPE_SWIID));
                        goto end;
@@ -682,50 +679,35 @@ rint rjs_compiler_rh_memberexpressionindexop(rjs_compiler_t *co, rarray_t *recor
 }
 
 
-rint rjs_compiler_rh_functionnamealloc(rjs_compiler_t *co, rarray_t *records, rlong rec)
-{
-       rparecord_t *prec = (rparecord_t *)r_array_slot(records, rec);
-       rjs_coctx_function_t *ctx = (rjs_coctx_function_t*)rjs_compiler_gettopctx(co);
-
-       if (ctx->base.type != RJS_COCTX_FUNCTION) {
-               rjs_compiler_adderror(co, RJS_ERROR_NOTAFUNCTION, prec->input, prec->inputsiz);
-               return 0;
-       }
-       R_ASSERT(ctx);
-
-       rjs_compiler_debughead(co, records, rec);
-       rvm_codegen_addlabel(co->cg, prec->input, prec->inputsiz);
-       rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_DEFAULT, ctx->allocsidx, rvm_asm(RVM_ADD, SP, FP, DA, 0));
-       rjs_compiler_debugtail(co, records, rec);
-
-       if (rjs_compiler_playchildrecords(co, records, rec) < 0)
-               return -1;
-
-       rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
-       prec = (rparecord_t *)r_array_slot(records, rec);
-       rjs_compiler_debughead(co, records, rec);
-       rjs_compiler_debugtail(co, records, rec);
-       return 0;
-}
-
-
 rint rjs_compiler_rh_functiondeclaration(rjs_compiler_t *co, rarray_t *records, rlong rec)
 {
        rjs_coctx_function_t ctx;
        rparecord_t *prec;
+       rlong start, execidx, endidx, allocsidx;
 
        r_memset(&ctx, 0, sizeof(ctx));
        ctx.base.type = RJS_COCTX_FUNCTION;
 
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
-       ctx.start = rvm_codegen_getcodesize(co->cg);
-       ctx.endidx = rvm_codegen_invalid_add_numlabel_s(co->cg, "__funend", ctx.start);
-       ctx.execidx = rvm_codegen_invalid_add_numlabel_s(co->cg, "__funexec", ctx.start);
-       ctx.allocsidx = rvm_codegen_invalid_add_numlabel_s(co->cg, "__allocs", ctx.start);
+       start = rvm_codegen_getcodesize(co->cg);
+       endidx = rvm_codegen_invalid_add_numlabel_s(co->cg, "__funend", start);
+       execidx = rvm_codegen_invalid_add_numlabel_s(co->cg, "__funexec", start);
+       allocsidx = rvm_codegen_invalid_add_numlabel_s(co->cg, "__allocs", start);
 
-       rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, ctx.endidx, rvm_asm(RVM_B, DA, XX, XX, 0));
-       rvm_codegen_redefinelabel(co->cg, ctx.execidx);
+       if (rpa_record_getruleuid(records, rpa_recordtree_firstchild(records, rec, RPA_RECORD_START)) == UID_FUNCTIONNAME) {
+               if (rjs_compiler_record2identifer(co, records, rpa_recordtree_firstchild(records, rec, RPA_RECORD_START)) < 0)
+                       goto error;
+               rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R1, R0, XX, 0));
+       }
+       rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_JUMP, execidx, rvm_asm(RVM_MOV, R0, DA, XX, 0));
+       rvm_codegen_addins(co->cg, rvm_asm(RVM_SETTYPE, R0, DA, XX, RVM_DTYPE_FUNCTION));
+       if (rpa_record_getruleuid(records, rpa_recordtree_firstchild(records, rec, RPA_RECORD_START)) == UID_FUNCTIONNAME) {
+               rvm_codegen_addins(co->cg, rvm_asm(RVM_STRR, R0, R1, XX, 0));
+       }
+       rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, endidx, rvm_asm(RVM_B, DA, XX, XX, 0));
+       rvm_codegen_redefinelabel_default(co->cg, execidx);
+       rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_DEFAULT, allocsidx, rvm_asm(RVM_ADD, SP, FP, DA, 0));
 
        rjs_compiler_debugtail(co, records, rec);
 
@@ -739,9 +721,9 @@ rint rjs_compiler_rh_functiondeclaration(rjs_compiler_t *co, rarray_t *records,
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_BX, LR, XX, XX, 0));
-       rvm_codegen_redefinelabel(co->cg, ctx.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, endidx);
        rvm_codegen_addins(co->cg, rvm_asm(RVM_NOP, XX, XX, XX, 0xffffffff));
-       rvm_codegen_redefinepointer(co->cg, ctx.allocsidx, (rpointer)ctx.allocs);
+       rvm_codegen_redefinepointer(co->cg, allocsidx, (rpointer)ctx.allocs);
        rjs_compiler_debugtail(co, records, rec);
 
        rvm_scope_pop(co->scope);
@@ -935,9 +917,9 @@ rint rjs_compiler_rh_ifstatement(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);
-       rvm_codegen_redefinelabel(co->cg, ctx.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, ctx.endidx);
        if (!rvm_codegen_validlabel(co->cg, ctx.falseidx))
-               rvm_codegen_redefinelabel(co->cg, ctx.falseidx);
+               rvm_codegen_redefinelabel_default(co->cg, ctx.falseidx);
        rjs_compiler_debugtail(co, records, rec);
 
        r_array_removelast(co->coctx);
@@ -1011,7 +993,7 @@ rint rjs_compiler_rh_iffalsestatement(rjs_compiler_t *co, rarray_t *records, rlo
                return 0;
        }
        R_ASSERT(ctx);
-       rvm_codegen_redefinelabel(co->cg, ctx->falseidx);
+       rvm_codegen_redefinelabel_default(co->cg, ctx->falseidx);
        rjs_compiler_debugtail(co, records, rec);
 
        if (rjs_compiler_playchildrecords(co, records, rec) < 0)
@@ -1052,7 +1034,7 @@ rint rjs_compiler_rh_iterationfor(rjs_compiler_t *co, rarray_t *records, rlong r
                }
        }
 
-       rvm_codegen_redefinelabel(co->cg, ctx.iterationidx);
+       rvm_codegen_redefinelabel_default(co->cg, ctx.iterationidx);
        for (childrec = rpa_recordtree_firstchild(records, rec, RPA_RECORD_START); childrec >= 0; childrec = rpa_recordtree_next(records, childrec, RPA_RECORD_START)) {
                if (rpa_record_getruleuid(records, childrec) == UID_FOREXPRESSIONCOMPARE) {
                        if (rjs_compiler_playrecord(co, records, childrec) < 0)
@@ -1069,7 +1051,7 @@ rint rjs_compiler_rh_iterationfor(rjs_compiler_t *co, rarray_t *records, rlong r
                }
        }
 
-       rvm_codegen_redefinelabel(co->cg, ctx.continueidx);
+       rvm_codegen_redefinelabel_default(co->cg, ctx.continueidx);
        for (childrec = rpa_recordtree_firstchild(records, rec, RPA_RECORD_START); childrec >= 0; childrec = rpa_recordtree_next(records, childrec, RPA_RECORD_START)) {
                if (rpa_record_getruleuid(records, childrec) == UID_FOREXPRESSIONINCREMENT) {
                        if (rjs_compiler_playrecord(co, records, childrec) < 0)
@@ -1081,7 +1063,7 @@ rint rjs_compiler_rh_iterationfor(rjs_compiler_t *co, rarray_t *records, rlong r
        rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
-       rvm_codegen_redefinelabel(co->cg, ctx.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, ctx.endidx);
        rjs_compiler_debugtail(co, records, rec);
 
        rvm_scope_pop(co->scope);
@@ -1114,8 +1096,8 @@ rint rjs_compiler_rh_iterationwhile(rjs_compiler_t *co, rarray_t *records, rlong
        rjs_compiler_debugtail(co, records, rec);
 
 
-       rvm_codegen_redefinelabel(co->cg, ctx.iterationidx);
-       rvm_codegen_redefinelabel(co->cg, ctx.continueidx);
+       rvm_codegen_redefinelabel_default(co->cg, ctx.iterationidx);
+       rvm_codegen_redefinelabel_default(co->cg, ctx.continueidx);
 
        if (rjs_compiler_playchildrecords(co, records, rec) < 0)
                goto error;
@@ -1124,7 +1106,7 @@ rint rjs_compiler_rh_iterationwhile(rjs_compiler_t *co, rarray_t *records, rlong
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, ctx.iterationidx, rvm_asm(RVM_B, DA, XX, XX, 0));
-       rvm_codegen_redefinelabel(co->cg, ctx.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, ctx.endidx);
        rjs_compiler_debugtail(co, records, rec);
 
        rvm_scope_pop(co->scope);
@@ -1157,7 +1139,7 @@ rint rjs_compiler_rh_iterationdo(rjs_compiler_t *co, rarray_t *records, rlong re
        rjs_compiler_debugtail(co, records, rec);
 
 
-       rvm_codegen_redefinelabel(co->cg, ctx.iterationidx);
+       rvm_codegen_redefinelabel_default(co->cg, ctx.iterationidx);
 
        if (rjs_compiler_playchildrecords(co, records, rec) < 0)
                goto error;
@@ -1166,7 +1148,7 @@ rint rjs_compiler_rh_iterationdo(rjs_compiler_t *co, rarray_t *records, rlong re
        prec = (rparecord_t *)r_array_slot(records, rec);
        rjs_compiler_debughead(co, records, rec);
        rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, ctx.iterationidx, rvm_asm(RVM_B, DA, XX, XX, 0));
-       rvm_codegen_redefinelabel(co->cg, ctx.endidx);
+       rvm_codegen_redefinelabel_default(co->cg, ctx.endidx);
        rjs_compiler_debugtail(co, records, rec);
 
        rvm_scope_pop(co->scope);
@@ -1192,7 +1174,7 @@ rint rjs_compiler_rh_dowhileexpressioncompare(rjs_compiler_t *co, rarray_t *reco
                return 0;
        }
        R_ASSERT(ctx);
-       rvm_codegen_redefinelabel(co->cg, ctx->continueidx);
+       rvm_codegen_redefinelabel_default(co->cg, ctx->continueidx);
        rjs_compiler_debugtail(co, records, rec);
 
        if (rjs_compiler_playchildrecords(co, records, rec) < 0)
@@ -1576,7 +1558,6 @@ rjs_compiler_t *rjs_compiler_create(rvmcpu_t *cpu)
        co->handlers[UID_NEWARRAYEXPRESSION] = rjs_compiler_rh_newarrayexpression;
        co->handlers[UID_MEMBEREXPRESSIONDOTOP] = rjs_compiler_rh_memberexpressiondotop;
        co->handlers[UID_MEMBEREXPRESSIONINDEXOP] = rjs_compiler_rh_memberexpressionindexop;
-       co->handlers[UID_FUNCTIONNAMEALLOC] = rjs_compiler_rh_functionnamealloc;
        co->handlers[UID_FUNCTIONDECLARATION] = rjs_compiler_rh_functiondeclaration;
        co->handlers[UID_FUNCTIONEXPRESSION] = rjs_compiler_rh_functiondeclaration;
        co->handlers[UID_FUNCTIONPARAMETER] = rjs_compiler_rh_functionparameter;
index 9a3a1e7..2dcf0ad 100644 (file)
@@ -48,6 +48,7 @@ typedef struct rjs_coctx_function_s {
        rlong execidx;
        rlong endidx;
        rlong allocsidx;
+       rlong execoff;
        rsize_t allocs;
 } rjs_coctx_function_t;
 
index a616fb5..b4079a4 100644 (file)
@@ -75,4 +75,3 @@
 #define UID_WHILEEXPRESSIONCOMPARE 58
 #define UID_DOWHILEEXPRESSIONCOMPARE 59
 #define UID_PROGRAM 60
-#define UID_FUNCTIONNAMEALLOC 61