]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix empty vararg
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Mon, 13 Apr 2020 16:38:00 +0000 (18:38 +0200)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Mon, 13 Apr 2020 16:38:00 +0000 (18:38 +0200)
src/emit/emit.c
src/lib/vararg.c
tests/tree/empty_vararg.gw

index 1faf6cbb25bcbae9d79fa3f506e22b345639ca67..6a66eab44d05ab81f6abf07d1389cf141f5fc1dd 100644 (file)
@@ -1352,6 +1352,11 @@ ANN static m_bool emit_stmt_flow(const Emitter emit, const Stmt_Flow stmt) {
   return GW_OK;
 }
 
+ANN static Instr variadic_state0(const Emitter emit, const Stmt_VarLoop stmt) {
+  CHECK_BO(emit_exp(emit, stmt->exp))
+  return emit_add_instr(emit, BranchEqInt);
+}
+
 ANN static m_bool variadic_state(const Emitter emit, const Stmt_VarLoop stmt, const m_uint status) {
   regpushi(emit, status);
   CHECK_BB(emit_exp(emit, stmt->exp))
@@ -1364,6 +1369,7 @@ ANN static m_bool variadic_state(const Emitter emit, const Stmt_VarLoop stmt, co
 }
 
 ANN static m_bool emit_stmt_varloop(const Emitter emit, const Stmt_VarLoop stmt) {
+  DECL_OB(const Instr,state, = variadic_state0(emit, stmt))
   CHECK_BB(variadic_state(emit, stmt, 1))
   CHECK_BB(emit_exp(emit, stmt->exp))
   const Instr instr = emit_add_instr(emit, BranchEqInt);
@@ -1373,6 +1379,7 @@ ANN static m_bool emit_stmt_varloop(const Emitter emit, const Stmt_VarLoop stmt)
   emit_vararg_end(emit, pc);
   instr->m_val = emit_code_size(emit);
   CHECK_BB(variadic_state(emit, stmt, 0))
+  state->m_val = instr->m_val = emit_code_size(emit);
   return GW_OK;
 }
 
index 25fbb5faeb3beed54ee3e8dce85e64273f4b062a..b5128c273c6b80959273b4233b70456283379335 100644 (file)
@@ -25,8 +25,7 @@ static DTOR(vararg_dtor) {
   struct Vararg_ *arg = *(struct Vararg_**)o->data;
   m_uint offset = 0;
   for(m_uint i = 0; i < vector_size(&arg->t); ++i) {
-    const Type t = (Type)vector_at(&arg->t, arg->i);
-    *(m_uint*)(arg->d + offset) = *(m_uint*)(shred->reg - SZ_INT + offset);
+    const Type t = (Type)vector_at(&arg->t, i);
     if(isa(t, shred->info->vm->gwion->type[et_object]) > 0)
       release(*(M_Object*)(arg->d + offset), shred);
     offset += t->size;
index bc944a4d49bb0e03e137dff9d757f05a439494ff..87b9cb84bfa446c57c6ecf90df25f05eb8c462f0 100644 (file)
@@ -1,8 +1,8 @@
 fun int test(...){
-  vararg.start;
-  <<< "test" >>>;
-  <<< vararg $ int >>>;
-  vararg.end;
+  varloop vararg {
+    <<< "test" >>>;
+    <<< vararg $ int >>>;
+  }
   return 1;
 }
 <<<  test()  >>>;