]> Nishi Git Mirror - gwion.git/commitdiff
index on master: e523855b :art: fix class const generics
authorfennecdjay <fennecdjay@gmail.com>
Fri, 3 May 2024 02:26:47 +0000 (04:26 +0200)
committerfennecdjay <fennecdjay@gmail.com>
Fri, 3 May 2024 02:26:47 +0000 (04:26 +0200)
13 files changed:
src/env/env_utils.c
src/import/import_checker.c
src/import/import_tdef.c
src/lib/array.c
src/lib/closure.c
src/lib/deep_equal.c
src/lib/engine.c
src/lib/lib_gack.c
src/lib/modules.c
src/lib/object.c
src/lib/object_op.c
src/lib/sift.c
src/lib/union.c

index 4c59b4928577dbe11158752b51a81b92de535191..8860af6ae620c275aebf53f1b53d6305261cd4da 100644 (file)
@@ -59,8 +59,20 @@ ANN Type find_type(const Env env, Type_Decl *td) {
   while ((td = td->next) && type && type->nspc) {
     const Nspc nspc  = type->nspc;
     if(!(type = find_in_parent(type, td->tag.sym)))
+      ERR_O(td->tag.loc, _("...(cannot find class '%s' in nspc '%s')"),
+s_name(td->tag.sym), nspc->name);
+
+/*
+    if(!type)
       ERR_O(td->tag.loc, _("...(cannot find class '%s' in nspc '%s')"),
             s_name(td->tag.sym), nspc->name);
+    Type_Decl *next = td->next;
+    td->next = NULL;
+env_push_type(env, type);
+    type = known_type(env, td);
+env_pop(env, 0); // respect scope depth // use env scope
+    td->next = next;
+*/
   }
   return type;
 }
index c552d696243ac61a7cd66e64aa7c7b3ffd7d5161..5cfdee98696b2a85beb865ed4d8b33b3f4072517 100644 (file)
@@ -19,6 +19,11 @@ struct td_checker {
   m_str       str;
   const loc_t loc;
 };
+ANN static void eat_space(struct td_checker *tdc) {
+  while(isspace(*tdc->str)) {
+    tdc->str++;
+  }
+}
 
 struct AC {
   m_str  str;
@@ -79,23 +84,35 @@ ANN bool str2var(const Gwion gwion, Var_Decl *vd, const m_str path, const loc_t
   vd->value = NULL;
   return true;
 }
-
+ANN static Type_Decl *_str2td(const Gwion, struct td_checker *tdc);
 #define ARG_ERROR     (Arg_List)         -1
 #define SPEC_ERROR    (Specialized_List) -1
 #define TMPLARG_ERROR (TmplArg_List)     -1
 
 ANN static bool _tmpl_list(const Gwion        gwion,
                                        struct td_checker *tdc, Specialized_List *sl) {
+  eat_space(tdc);
   if(unlikely(!strncmp(tdc->str, "...", 3))) {
     tdc->str += 3;
     Specialized spec = { .tag = MK_TAG(insert_symbol(gwion->st, "..."), tdc->loc) };
     mp_vector_add(gwion->mp, sl, Specialized, spec);
     return true;
   }
-  DECL_O(const Symbol, sym, = __str2sym(gwion, tdc));
-  // TODO: handle traits?
-  Specialized spec = { .tag = MK_TAG(sym, tdc->loc) };
-  mp_vector_add(gwion->mp, sl, Specialized, spec);
+  if(unlikely(!strncmp(tdc->str, "const ", 6))) {
+    tdc->str += 6;
+    // eat space?
+    eat_space(tdc);
+    Type_Decl *td = _str2td(gwion, tdc);
+    eat_space(tdc);
+    DECL_O(const Symbol, sym, = __str2sym(gwion, tdc));
+    Specialized spec = { .td = td, .tag = MK_TAG(sym, tdc->loc)  };
+    mp_vector_add(gwion->mp, sl, Specialized, spec);
+  } else {
+    DECL_O(const Symbol, sym, = __str2sym(gwion, tdc));
+    // TODO: handle traits?
+    Specialized spec = { .tag = MK_TAG(sym, tdc->loc) };
+    mp_vector_add(gwion->mp, sl, Specialized, spec);
+  }
   if (*tdc->str == ',') {
     ++tdc->str;
     if (!_tmpl_list(gwion, tdc, sl))
@@ -142,7 +159,7 @@ ANN bool str2tl(const Gwion gwion, struct td_checker *tdc, TmplArg_List *tl) {
       if (!str2tl(gwion, tdc, tl))
         return false;
     }
-  } else GWION_ERR_B(tdc->loc, "invalid character in template list");
+  } else GWION_ERR_B(tdc->loc, "invalid character %c in template list", *tdc->str);
   return true;
 }
 
