From: fennecdjay Date: Sun, 10 Mar 2019 10:58:46 +0000 (+0100) Subject: :bug: Fix member Spork/Lambda X-Git-Tag: nightly~2753^2~17 X-Git-Url: http://10.11.0.4:5575/?a=commitdiff_plain;h=ba5a10934bf81ffe6f9fc549014ddf0ccdb27b6d;p=gwion.git :bug: Fix member Spork/Lambda --- diff --git a/ast b/ast index b10c0fd3..9dd3e374 160000 --- a/ast +++ b/ast @@ -1 +1 @@ -Subproject commit b10c0fd3b94edab4cb7881f9454529ef536dc5c6 +Subproject commit 9dd3e3748de42cc3abe9006d5220b7aec821b612 diff --git a/src/emit/emit.c b/src/emit/emit.c index d80b0d4c..11677599 100644 --- a/src/emit/emit.c +++ b/src/emit/emit.c @@ -906,13 +906,15 @@ ANN static m_bool emit_exp_if(const Emitter emit, const Exp_If* exp_if) { GWDEBU ANN static m_bool emit_exp_lambda(const Emitter emit, const Exp_Lambda * lambda) { GWDEBUG_EXE if(lambda->def) { - const m_uint scope = !lambda->owner ? - emit->env->scope->depth : emit_push_type(emit, lambda->owner); - CHECK_BB(emit_func_def(emit, lambda->def)) - const Instr instr = emit_add_instr(emit, RegPushImm); - instr->m_val = (m_uint)lambda->def->func->code; - if(lambda->owner) - emit_pop(emit, scope); + const m_uint scope = !lambda->owner ? + emit->env->scope->depth : emit_push_type(emit, lambda->owner); + CHECK_BB(emit_func_def(emit, lambda->def)) + if(GET_FLAG(lambda->def, member)) + emit_add_instr(emit, RegPushMem); + const Instr instr = emit_add_instr(emit, RegPushImm); + instr->m_val = (m_uint)lambda->def->func->code; + if(lambda->owner) + emit_pop(emit, scope); } else emit_add_instr(emit, RegPushImm); return GW_OK; @@ -929,7 +931,7 @@ ANN2(1) static m_bool emit_exp(const Emitter emit, Exp exp, const m_bool ref) { const Instr instr = emit_add_instr(emit, RegAddRef); instr->m_val = exp->emit_var; } - if(emit->env->func && isa(exp->type, t_function) > 0 && + if(emit->env->func && isa(exp->type, t_lambda) < 0 && isa(exp->type, t_function) > 0 && !GET_FLAG(exp->type->d.func->value_ref->d.func_ref, pure)) UNSET_FLAG(emit->env->func, pure); } while((exp = exp->next)); diff --git a/src/parse/check.c b/src/parse/check.c index 060338f1..f3e51c47 100644 --- a/src/parse/check.c +++ b/src/parse/check.c @@ -319,18 +319,18 @@ ANN static m_bool func_match_inner(const Env env, const Exp e, const Type t, const m_bool match = (specific ? e->type == t : isa(e->type, t) > 0) && e->type->array_depth == t->array_depth && array_base(e->type) == array_base(t); - if(!match) { - if(e->type == t_lambda && isa(t, t_fptr) > 0) { - const Type owner = nspc_lookup_type1(t->owner->parent, - insert_symbol(t->owner->name)); - return check_lambda(env, owner, &e->d.exp_lambda, t->d.func->def); + if(!match) { + if(e->type == t_lambda && isa(t, t_fptr) > 0) { + const Type owner = nspc_lookup_type1(t->owner->parent, + insert_symbol(t->owner->name)); + return check_lambda(env, owner, &e->d.exp_lambda, t->d.func->def); + } + if(implicit) { + const struct Implicit imp = { e, t }; + struct Op_Import opi = { .op=op_impl, .lhs=e->type, .rhs=t, .data=(m_uint)&imp }; + return op_check(env, &opi) ? 1 : -1; } } - if(implicit) { - const struct Implicit imp = { e, t }; - struct Op_Import opi = { .op=op_impl, .lhs=e->type, .rhs=t, .data=(m_uint)&imp }; - return op_check(env, &opi) ? 1 : -1; - } return match ? 1 : -1; } @@ -585,6 +585,8 @@ ANN static Type check_lambda_call(const Env env, const Exp_Call *exp) { ERR_O(exp->self->pos, "argument number does not match for lambda") l->def = new_func_def(NULL, l->name, l->arg, l->code, 0); CHECK_BO(traverse_func_def(env, l->def)) + if(env->class_def) + SET_FLAG(l->def, member); set_call(exp->self, l->def->func); return l->def->ret_type ?: (l->def->ret_type = t_void); } @@ -752,7 +754,8 @@ ANN static inline Type check_exp(const Env env, const Exp exp) { GWDEBUG_EXE Exp curr = exp; do { CHECK_OO((curr->type = exp_func[curr->exp_type](env, &curr->d))) - if(env->func && isa(curr->type, t_function) > 0 && !GET_FLAG(curr->type->d.func, pure)) + if(env->func && isa(curr->type, t_lambda) < 0 && isa(curr->type, t_function) > 0 && + !GET_FLAG(curr->type->d.func, pure)) UNSET_FLAG(env->func, pure); } while((curr = curr->next)); return exp->type; diff --git a/src/vm/vm.c b/src/vm/vm.c index 70c83eb5..94d2ed56 100644 --- a/src/vm/vm.c +++ b/src/vm/vm.c @@ -602,6 +602,7 @@ funcmember: Except(shred, "StackOverflow"); shred->mem = m; shred->pc = pc; + shred->code = code; if(GET_FLAG(a.code, ctor)) { register const f_xtor f = (f_xtor)a.code->native_func; f(*(M_Object*)m, NULL, shred);// callnat @@ -633,7 +634,7 @@ funcstatic: register const f_sfun f = (f_sfun)a.code->native_func; f(reg, shred); funcend: - reg += instr->m_val; + shred->reg = reg += instr->m_val; funcend2: shred->mem = mem; if(!s->curr)break; @@ -650,7 +651,7 @@ sporkfunc: a.child->reg += instr->m_val; DISPATCH() sporkthis: - *(M_Object*)a.child->reg = *(M_Object*)(reg + instr->m_val); + *(M_Object*)a.child->reg = *(M_Object*)(reg -SZ_INT + instr->m_val); a.child->reg += SZ_INT; DISPATCH() sporkexp: diff --git a/tests/error/lambda_mismatch1.gw b/tests/error/lambda_mismatch1.gw index 6b921697..813b1d7e 100644 --- a/tests/error/lambda_mismatch1.gw +++ b/tests/error/lambda_mismatch1.gw @@ -1,2 +1,2 @@ // [contains] argument number does not match for lambda -`a b`{ <<>>; }(1); +\a b { <<>>; }(1); diff --git a/tests/error/lambda_mismatch2.gw b/tests/error/lambda_mismatch2.gw index 98c67f5d..8ea82eed 100644 --- a/tests/error/lambda_mismatch2.gw +++ b/tests/error/lambda_mismatch2.gw @@ -1,4 +1,4 @@ // [contains] argument number does not match for lambda typedef void ptr_t(int i); -`a b`{ <<>>; } @=> ptr_t ptr; +\a b { <<>>; } @=> ptr_t ptr; ptr(2); diff --git a/tests/error/lambda_mismatch3.gw b/tests/error/lambda_mismatch3.gw index 74b76018..91c91869 100644 --- a/tests/error/lambda_mismatch3.gw +++ b/tests/error/lambda_mismatch3.gw @@ -1,6 +1,6 @@ // [contains] argument number does not match for lambda typedef void ptr_t(int i); -`a b`{ <<>>; } @=> ptr_t ptr; +\a b { <<>>; } @=> ptr_t ptr; fun void test(ptr_t ptr) { ptr(2); } diff --git a/tests/new/lambda.gw b/tests/new/lambda.gw index 08427245..86b744e5 100644 --- a/tests/new/lambda.gw +++ b/tests/new/lambda.gw @@ -1,6 +1,6 @@ class C { typedef void ptr_t(int i,int j); - `a b` { <<>>; } @=> ptr_t ptr; + \a b { <<>>; } @=> ptr_t ptr; // `a,b` { <<<"test">>>; } @=> // ptr_t ptr; // ptr(1,2); diff --git a/tests/new/lambda2.gw b/tests/new/lambda2.gw index 4f827119..f45c8fc6 100644 --- a/tests/new/lambda2.gw +++ b/tests/new/lambda2.gw @@ -1,6 +1,6 @@ class C { typedef void ptr_t(int i); -`a` { <<>>; } @=> +\a { <<>>; } @=> ptr_t ptr; //ptr(3); fun void t1(int i) { <<>>; } diff --git a/tests/new/lambda3.gw b/tests/new/lambda3.gw index f9497842..990d0f9b 100644 --- a/tests/new/lambda3.gw +++ b/tests/new/lambda3.gw @@ -1,2 +1,2 @@ 12 => int i; -`a b` { <<<"i: ", i, " ", a, " ", b>>>; }(1,2); +\a b { <<<"i: ", i, " ", a, " ", b>>>; }(1,2); diff --git a/util b/util index fa9f700b..55e2a6ba 160000 --- a/util +++ b/util @@ -1 +1 @@ -Subproject commit fa9f700bb617e6368150c9a29ffac4c6d5256d2d +Subproject commit 55e2a6ba6d382f8dcb27661773df82de5fe9c470