const Instr instr = emit_add_instr(emit, ArrayInit);
instr->m_val = (m_uint)type;
instr->m_val2 = base->size;
+ emit_add_instr(emit, GcAdd);
return GW_OK;
}
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);
+ push->m_val = depth;
const Instr instr = emit_add_instr(emit, ArrayAccessMulti);
instr->m_val = is_var || array->self->type->array_depth;
instr->m_val2 = (is_var || array->self->type->array_depth) ?
SZ_INT : array_base(array->base->type)->size;
- *(m_uint*)instr->ptr = depth;
}
return GW_OK;
}
#define DIM(a) gw_err("\t... at dim [%" INT_F "]\n", (a))
INSTR(ArrayAccessMulti) { GWDEBUG_EXE
- const m_uint depth = *(m_uint*)instr->ptr;
- POP_REG(shred, SZ_INT * (depth + 1));
+ const m_uint depth = *(m_uint*)REG(-SZ_INT);
+ POP_REG(shred, SZ_INT * (depth + 2))
const M_Object base = *(M_Object*)REG(0);
M_Object obj = base;
if(!obj)