v8/test/mjsunit/stack-traces-custom.js
Jakob Gruber 6af8ca5e82 Fix type conversions in JSStackFrame accessors
We cannot assume that the receiver is a JSObject, nor can we assume
ToObject() completes successfully.

TBR=yangguo@chromium.org

Bug: chromium:739954
Change-Id: Id55571131ef8755e86f15cd2acb918ff0f1b7788
Reviewed-on: https://chromium-review.googlesource.com/632376
Reviewed-by: Jakob Gruber <jgruber@chromium.org>
Commit-Queue: Jakob Gruber <jgruber@chromium.org>
Cr-Commit-Position: refs/heads/master@{#47611}
2017-08-25 15:32:54 +00:00

52 lines
1.3 KiB
JavaScript

// 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.
var o = {
f: function() { throw new Error(); },
get j() { o.h(); },
set k(_) { o.j; },
};
o.g1 = function() { o.f() }
o.g2 = o.g1;
o.h = function() { o.g1() }
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("h", frames[2].getMethodName());
assertEquals("j", frames[3].getMethodName());
assertEquals("k", frames[4].getMethodName());
assertEquals(null, frames[5].getMethodName());
}
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");
}