{
rvm_varmap_t *v;
rvmreg_t count = rvm_reg_create_long(0);
- rjs_object_t *a = rjs_object_create(sizeof(rvmreg_t));
- rvm_gc_add(co->cpu->gc, (robject_t*)a);
- r_harray_add_s(a->harray, "count", &count);
+ rjs_object_t *a;
v = rvm_scope_tiplookup_s(co->scope, "ARGS");
if (!v) {
- rvm_scope_addpointer_s(co->scope, "ARGS", rvm_cpu_alloc_global(co->cpu));
- v = rvm_scope_tiplookup_s(co->scope, "ARGS");
+ return -1;
}
+ a = rjs_object_create(sizeof(rvmreg_t));
+ rvm_gc_add(co->cpu->gc, (robject_t*)a);
+ r_harray_add_s(a->harray, "count", &count);
rvm_reg_setjsobject((rvmreg_t*)v->data.ptr, (robject_t*)a);
return 0;
}
rvmreg_t arg;
rsize_t i = 0;
- rjs_compiler_argarray_setup(jse->co);
if (rjs_engine_compile(jse, script, size) < 0)
return NULL;
- for (i = 0; i < nargs; i++) {
- arg = va_arg(args, rvmreg_t);
- rjs_compiler_addarg(jse->co, &arg);
+ if (nargs > 0) {
+ rjs_compiler_argarray_setup(jse->co);
+ for (i = 0; i < nargs; i++) {
+ arg = va_arg(args, rvmreg_t);
+ rjs_compiler_addarg(jse->co, &arg);
+ }
}
RVM_CPUREG_SETU(jse->cpu, FP, 0);
RVM_CPUREG_SETU(jse->cpu, SP, 0);
}
+static rint rjs_compiler_internalvars_setup(rjs_compiler_t *co)
+{
+ rvm_varmap_t *v;
+
+ v = rvm_scope_tiplookup_s(co->scope, "ARGS");
+ if (!v) {
+ rvm_scope_addpointer_s(co->scope, "ARGS", rvm_cpu_alloc_global(co->cpu));
+ v = rvm_scope_tiplookup_s(co->scope, "ARGS");
+ R_ASSERT(v);
+ return -1;
+ }
+ rvm_reg_setundef((rvmreg_t*)v->data.ptr);
+
+ return 0;
+}
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);
+ rjs_compiler_internalvars_setup(co);
rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_BRANCH, mainidx, rvm_asm(RVM_B, DA, XX, XX, 0));
start = rvm_codegen_addins(co->cg, rvm_asm(RVM_NOP, XX, XX, XX, 0));
rvm_codegen_index_addrelocins(co->cg, RVM_RELOC_DEFAULT, allocsidx, rvm_asm(RVM_ADD, SP, FP, DA, 0));
}
+void rvm_reg_setundef(rvmreg_t *r)
+{
+ RVM_REG_CLEAR(r);
+ RVM_REG_SETTYPE(r, RVM_DTYPE_UNDEF);
+}
+
+
void rvm_reg_setunsigned(rvmreg_t *r, rword u)
{
RVM_REG_SETU(r, u);
rboolean rvm_reg_tstflag(const rvmreg_t *r, ruint16 flag);
void rvm_reg_setflag(rvmreg_t *r, ruint16 flag);
void rvm_reg_clrflag(rvmreg_t *r, ruint16 flag);
+void rvm_reg_setundef(rvmreg_t *r);
void rvm_reg_setunsigned(rvmreg_t *r, rword u);
void rvm_reg_setboolean(rvmreg_t *r, ruint b);
void rvm_reg_setlong(rvmreg_t *r, rlong l);