]> Nishi Git Mirror - gwion.git/commitdiff
:art: Constructor for tuple types
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Thu, 5 Mar 2020 21:34:00 +0000 (22:34 +0100)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Thu, 5 Mar 2020 21:36:54 +0000 (22:36 +0100)
26 files changed:
src/emit/emit.c
src/lib/tuple.c
src/lib/vec.c
src/parse/check.c
src/parse/scan1.c
src/parse/scan2.c
tests/tuple/array_tuple_array.gw
tests/tuple/object_array_access_multi.gw
tests/tuple/tuple2obj_cast_err.gw
tests/tuple/tuple2obj_err.gw
tests/tuple/tuple_aray_access.gw
tests/tuple/tuple_aray_access_exceed.gw
tests/tuple/tuple_aray_access_multi.gw
tests/tuple/tuple_aray_access_not_prim.gw
tests/tuple/tuple_array_access_invalid.gw
tests/tuple/tuple_at.gw
tests/tuple/tuple_at_err.gw
tests/tuple/tuple_at_lit.gw
tests/tuple/tuple_cast3.gw
tests/tuple/tuple_implicit.gw
tests/tuple/tuple_implicit2.gw
tests/tuple/tuple_lit_error.gw
tests/tuple/tuple_member_float.gw
tests/tuple/tuple_skip.gw
tests/tuple/tuple_skip2.gw
tests/tuple/tuple_unpack_already_declared.gw

index dc47c6377282e59a25b04c0f8e2f7be666657c79..126bde8cd73519abdad78e1e2c3d0989f2c39c89 100644 (file)
@@ -544,17 +544,6 @@ ANN static void emit_vec_addr(const Emitter emit, const m_uint sz) {
   instr->m_val = offset;
 }
 
