]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix some shreduler and vararg related bugs
authorfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 14 May 2019 17:18:45 +0000 (19:18 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 14 May 2019 17:18:45 +0000 (19:18 +0200)
include/gwion_all.h [new file with mode: 0644]
include/import.h
src/emit/emit.c
src/lib/func.c
src/lib/opfunc.c
src/lib/prim.c
src/lib/string.c
src/parse/check.c
src/parse/traverse.c
src/vm/shreduler.c
src/vm/vm.c

diff --git a/include/gwion_all.h b/include/gwion_all.h
new file mode 100644 (file)
index 0000000..c84301b
--- /dev/null
@@ -0,0 +1,41 @@
+#ifndef __GWION_ALL
+#include "gwion_util.h"
+#include "gwion_ast.h"
+#include "oo.h"
+#include "arg.h"
+#include "constant.h"
+#include "nspc.h"
+#include "env.h"
+#include "vm.h"
+#include "context.h"
+#include "escape.h"
+#include "func.h"
+#include "driver.h"
+#include "compile.h"
+#include "gwiondata.h"
+#include "gwion.h"
+#include "instr.h"
+#include "gack.h"
+#include "emit.h"
+#include "object.h"
+#include "import.h"
+#include "gwi.h"
+#include "lang_private.h"
+#include "memoize.h"
+#include "array.h"
+#include "opcode.h"
+#include "operator.h"
+#include "optim.h"
+#include "parse.h"
+#include "plug.h"
+#include "shreduler_private.h"
+#include "soundinfo.h"
+#include "switch.h"
+#include "template.h"
+#include "traverse.h"
+#include "type.h"
+#include "ugen.h"
+#include "value.h"
+#include "vararg.h"
+#include "engine.h"
+#endif
index b454618c6de85c1d062c16dbcd6b376ec735dd50..56a363301df5f67f91a83adf34fdcdf3e538cd07 100644 (file)
@@ -69,6 +69,7 @@ ANN Type_Decl* str2decl(const Env, const m_str, m_uint* depth);
 OP_CHECK(opck_const_rhs);
 OP_CHECK(opck_unary_meta);
 OP_CHECK(opck_unary_meta2);
+OP_CHECK(opck_unary_meta2_uniq);
 OP_CHECK(opck_unary);
 OP_CHECK(opck_post);
 OP_CHECK(opck_rassign);
index e915e548298656c20687fdd2557b5c970bc98532..d6f656f7f65e473c67c19b6611ed484494a4e7c6 100644 (file)
@@ -1607,6 +1607,10 @@ ANN static inline m_bool emit_member(const Emitter emit, const Value v, const ui
 }
 
 ANN static m_bool emit_exp_dot(const Emitter emit, const Exp_Dot* member) {
+  if(member->xid == insert_symbol("vararg")) { // TODO prohibit this?
+    emit_add_instr(emit, RegPushImm);
+    return GW_OK;
+  }
   if(is_special(member->t_base) > 0)
     return emit_exp_dot_special(emit, member);
   const Value value = find_value(actual_type(member->t_base), member->xid);
index 05f8773bbdc916f5a592d16978848e1865ad7d72..a757862ccc56567a2cee38800f437a8b4460d992 100644 (file)
@@ -76,7 +76,7 @@ ANN2(1,3,4) m_bool check_lambda(const Env env, const Type owner,
     ERR_B(exp_self(l)->pos, "argument number does not match for lambda")
   l->def = new_func_def(env->gwion->mp, new_func_base(env->gwion->mp, def->base->td, l->name, l->args), l->code, def->flag,
     loc_cpy(env->gwion->mp, def->pos));
-  const m_bool ret = traverse_func_def(env, l->def);
+  CHECK_BB(traverse_func_def(env, l->def))
   arg = l->args;
   while(arg) {
     arg->td = NULL;
@@ -84,7 +84,7 @@ ANN2(1,3,4) m_bool check_lambda(const Env env, const Type owner,
   }
   if(owner)
     env_pop(env, scope);
-  return ret;
+  return GW_OK;
 }
 
 static OP_CHECK(opck_fptr_at) {
@@ -212,6 +212,5 @@ GWION_IMPORT(func) {
   register_freearg(gwi, SporkIni, freearg_xork);
   register_freearg(gwi, ForkIni, freearg_xork);
   register_freearg(gwi, DotTmpl, freearg_dottmpl);
-  gwi_reserve(gwi, "__func__");
   return GW_OK;
 }
index 28934e678e853bd5283ca8ef5f7806d6177bb3bf..18f6293f520f94f86c17116491b8905b95d243e7 100644 (file)
@@ -60,6 +60,14 @@ OP_CHECK(opck_unary_meta2) {
   return t_int;
 }
 
+OP_CHECK(opck_unary_meta2_uniq) {
+  const Exp_Unary* unary = (Exp_Unary*)data;
+  CHECK_OO(opck_unary_meta2(env, data))
+  if(unary->exp->next)
+    ERR_N(stmt_self(unary)->pos, "fuck!!")
+  return t_int;
+}
+
 OP_CHECK(opck_unary) {
   const Exp_Unary* unary = (Exp_Unary*)data;
   if(unary->exp->meta != ae_meta_var)
index 5b3119be63c8eafde2eca66908c342c77c4b319d..629c75e1d2e489041201135466618fa194779602 100644 (file)
@@ -60,7 +60,7 @@ static GWION_IMPORT(int_unary) {
   CHECK_BB(gwi_oper_ini(gwi, NULL, "int", "int"))
   CHECK_BB(gwi_oper_add(gwi,  opck_unary_meta))
   CHECK_BB(gwi_oper_end(gwi,  op_sub,       int_negate))
-  CHECK_BB(gwi_oper_add(gwi,  opck_unary_meta2))
+  CHECK_BB(gwi_oper_add(gwi,  opck_unary_meta2_uniq))
   CHECK_BB(gwi_oper_end(gwi,  op_not, IntNot))
   CHECK_OP(inc, unary, pre_inc)
   CHECK_OP(dec, unary, pre_dec)
@@ -269,11 +269,11 @@ static GWION_IMPORT(float) {
   CHECK_BB(gwi_oper_ini(gwi, NULL,   "float", "float"))
   CHECK_FF(sub, unary_meta, negate)
   CHECK_BB(gwi_oper_ini(gwi, NULL,   "float", "int"))
-  CHECK_FF(not, unary_meta2, not)
+  CHECK_FF(not, unary_meta2_uniq, not)
   CHECK_BB(gwi_oper_ini(gwi, NULL,   "time", "int"))
-  CHECK_FF(not, unary_meta, not)
+  CHECK_FF(not, unary_meta2_uniq, not)
   CHECK_BB(gwi_oper_ini(gwi, NULL,   "dur", "int"))
-  CHECK_FF(not, unary_meta, not)
+  CHECK_FF(not, unary_meta2_uniq, not)
   CHECK_BB(gwi_oper_ini(gwi, "int", "dur", "dur"))
   CHECK_BB(gwi_oper_end(gwi, op_coloncolon,         int_float_mul))
   CHECK_BB(gwi_oper_ini(gwi, "float", "dur", "dur"))
index c8f60843730615290e57ceebee0b96ff2a1c4d83..d979ff12a39a1fac727102794b882519b05048c1 100644 (file)
@@ -245,5 +245,6 @@ GWION_IMPORT(string) {
 
   gwi_item_ini(gwi, "string", "__func__");
   gwi_item_end(gwi, ae_flag_const, NULL);
+  gwi_reserve(gwi, "__func__");
   return GW_OK;
 }
index 6432437dc7c623eb49ccc8e437c6ecc4fd34a5f6..2e88c71a2d9795c6a843527c72c403461ea97aa9 100644 (file)
@@ -299,12 +299,12 @@ ANN Type check_exp_array(const Env env, const Exp_Array* array) {
   CHECK_OO(t_base)
   Exp e = array->array->exp;
   CHECK_OO(check_exp(env, e))
-  m_uint depth = 1;
+  m_uint depth = 0;
   do {
     if(isa(e->type, t_int) < 0)
       ERR_O(e->pos, "array index %i must be of type 'int', not '%s'",
             depth, e->type->name)
-  } while((e = e->next) && ++depth);
+  } while(++depth && (e = e->next));
   if(depth != array->array->depth)
     ERR_O(exp_self(array)->pos, "invalid array acces expression.")
 
index 25ed3f81aeee68e964b4a9acfe7249ad11af374a..55c3ad3be33169a9f8a7ee5108696bc038ff9f59 100644 (file)
@@ -49,9 +49,12 @@ ANN m_bool traverse_decl(const Env env, const Exp_Decl* decl) {
 }
 
 ANN m_bool traverse_func_def(const Env env, const Func_Def def) {
-  CHECK_BB(scan1_func_def(env, def))
-  CHECK_BB(scan2_func_def(env, def))
-  return check_func_def(env, def);
+  const Func former = env->func;
+  if(scan1_func_def(env, def) > 0 && scan2_func_def(env, def) > 0 &&
+      check_func_def(env, def) > 0)
+    return GW_OK;
+  env->func = former;
+  return GW_ERROR;
 }
 
 ANN m_bool traverse_stmt_union(const Env env, const Stmt_Union def) {
index 2f8e4b9daffe1f58d319010975da1180728dc830..674aa4a8c8e98c29f2af16f2e8bd7fbc6524b390 100644 (file)
@@ -44,13 +44,14 @@ ANN static void shreduler_parent(const VM_Shred out, const Vector v) {
 ANN static void unwind(const VM_Shred shred) {
   VM_Code code = shred->code;
   while(code) {
+    if(shred->mem <= (((m_bit*)(shred) + sizeof(struct VM_Shred_) + SIZEOF_REG)))
+      break;
     const m_bit exec = (m_bit)((Instr)vector_back(code->instr))->opcode;
     if(exec == eFuncReturn) {
       code = *(VM_Code*)(shred->mem - SZ_INT*3);
       if(!GET_FLAG(code, op))
         REM_REF(code, shred->info->vm->gwion)
       shred->mem -= *(m_uint*)(shred->mem - SZ_INT*4) + SZ_INT*4;
-      if(shred->mem <= (((m_bit*)(shred) + sizeof(struct VM_Shred_) + SIZEOF_REG)))break;
     } else break;
   }
   shred->code = code;
index 8723a8bd20328e941b0f62c10e9cb891c50f68af..8c42a61ba7046cb0d64c8d9912ee80a63f53b4dc 100644 (file)
@@ -589,7 +589,8 @@ regtomem:
 overflow:
   if(overflow_((shred->mem = mem), shred)) {
 PRAGMA_PUSH()
-    shred->code = a.code;
+//    shred->code = a.code;
+  shred->mem = mem;
 PRAGMA_POP()
     Except(shred, "StackOverflow");
   }
@@ -720,7 +721,7 @@ exceptbase:
 except:
   if(!(a.obj  = *(M_Object*)(reg-SZ_INT))) {
     if(array_base) _release(array_base, shred);
-    shred->code = code;
+//    shred->code = code;
     shred->mem = mem;
     exception(shred, "NullPtrException");
     continue;