-Subproject commit 8fe7b190037c09cee1b5ff6cca54b4dba88b9d1a
+Subproject commit 305c073c779f3efb3b1ed344b1a924784599da29
#ifndef __GWION_OPCODES__
#define __GWION_OPCODES__
enum {
+ RegSetImm,
RegPushImm,
RegPushImm2,
RegPushImm3,
OP_MAX,
};
+#define RegSetImm (f_instr)RegSetImm
#define RegPushImm (f_instr)RegPushImm
#define RegPushImm2 (f_instr)RegPushImm2
#define RegPushImm3 (f_instr)RegPushImm3
+RegSetImm
RegPushImm
RegPushImm2
RegPushImm3
emit_add_instr(emit, RegDup);
const Instr push_f = emit_add_instr(emit, RegPushImm);
push_f->m_val = (m_uint)code;
- const Instr offset = emit_add_instr(emit, RegPushImm);
+ const Instr offset = emit_add_instr(emit, RegSetImm);
offset->m_val = emit_code_offset(emit);
emit_add_instr(emit, !GET_FLAG(code, builtin) ? FuncUsr : FuncMember);
}
while((e = e->next));
const Type type = array->type;
const Type base = array_base(type);
- const Instr push = emit_add_instr(emit, RegPushImm);
+ const Instr push = emit_add_instr(emit, RegSetImm);
push->m_val = count;
const Instr instr = emit_add_instr(emit, ArrayInit);
instr->m_val = (m_uint)type;
instr->m_val = is_var;
instr->m_val2 = is_var ? SZ_INT : array->self->type->size;
} else {
- const Instr push = emit_add_instr(emit, RegPushImm);
+ const Instr push = emit_add_instr(emit, RegSetImm);
push->m_val = depth;
const Instr instr = emit_add_instr(emit, ArrayAccessMulti);
instr->m_val = is_var || array->self->type->array_depth;
return emit_add_instr(emit, exec);
}
const Instr ex = emit_add_instr(emit, GWOP_EXCEPT);
- ex->m_val = -SZ_INT*2;
+ ex->m_val = -SZ_INT;
return emit_add_instr(emit, FuncPtr);
}
} else if((f->value_ref->owner_class && is_special(f->value_ref->owner_class) > 0) ||
!f->value_ref->owner_class || GET_FLAG(f, template))
push_func_code(emit, f);
- const Instr offset = emit_add_instr(emit, RegPushImm);
+ const Instr offset = emit_add_instr(emit, RegSetImm);
offset->m_val = emit_code_offset(emit);
const Instr instr = emit_call(emit, f);
const m_uint size = instr->m_val = f->def->ret_type->size;
}
m_bool memoize_get(VM_Shred shred) {
- const VM_Code code = *(VM_Code*)REG(-SZ_INT * 2);
+// const VM_Code code = *(VM_Code*)REG(-SZ_INT * 2);
+ const VM_Code code = *(VM_Code*)REG(-SZ_INT);
const Memoize m = code->memoize;
- const m_bit* arg = REG(-(SZ_INT*2 + m->arg_sz + (m_uint)m->member));
+ const m_bit* arg = REG(-(SZ_INT + m->arg_sz + (m_uint)m->member));
const m_uint size = vector_size(&m->v);
for(m_uint i = 0; i < size; ++i) {
m_bit* data = (m_bit*)vector_at(&m->v, i);
if(memcmp(arg, data, m->arg_sz))
continue;
- POP_REG(shred, SZ_INT*2 + (m->arg_sz - m->ret_sz) + (m_uint)m->member)
+ POP_REG(shred, SZ_INT + (m->arg_sz - m->ret_sz) + (m_uint)m->member)
mreturn[m->kind](shred->reg-m->ret_sz, data + m->arg_sz, m->ret_sz);
return GW_OK;
}
INSTR(ArrayInit) { GWDEBUG_EXE // for litteral array
const Type t = (Type)instr->m_val;
- const m_uint sz = *(m_uint*)REG(-SZ_INT);
+ const m_uint sz = *(m_uint*)REG(0);
const m_uint off = instr->m_val2 * sz;
- POP_REG(shred, off /*- SZ_INT*/);
+ POP_REG(shred, off - SZ_INT);
const M_Object obj = new_array(t, sz);
memcpy(ARRAY(obj)->ptr + ARRAY_OFFSET, REG(-SZ_INT), off);
*(M_Object*)REG(-SZ_INT) = obj;
#define DIM(a) gw_err("\t... at dim [%" INT_F "]\n", (a))
INSTR(ArrayAccessMulti) { GWDEBUG_EXE
- const m_uint depth = *(m_uint*)REG(-SZ_INT);
- POP_REG(shred, SZ_INT * (depth + 2))
+ const m_uint depth = *(m_uint*)REG(0);
+ POP_REG(shred, SZ_INT * (depth + 1))
const M_Object base = *(M_Object*)REG(0);
M_Object obj = base;
if(!obj)
ANN void vm_run(const VM* vm) {
static const void* dispatch[] = {
+ &®setimm,
&®pushimm, &®pushfloat, &®pushother, &®pushaddr,
&®pushmem, &®pushmemfloat, &®pushmemother, &®pushmemaddr,
&&pushnow,
#endif
do {
register Instr instr; DISPATCH();
+regsetimm:
+ *(m_uint*)reg = instr->m_val;
+ DISPATCH();
regpushimm:
*(m_uint*)reg = instr->m_val;
reg += SZ_INT;
funcusr:
{
- reg -= SZ_INT * 2;
+ reg -= SZ_INT;
register const m_uint push = *(m_uint*)(reg + SZ_INT) + *(m_uint*)(mem-SZ_INT);
mem += push;
*(m_uint*) mem = push;mem += SZ_INT;
DISPATCH();
funcmember:
{
- reg -= SZ_INT * 2;
+ reg -= SZ_INT;
a.code = *(VM_Code*)reg;
register const m_uint local_depth = *(m_uint*)(reg + SZ_INT);
register m_bit* m = mem + local_depth;
}
funcstatic:
{
- reg -= SZ_INT * 2;
+ reg -= SZ_INT;
a.code = *(VM_Code*)reg;
register const m_uint local_depth = *(m_uint*)(reg + SZ_INT);
register m_bit* m = mem + local_depth;
--- /dev/null
+// [contains] cannot extend itself
+class C extends C {
+
+}