}
-rint rvm_cpu_swilookup(rvmcpu_t *cpu, const rchar *tabname, const rchar *swiname, rsize_t size)
+rint rvm_cpu_global_swilookup(rvmcpu_t *cpu, const rchar *swiname, rsize_t size)
+{
+ rint nswi;
+ rvm_switable_t *swientry;
+ rlong ntable;
+
+ for (ntable = 0; ntable < r_harray_length(cpu->switables); ntable++) {
+ swientry = r_harray_index(cpu->switables, ntable, rvm_switable_t*);
+ if (!swientry)
+ return -1;
+ for (nswi = 0; swientry[nswi].name; nswi++) {
+ if (r_strncmp(swientry[nswi].name, swiname, size) == 0 && r_strlen(swientry[nswi].name) == size)
+ return (rint)RVM_SWI_ID(ntable, nswi);
+ }
+ }
+ return -1;
+}
+
+
+rint rvm_cpu_table_swilookup(rvmcpu_t *cpu, const rchar *tabname, const rchar *swiname, rsize_t size)
{
rint nswi;
rvm_switable_t *swientry;
}
+rint rvm_cpu_swilookup(rvmcpu_t *cpu, const rchar *tabname, const rchar *swiname, rsize_t size)
+{
+ return tabname ? rvm_cpu_table_swilookup(cpu, tabname, swiname, size) : rvm_cpu_global_swilookup(cpu, swiname, size);
+}
+
+
rint rvm_cpu_swilookup_s(rvmcpu_t *cpu, const rchar *tabname, const rchar *swiname)
{
return rvm_cpu_swilookup(cpu, tabname, swiname, r_strlen(swiname));
ROBJECT_SRCDIR = $(SRCDIR)/robject
RLIB_SRCDIR = $(SRCDIR)/rlib
RVM_SRCDIR = $(SRCDIR)/rvm
-RPA_SRCDIR = $(SRCDIR)/rpa
+RPA_SRCDIR = $(SRCDIR)/rpa1
RPA2_SRCDIR = $(SRCDIR)/rpa2
RAST_SRCDIR = $(SRCDIR)/rast
TESTS_SRCDIR = $(SRCDIR)/tests
;TESTS += $(OUTDIR)/calc-test
;TESTS += $(OUTDIR)/rast-test
-;TESTS += $(OUTDIR)/rpagen-test
+TESTS += $(OUTDIR)/rpagen-test
TESTS += $(OUTDIR)/funcarg-test
TESTS += $(OUTDIR)/codegen-test
TESTS += $(OUTDIR)/codemap-test
rvm_compiler_t *co = (rvm_compiler_t *)userdata;
if (r_stringncmp("-", input, size))
- r_array_push(co->opcodes, RVM_OPSWI(rvm_cpu_swilookup_s(co->cpu, "RVM_SWI_NEG")), ruint);
+ r_array_push(co->opcodes, RVM_OPSWI(rvm_cpu_swilookup_s(co->cpu, NULL, "RVM_SWI_NEG")), ruint);
else if (r_stringncmp("+", input, size))
r_array_push(co->opcodes, RVM_NOP, ruint);
else if (r_stringncmp("!", input, size))
int codegen_swiidexist_callback(rpa_stat_handle stat, const char *name, void *userdata, const char *input, unsigned int size, unsigned int reason)
{
rvm_compiler_t *co = (rvm_compiler_t *)userdata;
- rint swi = rvm_cpu_swilookup(co->cpu, input, size);
+ rint swi = rvm_cpu_swilookup(co->cpu, NULL, input, size);
if (swi < 0)
return 0;
{
rvm_compiler_t *co = (rvm_compiler_t *)userdata;
rulong off = rvm_codegen_getcodesize(co->cg);
- rint swi = rvm_cpu_swilookup(co->cpu, input, size);
+ rint swi = rvm_cpu_swilookup(co->cpu, NULL, input, size);
if (swi < 0)
return 0;
rvm_compiler_t *co = rvm_compiler_create(dbex);
cpu = rvm_cpu_create_default();
- ntable = rvm_cpu_addswitable(vm, "switable", switable);
- rvm_cpu_addswitable(cpu, switable_js);
+ ntable = rvm_cpu_addswitable(cpu, "switable", switable);
+ rvm_cpu_addswitable(cpu, "switable_js", switable_js);
co->cpu = cpu;
thisptr = rvm_cpu_alloc_global(cpu);