]> Nishi Git Mirror - gwion.git/commitdiff
:art: Return after handle()
authorJérémie Astor <fennecdjay@gmail.com>
Thu, 22 Apr 2021 11:26:18 +0000 (13:26 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Thu, 22 Apr 2021 11:26:18 +0000 (13:26 +0200)
plug
src/lib/array.c
src/lib/instr.c
src/lib/modules.c
src/lib/ptr.c
src/lib/string.c
src/lib/ugen.c
src/lib/vararg.c

diff --git a/plug b/plug
index cef9b411504a524d73b2e282de45bbd30fd22751..88fdb929584524f29d8eeb23b0fc7afd80fd57ee 160000 (submodule)
--- a/plug
+++ b/plug
@@ -1 +1 @@
-Subproject commit cef9b411504a524d73b2e282de45bbd30fd22751
+Subproject commit 88fdb929584524f29d8eeb23b0fc7afd80fd57ee
index 92f7b4a83ce58be64845070b185000368f83d146..1f8d9180950142be2f37d5cf65d72009f604aa7c 100644 (file)
@@ -328,8 +328,10 @@ static INSTR(ArraySlice) {
     end = ARRAY_LEN(in) + end;
   const m_int op    = start < end ? 1 : -1;
   const m_uint sz    = op > 0 ? end - start : start - end;
-  if(bounds(in, start) < 0 || bounds(in, end) < 0)
+  if(bounds(in, start) < 0 || bounds(in, end) < 0) {
     handle(shred, "OutOfBoundsArraySliceException");
+    return;
+  }
   const M_Object out = new_array(shred->info->vm->gwion->mp, array->type_ref, sz);
   for(m_int i = start, j = 0; i != end; i += op, ++j) {
     m_bit buf[ARRAY_SIZE(in)];
index cd362e7f20836e0b76c76664de25d06b1bdb1939..97babcb4b3ae8eef0bd94a3a6eb268429b2db266 100644 (file)
@@ -55,12 +55,14 @@ ANN static Func_Def traverse_tmpl(const Emitter emit, struct dottmpl_ *const dt,
 INSTR(GTmpl) {
   struct dottmpl_ *dt = (struct dottmpl_*)instr->m_val;
   const Func f = *(Func*)REG(-SZ_INT);
-  if(!f)
+  if(!f) {
     handle(shred, "EmptyFuncPointerException");
-if(f->code) {
-  *(VM_Code*)(shred->reg -SZ_INT) = f->code;
- return;
-}
+    return;
+  }
+  if(f->code) {
+    *(VM_Code*)(shred->reg -SZ_INT) = f->code;
+    return;
+  }
   const m_str name = f->name;
   const Emitter emit = shred->info->vm->gwion->emit;
   emit->env->name = "runtime";
@@ -80,9 +82,10 @@ if(f->code) {
   free_mstr(emit->gwion->mp, tmpl_name);
   dt->def = f->def;
   const Func_Def def = traverse_tmpl(emit, dt, f->value_ref->from->owner);
-  if(!def)
+  if(def)
+    *(VM_Code*)(shred->reg -SZ_INT) = def->base->func->code;
+  else
     handle(shred, "MissigTmplPtrException");
-  *(VM_Code*)(shred->reg -SZ_INT) = def->base->func->code;
 }
 
 INSTR(DotTmpl) {
index 92cd7ee47a3810fb76f2a9cfb2b93df65af30b6f..3b293ffe44953da7fb077c6f601a78032e3988e8 100644 (file)
@@ -247,15 +247,21 @@ static INSTR(UsrUGenTick) {
   const m_uint offset = !instr->m_val ? SZ_INT : 0;
   shred->reg -= SZ_INT*2 - offset;
   const M_Object o = *(M_Object*)(shred->reg + SZ_INT - offset);
-  if(!o)
+  if(!o) {
     handle(shred, "NullPtrException");
+    return;
+  }
   struct UUGen_ *uu = UGEN(o)->module.gen.data;
-  if(uu->shred)
+  if(uu->shred) {
     free_vm_shred(uu->shred);
+    return;
+  }
   UGEN(o)->module.gen.tick = usrugen_tick;
   const VM_Code code = *(VM_Code*)(shred->reg-offset);
-  if(!code)
+  if(!code) {
     handle(shred, "NullTickException");
+    return;
+  }
   uu->shred = new_vm_shred(shred->info->vm->gwion->mp, *(VM_Code*)(shred->reg-offset));
   vmcode_addref(*(VM_Code*)(shred->reg - offset));
   uu->shred->info->vm = shred->info->vm;
index 815853058fe1b6383fbc29722bf3175d8609b8fe..db362037222bed95a2c52c8a666bf5c9dcabcc6e 100644 (file)
@@ -89,8 +89,10 @@ static OP_CHECK(opck_ptr_implicit) {
 
 static INSTR(instr_ptr_deref) {
   const m_bit *o = *(m_bit**)REG(-SZ_INT);
-  if(!o)
+  if(!o) {
     handle(shred, _("EmptyPointerException"));
+    return;
+  }
   if(instr->m_val2)
     memcpy(REG(-SZ_INT), &o, SZ_INT);
   else {
index 63e961125edbedf557f9e727db3ef3beca4764eb..91deae640841a473c00743143fe9e90195668a7a 100644 (file)
@@ -83,8 +83,10 @@ static INSTR(StringSlice) {
   m_int end   = *(m_uint*)REG(SZ_INT);
   if(end < 0)
     end = strsz + end;
-  if(bounds(str, start) < 0 || bounds(str, end) < 0)
+  if(bounds(str, start) < 0 || bounds(str, end) < 0) {
     handle(shred, "OutOfBoundsStringSlice");
+    return;
+  }
   const m_int op    = start < end ? 1 : -1;
   const m_uint sz    = op > 0 ? end - start : start - end;
   char c[sz + 1];
index cc94d44552ccfba324aabe6f78c862cd92f5cd51..9908ea12e84aa97ef954e1376ac252f14e450714 100644 (file)
@@ -186,6 +186,7 @@ ANN void ugen_disconnect(const restrict UGen lhs, const restrict UGen rhs) {
 if(!UGEN(rhs)->module.gen.trig) {       \
   release_connect(shred);               \
   handle(shred, "NonTriggerException"); \
+  return;                               \
 }
 #define describe_connect_instr(name, func, tgt, opt) \
 static INSTR(name##func) {                           \
index c6e384554bca50456767fc000fc4f9ddb22e6099..fe4d086b9c15c029ef1a62e5c1d51876d18031e5 100644 (file)
@@ -107,8 +107,10 @@ static OP_CHECK(opck_vararg_cast) {
 
 static INSTR(VarargCast) {
   const M_Object o = *(M_Object*)REG(-SZ_INT);
-  if(!*(m_uint*)(o->data + SZ_INT))
+  if(!*(m_uint*)(o->data + SZ_INT)) {
          handle(shred, "Using Vararg outside varloop");
+    return;
+  }
   struct Vararg_* arg = *(struct Vararg_**)o->data;
   const Type t = (Type)instr->m_val,
              u = (Type)vector_at(&arg->t, *(m_uint*)(o->data + SZ_INT*4));