]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix variadic builtin
authorfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 11 Dec 2018 00:27:38 +0000 (01:27 +0100)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Tue, 11 Dec 2018 00:27:38 +0000 (01:27 +0100)
include/vararg.h
src/lib/vararg.c
src/parse/check.c
src/parse/scan2.c
tests/test_plugins/variadic.c
tests/test_plugins/variadic.gw

index 3ae9b74d7fae9e7e2cb1b64fcc72d1b885ba2cf1..d816e2d39bdb3f7a83756fb28630a2862ac7ed4a 100644 (file)
@@ -5,5 +5,5 @@ struct Vararg_ {
   m_bit* d;  // d(ata)
   m_uint o, i, s; // o(ffset), i(ndex), s(ize)
 };
-
+void free_vararg(struct Vararg_* arg);
 #endif
index dd4ad668e8ead9b687c606219d12602c7d28e957..c9ec4805f5b0f6e8249626fb678c892fae3417a6 100644 (file)
 #include "import.h"
 #include "vararg.h"
 
+void free_vararg(struct Vararg_* arg) {
+  xfree(arg->d);
+  xfree(arg->k);
+  mp_free(Vararg, arg);
+}
+
 INSTR(VarargTop) { GWDEBUG_EXE
   struct Vararg_* arg = *(struct Vararg_**)MEM(instr->m_val);
   if(arg->d)
@@ -18,7 +24,6 @@ INSTR(VarargTop) { GWDEBUG_EXE
   else {
     shred->pc = instr->m_val2 + 1;
     mp_free(Vararg, arg);
-    return;
   }
 }
 
@@ -28,24 +33,15 @@ INSTR(VarargIni) { GWDEBUG_EXE
     POP_REG(shred,  instr->m_val)
     arg->d = (m_bit*)xmalloc(instr->m_val);
     memcpy(arg->d, shred->reg, instr->m_val);
-  } else {
-    if(*(m_uint*)instr->ptr)
-      POP_REG(shred, SZ_INT)
-    arg->d = NULL;
-  }
+  } else if(*(m_uint*)instr->ptr)
+    POP_REG(shred, SZ_INT)
   const Vector kinds = (Vector)instr->m_val2;
   if(kinds) {
-    arg->s = vector_size(kinds);
-    if(arg->s) {
+    if((arg->s = vector_size(kinds))) {
       arg->k = (m_uint*)xcalloc(arg->s, SZ_INT);
       memcpy(arg->k, kinds->ptr + OFFSET, arg->s * SZ_INT);
     }
-  } else {
-    arg->s = 0;
-    arg->k = NULL;
   }
-  arg->o = 0;
-  arg->i = 0;
   *(struct Vararg_**)REG(0) = arg;
   PUSH_REG(shred,  SZ_INT);
 }
@@ -56,11 +52,8 @@ INSTR(VarargEnd) { GWDEBUG_EXE
   arg->o += arg->k[arg->i];
   if(++arg->i < arg->s)
     shred->pc = instr->m_val2;
-  else {
-    free(arg->d);
-    free(arg->k);
-    mp_free(Vararg, arg);
-  }
+  else
+    free_vararg(arg);
 }
 
 INSTR(VarargMember) { GWDEBUG_EXE
index da5a0716218f2d75503b649f9b2078e0d96e2c92..8b729463b38b5445216a5c78af48a29f72154833 100644 (file)
@@ -1074,11 +1074,8 @@ ANN m_bool check_func_def(const Env env, const Func_Def f) { GWDEBUG_EXE
     ret = err_msg(f->td->xid->pos, "...in function '%s'", s_name(f->name));
   if(variadic)
     REM_REF(variadic)
-  if(GET_FLAG(f, builtin)) {
-    if(GET_FLAG(func, member) && GET_FLAG(func, ref))
-      f->stack_depth += SZ_INT;
+  if(GET_FLAG(f, builtin))
     func->code->stack_depth = f->stack_depth;
-  }
   else if(GET_FLAG(f, op))
     operator_func(func);
   nspc_pop_value(env->curr);
index fbd67dcb0adbde2e71d23d18fd10fe38dcb2138e..c08e4b33f10058ee68bd65b20f2e7acdfd0850ec 100644 (file)
@@ -369,6 +369,8 @@ ANN2(1, 2) static m_bool scan2_func_def_template (const Env env, const Func_Def
 
 ANN static m_bool scan2_func_def_builtin(const Func func, const m_str name) { GWDEBUG_EXE
   SET_FLAG(func, builtin);
+  if(GET_FLAG(func->def, variadic))
+    func->def->stack_depth += SZ_INT;
   func->code = new_vm_code(NULL, func->def->stack_depth,
       GET_FLAG(func, member), name);
   SET_FLAG(func->code, builtin);
index e98a2f2159ffceb7cf64d25c62209fc75d23fa44..9802e84b49cc7ff240ad746b3d972355b0609afa 100644 (file)
@@ -9,6 +9,10 @@
 #include "import.h"
 #include "vararg.h"
 
+static MFUN(m_test) {
+  printf("%p\n", *(M_Object*)MEM(0));
+}
+
 static MFUN(m_variadic) {
   M_Object str_obj = *(M_Object*)MEM(SZ_INT);
   if(!str_obj)return;
@@ -29,7 +33,7 @@ static MFUN(m_variadic) {
     arg->i++;
     str++;
   }
-  POP_REG(shred, SZ_INT);
+  free_vararg(arg);
 }
 
 GWION_IMPORT(variadic test) {
@@ -38,6 +42,8 @@ GWION_IMPORT(variadic test) {
   CHECK_BB(gwi_func_ini(gwi, "void", "member", m_variadic))
   CHECK_BB(gwi_func_arg(gwi, "string", "format"))
   CHECK_BB(gwi_func_end(gwi, ae_flag_variadic))
+  CHECK_BB(gwi_func_ini(gwi, "void", "test", m_test))
+  CHECK_BB(gwi_func_end(gwi, 0))
   CHECK_BB(gwi_class_end(gwi))
   return 1;
 }
index 50668ca536f554f8ff1cb6b9a3e768660bc4512a..c315163f2d6743b760ece82a3a0c91c62452087c 100644 (file)
@@ -2,7 +2,12 @@
 Variadic v;
 "iiii" => string format;
 <<<v, " ", format $ Object>>>;
-//v.member(format);
 v.member(format, 1,2,3,4);
-//v.member(1,2,3,4);
-//v.member(1,2,3,4);
+v.member(format, 1,2,3,4);
+v.test();
+v.member(format, 1,2,3,4);
+v.member(format, 1,2,3,4);
+v.test();
+v.member(format, 1,2,3,4);
+v.member(format, 1,2,3,4);
+v.test();