]> Nishi Git Mirror - gwion.git/commitdiff
:art: Update
authorfennecdjay <astor.jeremie@wanadoo.fr>
Fri, 22 Nov 2019 14:14:44 +0000 (15:14 +0100)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Fri, 22 Nov 2019 14:14:44 +0000 (15:14 +0100)
ast
include/env/env.h
src/compile.c
src/emit/emit.c
src/emit/memoize.c
src/gwion.c
src/import/special.c
src/lib/engine.c
src/parse/scan0.c
src/plug.c

diff --git a/ast b/ast
index 3f75322d63c10a8428e002b854a26211391474d0..2ed499104f6366ec0fbdb460e91cf31e8c5bb13e 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit 3f75322d63c10a8428e002b854a26211391474d0
+Subproject commit 2ed499104f6366ec0fbdb460e91cf31e8c5bb13e
index c907206772912657560c6f29f71ab679dd38fd56..89e6084784692006f97bc92b415338369669ad2d 100644 (file)
@@ -50,5 +50,5 @@ ANN Type find_type(const Env, ID_List);
 ANN m_bool already_defined(const Env env, const Symbol s, const loc_t pos);
 ANN m_bool type_engine_check_prog(const Env, const Ast);
 ANN m_bool traverse_func_template(const Env, const Func_Def);
-ANN2(1,3) void env_err(const Env, const struct YYLTYPE *pos, const m_str fmt, ...);
+ANN2(1,3) void env_err(const Env, const loc_t pos, const m_str fmt, ...);
 #endif
