From 3368fccdeeb98a25d8fc7fd306b746fe436282ca Mon Sep 17 00:00:00 2001 From: fennecdjay Date: Thu, 21 Feb 2019 20:34:33 +0100 Subject: [PATCH] :art: Improve func call type check, enforce expression type --- include/opcode.h | 2 -- opcode.txt | 1 - src/emit/emit.c | 12 +++++++++--- src/parse/check.c | 4 +++- src/vm/vm.c | 5 +---- tests/{tree => error}/template_ternary.gw | 1 + 6 files changed, 14 insertions(+), 11 deletions(-) rename tests/{tree => error}/template_ternary.gw (56%) diff --git a/include/opcode.h b/include/opcode.h index 3eb434bc..b10319aa 100644 --- a/include/opcode.h +++ b/include/opcode.h @@ -18,7 +18,6 @@ enum { RegDup, MemSetImm, RegPop, - RegPushPtr, RegPushMe, RegPushMaybe, FuncReturn, @@ -174,7 +173,6 @@ enum { #define RegDup (f_instr)RegDup #define MemSetImm (f_instr)MemSetImm #define RegPop (f_instr)RegPop -#define RegPushPtr (f_instr)RegPushPtr #define RegPushMe (f_instr)RegPushMe #define RegPushMaybe (f_instr)RegPushMaybe #define FuncReturn (f_instr)FuncReturn diff --git a/opcode.txt b/opcode.txt index db65393b..bd715083 100644 --- a/opcode.txt +++ b/opcode.txt @@ -15,7 +15,6 @@ RegPushBase4 RegDup MemSetImm RegPop -RegPushPtr RegPushMe RegPushMaybe FuncReturn diff --git a/src/emit/emit.c b/src/emit/emit.c index 9e0388d3..0351e09e 100644 --- a/src/emit/emit.c +++ b/src/emit/emit.c @@ -708,9 +708,15 @@ assert(_instr->execute == DotTmpl); _instr->m_val2 = strlen(c); return GW_OK; } - const Instr instr = emit_add_instr(emit, RegPushPtr); - return !!(instr->m_val = (m_uint)f->code); + const Instr _instr = (Instr)vector_back(&emit->code->instr); + if(_instr->opcode == (m_bit)(m_uint)RegPushImm) + return !!(_instr->m_val = (m_uint)f->code); + assert(_instr->opcode == (m_bit)(m_uint)RegPushBase); + _instr->m_val = (m_uint)f->code; + _instr->opcode = (m_bit)(m_uint)RegPushImm; + return GW_OK; } + static m_bool emit_template_code(const Emitter emit, const Func f) { if(GET_FLAG(f, ref)) CHECK_BB(traverse_template(emit->env, f->value_ref->owner_class->def)) @@ -1574,7 +1580,7 @@ ANN /*static */m_bool emit_func_def(const Emitter emit, const Func_Def func_def) emit_func_def_code(emit, func); emit->env->func = former; emit_pop_code(emit); - if(!emit->env->class_def && !GET_FLAG(func_def, global)) + if(!emit->env->class_def && !GET_FLAG(func_def, global) && !func_def->tmpl) emit_func_def_global(emit, func->value_ref); MEMOIZE_INI return GW_OK; diff --git a/src/parse/check.c b/src/parse/check.c index 818db81b..f9a6ab58 100644 --- a/src/parse/check.c +++ b/src/parse/check.c @@ -364,6 +364,9 @@ ANN2(1, 2) static Func find_func_match(const Env env, const Func up, const Exp e } ANN static m_bool check_call(const Env env, const Exp_Call* exp) { + ae_exp_t et = exp->func->exp_type; + if(et != ae_exp_primary && et != ae_exp_dot && et != ae_exp_cast) + ERR_B(exp->func->pos, "invalid expression for function call.") CHECK_OB(check_exp(env, exp->func)) return exp->args ? !!check_exp(env, exp->args) : -1; } @@ -553,7 +556,6 @@ ANN static Type check_exp_call_template(const Env env, const Exp_Call *exp) { Tmpl_Call tmpl = { .types=tl[0] }; const Exp_Call tmp_func = { .func=call, .args=args, .tmpl=&tmpl, .self=base }; const Func func = get_template_func(env, &tmp_func, base, value); -//exit(2); if(base->exp_type == ae_exp_call) base->d.exp_call.m_func = func; else // if(base->exp_type == ae_exp_binary) diff --git a/src/vm/vm.c b/src/vm/vm.c index edb3e093..bb1a78e7 100644 --- a/src/vm/vm.c +++ b/src/vm/vm.c @@ -228,7 +228,7 @@ ANN void vm_run(const VM* vm) { &&baseint, &&basefloat, &&baseother, &&baseaddr, &®dup, &&memsetimm, - &®pop, &®pushptr, &®pushme, &®pushmaybe, + &®pop, &®pushme, &®pushmaybe, &&funcreturn, &&_goto, &&allocint, &&allocfloat, &&allocother, &&allocaddr, @@ -367,9 +367,6 @@ memsetimm: regpop: reg -= instr->m_val; DISPATCH(); -regpushptr: - *(m_uint*)(reg-SZ_INT) = instr->m_val; - DISPATCH() regpushme: *(M_Object*)reg = shred->info->me; reg += SZ_INT; diff --git a/tests/tree/template_ternary.gw b/tests/error/template_ternary.gw similarity index 56% rename from tests/tree/template_ternary.gw rename to tests/error/template_ternary.gw index 60687714..79285532 100644 --- a/tests/tree/template_ternary.gw +++ b/tests/error/template_ternary.gw @@ -1,3 +1,4 @@ +// [contains] invalid expression for function call template<~A~> function void test(A a){} -- 2.43.0