]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix uninit mem in effects and global funptrs
authorfennecdjay <fennecdjay@gmail.com>
Tue, 19 Jul 2022 21:50:36 +0000 (23:50 +0200)
committerfennecdjay <fennecdjay@gmail.com>
Tue, 19 Jul 2022 21:50:36 +0000 (23:50 +0200)
src/emit/emit.c
src/lib/instr.c
src/lib/xork.c
src/parse/check.c
src/parse/scan1.c
src/parse/scan2.c
src/vm/vm.c

index bdc8a984a84d85df8af2814026fe9ec9289662e4..e3c7c89734a89514bf78bf718344013855907bd7 100644 (file)
@@ -1817,8 +1817,6 @@ ANN2(1,2) static Instr _flow(const Emitter emit, const Exp e, Instr *const instr
     const Instr ex = (Instr)vector_back(&emit->code->instr);
     if(ex->execute == fast_except) {
       vector_rem(&emit->code->instr, vector_size(&emit->code->instr) - 1);
-      if(ex->m_val2)
-        mp_free2(emit->gwion->mp, sizeof(struct FastExceptInfo), (struct FastExceptInfo*)ex->m_val2);
       free_instr(emit->gwion, ex);
     }
   }
@@ -2391,7 +2389,6 @@ ANN static inline m_bool emit_handler_list(const restrict Emitter emit,
     const Instr instr = emit_add_instr(emit, HandleEffect);
     instr->m_val2     = (m_uint)handler->xid;
     CHECK_BB(scoped_stmt(emit, handler->stmt, 1));
-  //if (handler->next) CHECK_BB(emit_handler_list(emit, handler->next, v));
     emit_try_goto(emit, v);
     instr->m_val = emit_code_size(emit);
   }
index 05438217796bddbc497c1144fe80f7906e822b7b..5e476494d18730a007ab694a1a96fff596dfc088 100644 (file)
@@ -159,13 +159,15 @@ INSTR(fast_except) {
     VAL = -SZ_INT;
     instr->opcode = eNoOp;
     if(info) mp_free2(shred->info->mp, sizeof(struct FastExceptInfo), info);
+    instr->m_val2 = 0;
     return;
   } else if(info) {
     if(info->file)
       gwerr_basic("Object not instantiated", NULL, NULL, info->file, info->loc, 0);
     if(info->file2)
       gwerr_warn("declared here", NULL, NULL, info->file2, info->loc2);
-    mp_free2(shred->info->mp, sizeof(struct FastExceptInfo), info);
+//    mp_free2(shred->info->mp, sizeof(struct FastExceptInfo), info);
+//    instr->m_val2 = 0;
   }
   handle(shred, "NullPtrException");
 }
