Skip to content

Commit a04a318

Browse files
Merge pull request #110 from oven-sh/bump-webkit-20250930
bump webkit 20250930
2 parents 0875bc8 + d4ba9db commit a04a318

File tree

2,839 files changed

+177491
-138865
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

2,839 files changed

+177491
-138865
lines changed

Configurations/Sanitizers.xcconfig

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ WK_ENABLE_CONJECTURE_ASSERT_YES = ENABLE_CONJECTURE_ASSERT;
3838

3939
WK_SANITIZER_OTHER_CFLAGS = $(WK_ANY_SANITIZER_CFLAGS_$(WK_ANY_SANITIZER_ENABLED)) $(WK_ADDRESS_SANITIZER_OTHER_CFLAGS_$(ENABLE_ADDRESS_SANITIZER)) $(WK_UNDEFINED_BEHAVIOR_SANITIZER_OTHER_CFLAGS_$(ENABLE_UNDEFINED_BEHAVIOR_SANITIZER)) $(WK_FUZZILLI_OTHER_CFLAGS_$(ENABLE_FUZZILLI)) $(WK_LIBFUZZER_OTHER_CFLAGS_$(ENABLE_LIBFUZZER)) $(WK_CODE_COVERAGE_WARNING_CFLAGS_$(CLANG_COVERAGE_MAPPING));
4040

41-
WK_SANITIZER_OTHER_LDFLAGS = $(WK_ANY_SANITIZER_LDFLAGS_$(WK_ANY_SANITIZER_ENABLED)) $(WK_ADDRESS_SANITIZER_OTHER_LDFLAGS_$(ENABLE_ADDRESS_SANITIZER)) $(WK_FUZZILLI_OTHER_LDFLAGS_$(ENABLE_FUZZILLI)) $(WK_LIBFUZZER_OTHER_LDFLAGS_$(ENABLE_LIBFUZZER));
41+
WK_SANITIZER_OTHER_LDFLAGS = $(WK_ANY_SANITIZER_LDFLAGS_$(WK_ANY_SANITIZER_ENABLED)) $(WK_ADDRESS_SANITIZER_OTHER_LDFLAGS_$(ENABLE_ADDRESS_SANITIZER)) $(WK_THREAD_SANITIZER_OTHER_LDFLAGS_$(ENABLE_THREAD_SANITIZER)) $(WK_FUZZILLI_OTHER_LDFLAGS_$(ENABLE_FUZZILLI)) $(WK_LIBFUZZER_OTHER_LDFLAGS_$(ENABLE_LIBFUZZER));
4242

