02149d89a5
The attached chromium bug suggests that turning this on via a flag regressed a perf test. Having previously run into slowdowns due to experimental JS natives, my suspicion is that this regression can be fixed by including the new builtins in the snapshot. My intention is to land this patch to see if the regression goes away on the bots. Given the nature of this feature, it seems low-risk to remove the runtime flag. If need be, it would be trivial to craft a patch to remove these two methods from String.prototype if we run into web compat issues during the release (note that no release branch has yet picked up this feature). BUG=v8:4954, chromium:677444 Review-Url: https://codereview.chromium.org/2610853010 Cr-Commit-Position: refs/heads/master@{#42111}
97 lines
3.1 KiB
JavaScript
97 lines
3.1 KiB
JavaScript
// 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.
|
|
|
|
(function TestMeta() {
|
|
assertEquals(1, String.prototype.padEnd.length);
|
|
assertEquals("function", typeof String.prototype.padEnd);
|
|
assertEquals(Object.getPrototypeOf(Function),
|
|
Object.getPrototypeOf(String.prototype.padEnd));
|
|
assertEquals("padEnd", String.prototype.padEnd.name);
|
|
|
|
var desc = Object.getOwnPropertyDescriptor(String.prototype, "padEnd");
|
|
assertFalse(desc.enumerable);
|
|
assertTrue(desc.configurable);
|
|
assertTrue(desc.writable);
|
|
assertEquals(undefined, desc.get);
|
|
assertEquals(undefined, desc.set);
|
|
|
|
assertThrows(() => new Function(`${String.prototype.padEnd}`), SyntaxError);
|
|
})();
|
|
|
|
|
|
(function TestRequireObjectCoercible() {
|
|
var padEnd = String.prototype.padEnd;
|
|
assertThrows(() => padEnd.call(null, 4, "test"), TypeError);
|
|
assertThrows(() => padEnd.call(undefined, 4, "test"), TypeError);
|
|
assertEquals("123 ", padEnd.call({
|
|
__proto__: null,
|
|
valueOf() { return 123; }
|
|
}, 6, " "));
|
|
|
|
var proxy = new Proxy({}, {
|
|
get(t, name) {
|
|
if (name === Symbol.toPrimitive || name === "toString") return;
|
|
if (name === "valueOf") return () => 6.7;
|
|
assertUnreachable();
|
|
}
|
|
});
|
|
assertEquals("6.7 ", padEnd.call(proxy, 6, " "));
|
|
|
|
proxy = new Proxy({}, {
|
|
get(t, name) {
|
|
if (name === Symbol.toPrimitive || name === "valueOf") return;
|
|
if (name === "toString") return () => 6.7;
|
|
assertUnreachable();
|
|
}
|
|
});
|
|
assertEquals("6.7 ", padEnd.call(proxy, 6, " "));
|
|
})();
|
|
|
|
|
|
(function TestToLength() {
|
|
assertThrows(() => "123".padEnd(Symbol("16")), TypeError);
|
|
assertEquals("123", "123".padEnd(-1));
|
|
assertEquals("123", "123".padEnd({ toString() { return -1; } }));
|
|
assertEquals("123", "123".padEnd(-0));
|
|
assertEquals("123", "123".padEnd({ toString() { return -0; } }));
|
|
assertEquals("123", "123".padEnd(+0));
|
|
assertEquals("123", "123".padEnd({ toString() { return +0; } }));
|
|
assertEquals("123", "123".padEnd(NaN));
|
|
assertEquals("123", "123".padEnd({ toString() { return NaN; } }));
|
|
})();
|
|
|
|
|
|
(function TestFillerToString() {
|
|
assertEquals(". ", ".".padEnd(10));
|
|
assertEquals(". ", ".".padEnd(10, undefined));
|
|
assertEquals(".nullnulln", ".".padEnd(10, null));
|
|
assertEquals(".XXXXXXXXX", ".".padEnd(10, { toString() { return "X"; } }));
|
|
assertEquals(
|
|
".111111111",
|
|
".".padEnd(10, { toString: undefined, valueOf() { return 1; } }));
|
|
})();
|
|
|
|
|
|
(function TestFillerEmptyString() {
|
|
assertEquals(".", ".".padEnd(10, ""));
|
|
assertEquals(".", ".".padEnd(10, { toString() { return ""; } }));
|
|
assertEquals(
|
|
".", ".".padEnd(10, { toString: undefined, valueOf() { return ""; } }));
|
|
})();
|
|
|
|
|
|
(function TestFillerRepetition() {
|
|
for (var i = 2000; i > 0; --i) {
|
|
var expected = "123" + "xoxo".repeat(i / 4).slice(0, i - 3);
|
|
var actual = "123".padEnd(i, "xoxo");
|
|
assertEquals(expected, actual);
|
|
assertEquals(i > "123".length ? i : 3, actual.length);
|
|
}
|
|
})();
|
|
|
|
|
|
(function TestTruncation() {
|
|
assertEquals("ab", "a".padEnd(2, "bc"));
|
|
})();
|