]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve special types
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Fri, 11 Sep 2020 10:51:34 +0000 (12:51 +0200)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Fri, 11 Sep 2020 10:51:34 +0000 (12:51 +0200)
include/env/type.h
include/parse.h
src/emit/emit.c
src/env/type_special.c
src/import/oper.c
src/lib/object.c
src/lib/opfunc.c
src/parse/check.c

index 44cc592a064d5eb5c6b63adeabdc90c72bacebca..0ff7e13ffd7dc8a00ecebfc5f816de40a54c945c 100644 (file)
@@ -54,6 +54,14 @@ ANN static inline Type get_gack(Type t) {
   return t; // unreachable
 }
 
+__attribute__((returns_nonnull))
+ANN Type unflag_type(const Type t);
+__attribute__((returns_nonnull))
+ANN Type get_type(const Type t);
+ANN static inline int is_special(const Type t) {
+  return GET_FLAG(t, nonnull) || GET_FLAG(t, force);
+}
+
 typedef enum {
   et_void, et_int, et_bool, et_char, et_float,
   et_null, et_compound, et_object, et_shred, et_fork, et_event, et_ugen, et_string, et_ptr, et_array, et_gack,
index 320db9b47d33018d0521e469b132471746f29cf2..6288998451bb3fc14ac1c6c5bedfc3ec934f1c8a 100644 (file)
@@ -81,10 +81,6 @@ xxx_cdef(traverse)
 
 ANN m_bool scanx_fdef(const Env, void *, const Func_Def, const _exp_func);
 
-__attribute__((returns_nonnull))
-ANN Type unflag_type(const Type t);
-__attribute__((returns_nonnull))
-ANN Type get_type(const Type t);
 ANN m_bool check_subscripts(const Env, const Array_Sub, const m_bool is_decl);
 ANN m_bool check_implicit(const Env env, const Exp e, const Type t);
 ANN m_bool ensure_traverse(const Env env, const Type t);
index f79bacdf8bd0e1d0a83b9e323acf112a79a7aeed..dc582028732edf2a70f7ea6175bfa37559d1f794 100644 (file)
@@ -166,7 +166,7 @@ ANN m_uint emit_local(const Emitter emit, const Type t) {
 ANN void emit_ext_ctor(const Emitter emit, const Type t);
 
 ANN static inline void maybe_ctor(const Emitter emit, const Type t) {
-  if(!GET_FLAG(t, nonnull) && GET_FLAG(t, ctor))
+  if(!is_special(t) && GET_FLAG(t, ctor))
     emit_ext_ctor(emit, t);
 }
 
@@ -891,12 +891,6 @@ ANN static m_bool emit_exp_post(const Emitter emit, const Exp_Postfix* post) {
   return op_emit_bool(emit, &opi);
 }
 
-ANN static inline m_bool is_special(const Emitter emit, const Type t) {
-  return isa(t, emit->gwion->type[et_object]) < 0 &&
-         isa(t, emit->gwion->type[et_class]) < 0  ?
-    GW_OK : GW_ERROR;
-}
-
 ANN static inline m_bool traverse_emit_func_def(const Emitter emit, const Func_Def fdef) {
   if(!fdef->base->ret_type)
     CHECK_BB(traverse_func_def(emit->env, fdef))
@@ -1080,7 +1074,7 @@ ANN Instr emit_exp_call1(const Emitter emit, const Func f) {
         instr->m_val2 = -SZ_INT;
       }
     }
-  } else if((f->value_ref->from->owner_class && is_special(emit, f->value_ref->from->owner_class) > 0) ||
+  } else if((f->value_ref->from->owner_class && GET_FLAG(f->value_ref->from->owner_class, struct)) ||
         !f->value_ref->from->owner_class || (GET_FLAG(f, template) &&
         !is_fptr(emit->gwion, f->value_ref->type)))
     push_func_code(emit, f);
index baea495ecfa4c20c50fbc892fae5d1fa848505f4..9a7c8143021bf7e44cc61c4da211a219d466c72c 100644 (file)
@@ -22,7 +22,7 @@ ANN static Type specialtype_create(const Env env, const SpecialType *s) {
     ADD_REF(t->nspc)
   t->name = s_name(s->name);
   t->flag = s->type->flag | s->flag;
-  t->e->parent = s->type;
+  t->e->parent = unflag_type(s->type);
   nspc_add_type_front(s->type->e->owner, s->name, t);
   mk_class(env, t);
   return t;
@@ -59,4 +59,3 @@ ANN Type special_type(const Env env, const Type t, const uint st_type) {
   return nspc_lookup_type1(t->e->owner, s.name) ?:
     specialtype_create(env, &s);
 }
-
index 79b41d8e7d2257f62dca4e8525b36356b3adb338..adcb6004f3170f48197254b6bf9dc3de6e9fa792 100644 (file)
@@ -25,15 +25,15 @@ ANN static Type _get_type(const Gwi gwi, const m_str s) {
   return t;
 }
 
-ANN2(1) static inline Type get_type(const Gwi gwi, const m_str str) {
+ANN2(1) static inline Type gwi_get_type(const Gwi gwi, const m_str str) {
   return str ? _get_type(gwi, str) : NULL;
 }
 
 ANN2(1,2) static int import_op(const Gwi gwi, const struct OperCK* op,
     const f_instr f) {
-  const Type lhs = get_type(gwi, op->lhs),
-             rhs = get_type(gwi, op->rhs),
-             ret = get_type(gwi, op->ret);
+  const Type lhs = gwi_get_type(gwi, op->lhs),
+             rhs = gwi_get_type(gwi, op->rhs),
+             ret = gwi_get_type(gwi, op->ret);
   const struct Op_Func opfunc = { .ck=op->ck, .em=op->em };
   const struct Op_Import opi = { .lhs=lhs, .rhs=rhs, .ret=ret,
     .func=&opfunc, .data=(uintptr_t)f, .pos=gwi->loc, .op=op->sym };
index 7755284588ee23339a32020201a0c2494bead914..4127707a71bacc3861aae72627a868b19bef0673 100644 (file)
@@ -65,9 +65,7 @@ ANN void __release(const M_Object o, const VM_Shred shred) {
   MemPool p = shred->info->mp;
   Type t = o->type_ref;
   do {
-    if(GET_FLAG(t, nonnull))
-      t = t->e->parent;
-    if(!t->nspc)
+    if(!t->nspc || is_special(t))
       continue;
     struct scope_iter iter = { t->nspc->info->value, 0, 0 };\
     Value v;
index 5f98c8fbe0cc8f32f15daa8e9f10e01b0d97f3af..444b49c149df7a495aaaae99d64ef761386ea069 100644 (file)
@@ -74,10 +74,18 @@ OP_CHECK(opck_post) {
   return post->exp->info->type;
 }
 
+ANN Type check_td(const Env env, Type_Decl *td);
+ANN static inline Type check_new_td(const Env env, Type_Decl *td) {
+  if(!td->exp)
+    return known_type(env, td);
+  DECL_OO(const Type, t, = check_exp(env, td->exp))
+  return actual_type(env->gwion, t);
+}
+
 OP_CHECK(opck_new) {
   const Exp_Unary* unary = (Exp_Unary*)data;
   SET_FLAG(unary->td, ref);
-  DECL_ON(const Type, t, = known_type(env, unary->td))
+  DECL_ON(const Type, t, = check_new_td(env, unary->td))
   if(isa(t, env->gwion->type[et_object]) < 0)
     ERR_N(exp_self(unary)->pos, _("can't use 'new' on non-object types...\n"))
   if(type_ref(t))
index b00a7330ffe7df8443dc4a924efc8f79bf85def4..85b04535e1b850c1a928076bba54853d959cc193 100644 (file)
@@ -88,7 +88,7 @@ ANN static inline m_bool check_td_exp(const Env env, Type_Decl *td) {
   RET_NSPC(traverse_exp(env, td->exp))
 }
 
-ANN static Type check_td(const Env env, Type_Decl *td) {
+ANN Type check_td(const Env env, Type_Decl *td) {
   CHECK_BO(check_td_exp(env, td))
   const Type t = actual_type(env->gwion, td->exp->info->type);
   assert(t);