]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Afl fixes
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Wed, 6 May 2020 10:28:29 +0000 (12:28 +0200)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Wed, 6 May 2020 10:28:29 +0000 (12:28 +0200)
include/env/tuple.h
src/env/tupleform.c
src/env/type.c
src/parse/scan0.c

index a39d2b7d11b13aaf7b59989f9502b68e5f5e89db..5cdda4f146a47bb03256672fcdcf72652c0a8020 100644 (file)
@@ -10,7 +10,7 @@ struct TupleForm_ {
 ANN Type tuple_type(const Env, const Vector, const loc_t);
 ANN void tuple_info(const Env, const Value);
 ANN2(1) TupleForm new_tupleform(MemPool p, const Type parent_type);
-ANN void free_tupleform(const TupleForm tuple);
+ANN void free_tupleform(const TupleForm tuple, const struct Gwion_ *gwion);
 
 #ifdef __INSTR
 INSTR(TupleCtor);
index f540321737c6abf0ad67640707c87d4e8c007ab1..59f7700197f2f530c5cbc01cd929d048fd83e725 100644 (file)
@@ -17,6 +17,7 @@
 
 ANN void tuple_info(const Env env, const Value v) {
   const m_uint offset = vector_back(&env->class_def->e->tuple->offset);
+  ADD_REF(v->type);
   vector_add(&env->class_def->e->tuple->types, (vtype)v->type);
   vector_add(&env->class_def->e->tuple->offset, offset + v->type->size);
 }
@@ -43,7 +44,9 @@ ANN2(1) TupleForm new_tupleform(MemPool p, const Type parent_type) {
   return tuple;
 }
 
-ANN void free_tupleform(const TupleForm tuple) {
+ANN void free_tupleform(const TupleForm tuple, const struct Gwion_ *gwion) {
+  for(m_uint i = 0; i < vector_size(&tuple->types); ++i)
+    REM_REF((Type)vector_at(&tuple->types, i), (void*)gwion);
   vector_release(&tuple->types);
   vector_release(&tuple->offset);
 }
index e12ae708a773e73e2f1bc17c989fb78c98fc355f..46fe3001787951510a39558b794e221f856b2f83 100644 (file)
@@ -28,7 +28,7 @@ ANN static void free_type(Type a, Gwion gwion) {
   if(a->nspc)
     REM_REF(a->nspc, gwion);
   if(a->e->tuple)
-    free_tupleform(a->e->tuple);
+    free_tupleform(a->e->tuple, gwion);
   mp_free(gwion->mp, TypeInfo, a->e);
   mp_free(gwion->mp, Type, a);
 }
@@ -86,7 +86,7 @@ ANN Type typedef_base(Type t) {
 
 ANN Type array_base(Type type) {
   const Type t = typedef_base(type);
-  return t->e->d.base_type;
+  return t->array_depth ? t->e->d.base_type : t;
 }
 
 ANN static Symbol array_sym(const Env env, const Type src, const m_uint depth) {
index ce6459876e47c50db382066043855b7a6a2d85f7..7e5adef369015898b56d35c3bf3e1d363a3e3e57 100644 (file)
@@ -153,8 +153,9 @@ ANN static void typedef_simple(const Env env, const Type_Def tdef, const Type ba
 
 ANN static m_bool typedef_complex(const Env env, const Type_Def tdef, const Type base) {
   const ae_flag flag = base->e->def ? base->e->def->flag : 0;
-  const Class_Def cdef = new_class_def(env->gwion->mp, flag, tdef->xid, tdef->ext, NULL,
-    loc_cpy(env->gwion->mp, td_pos(tdef->ext)));
+  const Class_Def cdef = new_class_def(env->gwion->mp, flag, tdef->xid,
+       cpy_type_decl(env->gwion->mp, tdef->ext), NULL,
+       loc_cpy(env->gwion->mp, td_pos(tdef->ext)));
   CHECK_BB(scan0_class_def(env, cdef))
   tdef->type = cdef->base.type;
   cdef->base.tmpl = tdef->tmpl;// check cpy