index 997d9cb2ffccfdd8397f1202cd7f3f46fa9177ac..8a56ccfc28110f546716c85bcea086d874ebf242 100644 (file)
@@ -84,6 +84,11 @@ static OP_EMIT(opem_spork) {
 
 static FREEARG(freearg_xork) { vmcode_remref((VM_Code)instr->m_val, gwion); }
 
+static FREEARG(clean_fast_except) {
+  struct FastExceptInfo *info = (struct FastExceptInfo *)instr->m_val2;
+  if(info) mp_free2(((Gwion)gwion)->mp, sizeof(struct FastExceptInfo), info);
+}
+
 GWION_IMPORT(xork) {
   GWI_BB(gwi_oper_ini(gwi, NULL, (m_str)OP_ANY_TYPE, NULL))
   GWI_BB(gwi_oper_add(gwi, opck_spork))
@@ -93,5 +98,6 @@ GWION_IMPORT(xork) {
   GWI_BB(gwi_oper_emi(gwi, opem_spork))
   GWI_BB(gwi_oper_end(gwi, "fork", NULL))
   gwi_register_freearg(gwi, SporkIni, freearg_xork);
+  gwi_register_freearg(gwi, fast_except, clean_fast_except);
   return GW_OK;
 }
index baf35d0d49dcdb7fcf46c61a52b224ea2690a7b0..04ac3b0fe314581c1f71c90152f451fdd933cf95 100644 (file)
@@ -1824,7 +1824,10 @@ ANN static m_bool check_trait_def(const Env env, const Trait_Def pdef) {
 }
 
 ANN m_bool check_fptr_def(const Env env, const Fptr_Def fptr) {
-  return check_class_def(env, fptr->cdef);
+  if(GET_FLAG(fptr->cdef, global)) env_push_global(env);
+  const m_bool ret = check_class_def(env, fptr->cdef);
+  if(GET_FLAG(fptr->cdef, global)) env_pop(env, 0);
+  return ret;
 }
 
 //#define check_fptr_def dummy_func
index 24710be2ef5f76bd6938ae28259756552eccc95a..456fdcbf59779cfa105b746092bab5b71f588148 100644 (file)
@@ -459,7 +459,10 @@ ANN static m_bool scan1_fdef_base_tmpl(const Env env, const Func_Def fdef) {
 #include "import.h"
 
 ANN m_bool scan1_fptr_def(const Env env, const Fptr_Def fptr) {
-  return scan1_class_def(env, fptr->cdef);
+  if(GET_FLAG(fptr->cdef, global))env_push_global(env);
+  const m_bool ret = scan1_class_def(env, fptr->cdef);
+  if(GET_FLAG(fptr->cdef, global)) env_pop(env, 0);
+  return ret;
 }
 
 ANN m_bool scan1_type_def(const Env env, const Type_Def tdef) {
index dfda9c331093b5b938ce5458d4e71558d6d451f9..943b50a3d1ed02f3a98f5f8f8d78ec2c352952a3 100644 (file)
@@ -75,10 +75,12 @@ ANN static Value scan2_func_assign(const Env env, const Func_Def d,
 }
 
 ANN m_bool scan2_fptr_def(const Env env NUSED, const Fptr_Def fptr) {
-  CHECK_BB(scan2_class_def(env, fptr->cdef));
-  const Func_Def fdef = mp_vector_at(fptr->cdef->body, struct Section_ , 0)->d.func_def;
+  if(GET_FLAG(fptr->cdef, global)) env_push_global(env);
+  const m_bool ret = scan2_class_def(env, fptr->cdef);
+  const Func_Def fdef = mp_vector_at(fptr->cdef->base.type->info->cdef->body, struct Section_ , 0)->d.func_def;
   if(fdef->base->func) set_fflag(fdef->base->func, fflag_fptr);
-  return GW_OK;
+  if(GET_FLAG(fptr->cdef, global)) env_pop(env, 0);
+  return ret;
 }
 
 ANN static m_bool scan2_func_def_op(const Env env, const Func_Def f);
index a787db6a07719581f4b304a36e28382e451f0827..1f31a702b56d360583ca6d9f98de8f88c1e3641b 100644 (file)
@@ -61,7 +61,7 @@ ANN static void clean_values(const VM_Shred shred) {
 
 ANN static uint16_t find_pc(const VM_Shred shred, const Symbol effect, const m_uint size) {
   const VM_Code code = shred->code;
-  const m_uint start = VKEY(&shred->info->frame, size - 1);
+  const m_uint start = vector_at(&shred->info->frame, vector_size(&shred->info->frame) - 2);
   if (start > shred->pc) return true;
   const Map m  = &shred->code->handlers;
   for (m_uint i = 0; i < map_size(m); i++) {
@@ -77,12 +77,8 @@ ANN static uint16_t find_pc(const VM_Shred shred, const Symbol effect, const m_u
 }
 
 ANN static inline bool find_handle(const VM_Shred shred, const Symbol effect, const m_uint size) {
-  const m_uint start = VKEY(&shred->info->frame, size - 1);
-  if (start > shred->pc) return true;
   const uint16_t pc = find_pc(shred, effect, size);
-  if (!pc) // outside of a try statement
-    return false;
-  // we should clean values here
+  if (!pc) return false; // outside of a try statement
   shred->reg = // restore reg
       (m_bit *)VPTR(&shred->info->frame, VLEN(&shred->info->frame) - 1);
   shredule(shred->tick->shreduler, shred, 0);