Pass the ast_id to HandleKeyed to make sure it's the right one (e.g., CountOperation...
authorverwaest@chromium.org <verwaest@chromium.org>
Mon, 22 Sep 2014 12:43:40 +0000 (12:43 +0000)
committerverwaest@chromium.org <verwaest@chromium.org>
Mon, 22 Sep 2014 12:43:40 +0000 (12:43 +0000)
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

src/hydrogen.cc
src/hydrogen.h
test/mjsunit/keyed-named-access.js

index e5a93a7..848178c 100644 (file)
@@ -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);
index 6b03170..d5e208f 100644 (file)
@@ -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);
 
index f9541e8..11f8fb5 100644 (file)
@@ -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();
+})();