]> Nishi Git Mirror - gwion.git/commitdiff
:art: add a few functionalities to import
authorfennecdjay <fennecdjay@gmail.com>
Fri, 29 Mar 2024 13:48:38 +0000 (14:48 +0100)
committerfennecdjay <fennecdjay@gmail.com>
Fri, 29 Mar 2024 13:48:38 +0000 (14:48 +0100)
include/import/checker.h
include/import/tdef.h
src/import/import_fdef.c
src/import/import_tdef.c

index dda8e3709e6cd4dde970c19d961405229b629aa7..4b2d9e5660f43dcdb2ebf2693b064f7faca6a320 100644 (file)
@@ -13,7 +13,7 @@ typedef struct ImportCK { // name_checker ?
   };
   union {
     Symbol xid; // union name
-    f_xfun addr;
+    Exp *when; // typedef when
   };
   union {
     Variable_List     list; // union
index 816055e816a45ae55bc0f97940d7883618c3ec28..37c9dce12319b8b267adcb21f6dacd2d1a2a923c 100644 (file)
@@ -3,6 +3,7 @@
 
 ANN bool gwi_typedef_ini(const Gwi gwi, const restrict m_str type,
                           const restrict m_str name);
+ANN bool gwi_typedef_exp(const Gwi gwi, const restrict m_str data);
 ANN Type  gwi_typedef_end(const Gwi gwi, const ae_flag flag);
 ANN void  ck_clean_tdef(MemPool, ImportCK *);
 
index c035158b19e131b991b5b7098d0f11657f3645fa..3af28254e1d297903ae40029721a91f812d4070c 100644 (file)
@@ -14,6 +14,7 @@
 #include "import.h"
 #include "gwi.h"
 #include "clean.h"
+#include "gwion_parse.h"
 
 ANN2(1, 2, 3)
 static bool dl_func_init(const Gwi gwi, const restrict m_str t,
@@ -69,29 +70,37 @@ ANN static bool error_fdef(const Gwi gwi, const Func_Def fdef) {
   return false;
 }
 
-ANN bool gwi_func_valid(const Gwi gwi, ImportCK *ck) {
+ANN static bool gwi_func_valid(const Gwi gwi, const f_xfun addr, ImportCK *ck) {
   const Func_Def fdef = import_fdef(gwi, ck);
   fdef->builtin = true;
   if (safe_tflag(gwi->gwion->env->class_def, tflag_tmpl)) {
     section_fdef(gwi, fdef);
-    fdef->d.dl_func_ptr = ck->addr;
+    fdef->d.dl_func_ptr = addr;
     return true;
   }
   if (!traverse_func_def(gwi->gwion->env, fdef))
     return error_fdef(gwi, fdef);
-  builtin_func(gwi->gwion, fdef->base->func, ck->addr);
+  builtin_func(gwi->gwion, fdef->base->func, addr);
   return true;
 }
 
 ANN bool gwi_func_end(const Gwi gwi, const f_xfun addr, const ae_flag flag) {
   CHECK_B(ck_ok(gwi, ck_fdef));
-  gwi->ck->addr    = addr;
   gwi->ck->flag    = flag;
-  const bool ret = gwi_func_valid(gwi, gwi->ck);
+  const bool ret = gwi_func_valid(gwi, addr, gwi->ck);
   ck_end(gwi);
   return ret;
 }
 
+ANN bool gwi_func_code(const Gwi gwi, const char *data) {
+  Func_Def fdef = gwion_parse_func_def(gwi->gwion, data, gwi->loc);
+  if (safe_tflag(gwi->gwion->env->class_def, tflag_tmpl))
+    return section_fdef(gwi, fdef);
+  if (!traverse_func_def(gwi->gwion->env, fdef))
+    return error_fdef(gwi, fdef);
+  return true;
+}
+
 ANN bool gwi_func_arg(const Gwi gwi, const restrict m_str t,
                        const restrict m_str n) {
   CHECK_B(ck_ok(gwi, ck_fdef));
index 65786d13050fe5987a9d71469b949a8625eeb829..f6e713d045b35d5e15caad843ba32b3f867dd633 100644 (file)
@@ -10,6 +10,7 @@
 #include "operator.h"
 #include "import.h"
 #include "gwi.h"
+#include "gwion_parse.h"
 
 ANN bool gwi_typedef_ini(const Gwi gwi, const restrict m_str type,
                           const restrict m_str name) {
@@ -19,12 +20,18 @@ ANN bool gwi_typedef_ini(const Gwi gwi, const restrict m_str type,
   return !!(gwi->ck->td = gwi_str2td(gwi, type));
 }
 
+ANN bool gwi_typedef_exp(const Gwi gwi, const restrict m_str data) {
+  CHECK_B((gwi->ck->when = gwion_parse_expression(gwi->gwion, data, gwi->loc)));
+  return true;
+}
+
 ANN Type gwi_typedef_end(const Gwi gwi, const ae_flag flag) {
   CHECK_O(ck_ok(gwi, ck_tdef));
   Type_Decl *td = gwi->ck->td;
   td->flag |= flag;
   const Type_Def tdef =
       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);
   gwi->ck->td      = NULL;
   gwi->ck->tmpl    = NULL;
@@ -44,5 +51,6 @@ ANN Type gwi_typedef_end(const Gwi gwi, const ae_flag flag) {
 
 ANN void ck_clean_tdef(MemPool mp, ImportCK *ck) {
   if (ck->td) free_type_decl(mp, ck->td);
+  if (ck->when) free_exp(mp, ck->when);
   if (ck->tmpl) free_id_list(mp, ck->tmpl);
 }