[turbofan] Fix deopt point for [[ToName]] lazy bailout.
This fixes the deoptimization information for the lazy bailout point after a [[ToName]] operation inserted for object literals and class literals. The result value was erroneously ignored. R=jarin@chromium.org TEST=mjsunit/regress/regress-crbug-627828 BUG=chromium:627828 Review-Url: https://codereview.chromium.org/2149493003 Cr-Commit-Position: refs/heads/master@{#37719}
This commit is contained in:
parent
2b2a169490
commit
a2f1519f68
@ -3734,7 +3734,7 @@ Node* AstGraphBuilder::BuildToBoolean(Node* input, TypeFeedbackId feedback_id) {
|
||||
Node* AstGraphBuilder::BuildToName(Node* input, BailoutId bailout_id) {
|
||||
if (Node* node = TryFastToName(input)) return node;
|
||||
Node* name = NewNode(javascript()->ToName(), input);
|
||||
PrepareFrameState(name, bailout_id);
|
||||
PrepareFrameState(name, bailout_id, OutputFrameStateCombine::Push());
|
||||
return name;
|
||||
}
|
||||
|
||||
|
@ -1066,7 +1066,7 @@ void FullCodeGenerator::EmitPropertyKey(ObjectLiteralProperty* property,
|
||||
BailoutId bailout_id) {
|
||||
VisitForStackValue(property->key());
|
||||
CallRuntimeWithOperands(Runtime::kToName);
|
||||
PrepareForBailoutForId(bailout_id, BailoutState::NO_REGISTERS);
|
||||
PrepareForBailoutForId(bailout_id, BailoutState::TOS_REGISTER);
|
||||
PushOperand(result_register());
|
||||
}
|
||||
|
||||
|
40
test/mjsunit/regress/regress-crbug-627828.js
Normal file
40
test/mjsunit/regress/regress-crbug-627828.js
Normal file
@ -0,0 +1,40 @@
|
||||
// Copyright 2016 the V8 project authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style license that can be
|
||||
// found in the LICENSE file.
|
||||
|
||||
// Flags: --allow-natives-syntax
|
||||
|
||||
(function TestDeoptFromCopmputedNameInObjectLiteral() {
|
||||
function f() {
|
||||
var o = {
|
||||
toString: function() {
|
||||
%DeoptimizeFunction(f);
|
||||
return "x";
|
||||
}
|
||||
};
|
||||
return { [o]() { return 23 } };
|
||||
}
|
||||
assertEquals(23, f().x());
|
||||
assertEquals(23, f().x());
|
||||
%OptimizeFunctionOnNextCall(f);
|
||||
assertEquals(23, f().x());
|
||||
})();
|
||||
|
||||
(function TestDeoptFromCopmputedNameInClassLiteral() {
|
||||
function g() {
|
||||
var o = {
|
||||
toString: function() {
|
||||
%DeoptimizeFunction(g);
|
||||
return "y";
|
||||
}
|
||||
};
|
||||
class C {
|
||||
[o]() { return 42 };
|
||||
}
|
||||
return new C();
|
||||
}
|
||||
assertEquals(42, g().y());
|
||||
assertEquals(42, g().y());
|
||||
%OptimizeFunctionOnNextCall(g);
|
||||
assertEquals(42, g().y());
|
||||
})();
|
Loading…
Reference in New Issue
Block a user