From 3d894c23dc0f41a656969ededb97053afaa39bea Mon Sep 17 00:00:00 2001 From: fennecdjay Date: Sat, 30 Mar 2019 17:19:40 +0100 Subject: [PATCH] :bug: Fix Dtor --- src/emit/emit.c | 1 + src/lib/instr.c | 2 +- src/lib/object.c | 4 +--- src/parse/scan2.c | 8 +++++--- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/emit/emit.c b/src/emit/emit.c index eeac008d..2976daa0 100644 --- a/src/emit/emit.c +++ b/src/emit/emit.c @@ -1634,6 +1634,7 @@ ANN static void emit_func_def_code(const Emitter emit, const Func func) { GWDEBU if(GET_FLAG(func->def, dtor)) { emit->env->class_def->nspc->dtor = func->code; Instr instr = (Instr)vector_back(func->code->instr); + instr->opcode = eOP_MAX; instr->execute = DTOR_EOC; ADD_REF(func->code) } diff --git a/src/lib/instr.c b/src/lib/instr.c index 81cf6e99..40c24d35 100644 --- a/src/lib/instr.c +++ b/src/lib/instr.c @@ -22,8 +22,8 @@ INSTR(DTOR_EOC) { GWDEBUG_EXE o->type_ref = o->type_ref->parent; o->ref = 1; _release(o, shred); - _release(shred->info->me, shred); vm_shred_exit(shred); + _release(shred->info->me, shred); } /* branching */ diff --git a/src/lib/object.c b/src/lib/object.c index f9968b75..9303d0e5 100644 --- a/src/lib/object.c +++ b/src/lib/object.c @@ -59,11 +59,9 @@ ANN static void handle_dtor(const M_Object object, const VM_Shred shred) { const Type t = object->type_ref; const VM_Shred sh = new_vm_shred(t->nspc->dtor); ADD_REF(t->nspc->dtor); - memcpy(sh->base, shred->base, SIZEOF_MEM); + sh->base = shred->base; memcpy(sh->reg, shred->reg, SIZEOF_REG); *(M_Object*)sh->mem = object; - sh->mem += SZ_INT; - *(M_Object*)sh->mem = object; vm_add_shred(shred->info->vm, sh); ++sh->info->me->ref; } diff --git a/src/parse/scan2.c b/src/parse/scan2.c index c4818740..572cf59e 100644 --- a/src/parse/scan2.c +++ b/src/parse/scan2.c @@ -429,11 +429,13 @@ ANN static m_bool scan2_func_def_code(const Env env, const Func_Def f) { GWDEBUG return GW_OK; } -ANN static void scan2_func_def_flag(const Func_Def f) { GWDEBUG_EXE +ANN static void scan2_func_def_flag(const Env env, const Func_Def f) { GWDEBUG_EXE if(!GET_FLAG(f, builtin)) SET_FLAG(f->func, pure); - if(GET_FLAG(f, dtor)) + if(GET_FLAG(f, dtor)) { + SET_FLAG(env->class_def, dtor); SET_FLAG(f->func, dtor); + } } ANN static m_str func_tmpl_name(const Env env, const Func_Def f) { @@ -468,7 +470,7 @@ ANN2(1,2,4) static Value func_create(const Env env, const Func_Def f, const Func func = scan_new_func(env, f, func_name); nspc_add_func(env->curr, insert_symbol(func->name), func); const Value v = func_value(env, func, overload); - scan2_func_def_flag(f); + scan2_func_def_flag(env, f); if(GET_FLAG(f, builtin)) CHECK_BO(scan2_func_def_builtin(func, func->name)) if(GET_FLAG(func, member)) -- 2.43.0