}
+rlong r_map_add_l(rmap_t *map, long name, rconstpointer pval)
+{
+ rchar key[128];
+ r_memset(key, 0, sizeof(key));
+ r_snprintf(key, sizeof(key) - 1, "%ld", name);
+ return r_map_add_s(map, key, pval);
+}
+
+
+rlong r_map_add_d(rmap_t *map, double name, rconstpointer pval)
+{
+ rchar key[128];
+ r_memset(key, 0, sizeof(key));
+ r_snprintf(key, sizeof(key) - 1, "%.15f", name);
+ return r_map_add_s(map, key, pval);
+}
+
+
r_mapnode_t *r_map_node(rmap_t *map, rulong index)
{
r_mapnode_t *node;
}
+rlong r_map_lookup_l(rmap_t *map, rlong current, long name)
+{
+ rchar key[128];
+ r_memset(key, 0, sizeof(key));
+ r_snprintf(key, sizeof(key) - 1, "%ld", name);
+ return r_map_lookup_s(map, current, key);
+}
+
+
+rlong r_map_lookup_d(rmap_t *map, rlong current, double name)
+{
+ rchar key[128];
+ r_memset(key, 0, sizeof(key));
+ r_snprintf(key, sizeof(key) - 1, "%.15f", name);
+ return r_map_lookup_s(map, current, key);
+}
+
+
rlong r_map_taillookup(rmap_t *map, rlong current, const rchar *name, rsize_t namesize)
{
rlong found = -1;
#include "rstring.h"
#include "rvmreg.h"
#include "rmap.h"
-#include "rjsobject.h"
#define RVM_DEFAULT_STACKSIZE (4 * 1024)
if (!a) {
RVM_ABORT(cpu, RVM_E_ILLEGAL);
}
-// r_carray_setlength(a, RVM_CPUREG_GETU(cpu, ins->op2));
rvm_gc_add(cpu->gc, (robject_t*)a);
rvm_reg_setjsobject(arg1, (robject_t*)a);
}
static void rvm_op_maplookup(rvmcpu_t *cpu, rvm_asmins_t *ins)
{
rlong index;
- rlong keysize;
- rchar key[256], *pkey = key;
rvmreg_t *arg1 = RVM_CPUREG_PTR(cpu, ins->op1);
rvmreg_t *arg2 = RVM_CPUREG_PTR(cpu, ins->op2);
rvmreg_t *arg3 = RVM_CPUREG_PTR(cpu, ins->op3);
RVM_ABORT(cpu, RVM_E_NOTOBJECT);
}
if (RVM_REG_GETTYPE(arg3) == RVM_DTYPE_LONG || RVM_REG_GETTYPE(arg3) == RVM_DTYPE_UNSIGNED) {
- keysize = r_snprintf(key, sizeof(key) - 1, "%ld", RVM_REG_GETL(arg3));
+ index = r_map_lookup_l(a, -1, RVM_REG_GETL(arg3));
} else if (RVM_REG_GETTYPE(arg3) == RVM_DTYPE_DOUBLE) {
- keysize = r_snprintf(key, sizeof(key) - 1, "%f", RVM_REG_GETD(arg3));
+ index = r_map_lookup_d(a, -1, RVM_REG_GETD(arg3));
} else if (RVM_REG_GETTYPE(arg3) == RVM_DTYPE_STRING) {
- pkey = ((rstring_t *)RVM_CPUREG_GETP(cpu, ins->op3))->s.str;
- keysize = ((rstring_t *)RVM_CPUREG_GETP(cpu, ins->op3))->s.size;
+ index = r_map_lookup(a, -1, ((rstring_t *)RVM_CPUREG_GETP(cpu, ins->op3))->s.str, ((rstring_t *)RVM_CPUREG_GETP(cpu, ins->op3))->s.size);
} else if (RVM_REG_GETTYPE(arg3) == RVM_DTYPE_POINTER) {
- pkey = (rchar*)RVM_CPUREG_GETP(cpu, ins->op3);
- keysize = RVM_CPUREG_GETL(cpu, ins->op1);
+ index = r_map_lookup(a, -1, (rchar*)RVM_CPUREG_GETP(cpu, ins->op3), RVM_CPUREG_GETL(cpu, ins->op1));
} else {
RVM_ABORT(cpu, RVM_E_ILLEGAL);
}
- index = r_map_lookup(a, -1, pkey, keysize);
RVM_REG_CLEAR(arg1);
RVM_REG_SETTYPE(arg1, RVM_DTYPE_LONG);
static void rvm_op_mapadd(rvmcpu_t *cpu, rvm_asmins_t *ins)
{
rlong index;
- rlong keysize;
- rchar key[256], *pkey = key;
rvmreg_t *arg1 = RVM_CPUREG_PTR(cpu, ins->op1);
rvmreg_t *arg2 = RVM_CPUREG_PTR(cpu, ins->op2);
rvmreg_t *arg3 = RVM_CPUREG_PTR(cpu, ins->op3);
RVM_ABORT(cpu, RVM_E_NOTOBJECT);
}
if (RVM_REG_GETTYPE(arg3) == RVM_DTYPE_LONG || RVM_REG_GETTYPE(arg3) == RVM_DTYPE_UNSIGNED) {
- keysize = r_snprintf(key, sizeof(key) - 1, "%ld", RVM_REG_GETL(arg3));
+ index = r_map_add_l(a, RVM_REG_GETL(arg3), NULL);
} else if (RVM_REG_GETTYPE(arg3) == RVM_DTYPE_DOUBLE) {
- keysize = r_snprintf(key, sizeof(key) - 1, "%f", RVM_REG_GETD(arg3));
+ index = r_map_add_d(a, RVM_REG_GETD(arg3), NULL);
} else if (RVM_REG_GETTYPE(arg3) == RVM_DTYPE_STRING) {
- pkey = ((rstring_t *)RVM_CPUREG_GETP(cpu, ins->op3))->s.str;
- keysize = ((rstring_t *)RVM_CPUREG_GETP(cpu, ins->op3))->s.size;
+ index = r_map_add(a, ((rstring_t *)RVM_CPUREG_GETP(cpu, ins->op3))->s.str, ((rstring_t *)RVM_CPUREG_GETP(cpu, ins->op3))->s.size, NULL);
} else if (RVM_REG_GETTYPE(arg3) == RVM_DTYPE_POINTER) {
- pkey = (rchar*)RVM_CPUREG_GETP(cpu, ins->op3);
- keysize = RVM_CPUREG_GETL(cpu, ins->op1);
+ index = r_map_add(a, (rchar*)RVM_CPUREG_GETP(cpu, ins->op3), RVM_CPUREG_GETL(cpu, ins->op1), NULL);
} else {
RVM_ABORT(cpu, RVM_E_ILLEGAL);
}
- index = r_map_add(a, pkey, keysize, NULL);
RVM_REG_CLEAR(arg1);
RVM_REG_SETTYPE(arg1, RVM_DTYPE_LONG);
static void rvm_op_maplookupadd(rvmcpu_t *cpu, rvm_asmins_t *ins)
{
rlong index;
- rlong keysize;
- rchar key[256], *pkey = key;
rvmreg_t *arg1 = RVM_CPUREG_PTR(cpu, ins->op1);
rvmreg_t *arg2 = RVM_CPUREG_PTR(cpu, ins->op2);
rvmreg_t *arg3 = RVM_CPUREG_PTR(cpu, ins->op3);
if (rvm_reg_gettype(arg2) != RVM_DTYPE_JSOBJECT) {
RVM_ABORT(cpu, RVM_E_NOTOBJECT);
}
-
if (RVM_REG_GETTYPE(arg3) == RVM_DTYPE_LONG || RVM_REG_GETTYPE(arg3) == RVM_DTYPE_UNSIGNED) {
- keysize = r_snprintf(key, sizeof(key) - 1, "%ld", RVM_REG_GETL(arg3));
+ index = r_map_lookup_l(a, -1, RVM_REG_GETL(arg3));
+ if (index < 0)
+ index = r_map_add_l(a, RVM_REG_GETL(arg3), NULL);
} else if (RVM_REG_GETTYPE(arg3) == RVM_DTYPE_DOUBLE) {
- keysize = r_snprintf(key, sizeof(key) - 1, "%f", RVM_REG_GETD(arg3));
+ index = r_map_lookup_d(a, -1, RVM_REG_GETD(arg3));
+ if (index < 0)
+ index = r_map_add_d(a, RVM_REG_GETD(arg3), NULL);
} else if (RVM_REG_GETTYPE(arg3) == RVM_DTYPE_STRING) {
- pkey = ((rstring_t *)RVM_CPUREG_GETP(cpu, ins->op3))->s.str;
- keysize = ((rstring_t *)RVM_CPUREG_GETP(cpu, ins->op3))->s.size;
+ index = r_map_lookup(a, -1, ((rstring_t *)RVM_CPUREG_GETP(cpu, ins->op3))->s.str, ((rstring_t *)RVM_CPUREG_GETP(cpu, ins->op3))->s.size);
+ if (index < 0)
+ index = r_map_add(a, ((rstring_t *)RVM_CPUREG_GETP(cpu, ins->op3))->s.str, ((rstring_t *)RVM_CPUREG_GETP(cpu, ins->op3))->s.size, NULL);
} else if (RVM_REG_GETTYPE(arg3) == RVM_DTYPE_POINTER) {
- pkey = (rchar*)RVM_CPUREG_GETP(cpu, ins->op3);
- keysize = RVM_CPUREG_GETL(cpu, ins->op1);
+ index = r_map_lookup(a, -1, (rchar*)RVM_CPUREG_GETP(cpu, ins->op3), RVM_CPUREG_GETL(cpu, ins->op1));
+ if (index < 0)
+ index = r_map_add(a, (rchar*)RVM_CPUREG_GETP(cpu, ins->op3), RVM_CPUREG_GETL(cpu, ins->op1), NULL);
} else {
RVM_ABORT(cpu, RVM_E_ILLEGAL);
}
- index = r_map_lookup(a, -1, pkey, keysize);
- if (index < 0)
- index = r_map_add(a, pkey, keysize, NULL);
RVM_REG_CLEAR(arg1);
RVM_REG_SETTYPE(arg1, RVM_DTYPE_LONG);
RVM_REG_SETL(arg1, index);