-ANN static m_bool emit_prim_vec(const Emitter emit, const Vec *vec) {
-  const ae_prim_t t = prim_self(vec)->prim_type;
-  CHECK_BB(emit_exp(emit, vec->exp, 0));
-  m_int n = (m_int)((t == ae_prim_vec ? 3 : 2) - vec->dim + 1);
-  while(--n > 0)
-    emit_add_instr(emit, RegPushImm2);
-  if(prim_exp(vec)->emit_var)
-    emit_vec_addr(emit, prim_exp(vec)->type->size);
-  return GW_OK;
-}
-
 ANN static m_bool emit_prim_id(const Emitter emit, const Symbol *data) {
   struct SpecialId_ * spid = specialid_get(emit->gwion, *data);
   if(spid)
@@ -562,13 +551,6 @@ ANN static m_bool emit_prim_id(const Emitter emit, const Symbol *data) {
   return emit_symbol(emit, prim_self(data));
 }
 
-ANN static m_bool emit_prim_tuple(const Emitter emit, const Tuple *tuple) {
-  CHECK_BB(emit_exp(emit, tuple->exp, 1))
-  const Instr instr = emit_add_instr(emit, TupleCtor);
-  instr->m_val = (m_uint)prim_exp(tuple)->type;
-  return GW_OK;
-}
-
 ANN static m_bool emit_prim_num(const Emitter emit, const m_uint *num) {
   regpushi(emit, *num);
   return GW_OK;
@@ -813,9 +795,11 @@ ANN static m_bool emit_exp_call(const Emitter emit, const Exp_Call* exp_call) {
   }
   if(exp_call->args)
     CHECK_BB(emit_exp(emit, exp_call->args, 1))
-  const Exp e = exp_self(exp_call);
-  if(e->emit_var)
-    emit_vec_addr(emit, e->type->size);
+    struct Op_Import opi = { .op=insert_symbol("@ctor"), .lhs=exp_call->func->type->e->d.base_type, .data=(uintptr_t)exp_call, .pos=exp_self(exp_call)->pos };
+    CHECK_OB(op_emit(emit, &opi))
+    const Exp e = exp_self(exp_call);
+    if(e->emit_var)
+      emit_vec_addr(emit, e->type->size);
   return GW_OK;
 }
 
index 5cdd75e499832d32eda07e4656381f29f33c13dc..b7d2402d63b1895616f6337ea9d0fd2112c1c614 100644 (file)
@@ -355,12 +355,37 @@ static OP_CHECK(opck_tuple) {
   return at_depth(env, &next);
 }
 
+static OP_CHECK(tuple_ck) {
+  const Exp_Call *call = (Exp_Call*)data;
+  const Exp exp = call->args;
+  CHECK_OO(check_exp(env, exp))
+  struct Vector_ v;
+  vector_init(&v);
+  Exp e = exp;
+  do vector_add(&v, (m_uint)e->type);
+  while((e = e->next));
+  const Type ret = tuple_type(env, &v, exp_self(call)->pos);
+  vector_release(&v);
+  return ret;
+}
+
+static OP_EMIT(tuple_em) {
+  const Exp_Call *call = (Exp_Call*)data;
+  const Instr instr = emit_add_instr(emit, TupleCtor);
+  instr->m_val = (m_uint)exp_self(call)->type;
+  return instr;
+}
+
 GWION_IMPORT(tuple) {
   const Type t_tuple = gwi_mk_type(gwi, "Tuple", SZ_INT, "Object");
   gwi_add_type(gwi, t_tuple);
   SET_FLAG(t_tuple, checked | ae_flag_scan2 | ae_flag_check | ae_flag_emit);
   gwi->gwion->type[et_tuple] = t_tuple;
   SET_FLAG(t_tuple, abstract | ae_flag_template);
+  GWI_BB(gwi_oper_ini(gwi, "Tuple", NULL, NULL))
+  GWI_BB(gwi_oper_add(gwi, tuple_ck))
+  GWI_BB(gwi_oper_emi(gwi, tuple_em))
+  GWI_BB(gwi_oper_end(gwi, "@ctor", NULL))
   GWI_BB(gwi_oper_ini(gwi, "Object", "Tuple", NULL))
   GWI_BB(gwi_oper_add(gwi, opck_at_tuple))
   GWI_BB(gwi_oper_emi(gwi, opem_at_tuple))
index 03795d75cd756f5e30cb1611361f68e207d9d974..aaa92d889fb6f91ec57be6e0da9bdc272b8559ec 100644 (file)
@@ -166,7 +166,7 @@ EQUALITY_OPER(vec3, SZ_VEC3);
 OP_CHECK(vecx_ck) {
   Exp_Call *call = (Exp_Call*)data;
   Exp e = call->args, last = NULL;
-  int i = 0;
+  size_t i = 0;
   const Type t_float = env->gwion->type[et_float];
   while(e) {
     CHECK_BO(check_implicit(env, e, t_float))
index 4e2de6a51ad40a82f07ea465274fadbe8598248f..ef9868eac55fbeb22a980f1137e36fd780b0cc57 100644 (file)
@@ -292,46 +292,6 @@ ANN static Type check_prim_id(const Env env, const Symbol *data) {
   return prim_id_non_res(env, data);
 }
 
-ANN static m_bool vec_value(const Env env, Exp e) {
-  CHECK_OB(check_exp(env, e))
-  const Type t_float = env->gwion->type[et_float];
-  do CHECK_BB(check_implicit(env, e, t_float))
-  while((e = e->next));
-  return GW_OK;
-}
-
-struct VecInfo {
-  Type   t;
-  m_str  s;
-  m_uint n;
-};
-
-ANN static void vec_info(const Env env, const ae_prim_t t, struct VecInfo* v) {
-  if(t == ae_prim_complex) {
-    v->s = "complex";
-    v->t = env->gwion->type[et_complex];
-    v->n = 2;
-  } else if(t == ae_prim_vec) {
-    v->t = env->gwion->type[v->n == 4 ? et_vec4 : et_vec3];
-    v->n = 4;
-    v->s = "vector";
-  } else {
-    v->s = "polar";
-    v->t = env->gwion->type[et_polar];
-    v->n = 2;
-  }
-}
-
-ANN static Type check_prim_vec(const Env env, const Vec *vec) {
-  const ae_prim_t t = prim_self(vec)->prim_type;
-  struct VecInfo info = { .n=vec->dim };
-  vec_info(env, t, &info);
-  if(vec->dim > info.n)
-    ERR_O(vec->exp->pos, _("extraneous component of %s value..."), info.s)
-  CHECK_BO(vec_value(env, vec->exp))
-  return info.t;
-}
-
 ANN static Type check_prim_hack(const Env env, const Exp *data) {
   if(env->func)
     UNSET_FLAG(env->func, pure);
@@ -339,18 +299,6 @@ ANN static Type check_prim_hack(const Env env, const Exp *data) {
   return env->gwion->type[et_gack];
 }
 
-ANN static Type check_prim_tuple(const Env env, const Tuple *tuple) {
-  CHECK_OO(check_exp(env, tuple->exp))
-  struct Vector_ v;
-  vector_init(&v);
-  Exp e = tuple->exp;
-  do vector_add(&v, (m_uint)e->type);
-  while((e = e->next));
-  const Type ret = tuple_type(env, &v, prim_pos(tuple));
-  vector_release(&v);
-  return ret;
-}
-
 #define describe_prim_xxx(name, type) \
 ANN static Type check##_prim_##name(const Env env NUSED, const union prim_data* data NUSED) {\
   return type; \
@@ -446,7 +394,6 @@ ANN static m_bool func_match_inner(const Env env, const Exp e, const Type t,
 
 ANN2(1,2) static Func find_func_match_actual(const Env env, Func func, const Exp args,
   const m_bool implicit, const m_bool specific) {
-printf("func %p %s\n", func, func->name);
   do {
     Exp e = args;
     Arg_List e1 = func->def->base->args;
@@ -745,20 +692,6 @@ ANN static Type check_exp_call_template(const Env env, Exp_Call *exp) {
   return func->def->base->ret_type;
 }
 
-ANN static m_bool check_exp_call1_check(const Env env, const Exp exp) {
-  CHECK_OB(check_exp(env, exp))
-  if(isa(exp->type, env->gwion->type[et_function]) < 0) {
-    if(isa(exp->type, env->gwion->type[et_class]) > 0) {
-puts("here:!:");
-//const Type t = exp->type->e->d.base_type;
-//const Func func = nspc_lookup_func0(t->e->owner, insert_symbol(t->name));
-//exp->type = func->value_ref->type;
-    } else
-    ERR_B(exp->pos, _("function call using a non-function value"))
-  }
-  return GW_OK;
-}
-
 ANN static Type check_lambda_call(const Env env, const Exp_Call *exp) {
   if(exp->args)
     CHECK_OO(check_exp(env, exp->args))
@@ -780,12 +713,16 @@ ANN static Type check_lambda_call(const Env env, const Exp_Call *exp) {
 }
 
 ANN Type check_exp_call1(const Env env, const Exp_Call *exp) {
-  CHECK_BO(check_exp_call1_check(env, exp->func))
+  CHECK_OO(check_exp(env, exp->func))
   if(isa(exp->func->type, env->gwion->type[et_function]) < 0) {
+    if(isa(exp->func->type, env->gwion->type[et_class]) < 0)
+      ERR_O(exp->func->pos, _("function call using a non-function value"))
     if(exp->args)
       CHECK_OO(check_exp(env, exp->args))
     struct Op_Import opi = { .op=insert_symbol("@ctor"), .lhs=exp->func->type->e->d.base_type, .data=(uintptr_t)exp, .pos=exp_self(exp)->pos };
-    return op_check(env, &opi);
+    const Type t = op_check(env, &opi);
+    exp_self(exp)->nspc = t ? t->e->owner : NULL;
+    return t;
   }
   if(exp->func->type == env->gwion->type[et_lambda])
     return check_lambda_call(env, exp);
index d1db4f31be97f32ad99670d60e4c534d68021d94..8916cce048b226ac6a82b4462a7fca052deb8d80 100644 (file)
@@ -137,8 +137,6 @@ ANN static inline m_bool scan1_prim(const Env env, const Exp_Primary* prim) {
     return scan1_exp(env, prim->d.array->exp);
   if(prim->prim_type == ae_prim_range)
     return scan1_range(env, prim->d.range);
-  if(prim->prim_type == ae_prim_tuple)
-    return scan1_exp(env, prim->d.tuple.exp);
 //  if(prim->prim_type == ae_prim_unpack)
 //    return scan1_exp(env, prim->d.tuple.exp);
   return GW_OK;
index ba453323fcb8b62a39596c0e2ed98158cb039134..f58c26940d9f028c94c6fd9c461f69c4a1a89c68 100644 (file)
@@ -120,8 +120,6 @@ ANN static inline m_bool scan2_prim(const Env env, const Exp_Primary* prim) {
     return scan2_exp(env, prim->d.array->exp);
   else if(prim->prim_type == ae_prim_range)
     return scan2_range(env, prim->d.range);
-  if(prim->prim_type == ae_prim_tuple)
-    return scan2_exp(env, prim->d.tuple.exp);
   return GW_OK;
 }
 
index 8ed2d130c70aca595bee1c8955d4c7b13383c634..af90f45e721b21baa16446721651d8aa80ad1945 100644 (file)
@@ -1,4 +1,4 @@
-<([1,2], "Tom") @=> <~int[], string~>Tuple @tup;
+Tuple([1,2], "Tom") @=> <~int[], string~>Tuple @tup;
 
 #!<<<tup[1]>>>;
 #!<<<tup[0][1]>>>;
index e9f2f9f841b90c06fc1b5314c37298d6e537f651..37c78222ee39e6074a5fddd143cbcab2beb2df53 100644 (file)
@@ -2,8 +2,8 @@ Object t[2];
 #!<<< t[0] >>>;
 #!null @=> t[0];
 <<< t >>>;
-<("tom", 12) @=> t[0];
-#!t << <("tom", 12);
+Tuple("tom", 12) @=> t[0];
+#!t << Tuple("tom", 12);
 #!<<< t.size() >>>;
 #!<<< t[0][0] >>>;
 #!<<< t[0][1] >>>;
index f1330c35b5d92cf75c3f74bb056d98b4fe3d5a9f..151752a5459e7862058c21452e590b8f180d7ddb 100644 (file)
@@ -1,2 +1,2 @@
 #! [contains] no match found for operator
-<(1) $ Object;
+Tuple(1) $ Object;
index 98b6c1755f91eeaf2069cf4335d1e237dc94516d..c54366c785b3cb0aa5fc843d7b47120a62b877f6 100644 (file)
@@ -1,2 +1,2 @@
 #! [contains] can't cast
-<(1) @=> <~int~>Ptr ptr;
+Tuple(1) @=> <~int~>Ptr ptr;
index 1c043df2898e5071eb8801abe1850a80f4928872..1ed8736d4f33e09e25bda33818e0693419a2bf92 100644 (file)
@@ -1,6 +1,6 @@
-<<< <("Tom", 12)[0] >>> ;
-#! <<< <("Tom", 12)[1] >>> ;
+<<< Tuple("Tom", 12)[0] >>> ;
+#! <<< Tuple("Tom", 12)[1] >>> ;
 
-#! <<< <("Tom", 12) @=> <~string, int~>Tuple @t >>> ;
+#! <<< Tuple("Tom", 12) @=> <~string, int~>Tuple @t >>> ;
 #! <<< t[0] >>> ;
 #! <<< t[1] >>> ;
index 69fd159fbe014d8a39a999370cdeb0be5bf41844..b7bcfa6ffbb23b30ea4a4ddef4f0878f28a53f3a 100644 (file)
@@ -1 +1 @@
-<("Tom", 12)[0][2];
+Tuple("Tom", 12)[0][2];
index 0a30f810d66affaddb13d8094e61d66720164e32..79350a2f263e3e234a0accbdac7d88480cac992f 100644 (file)
@@ -3,9 +3,9 @@
 #!null @=> t[0];
 <<< t >>>;
 <<< t[0] >>>;
-<<< <("tom", 12) @=> t[0] >>> ;
+<<< Tuple("tom", 12) @=> t[0] >>> ;
 
-#!t << <("tom", 12);
+#!t << Tuple("tom", 12);
 #!<<< t.size() >>>;
 #!<<< t[0][0] >>>;
 #!<<< t[0][1] >>>;
index 3afc0e1405579f1f59e1e639c982b239f12e64bc..9320ed44850d990fe0382c5f8bb820d34aaf2043 100644 (file)
@@ -1,2 +1,2 @@
 int i;
-<("Tom", 12)[i];
+Tuple("Tom", 12)[i];
index 6b23d6b2dbc2361e118cab307923a42b4eae14d0..3439089bbcc30eb3b1b277ee8918a8b6ac895e96 100644 (file)
@@ -1 +1 @@
-<(1.2,"test")[3];
+Tuple(1.2,"test")[3];
index a049f7a005bd75880ba2dc99d25c2b3a65dadd60..aa669c50e79a0d79e82991c096da1d1a72fff10a 100644 (file)
@@ -1,4 +1,4 @@
-<<< <("Tom", 6) @=> 
+<<< Tuple("Tom", 6) @=> 
 <~string, int~>Tuple @tup >>>;
 <<< typeof(tup) >>>;
 <<< tup >>>;
index 3ec6aa6039d19413d7856ea82449fbbbe7cd9df4..fe93e7544deded4cff993b2aefba81a2710784c5 100644 (file)
@@ -1,4 +1,4 @@
-<("Tom", 6) @=> 
+Tuple("Tom", 6) @=> 
 <~float, int~>Tuple @tup;
 <<< typeof(tup) >>>;
 <<< tup >>>;
index 981b5e020f980fba313dd03f0b5070632afa7270..91c50bdf1ef82b715365e424c89f8faf21a218d4 100644 (file)
@@ -1,2 +1,2 @@
 #! [contains] cannot assign
-<("Tom", 6) @=> <("Pat", 22);
+Tuple("Tom", 6) @=> Tuple("Pat", 22);
index 6b97446151c0e34a6577f6c88b74c3d9ee9609bf..0a3aebd54b4f94b63bcd61828a083a7f57815dc5 100644 (file)
@@ -1 +1 @@
-<(1) $ <~int~>Tuple;
+Tuple(1) $ <~int~>Tuple;
index 419a94ee7dc8062e222ca4378d9ce1e7ceeebf4d..54ead66052319ffe04de7ade60149e57e488cc0e 100644 (file)
@@ -3,5 +3,5 @@ fun void test(<~string~>Tuple t) {
   <<< t[0] >>>;
 }
 
-<( "Tom", 21) => test;
-#!<("Tom") => test;
+Tuple( "Tom", 21) => test;
+#!Tuple("Tom") => test;
index 3c3a6e652f41916dd4a8fc03cc2962569cadf85c..b9e38f0c1fafd12817fbfd0269d4dd024ea7db20 100644 (file)
@@ -2,4 +2,4 @@ class C { int i; }
 fun void test(C c) {
 
 }
-<(1) => test;
+Tuple(1) => test;
index 2e89d2dd76cb1e83b9b9fd03f3b85231174b2a11..9d5b5717f064038c4fc30555615b6519a919e769 100644 (file)
@@ -1 +1 @@
-<( new int);
+Tuple( new int);
index abb1b6e262b99b64a618a3d4575c039770051b11..c6c9fca16faa8346cc8252eb42c6a8da41ae869b 100644 (file)
@@ -1,4 +1,4 @@
-<(.2, Vec3(1), 3) @=> <~float, Vec3, int~>Tuple @t;
+Tuple(.2, Vec3(1), 3) @=> <~float, Vec3, int~>Tuple @t;
 t[0];
 t[1];
 3 => t[2];
index 73c6499fc9a5e540cfdd737dd10f10bea51620e8..cd289269c224eab4a1fbd3828ec1640e47d0958b 100644 (file)
@@ -1,2 +1,2 @@
-<(1, 2, 3) @=> >(b, _, c);
+Tuple(1, 2, 3) @=> >(b, _, c);
 <<< c >>>;
index bc0abe75ff0b66afbe19cad2daede58015206e70..8b4f0e91ea699c8b32279bf6a68503ed89557c2e 100644 (file)
@@ -1,6 +1,6 @@
-<("Tom", 2, "Taxi driver") @=> <~string,_, string~>Tuple @t;
+Tuple("Tom", 2, "Taxi driver") @=> <~string,_, string~>Tuple @t;
 <<< t>>>;
 <<< t[0]>>>;
-<("Tom", 2.3, "Cook") @=> t;
+Tuple("Tom", 2.3, "Cook") @=> t;
 #!<<< t[1]>>>;
 <<< t[2]>>>;
index e44abee73d8c59bfcf0b394a3a4d02d60927fe83..20178d9641dbdb9718e8af02544afeeadbaea9f7 100644 (file)
@@ -1,3 +1,3 @@
 #! [contains] already been defined in the same scope
 int i;
-<(12) @=> >(i);
+Tuple(12) @=> >(i);