4343
WK_SANITIZER_OTHER_TAPI_FLAGS = $(WK_SANITIZER_OTHER_TAPI_FLAGS_ASAN_$(ENABLE_ADDRESS_SANITIZER)) $(WK_SANITIZER_OTHER_TAPI_FLAGS_LIBFUZZER_$(ENABLE_LIBFUZZER)) $(WK_SANITIZER_OTHER_TAPI_FLAGS_TSAN_$(ENABLE_THREAD_SANITIZER)) $(WK_SANITIZER_OTHER_TAPI_FLAGS_UBSAN_$(ENABLE_UNDEFINED_BEHAVIOR_SANITIZER));
4444
WK_SANITIZER_OTHER_TAPI_FLAGS_ASAN_YES = -Xparser -fsanitize=address;
@@ -80,6 +80,13 @@ WK_NEEDS_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE_WORKAROUND_XCODE_BEFORE_17 =
8080
WK_WORKAROUND_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE = $(WK_WORKAROUND_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE_$(WK_NEEDS_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE_WORKAROUND);
8181
WK_WORKAROUND_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE_YES = -DWK_WORKAROUND_RDAR_145268301_ASAN_STACK_USE_AFTER_SCOPE;
8282

83+
// Thread Sanitizer
84+
85+
// Disable compact unwind to work around "Too many personality routines" linker error with TSan builds.
86+
WK_THREAD_SANITIZER_OTHER_LDFLAGS_YES = $(WK_THREAD_SANITIZER_OTHER_LDFLAGS_$(PRODUCT_NAME));
87+
WK_THREAD_SANITIZER_OTHER_LDFLAGS_WebCore = -Wl,-no_compact_unwind;
88+
WK_THREAD_SANITIZER_OTHER_LDFLAGS_WebKit = -Wl,-no_compact_unwind;
89+
8390
// Undefined Behavior Sanitizer
8491

8592
// FIXME: <rdar://105760852> Tune list of Undefined Behavior (UBSan) checkers
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
function test(flag) {
2+
let arr = new Array(2);
3+
arr[0] = {};
4+
if (!flag) {
5+
leaked = arr; // trigger InadequateCoverage OSR exit
6+
}
7+
}
8+
noInline(test);
9+
10+
for(let i = 0; i < testLoopCount; i++) {
11+
test(true);
12+
}
13+
14+
test(false);
15+
if (leaked[1] !== undefined)
16+
throw new Error();

JSTests/stress/async-stack-trace-nested-deep.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
//@ requireOptions("--useAsyncStackTrace=1")
2+
//@ slow!
23

34
const source = "async-stack-trace-nested-deep.js";
45

@@ -34,7 +35,6 @@ function shouldThrowAsync(run, errorType, message, stackFunctions) {
3435

3536
const stackLines = stackTrace.split('\n').filter(line => line.trim());
3637

37-
let stackLineIndex = 0;
3838
for (let i = 0; i < stackFunctions.length; i++) {
3939
const [expectedFunction, expectedLocation] = stackFunctions[i];
4040
const isNativeCode = expectedLocation === "[native code]"
@@ -645,7 +645,8 @@ async function problematicFunction() {
645645
throw new Error("error");
646646
}
647647

648-
for (let i = 0; i < testLoopCount; i++) {
648+
let count = (testLoopCount / 10) | 0; // This test is too slow.
649+
for (let i = 0; i < count; i++) {
649650
shouldThrowAsync(
650651
async function test () {
651652
await level1();
@@ -755,8 +756,8 @@ for (let i = 0; i < testLoopCount; i++) {
755756
["async level2", "73:17"],
756757
["async level1", "67:17"],
757758
["drainMicrotasks", "[native code]"],
758-
["shouldThrowAsync", "19:20"],
759-
["global code", "649:21"]
759+
["shouldThrowAsync", "20:20"],
760+
["global code", "650:21"]
760761
],
761762
);
762763
drainMicrotasks();
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
//@ requireOptions("--useAsyncStackTrace=1")
2+
3+
const source = "async-stack-trace-promise-all-basic.js";
4+
5+
function nop() {}
6+
7+
function shouldThrowAsync(run, errorType, message, stackFunctions) {
8+
let actual;
9+
var hadError = false;
10+
run().then(
11+
function (value) {
12+
actual = value;
13+
},
14+
function (error) {
15+
hadError = true;
16+
actual = error;
17+
},
18+
);
19+
drainMicrotasks();
20+
if (!hadError) {
21+
throw new Error("Expected " + run + "() to throw " + errorType.name + ", but did not throw.");
22+
}
23+
if (!(actual instanceof errorType)) {
24+
throw new Error("Expected " + run + "() to throw " + errorType.name + ", but threw '" + actual + "'");
25+
}
26+
if (message !== void 0 && actual.message !== message) {
27+
throw new Error("Expected " + run + "() to throw '" + message + "', but threw '" + actual.message + "'");
28+
}
29+
30+
const stackTrace = actual.stack;
31+
if (!stackTrace) {
32+
throw new Error("Expected error to have stack trace, but it was undefined");
33+
}
34+
35+
const stackLines = stackTrace.split('\n').filter(line => line.trim());
36+
37+
for (let i = 0; i < stackFunctions.length; i++) {
38+
const [expectedFunction, expectedLocation] = stackFunctions[i];
39+
const isNativeCode = expectedLocation === "[native code]"
40+
const stackLine = stackLines[i];
41+
42+
let found = false;
43+
44+
if (isNativeCode) {
45+
if (stackLine === `${expectedFunction}@[native code]`)
46+
found = true;
47+
} else {
48+
if (stackLine === `${expectedFunction}@${source}:${expectedLocation}`)
49+
found = true;
50+
if (stackLine === `${expectedFunction}@${source}`)
51+
found = true;
52+
}
53+
54+
if (!found) {
55+
throw new Error(
56+
`Expected stack trace to contain '${expectedFunction}' at '${expectedLocation}', but got '${stackLine}'` +
57+
`\nActual stack trace:\n${stackTrace}\n`
58+
);
59+
}
60+
}
61+
}
62+
63+
{
64+
async function fine() { }
65+
async function thrower() { await fine(); throw new Error('error'); }
66+
async function run() { await Promise.all([fine(), thrower()]); }
67+
68+
for (let i = 0; i < testLoopCount; i++) {
69+
shouldThrowAsync(
70+
async function test() {
71+
await run();
72+
}, Error, "error",
73+
[
74+
["thrower", "65:59"],
75+
["async run", "66:43"],
76+
["async test", "71:25"],
77+
["drainMicrotasks", "[native code]"],
78+
["shouldThrowAsync", "19:20"],
79+
["global code", "69:24"]
80+
],
81+
);
82+
drainMicrotasks();
83+
}
84+
}
85+
86+
{
87+
async function task1() { await nop(); }
88+
async function task2() {
89+
await nop();
90+
91+
92+
93+
throw new Error('task2 error');
94+
}
95+
async function task3() { await nop(); }
96+
async function runner() { await Promise.all([task1(), task2(), task3()]); }
97+
98+
for (let i = 0; i < testLoopCount; i++) {
99+
shouldThrowAsync(
100+
async function test() {
101+
await runner();
102+
}, Error, "task2 error",
103+
[
104+
["task2", "93:20"],
105+
["async runner", "96:46"],
106+
["async test", "101:28"],
107+
["drainMicrotasks", "[native code]"],
108+
["shouldThrowAsync", "19:20"],
109+
["global code", "99:24"]
110+
],
111+
);
112+
drainMicrotasks();
113+
}
114+
}
115+
116+
{
117+
async function task1() {}
118+
119+
async function task2() {
120+
await foo();
121+
}
122+
async function foo() {
123+
await bar();
124+
}
125+
async function bar() {
126+
await 1;
127+
await Promise.all([task1(), baz()]);
128+
}
129+
async function baz() {
130+
await 2;
131+
throw new Error('task2 error');
132+
}
133+
134+
async function task3() {}
135+
async function runner() { await Promise.all([task1(), task2(), task3()]); }
136+
137+
for (let i = 0; i < testLoopCount; i++) {
138+
shouldThrowAsync(
139+
async function test() {
140+
await runner();
141+
}, Error, "task2 error",
142+
[
143+
["baz", "131:20"],
144+
["async bar", "127:22"],
145+
["async foo", "123:14"],
146+
["async task2", "120:14"],
147+
["async runner", "135:46"],
148+
["async test", "140:28"],
149+
["drainMicrotasks", "[native code]"],
150+
["shouldThrowAsync", "19:20"],
151+
["global code", "138:24"]
152+
],
153+
);
154+
drainMicrotasks();
155+
}
156+
}
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
//@ requireOptions("--useAsyncStackTrace=1")
2+
3+
const source = "async-stack-trace-promise-any-basic.js";
4+
5+
function nop() {}
6+
7+
function shouldBe(a, b) {
8+
if (a !== b)
9+
throw new Error(`Expected ${a} to be ${b}`);
10+
}
11+
12+
function testStack(error, stackFunctions) {
13+
const stackTrace = error.stack;
14+
if (!stackTrace) {
15+
throw new Error("Expected error to have stack trace, but it was undefined");
16+
}
17+
const stackLines = stackTrace.split('\n').filter(line => line.trim());
18+
for (let i = 0; i < stackFunctions.length; i++) {
19+
const [expectedFunction, expectedLocation] = stackFunctions[i];
20+
const isNativeCode = expectedLocation === "[native code]"
21+
const stackLine = stackLines[i];
22+
23+
let found = false;
24+
25+
if (isNativeCode) {
26+
if (stackLine === `${expectedFunction}@[native code]`)
27+
found = true;
28+
} else {
29+
if (stackLine === `${expectedFunction}@${source}:${expectedLocation}`)
30+
found = true;
31+
if (stackLine === `${expectedFunction}@${source}`)
32+
found = true;
33+
}
34+
35+
if (!found) {
36+
throw new Error(
37+
`Expected stack trace to contain '${expectedFunction}' at '${expectedLocation}', but got '${stackLine}'` +
38+
`\nActual stack trace:\n${stackTrace}\n`
39+
);
40+
}
41+
}
42+
}
43+
44+
function shouldThrowAsync(run, errorType) {
45+
let actual;
46+
var hadError = false;
47+
run().then(
48+
function (value) {
49+
actual = value;
50+
},
51+
function (error) {
52+
hadError = true;
53+
actual = error;
54+
},
55+
);
56+
drainMicrotasks();
57+
if (!hadError) {
58+
throw new Error("Expected " + run + "() to throw " + errorType.name + ", but did not throw.");
59+
}
60+
if (!(actual instanceof errorType)) {
61+
throw new Error("Expected " + run + "() to throw " + errorType.name + ", but threw '" + actual + "'");
62+
}
63+
return actual;
64+
}
65+
66+
{
67+
async function fine() { }
68+
async function thrower() { await fine(); throw new Error('error'); }
69+
async function run() { await Promise.any([thrower()]); }
70+
71+
for (let i = 0; i < testLoopCount; i++) {
72+
const aggregateError = shouldThrowAsync(
73+
async function test() {
74+
await run();
75+
}, AggregateError
76+
);
77+
drainMicrotasks();
78+
shouldBe(aggregateError.errors.length, 1);
79+
testStack(aggregateError.errors[0],
80+
[
81+
["thrower", "68:59"],
82+
["async run", "69:43"],
83+
["async test", "74:18"],
84+
["drainMicrotasks", "[native code]"],
85+
["shouldThrowAsync", "56:18"],
86+
["global code", "72:44"]
87+
]
88+
);
89+
}
90+
}
91+
92+
{
93+
async function task1() {
94+
95+
await nop();
96+
97+
throw new Error("error from task1");
98+
}
99+
async function task2() {
100+
await nop();
101+
102+
103+
104+
throw new Error('task2 error');
105+
}
106+
async function task3() { await 1; throw new Error("error from task3"); }
107+
async function run() { await Promise.any([task1(), task2(), task3()]); }
108+
109+
for (let i = 0; i < testLoopCount; i++) {
110+
const aggregateError = shouldThrowAsync(
111+
async function test() {
112+
await run();
113+
}, AggregateError
114+
);
115+
drainMicrotasks();
116+
shouldBe(aggregateError.errors.length, 3);
117+
testStack(aggregateError.errors[0],
118+
[
119+
["task1", "97:20"],
120+
["async run", "107:43"],
121+
["async test", "112:18"],
122+
["drainMicrotasks", "[native code]"],
123+
["shouldThrowAsync", "56:18"],
124+
["global code", "110:44"]
125+
]
126+
);
127+
testStack(aggregateError.errors[1],
128+
[
129+
["task2", "104:20"],
130+
["async run", "107:43"],
131+
["async test", "112:18"],
132+
["drainMicrotasks", "[native code]"],
133+
["shouldThrowAsync", "56:18"],
134+
["global code", "110:44"]
135+
]
136+
);
137+
testStack(aggregateError.errors[2],
138+
[
139+
["task3", "106:52"],
140+
["async run", "107:43"],
141+
["async test", "112:18"],
142+
["drainMicrotasks", "[native code]"],
143+
["shouldThrowAsync", "56:18"],
144+
["global code", "110:44"]
145+
]
146+
);
147+
}
148+
}

0 commit comments

Comments
 (0)