| // Copyright 2015 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 testMethodNames(o) { |
| try { |
| o.k = 42; |
| } catch (e) { |
| Error.prepareStackTrace = function(e, frames) { return frames; }; |
| var frames = e.stack; |
| Error.prepareStackTrace = undefined; |
| assertEquals("f", frames[0].getMethodName()); |
| assertEquals(null, frames[1].getMethodName()); |
| assertEquals("h1", frames[2].getMethodName()); |
| assertEquals("j", frames[3].getMethodName()); |
| assertEquals("k", frames[4].getMethodName()); |
| assertEquals("testMethodNames", frames[5].getMethodName()); |
| } |
| } |
| |
| var o = { |
| f: function() { throw new Error(); }, |
| get j() { o.h1(); }, |
| set k(_) { o.j; }, |
| }; |
| const duplicate = function() { o.f() } |
| o.g1 = duplicate; |
| o.g2 = duplicate; |
| o.h1 = function() { o.g1() } |
| o.h2 = o.h1; |
| |
| // Test in dictionary mode first. |
| assertFalse(%HasFastProperties(o)); |
| testMethodNames(o); |
| |
| // Same test but with fast mode object. |
| o = %ToFastProperties(o); |
| assertTrue(%HasFastProperties(o)); |
| testMethodNames(o); |
| |
| function testMethodName(f, frameNumber, expectedName) { |
| try { |
| Error.prepareStackTrace = function(e, frames) { return frames; } |
| f(); |
| assertUnreachable(); |
| } catch (e) { |
| const frame = e.stack[frameNumber]; |
| assertEquals(expectedName, frame.getMethodName()); |
| } finally { |
| Error.prepareStackTrace = undefined; |
| } |
| } |
| |
| const thrower = { valueOf: () => { throw new Error(); }}; |
| |
| { |
| const str = ""; |
| testMethodName(() => { str.indexOf(str, thrower); }, 1, "indexOf"); |
| } |
| |
| { |
| const nr = 42; |
| testMethodName(() => { nr.toString(thrower); }, 1, "toString"); |
| } |