From d5741a27e0a4707b46bc915b4d174a8ce7e93b4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ibrahim=20Numanagic=CC=81?= Date: Thu, 29 Sep 2022 20:40:00 -0700 Subject: [PATCH] Fix globals in JIT --- codon/parser/visitors/simplify/assign.cpp | 12 ++++++------ codon/parser/visitors/simplify/loops.cpp | 3 ++- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/codon/parser/visitors/simplify/assign.cpp b/codon/parser/visitors/simplify/assign.cpp index 2aa09332..c0a7ae21 100644 --- a/codon/parser/visitors/simplify/assign.cpp +++ b/codon/parser/visitors/simplify/assign.cpp @@ -144,19 +144,19 @@ StmtPtr SimplifyVisitor::transformAssignment(ExprPtr lhs, ExprPtr rhs, ExprPtr t // Generate new canonical variable name for this assignment and add it to the context auto canonical = ctx->generateCanonicalName(e->value); auto assign = N(N(canonical), rhs, type); + val = nullptr; if (rhs && rhs->isType()) { - ctx->addType(e->value, canonical, lhs->getSrcInfo()); + val = ctx->addType(e->value, canonical, lhs->getSrcInfo()); } else { - auto val = ctx->addVar(e->value, canonical, lhs->getSrcInfo()); + val = ctx->addVar(e->value, canonical, lhs->getSrcInfo()); if (auto st = getStaticGeneric(type.get())) val->staticType = st; } // Register all toplevel variables as global in JIT mode - bool isGlobal = - (ctx->cache->isJit && ctx->isGlobal() && getStaticGeneric(type.get()) == 0) || - (canonical == VAR_ARGV); - if (isGlobal && !getStaticGeneric(type.get())) + bool isGlobal = (ctx->cache->isJit && val->isGlobal() && !val->isGeneric() == 0) || + (canonical == VAR_ARGV); + if (isGlobal && !val->isGeneric()) ctx->cache->addGlobal(canonical); return assign; diff --git a/codon/parser/visitors/simplify/loops.cpp b/codon/parser/visitors/simplify/loops.cpp index 2080f4a6..9be85415 100644 --- a/codon/parser/visitors/simplify/loops.cpp +++ b/codon/parser/visitors/simplify/loops.cpp @@ -56,8 +56,9 @@ void SimplifyVisitor::visit(WhileStmt *stmt) { transformConditionalScope(stmt->suite); ctx->leaveConditionalBlock(); // Dominate loop variables - for (auto &var : ctx->getBase()->getLoop()->seenVars) + for (auto &var : ctx->getBase()->getLoop()->seenVars) { ctx->findDominatingBinding(var); + } ctx->getBase()->loops.pop_back(); // Complete while-else clause