]> Nishi Git Mirror - gwion.git/commitdiff
:art: dtor and gack now operators
authorfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 26 Sep 2019 03:21:08 +0000 (05:21 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 26 Sep 2019 03:21:08 +0000 (05:21 +0200)
ast
examples/class_coverage.gw
examples/dtor.gw
src/emit/emit.c
src/lib/tuple.c
src/parse/scan1.c
src/parse/scan2.c
tests/error/dtor_outside_class.gw
tests/new/dtor.gw
tests/new/extend_template_union.gw

diff --git a/ast b/ast
index c63343d7bf486a47001f32d71b8160bf997ae4d2..a196ff3fb91adc7c205c23fd4e07946073e5a308 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit c63343d7bf486a47001f32d71b8160bf997ae4d2
+Subproject commit a196ff3fb91adc7c205c23fd4e07946073e5a308
index a9156aeaae337b677a2577a1210a24cca22e96e6..240b88acc1c627ac48e0b8acaa8db68601bf57c4 100644 (file)
@@ -7,7 +7,7 @@ class C
   Vec3 v;
   Vec4 w;
        Object o;
-       dtor { <<< "dtor" >>>; }
+       operator @dtor void () { <<< "dtor" >>>; }
 }
 
 C c;
index 4c3e45f56faf13499c2ef65ee4b526d176a61702..a4779ea599ec2b37727937456d2f521694b25309 100644 (file)
@@ -1,6 +1,6 @@
 class C
 {
-  dtor {<<< 1 >>>;}
+  operator @dtor void () {<<< 1 >>>;}
 }
 
 C c;
