Pass the ast_id to HandleKeyed to make sure it's the right one (e.g., CountOperation, not just the load-expression's id)
BUG= R=jarin@chromium.org Review URL: https://codereview.chromium.org/595453002 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24117 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
363619d01d
commit
045fbe46b1
@ -6436,7 +6436,7 @@ void HOptimizedGraphBuilder::BuildStore(Expression* expr,
|
||||
HValue* key = environment()->ExpressionStackAt(1);
|
||||
HValue* object = environment()->ExpressionStackAt(2);
|
||||
bool has_side_effects = false;
|
||||
HandleKeyedElementAccess(object, key, value, expr, return_id, STORE,
|
||||
HandleKeyedElementAccess(object, key, value, expr, ast_id, return_id, STORE,
|
||||
&has_side_effects);
|
||||
Drop(3);
|
||||
Push(value);
|
||||
@ -7129,7 +7129,7 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess(
|
||||
|
||||
|
||||
HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess(
|
||||
HValue* obj, HValue* key, HValue* val, Expression* expr,
|
||||
HValue* obj, HValue* key, HValue* val, Expression* expr, BailoutId ast_id,
|
||||
BailoutId return_id, PropertyAccessType access_type,
|
||||
bool* has_side_effects) {
|
||||
if (key->ActualValue()->IsConstant()) {
|
||||
@ -7143,7 +7143,7 @@ HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess(
|
||||
Handle<String>::cast(constant));
|
||||
}
|
||||
HInstruction* instr =
|
||||
BuildNamedAccess(access_type, expr->id(), return_id, expr, obj,
|
||||
BuildNamedAccess(access_type, ast_id, return_id, expr, obj,
|
||||
Handle<String>::cast(constant), val, false);
|
||||
if (instr == NULL || instr->IsLinked()) {
|
||||
*has_side_effects = false;
|
||||
@ -7365,7 +7365,7 @@ void HOptimizedGraphBuilder::BuildLoad(Property* expr,
|
||||
|
||||
bool has_side_effects = false;
|
||||
HValue* load = HandleKeyedElementAccess(
|
||||
obj, key, NULL, expr, expr->LoadId(), LOAD, &has_side_effects);
|
||||
obj, key, NULL, expr, ast_id, expr->LoadId(), LOAD, &has_side_effects);
|
||||
if (has_side_effects) {
|
||||
if (ast_context()->IsEffect()) {
|
||||
Add<HSimulate>(ast_id, REMOVABLE_SIMULATE);
|
||||
|
@ -2627,7 +2627,8 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
|
||||
bool* has_side_effects);
|
||||
|
||||
HValue* HandleKeyedElementAccess(HValue* obj, HValue* key, HValue* val,
|
||||
Expression* expr, BailoutId return_id,
|
||||
Expression* expr, BailoutId ast_id,
|
||||
BailoutId return_id,
|
||||
PropertyAccessType access_type,
|
||||
bool* has_side_effects);
|
||||
|
||||
|
@ -34,3 +34,39 @@ f(o3);
|
||||
f(o3);
|
||||
%OptimizeFunctionOnNextCall(f);
|
||||
assertEquals(1200, f(o3));
|
||||
|
||||
(function CountOperationDeoptimizationGetter() {
|
||||
var global = {};
|
||||
global.__defineGetter__("A", function () { return "x"; });
|
||||
|
||||
function h() {
|
||||
return "A";
|
||||
}
|
||||
|
||||
function g(a, b, c) {
|
||||
try {
|
||||
return a + b.toString() + c;
|
||||
} catch (e) { }
|
||||
}
|
||||
|
||||
function test(o) {
|
||||
return g(1, o[h()]--, 10);
|
||||
}
|
||||
|
||||
test(global);
|
||||
test(global);
|
||||
%OptimizeFunctionOnNextCall(test);
|
||||
print(test(global));
|
||||
})();
|
||||
|
||||
|
||||
(function CountOperationDeoptimizationPoint() {
|
||||
function test() {
|
||||
this[0, ""]--;
|
||||
}
|
||||
|
||||
test();
|
||||
test();
|
||||
%OptimizeFunctionOnNextCall(test);
|
||||
test();
|
||||
})();
|
||||
|
Loading…
Reference in New Issue
Block a user