]> Nishi Git Mirror - gwion.git/commitdiff
:art: Gwi effects
authorJérémie Astor <fennecdjay@gmail.com>
Thu, 29 Apr 2021 16:34:17 +0000 (18:34 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Thu, 29 Apr 2021 16:34:17 +0000 (18:34 +0200)
include/gwi.h
src/import/import_cdef.c
src/import/import_fdef.c
src/import/import_special.c

index fbac94e4873671963dc10bf9d1bee40a1ddfbfc4..94b22772f0abe1a25b5dfa7cd51eefb9fc8d74c4 100644 (file)
@@ -6,6 +6,7 @@ struct Gwi_ {
   Ast body;
   struct ImportCK *ck;
   struct OperCK *oper; // _misc
+  struct Vector_ effects;
   uint tmpls;
   loc_t loc;
 };
@@ -15,5 +16,6 @@ static inline Tmpl* gwi_tmpl(const Gwi gwi) {
   return new_tmpl_base(gwi->gwion->mp, gwi->ck->tmpl);
 }
 
+ANN void gwi_effects(const Gwi gwi, const m_str name);
 ANN m_bool gwi_run(const Gwion gwion, m_bool (*f)(const Gwi));
 #endif
index 9d298bb37066b52a80b14aecc1ca87e1056575ea..485867537b7ea281e24cdd46c51e2646ed5a400a 100644 (file)
@@ -125,6 +125,11 @@ ANN m_int gwi_class_end(const Gwi gwi) {
     --gwi->tmpls;
     nspc_pop_type(gwi->gwion->mp, gwi->gwion->env->curr);
   }
+  if(gwi->effects.ptr) {
+    vector_init(&t->effects);
+    vector_copy2(&gwi->effects, &t->effects);
+    vector_release(&gwi->effects);
+  }
   env_pop(gwi->gwion->env, 0);
   return GW_OK;
 }
index 2815a7298c9fc6c43eee9eef870c2966deea8080..bafa8e7c013f9910a3417f4a1f0f5803b63b9ad1 100644 (file)
@@ -54,6 +54,11 @@ ANEW ANN static Func_Base* gwi_func_base(const Gwi gwi, ImportCK *ck) {
 ANEW ANN static Func_Def import_fdef(const Gwi gwi, ImportCK *ck) {
   Func_Base* base = gwi_func_base(gwi, ck);
   const Func_Def fdef = new_func_def(gwi->gwion->mp, base, NULL);
+  if(gwi->effects.ptr) {
+    vector_init(&fdef->base->effects);
+    vector_copy2(&gwi->effects, &fdef->base->effects);
+    vector_release(&gwi->effects);
+  }
   return fdef;
 }
 
index f81684d8490397de2e71fa6e852457acd6ab2417..0e8d80ca882f2b9aac7e9437d3c6456b8b395b67 100644 (file)
@@ -55,3 +55,10 @@ ANN m_bool gwi_gack(const Gwi gwi, const Type type, const f_gack d) {
 ANN VM* gwi_vm(const Gwi gwi) {
   return gwi->gwion->vm;
 }
+
+ANN void gwi_effects(const Gwi gwi, const m_str name) {
+  if(!gwi->effects.ptr)
+    vector_init(&gwi->effects);
+  const Symbol sym = insert_symbol(gwi->gwion->st, name);
+  vector_add(&gwi->effects, (m_uint)sym);
+}