index a6fcbec4d88cb2935668b7f03a7e9de838e16714..52b0b5c0285e106d99b59cd318a1821ab7854a44 100644 (file)
@@ -80,7 +80,7 @@ static inline m_bool compiler_open(MemPool p, struct Compiler* c) {
 }
 
 static inline m_bool _check(struct Gwion_* gwion, struct Compiler* c) {
-  struct ScannerArg_ arg = { c->name, c->file, gwion->st, .ppa=gwion->ppa };
+  struct AstGetter_ arg = { c->name, c->file, gwion->st, .ppa=gwion->ppa };
   CHECK_OB((c->ast = parse(&arg)))
   gwion->env->name = c->name;
   for(m_uint i = 0; i < vector_size(&gwion->data->passes->vec); ++i) {
index 3671f589751dccbf3684ef315d649e9d4bbaed3a..ca32d9a4e3a9f73927ed247754e62b852f7b0358 100644 (file)
@@ -1038,8 +1038,8 @@ static m_bool scoped_stmt(const Emitter emit, const Stmt stmt, const m_bool pop)
 #define FORK_CODE_PREFIX  "fork~code:%i"
 
 static void push_spork_code(const Emitter emit, const m_str prefix, const loc_t pos) {
-  char c[strlen(SPORK_FUNC_PREFIX) + num_digit(pos->first_line) + 1];
-  sprintf(c, prefix, pos->first_line);
+  char c[strlen(SPORK_FUNC_PREFIX) + num_digit(pos->first.line) + 1];
+  sprintf(c, prefix, pos->first.line);
   emit_push_code(emit, c);
 }
 
index 30ac5e33d50efdd8eff816c5cd8fdb778185a692..3abeccb9969eb871a30970230e607c6acfcf168c 100644 (file)
@@ -44,7 +44,6 @@ Memoize memoize_ini(const Emitter emit, const Func f, const enum Kind kind) {
   Memoize m = mp_calloc(emit->gwion->mp, Memoize);
   vector_init(&m->v);
   m->ret_sz = f->def->base->ret_type->size;
-// a void pure function is suspicious at least. check that
   m->kind = kind;
   if(!GET_FLAG(f, member))
     m->arg_sz = f->def->stack_depth;
index 6f067f55529ecedbfdaf38d3ec1af66ff9ba991e..f37f86a2bbd13026afcadb4f85aeee21c8579e6c 100644 (file)
@@ -123,7 +123,7 @@ ANN void gwion_end(const Gwion gwion) {
   mempool_end(gwion->mp);
 }
 
-ANN void env_err(const Env env, const struct YYLTYPE* pos, const m_str fmt, ...) {
+ANN void env_err(const Env env, const loc_t pos, const m_str fmt, ...) {
   if(env->context && env->context->error)
       return;
   if(env->class_def)
index 87133f8b2accb9218c0da12d34be6ea9bd4ae19c..e047257f985dd0055a3d9af6e1ac7057ba7ef1c8 100644 (file)
@@ -38,7 +38,7 @@ ANN void gwi_specialid(const Gwi gwi, const m_str id, const SpecialId spid) {
 }
 
 ANN void gwi_set_loc(const Gwi gwi, const m_str file, const uint line) {
-  gwi->loc->first_line = gwi->loc->last_line = line;
+  gwi->loc->first.line = gwi->loc->last.line = line;
   gwi->gwion->env->name = file;
 }
 
index 75a7ba31e8a2548c9c1c56349623f02bf6d23283..1fb5e552b7e51fa64ff85067a3bf8d33126f36a2 100644 (file)
@@ -147,7 +147,7 @@ ANN static m_bool import_core_libs(const Gwi gwi) {
 
 ANN m_bool type_engine_init(VM* vm, const Vector plug_dirs) {
   vm->gwion->env->name = "[builtin]";
-  struct YYLTYPE loc = {};
+  struct loc_t loc = {};
   OperCK oper = {};
   struct Gwi_ gwi = { .gwion=vm->gwion, .loc=&loc, .oper=&oper };
   CHECK_BB(import_core_libs(&gwi))
index dfd0912f572e4ea16572559a713eb866890110e6..33e7f7a14f723cf6a016d54bf18dc08931b2e254 100644 (file)
@@ -168,11 +168,11 @@ ANN m_bool scan0_type_def(const Env env, const Type_Def tdef) {
 }
 
 ANN static Symbol scan0_sym(const Env env, const m_str name, const loc_t pos) {
-  const size_t line_len = num_digit(pos->first_line);
-  const size_t col_len = num_digit(pos->first_column);
+  const size_t line_len = num_digit(pos->first.line);
+  const size_t col_len = num_digit(pos->first.column);
   char c[strlen(env->curr->name) + strlen(env->name) + line_len + col_len + strlen(name) + 6];
   sprintf(c, "@%s:%s:%s:%u:%u", name, env->name, env->curr->name,
-      pos->first_line, pos->first_column);
+      pos->first.line, pos->first.column);
   return insert_symbol(c);
 }
 
index bd34041ead0fe963876d5c11dbb9cb03dd359ded..baa3d3b5c75d6794ee131c37b63f652b8ff141da 100644 (file)
@@ -166,15 +166,43 @@ void free_plug(const struct Gwion_ *gwion) {
   mp_free(gwion->mp, PlugInfo, p);
 }
 
+struct ArgSplitter {
+  m_str str;
+  Vector v;
+  MemPool mp;
+};
+
+ANN static void _split_args(struct ArgSplitter *as) {
+  const size_t sz = strlen(as->str);
+  char buf[sz + 1], prev = '\0';
+  m_uint i = 0, j = 0;
+  char c;
+  while((c = as->str[i]) != '\0') {
+    const m_bool skip  = prev == '\\';
+    const m_bool comma = c == ',';
+    if(comma) {
+      if(!skip)
+        break;
+      --j;
+    }
+    buf[j++] = (prev = c);
+    ++i;
+  }
+  buf[i] = '\0';
+  vector_add(as->v, (vtype)mstrdup(as->mp, buf));
+  if(i == sz)
+    return;
+  as->str += i + 1;
+  _split_args(as);
+}
+
 ANN Vector split_args(MemPool p, const m_str str) {
-  const Vector args = new_vector(p);
-  m_str d = strdup(str), e = d;
-  while(e)
-    vector_add(args, (vtype)mstrdup(p, strsep(&e, ",")));
-  xfree(d);
-  return args;
+  struct ArgSplitter as = { .str=str, .v=new_vector(p), .mp=p };
+  _split_args(&as);
+  return as.v;
 }
 
+
 ANN static Vector get_arg(MemPool p, const m_str name, const Vector v) {
   const size_t len = strlen(name);
   for(m_uint i = vector_size(v) + 1; --i;) {