]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix a few bug [thanks A.F.L]
authorfennecdjay <astor.jeremie@wanadoo.fr>
Sat, 24 Aug 2019 09:57:01 +0000 (11:57 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Sat, 24 Aug 2019 09:57:01 +0000 (11:57 +0200)
src/emit/emit.c
src/lib/object.c
src/oo/value.c
src/parse/check.c
src/parse/scan1.c
src/parse/template.c
src/parse/type_decl.c

index 26dc49aa99679bee474affd6b74707919204f0b4..9c67e35a1efde63f359c3fa0b79ca71956d3f9ba 100644 (file)
@@ -1837,7 +1837,7 @@ ANN static m_bool emit_parent(const Emitter emit, const Class_Def cdef) {
   const Type base = parent->e->d.base_type;
   if(base && !GET_FLAG(base, emit))
     CHECK_BB(emit_cdef(emit, base->e->def))
-  return !GET_FLAG(parent, emit) ? emit_cdef(emit, parent->e->def) : GW_OK;
+  return !GET_FLAG(parent, emit) ? scanx_parent(parent, emit_cdef, emit) : GW_OK;
 }
 
 ANN static inline m_bool emit_cdef(const Emitter emit, const Class_Def cdef) {
index e1c451feeaecb85eb61e7937a9814e8340740487..16d74ec3c469072854b26ebeec8dcf62a7a24c50 100644 (file)
@@ -122,9 +122,10 @@ static OP_CHECK(at_object) {
   const Type r = bin->rhs->type;
   if(opck_rassign(env, data, mut) == t_null)
     return t_null;
+  if(check_nonnull(env, l, r, "assign", exp_self(bin)->pos) == t_null)
+    return t_null;
   if(bin->rhs->exp_type == ae_exp_decl)
     SET_FLAG(bin->rhs->d.exp_decl.td, ref);
-  CHECK_OO(check_nonnull(env, l, r, "assign", exp_self(bin)->pos))
   bin->rhs->emit_var = 1;
   return r;
 }
index 7fc89708d1e5ed8df604a280964dbb2e33d0e57c..70289cea60df480c319a3285bbf33250fd5d8b6f 100644 (file)
@@ -9,7 +9,7 @@
 #include "type.h"
 
 ANN static void free_value(Value a, Gwion gwion) {
-  const Type t = !GET_FLAG(a->type, nonnull) ? a->type : a->type->e->parent;
+  const Type t = a->type;
   if(!GET_FLAG(a, func) && a->d.ptr && !GET_FLAG(a, union) &&
       !(GET_FLAG(a, enum) && GET_FLAG(a, builtin) && a->owner_class)
       && isa(t, t_object) < 0)
index 1b6a6a57cd3711402d06fb2cac89f7952be9de4e..fb02fe130ea8519f624db5b5ba0608fa9b2736b3 100644 (file)
@@ -180,7 +180,7 @@ ANN static inline m_bool not_from_owner_class(const Env env, const Type t,
   if(!v->owner_class || isa(t, v->owner_class) < 0) {
     ERR_B(pos,
         _("'%s' from owner namespace '%s' used in '%s'."),
-            v->name, v->owner->name, t->name)
+            v->name, v->owner ? v->owner->name : "?", t->name)
   }
   return GW_OK;
 }
@@ -364,6 +364,8 @@ ANN static Type tuple_depth(const Env env, const Array_Sub array) {
      array->exp->d.exp_primary.primary_type != ae_primary_num)
      ERR_O(array->exp->pos, _("tuple subscripts must be litteral"))
   const m_uint idx = array->exp->d.exp_primary.d.num;
+  if(idx >= vector_size(&array->type->e->tuple->types))
+     ERR_O(array->exp->pos, _("tuple subscripts too big"))
   const Type type = (Type)vector_at(&array->type->e->tuple->types, idx);
   if(type == t_undefined)
      ERR_O(array->exp->pos, _("tuple subscripts is undefined"))
@@ -375,7 +377,7 @@ ANN static Type tuple_depth(const Env env, const Array_Sub array) {
 
 ANN static Type partial_depth(const Env env, const Array_Sub array) {
   const Exp curr = take_exp(array->exp, array->type->array_depth);
-  if(!curr->next)
+  if(!curr->next || !array_base(array->type))
     ERR_O(array->exp->pos, _("array subscripts (%i) exceeds defined dimension (%i)"),
         array->depth, get_depth(array->type))
   struct Array_Sub_ next = { curr->next, array_base(array->type), array->depth - array->type->array_depth };
index f029f4c749b2694f5b219ac5d201d14575cab3cd..bf3e6bdaa7317aa3dfe2657ffa7aee8371066883 100644 (file)
@@ -369,8 +369,7 @@ ANN static m_bool scan1_parent(const Env env, const Class_Def cdef) {
   if(isa(parent, t_object) < 0)
     ERR_B(pos, _("cannot extend primitive type '%s'"), parent->name)
   if(parent->e->def && !GET_FLAG(parent, scan1))
-//    CHECK_BB(scanx_parent(parent, scan1_cdef, env))
-    CHECK_BB(scan1_cdef(env, parent->e->def))
+    CHECK_BB(scanx_parent(parent, scan1_cdef, env))
   if(type_ref(parent))
     ERR_B(pos, _("can't use ref type in class extend"))
   return GW_OK;
index 327b5c91f453d1135bf570446e28375b651b2294..ace93238914a3b82aab571899c224467eb082eb9 100644 (file)
@@ -163,9 +163,12 @@ ANN Type scan_tuple(const Env env, const Type_Decl *td) {
   do {
     const Type t = tl->td->xid->xid != insert_symbol("_") ?
        known_type(env, tl->td) : (Type)1;
-    if(!t)
-      break;
-    vector_add(&v, (m_uint)t);
+    if(t)
+      vector_add(&v, (m_uint)t);
+    else {
+      vector_release(&v);
+      return NULL;
+    }
   } while((tl = tl->next));
   const Type ret = tuple_type(env, &v, td_pos(td));
   vector_release(&v);
index 49efe0bea0f387dd904cf6606e5a88e988127e89..dc1ce66eda368dce3621b6e2510c93eaf4d7a027 100644 (file)
@@ -28,7 +28,7 @@ ANN Type type_decl_resolve(const Env env, const Type_Decl* td) {
     if(t->nspc)
       ADD_REF(t->nspc)
     t->name = s_name(sym);
-    t->e->parent = ret;
+    t->flag = ret->flag;
     SET_FLAG(t, nonnull);
     map_set(&t->e->owner->info->type->map, (vtype)sym, (vtype)t);
     return t;