]> Nishi Git Mirror - gwion.git/commitdiff
:art: Update ast
authorfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 2 May 2019 21:35:45 +0000 (23:35 +0200)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Thu, 2 May 2019 21:35:51 +0000 (23:35 +0200)
ast
src/emit/emit.c
src/lib/func.c
src/lib/shred.c
src/parse/check.c
src/parse/scan1.c

diff --git a/ast b/ast
index 564a6a8786d2db8fe1bdfa1f2a0ea94685cc04a5..26981201377874f666cf62ea915c167357637c30 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit 564a6a8786d2db8fe1bdfa1f2a0ea94685cc04a5
+Subproject commit 26981201377874f666cf62ea915c167357637c30
index 1accd9e189460606e94caa755bbc691ed958e056..b64df0fc96d4a14ebe199474c3595b452d991128 100644 (file)
@@ -950,8 +950,7 @@ ANN m_bool emit_exp_spork(const Emitter emit, const Exp_Unary* unary) {
     spork->m_val = emit->code->stack_depth;
   } else {
     const Func f = unary->exp->d.exp_call.m_func;
-    const m_uint size = f->def->stack_depth - (GET_FLAG(f, member) && !GET_FLAG(code, member) ? SZ_INT : 0);
-    emit_exp_spork_finish(emit, size);
+    emit_exp_spork_finish(emit, f->def->stack_depth);
     const Instr end = emit_add_instr(emit, is_spork ? SporkEnd : ForkEnd);
     end->m_val2 = f->def->base->ret_type->size;
   }
index 15037e0122eaf39f3d50a4a15ca21af4fd28113b..da79573917a76933054ef54cea34a246f4f45224 100644 (file)
@@ -158,6 +158,9 @@ ANN Type check_exp_unary_spork(const Env env, const Stmt code);
 
 static OP_CHECK(opck_spork) {
   const Exp_Unary* unary = (Exp_Unary*)data;
+  if(unary->op == op_fork && !unary->fork_ok)
+    ERR_O(exp_self(unary)->pos, "forks must be stored in a value:\n"
+        "fork xxx @=> Fork f")
   if(unary->exp && unary->exp->exp_type == ae_exp_call)
     return unary->op == op_spork ? t_shred : t_fork;
   else if(unary->code) {
index a404adffc1e59614698799ea3da80b2845aca049..616d097ae2f97a8e30a031fa0bdef26d6941ff42 100644 (file)
@@ -15,6 +15,7 @@
 
 static m_int o_fork_thread, o_shred_cancel, o_fork_done, o_fork_ev, o_fork_retsize, o_fork_retval, 
   o_fork_orig;
+
 #define FORK_THREAD(o) *(THREAD_TYPE*)(o->data + o_fork_thread)
 #define FORK_RETSIZE(o) *(m_int*)(o->data + o_fork_retsize)
 #define FORK_RETVAL(o) (o->data + o_fork_retval)
@@ -51,8 +52,11 @@ static MFUN(vm_shred_is_done) {
 
 static MFUN(shred_yield) {
   const VM_Shred s = ME(o);
-  const Shreduler sh = shred->tick->shreduler;
-  shredule(sh, s, GWION_EPSILON);
+  const Shreduler sh = s->tick->shreduler;
+  if(vector_size(shred->code->instr) - shred->pc > 1)
+    shredule(sh, s, GWION_EPSILON);
+  else
+    vm_shred_exit(shred);
 }
 
 static SFUN(vm_shred_from_id) {
index b2e62da88f0eacde90f814c9549c5928a9bd1d36..1f6a44eb6123a62f656f904e2bb4e1fb367e6150 100644 (file)
@@ -110,6 +110,8 @@ ANN Type check_exp_decl(const Env env, const Exp_Decl* decl) { GWDEBUG_EXE
     if(decl->type == t_auto)
       ERR_O(td_pos(decl->td), "can't infer type.");
   }
+  if(!decl->type) // TODO: remove when scan passes are complete
+      ERR_O(td_pos(decl->td), "can't infer type.");
   if(GET_FLAG(decl->type , template)) {
     const Type t = typedef_base(decl->type);
     CHECK_BO(traverse_template(env, t->def))
@@ -613,6 +615,9 @@ ANN Type check_exp_call1(const Env env, const Exp_Call *exp) {
 }
 
 ANN static Type check_exp_binary(const Env env, const Exp_Binary* bin) { GWDEBUG_EXE
+  if(bin->lhs->exp_type == ae_exp_unary && bin->lhs->d.exp_unary.op == op_fork &&
+       bin->rhs->exp_type == ae_exp_decl)
+     bin->lhs->d.exp_unary.fork_ok = 1;
   CHECK_OO(check_exp(env, bin->lhs))
   if(bin->rhs->exp_type == ae_exp_decl && bin->rhs->d.exp_decl.type == t_auto)
     bin->rhs->type = bin->rhs->d.exp_decl.type = bin->lhs->type;
index d7e85abc46ac849de9dab211aa38217a39cd254c..c1fdab32e75bf871949308caa2cd7eea55174ce9 100644 (file)
@@ -62,14 +62,10 @@ ANN m_bool scan1_exp_decl(const Env env, const Exp_Decl* decl) { GWDEBUG_EXE
     const Value former = nspc_lookup_value0(env->curr, var->xid);
     CHECK_BB(isres(env, var->xid, exp_self(decl)->pos))
     if(former && !decl->td->exp &&
-/*!(decl->td->xid->xid == insert_symbol("auto") && former->type != t_auto) &&*/
-//(decl->td->xid->xid == insert_symbol("auto") && former->type != t_auto) &&
-//(!env->class_def ||
-//        (!GET_FLAG(env->class_def, template) || !GET_FLAG(env->class_def, scan1))))
         (!env->class_def || !(GET_FLAG(env->class_def, template) || GET_FLAG(env->class_def, scan1))))
       ERR_B(var->pos, "variable %s has already been defined in the same scope...",
               s_name(var->xid))
-    if(var->array && decl->type != t_undefined && decl->type != t_auto) {
+    if(var->array) {
       if(var->array->exp) {
         if(GET_FLAG(decl->td, ref))
           ERR_B(td_pos(decl->td), "ref array must not have array expression.\n"
@@ -79,10 +75,10 @@ ANN m_bool scan1_exp_decl(const Env env, const Exp_Decl* decl) { GWDEBUG_EXE
       t = array_type(env, decl->type, var->array->depth);
     }
     const Value v = var->value = former ? former : new_value(env->gwion->p, t, s_name(var->xid));
-    nspc_add_value(nspc, var->xid, v);
-    v->flag = decl->td->flag;
     if(var->array && !var->array->exp)
       SET_FLAG(v, ref);
+    nspc_add_value(nspc, var->xid, v);
+    v->flag = decl->td->flag;
     if(!env->func && !env->scope->depth && !env->class_def)
       SET_FLAG(v, global);
     v->type = t;