try-catch-deopt.js 4.23 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// 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 LazyDeoptFromTryBlock() {
  function g(dummy) {
    %DeoptimizeFunction(f);
    throw 42;
  }

  function f() {
    var a = 1;
    try {
      var dummy = 2;  // perturb the stack height.
      g(dummy);
    } catch (e) {
      return e + a;
    }
  }

23
  %PrepareFunctionForOptimization(f);
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
  assertEquals(43, f());
  assertEquals(43, f());
  %NeverOptimizeFunction(g);
  %OptimizeFunctionOnNextCall(f);
  assertEquals(43, f());
})();


(function LazyDeoptDoublyNestedTryBlock() {
  function g(dummy) {
    %DeoptimizeFunction(f);
    throw 42;
  }

  function f() {
    var b;
    try {
      var a = 1;
      try {
        var dummy = 2;  // perturb the stack height.
        g(dummy);
      } catch (e) {
        b = e + a;
      }
    } catch (e) {
      return 0;
    }
    return b;
  }

54
  %PrepareFunctionForOptimization(f);
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
  assertEquals(43, f());
  assertEquals(43, f());
  %NeverOptimizeFunction(g);
  %OptimizeFunctionOnNextCall(f);
  assertEquals(43, f());
})();

(function LazyDeoptInlinedTry() {
  function g(dummy) {
    %DeoptimizeFunction(f);
    %DeoptimizeFunction(h);
    throw 42;
  }

  function h() {
    var a = 1;
    try {
      var dummy = 2;  // perturb the stack height.
      g(dummy);
    } catch (e) {
      b = e + a;
    }
    return b;
  }

  function f() {
    var c = 1;
    return h() + 1;
  }

85
  %PrepareFunctionForOptimization(f);
86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
  assertEquals(44, f());
  assertEquals(44, f());
  %NeverOptimizeFunction(g);
  %OptimizeFunctionOnNextCall(f);
  assertEquals(44, f());
})();

(function LazyDeoptInlinedIntoTry() {
  function g(c) {
    %DeoptimizeFunction(f);
    %DeoptimizeFunction(h);
    throw c;
  }

  function h(c) {
    return g(c);
  }

  function f() {
    var a = 1;
    try {
      var c = 42;  // perturb the stack height.
      h(c);
    } catch (e) {
      a += e;
    }
    return a;
  }

115
  %PrepareFunctionForOptimization(f);
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
  assertEquals(43, f());
  assertEquals(43, f());
  %NeverOptimizeFunction(g);
  %OptimizeFunctionOnNextCall(f);
  assertEquals(43, f());
})();

(function LazyDeoptTryBlockContextCatch() {
  var global = 0;

  function g() {
    %DeoptimizeFunction(f);
    throw "boom!";
  }

  function f(a) {
    var x = a + 23
    try {
      let y = a + 42;
      function capture() { return x + y }
      g();
    } catch(e) {
      global = x;
    }
    return x;
  }
142
  %PrepareFunctionForOptimization(f);
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
  assertEquals(23, f(0));
  assertEquals(24, f(1));
  %OptimizeFunctionOnNextCall(f);
  assertEquals(25, f(2));
  assertEquals(25, global);
})();

(function LazyDeoptTryBlockFinally() {
  var global = 0;

  function g() {
    %DeoptimizeFunction(f);
    throw "boom!";
  }

  function f(a) {
    var x = a + 23
    try {
      let y = a + 42;
      function capture() { return x + y }
      g();
    } finally {
      global = x;
    }
    return x;
  }
169
  %PrepareFunctionForOptimization(f);
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198
  assertThrows(function() { f(0) });
  assertThrows(function() { f(1) });
  %OptimizeFunctionOnNextCall(f);
  assertThrowsEquals(function() { f(2) }, "boom!");
  assertEquals(25, global);
})();

(function LazyDeoptTryCatchContextCatch() {
  var global = 0;

  function g() {
    %DeoptimizeFunction(f);
    throw 5;
  }

  function f(a) {
    var x = a + 23
    try {
      try {
        throw 1;
      } catch(e2) {
        function capture() { return x + y }
        g();
      }
    } catch(e) {
      global = x + e;
    }
    return x;
  }
199
  %PrepareFunctionForOptimization(f);
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
  assertEquals(23, f(0));
  assertEquals(24, f(1));
  %OptimizeFunctionOnNextCall(f);
  assertEquals(25, f(2));
  assertEquals(30, global);
})();

(function LazyDeoptTryWithContextCatch() {
  var global = 0;

  function g() {
    %DeoptimizeFunction(f);
    throw 5;
  }

  function f(a) {
    var x = a + 23
    try {
      with ({ y : a + 42 }) {
        function capture() { return x + y }
        g();
      }
    } catch(e) {
      global = x + e;
    }
    return x;
  }
227
  %PrepareFunctionForOptimization(f);
228 229 230 231 232 233
  assertEquals(23, f(0));
  assertEquals(24, f(1));
  %OptimizeFunctionOnNextCall(f);
  assertEquals(25, f(2));
  assertEquals(30, global);
})();