| // Copyright 2014 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 | 
 |  | 
 | var k = "x"; | 
 | var o1 = {x: 10}; | 
 | var o2 = {x: 11, y: 20}; | 
 | var o3 = {x: 12, y: 20, z: 100}; | 
 |  | 
 | function f(o) { | 
 |   var result = 0; | 
 |   for (var i = 0; i < 100; i++) { | 
 |     result += o[k]; | 
 |   } | 
 |   return result; | 
 | } | 
 |  | 
 | %PrepareFunctionForOptimization(f); | 
 | f(o1); | 
 | f(o1); | 
 | f(o1); | 
 | %OptimizeFunctionOnNextCall(f); | 
 | assertEquals(1000, f(o1)); | 
 |  | 
 | %PrepareFunctionForOptimization(f); | 
 | f(o2); | 
 | f(o2); | 
 | f(o2); | 
 | %OptimizeFunctionOnNextCall(f); | 
 | assertEquals(1100, f(o2)); | 
 |  | 
 | %PrepareFunctionForOptimization(f); | 
 | f(o3); | 
 | 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); | 
 |   } | 
 |  | 
 |   %PrepareFunctionForOptimization(test); | 
 |   test(global); | 
 |   test(global); | 
 |   %OptimizeFunctionOnNextCall(test); | 
 |   print(test(global)); | 
 | })(); | 
 |  | 
 |  | 
 | (function CountOperationDeoptimizationPoint() { | 
 |   function test()  { | 
 |    this[0, ""]--; | 
 |   } | 
 |  | 
 |   %PrepareFunctionForOptimization(test); | 
 |   test(); | 
 |   test(); | 
 |   %OptimizeFunctionOnNextCall(test); | 
 |   test(); | 
 | })(); |