2 #include "rjscompiler.h"
4 rint rjs_compiler_playreversechildrecords(rjs_compiler_t *co, rarray_t *records, rlong rec);
5 static rint rjs_compiler_playrecord(rjs_compiler_t *co, rarray_t *records, rlong rec);
6 static rint rjs_compiler_playchildrecords(rjs_compiler_t *co, rarray_t *records, rlong rec);
9 void rjs_compiler_debughead(rjs_compiler_t *co, rarray_t *records, rlong rec)
12 rpa_record_dump(records, rec);
13 co->headoff = rvm_codegen_getcodesize(co->cg);
18 void rjs_compiler_debugtail(rjs_compiler_t *co, rarray_t *records, rlong rec)
21 rvm_asm_dump(rvm_codegen_getcode(co->cg, co->headoff), rvm_codegen_getcodesize(co->cg) - co->headoff);
27 static const rchar *rjs_compiler_record2str(rjs_compiler_t *co, rarray_t *records, rlong rec)
29 rparecord_t *prec = (rparecord_t *)r_array_slot(records, rpa_recordtree_get(records, rec, RPA_RECORD_END));
30 rsize_t size = 16; /* Min size */
32 if (prec && prec->inputsiz) {
33 size = prec->inputsiz + 1;
35 co->temp = r_realloc(co->temp, size);
36 r_memset(co->temp, 0, size);
37 if (prec->input && prec->inputsiz)
38 r_memcpy(co->temp, prec->input, prec->inputsiz);
43 rlong rjs_compiler_record2opcode(rparecord_t *prec)
45 const rchar *input = prec->input;
46 rsize_t size = prec->inputsiz;
48 if (r_stringncmp("++", input, size))
50 else if (r_stringncmp("+", input, size))
52 else if (r_stringncmp("+=", input, size))
54 else if (r_stringncmp("--", input, size))
56 else if (r_stringncmp("-", input, size))
58 else if (r_stringncmp("-=", input, size))
60 else if (r_stringncmp("*", input, size))
62 else if (r_stringncmp("*=", input, size))
64 else if (r_stringncmp("/", input, size))
66 else if (r_stringncmp("/=", input, size))
68 else if (r_stringncmp("%", input, size))
70 else if (r_stringncmp("%=", input, size))
72 else if (r_stringncmp("&&", input, size))
74 else if (r_stringncmp("||", input, size))
76 else if (r_stringncmp("&", input, size))
78 else if (r_stringncmp("&=", input, size))
80 else if (r_stringncmp("|", input, size))
82 else if (r_stringncmp("|=", input, size))
84 else if (r_stringncmp("^", input, size))
86 else if (r_stringncmp("^=", input, size))
88 else if (r_stringncmp(">>", input, size))
90 else if (r_stringncmp(">>=", input, size))
92 else if (r_stringncmp("<<", input, size))
94 else if (r_stringncmp("<<=", input, size))
96 else if (r_stringncmp(">>>", input, size))
98 else if (r_stringncmp(">>>=", input, size))
100 else if (r_stringncmp("<=", input, size))
102 else if (r_stringncmp(">=", input, size))
104 else if (r_stringncmp("<", input, size))
106 else if (r_stringncmp(">", input, size))
108 else if (r_stringncmp("===", input, size))
110 else if (r_stringncmp("==", input, size))
112 else if (r_stringncmp("!==", input, size))
114 else if (r_stringncmp("!=", input, size))
116 else if (r_stringncmp("!", input, size))
118 else if (r_stringncmp("~", input, size))
120 else if (r_stringncmp("=", input, size))
127 rint rjs_compiler_rh_program(rjs_compiler_t *co, rarray_t *records, rlong rec)
129 rjs_coctx_global_t ctx;
132 r_memset(&ctx, 0, sizeof(ctx));
133 ctx.base.type = RJS_COCTX_GLOBAL;
134 r_array_push(co->coctx, &ctx, rjs_coctx_t*);
136 prec = (rparecord_t *)r_array_slot(records, rec);
137 rjs_compiler_debughead(co, records, rec);
138 rvm_codegen_addins(co->cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
139 rjs_compiler_debugtail(co, records, rec);
141 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
144 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
145 prec = (rparecord_t *)r_array_slot(records, rec);
146 rjs_compiler_debughead(co, records, rec);
147 rvm_codegen_addins(co->cg, rvm_asm(RVM_PRN, R0, XX, XX, 0));
148 rvm_codegen_addins(co->cg, rvm_asm(RVM_EXT, XX, XX, XX, 0));
149 rjs_compiler_debugtail(co, records, rec);
150 r_array_removelast(co->coctx);
154 r_array_removelast(co->coctx);
159 rint rjs_compiler_rh_varalloc(rjs_compiler_t *co, rarray_t *records, rlong rec)
162 rjs_coctx_t *ctx = NULL;
163 rvm_varmap_t *v = NULL;
166 R_ASSERT(r_array_length(co->coctx));
169 * First lets find out if we are within a function definition or
170 * this is a global variable.
172 for (i = r_array_length(co->coctx) - 1; i >= 0; i--) {
173 ctx = r_array_index(co->coctx, i, rjs_coctx_t*);
174 if (ctx->type == RJS_COCTX_FUNCTION || ctx->type == RJS_COCTX_GLOBAL)
179 prec = (rparecord_t *)r_array_slot(records, rec);
180 rjs_compiler_debughead(co, records, rec);
181 rjs_compiler_debugtail(co, records, rec);
183 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
186 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
187 prec = (rparecord_t *)r_array_slot(records, rec);
188 rjs_compiler_debughead(co, records, rec);
189 v = rvm_scope_tiplookup(co->scope, prec->input, prec->inputsiz);
192 * TBD: Temporary here
195 r_printf("ERROR: variable already defined: %s\n", rjs_compiler_record2str(co, records, rec));
199 if (ctx->type == RJS_COCTX_FUNCTION) {
200 rjs_coctx_function_t *functx = (rjs_coctx_function_t *)ctx;
202 rvm_scope_addoffset(co->scope, prec->input, prec->inputsiz, functx->allocs);
204 rjs_coctx_global_t *functx = (rjs_coctx_global_t *)ctx;
206 r_carray_setlength(co->cpu->data, functx->allocs + 1);
207 rvm_scope_addpointer(co->scope, prec->input, prec->inputsiz, r_carray_slot(co->cpu->data, functx->allocs));
209 v = rvm_scope_tiplookup(co->scope, prec->input, prec->inputsiz);
210 if (v->datatype == VARMAP_DATATYPE_OFFSET) {
211 rvm_codegen_addins(co->cg, rvm_asm(RVM_ADDRS, R1, FP, DA, v->data.offset));
213 rvm_codegen_addins(co->cg, rvm_asmp(RVM_MOV, R1, DA, XX, v->data.ptr));
215 rvm_codegen_addins(co->cg, rvm_asm(RVM_CLRR, R1, XX, XX, 0));
217 rjs_compiler_debugtail(co, records, rec);
225 rint rjs_compiler_rh_varallocinit(rjs_compiler_t *co, rarray_t *records, rlong rec)
228 rjs_coctx_t *ctx = NULL;
229 rvm_varmap_t *v = NULL;
232 R_ASSERT(r_array_length(co->coctx));
235 * First lets find out if we are within a function definition or
236 * this is a global variable.
238 for (i = r_array_length(co->coctx) - 1; i >= 0; i--) {
239 ctx = r_array_index(co->coctx, i, rjs_coctx_t*);
240 if (ctx->type == RJS_COCTX_FUNCTION || ctx->type == RJS_COCTX_GLOBAL)
245 prec = (rparecord_t *)r_array_slot(records, rec);
246 rjs_compiler_debughead(co, records, rec);
247 rjs_compiler_debugtail(co, records, rec);
249 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
252 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
253 prec = (rparecord_t *)r_array_slot(records, rec);
254 rjs_compiler_debughead(co, records, rec);
255 v = rvm_scope_tiplookup(co->scope, prec->input, prec->inputsiz);
258 * TBD: Temporary here
261 r_printf("ERROR: variable already defined: %s\n", rjs_compiler_record2str(co, records, rec));
265 if (ctx->type == RJS_COCTX_FUNCTION) {
266 rjs_coctx_function_t *functx = (rjs_coctx_function_t *)ctx;
268 rvm_scope_addoffset(co->scope, prec->input, prec->inputsiz, functx->allocs);
270 rjs_coctx_global_t *functx = (rjs_coctx_global_t *)ctx;
272 r_carray_setlength(co->cpu->data, functx->allocs + 1);
273 rvm_scope_addpointer(co->scope, prec->input, prec->inputsiz, r_carray_slot(co->cpu->data, functx->allocs));
275 v = rvm_scope_tiplookup(co->scope, prec->input, prec->inputsiz);
276 if (v->datatype == VARMAP_DATATYPE_OFFSET) {
277 rvm_codegen_addins(co->cg, rvm_asm(RVM_ADDRS, R0, FP, DA, v->data.offset));
279 rvm_codegen_addins(co->cg, rvm_asmp(RVM_MOV, R0, DA, XX, v->data.ptr));
281 rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSH, R0, XX, XX, 0));
282 rjs_compiler_debugtail(co, records, rec);
290 rint rjs_compiler_rh_initializer(rjs_compiler_t *co, rarray_t *records, rlong rec)
293 prec = (rparecord_t *)r_array_slot(records, rec);
294 rjs_compiler_debughead(co, records, rec);
295 rjs_compiler_debugtail(co, records, rec);
297 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
300 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
301 prec = (rparecord_t *)r_array_slot(records, rec);
302 rjs_compiler_debughead(co, records, rec);
303 rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R1, XX, XX, 0));
304 rvm_codegen_addins(co->cg, rvm_asm(RVM_STRR, R0, R1, XX, 0));
305 rjs_compiler_debugtail(co, records, rec);
310 rint rjs_compiler_rh_identifier(rjs_compiler_t *co, rarray_t *records, rlong rec)
314 rparecord_t *prec, *pparrec;
315 prec = (rparecord_t *)r_array_slot(records, rec);
316 rjs_compiler_debughead(co, records, rec);
317 rjs_compiler_debugtail(co, records, rec);
319 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
322 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
323 prec = (rparecord_t *)r_array_slot(records, rec);
324 rjs_compiler_debughead(co, records, rec);
325 v = rvm_scope_lookup(co->scope, prec->input, prec->inputsiz);
327 r_printf("ERROR: Undefined identifier: %s\n", rjs_compiler_record2str(co, records, rec));
331 if ((parrec = rpa_recordtree_parent(records, rec, RPA_RECORD_END)) < 0) {
335 pparrec = (rparecord_t *)r_array_slot(records, parrec);
336 if (rpa_recordtree_next(records, rec, RPA_RECORD_START) < 0 && pparrec->ruleuid == UID_LEFTHANDSIDEEXPRESSIONADDR) {
338 * If this is the last child of UID_LEFTHANDSIDEEXPRESSIONADDR
340 if (v->datatype == VARMAP_DATATYPE_OFFSET) {
341 rvm_codegen_addins(co->cg, rvm_asm(RVM_ADDRS, R0, FP, DA, v->data.offset));
343 rvm_codegen_addins(co->cg, rvm_asmp(RVM_MOV, R0, DA, XX, v->data.ptr));
346 if (v->datatype == VARMAP_DATATYPE_OFFSET) {
347 rvm_codegen_addins(co->cg, rvm_asm(RVM_LDS, R0, FP, DA, v->data.offset));
349 rvm_codegen_addins(co->cg, rvm_asmp(RVM_LDRR, R0, DA, XX, v->data.ptr));
353 rjs_compiler_debugtail(co, records, rec);
358 rint rjs_compiler_rh_expression(rjs_compiler_t *co, rarray_t *records, rlong rec)
361 prec = (rparecord_t *)r_array_slot(records, rec);
362 rjs_compiler_debughead(co, records, rec);
363 rjs_compiler_debugtail(co, records, rec);
365 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
368 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
369 prec = (rparecord_t *)r_array_slot(records, rec);
370 rjs_compiler_debughead(co, records, rec);
371 rjs_compiler_debugtail(co, records, rec);
376 rint rjs_compiler_rh_lefthandsideexpression(rjs_compiler_t *co, rarray_t *records, rlong rec)
379 prec = (rparecord_t *)r_array_slot(records, rec);
380 rjs_compiler_debughead(co, records, rec);
381 rjs_compiler_debugtail(co, records, rec);
383 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
386 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
387 prec = (rparecord_t *)r_array_slot(records, rec);
388 rjs_compiler_debughead(co, records, rec);
389 rjs_compiler_debugtail(co, records, rec);
394 rint rjs_compiler_rh_lefthandsideexpressionaddr(rjs_compiler_t *co, rarray_t *records, rlong rec)
397 prec = (rparecord_t *)r_array_slot(records, rec);
398 rjs_compiler_debughead(co, records, rec);
399 rjs_compiler_debugtail(co, records, rec);
401 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
404 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
405 prec = (rparecord_t *)r_array_slot(records, rec);
406 rjs_compiler_debughead(co, records, rec);
407 rvm_codegen_addins(co->cg, rvm_asmp(RVM_PUSH, R0, XX, XX, 0));
408 rjs_compiler_debugtail(co, records, rec);
413 rint rjs_compiler_rh_decimalintegerliteral(rjs_compiler_t *co, rarray_t *records, rlong rec)
416 prec = (rparecord_t *)r_array_slot(records, rec);
417 rjs_compiler_debughead(co, records, rec);
418 rjs_compiler_debugtail(co, records, rec);
420 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
423 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
424 prec = (rparecord_t *)r_array_slot(records, rec);
425 rjs_compiler_debughead(co, records, rec);
426 rvm_codegen_addins(co->cg, rvm_asml(RVM_MOV, R0, DA, XX, r_strtol(prec->input, NULL, 10)));
427 rjs_compiler_debugtail(co, records, rec);
432 rint rjs_compiler_rh_decimalnonintegerliteral(rjs_compiler_t *co, rarray_t *records, rlong rec)
435 prec = (rparecord_t *)r_array_slot(records, rec);
436 rjs_compiler_debughead(co, records, rec);
437 rjs_compiler_debugtail(co, records, rec);
439 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
442 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
443 prec = (rparecord_t *)r_array_slot(records, rec);
444 rjs_compiler_debughead(co, records, rec);
445 rvm_codegen_addins(co->cg, rvm_asmd(RVM_MOV, R0, DA, XX, r_strtod(prec->input, NULL)));
447 rjs_compiler_debugtail(co, records, rec);
452 rint rjs_compiler_rh_expressionop(rjs_compiler_t *co, rarray_t *records, rlong rec)
456 rlong opcoderec = -1;
458 prec = (rparecord_t *)r_array_slot(records, rec);
459 rjs_compiler_debughead(co, records, rec);
460 rvm_codegen_addins(co->cg, rvm_asm(RVM_PUSH, R0, XX, XX, 0));
461 rjs_compiler_debugtail(co, records, rec);
463 if ((opcoderec = rpa_recordtree_firstchild(records, rec, RPA_RECORD_END)) < 0)
465 opcode = rjs_compiler_record2opcode((rparecord_t *)r_array_slot(records, opcoderec));
467 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
470 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
471 prec = (rparecord_t *)r_array_slot(records, rec);
472 rjs_compiler_debughead(co, records, rec);
473 rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R1, XX, XX, 0));
474 rvm_codegen_addins(co->cg, rvm_asm(opcode, R0, R1, R0, 0));
475 rjs_compiler_debugtail(co, records, rec);
480 rint rjs_compiler_rh_assignmentexpressionop(rjs_compiler_t *co, rarray_t *records, rlong rec)
484 rlong opcoderec = -1;
486 prec = (rparecord_t *)r_array_slot(records, rec);
487 rjs_compiler_debughead(co, records, rec);
488 rjs_compiler_debugtail(co, records, rec);
490 if ((opcoderec = rpa_recordtree_next(records, rpa_recordtree_firstchild(records, rec, RPA_RECORD_END), RPA_RECORD_END)) < 0)
492 opcode = rjs_compiler_record2opcode((rparecord_t *)r_array_slot(records, opcoderec));
494 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
497 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
498 prec = (rparecord_t *)r_array_slot(records, rec);
499 rjs_compiler_debughead(co, records, rec);
500 rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R1, XX, XX, 0));
501 if (opcode != RVM_NOP) {
502 rvm_codegen_addins(co->cg, rvm_asm(RVM_LDRR, R2, R1, XX, 0));
503 rvm_codegen_addins(co->cg, rvm_asm(opcode, R0, R2, R0, 0));
505 rvm_codegen_addins(co->cg, rvm_asm(RVM_STRR, R0, R1, XX, 0));
506 rjs_compiler_debugtail(co, records, rec);
511 rint rjs_compiler_rh_newarrayexpression(rjs_compiler_t *co, rarray_t *records, rlong rec)
514 prec = (rparecord_t *)r_array_slot(records, rec);
515 rjs_compiler_debughead(co, records, rec);
516 rjs_compiler_debugtail(co, records, rec);
518 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
521 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
522 prec = (rparecord_t *)r_array_slot(records, rec);
523 rjs_compiler_debughead(co, records, rec);
524 rvm_codegen_addins(co->cg, rvm_asm(RVM_ALLOCOBJ, R0, DA, XX, 0));
525 rjs_compiler_debugtail(co, records, rec);
530 rint rjs_compiler_rh_memberexpressiondotop(rjs_compiler_t *co, rarray_t *records, rlong rec)
533 prec = (rparecord_t *)r_array_slot(records, rec);
534 rjs_compiler_debughead(co, records, rec);
535 rjs_compiler_debugtail(co, records, rec);
537 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
540 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
541 prec = (rparecord_t *)r_array_slot(records, rec);
542 rjs_compiler_debughead(co, records, rec);
543 if (rpa_record_getruleuid(records, rpa_recordtree_parent(records, rec, RPA_RECORD_START)) == UID_LEFTHANDSIDEEXPRESSIONADDR &&
544 rpa_recordtree_next(records, rec, RPA_RECORD_START) == -1) {
545 rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R1, XX, XX, 0)); // Supposedly Array Address
546 rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R0, DA, XX, prec->inputsiz));
547 rvm_codegen_addins(co->cg, rvm_asmp(RVM_MOV, R2, DA, XX, (void*)prec->input));
548 rvm_codegen_addins(co->cg, rvm_asm(RVM_OBJLKUPADD, R0, R1, R2, 0)); // Get the address of the element at offset R0
550 rvm_codegen_addins(co->cg, rvm_asm(RVM_POP, R1, XX, XX, 0)); // Supposedly Array Address
551 rvm_codegen_addins(co->cg, rvm_asm(RVM_MOV, R0, DA, XX, prec->inputsiz));
552 rvm_codegen_addins(co->cg, rvm_asmp(RVM_MOV, R2, DA, XX, (void*)prec->input));
553 rvm_codegen_addins(co->cg, rvm_asm(RVM_OBJLKUP, R0, R1, R2, 0)); // Get the address of the element at offset R0
555 rjs_compiler_debugtail(co, records, rec);
560 rint rjs_compiler_rh_(rjs_compiler_t *co, rarray_t *records, rlong rec)
563 prec = (rparecord_t *)r_array_slot(records, rec);
564 rjs_compiler_debughead(co, records, rec);
565 rjs_compiler_debugtail(co, records, rec);
567 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
570 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
571 prec = (rparecord_t *)r_array_slot(records, rec);
572 rjs_compiler_debughead(co, records, rec);
573 rjs_compiler_debugtail(co, records, rec);
578 rjs_compiler_t *rjs_compiler_create(rvmcpu_t *cpu)
580 rjs_compiler_t *co = (rjs_compiler_t *) r_zmalloc(sizeof(*co));
582 co->cg = rvm_codegen_create();
583 co->scope = rvm_scope_create();
584 co->coctx = r_array_create(sizeof(rjs_coctx_t *));
586 r_memset(co->handlers, 0, sizeof(co->handlers));
588 co->handlers[UID_PROGRAM] = rjs_compiler_rh_program;
589 co->handlers[UID_EXPRESSION] = rjs_compiler_rh_expression;
590 co->handlers[UID_LEFTHANDSIDEEXPRESSION] = rjs_compiler_rh_lefthandsideexpression;
591 co->handlers[UID_LEFTHANDSIDEEXPRESSIONADDR] = rjs_compiler_rh_lefthandsideexpressionaddr;
592 co->handlers[UID_DECIMALINTEGERLITERAL] = rjs_compiler_rh_decimalintegerliteral;
593 co->handlers[UID_DECIMALNONINTEGERLITERAL] = rjs_compiler_rh_decimalnonintegerliteral;
594 co->handlers[UID_ADDITIVEEXPRESSIONOP] = rjs_compiler_rh_expressionop;
595 co->handlers[UID_MULTIPLICATIVEEXPRESSIONOP] = rjs_compiler_rh_expressionop;
596 co->handlers[UID_BITWISEANDOP] = rjs_compiler_rh_expressionop;
597 co->handlers[UID_BITWISEXOROP] = rjs_compiler_rh_expressionop;
598 co->handlers[UID_BITWISEOROP] = rjs_compiler_rh_expressionop;
599 co->handlers[UID_SHIFTEXPRESSIONOP] = rjs_compiler_rh_expressionop;
600 co->handlers[UID_EQUALITYEXPRESSIONOP] = rjs_compiler_rh_expressionop;
601 co->handlers[UID_RELATIONALEXPRESSIONOP] = rjs_compiler_rh_expressionop;
602 co->handlers[UID_LOGICALOROP] = rjs_compiler_rh_expressionop;
603 co->handlers[UID_LOGICALANDOP] = rjs_compiler_rh_expressionop;
604 co->handlers[UID_VARIABLEALLOCATEANDINIT] = rjs_compiler_rh_varallocinit;
605 co->handlers[UID_VARIABLEALLOCATE] = rjs_compiler_rh_varalloc;
606 co->handlers[UID_IDENTIFIER] = rjs_compiler_rh_identifier;
607 co->handlers[UID_INITIALISER] = rjs_compiler_rh_initializer;
608 co->handlers[UID_ASSIGNMENTEXPRESSIONOP] = rjs_compiler_rh_assignmentexpressionop;
609 co->handlers[UID_NEWARRAYEXPRESSION] = rjs_compiler_rh_newarrayexpression;
610 co->handlers[UID_MEMBEREXPRESSIONDOTOP] = rjs_compiler_rh_memberexpressiondotop;
616 void rjs_compiler_destroy(rjs_compiler_t *co)
619 rvm_codegen_destroy(co->cg);
620 rvm_scope_destroy(co->scope);
621 r_array_destroy(co->coctx);
629 static rint rjs_compiler_rh_default(rjs_compiler_t *co, rarray_t *records, rlong rec)
633 prec = (rparecord_t *)r_array_slot(records, rec);
634 rjs_compiler_debughead(co, records, rec);
635 rjs_compiler_debugtail(co, records, rec);
637 if (rjs_compiler_playchildrecords(co, records, rec) < 0)
640 rec = rpa_recordtree_get(records, rec, RPA_RECORD_END);
641 prec = (rparecord_t *)r_array_slot(records, rec);
642 rjs_compiler_debughead(co, records, rec);
643 rjs_compiler_debugtail(co, records, rec);
649 static rint rjs_compiler_playchildrecords(rjs_compiler_t *co, rarray_t *records, rlong rec)
653 for (child = rpa_recordtree_firstchild(records, rec, RPA_RECORD_START); child >= 0; child = rpa_recordtree_next(records, child, RPA_RECORD_START)) {
654 if (rjs_compiler_playrecord(co, records, child) < 0)
662 rint rjs_compiler_playreversechildrecords(rjs_compiler_t *co, rarray_t *records, rlong rec)
666 for (child = rpa_recordtree_lastchild(records, rec, RPA_RECORD_START); child >= 0; child = rpa_recordtree_prev(records, child, RPA_RECORD_START)) {
667 if (rjs_compiler_playrecord(co, records, child) < 0)
675 static rint rjs_compiler_playrecord(rjs_compiler_t *co, rarray_t *records, rlong rec)
678 prec = (rparecord_t *)r_array_slot(records, rec);
679 if (prec->ruleuid >= 0 && prec->ruleuid < RJS_COMPILER_NHANDLERS && co->handlers[prec->ruleuid]) {
680 return co->handlers[prec->ruleuid](co, records, rec);
682 return rjs_compiler_rh_default(co, records, rec);
686 rint rjs_compiler_compile(rjs_compiler_t *co, rarray_t *records)
690 if (!co || !records || r_array_empty(records)) {
695 for (i = 0; i >= 0; i = rpa_recordtree_next(records, i, RPA_RECORD_START)) {
696 if (rjs_compiler_playrecord(co, records, i) < 0)