]> Nishi Git Mirror - gwion.git/commitdiff
:art: Improe func_def checking
authorJérémie Astor <fennecdjay@gmail.com>
Mon, 9 Aug 2021 09:16:22 +0000 (11:16 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Mon, 9 Aug 2021 09:16:22 +0000 (11:16 +0200)
src/emit/emit.c
src/parse/check.c
src/parse/scan1.c
src/parse/scan2.c

index 9fc957a8f72be0435b906e419f995dadc36daee1..2144d6c53bfa3d4b9a5a4636928da111a63bd649 100644 (file)
@@ -2660,7 +2660,7 @@ ANN static void emit_fdef_finish(const Emitter emit, const Func_Def fdef) {
     func->code->memoize = memoize_ini(emit, func);
 }
 
-ANN m_bool emit_func_def(const Emitter emit, const Func_Def f) {
+ANN m_bool _emit_func_def(const Emitter emit, const Func_Def f) {
   if (tmpl_base(f->base->tmpl) && fbflag(f->base, fbflag_op)) return GW_OK;
   const Func     func   = f->base->func;
   const Func_Def fdef   = func->def;
@@ -2698,6 +2698,14 @@ ANN m_bool emit_func_def(const Emitter emit, const Func_Def f) {
   return ret;
 }
 
+ANN m_bool emit_func_def(const Emitter emit, const Func_Def fdef) {
+  const uint16_t depth = emit->env->scope->depth;
+  emit->env->scope->depth = 0;
+  const m_bool ret = _emit_func_def(emit, fdef);
+  emit->env->scope->depth = depth;
+  return ret;
+}
+
 ANN static m_bool emit_extend_def(const Emitter emit, const Extend_Def xdef);
 #define emit_fptr_def  dummy_func
 #define emit_trait_def dummy_func
index 3489d33246f9a14e862446653de179add77fc022..75535e964b348739605d13514918025a1102571e 100644 (file)
@@ -1574,7 +1574,7 @@ ANN m_bool check_fdef(const Env env, const Func_Def fdef) {
   return GW_OK;
 }
 
-ANN m_bool check_func_def(const Env env, const Func_Def f) {
+ANN m_bool _check_func_def(const Env env, const Func_Def f) {
   if (tmpl_base(f->base->tmpl) && fbflag(f->base, fbflag_op)) return GW_OK;
   const Func     func = f->base->func;
   const Func_Def fdef = func->def;
@@ -1634,6 +1634,14 @@ ANN m_bool check_func_def(const Env env, const Func_Def f) {
   return ret;
 }
 
+ANN m_bool check_func_def(const Env env, const Func_Def fdef) {
+  const uint16_t depth = env->scope->depth;
+  env->scope->depth = 0;
+  const m_bool ret = _check_func_def(env, fdef);
+  env->scope->depth = depth;
+  return ret;
+}
+
 ANN static m_bool check_extend_def(const Env env, const Extend_Def xdef) {
   CHECK_BB(ensure_check(env, xdef->t));
   CHECK_BB(extend_push(env, xdef->t));
index f748014e9a95055a45da937bc623ebc025b15c76..52ef77d3168f5a60a9aff92f9989ce325cb0cc03 100644 (file)
@@ -677,7 +677,7 @@ ANN static inline m_bool scan1_fdef_defined(const Env      env,
   return GW_OK;
 }
 
-ANN m_bool scan1_func_def(const Env env, const Func_Def fdef) {
+ANN static m_bool _scan1_func_def(const Env env, const Func_Def fdef) {
   const bool   global = GET_FLAG(fdef->base, global);
   const m_uint scope  = !global ? env->scope->depth : env_push_global(env);
   if (fdef->base->td)
@@ -695,6 +695,14 @@ ANN m_bool scan1_func_def(const Env env, const Func_Def fdef) {
   return ret;
 }
 
+ANN m_bool scan1_func_def(const Env env, const Func_Def fdef) {
+  const uint16_t depth = env->scope->depth;
+  env->scope->depth = 0;
+  const m_bool ret = _scan1_func_def(env, fdef);
+  env->scope->depth = depth;
+  return ret;
+}
+
 ANN static m_bool scan1_extend_def(const Env env, const Extend_Def xdef) {
   CHECK_BB(ensure_scan1(env, xdef->t));
   CHECK_BB(extend_push(env, xdef->t));
index fb60fcb484b375a5d7f52d49b51f044a011b07b9..b56419b20d0b06ce689ac1089d3a4d2367fa39d2 100644 (file)
@@ -543,7 +543,7 @@ static inline int is_cpy(const Func_Def fdef) {
          (fdef->base->tmpl && !fdef->base->tmpl->call);
 }
 
-ANN m_bool scan2_func_def(const Env env, const Func_Def fdef) {
+ANN m_bool _scan2_func_def(const Env env, const Func_Def fdef) {
   if (tmpl_base(fdef->base->tmpl) && fbflag(fdef->base, fbflag_op))
     return GW_OK;
   if(!strcmp(s_name(fdef->base->xid), "new")) {
@@ -568,6 +568,14 @@ ANN m_bool scan2_func_def(const Env env, const Func_Def fdef) {
   return GW_OK;
 }
 
+ANN m_bool scan2_func_def(const Env env, const Func_Def fdef) {
+  const uint16_t depth = env->scope->depth;
+  env->scope->depth = 0;
+  const m_bool ret = _scan2_func_def(env, fdef);
+  env->scope->depth = depth;
+  return ret;
+}
+
 ANN static m_bool scan2_extend_def(const Env env, const Extend_Def xdef) {
   CHECK_BB(ensure_scan2(env, xdef->t));
   CHECK_BB(extend_push(env, xdef->t));