]> Nishi Git Mirror - gwion.git/commitdiff
:art: Update and spork bugfix
authorJérémie Astor <fennecdjay@gmail.com>
Thu, 5 Aug 2021 12:00:47 +0000 (14:00 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Thu, 5 Aug 2021 12:01:39 +0000 (14:01 +0200)
ast
plug
src/emit/emit.c
src/vm/vm.c
tests/pp/macro.gw [new file with mode: 0644]

diff --git a/ast b/ast
index a4e4f7f5955fff6ebb05e90949a54c556dee964e..ba2a75d2445c1d107569c52fd69364e0142d80fb 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit a4e4f7f5955fff6ebb05e90949a54c556dee964e
+Subproject commit ba2a75d2445c1d107569c52fd69364e0142d80fb
diff --git a/plug b/plug
index 1c980306a4146aa80dc3f3d21137aed3a68dac9b..ac29ebb012d01fda0eb1c84dc204941fc6a55d4f 160000 (submodule)
--- a/plug
+++ b/plug
@@ -1 +1 @@
-Subproject commit 1c980306a4146aa80dc3f3d21137aed3a68dac9b
+Subproject commit ac29ebb012d01fda0eb1c84dc204941fc6a55d4f
index bfd6fb879c38db90c7e5d72bc610e6ebfa7305d2..cddf0dbd1926f83c0f766e1675ad5c35a59c0ed6 100644 (file)
@@ -1431,6 +1431,17 @@ ANN static Instr emit_call(const Emitter emit, const Func f,
   return emit_add_instr(emit, Overflow);
 }
 
+ANN static m_bool emit_ensure_func(const Emitter emit, const Func f) {
+  const struct ValueFrom_ *from = f->value_ref->from;
+  if(from->owner_class)
+    CHECK_BB(ensure_emit(emit, from->owner_class));
+  if(f->code) return GW_OK;
+  const m_uint scope = emit_push(emit, from->owner_class, from->owner);
+  const m_bool ret = emit_func_def(emit, f->def);
+  emit_pop(emit, scope);
+  return ret;
+}
+
 ANN m_bool emit_exp_call1(const Emitter emit, const Func f,
                           const bool is_static) {
   const m_uint this_offset   = emit->this_offset;
@@ -1450,8 +1461,7 @@ ANN m_bool emit_exp_call1(const Emitter emit, const Func f,
       }
     } else if (emit->env->func != f && !f->value_ref->from->owner_class &&
                !f->code && !is_fptr(emit->gwion, f->value_ref->type)) {
-      // ensure env?
-      CHECK_BB(emit_func_def(emit, f->def));
+      CHECK_BB(emit_ensure_func(emit, f));
       if (fbflag(f->def->base, fbflag_op)) {
         const Instr back = (Instr)vector_back(&emit->code->instr);
         assert(back->execute == SetFunc);
@@ -1503,6 +1513,7 @@ ANN m_bool emit_exp_call1(const Emitter emit, const Func f,
              !is_fptr(emit->gwion, f->value_ref->type)) {
     // not yet emitted static func
     if (f->value_ref->from->owner_class) {
+      assert(GET_FLAG(f->value_ref, static));
       const Instr instr = vector_size(&emit->code->instr)
                               ? (Instr)vector_back(&emit->code->instr)
                               : emit_add_instr(emit, SetFunc);
@@ -1601,10 +1612,13 @@ ANN static m_bool spork_prepare_code(const Emitter         emit,
 
 ANN static m_bool spork_prepare_func(const Emitter         emit,
                                      const struct Sporker *sp) {
+  const Type t = actual_type(emit->gwion, sp->exp->d.exp_call.func->type);
+  const Func f = t->info->func;
+  if(!f->code && f != emit->env->func)
+    CHECK_BB(emit_ensure_func(emit, f));
   push_spork_code(emit, sp->is_spork ? SPORK_FUNC_PREFIX : FORK_CODE_PREFIX,
                   sp->exp->pos);
-  const Type t = actual_type(emit->gwion, sp->exp->d.exp_call.func->type);
-  return emit_exp_call1(emit, t->info->func, false);
+  return emit_exp_call1(emit, f, false);
 }
 
 ANN static VM_Code spork_prepare(const Emitter emit, const struct Sporker *sp) {
index 01b24041134ab609059def7a65596d79bd471b7d..b857420318506f8f0344e73a5d3aae01cdc9d87c 100644 (file)
@@ -933,10 +933,12 @@ vm_run(const VM *vm) { // lgtm [cpp/use-of-goto]
     forkini:
       reg -= SZ_INT;
       child = init_fork_shred(shred, (VM_Code)VAL, *(Type *)reg, VAL2),
-      DISPATCH() sporkfunc :
-          //  LOOP_OPTIM
-          PRAGMA_PUSH() for (m_uint i = 0; i < VAL; i += SZ_INT) *
-          (m_uint *)(child->reg + i) = *(m_uint *)(reg + i + IVAL2);
+      DISPATCH()
+    sporkfunc:
+      PRAGMA_PUSH()
+      //  LOOP_OPTIM
+      for (m_uint i = 0; i < VAL; i += SZ_INT)
+        *(m_uint *)(child->reg + i) = *(m_uint *)(reg + i + IVAL2);
       child->reg += VAL;
       DISPATCH()
       PRAGMA_POP()
diff --git a/tests/pp/macro.gw b/tests/pp/macro.gw
new file mode 100644 (file)
index 0000000..5c3d460
--- /dev/null
@@ -0,0 +1,7 @@
+#! [contains] 1
+
+#define TEST_MULITLINE_MACRO(i) \
+more stuff.\
+and more
+
+<<< 1 >>>;