]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve contracts (check at instantation)
authorJérémie Astor <fennecdjay@gmail.com>
Sun, 16 May 2021 13:44:11 +0000 (15:44 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Sun, 16 May 2021 13:44:11 +0000 (15:44 +0200)
src/emit/emit.c
src/env/env.c
src/parse/check.c
src/parse/scan0.c

index 90c5533f19318aafe21e0b035f71ecd458daaa28..f66d5888d59395ab15d56f1f93d7659de711f36a 100644 (file)
@@ -891,6 +891,11 @@ ANN static m_bool emit_decl(const Emitter emit, const Exp_Decl* decl) {
       CHECK_BB(emit_exp_decl_non_static(emit, decl, list->self, r, var));
     else
       CHECK_BB(emit_exp_decl_global(emit, decl, list->self, r, var));
+    if(tflag(list->self->value->type, tflag_contract) && !exp_getvar(exp_self(decl))) {
+      const Type t = list->self->value->type;
+      struct Op_Import opi = { .lhs=t->info->base_type, .op=insert_symbol("@implicit"), .rhs=t };
+      CHECK_BB(op_emit(emit, &opi));
+    }
     set_late(emit->gwion, decl, list->self);
     if(GET_FLAG(array_base(v->type), abstract) && !GET_FLAG(decl->td, late) && GET_FLAG(v, late)) {
       env_warn(emit->env, decl->td->pos, _("Type '%s' is abstract, use late"), v->type->name);
index 4105abba9ea67f8af2e20bf000f2aa90383fe6e7..1331ea865001b1ea8373c8bba600cd4e0bfc5f36 100644 (file)
@@ -41,6 +41,7 @@ ANN void env_reset(const Env env) {
   env->class_def = NULL;
   env->func = NULL;
   env->scope->depth = 0;
+  env->scope->in_try = false;
 }
 
 ANN void release_ctx(struct Env_Scope_ *a, struct Gwion_ *gwion) {
index ccaf365130bc85484757c472f88d19d165996cf8..5e6a37f38be4c40de27834c142cac01384daddae 100644 (file)
@@ -938,6 +938,7 @@ const Func f = exp_self(call)->type->info->func;
 
 ANN m_bool check_type_def(const Env env, const Type_Def tdef) {
   if(tdef->when) {
+    set_tflag(tdef->type, tflag_contract);
     const Var_Decl decl = new_var_decl(env->gwion->mp, insert_symbol("self"), NULL, tdef->when->pos);
     const Arg_List args = new_arg_list(env->gwion->mp, cpy_type_decl(env->gwion->mp, tdef->ext), decl, NULL);
     Func_Base *fb = new_func_base(env->gwion->mp, type2td(env->gwion, tdef->type, tdef->pos),
index ff214eb5a2ca168c59dfbc4a6aef624202d6329b..02caef21718a17a522589c2825e4f6a1924441c9 100644 (file)
@@ -179,11 +179,12 @@ ANN m_bool scan0_type_def(const Env env, const Type_Def tdef) {
     struct Op_Import opi = { .lhs=base, .rhs=tdef->type };
     op_cpy(env, &opi);
     scan0_explicit_distinct(env, base, tdef->type);
-//    type_addref(tdef->type); // maybe because of scope_iter in nspc_free_values
+    type_addref(tdef->type); // maybe because of scope_iter in nspc_free_values
   } else
     set_tflag(tdef->type, tflag_typedef);
   if(global)
     env_pop(env, 0);
+  tdef->type->info->base_type = base;
   return GW_OK;
 }