]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improve final and shadowing for inlining
authorJérémie Astor <fennecdjay@gmail.com>
Mon, 16 Aug 2021 10:45:19 +0000 (12:45 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Mon, 16 Aug 2021 10:45:19 +0000 (12:45 +0200)
include/env/env.h
src/emit/emit.c
src/parse/scan1.c
src/parse/scan2.c

index f10594db557bbaf89543cffb91808d379431826c..0e550a0a48fd9fe0ec77db6597131b4050aef6ac 100644 (file)
@@ -25,6 +25,7 @@ struct Env_Scope_ {
   uint16_t       depth;
   bool           in_try;
   bool           in_loop;
+  bool           shadowing;
 };
 
 typedef struct Env_ {
index f80dab1370f3fec8465e4c1e0d286d0e1a621588..e941e38e3c4d8569a1d7fdb23abf1e4062add919 100644 (file)
@@ -1287,6 +1287,8 @@ ANN static inline m_bool traverse_emit_func_def(const Emitter  emit,
 
 ANN m_bool traverse_dot_tmpl(const Emitter emit, const struct dottmpl_ *dt) {
   const m_uint  scope = emit->env->scope->depth;
+  const bool    shadowing = emit->env->scope->shadowing;
+  emit->env->scope->shadowing = true;
   struct EnvSet es    = {.env   = emit->env,
                       .data  = emit,
                       .func  = (_exp_func)emit_cdef,
@@ -1297,6 +1299,7 @@ ANN m_bool traverse_dot_tmpl(const Emitter emit, const struct dottmpl_ *dt) {
   const m_bool ret = traverse_emit_func_def(emit, dt->def);
   if (es.run) envset_pop(&es, dt->owner_class);
   emit_pop(emit, scope);
+  emit->env->scope->shadowing = shadowing;
   return ret;
 }
 
index 32a2bc4d9f5ee80d7d156f1c41edde7e10cfef04..db0e1bf3e52b4b7e99aa07bc5b79714d091774a1 100644 (file)
@@ -328,6 +328,8 @@ ANN static inline m_bool stmt_each_defined(const restrict Env env,
 
 ANN static inline m_bool shadow_err(const Env env, const Value v,
                                     const loc_t loc) {
+  if(env->scope->shadowing)
+    return GW_OK;
   gwerr_basic(_("shadowing a previously defined variable"), NULL, NULL,
               env->name, loc, 0);
   defined_here(v);
index f7f03d4d5504f522fd4dfeb89c1ce7026a1b1179..5279a382e0a9cce7d167dfa4e171cb63f79976c1 100644 (file)
@@ -294,7 +294,7 @@ ANN static m_bool scan2_func_def_overload(const Env env, const Func_Def f,
   }
   const Func obase =
       !fptr ? overload->d.func_ref : _class_base(overload->type)->info->func;
-  if (GET_FLAG(obase->def->base, final))
+  if (GET_FLAG(obase->def->base, final) && obase->value_ref->from->owner_class != env->class_def)
     ERR_B(f->base->pos, _("can't overload final function %s"), overload->name)
   const m_bool base = tmpl_base(f->base->tmpl);
   const m_bool tmpl = fflag(obase, fflag_tmpl);