Skip to content

Commit 93ea166

Browse files
targosdanielleadams
authored andcommitted
perf_hooks: use spec-compliant structuredClone
Serialize PerformanceMark's `detail` correctly. Fixes: #40840 PR-URL: #40904 Reviewed-By: Benjamin Gruenbaum <[email protected]> Reviewed-By: Colin Ihrig <[email protected]> Reviewed-By: James M Snell <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]> Reviewed-By: Anna Henningsen <[email protected]>
1 parent f0d8743 commit 93ea166

File tree

3 files changed

+6
-18
lines changed

3 files changed

+6
-18
lines changed

lib/internal/perf/usertiming.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ const {
2626
},
2727
} = require('internal/errors');
2828

29-
const { structuredClone, lazyDOMException } = require('internal/util');
29+
const { structuredClone } = require('internal/structured_clone');
30+
const { lazyDOMException } = require('internal/util');
3031

3132
const markTimings = new SafeMap();
3233

lib/internal/util.js

-16
Original file line numberDiff line numberDiff line change
@@ -477,21 +477,6 @@ const lazyDOMException = hideStackFrames((message, name) => {
477477
return new _DOMException(message, name);
478478
});
479479

480-
function structuredClone(value) {
481-
const {
482-
DefaultSerializer,
483-
DefaultDeserializer,
484-
} = require('v8');
485-
const ser = new DefaultSerializer();
486-
ser._getDataCloneError = hideStackFrames((message) =>
487-
lazyDOMException(message, 'DataCloneError'));
488-
ser.writeValue(value);
489-
const serialized = ser.releaseBuffer();
490-
491-
const des = new DefaultDeserializer(serialized);
492-
return des.readValue();
493-
}
494-
495480
module.exports = {
496481
assertCrypto,
497482
cachedResult,
@@ -515,7 +500,6 @@ module.exports = {
515500
promisify,
516501
sleep,
517502
spliceOne,
518-
structuredClone,
519503
toUSVString,
520504
removeColors,
521505

test/parallel/test-perf-hooks-usertiming.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,15 @@ assert.throws(() => mark(Symbol('a')), {
4444
assert.strictEqual(m.entryType, 'mark');
4545
assert.strictEqual(m.detail, null);
4646
});
47-
[1, 'any', {}, []].forEach((detail) => {
47+
[1, 'any', {}, [], /a/].forEach((detail) => {
4848
const m = mark('a', { detail });
4949
assert.strictEqual(m.name, 'a');
5050
assert.strictEqual(m.entryType, 'mark');
5151
// Value of detail is structured cloned.
5252
assert.deepStrictEqual(m.detail, detail);
53+
if (typeof detail === 'object') {
54+
assert.notStrictEqual(m.detail, detail);
55+
}
5356
});
5457

5558
clearMarks();

0 commit comments

Comments
 (0)