Commit 19e073e7 authored by Kevin Modzelewski's avatar Kevin Modzelewski

ScopingAnalysis fix for lambdas

parent d686cbfb
...@@ -550,7 +550,7 @@ std::unique_ptr<PhiAnalysis> computeRequiredPhis(const ParamNames& args, CFG* cf ...@@ -550,7 +550,7 @@ std::unique_ptr<PhiAnalysis> computeRequiredPhis(const ParamNames& args, CFG* cf
auto maybe_add = [&](AST_Name* n) { auto maybe_add = [&](AST_Name* n) {
ScopeInfo::VarScopeType vst = n->lookup_type; ScopeInfo::VarScopeType vst = n->lookup_type;
assert(vst != ScopeInfo::VarScopeType::UNKNOWN); assert(vst != ScopeInfo::VarScopeType::UNKNOWN);
assert(vst != ScopeInfo::VarScopeType::GLOBAL); assert(vst != ScopeInfo::VarScopeType::GLOBAL); // global-and-local error
if (vst == ScopeInfo::VarScopeType::NAME) if (vst == ScopeInfo::VarScopeType::NAME)
return; return;
assert(n->vreg >= 0); assert(n->vreg >= 0);
......
...@@ -587,29 +587,33 @@ public: ...@@ -587,29 +587,33 @@ public:
} }
} }
bool visit_functiondef(AST_FunctionDef* node) override { void visitOrignodeArgs(AST_arguments* args) {
if (node == orig_node) { this->currently_visiting_functiondef_args = true;
this->currently_visiting_functiondef_args = true;
int counter = 0; int counter = 0;
for (AST_expr* e : node->args->args) { for (AST_expr* e : args->args) {
if (e->type == AST_TYPE::Tuple) { if (e->type == AST_TYPE::Tuple) {
doWrite(scoping->getInternedStrings().get("." + std::to_string(counter))); doWrite(scoping->getInternedStrings().get("." + std::to_string(counter)));
}
counter++;
e->accept(this);
} }
counter++;
e->accept(this);
}
if (node->args->vararg) { if (args->vararg) {
mangleNameInPlace(node->args->vararg->id, cur->private_name, scoping->getInternedStrings()); mangleNameInPlace(args->vararg->id, cur->private_name, scoping->getInternedStrings());
doWrite(node->args->vararg->id); doWrite(args->vararg->id);
} }
if (node->args->kwarg) { if (args->kwarg) {
mangleNameInPlace(node->args->kwarg->id, cur->private_name, scoping->getInternedStrings()); mangleNameInPlace(args->kwarg->id, cur->private_name, scoping->getInternedStrings());
doWrite(node->args->kwarg->id); doWrite(args->kwarg->id);
} }
this->currently_visiting_functiondef_args = false;
}
this->currently_visiting_functiondef_args = false; bool visit_functiondef(AST_FunctionDef* node) override {
if (node == orig_node) {
visitOrignodeArgs(node->args);
for (AST_stmt* s : node->body) for (AST_stmt* s : node->body)
s->accept(this); s->accept(this);
...@@ -666,16 +670,7 @@ public: ...@@ -666,16 +670,7 @@ public:
bool visit_lambda(AST_Lambda* node) override { bool visit_lambda(AST_Lambda* node) override {
if (node == orig_node) { if (node == orig_node) {
for (AST_expr* e : node->args->args) visitOrignodeArgs(node->args);
e->accept(this);
if (node->args->vararg) {
mangleNameInPlace(node->args->vararg->id, cur->private_name, scoping->getInternedStrings());
doWrite(node->args->vararg->id);
}
if (node->args->kwarg) {
mangleNameInPlace(node->args->kwarg->id, cur->private_name, scoping->getInternedStrings());
doWrite(node->args->kwarg->id);
}
node->body->accept(this); node->body->accept(this);
} else { } else {
for (auto* e : node->args->defaults) for (auto* e : node->args->defaults)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment