Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(574)

Unified Diff: src/parsing/rewriter.cc

Issue 2167713004: Always finalize blocks after parsing, also for do-expressions (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/parsing/rewriter.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/parsing/rewriter.cc
diff --git a/src/parsing/rewriter.cc b/src/parsing/rewriter.cc
index 9a7627e3094bfa663a1119e807602a7797c8fa8f..8f81653e257ab8690b1e7ecea87276db94df58e2 100644
--- a/src/parsing/rewriter.cc
+++ b/src/parsing/rewriter.cc
@@ -13,27 +13,29 @@ namespace internal {
class Processor final : public AstVisitor<Processor> {
public:
- Processor(Isolate* isolate, Scope* scope, Variable* result,
+ Processor(Isolate* isolate, Scope* closure_scope, Variable* result,
AstValueFactory* ast_value_factory)
: result_(result),
result_assigned_(false),
replacement_(nullptr),
is_set_(false),
zone_(ast_value_factory->zone()),
- scope_(scope),
+ closure_scope_(closure_scope),
factory_(ast_value_factory) {
+ DCHECK_EQ(closure_scope, closure_scope->ClosureScope());
InitializeAstVisitor(isolate);
}
- Processor(Parser* parser, Scope* scope, Variable* result,
+ Processor(Parser* parser, Scope* closure_scope, Variable* result,
AstValueFactory* ast_value_factory)
: result_(result),
result_assigned_(false),
replacement_(nullptr),
is_set_(false),
zone_(ast_value_factory->zone()),
- scope_(scope),
+ closure_scope_(closure_scope),
factory_(ast_value_factory) {
+ DCHECK_EQ(closure_scope, closure_scope->ClosureScope());
InitializeAstVisitor(parser->stack_limit());
}
@@ -41,7 +43,7 @@ class Processor final : public AstVisitor<Processor> {
bool result_assigned() const { return result_assigned_; }
Zone* zone() { return zone_; }
- Scope* scope() { return scope_; }
+ Scope* closure_scope() { return closure_scope_; }
AstNodeFactory* factory() { return &factory_; }
// Returns ".result = value"
@@ -75,7 +77,7 @@ class Processor final : public AstVisitor<Processor> {
bool is_set_;
Zone* zone_;
- Scope* scope_;
+ Scope* closure_scope_;
AstNodeFactory factory_;
// Node visitors.
@@ -223,19 +225,19 @@ void Processor::VisitTryFinallyStatement(TryFinallyStatement* node) {
// at the end again: ".backup = .result; ...; .result = .backup"
// This is necessary because the finally block does not normally contribute
// to the completion value.
- CHECK(scope() != nullptr);
- Variable* backup = scope()->NewTemporary(
- factory()->ast_value_factory()->dot_result_string());
- Expression* backup_proxy = factory()->NewVariableProxy(backup);
- Expression* result_proxy = factory()->NewVariableProxy(result_);
- Expression* save = factory()->NewAssignment(
- Token::ASSIGN, backup_proxy, result_proxy, kNoSourcePosition);
- Expression* restore = factory()->NewAssignment(
- Token::ASSIGN, result_proxy, backup_proxy, kNoSourcePosition);
- node->finally_block()->statements()->InsertAt(
- 0, factory()->NewExpressionStatement(save, kNoSourcePosition), zone());
- node->finally_block()->statements()->Add(
- factory()->NewExpressionStatement(restore, kNoSourcePosition), zone());
+ CHECK_NOT_NULL(closure_scope());
+ Variable* backup = closure_scope()->NewTemporary(
+ factory()->ast_value_factory()->dot_result_string());
+ Expression* backup_proxy = factory()->NewVariableProxy(backup);
+ Expression* result_proxy = factory()->NewVariableProxy(result_);
+ Expression* save = factory()->NewAssignment(
+ Token::ASSIGN, backup_proxy, result_proxy, kNoSourcePosition);
+ Expression* restore = factory()->NewAssignment(
+ Token::ASSIGN, result_proxy, backup_proxy, kNoSourcePosition);
+ node->finally_block()->statements()->InsertAt(
+ 0, factory()->NewExpressionStatement(save, kNoSourcePosition), zone());
+ node->finally_block()->statements()->Add(
+ factory()->NewExpressionStatement(restore, kNoSourcePosition), zone());
}
is_set_ = set_after;
Visit(node->try_block());
@@ -333,18 +335,19 @@ DECLARATION_NODE_LIST(DEF_VISIT)
// continue to be used in the case of failure.
bool Rewriter::Rewrite(ParseInfo* info) {
FunctionLiteral* function = info->literal();
- DCHECK(function != NULL);
+ DCHECK_NOT_NULL(function);
Scope* scope = function->scope();
- DCHECK(scope != NULL);
+ DCHECK_NOT_NULL(scope);
if (!scope->is_script_scope() && !scope->is_eval_scope()) return true;
+ Scope* closure_scope = scope->ClosureScope();
ZoneList<Statement*>* body = function->body();
if (!body->is_empty()) {
- Variable* result =
- scope->NewTemporary(info->ast_value_factory()->dot_result_string());
+ Variable* result = closure_scope->NewTemporary(
+ info->ast_value_factory()->dot_result_string());
// The name string must be internalized at this point.
DCHECK(!result->name().is_null());
- Processor processor(info->isolate(), scope, result,
+ Processor processor(info->isolate(), closure_scope, result,
info->ast_value_factory());
processor.Process(body);
if (processor.HasStackOverflow()) return false;
@@ -362,17 +365,18 @@ bool Rewriter::Rewrite(ParseInfo* info) {
return true;
}
-
-bool Rewriter::Rewrite(Parser* parser, DoExpression* expr,
+bool Rewriter::Rewrite(Parser* parser, Scope* closure_scope, DoExpression* expr,
AstValueFactory* factory) {
Block* block = expr->block();
- Scope* scope = block->scope();
+ DCHECK_EQ(closure_scope, closure_scope->ClosureScope());
+ DCHECK(block->scope() == nullptr ||
+ block->scope()->ClosureScope() == closure_scope);
ZoneList<Statement*>* body = block->statements();
VariableProxy* result = expr->result();
Variable* result_var = result->var();
if (!body->is_empty()) {
- Processor processor(parser, scope, result_var, factory);
+ Processor processor(parser, closure_scope, result_var, factory);
processor.Process(body);
if (processor.HasStackOverflow()) return false;
« no previous file with comments | « src/parsing/rewriter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698