mp_free(Frame, a);
}
-ANN static m_uint frame_alloc(Frame* frame, const m_uint size, const m_bool is_obj) {
- Local* local = mp_alloc(Local);
- local->size = size;
- local->offset = frame->curr_offset;
+ANN static Local* new_local(const m_uint size, const m_bool is_obj) {
+ Local* local = mp_alloc(Local);
+ local->size = size;
local->is_obj = is_obj;
- frame->curr_offset += (local->size = size);
+ return local;
+}
+
+ANN static m_uint frame_local(Frame* frame, const m_uint size, const m_bool is_obj) {
+ Local* local = new_local(size, is_obj);
+ local->offset = frame->curr_offset;
+ frame->curr_offset += size;
vector_add(&frame->stack, (vtype)local);
return local->offset;
}
-ANN static void frame_push(Frame* frame) {
+ANN static inline void frame_push(Frame* frame) {
vector_add(&frame->stack, (vtype)NULL);
}
}
__attribute__((returns_nonnull))
-ANN2(1) Instr emitter_add_instr(const Emitter emit, const f_instr f) {
+ANN2(1) Instr emit_add_instr(const Emitter emit, const f_instr f) {
const Instr instr = mp_alloc(Instr);
instr->execute = f;
vector_add(&emit->code->instr, (vtype)instr);
ANN static void emit_pop_scope(const Emitter emit) { GWDEBUG_EXE
m_int offset;
- while((offset = frame_pop(emit->code->frame)) > - 1) {
- Instr instr = emitter_add_instr(emit, ObjectRelease);
+ while((offset = frame_pop(emit->code->frame)) > -1) {
+ Instr instr = emit_add_instr(emit, ObjectRelease);
instr->m_val = (m_uint)offset;
}
}
return emit->code->frame->curr_offset;
}
-ANN static inline m_uint emit_alloc_local(const Emitter emit, const m_uint size, const m_bool is_obj) { GWDEBUG_EXE
- return frame_alloc(emit->code->frame, size, is_obj);
+ANN static inline m_uint emit_local(const Emitter emit, const m_uint size, const m_bool is_obj) { GWDEBUG_EXE
+ return frame_local(emit->code->frame, size, is_obj);
}
ANN static void emit_pre_ctor_inner(const Emitter emit, const Type type) { GWDEBUG_EXE
- const Instr instr = emitter_add_instr(emit, PreCtor);
+ const Instr instr = emit_add_instr(emit, PreCtor);
instr->m_val = (m_uint)type->nspc->pre_ctor;
instr->m_val2 = (m_uint)emit_code_offset(emit);
}
ANN static void emit_pre_constructor_array(const Emitter emit, const Type type) {
const m_uint start_index = emit_code_size(emit);
- const Instr top = emitter_add_instr(emit, ArrayTop);
+ const Instr top = emit_add_instr(emit, ArrayTop);
top->m_val2 = (m_uint)type;
emit_pre_ctor(emit, type);
- const Instr bottom = emitter_add_instr(emit, ArrayBottom);
+ const Instr bottom = emit_add_instr(emit, ArrayBottom);
top->m_val = emit_code_size(emit);
bottom->m_val = start_index;
- emitter_add_instr(emit, ArrayPost);
+ emit_add_instr(emit, ArrayPost);
}
ANN ArrayInfo* emit_array_extend_inner(const Emitter emit, const Type t, const Exp e) { GWDEBUG_EXE
vector_add(&info->type, (vtype)t);
info->depth = (m_int)t->array_depth;
info->base = base;
- const Instr alloc = emitter_add_instr(emit, ArrayAlloc);
+ const Instr alloc = emit_add_instr(emit, ArrayAlloc);
*(ArrayInfo**)alloc->ptr = info;
if(isa(base, t_object) > 0) {
emit_pre_constructor_array(emit, base);
}
ANN void emit_ext_ctor(const Emitter emit, const VM_Code code) { GWDEBUG_EXE
- emitter_add_instr(emit, RegDup);
- const Instr push_f = emitter_add_instr(emit, RegPushImm);
+ emit_add_instr(emit, RegDup);
+ const Instr push_f = emit_add_instr(emit, RegPushImm);
*(VM_Code*)push_f->ptr = code;
- const Instr offset = emitter_add_instr(emit, RegPushImm);
+ const Instr offset = emit_add_instr(emit, RegPushImm);
*(m_uint*)offset->ptr = emit_code_offset(emit);
- emitter_add_instr(emit, FuncMember);
+ emit_add_instr(emit, FuncMember);
}
ANN m_bool emit_array_extend(const Emitter emit, const Type t, const Exp e) { GWDEBUG_EXE
CHECK_OB(emit_array_extend_inner(emit, t, e))
- return !!emitter_add_instr(emit, PopArrayClass);
+ return !!emit_add_instr(emit, PopArrayClass);
}
ANN2(1,2) m_bool emit_instantiate_object(const Emitter emit, const Type type,
CHECK_OB(info)
info->is_ref = !!is_ref;
} else if(!is_ref) {
- const Instr instr = emitter_add_instr(emit, ObjectInstantiate);
+ const Instr instr = emit_add_instr(emit, ObjectInstantiate);
instr->m_val = (m_uint)type;
emit_pre_ctor(emit, type);
}
ANN static Instr emit_kind(Emitter emit, const m_uint size, const uint addr, const f_instr func[]) {
const enum Kind kind = kindof(size, addr);
- const Instr instr = emitter_add_instr(emit, func[kind]);
+ const Instr instr = emit_add_instr(emit, func[kind]);
instr->m_val2 = size;
return instr;
}
ANN static m_bool emit_symbol_builtin(const Emitter emit, const Exp_Primary* prim) { GWDEBUG_EXE
const Value v = prim->value;
if(GET_FLAG(v, func)) {
- const Instr instr = emitter_add_instr(emit, RegPushImm);
+ const Instr instr = emit_add_instr(emit, RegPushImm);
*(Func*)instr->ptr = v->d.func_ref;
return 1;
}
}
ANN static VM_Code finalyze(const Emitter emit) {
- emitter_add_instr(emit, EOC);
+ emit_add_instr(emit, EOC);
const VM_Code code = emit_code(emit);
emit_pop_code(emit);
return code;
}
+
ANN static m_bool prim_array(const Emitter emit, const Exp_Primary * primary) {
const Array_Sub array = primary->d.array;
Exp e = array->exp;
while((e = e->next));
const Type type = array->type;
const Type base = array_base(type);
- const Instr instr = emitter_add_instr(emit, ArrayInit);
+ const Instr instr = emit_add_instr(emit, ArrayInit);
instr->m_val = count;
instr->m_val2 = base->size;
*(Type*)instr->ptr = type;
CHECK_BB(emit_exp(emit, array->base, 0))
CHECK_BB(emit_exp(emit, array->array->exp, 0))
if(depth == 1) {
- const Instr instr = emitter_add_instr(emit, ArrayAccess);
+ const Instr instr = emit_add_instr(emit, ArrayAccess);
instr->m_val = is_var;
instr->m_val2 = is_var ? SZ_INT : array->self->type->size;
} else {
- const Instr instr = emitter_add_instr(emit, ArrayAccessMulti);
+ 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;
CHECK_BB(emit_exp(emit, vec->exp, 0));
m_int n = (m_int)((t == ae_primary_vec ? 3 : 2) - vec->dim + 1);
while(--n > 0)
- emitter_add_instr(emit, PushNull2);
+ emit_add_instr(emit, PushNull2);
return 1;
}
ANN static m_bool prim_id(const Emitter emit, const Exp_Primary* prim) {
if(prim->d.var == insert_symbol("this"))
- emitter_add_instr(emit, RegPushMem);
+ emit_add_instr(emit, RegPushMem);
else if(prim->d.var == insert_symbol("me"))
- emitter_add_instr(emit, RegPushMe);
+ emit_add_instr(emit, RegPushMe);
else if(prim->d.var == insert_symbol("now"))
- emitter_add_instr(emit, RegPushNow);
+ emit_add_instr(emit, RegPushNow);
else if(prim->d.var == insert_symbol("maybe"))
- emitter_add_instr(emit, RegPushMaybe);
+ emit_add_instr(emit, RegPushMaybe);
else if(prim->d.var == insert_symbol("__func__")) {
- const Instr instr = emitter_add_instr(emit, RegPushStr);
+ const Instr instr = emit_add_instr(emit, RegPushStr);
instr->m_val = (m_uint)s_name(insert_symbol(emit->env->func ?
emit->env->func->name : emit->env->class_def ?
emit->env->class_def->name : emit->env->name));
}
ANN static m_bool prim_num(const Emitter emit, const Exp_Primary * primary) {
- const Instr instr = emitter_add_instr(emit, RegPushImm);
+ const Instr instr = emit_add_instr(emit, RegPushImm);
*(m_uint*)instr->ptr = primary->d.num;
return 1;
}
ANN static m_bool prim_float(const Emitter emit, const Exp_Primary* primary) {
- const Instr instr = emitter_add_instr(emit, RegPushImm2);
+ const Instr instr = emit_add_instr(emit, RegPushImm2);
*(m_float*)instr->ptr = primary->d.fnum;
return 1;
}
ANN static m_bool prim_char(const Emitter emit, const Exp_Primary* prim) {
const m_int c = str2char(prim->d.chr, prim->self->pos);
CHECK_BB(c);
- const Instr instr = emitter_add_instr(emit, RegPushImm);
+ const Instr instr = emit_add_instr(emit, RegPushImm);
*(m_int*)instr->ptr = c;
return 1;
}
char c[strlen(prim->d.str)];
strcpy(c, prim->d.str);
CHECK_BB(escape_str(c, prim->self->pos));
- const Instr instr = emitter_add_instr(emit, RegPushStr);
+ const Instr instr = emit_add_instr(emit, RegPushStr);
instr->m_val = (m_uint)s_name(insert_symbol(c));
return 1;
}
free_vector(v);
ERR_B(exp->pos, "\t... in 'gack' expression.")
}
- const Instr instr = emitter_add_instr(emit, Gack);
+ const Instr instr = emit_add_instr(emit, Gack);
*(Vector*)instr->ptr = v;
instr->m_val = offset;
return 1;
#ifdef OPTIMIZE
ANN static m_bool prim_constprop(Emitter emit, const Exp_Primary* prim) {
- const Instr instr = emitter_add_instr(emit, ConstPropSet);
+ const Instr instr = emit_add_instr(emit, ConstPropSet);
instr->m_val = prim->value->offset;
instr->m_val2 = prim->d.num;
*(m_bool*)instr->ptr = prim->self->emit_var;
}
ANN static m_bool emit_dot_static_data(const Emitter emit, const Value v, const uint emit_var) { GWDEBUG_EXE
- const Instr push = emitter_add_instr(emit, RegPushImm);
+ const Instr push = emit_add_instr(emit, RegPushImm);
*(Type*)push->ptr = v->owner_class;
const m_uint size = v->type->size;
const Instr instr = emit_kind(emit, size, emit_var, dotstatic);
emit->code = (Code*)vector_back(&emit->stack);
CHECK_BB(emit_instantiate_object(emit, v->type, var_decl->array, is_ref))
CHECK_BB(emit_dot_static_data(emit, v, 1))
- emitter_add_instr(emit, ObjectAssign);
+ emit_add_instr(emit, ObjectAssign);
emit->code = code;
return 1;
}
CHECK_BB(emit_instantiate_object(emit, type, array, is_ref))
f_instr *exec = (f_instr*)allocmember;
if(!GET_FLAG(v, member)) {
- v->offset = emit_alloc_local(emit, v->type->size, is_obj);
+ v->offset = emit_local(emit, v->type->size, is_obj);
exec = (f_instr*)allocword;
}
const Instr instr = emit_kind(emit, v->type->size, emit_addr, exec);
instr->m_val = v->offset;
if(is_obj && (is_array || !is_ref)) {
- const Instr assign = emitter_add_instr(emit, ObjectAssign);
+ const Instr assign = emit_add_instr(emit, ObjectAssign);
assign->m_val = (m_uint)emit_var;
if(is_array && !emit->env->scope)
ADD_REF(type)
ANN static m_bool emit_func_arg_vararg(const Emitter emit, const Exp_Call* exp_call) { GWDEBUG_EXE
const Vector kinds = new_vector();
- const Instr instr = emitter_add_instr(emit, VarargIni);
+ const Instr instr = emit_add_instr(emit, VarargIni);
instr->m_val = vararg_size(exp_call, kinds);
instr->m_val2 = (m_uint)kinds;
return 1;
CHECK_BB(emit_exp(emit, exp_call->func, 0))
if(GET_FLAG(exp_call->m_func->def, variadic) && !exp_call->args) {
// handle empty call to variadic functions
- const Instr mk = emitter_add_instr(emit, VarargIni);
+ const Instr mk = emit_add_instr(emit, VarargIni);
*(m_uint*)mk->ptr = 1;
- emitter_add_instr(emit, PushNull);
+ emit_add_instr(emit, PushNull);
}
return 1;
}
ANN static m_bool emit_exp_dur(const Emitter emit, const Exp_Dur* dur) { GWDEBUG_EXE
CHECK_BB(emit_exp(emit, dur->base, 0))
if(isa(dur->base->type, t_int) > 0)
- emitter_add_instr(emit, CastI2F);
+ emit_add_instr(emit, CastI2F);
CHECK_BB(emit_exp(emit, dur->unit, 0))
- emitter_add_instr(emit, FloatTimes);
+ emit_add_instr(emit, FloatTimes);
return 1;
}
static inline m_bool push_func_code(const Emitter emit, const Func f) {
- const Instr instr = emitter_add_instr(emit, RegPushPtr);
+ const Instr instr = emit_add_instr(emit, RegPushPtr);
return !!(instr->m_val = (m_uint)f->code);
}
ANN static m_bool emit_exp_call1_code(const Emitter emit, const Func f) {
if(GET_FLAG(f, template) && emit->env->func != f)
return emit_template_code(emit, f);
- return !!emitter_add_instr(emit, RegPushCode);
+ return !!emit_add_instr(emit, RegPushCode);
}
ANN static Instr emit_call(const Emitter emit, const Func f) {
if(GET_FLAG(f, pure))
- emitter_add_instr(emit, MemoizeCall);
+ emit_add_instr(emit, MemoizeCall);
const Type t = actual_type(f->value_ref->type);
const f_instr exec = isa(t, t_fptr) < 0 ? GET_FLAG(f->def, builtin) ?
GET_FLAG(f, member) ? FuncMember : FuncStatic : FuncUsr : FuncPtr;
- return emitter_add_instr(emit, exec);
+ return emit_add_instr(emit, exec);
}
ANN m_bool emit_exp_call1(const Emitter emit, const Func func) { GWDEBUG_EXE
CHECK_BB(emit_exp_call1_code(emit, func))
else
push_func_code(emit, func);
- const Instr offset = emitter_add_instr(emit, RegPushImm);
+ const Instr offset = emit_add_instr(emit, RegPushImm);
*(m_uint*)offset->ptr = emit_code_offset(emit);
const Instr instr = emit_call(emit, func);
const m_uint size = instr->m_val = func->def->ret_type->size;
ANN2(1,2) static m_bool emit_exp_spork_finish(const Emitter emit, const VM_Code code, const Func f,
const m_uint arg_size, const m_uint depth) {
- const Instr push_code = emitter_add_instr(emit, RegPushImm);
+ const Instr push_code = emit_add_instr(emit, RegPushImm);
*(VM_Code*)push_code->ptr = code;
- const Instr spork = emitter_add_instr(emit, f ? SporkExp : SporkFunc);
+ const Instr spork = emit_add_instr(emit, f ? SporkExp : SporkFunc);
spork->m_val = f ? emit_code_offset(emit) : arg_size;
spork->m_val2 = (m_uint)code;
return (m_bool)(*(m_uint*)spork->ptr = depth);
emit_push_code(emit, c);
if(GET_FLAG(exp->m_func, member))
SET_FLAG(emit->code, member);
- const Instr op = emitter_add_instr(emit, MemPushImm);
+ const Instr op = emit_add_instr(emit, MemPushImm);
op->m_val = emit->code->stack_depth;
CHECK_BB(emit_exp_call1(emit, exp->m_func))
const VM_Code code = finalyze(emit);
static m_bool scoped_stmt(const Emitter emit, const Stmt stmt, const m_bool pop) {
emit_push_scope(emit);
- emitter_add_instr(emit, GcIni);
+ emit_add_instr(emit, GcIni);
CHECK_BB(emit_stmt(emit, stmt, pop))
- emitter_add_instr(emit, GcEnd);
+ emit_add_instr(emit, GcEnd);
emit_pop_scope(emit);
return 1;
}
static inline void stack_alloc(const Emitter emit) {
- emit_alloc_local(emit, SZ_INT, 0);
+ emit_local(emit, SZ_INT, 0);
emit->code->stack_depth += SZ_INT;
}
}
ANN static m_bool spork_func(const Emitter emit, const Stmt stmt) { GWDEBUG_EXE
- emitter_add_instr(emit, RegPushImm); // could be reg_push_ptr
+ emit_add_instr(emit, RegPushImm); // could be reg_push_ptr
emit_push_code(emit, "sporked");
if(SAFE_FLAG(emit->env->func, member))
stack_alloc_this(emit);
ANN static Instr emit_flow(const Emitter emit, const Type type,
const f_instr f1, const f_instr f2) { GWDEBUG_EXE
if(isa(type, t_float) > 0) {
- emitter_add_instr(emit, PushNull2);
- return emitter_add_instr(emit, f2);
+ emit_add_instr(emit, PushNull2);
+ return emit_add_instr(emit, f2);
}
- emitter_add_instr(emit, PushNull);
- return emitter_add_instr(emit, f1);
+ emit_add_instr(emit, PushNull);
+ return emit_add_instr(emit, f1);
}
ANN static m_bool emit_exp_if(const Emitter emit, const Exp_If* exp_if) { GWDEBUG_EXE
CHECK_BB(emit_exp(emit, exp_if->cond, 0))
const Instr op = emit_flow(emit, exp_if->cond->type, BranchEqInt, BranchEqFloat);
CHECK_BB(emit_exp(emit, exp_if->if_exp, 0))
- const Instr op2 = emitter_add_instr(emit, Goto);
+ const Instr op2 = emit_add_instr(emit, Goto);
op->m_val = emit_code_size(emit);
const m_bool ret = emit_exp(emit, exp_if->else_exp, 0);
op2->m_val = emit_code_size(emit);
ANN static void emit_exp_constprop(const Emitter emit, const Exp e) {
if(!e->emit_var) {
if(e->exp_type == ae_exp_constprop) {
- const Instr instr = emitter_add_instr(emit, RegPushMem);
+ const Instr instr = emit_add_instr(emit, RegPushMem);
instr->m_val = e->d.exp_primary.value->offset;
*(m_uint*)instr->ptr = GET_FLAG(e->d.exp_primary.value, global);
return;
}
- const Instr instr = emitter_add_instr(emit, ConstPropGet);
+ const Instr instr = emit_add_instr(emit, ConstPropGet);
instr->m_val2 = e->d.exp_primary.value->offset;
instr->m_val = e->d.exp_primary.d.num;
*(m_uint*)instr->ptr = 1;
} else {
- const Instr instr = emitter_add_instr(emit, ConstPropSet);
+ const Instr instr = emit_add_instr(emit, ConstPropSet);
instr->m_val = e->d.exp_primary.value->offset;
*(m_bool*)instr->ptr = 1;
instr->m_val2 = e->d.exp_primary.d.num;
if(exp->cast_to)
CHECK_BB(emit_implicit_cast(emit, exp->type, exp->cast_to))
if(ref && isa(exp->type, t_object) > 0) {
- const Instr instr = emitter_add_instr(emit, RegAddRef);
+ const Instr instr = emit_add_instr(emit, RegAddRef);
instr->m_val = exp->emit_var;
}
if(emit->env->func && isa(exp->type, t_function) > 0 &&
emit_push_scope(emit);
CHECK_BB(emit_stmt(emit, stmt->if_body, 1))
emit_pop_scope(emit);
- const Instr op2 = emitter_add_instr(emit, Goto);
+ const Instr op2 = emit_add_instr(emit, Goto);
op->m_val = emit_code_size(emit);
if(stmt->else_body) {
emit_push_scope(emit);
Exp arg = e->args;
if(arg)
CHECK_BB(emit_exp(emit, e->args, 0))
- const Instr instr = emitter_add_instr(emit, PutArgsInMem);
+ const Instr instr = emit_add_instr(emit, PutArgsInMem);
while(arg) {
instr->m_val += arg->type->size;
arg = arg->next;
}
- emitter_add_instr(emit, Goto);
+ emit_add_instr(emit, Goto);
return 1;
}
#define OPTIMIZE_TCO\
OPTIMIZE_TCO
CHECK_BB(emit_exp(emit, stmt->val, 0))
}
- vector_add(&emit->code->stack_return, (vtype)emitter_add_instr(emit, Goto));
+ vector_add(&emit->code->stack_return, (vtype)emit_add_instr(emit, Goto));
return 1;
}
ANN static inline m_bool emit_stmt_continue(const Emitter emit, const Stmt stmt __attribute__((unused))) { GWDEBUG_EXE
- vector_add(&emit->code->stack_cont, (vtype)emitter_add_instr(emit, Goto));
+ vector_add(&emit->code->stack_cont, (vtype)emit_add_instr(emit, Goto));
return 1;
}
ANN static inline m_bool emit_stmt_break(const Emitter emit, const Stmt stmt __attribute__((unused))) { GWDEBUG_EXE
- vector_add(&emit->code->stack_break, (vtype)emitter_add_instr(emit, Goto));
+ vector_add(&emit->code->stack_break, (vtype)emit_add_instr(emit, Goto));
return 1;
}
CHECK_OB((op = _flow(emit, stmt->cond, stmt->self->stmt_type != ae_stmt_while)))
op->m_val = index;
} else {
- const Instr goto_ = emitter_add_instr(emit, Goto);
+ const Instr goto_ = emit_add_instr(emit, Goto);
goto_->m_val = index;
op->m_val = emit_code_size(emit);
}
ANN static void pop_exp(const Emitter emit, Exp e) {
const m_uint size = pop_exp_size(emit, e);
if(size) {
- const Instr instr = emitter_add_instr(emit, RegPop);
+ const Instr instr = emit_add_instr(emit, RegPop);
instr->m_val = size;
}
}
CHECK_BB(emit_exp(emit, stmt->c3, 0))
pop_exp(emit, stmt->c3);
}
- const Instr _goto = emitter_add_instr(emit, Goto);
+ const Instr _goto = emit_add_instr(emit, Goto);
_goto->m_val = index;
op->m_val = emit_code_size(emit);
emit_pop_stack(emit, action_index);
ANN static m_bool emit_stmt_auto(const Emitter emit, const Stmt_Auto stmt) { GWDEBUG_EXE
CHECK_BB(emit_exp(emit, stmt->exp, 0))
- const Instr s1 = emitter_add_instr(emit, MemSetImm);
- const Instr s2 = emitter_add_instr(emit, MemSetImm);
+ const Instr s1 = emit_add_instr(emit, MemSetImm);
+ const Instr s2 = emit_add_instr(emit, MemSetImm);
const m_uint start = emit_code_size(emit);
emit_push_stack(emit);
- const Instr loop = emitter_add_instr(emit, AutoLoopStart);
- const m_uint offset = emit_alloc_local(emit, 2*SZ_INT, 0);
+ const Instr loop = emit_add_instr(emit, AutoLoopStart);
+ const m_uint offset = emit_local(emit, 2*SZ_INT, 0);
stmt->v->offset = offset + SZ_INT;
CHECK_BB(emit_stmt(emit, stmt->body, 1))
const m_uint index = emit_code_size(emit);
- const Instr end = emitter_add_instr(emit, AutoLoopEnd);
- const Instr tgt = emitter_add_instr(emit, Goto);
+ const Instr end = emit_add_instr(emit, AutoLoopEnd);
+ const Instr tgt = emit_add_instr(emit, Goto);
*(m_uint*)end->ptr = emit_code_size(emit);
tgt->m_val = start;
loop->m_val = offset;
emit_push_stack(emit);
CHECK_BB(emit_exp(emit, stmt->cond, 0))
m_int* counter = (m_int*)xcalloc(1, SZ_INT);
- const Instr init = emitter_add_instr(emit, InitLoopCounter);
+ const Instr init = emit_add_instr(emit, InitLoopCounter);
init->m_val = (m_uint)counter;
const m_uint index = emit_code_size(emit);
- const Instr deref = emitter_add_instr(emit, RegPushDeref);
+ const Instr deref = emit_add_instr(emit, RegPushDeref);
deref->m_val2 = SZ_INT;
*(m_int**)deref->ptr = counter;
- emitter_add_instr(emit, PushNull);
- const Instr op = emitter_add_instr(emit, BranchEqInt);
- const Instr dec = emitter_add_instr(emit, DecIntAddr);
+ emit_add_instr(emit, PushNull);
+ const Instr op = emit_add_instr(emit, BranchEqInt);
+ const Instr dec = emit_add_instr(emit, DecIntAddr);
dec->m_val = (m_uint)counter;
CHECK_BB(scoped_stmt(emit, stmt->body, 1))
- const Instr _goto = emitter_add_instr(emit, Goto);
+ const Instr _goto = emit_add_instr(emit, Goto);
_goto->m_val = index;
op->m_val = emit_code_size(emit);
emit_pop_stack(emit, index);
ANN static m_bool emit_stmt_jump(const Emitter emit, const Stmt_Jump stmt) { GWDEBUG_EXE
if(!stmt->is_label)
- stmt->data.instr = emitter_add_instr(emit, Goto);
+ stmt->data.instr = emit_add_instr(emit, Goto);
else {
if(emit->env->sw->cases && !strcmp(s_name(stmt->name), "default")) {
if(!strcmp(s_name(stmt->name), "default"))
if(dyn) {
for(m_uint i = 0; i < dyn; ++i)
CHECK_BB(emit_exp(emit, (Exp)vector_at(&emit->env->sw->exp, i), 0))
- push = emitter_add_instr(emit, SwitchIni);
+ push = emit_add_instr(emit, SwitchIni);
emit->env->sw->vec = new_vector();
push->m_val = (m_uint)emit->env->sw->vec;
push->m_val2 = (m_uint)new_map();
ERR_B(stmt->self->pos, "swith inside an other switch. this is not allowed for now")
emit->env->sw->default_case_index = 0;
emit->env->sw->cases = NULL;
- const Instr instr = emitter_add_instr(emit, BranchSwitch);
+ const Instr instr = emit_add_instr(emit, BranchSwitch);
emit->env->sw->cases = new_map();
instr->m_val2 = (m_uint)emit->env->sw->cases;
emit_push_scope(emit);
- emitter_add_instr(emit, GcIni);
+ emit_add_instr(emit, GcIni);
CHECK_BB(emit_stmt(emit, stmt->stmt, 1))
instr->m_val = emit->env->sw->default_case_index ?: emit_code_size(emit);
- emitter_add_instr(emit, GcIni);
+ emit_add_instr(emit, GcIni);
emit_pop_scope(emit);
if(dyn) {
const Map m = (Map)push->m_val2, map = emit->env->sw->cases;
const Value v = (Value)vector_at(&stmt->values, i);
if(!emit->env->class_def) {
ALLOC_PTR(addr, m_uint, i);
- v->offset = emit_alloc_local(emit, SZ_INT, 0);
+ v->offset = emit_local(emit, SZ_INT, 0);
v->d.ptr = addr;
} else
*(m_uint*)(emit->env->class_def->nspc->class_data + v->offset) = i;
emit_push(emit, stmt->type, stmt->type->nspc, &scope);
} else if(emit->env->class_def) {
if(!GET_FLAG(l->self->d.exp_decl.list->self->value, member))
- stmt->o = emit_alloc_local(emit, stmt->s, 0);
+ stmt->o = emit_local(emit, stmt->s, 0);
} else if(global) {
void* ptr = (void*)xcalloc(1, stmt->s);
l = stmt->l;
}
emit_union_offset(stmt->l, stmt->o);
if(stmt->xid) {
- const Instr instr = emitter_add_instr(emit, RegPop);
+ const Instr instr = emit_add_instr(emit, RegPop);
instr->m_val = SZ_INT;
}
if(stmt->xid || stmt->type_xid || global)
ANN static m_bool emit_dot_static_import_data(const Emitter emit, const Value v, const uint emit_addr) { GWDEBUG_EXE
if(v->d.ptr && GET_FLAG(v, builtin)) { // from C
if(GET_FLAG(v, enum)) {
- const Instr func_i = emitter_add_instr(emit, RegPushImm);
+ const Instr func_i = emit_add_instr(emit, RegPushImm);
*(m_uint*)func_i->ptr = (m_uint)v->d.ptr;
} else {
const m_uint size = v->type->size;
(m_uint)&v->d.ptr : (m_uint)v->d.ptr);
}
} else { // from code
- const Instr push_i = emitter_add_instr(emit, RegPushImm);
+ const Instr push_i = emit_add_instr(emit, RegPushImm);
*(Type*)push_i->ptr = v->owner_class;
const m_uint size = v->type->size;
const Instr instr = emit_kind(emit, size, emit_addr, dotstatic);
s_name(member->xid));
if(is_complex && member->self->emit_var) // skip
return 1;
- const Instr instr = is_complex ? emitter_add_instr(emit, ComplexReal) :
- emitter_add_instr(emit, ComplexImag);
+ const Instr instr = is_complex ? emit_add_instr(emit, ComplexReal) :
+ emit_add_instr(emit, ComplexImag);
instr->m_val = member->self->emit_var;
return 1;
}
ANN static inline void emit_vec_func(const Emitter emit, const Value v) {
- const Instr instr = emitter_add_instr(emit, RegPushImm);
+ const Instr instr = emit_add_instr(emit, RegPushImm);
*(m_uint*)instr->ptr = (m_uint)((Func)vector_at(&v->owner_class->nspc->vtable, v->d.func_ref->vt_index))->code;
}
emit_vec_func(emit, v);
return 1;
}
- const Instr instr = emitter_add_instr(emit, VecMember);
+ const Instr instr = emit_add_instr(emit, VecMember);
instr->m_val2 = v->offset;
instr->m_val = member->self->emit_var;
return 1;
ANN static m_bool emit_vararg_start(const Emitter emit, const m_uint offset) { GWDEBUG_EXE
if(emit->env->func->variadic)
ERR_B(0, "vararg.start already used. this is an error")
- emit->env->func->variadic = emitter_add_instr(emit, VarargTop);
+ emit->env->func->variadic = emit_add_instr(emit, VarargTop);
emit->env->func->variadic->m_val = offset;
emit->env->func->variadic->m_val2 = emit_code_size(emit);
return 1;
ANN static m_bool emit_vararg_end(const Emitter emit, const m_uint offset) { GWDEBUG_EXE
if(!emit->env->func->variadic)
ERR_B(0, "vararg.start not used before vararg.end. this is an error")
- const Instr instr = emitter_add_instr(emit, VarargEnd);
+ const Instr instr = emit_add_instr(emit, VarargEnd);
instr->m_val = offset;
instr->m_val2 = emit->env->func->variadic->m_val2;
emit->env->func->variadic->m_val2 = emit_code_size(emit);
return emit_vararg_start(emit, offset);
if(!strcmp(str, "end"))
return emit_vararg_end(emit, offset);
- const Instr instr = emitter_add_instr(emit, VarargMember);
+ const Instr instr = emit_add_instr(emit, VarargMember);
instr->m_val = offset;
instr->m_val2 = member->self->type->size;
return 1;
}
ANN static m_bool emit_dot_static_func(const Emitter emit, const Func func) { GWDEBUG_EXE
- const Instr func_i = emitter_add_instr(emit, RegPushImm);
+ const Instr func_i = emit_add_instr(emit, RegPushImm);
*(Func*)func_i->ptr = func;
return 1;
}
if(GET_FLAG(func, member)) {
if(emit_exp(emit, member->base, 0) < 0)
ERR_B(member->self->pos, "... in member function") // LCOV_EXCL_LINE
- emitter_add_instr(emit, RegDup);
- const Instr func_i = emitter_add_instr(emit, DotFunc);
+ emit_add_instr(emit, RegDup);
+ const Instr func_i = emit_add_instr(emit, DotFunc);
func_i->m_val = func->vt_index;
}
return 1;
if(emit_exp(emit, member->base, 0) < 0)
ERR_B(member->self->pos, "... in member function") // LCOV_EXCL_LINE
if(!GET_FLAG(value->type->d.func, global))
- emitter_add_instr(emit, RegDup);
+ emit_add_instr(emit, RegDup);
emit_member(emit, value, emit_addr);
return 1;
} else
}
ANN static inline void emit_func_def_global(const Emitter emit, const Value value) { GWDEBUG_EXE
- const Instr set_mem = emitter_add_instr(emit, MemSetImm);
- set_mem->m_val = value->offset = emit_alloc_local(emit, value->type->size, 0);
+ const Instr set_mem = emit_add_instr(emit, MemSetImm);
+ set_mem->m_val = value->offset = emit_local(emit, value->type->size, 0);
set_mem->m_val2 = (m_uint)value->d.func_ref;
}
const m_uint size = value->type->size;
const m_bool obj = isa(value->type, t_object) > 0;
emit->code->stack_depth += size;
- value->offset = emit_alloc_local(emit, size, obj);
+ value->offset = emit_local(emit, size, obj);
} while((a = a->next));
}
const m_uint size = func_def->ret_type->size;
if(size)
emit_kind(emit, size, 0, regpushimm);
- vector_add(&emit->code->stack_return, (vtype)emitter_add_instr(emit, Goto));
+ vector_add(&emit->code->stack_return, (vtype)emit_add_instr(emit, Goto));
}
ANN static void emit_func_def_return(const Emitter emit) { GWDEBUG_EXE
vector_clear(&emit->code->stack_return);
emit_pop_scope(emit);
if(GET_FLAG(emit->env->func, pure))
- emitter_add_instr(emit, MemoizeStore);
- emitter_add_instr(emit, FuncReturn);
+ emit_add_instr(emit, MemoizeStore);
+ emit_add_instr(emit, FuncReturn);
}
ANN static void emit_func_def_code(const Emitter emit, const Func func) { GWDEBUG_EXE
}
ANN inline void emit_class_finish(const Emitter emit, const Nspc nspc) { GWDEBUG_EXE
- emitter_add_instr(emit, FuncReturn);
+ emit_add_instr(emit, FuncReturn);
nspc->pre_ctor = emit_code(emit);
}