@@ -264,7 +281,11 @@ ANN static Type_Decl *_str2td(const Gwion gwion, struct td_checker *tdc) {
   return td;
 }
 
+#include "gwion_parse.h"
 ANN Type_Decl *str2td(const Gwion gwion, const m_str str, const loc_t loc) {
+  return gwion_parse_type_decl(gwion, str, loc);
+
+
   struct td_checker tdc = {.str = str, .loc = loc};
   DECL_O(Type_Decl *, td, = _str2td(gwion, &tdc));
   if(*tdc.str) {
index f6e713d045b35d5e15caad843ba32b3f867dd633..b26c363508c0158ffc978f87b0042080fbfe15ab 100644 (file)
@@ -33,6 +33,16 @@ ANN Type gwi_typedef_end(const Gwi gwi, const ae_flag flag) {
       new_type_def(gwi->gwion->mp, td, gwi->ck->sym, gwi->loc);
   if (gwi->ck->when) tdef->when = gwi->ck->when;
   if (gwi->ck->tmpl) tdef->tmpl = gwi_tmpl(gwi);
+
+  if (safe_tflag(gwi->gwion->env->class_def, tflag_tmpl)) {
+    Section section = MK_SECTION(
+      type, type_def, tdef, gwi->loc 
+    );
+    gwi_body(gwi, &section);
+    ck_end(gwi);
+    return 1;
+  }
+  
   gwi->ck->td      = NULL;
   gwi->ck->tmpl    = NULL;
   const bool ret = traverse_type_def(gwi->gwion->env, tdef);
index ad81b1387e61d798012aa14837003895f071a003..b547db6aef283b0b85a7269cdf57bd634377747f 100644 (file)
@@ -378,6 +378,7 @@ static OP_CHECK(opck_array) {
   const Array_Sub array = (Array_Sub)data;
   const Type      t_int = env->gwion->type[et_int];
   Exp*             e     = array->exp;
+  // FIX: we should only take up to *depth* expressions
   do CHECK_ON(check_implicit(env, e, t_int));
   while ((e = e->next));
   const Type t = get_array_type(array->type);
index 54951c572dd3aafdfcc546f56b4ccf6f831300fc..533c5f6b24a29281f487dab44b232c747263b705 100644 (file)
@@ -723,34 +723,34 @@ static GACK(gack_function) { INTERP_PRINTF("%s", t->name); }
 
 GWION_IMPORT(func) {
   gwidoc(gwi, "the base of all functions.");
-  const Type t_function = gwi_mk_type(gwi, "function", SZ_INT, NULL);
+  const Type t_function = gwi_mk_type(gwi, "Function", SZ_INT, NULL);
   GWI_B(gwi_gack(gwi, t_function, gack_function))
   GWI_B(gwi_set_global_type(gwi, t_function, et_function))
 
   gwidoc(gwi, "the base of decayed operators.");
-  const Type t_op = gwi_mk_type(gwi, "operator", SZ_INT, "function");
+  const Type t_op = gwi_mk_type(gwi, "Operator", SZ_INT, "Function");
   GWI_B(gwi_set_global_type(gwi, t_op, et_op))
 
   gwidoc(gwi, "the base of function pointers.");
-  const Type t_closure = gwi_class_ini(gwi, "funptr", "Object");
+  const Type t_closure = gwi_class_ini(gwi, "Funptr", "Object");
   t_closure->nspc->offset = SZ_INT*3;
   gwi_class_xtor(gwi, fptr_ctor, fptr_dtor);
   GWI_B(gwi_set_global_type(gwi, t_closure, et_closure))
   GWI_B(gwi_func_ini(gwi, "void", "default"));
   GWI_B(gwi_func_end(gwi, fptr_default, ae_flag_none));
-  gwi_class_end(gwi);
-
-   GWI_B(gwi_oper_ini(gwi, "funptr", NULL, NULL))
+  gwi_class_end(gwi)
+;
+   GWI_B(gwi_oper_ini(gwi, "Funptr", NULL, NULL))
    GWI_B(gwi_oper_add(gwi, opck_closure_scan))
    GWI_B(gwi_oper_end(gwi, "class", NULL))
 
-   GWI_B(gwi_oper_ini(gwi, (m_str)OP_ANY_TYPE, "function", NULL))
+   GWI_B(gwi_oper_ini(gwi, (m_str)OP_ANY_TYPE, "Function", NULL))
    GWI_B(gwi_oper_add(gwi, opck_func_call))
    GWI_B(gwi_oper_end(gwi, "=>", NULL))
-   GWI_B(gwi_oper_ini(gwi, (m_str)OP_ANY_TYPE, "funptr", NULL))
+   GWI_B(gwi_oper_ini(gwi, (m_str)OP_ANY_TYPE, "Funptr", NULL))
    GWI_B(gwi_oper_add(gwi, opck_fptr_call))
    GWI_B(gwi_oper_end(gwi, "=>", NULL))
-   GWI_B(gwi_oper_ini(gwi, "function", "funptr", NULL))
+   GWI_B(gwi_oper_ini(gwi, "Function", "Funptr", NULL))
    GWI_B(gwi_oper_add(gwi, opck_fptr_assign))
    GWI_B(gwi_oper_emi(gwi, opem_fptr_assign))
    GWI_B(gwi_oper_end(gwi, ":=>", NULL))
@@ -759,16 +759,16 @@ GWION_IMPORT(func) {
    GWI_B(gwi_oper_end(gwi, "@implicit", NULL))
    GWI_B(gwi_oper_add(gwi, opck_fptr_cast))
    GWI_B(gwi_oper_end(gwi, "$", NULL))
-   GWI_B(gwi_oper_ini(gwi, "operator", "funptr", NULL))
+   GWI_B(gwi_oper_ini(gwi, "Operator", "Funptr", NULL))
    GWI_B(gwi_oper_add(gwi, opck_op_impl))
    GWI_B(gwi_oper_emi(gwi, opem_op_impl))
    GWI_B(gwi_oper_end(gwi, "@implicit", NULL))
    GWI_B(gwi_oper_add(gwi, opck_op_cast))
    GWI_B(gwi_oper_end(gwi, "$", NULL))
-   GWI_B(gwi_oper_ini(gwi, "function", "function", NULL))
+   GWI_B(gwi_oper_ini(gwi, "Function", "Function", NULL))
    GWI_B(gwi_oper_add(gwi, opck_auto_fptr))
    GWI_B(gwi_oper_end(gwi, ":=>", int_r_assign))
-   GWI_B(gwi_oper_ini(gwi, "function", NULL, NULL))
+   GWI_B(gwi_oper_ini(gwi, "Function", NULL, NULL))
    GWI_B(gwi_oper_add(gwi, opck_func_partial))
    GWI_B(gwi_oper_end(gwi, "@partial", NULL))
    GWI_B(gwi_oper_ini(gwi, "Class", NULL, NULL))
index b60a682dcc9421e0cfd775228e3535a51c5df26c..f442dd0b0a2aa79970aa34f1f339772f5dfbc3f8 100644 (file)
@@ -247,7 +247,8 @@ GWION_IMPORT(deep_equal) {
      GWI_B(gwi_oper_emi(gwi, opem_deep_ne_any))
      GWI_B(gwi_oper_end(gwi, "<>", NULL))
 
-   GWI_B(gwi_oper_ini(gwi, "@Compound", "@Compound", "bool"))
+   //GWI_B(gwi_oper_ini(gwi, "@Compound", "@Compound", "bool"))
+   GWI_B(gwi_oper_ini(gwi, "Compound", "Compound", "bool"))
 
     gwidoc(gwi, "Deep Equality");
      GWI_B(gwi_oper_add(gwi, opck_deep_equal))
index eb400abae9ea43379fd2674c636a9df08ed0ee64..42e1aa028059e76eac9a94d28b003c0e1f59c792 100644 (file)
@@ -107,7 +107,8 @@ ANN static bool import_core_libs(const Gwi gwi) {
 
   GWI_B(gwimport_enum(gwi));
 
-  const Type t_compound = gwi_mk_type(gwi, "@Compound", SZ_INT, NULL);
+  //const Type t_compound = gwi_mk_type(gwi, "@Compound", SZ_INT, NULL);
+  const Type t_compound = gwi_mk_type(gwi, "Compound", SZ_INT, NULL);
   GWI_B(gwi_gack(gwi, t_compound, gack_compound))
   GWI_B(gwi_set_global_type(gwi, t_compound, et_compound))
 
@@ -120,6 +121,7 @@ ANN static bool import_core_libs(const Gwi gwi) {
   GWI_B(gwimport_union(gwi))
 
   GWI_B(gwimport_array(gwi))
+  GWI_B(gwimport_vector(gwi))
   GWI_B(gwimport_event(gwi))
   GWI_B(gwimport_ugen(gwi))
   GWI_B(gwimport_xork(gwi))
@@ -133,13 +135,14 @@ ANN static bool import_core_libs(const Gwi gwi) {
   GWI_B(gwimport_modules(gwi))
 
   gwidoc(gwi, "allow member access.");
-   GWI_B(gwi_oper_ini(gwi, "@Compound", (m_str)OP_ANY_TYPE, NULL))
+   //GWI_B(gwi_oper_ini(gwi, "@Compound", (m_str)OP_ANY_TYPE, NULL))
+   GWI_B(gwi_oper_ini(gwi, "Compound", (m_str)OP_ANY_TYPE, NULL))
    GWI_B(gwi_oper_add(gwi, opck_object_dot))
    GWI_B(gwi_oper_emi(gwi, opem_object_dot))
    GWI_B(gwi_oper_end(gwi, ".", NULL))
 
   // allow const generics in functions
-   GWI_B(gwi_oper_ini(gwi, "function", (m_str)OP_ANY_TYPE, NULL))
+   GWI_B(gwi_oper_ini(gwi, "Function", (m_str)OP_ANY_TYPE, NULL))
    GWI_B(gwi_oper_add(gwi, opck_object_dot))
    GWI_B(gwi_oper_emi(gwi, opem_object_dot))
    GWI_B(gwi_oper_end(gwi, ".", NULL))
index aa2d225e718c77c5377a3733dc20e9ba789a40a2..69d0dcb507b858303c6fd9f1a99eba3b14750e6d 100644 (file)
@@ -41,12 +41,12 @@ static OP_EMIT(opem_gack_implicit) {
 GWION_IMPORT(gack) {
 
   gwidoc(gwi, "a type for *pretty print*.");
-  const Type t_gack = gwi_mk_type(gwi, "@Gack", SZ_INT, NULL);
+  const Type t_gack = gwi_mk_type(gwi, "Gack", SZ_INT, NULL);
   GWI_B(gwi_gack(gwi, t_gack, gack_gack))
   GWI_B(gwi_set_global_type(gwi, t_gack, et_gack));
 
   gwidoc(gwi, "@Gack implicit cast");
-   GWI_B(gwi_oper_ini(gwi, "@Gack", (m_str)OP_ANY_TYPE, NULL))
+   GWI_B(gwi_oper_ini(gwi, "Gack", (m_str)OP_ANY_TYPE, NULL))
    GWI_B(gwi_oper_add(gwi, opck_gack_implicit))
    GWI_B(gwi_oper_emi(gwi, opem_gack_implicit))
    GWI_B(gwi_oper_end(gwi, "@implicit", NULL))
index b5792223f03ef64243f2d1dc7fa1598af1f85f2e..d9b37e2fde1b21851d38f9fca46a0083c18d3fec 100644 (file)
@@ -278,7 +278,7 @@ static GWION_IMPORT(usrugen) {
   GWI_B(gwi_func_ini(gwi, "int", "default_tick"))
   GWI_B(gwi_func_end(gwi, default_tick, 0))
   GWI_B(gwi_class_end(gwi))
-   GWI_B(gwi_oper_ini(gwi, "function", "UsrUGen", "UsrUGen"))
+   GWI_B(gwi_oper_ini(gwi, "Function", "UsrUGen", "UsrUGen"))
    GWI_B(gwi_oper_add(gwi, opck_usrugen))
    GWI_B(gwi_oper_emi(gwi, opem_usrugen))
    GWI_B(gwi_oper_end(gwi, "~=>", NULL))
index 8bd413fb11add7f0c985630a92435c4f0120ac0f..8bf9294edc51a215abd851336fc561128416ff9b 100644 (file)
@@ -140,7 +140,8 @@ static ID_EMIT(opem_super) {
 }
 
 GWION_IMPORT(object) {
-  const Type t_object = gwi_mk_type(gwi, "Object", SZ_INT, "@Compound");
+  //const Type t_object = gwi_mk_type(gwi, "Object", SZ_INT, "@Compound");
+  const Type t_object = gwi_mk_type(gwi, "Object", SZ_INT, "Compound");
   gwi_set_global_type(gwi, t_object, et_object);
   set_tflag(t_object, tflag_compound);
   t_object->nspc = new_nspc(gwi->gwion->mp, "Object");
index 37962697a8e4caa7f9e50ca8532c034887007ac4..99a591fbc6c308e3006565ff148f76c2152faff7 100644 (file)
@@ -381,7 +381,8 @@ GWION_IMPORT(object_op) {
   GWI_B(gwi_oper_add(gwi, opck_object_at))
   GWI_B(gwi_oper_emi(gwi, opem_object_at))
   GWI_B(gwi_oper_end(gwi, ":=>", NULL))
-  GWI_B(gwi_oper_ini(gwi, (m_str)OP_ANY_TYPE, "@Compound", NULL))
+  //GWI_B(gwi_oper_ini(gwi, (m_str)OP_ANY_TYPE, "@Compound", NULL))
+  GWI_B(gwi_oper_ini(gwi, (m_str)OP_ANY_TYPE, "Compound", NULL))
   GWI_B(gwi_oper_add(gwi, opck_object_instance))
   GWI_B(gwi_oper_end(gwi, "=>", NULL))
   GWI_B(gwi_oper_ini(gwi, "Object", "Object", "bool"))
@@ -397,7 +398,8 @@ GWION_IMPORT(object_op) {
   GWI_B(gwi_oper_add(gwi, opck_unary_meta2))
   GWI_B(gwi_oper_emi(gwi, opem_not_object))
   GWI_B(gwi_oper_end(gwi, "!", NULL))
-  GWI_B(gwi_oper_ini(gwi, "@Compound", NULL, NULL))
+  //GWI_B(gwi_oper_ini(gwi, "@Compound", NULL, NULL))
+  GWI_B(gwi_oper_ini(gwi, "Compound", NULL, NULL))
   GWI_B(gwi_oper_add(gwi, opck_struct_scan))
   GWI_B(gwi_oper_end(gwi, "class", NULL))
   return true;
index cd73de37bc9625453148cb444bc2ec291aa3efed..f64ce856c47a114edaa46b94a7adff698de00b25 100644 (file)
@@ -85,19 +85,19 @@ GWION_IMPORT(sift) {
               "#!-     samp => now;\n"
               "#!-   }\n"
               "#!- }");
-   GWI_B(gwi_oper_ini(gwi, "UGen", "function", "Sift"));
+   GWI_B(gwi_oper_ini(gwi, "UGen", "Function", "Sift"));
    GWI_B(gwi_oper_add(gwi, opck_ctrl));
    GWI_B(gwi_oper_end(gwi, "|>", NULL));
 
-   GWI_B(gwi_oper_ini(gwi, "Sift", "function", "Sift"));
+   GWI_B(gwi_oper_ini(gwi, "Sift", "Function", "Sift"));
    GWI_B(gwi_oper_add(gwi, opck_sift));
    GWI_B(gwi_oper_end(gwi, "|>", NULL));
 
-   GWI_B(gwi_oper_ini(gwi, "UGen", "funptr", "Sift"));
+   GWI_B(gwi_oper_ini(gwi, "UGen", "Funptr", "Sift"));
    GWI_B(gwi_oper_add(gwi, opck_ctrl));
    GWI_B(gwi_oper_end(gwi, "|>", NULL));
 
-   GWI_B(gwi_oper_ini(gwi, "Sift", "funptr", "Sift"));
+   GWI_B(gwi_oper_ini(gwi, "Sift", "Funptr", "Sift"));
    GWI_B(gwi_oper_add(gwi, opck_sift));
    GWI_B(gwi_oper_end(gwi, "|>", NULL));
   return true;
index 638202653e0d0809dc7e67d9e77e04b6f91210d8..30191bf26ecd175e96d150469662ae354df206df 100644 (file)
@@ -170,7 +170,7 @@ ANN GWION_IMPORT(union) {
    GWI_B(gwi_oper_emi(gwi, opem_none))
    GWI_B(gwi_oper_end(gwi, ":=>", NoOp))
 
-  const Type t_union = gwi_struct_ini(gwi, "union");
+  const Type t_union = gwi_struct_ini(gwi, "Union");
   //gwi_class_xtor(gwi, NULL, UnionDtor);
   gwi->gwion->type[et_union] = t_union;
 
@@ -197,7 +197,7 @@ ANN GWION_IMPORT(union) {
   const struct Op_Func   opfunc1 = {.ck = opck_union_new};
   CHECK_B(add_op_func_check(gwi->gwion->env, t_union, &opfunc1, 1));
 
-   GWI_B(gwi_oper_ini(gwi, "union", (m_str)OP_ANY_TYPE, NULL))
+   GWI_B(gwi_oper_ini(gwi, "Union", (m_str)OP_ANY_TYPE, NULL))
    GWI_B(gwi_oper_emi(gwi, opem_union_dot))
    GWI_B(gwi_oper_end(gwi, ".", NULL))