]> Nishi Git Mirror - gwion.git/commitdiff
:art: More robust value scope
authorfennecdjay <fennecdjay@gmail.com>
Sat, 16 Jul 2022 11:09:55 +0000 (13:09 +0200)
committerfennecdjay <fennecdjay@gmail.com>
Sat, 16 Jul 2022 11:09:55 +0000 (13:09 +0200)
examples/auto.gw
include/env/type.h
src/emit/emit.c
src/lib/closure.c
src/lib/object_op.c
src/lib/xork.c
src/parse/check.c
src/parse/scan2.c

index c4056df10f1deb2d5fa4c69e274c034942b382f9..7ae6e7102152358f4be7d9421052ce416de355be 100644 (file)
@@ -1,3 +1,3 @@
-var Object i[4];
+var Object[4] i;
 foreach(a: i)
   <<< a >>>;
index 821fa1838fc0546b1ce6af2f622220641cb31799..d7a234a0a3d7a3d4689c7802938e10ef76385857 100644 (file)
@@ -13,6 +13,7 @@ struct TypeInfo_ {
   struct TupleForm_ *tuple;
   struct VM_Code_ *  gack;
   ID_List            traits;
+  Scope values;
 };
 
 enum tflag {
index 4f1700601aa7ab652d26e03132e9b6bc7048e01d..c38377cf3b86c77e95083180b27a1a9b166eee89 100644 (file)
@@ -900,7 +900,7 @@ ANN static m_bool emit_prim_locale(const Emitter emit, const Symbol *id) {
   const VM_Code code = finalyze(emit, EOC);
   const VM_Shred shred = new_vm_shred(emit->gwion->mp, code);
   vm_add_shred(emit->gwion->vm, shred);
-  shred->info->me->ref++;
+//  shred->info->me->ref++;
   vm_run(emit->gwion->vm);
   emit->gwion->vm->bbq->is_running = true;
   const m_float ret = *(m_float*)shred->reg;
@@ -2008,8 +2008,8 @@ ANN static m_bool emit_stmt_return(const Emitter emit, const Stmt_Exp stmt) {
       if (stmt->val->exp_type == ae_exp_call && emit->env->func == f)
         return optimize_tail_call(emit, &stmt->val->d.exp_call);
     }
-    if(!stmt->val->ref && isa(stmt->val->type, emit->gwion->type[et_compound]) > 0)
-      emit_local(emit, stmt->val->type);
+//    if(!stmt->val->ref && isa(stmt->val->type, emit->gwion->type[et_compound]) > 0)
+//      emit_local(emit, stmt->val->type);
     CHECK_BB(emit_exp(emit, stmt->val));
   }
   vector_add(&emit->code->stack_return, (vtype)emit_add_instr(emit, Goto));
index ef5f816590f58a88ed152bc16754b3800a1015dc..43a66c48ce1b9c4f6572b67f808ec192388ee93f 100644 (file)
@@ -334,6 +334,7 @@ ANN static m_bool _check_lambda(const Env env, Exp_Lambda *l,
   Upvalues upvalues = {
     .values = env->curr->info->value
   };
+  if(env->class_def) env->class_def->info->values = env->curr->info->value;
   env->curr->info->value = new_scope(env->gwion->mp);
   l->def->base->values = &upvalues;
   const m_uint scope   = env->scope->depth;
index 10e346c7e5de703cc801ddff241a7cd9e603002a..e1087dd84f878e380e47fbfde9578a03a80c0643 100644 (file)
@@ -183,6 +183,8 @@ ANN static inline Value get_value(const Env env, const Exp_Dot *member,
     return value;
   if (env->func && env->func->def->base->values)
     return upvalues_lookup(env->func->def->base->values, member->xid);
+  if(t->info->values)
+    return (Value)scope_lookup1(t->info->values, (m_uint)member->xid);
   return NULL;
 }
 
index 423b0bb68ad0ffcc50738891ba65c8b8a4a20fd0..997d9cb2ffccfdd8397f1202cd7f3f46fa9177ac 100644 (file)
@@ -50,6 +50,7 @@ static OP_CHECK(opck_spork) {
     Upvalues upvalues = { .values = env->curr->info->value };
     if(env->func && env->func->def->base->values)
       upvalues.parent = env->func->def->base->values;
+    if(env->class_def) env->class_def->info->values = env->curr->info->value;
     env->curr->info->value = new_scope(env->gwion->mp);
     if(unary->captures) {
       for(uint32_t i = 0; i < unary->captures->len; i++) {
index 3c867395465ec678c7b28a0128f6c1edbd4651a9..b2097a0adbc8989c9bf98a8fe711d6dd3a4f1e26 100644 (file)
@@ -120,6 +120,7 @@ ANN /*static inline*/ m_bool ensure_check(const Env env, const Type t) {
 ANN m_bool ensure_traverse(const Env env, const Type t) {
   if (tflag(t, tflag_check) || !(tflag(t, tflag_cdef) || tflag(t, tflag_udef)))
     return GW_OK;
+  if(!tflag(t, tflag_tmpl)) return GW_OK;
   struct EnvSet es = {.env   = env,
                       .data  = env,
                       .func  = (_exp_func)traverse_cdef,
@@ -1041,8 +1042,6 @@ ANN static Type check_exp_unary(const Env env, const Exp_Unary *unary) {
                           .data = (uintptr_t)unary,
                           .pos  = exp_self(unary)->pos};
   DECL_OO(const Type, ret, = op_check(env, &opi));
-  const Type t = actual_type(env->gwion, ret);
-  CHECK_BO(ensure_traverse(env, t));
   return ret;
 }
 
@@ -1090,6 +1089,8 @@ ANN static Type check_exp_dot(const Env env, Exp_Dot *member) {
 }
 
 ANN m_bool check_type_def(const Env env, const Type_Def tdef) {
+  if(tdef->ext->array && tdef->ext->array->exp)
+    CHECK_OB(check_exp(env, tdef->type->info->cdef->base.ext->array->exp));
   if (tdef->when) {
     set_tflag(tdef->type, tflag_contract);
     struct Var_Decl_ decl = { .xid = insert_symbol("self"), .pos = tdef->when->pos };
@@ -1144,6 +1145,7 @@ ANN m_bool check_type_def(const Env env, const Type_Def tdef) {
   }
   return GW_OK;
 }
+
 ANN static Type check_exp_lambda(const Env env, const Exp_If *exp_if NUSED) {
   return env->gwion->type[et_function];
 }
index a56afd61200bc2255db2036754ebf040f41e8b45..dfda9c331093b5b938ce5458d4e71558d6d451f9 100644 (file)
@@ -306,8 +306,10 @@ ANN static Func scan_new_func(const Env env, const Func_Def f,
   const Func func = new_func(env->gwion->mp, name, f);
   if (env->class_def && tflag(env->class_def, tflag_tmpl))
     set_fflag(func, fflag_ftmpl);
-  if (fbflag(f->base, fbflag_lambda))
+  if (fbflag(f->base, fbflag_lambda)) {
+    if(env->class_def) env->class_def->info->values = env->curr->info->value;
     env->curr->info->value = new_scope(env->gwion->mp);
+  }
   return func;
 }