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

Side by Side Diff: src/compiler/ast-graph-builder.cc

Issue 1162633002: [turbofan] Enforce stricter constraints on Throw nodes. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 6 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 unified diff | Download patch
« no previous file with comments | « no previous file | src/compiler/verifier.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler/ast-graph-builder.h" 5 #include "src/compiler/ast-graph-builder.h"
6 6
7 #include "src/compiler.h" 7 #include "src/compiler.h"
8 #include "src/compiler/ast-loop-assignment-analyzer.h" 8 #include "src/compiler/ast-loop-assignment-analyzer.h"
9 #include "src/compiler/control-builders.h" 9 #include "src/compiler/control-builders.h"
10 #include "src/compiler/js-type-feedback.h" 10 #include "src/compiler/js-type-feedback.h"
(...skipping 3359 matching lines...) Expand 10 before | Expand all | Expand 10 after
3370 return store; 3370 return store;
3371 } 3371 }
3372 3372
3373 3373
3374 Node* AstGraphBuilder::BuildThrowError(Node* exception, BailoutId bailout_id) { 3374 Node* AstGraphBuilder::BuildThrowError(Node* exception, BailoutId bailout_id) {
3375 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1); 3375 const Operator* op = javascript()->CallRuntime(Runtime::kThrow, 1);
3376 Node* call = NewNode(op, exception); 3376 Node* call = NewNode(op, exception);
3377 PrepareFrameState(call, bailout_id); 3377 PrepareFrameState(call, bailout_id);
3378 Node* control = NewNode(common()->Throw(), call); 3378 Node* control = NewNode(common()->Throw(), call);
3379 UpdateControlDependencyToLeaveFunction(control); 3379 UpdateControlDependencyToLeaveFunction(control);
3380 return control; 3380 return call;
3381 } 3381 }
3382 3382
3383 3383
3384 Node* AstGraphBuilder::BuildThrowReferenceError(Variable* variable, 3384 Node* AstGraphBuilder::BuildThrowReferenceError(Variable* variable,
3385 BailoutId bailout_id) { 3385 BailoutId bailout_id) {
3386 Node* variable_name = jsgraph()->Constant(variable->name()); 3386 Node* variable_name = jsgraph()->Constant(variable->name());
3387 const Operator* op = 3387 const Operator* op =
3388 javascript()->CallRuntime(Runtime::kThrowReferenceError, 1); 3388 javascript()->CallRuntime(Runtime::kThrowReferenceError, 1);
3389 Node* call = NewNode(op, variable_name); 3389 Node* call = NewNode(op, variable_name);
3390 PrepareFrameState(call, bailout_id); 3390 PrepareFrameState(call, bailout_id);
3391 Node* control = NewNode(common()->Throw(), call); 3391 Node* control = NewNode(common()->Throw(), call);
3392 UpdateControlDependencyToLeaveFunction(control); 3392 UpdateControlDependencyToLeaveFunction(control);
3393 return control; 3393 return call;
3394 } 3394 }
3395 3395
3396 3396
3397 Node* AstGraphBuilder::BuildThrowConstAssignError(BailoutId bailout_id) { 3397 Node* AstGraphBuilder::BuildThrowConstAssignError(BailoutId bailout_id) {
3398 const Operator* op = 3398 const Operator* op =
3399 javascript()->CallRuntime(Runtime::kThrowConstAssignError, 0); 3399 javascript()->CallRuntime(Runtime::kThrowConstAssignError, 0);
3400 Node* call = NewNode(op); 3400 Node* call = NewNode(op);
3401 PrepareFrameState(call, bailout_id); 3401 PrepareFrameState(call, bailout_id);
3402 Node* control = NewNode(common()->Throw(), call); 3402 Node* control = NewNode(common()->Throw(), call);
3403 UpdateControlDependencyToLeaveFunction(control); 3403 UpdateControlDependencyToLeaveFunction(control);
3404 return control; 3404 return call;
3405 } 3405 }
3406 3406
3407 3407
3408 Node* AstGraphBuilder::BuildThrowStaticPrototypeError(BailoutId bailout_id) { 3408 Node* AstGraphBuilder::BuildThrowStaticPrototypeError(BailoutId bailout_id) {
3409 const Operator* op = 3409 const Operator* op =
3410 javascript()->CallRuntime(Runtime::kThrowStaticPrototypeError, 0); 3410 javascript()->CallRuntime(Runtime::kThrowStaticPrototypeError, 0);
3411 Node* call = NewNode(op); 3411 Node* call = NewNode(op);
3412 PrepareFrameState(call, bailout_id); 3412 PrepareFrameState(call, bailout_id);
3413 Node* control = NewNode(common()->Throw(), call); 3413 Node* control = NewNode(common()->Throw(), call);
3414 UpdateControlDependencyToLeaveFunction(control); 3414 UpdateControlDependencyToLeaveFunction(control);
3415 return control; 3415 return call;
3416 } 3416 }
3417 3417
3418 3418
3419 Node* AstGraphBuilder::BuildReturn(Node* return_value) { 3419 Node* AstGraphBuilder::BuildReturn(Node* return_value) {
3420 Node* control = NewNode(common()->Return(), return_value); 3420 Node* control = NewNode(common()->Return(), return_value);
3421 UpdateControlDependencyToLeaveFunction(control); 3421 UpdateControlDependencyToLeaveFunction(control);
3422 return control; 3422 return control;
3423 } 3423 }
3424 3424
3425 3425
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
3549 // with the real frame state. 3549 // with the real frame state.
3550 *current_input++ = jsgraph()->DeadControl(); 3550 *current_input++ = jsgraph()->DeadControl();
3551 } 3551 }
3552 if (has_effect) { 3552 if (has_effect) {
3553 *current_input++ = environment_->GetEffectDependency(); 3553 *current_input++ = environment_->GetEffectDependency();
3554 } 3554 }
3555 if (has_control) { 3555 if (has_control) {
3556 *current_input++ = environment_->GetControlDependency(); 3556 *current_input++ = environment_->GetControlDependency();
3557 } 3557 }
3558 result = graph()->NewNode(op, input_count_with_deps, buffer, incomplete); 3558 result = graph()->NewNode(op, input_count_with_deps, buffer, incomplete);
3559 if (has_effect) {
3560 environment_->UpdateEffectDependency(result);
3561 }
3562 if (!environment()->IsMarkedAsUnreachable()) { 3559 if (!environment()->IsMarkedAsUnreachable()) {
3563 // Update the current control dependency for control-producing nodes. 3560 // Update the current control dependency for control-producing nodes.
3564 if (NodeProperties::IsControl(result)) { 3561 if (NodeProperties::IsControl(result)) {
3565 environment_->UpdateControlDependency(result); 3562 environment_->UpdateControlDependency(result);
3566 } 3563 }
3564 // Update the current effect dependency for effect-producing nodes.
3565 if (result->op()->EffectOutputCount() > 0) {
3566 environment_->UpdateEffectDependency(result);
3567 }
3567 // Add implicit exception continuation for throwing nodes. 3568 // Add implicit exception continuation for throwing nodes.
3568 if (!result->op()->HasProperty(Operator::kNoThrow) && inside_try_scope) { 3569 if (!result->op()->HasProperty(Operator::kNoThrow) && inside_try_scope) {
3569 // Conservative prediction whether caught locally. 3570 // Conservative prediction whether caught locally.
3570 IfExceptionHint hint = try_catch_nesting_level_ > 0 3571 IfExceptionHint hint = try_catch_nesting_level_ > 0
3571 ? IfExceptionHint::kLocallyCaught 3572 ? IfExceptionHint::kLocallyCaught
3572 : IfExceptionHint::kLocallyUncaught; 3573 : IfExceptionHint::kLocallyUncaught;
3573 // Copy the environment for the success continuation. 3574 // Copy the environment for the success continuation.
3574 Environment* success_env = environment()->CopyForConditional(); 3575 Environment* success_env = environment()->CopyForConditional();
3575 const Operator* op = common()->IfException(hint); 3576 const Operator* op = common()->IfException(hint);
3576 Node* on_exception = graph()->NewNode(op, result); 3577 Node* on_exception = graph()->NewNode(op, result);
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
3804 // Phi does not exist yet, introduce one. 3805 // Phi does not exist yet, introduce one.
3805 value = NewPhi(inputs, value, control); 3806 value = NewPhi(inputs, value, control);
3806 value->ReplaceInput(inputs - 1, other); 3807 value->ReplaceInput(inputs - 1, other);
3807 } 3808 }
3808 return value; 3809 return value;
3809 } 3810 }
3810 3811
3811 } // namespace compiler 3812 } // namespace compiler
3812 } // namespace internal 3813 } // namespace internal
3813 } // namespace v8 3814 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/compiler/verifier.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698