| // Copyright 2019 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 --opt --experimental-stack-trace-frames |
| |
| // Verifies that "print" shows up in Error.stack when "bar" is optimized |
| // by Turbofan: |
| // Error |
| // at foo (...) |
| // at Object.toString (...) |
| // at print (<anonymous>) |
| // at bar (...) |
| // at (...) |
| let prepareStackTraceCalled = false; |
| Error.prepareStackTrace = (e, frames) => { |
| prepareStackTraceCalled = true; |
| assertEquals(5, frames.length); |
| |
| assertEquals(foo, frames[0].getFunction()); |
| assertEquals(object.toString, frames[1].getFunction()); |
| assertEquals("print", frames[2].getFunctionName()); |
| assertEquals(bar, frames[3].getFunction()); |
| return frames; |
| }; |
| |
| function foo() { throw new Error(); } |
| const object = { toString: () => { return foo(); } }; |
| |
| function bar() { |
| print(object); |
| } |
| |
| %PrepareFunctionForOptimization(bar); |
| try { bar(); } catch (e) {} |
| try { bar(); } catch (e) {} |
| %OptimizeFunctionOnNextCall(bar); |
| |
| try { bar(); } catch(e) { |
| // Trigger prepareStackTrace. |
| e.stack; |
| } |
| |
| assertOptimized(bar); |
| assertTrue(prepareStackTraceCalled); |