]> Nishi Git Mirror - gwion.git/commitdiff
Use xfun_handle where relevant
authorfennecdjay <fennecdjay@gmail.com>
Tue, 4 Oct 2022 09:38:43 +0000 (11:38 +0200)
committerfennecdjay <fennecdjay@gmail.com>
Tue, 4 Oct 2022 09:38:43 +0000 (11:38 +0200)
include/vm.h
plug
src/lib/closure.c
src/lib/locale.c
src/lib/modules.c
src/lib/shred.c
src/lib/string.c
src/lib/ugen.c
src/parse/scan1.c
src/vm/shreduler.c

index f66f431fe32d8844c8b5959f99a449c5bb81170e..6ef06b77597779956afa97cc10cad070457b9863 100644 (file)
@@ -20,7 +20,7 @@ struct VM_Code_ {
   struct M_Vector_ live_values;
   uint16_t         stack_depth;
   uint16_t         ref;
-  bool             is_prepared;
+//  bool             is_prepared;
   bool             builtin;
   bool             callback;
   bool             is_memoize;
@@ -136,6 +136,11 @@ ANN m_str code_name(const m_str, const bool);
 ANN uint32_t gw_rand(uint32_t s[2]);
 ANN void     gw_seed(uint32_t s[2], const uint64_t);
 ANN void     handle(VM_Shred shred, const m_str effect);
+#define xfun_handle(shred, effect) {\
+  shred->mem -= ((Instr)vector_at(&shred->code->instr, shred->pc-1))->m_val2; \
+  handle(shred, effect); \
+}
+
 ANN bool unwind(const VM_Shred shred, const Symbol effect, const m_uint size);
 
 #define BBQ_POS_MAX 16777216
diff --git a/plug b/plug
index 14c74b7ff5f56000c30668fed553d585862deb87..c3d0108ef59d40a6079f8da1b7a1c79dc1c80d96 160000 (submodule)
--- a/plug
+++ b/plug
@@ -1 +1 @@
-Subproject commit 14c74b7ff5f56000c30668fed553d585862deb87
+Subproject commit c3d0108ef59d40a6079f8da1b7a1c79dc1c80d96
index 12a817ca4736eb578135adf727e3afda4f94c387..3e95847423f68189e35013d2ac9e466a72763d19 100644 (file)
@@ -697,7 +697,7 @@ static DTOR(fptr_dtor) {
 }
 
 static MFUN(fptr_default) {
-  handle(shred, "EmptyFunctionPointer");
+  xfun_handle(shred, "EmptyFunctionPointer");
 }
 
 static GACK(gack_function) { INTERP_PRINTF("%s", t->name); }
index 6b7afcdc82b17e15a07da2844b2e73058a0d822f..b4cdc7c12ddf7a9e9b683f2d2bcb0bac625380d3 100644 (file)
@@ -38,7 +38,7 @@ static SFUN(BasicLocale) {
   const M_Object arg = *(M_Object*)MEM(0);
   const m_float ret = basic_locale(STRING(arg));
   if(ret == -1.0)
-    handle(shred, "invalid value for locale");
+    xfun_handle(shred, "invalid value for locale");
   *(m_float*)RETURN = ret;
 }
 
index 73dd192cbae8cd76f8e83e53c1a2264691ad7e7e..46564054f200a4260a0a5088c020bda79579c545 100644 (file)
@@ -245,10 +245,6 @@ 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) {
-    handle(shred, "NullPtrException");
-    return;
-  }
   struct UUGen_ *uu = UGEN(o)->module.gen.data;
   if (uu->shred) {
     free_vm_shred(uu->shred);
index 4728250ad8f0b69da9a5da3a60c11aca2fbfc825..b9927140a2fb4d847d4a17c35a3823dbc7f024a2 100644 (file)
@@ -95,7 +95,7 @@ static SFUN(vm_shred_from_id) {
       }
     }
   }
-  handle(shred, "InvalidShredRequest");
+  xfun_handle(shred, "InvalidShredRequest");
 }
 
 static MFUN(shred_args) {
@@ -109,8 +109,7 @@ static MFUN(shred_arg) {
   if (s->info->args.ptr && idx >= 0 && (m_uint)idx < vector_size(&s->info->args)) {
     const m_str str = (m_str)vector_at(&s->info->args, *(m_uint *)MEM(SZ_INT));
     *(M_Object *)RETURN = new_string(shred->info->vm->gwion, str);
-  } else
-    handle(shred, "InvalidShredArgumentRequest");
+  } else xfun_handle(shred, "InvalidShredArgumentRequest");
 }
 
 #ifndef BUILD_ON_WINDOWS
