]> Nishi Git Mirror - gwion.git/commitdiff
:bomb: Fix effect leaks
authorJérémie Astor <fennecdjay@gmail.com>
Fri, 23 Apr 2021 17:18:09 +0000 (19:18 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Fri, 23 Apr 2021 17:18:09 +0000 (19:18 +0200)
src/import/import_oper.c
src/parse/operator.c

index 1b48f8e450da2d32899eeb856656c437b169eeae..687d215fe5b98a3d94159bb8c414830eab61b3d6 100644 (file)
@@ -30,7 +30,7 @@ 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,
+ANN2(1,2) static int import_op(const Gwi gwi, struct OperCK*const op,
     const f_instr f) {
   const Type lhs = gwi_get_type(gwi, op->lhs),
              rhs = gwi_get_type(gwi, op->rhs),
@@ -38,7 +38,9 @@ ANN2(1,2) static int import_op(const Gwi gwi, const struct OperCK* op,
   const struct Op_Func opfunc = { .ck=op->ck, .em=op->em, .effect = { .ptr=op->effect.ptr } };
   const struct Op_Import opi = { .lhs=lhs, .rhs=rhs, .ret=ret,
     .func=&opfunc, .data=(uintptr_t)f, .pos=gwi->loc, .op=op->sym };
-  return add_op(gwi->gwion, &opi);
+  const m_bool b = add_op(gwi->gwion, &opi);
+  op->effect.ptr = NULL;
+  return b;
 }
 
 
index 50250aec30485dfb4687e5742dc693c6d6b98b5c..b9ad4b5a2c01d0e4fb59ff7195bbf50fa8344907 100644 (file)
@@ -91,6 +91,11 @@ ANN static M_Operator* new_mo(MemPool p, const struct Op_Import* opi) {
   if(opi->func) {
     mo->ck     = opi->func->ck;
     mo->em     = opi->func->em;
+    if(opi->func->effect.ptr) {
+if(opi->lhs && opi->lhs != OP_ANY_TYPE)
+puts(opi->lhs->name);
+      mo->effect.ptr = opi->func->effect.ptr;
+}
   }
   return mo;
 }