Commit 045fbe46 authored by verwaest@chromium.org's avatar verwaest@chromium.org

Pass the ast_id to HandleKeyed to make sure it's the right one (e.g.,...

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
parent 363619d0
...@@ -6436,7 +6436,7 @@ void HOptimizedGraphBuilder::BuildStore(Expression* expr, ...@@ -6436,7 +6436,7 @@ void HOptimizedGraphBuilder::BuildStore(Expression* expr,
HValue* key = environment()->ExpressionStackAt(1); HValue* key = environment()->ExpressionStackAt(1);
HValue* object = environment()->ExpressionStackAt(2); HValue* object = environment()->ExpressionStackAt(2);
bool has_side_effects = false; 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); &has_side_effects);
Drop(3); Drop(3);
Push(value); Push(value);
...@@ -7129,7 +7129,7 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess( ...@@ -7129,7 +7129,7 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess(
HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess( 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, BailoutId return_id, PropertyAccessType access_type,
bool* has_side_effects) { bool* has_side_effects) {
if (key->ActualValue()->IsConstant()) { if (key->ActualValue()->IsConstant()) {
...@@ -7143,7 +7143,7 @@ HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess( ...@@ -7143,7 +7143,7 @@ HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess(
Handle<String>::cast(constant)); Handle<String>::cast(constant));
} }
HInstruction* instr = 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); Handle<String>::cast(constant), val, false);
if (instr == NULL || instr->IsLinked()) { if (instr == NULL || instr->IsLinked()) {
*has_side_effects = false; *has_side_effects = false;
...@@ -7365,7 +7365,7 @@ void HOptimizedGraphBuilder::BuildLoad(Property* expr, ...@@ -7365,7 +7365,7 @@ void HOptimizedGraphBuilder::BuildLoad(Property* expr,
bool has_side_effects = false; bool has_side_effects = false;
HValue* load = HandleKeyedElementAccess( 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 (has_side_effects) {
if (ast_context()->IsEffect()) { if (ast_context()->IsEffect()) {
Add<HSimulate>(ast_id, REMOVABLE_SIMULATE); Add<HSimulate>(ast_id, REMOVABLE_SIMULATE);
......
...@@ -2627,7 +2627,8 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor { ...@@ -2627,7 +2627,8 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
bool* has_side_effects); bool* has_side_effects);
HValue* HandleKeyedElementAccess(HValue* obj, HValue* key, HValue* val, HValue* HandleKeyedElementAccess(HValue* obj, HValue* key, HValue* val,
Expression* expr, BailoutId return_id, Expression* expr, BailoutId ast_id,
BailoutId return_id,
PropertyAccessType access_type, PropertyAccessType access_type,
bool* has_side_effects); bool* has_side_effects);
......
...@@ -34,3 +34,39 @@ f(o3); ...@@ -34,3 +34,39 @@ f(o3);
f(o3); f(o3);
%OptimizeFunctionOnNextCall(f); %OptimizeFunctionOnNextCall(f);
assertEquals(1200, f(o3)); 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();
})();
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