Skip to content

Commit a499738

Browse files
rossbergMs2ger
andauthored
[interpreter] Catch failing string conversion in JS harness (#2011)
Co-authored-by: Ms2ger <[email protected]>
1 parent fac3545 commit a499738

File tree

3 files changed

+25
-19
lines changed

3 files changed

+25
-19
lines changed

interpreter/script/js.ml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -161,19 +161,21 @@ function assert_return(action, loc, ...expected) {
161161
throw new Error(expected.length + " value(s) expected, got " + actual.length);
162162
}
163163
for (let i = 0; i < actual.length; ++i) {
164+
let actual_i;
165+
try { actual_i = "" + actual[i] } catch { actual_i = typeof actual[i] }
164166
switch (expected[i]) {
165167
case "nan:canonical":
166168
case "nan:arithmetic":
167169
case "nan:any":
168170
// Note that JS can't reliably distinguish different NaN values,
169171
// so there's no good way to test that it's a canonical NaN.
170172
if (!Number.isNaN(actual[i])) {
171-
throw new Error("Wasm NaN return value expected, got " + actual[i]);
173+
throw new Error("Wasm NaN return value expected, got " + actual_i);
172174
};
173175
return;
174176
case "ref.i31":
175177
if (typeof actual[i] !== "number" || (actual[i] & 0x7fffffff) !== actual[i]) {
176-
throw new Error("Wasm i31 return value expected, got " + actual[i]);
178+
throw new Error("Wasm i31 return value expected, got " + actual_i);
177179
};
178180
return;
179181
case "ref.any":
@@ -183,27 +185,27 @@ function assert_return(action, loc, ...expected) {
183185
// For now, JS can't distinguish exported Wasm GC values,
184186
// so we only test for object.
185187
if (typeof actual[i] !== "object") {
186-
throw new Error("Wasm object return value expected, got " + actual[i]);
188+
throw new Error("Wasm object return value expected, got " + actual_i);
187189
};
188190
return;
189191
case "ref.func":
190192
if (typeof actual[i] !== "function") {
191-
throw new Error("Wasm function return value expected, got " + actual[i]);
193+
throw new Error("Wasm function return value expected, got " + actual_i);
192194
};
193195
return;
194196
case "ref.extern":
195197
if (actual[i] === null) {
196-
throw new Error("Wasm reference return value expected, got " + actual[i]);
198+
throw new Error("Wasm reference return value expected, got " + actual_i);
197199
};
198200
return;
199201
case "ref.null":
200202
if (actual[i] !== null) {
201-
throw new Error("Wasm null return value expected, got " + actual[i]);
203+
throw new Error("Wasm null return value expected, got " + actual_i);
202204
};
203205
return;
204206
default:
205207
if (!Object.is(actual[i], expected[i])) {
206-
throw new Error("Wasm return value " + expected[i] + " expected, got " + actual[i]);
208+
throw new Error("Wasm return value " + expected[i] + " expected, got " + actual_i);
207209
};
208210
}
209211
}

test/harness/async_index.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -318,33 +318,35 @@ function assert_return(action, source, ...expected) {
318318
throw new Error(expected.length + " value(s) expected, got " + actual.length);
319319
}
320320
for (let i = 0; i < actual.length; ++i) {
321+
let actual_i;
322+
try { actual_i = "" + actual[i] } catch (e) { actual_i = typeof actual[i] }
321323
switch (expected[i]) {
322324
case "nan:canonical":
323325
case "nan:arithmetic":
324326
case "nan:any":
325327
// Note that JS can't reliably distinguish different NaN values,
326328
// so there's no good way to test that it's a canonical NaN.
327-
assert_true(Number.isNaN(actual[i]), `expected NaN, observed ${actual[i]}.`);
329+
assert_true(Number.isNaN(actual[i]), `expected NaN, observed ${actual_i}.`);
328330
return;
329331
case "ref.i31":
330-
assert_true(typeof actual[i] === "number" && (actual[i] & 0x7fffffff) === actual[i], `expected Wasm i31, got ${actual[i]}`);
332+
assert_true(typeof actual[i] === "number" && (actual[i] & 0x7fffffff) === actual[i], `expected Wasm i31, got ${actual_i}`);
331333
return;
332334
case "ref.any":
333335
case "ref.eq":
334336
case "ref.struct":
335337
case "ref.array":
336338
// For now, JS can't distinguish exported Wasm GC values,
337339
// so we only test for object.
338-
assert_true(typeof actual[i] === "object", `expected Wasm GC object, got ${actual[i]}`);
340+
assert_true(typeof actual[i] === "object", `expected Wasm GC object, got ${actual_i}`);
339341
return;
340342
case "ref.func":
341-
assert_true(typeof actual[i] === "function", `expected Wasm function, got ${actual[i]}`);
343+
assert_true(typeof actual[i] === "function", `expected Wasm function, got ${actual_i}`);
342344
return;
343345
case "ref.extern":
344-
assert_true(actual[i] !== null, `expected Wasm reference, got ${actual[i]}`);
346+
assert_true(actual[i] !== null, `expected Wasm reference, got ${actual_i}`);
345347
return;
346348
case "ref.null":
347-
assert_true(actual[i] === null, `expected Wasm null reference, got ${actual[i]}`);
349+
assert_true(actual[i] === null, `expected Wasm null reference, got ${actual_i}`);
348350
return;
349351
default:
350352
assert_equals(actual[i], expected[i], loc);

test/harness/sync_index.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -387,33 +387,35 @@ function assert_return(action, source, ...expected) {
387387
return;
388388
expected[i] = expected[i].value;
389389
}
390+
let actual_i;
391+
try { actual_i = "" + actual[i] } catch (e) { actual_i = typeof actual[i] }
390392
switch (expected[i]) {
391393
case "nan:canonical":
392394
case "nan:arithmetic":
393395
case "nan:any":
394396
// Note that JS can't reliably distinguish different NaN values,
395397
// so there's no good way to test that it's a canonical NaN.
396-
assert_true(Number.isNaN(actual[i]), `expected NaN, observed ${actual[i]}.`);
398+
assert_true(Number.isNaN(actual[i]), `expected NaN, observed ${actual_i}.`);
397399
return;
398400
case "ref.i31":
399-
assert_true(typeof actual[i] === "number" && (actual[i] & 0x7fffffff) === actual[i], `expected Wasm i31, got ${actual[i]}`);
401+
assert_true(typeof actual[i] === "number" && (actual[i] & 0x7fffffff) === actual[i], `expected Wasm i31, got ${actual_i}`);
400402
return;
401403
case "ref.any":
402404
case "ref.eq":
403405
case "ref.struct":
404406
case "ref.array":
405407
// For now, JS can't distinguish exported Wasm GC values,
406408
// so we only test for object.
407-
assert_true(typeof actual[i] === "object", `expected Wasm GC object, got ${actual[i]}`);
409+
assert_true(typeof actual[i] === "object", `expected Wasm GC object, got ${actual_i}`);
408410
return;
409411
case "ref.func":
410-
assert_true(typeof actual[i] === "function", `expected Wasm function, got ${actual[i]}`);
412+
assert_true(typeof actual[i] === "function", `expected Wasm function, got ${actual_i}`);
411413
return;
412414
case "ref.extern":
413-
assert_true(actual[i] !== null, `expected Wasm reference, got ${actual[i]}`);
415+
assert_true(actual[i] !== null, `expected Wasm reference, got ${actual_i}`);
414416
return;
415417
case "ref.null":
416-
assert_true(actual[i] === null, `expected Wasm null reference, got ${actual[i]}`);
418+
assert_true(actual[i] === null, `expected Wasm null reference, got ${actual_i}`);
417419
return;
418420
default:
419421
assert_equals(actual[i], expected[i]);

0 commit comments

Comments
 (0)