]> Nishi Git Mirror - gwion.git/commitdiff
:art: vargarg coverage and simplification
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Thu, 12 Mar 2020 19:19:29 +0000 (20:19 +0100)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Thu, 12 Mar 2020 19:19:29 +0000 (20:19 +0100)
src/lib/vararg.c
src/vm/vm.c
tests/new/vararg_cpy.gw [new file with mode: 0644]

index e54b3d0bc82568f4709cdb6dda5aa3b00a00902e..b6b37f2ed5a2d7c9ef6e92e43ee2a43c9cfcfe39 100644 (file)
@@ -34,8 +34,8 @@ static DTOR(vararg_dtor) {
   free_vararg(shred->info->vm->gwion->mp, arg);
 }
 
-ANN static M_Object vararg_cpy(VM_Shred shred, struct Vararg_* src) {
-  const M_Object o = new_object(shred->info->mp, shred, shred->info->vm->gwion->type[et_vararg]);
+static MFUN(mfun_vararg_cpy) {
+  struct Vararg_ *src =  *(struct Vararg_**)o->data;
   struct Vararg_* arg = mp_calloc(shred->info->mp, Vararg);
   vector_copy2(&src->t, &arg->t);
   arg->l = src->l;
@@ -51,12 +51,9 @@ ANN static M_Object vararg_cpy(VM_Shred shred, struct Vararg_* src) {
   arg->s = vector_size(&arg->t);
   arg->i = src->i;
   arg->o = src->o;
-  *(struct Vararg_**)o->data = arg;
-  return o;
-}
-
-static MFUN(mfun_vararg_cpy) {
-  *(M_Object*)RETURN = vararg_cpy(shred, *(struct Vararg_**)o->data);
+  const M_Object obj = new_object(shred->info->mp, shred, o->type_ref);
+  *(struct Vararg_**)obj->data = arg;
+  *(M_Object*)RETURN = obj;
 }
 
 INSTR(VarargIni) {
@@ -95,10 +92,6 @@ static OP_CHECK(opck_vararg_cast) {
   return known_type(env, cast->td);
 }
 
-static OP_CHECK(opck_vararg_at) {
-  return env->gwion->type[et_null];
-}
-
 static INSTR(VarargCast) {
   const M_Object o = *(M_Object*)REG(-SZ_INT);
   if(!*(m_uint*)(o->data + SZ_INT))
@@ -159,15 +152,12 @@ GWION_IMPORT(vararg) {
   CHECK_BB(gwi_func_ini(gwi, "Vararg", "cpy"))
   CHECK_BB(gwi_func_end(gwi, mfun_vararg_cpy, ae_flag_none))
   GWI_BB(gwi_class_end(gwi))
-  SET_FLAG(t_vararg, abstract | ae_flag_const);
+  SET_FLAG(t_vararg, abstract);
   CHECK_BB(gwi_set_global_type(gwi, t_vararg, et_vararg))
   GWI_BB(gwi_oper_ini(gwi, "nonnull Vararg", (m_str)OP_ANY_TYPE, NULL))
   GWI_BB(gwi_oper_add(gwi, opck_vararg_cast))
   GWI_BB(gwi_oper_emi(gwi, opem_vararg_cast))
   GWI_BB(gwi_oper_end(gwi, "$", NULL))
-  GWI_BB(gwi_oper_ini(gwi, "Vararg", (m_str)OP_ANY_TYPE, NULL))
-  GWI_BB(gwi_oper_add(gwi, opck_vararg_at))
-  GWI_BB(gwi_oper_end(gwi, "@=>", NULL))
   gwi_register_freearg(gwi, VarargIni, freearg_vararg);
   struct SpecialId_ spid = { .type=t_vararg, .is_const=1, .ck=idck_vararg, .em=idem_vararg};
   gwi_specialid(gwi, "vararg", &spid);
index 599c3dfe8936acef9e3e08b54f01ec2af658c863..33ea94a271f4e6070859caff29561994ecc41b5d 100644 (file)
@@ -766,7 +766,7 @@ remref:
   release(*(M_Object*)(mem + VAL), shred);
   DISPATCH()
 setobj:
-  a.obj  = *(M_Object*)(reg-SZ_INT-VAL);
+  a.obj  = *(M_Object*)(reg-SZ_INT-(m_int)VAL);
   DISPATCH();
 except:
 /* TODO: Refactor except instruction             *
diff --git a/tests/new/vararg_cpy.gw b/tests/new/vararg_cpy.gw
new file mode 100644 (file)
index 0000000..baedc59
--- /dev/null
@@ -0,0 +1,5 @@
+fun void test(...) {
+  <<< vararg >>>;
+  <<< vararg.cpy() @=> Vararg ref new_arg >>>;
+}
+test(1);