]> Nishi Git Mirror - gwion.git/commitdiff
:art: Changes to builtin func, list types for variadic builtin
authorfennecdjay <fennecdjay@gmail.com>
Sat, 30 Jul 2022 05:33:37 +0000 (07:33 +0200)
committerfennecdjay <fennecdjay@gmail.com>
Sat, 30 Jul 2022 05:33:37 +0000 (07:33 +0200)
include/env/func.h
include/vm.h
src/emit/emit.c
src/env/func.c
src/import/import_fdef.c
src/lib/array.c
src/lib/instr.c
src/parse/func_resolve_tmpl.c
src/parse/template.c

index 3316d7897859556bc6178f2e78cab560c1113652..7f3a742511ee288bc0d64ee55b7db7425a6665e7 100644 (file)
@@ -35,7 +35,7 @@ Symbol     func_symbol(const Env, const m_str, const m_str, const m_str,
                        const m_uint);
 ANN m_bool check_lambda(const Env, const Type, Exp_Lambda *);
 ANN Type   check_op_call(const Env env, Exp_Call *const exp);
-ANN void   builtin_func(const MemPool mp, const Func f, void *func_ptr);
+ANN void   builtin_func(const Gwion gwion, const Func f, void *func_ptr);
 
 ANN static inline Value upvalues_lookup(const Upvalues *upvalues, const Symbol sym) {
   const Value v = (Value)scope_lookup1(upvalues->values, (m_uint)sym);
index e57b036d8c3f30f02aa3ddc3956f7dc16192ed23..f66f431fe32d8844c8b5959f99a449c5bb81170e 100644 (file)
@@ -3,10 +3,15 @@
 
 typedef struct VM_Code_ *VM_Code;
 struct VM_Code_ {
-  m_bit *bytecode;
   union {
-    struct Vector_ instr;
-    m_uint         native_func;
+    struct {
+      m_bit *bytecode;
+      struct Vector_ instr;
+    };
+    struct {
+      m_uint         native_func;
+      MP_Vector *types;
+    };
   };
   Type ret_type; // could be `struct Vector_ tmpl_types;`
   void *   memoize;
index e3c7c89734a89514bf78bf718344013855907bd7..b73e635c62a22b54063d68884c4dcef9e028b48e 100644 (file)
@@ -2821,7 +2821,7 @@ ANN static m_bool _emit_func_def(const Emitter emit, const Func_Def f) {
       safe_tflag(emit->env->class_def, tflag_tmpl)) || (fdef->base->tmpl && !strcmp(s_name(f->base->xid), "new"))) {
     const Func base =
         nspc_lookup_func1(func->value_ref->from->owner, f->base->xid);
-    builtin_func(emit->gwion->mp, func, (f_xfun)base->code->native_func);
+    builtin_func(emit->gwion, func, (f_xfun)base->code->native_func);
     return GW_OK;
   }
   const uint   global = GET_FLAG(f->base, global);
index 4334b2580e6a2f4a11c46ff0bfc860263f9b0f6b..6e550e9d5c7d2c2b56be17f6448f227da8f3b18c 100644 (file)
@@ -34,9 +34,19 @@ Symbol func_symbol(const Env env, const m_str nspc, const m_str base,
   return insert_symbol(env->gwion->st, name);
 }
 
-ANN void builtin_func(const MemPool mp, const Func f, void *func_ptr) {
+ANN void builtin_func(const Gwion gwion, const Func f, void *func_ptr) {
   set_vflag(f->value_ref, vflag_builtin);
-  f->code = new_vmcode(mp, NULL, NULL, f->name, f->def->stack_depth, true, false);
+  f->code = new_vmcode(gwion->mp, NULL, NULL, f->name, f->def->stack_depth, true, false);
   f->code->native_func = (m_uint)func_ptr;
   f->code->ret_type = f->def->base->ret_type;
+  if(f->def->base->tmpl && f->def->base->tmpl->call) {
+    const Specialized *spec = mp_vector_at(f->def->base->tmpl->list, Specialized, f->def->base->tmpl->list->len - 1);
+    if(!strcmp(s_name(spec->xid), "...")) {
+      f->code->types = new_mp_vector(gwion->mp, Type_Decl*, f->def->base->tmpl->call->len);
+      for(uint32_t i = 0; i < f->def->base->tmpl->call->len; i++)  {
+        Type_Decl *const td = *mp_vector_at(f->def->base->tmpl->call, Type_Decl*, i);
+        mp_vector_set(f->code->types, Type, i, known_type(gwion->env, td));
+      }
+    }
+  }
 }
index b45eb9799c43c615b5f0904b7047ce529fb4860c..9e643b41b70e59635f3f513dddecf3fcec49a5d6 100644 (file)
@@ -82,7 +82,7 @@ ANN m_int gwi_func_valid(const Gwi gwi, ImportCK *ck) {
   }
   if (traverse_func_def(gwi->gwion->env, fdef) < 0)
     return error_fdef(gwi, fdef);
-  builtin_func(gwi->gwion->mp, fdef->base->func, ck->addr);
+  builtin_func(gwi->gwion, fdef->base->func, ck->addr);
   return GW_OK;
 }
 
index 9e73daa250de10c52ed1126197fb26b93e75d056..bfb6c87ca4177891ab42f36251efd0f6178788b8 100644 (file)
@@ -654,7 +654,7 @@ static MFUN(vm_vector_foldr) {
 #include "template.h"
 static void array_func(const Env env, const Type t, const m_str name, f_xfun fun) {
   const Value v = nspc_lookup_value0(t->nspc, insert_symbol(name));
-  builtin_func(env->gwion->mp, v->d.func_ref, fun);
+  builtin_func(env->gwion, v->d.func_ref, fun);
 }
 
 static OP_CHECK(opck_array_scan) {
@@ -712,7 +712,7 @@ static OP_CHECK(opck_array_scan) {
                   ? !tflag(base, tflag_struct) ? vm_vector_rem_obj
                                                : vm_vector_rem_struct
                   : vm_vector_rem;
-  builtin_func(env->gwion->mp, (Func)vector_at(&t->nspc->vtable, 0), rem);
+  builtin_func(env->gwion, (Func)vector_at(&t->nspc->vtable, 0), rem);
   void *insert = isa(base, env->gwion->type[et_compound]) > 0
                      ? !tflag(base, tflag_struct) ? vm_vector_insert_obj
                                                   : vm_vector_insert_struct
index 5e476494d18730a007ab694a1a96fff596dfc088..328a57d5f78b0d586fa47a12f9f1b935ca98a734 100644 (file)
@@ -27,7 +27,7 @@ ANN static Func_Def traverse_tmpl(const Emitter emit, Func_Def fdef, Func_Def fb
   if (vflag(v, vflag_builtin)) v->d.func_ref->def->d.dl_func_ptr = xfun;
   def->base->tmpl->call = cpy_type_list(env->gwion->mp, fbase->base->tmpl->call);
   CHECK_BO(traverse_dot_tmpl(emit, def, v));
-  if (vflag(v, vflag_builtin)) builtin_func(emit->gwion->mp, def->base->func, xfun);
+  if (vflag(v, vflag_builtin)) builtin_func(emit->gwion, def->base->func, xfun);
   return def;
 }
 
index 1978584e45b3cee661424a8952275e39096a4eb6..23dccba0b612f15f983e979895e47e7f3188657b 100644 (file)
@@ -114,7 +114,7 @@ ANN static Func create_tmpl(const Env env, struct ResolverArgs *ra,
 
   const Func func        = ensure_tmpl(env, fdef, ra->e, ra->v->from->filename);
   if (func && func->def->builtin) {
-    builtin_func(env->gwion->mp, func, (void*)ra->v->d.func_ref->code->native_func);
+    builtin_func(env->gwion, func, (void*)ra->v->d.func_ref->code->native_func);
     set_vflag(func->value_ref, vflag_builtin);
     struct Op_Import opi = { .lhs = ra->v->d.func_ref->value_ref->type, .rhs = func->value_ref->type };
     op_cpy(env, &opi);
index a482747b1fc59eb6341284d17bbd04e2158f8ffe..302626091ad5f1e9836cb99291d4f7a258e2685a 100644 (file)
@@ -120,7 +120,7 @@ static ANN Type scan_func(const Env env, const Type t, const Type_Decl *td) {
   def->base->func = func;
   nspc_add_value_front(t->info->value->from->owner, sym, value);
   if (vflag(t->info->func->value_ref, vflag_builtin)) {
-    builtin_func(env->gwion->mp, func, func_ptr);
+    builtin_func(env->gwion, func, func_ptr);
     t->info->func->def->d.dl_func_ptr = func_ptr;
   }
   return ret;