]> Nishi Git Mirror - gwion.git/commitdiff
:art improve passes and doc mode
authorJérémie Astor <fennecdjay@gmail.com>
Sat, 15 May 2021 00:05:39 +0000 (02:05 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Sat, 15 May 2021 00:05:39 +0000 (02:05 +0200)
include/gwiondata.h
include/pass.h
src/env/env_utils.c
src/gwion.c
src/gwiondata.c
src/import/import_internals.c
src/pass.c

index 2c621ef047271ba9719e1b3b72116263b8a26793..eb56f93520b725f28f3e2ae73acfbde697b8696d 100644 (file)
@@ -11,8 +11,8 @@ typedef struct GwionData_ {
   bool   cdoc;
 } GwionData;
 
-ANN GwionData* new_gwiondata(MemPool);
+ANN GwionData* new_gwiondata(const MemPool);
 ANN GwionData* cpy_gwiondata(MemPool, const GwionData*);
-ANN void free_gwiondata(const struct Gwion_*);
+ANN void free_gwiondata(const Gwion);
 ANN void free_gwiondata_cpy(const MemPool, GwionData*);
 #endif
index 42df4c4a2da58d0fecdb757fbf26bc0bd549d171..119a1cbf7466798124f2449fc90b83043d55dace 100644 (file)
@@ -13,7 +13,7 @@ struct Passes_ {
 // change this to gwion ?
 typedef m_bool (*compilation_pass)(const Env, PassArg);
 
-ANEW ANN struct Passes_* new_passes(MemPool mp);
+ANEW ANN struct Passes_* new_passes(const Gwion);
 ANN void free_passes(MemPool mp, struct Passes_*);
 ANN void pass_register(const Gwion, const m_str, const compilation_pass);
 ANN void pass_default(const Gwion);
index c3672d9c079ffa144958cb8bed398f59d2b68f32..fe3c882c14443c7d60311dd61ceaabcefb64f2b6 100644 (file)
@@ -108,7 +108,10 @@ ANN Value global_string(const Env env, const m_str str) {
 }
 
 ANN m_bool isres(const Env env, const Symbol xid, const loc_t pos) {
-  if(vector_find(&env->gwion->data->reserved, (vtype)xid) > -1)
-    ERR_B(pos, _("%s is reserved."), s_name(xid));
+  const Map map = &env->gwion->data->id;
+  for(m_uint i = 0; i < map_size(map); i++) {
+    if(xid == (Symbol)VKEY(map, i))
+      ERR_B(pos, _("%s is reserved."), s_name(xid));
+  }
   return GW_OK;
 }
index 092fc9f6e1327aaceb2623e941a76f371e63ffe6..3bc2ebc4865106f4f253198ff296490e9f6b0ee3 100644 (file)
@@ -76,6 +76,13 @@ ANN static m_bool gwion_ok(const Gwion gwion, Arg* arg) {
 
 #define LOCALE_INFO INSTALL_PREFIX "/share"
 
+ANN static void doc_mode(const Gwion gwion) {
+  struct Vector_ v;
+  vector_init(&v);
+  vector_add(&v, (m_uint)"scan0");
+  pass_set(gwion, &v);
+}
+
 ANN m_bool gwion_ini(const Gwion gwion, Arg* arg) {
 #ifdef USE_GETTEXT
   setlocale(LC_ALL, NULL);
@@ -90,8 +97,8 @@ ANN m_bool gwion_ini(const Gwion gwion, Arg* arg) {
   gwion_core(gwion);
   gwion->data = new_gwiondata(gwion->mp);
   gwion->type = (Type*)xcalloc(MAX_TYPE, sizeof(struct Type_*));
-  pass_default(gwion);
   arg->si = gwion->vm->bbq->si = new_soundinfo(gwion->mp);
+  new_passes(gwion);
   CHECK_BB(arg_parse(gwion, arg));
   if(arg->color == COLOR_NEVER)
     tcol_override_color_checks(0);
@@ -99,6 +106,10 @@ ANN m_bool gwion_ini(const Gwion gwion, Arg* arg) {
     tcol_override_color_checks(isatty(1));
   else if(arg->color == COLOR_ALWAYS)
     tcol_override_color_checks(1);
+  if(!gwion->data->cdoc)
+    pass_default(gwion);
+  else
+    doc_mode(gwion);
   return !arg->quit ? gwion_ok(gwion, arg) : GW_ERROR;
 }
 
index 13d88071e4b73344e53c57947b7a592109b32274..7b2af4b590a96d96cdc15bf5a1d57a871bbed127 100644 (file)
@@ -16,11 +16,10 @@ ANN static inline GwionData* gwiondata(MemPool mp) {
   return data;
 }
 
-ANN GwionData* new_gwiondata(MemPool mp) {
+ANN GwionData* new_gwiondata(const MemPool mp) {
   GwionData *data = gwiondata(mp);
   map_init(&data->freearg);
   map_init(&data->id);
-  data->passes = new_passes(mp);
   return data;
 }
 
@@ -38,7 +37,7 @@ ANN void free_gwiondata_cpy(const MemPool mp, GwionData *data) {
   mp_free(mp, GwionData, data);
 }
 
-ANN void free_gwiondata(const struct Gwion_ *gwion) {
+ANN void free_gwiondata(const Gwion gwion) {
   GwionData *data = gwion->data;
   map_release(&data->freearg);
   for(m_uint i = 0; i < map_size(&data->id); ++i)
index 19b25541cb00a7a7d2e97870701653afec1b4b47..467184bd262447af0988ccc8408bc2f40b6ea11c 100644 (file)
@@ -38,7 +38,6 @@ ANN static m_bool run_with_doc(const Gwi gwi, m_bool (*f)(const Gwi)) {
 ANN m_bool gwi_run(const Gwion gwion, m_bool (*f)(const Gwi)) {
   const m_str name = gwion->env->name;
   OperCK oper = {};
-printf("cdoc %u\n", gwion->data->cdoc);
   struct Gwi_ gwi = { .gwion=gwion, .oper=&oper };
   const m_bool ret = !gwion->data->cdoc ?
         f(&gwi) : run_with_doc(&gwi, f);
index b2abca41cfd2f077df2f0bd9fb58923e1cf49dc9..57cb6b782422d7f622e0b4dab37a7e6064d923e0 100644 (file)
@@ -8,9 +8,13 @@
 #include "pass.h"
 #include "traverse.h"
 
-static const m_str default_passes_name[] = { "check", "emit" };
-static const compilation_pass default_passes[] = { traverse_ast, emit_ast };
-#define NPASS sizeof(default_passes)/sizeof(default_passes[0])
+#define N_PASS     2
+#define N_SCANPASS 4
+
+static const m_str default_passes_name[2] = { "check", "emit" };
+static const compilation_pass default_passes[4] = { traverse_ast, emit_ast };
+static const m_str scan_passes_name[4] = { "scan0", "scan1", "scan2", "type_check" };
+static const compilation_pass scan_passes[4] = { scan0_ast, scan1_ast, scan2_ast, check_ast };
 
 ANN void pass_register(const Gwion gwion, const m_str name, const compilation_pass pass) {
   const Symbol sym = insert_symbol(gwion->st, name);
@@ -37,18 +41,19 @@ ANN m_bool pass_set(const Gwion gwion, const Vector passes) {
 ANN void pass_default(const Gwion gwion) {
   struct Vector_ v;
   vector_init(&v);
-  for(m_uint i = 0; i < NPASS; ++i) {
+  for(m_uint i = 0; i < N_PASS; ++i)
     vector_add(&v, (vtype)default_passes_name[i]);
-    pass_register(gwion, default_passes_name[i], default_passes[i]);
-  }
   pass_set(gwion, &v);
   vector_release(&v);
 }
 
-
-ANEW ANN struct Passes_* new_passes(MemPool mp) {
-  struct Passes_ *a = mp_calloc(mp, Passes);
+ANEW ANN struct Passes_* new_passes(const Gwion gwion) {
+  struct Passes_ *a = gwion->data->passes = mp_calloc(gwion->mp, Passes);
   map_init(&a->map);
+  for(m_uint i = 0; i < N_PASS; ++i)
+    pass_register(gwion, default_passes_name[i], default_passes[i]);
+  for(m_uint i = 0; i < N_SCANPASS; ++i)
+    pass_register(gwion, scan_passes_name[i], scan_passes[i]);
   vector_init(&a->vec);
   return a;
 }