diff --git a/codon/parser/cache.cpp b/codon/parser/cache.cpp index 8fab7311..71a0ae12 100644 --- a/codon/parser/cache.cpp +++ b/codon/parser/cache.cpp @@ -33,6 +33,7 @@ std::string Cache::rev(const std::string &s) { void Cache::addGlobal(const std::string &name, ir::Var *var) { if (!in(globals, name)) { + // LOG("[global] {}", name); globals[name] = var; } } diff --git a/codon/parser/visitors/simplify/access.cpp b/codon/parser/visitors/simplify/access.cpp index d957640a..2e5ec88e 100644 --- a/codon/parser/visitors/simplify/access.cpp +++ b/codon/parser/visitors/simplify/access.cpp @@ -163,7 +163,7 @@ bool SimplifyVisitor::checkCapture(const SimplifyContext::Item &val) { // Case: a global variable that has not been marked with `global` statement if (val->isVar() && val->getBaseName().empty()) { val->noShadow = true; - if (val->scope.size() == 1) + if (val->scope.size() == 1 && !val->isStatic()) ctx->cache->addGlobal(val->canonicalName); return false; } diff --git a/codon/parser/visitors/simplify/assign.cpp b/codon/parser/visitors/simplify/assign.cpp index e3d2f4a7..e243073a 100644 --- a/codon/parser/visitors/simplify/assign.cpp +++ b/codon/parser/visitors/simplify/assign.cpp @@ -153,8 +153,10 @@ StmtPtr SimplifyVisitor::transformAssignment(ExprPtr lhs, ExprPtr rhs, ExprPtr t } // Register all toplevel variables as global in JIT mode - bool isGlobal = (ctx->cache->isJit && ctx->isGlobal()) || (canonical == VAR_ARGV); - if (isGlobal) + bool isGlobal = + (ctx->cache->isJit && ctx->isGlobal() && getStaticGeneric(type.get()) != 0) || + (canonical == VAR_ARGV); + if (isGlobal && !getStaticGeneric(type.get())) ctx->cache->addGlobal(canonical); return assign;