index 9532ef924a256471589ac8901a9dc59d9522c9b3..ae32cd96aeb32b08614cf8ea610629035cc6d220 100644 (file)
@@ -172,7 +172,7 @@ static MFUN(string_trim) {
       break;
   }
   if (len - start - end <= 0) {
-    handle(shred, "InvalidStringTrimRequest");
+    xfun_handle(shred, "InvalidStringTrimRequest");
     return;
   }
   char c[len - start - end + 1];
@@ -213,7 +213,7 @@ static MFUN(string_replace) {
   const m_uint len = strlen(str);
   len_insert       = strlen(insert);
   if (index >= (m_int)len || index < 0 || (index + len_insert + 1) <= 0) {
-    handle(shred, "InvalidStringReplace");
+    xfun_handle(shred, "InvalidStringReplace");
     return;
   }
   char c[index + len_insert + 1];
@@ -232,7 +232,7 @@ static MFUN(string_replaceN) {
   const m_int    _len = *(m_int *)MEM(SZ_INT * 2);
   if (!arg || index > (m_int)strlen(STRING(o)) ||
       _len > (m_int)strlen(STRING(arg))) {
-    handle(shred, "InvalidStringReplace");
+    xfun_handle(shred, "InvalidStringReplace");
     return;
   }
   char         insert[strlen(STRING(arg)) + 1];
@@ -349,7 +349,7 @@ static MFUN(string_erase) {
   const m_int size  = len - rem + 1;
   const m_int start = _start >= 0 ? _start : len - _start;
   if (start >= len || size <= 0) {
-    handle(shred, "InvalidStringErase");
+    xfun_handle(shred, "InvalidStringErase");
     return;
   }
   char c[size];
@@ -363,7 +363,7 @@ static MFUN(string_save) {
   const m_str path = STRING(*(M_Object*)MEM(SZ_INT));
   FILE *f = fopen(path, "w");
   if(!f) {
-    handle(shred, "StringLoadException");
+    xfun_handle(shred, "StringLoadException");
     return;
   }
   const m_str str = STRING(o);
@@ -375,7 +375,7 @@ static SFUN(string_load) {
   const m_str path = STRING(*(M_Object*)MEM(0));
   FILE *f = fopen(path, "r");
   if(!f) {
-    handle(shred, "StringLoadException");
+    xfun_handle(shred, "StringLoadException");
     return;
   }
   fseek(f, 0, SEEK_END);
@@ -405,11 +405,11 @@ static MFUN(string_atoi2) {
   char *endptr = NULL;
   if(!(*(m_int*)RETURN = strtol(str, &endptr, 10))) {
     if(errno == EINVAL) {
-      handle(shred, "ErrorInvalidValue");
+      xfun_handle(shred, "ErrorInvalidValue");
       return;
     }
     if(errno == ERANGE) {
-      handle(shred, "ValueOutOfRange");
+      xfun_handle(shred, "ValueOutOfRange");
       return;
     }
   }
index 1fcd6f0881fc153d74e757dce6785446304abb3e..59cdfe8e10cdc247e690d724f1f7ce86d8f6e5ee 100644 (file)
@@ -330,7 +330,7 @@ static MFUN(ugen_channel) {
   else if (i >= 0 && (m_uint)i < UGEN(o)->connect.multi->n_chan)
     *(M_Object *)RETURN = UGEN(o)->connect.multi->channel[i];
   else
-    handle(shred, "InvalidChannelRequest");
+    xfun_handle(shred, "InvalidChannelRequest");
 }
 
 static MFUN(ugen_get_op) { *(m_uint *)RETURN = UGEN(o)->op + 1; }
index 190b42ee9ef7d4a88f0f44713e5bbfc48ecff65c..e87d898512b347bdcc583021bfd2265f464f90aa 100644 (file)
@@ -322,7 +322,7 @@ ANN static inline m_bool shadow_arg(const Env env, const Symbol sym,
   Nspc nspc = env->curr;
   do {
     const Value v = nspc_lookup_value0(nspc, sym);
-    if (v) return shadow_err(env, v, loc);
+    if (v && !env->func->def->builtin) return shadow_err(env, v, loc);
   } while ((nspc = nspc->parent));
   return GW_OK;
 }
index beba69e8e5f685f3885c80d633ee48d65ed05fcb..00de675fec1b07fdf2b723dcb0985e9e854f9b04 100644 (file)
@@ -58,7 +58,7 @@ ANN static void shreduler_erase(const Shreduler          s,
   MUTEX_UNLOCK(shred->mutex);
   const m_uint size =
       shred->info->frame.ptr ? vector_size(&shred->info->frame) : 0;
-  unwind(shred, (Symbol)-1, size);
+  if(size) unwind(shred, (Symbol)-1, size);
   vector_rem2(&s->active_shreds, (vtype)shred);
   release(shred->info->me, shred);
 }