index 8f1eddd6d17aa1f925f0eabf4a0ba7913f688989..08c096b8961cd639ccee45608fb49ec597e6ac1e 100644 (file)
@@ -576,7 +576,7 @@ ANN static m_bool prim_gack(const Emitter emit, const Exp_Primary* primary) {
 
 ANN static m_bool prim_unpack(const Emitter emit NUSED, const Exp_Primary* primary) {
 // TODO err_msg
-  return primary->d.tuple.ok ? GW_OK : GW_ERROR;
+  return exp_self(primary)->emit_var ? GW_OK : GW_ERROR;
 }
 
 static const _exp_func prim_func[] = {
@@ -1070,7 +1070,8 @@ if(is_spork) {
 } else {
     const Instr spork = emit_add_instr(emit, is_spork ? SporkExp : ForkEnd);
     spork->m_val = exp_self(unary)->emit_var;
-//    spork->m_val2 = f->def->base->ret_type->size;
+    if(!(spork->m_val = exp_self(unary)->emit_var))
+return NULL;// err_msg
 }
   } else {
     if(GET_FLAG(f, member) && is_fptr(emit->gwion, f->value_ref->type)) {
@@ -1082,7 +1083,8 @@ if(is_spork) {
     } else
       emit_exp_spork_finish(emit, f->def->stack_depth);
     const Instr end = emit_add_instr(emit, is_spork ? SporkEnd : ForkEnd);
-    end->m_val = exp_self(unary)->emit_var;
+    if(!is_spork && !(end->m_val = exp_self(unary)->emit_var))
+      return NULL;// err_msg
     end->m_val2 = f->def->base->ret_type->size;
   }
   return ini;
@@ -1746,14 +1748,13 @@ ANN static void emit_func_def_return(const Emitter emit) {
 }
 
 ANN static void emit_func_def_code(const Emitter emit, const Func func) {
-  func->code = finalyze(emit, !GET_FLAG(func->def, dtor) ? FuncReturn : DTOR_EOC);
-  if(GET_FLAG(func->def, dtor)) {
+  const m_bool is_dtor = func->def->base->xid == insert_symbol("@dtor");// could be get flag
+  func->code = finalyze(emit, !is_dtor ? FuncReturn : DTOR_EOC);
+  if(is_dtor) {
     emit->env->class_def->nspc->dtor = func->code;
     ADD_REF(func->code)
-  } else if(func->def->base->xid == insert_symbol("@gack")) {
+  } else if(func->def->base->xid == insert_symbol("@gack"))
     emit->env->class_def->e->gack = func->code;
-    ADD_REF(func->code)
-  }
 }
 
 ANN static m_bool _fdef_body(const Emitter emit, const Func_Def fdef) {
index a2c11fb98f310fd9f6ae5b0be9e37159516d098b..a1f9474a49f2ba9e7438849f186f9d5b7e1b6103 100644 (file)
@@ -147,7 +147,7 @@ static OP_CHECK(opck_at_tuple) {
       }
       ++i;
     } while((e = e->next));
-    bin->rhs->d.exp_primary.d.tuple.ok = 1;
+    bin->rhs->emit_var = 1;
     return bin->lhs->type;
   }
   return opck_at_object_tuple(env, data, mut);
index 092f6fb22e3c405a947c494a9d213bbed8637c6a..2d85ffcbd4d6d540a8511bea87f1e3100e56b0b0 100644 (file)
@@ -359,9 +359,11 @@ ANN m_bool scan1_func_def(const Env env, const Func_Def fdef) {
     CHECK_BB(env_storage(env, fdef->flag, td_pos(fdef->base->td)))
   if(tmpl_base(fdef->base->tmpl))
     return GW_OK;
-  if(!env->class_def && (GET_FLAG(fdef, dtor) || fdef->base->xid == insert_symbol("@gack")))
-    ERR_B(td_pos(fdef->base->td), _("'%s' must be in class def!!"), s_name(fdef->base->xid))
-  if(GET_FLAG(fdef, op) && env->class_def)
+  if(fdef->base->xid == insert_symbol("@dtor") || fdef->base->xid == insert_symbol("@gack")) {
+    if(!env->class_def)
+      ERR_B(td_pos(fdef->base->td), _("'%s' must be in class def!!"), s_name(fdef->base->xid))
+    if(fdef->base->args)exit(3);
+  } else if(GET_FLAG(fdef, op) && env->class_def)
     SET_FLAG(fdef, static);
   struct Func_ fake = { .name=s_name(fdef->base->xid) }, *const former = env->func;
   env->func = &fake;
index ca1544d86b81f272511413685fb534c8e5aaf11b..2e649635bcd3741c8f61e6c4903da7d256568e06 100644 (file)
@@ -409,14 +409,15 @@ ANN static m_bool scan2_func_def_op(const Env env, const Func_Def f) {
   const m_str str = s_name(f->base->xid);
   const uint is_unary = GET_FLAG(f, unary) + (!strcmp(str, "@conditionnal") || !strcmp(str, "@unconditionnal"));
   const Type l = is_unary ? NULL :
-    f->base->args->var_decl->value->type;
-  const Type r = is_unary ? f->base->args->var_decl->value->type :
+    f->base->args ? f->base->args->var_decl->value->type : NULL;
+  const Type r = f->base->args ? is_unary ? f->base->args->var_decl->value->type :
     f->base->args->next ? f->base->args->next->var_decl->value->type :
-    f->base->ret_type;
+    f->base->ret_type : NULL;
   struct Op_Import opi = { .op=f->base->xid, .lhs=l, .rhs=r, .ret=f->base->ret_type,
                            .pos=f->pos, .data=(uintptr_t)f->base->func };
-  if(!strcmp(str, "@implicit"))
+  if(!strcmp(str, "@implicit")) {
     opi.ck = opck_usr_implicit;
+  }
   CHECK_BB(add_op(env->gwion, &opi))
   operator_set_func(&opi);
   return GW_OK;
@@ -433,10 +434,8 @@ ANN static m_bool scan2_func_def_code(const Env env, const Func_Def f) {
 ANN static void scan2_func_def_flag(const Env env, const Func_Def f) {
   if(!GET_FLAG(f, builtin))
     SET_FLAG(f->base->func, pure);
-  if(GET_FLAG(f, dtor)) {
+  if(f->base->xid == insert_symbol("@dtor"))
     SET_FLAG(env->class_def, dtor);
-    SET_FLAG(f->base->func, dtor);
-  }
 }
 
 ANN static m_str func_tmpl_name(const Env env, const Func_Def f) {
index 612a8474c889b572b4af36d9005a534ad1bf3bd4..15859d05b85c1ae93c4647dd61f188558543c15f 100644 (file)
@@ -1,2 +1,2 @@
-#! [contains] 'dtor' must be in class def!!
-dtor {}
+#! [contains] '@dtor' must be in class def!!
+operator @dtor void () {}
index c6ca2f188ec3960900bd8442cff482a85a17f4ba..d549ea5032f74d7e53950c5f6414ece5a2637772 100644 (file)
@@ -1,11 +1,11 @@
 class <~A~>C {
-  dtor { <<< __func__ >>>; }
+  operator @dtor void { <<< __func__ >>>; }
 }
 class <~A~>D extends <~A~>C {
-  dtor { <<< __func__ >>>; }
+  operator @dtor { <<< __func__ >>>; }
 }
 class E extends <~int~>D {
-  dtor { <<< __func__ >>>; }
+  operator @dtor { <<< __func__ >>>; }
 }
 
 E e;
index f9e9de1b6a5d719d18ec038e957e65d119f74126..e744bd1ed5a1b17b9317e16015ef401009231564 100644 (file)
@@ -7,7 +7,7 @@ union <~A~>U {
 #!<<< u.i >>>;
 class <~A~>C extends <~A~>U {
   fun void test() { <<< this >>>; }
-  dtor { <<< __func__ >>>; }
+  operator @dtor void () { <<< __func__ >>>; }
 }
 
 <~float~>C c;