MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1function snapshotAssignmentAlias() {
2 const f = fetch;
3 const obj = {};
4
5 obj.a = f;
6 obj.b = f;
7
8 return {
9 fetchType: typeof fetch,
10 fetchName: fetch.name,
11 sameStoredValue: obj.a === obj.b,
12 sameAsFetchA: obj.a === fetch,
13 sameAsFetchB: obj.b === fetch,
14 storedNames: {
15 a: obj.a && obj.a.name,
16 b: obj.b && obj.b.name,
17 },
18 };
19}
20
21function snapshotPromotedState() {
22 const sym = Symbol('native-fn-repro');
23 const originalProto = Object.getPrototypeOf(fetch);
24 const customProto = { fromCustomProto: 42 };
25
26 fetch.extra = 'value-from-set';
27 Object.defineProperty(fetch, 'defined', {
28 value: 'value-from-defineProperty',
29 enumerable: true,
30 configurable: true,
31 writable: true,
32 });
33 Object.defineProperty(fetch, sym, {
34 value: 'symbol-value',
35 enumerable: true,
36 configurable: true,
37 writable: true,
38 });
39 Object.setPrototypeOf(fetch, customProto);
40
41 const names = Object.getOwnPropertyNames(fetch);
42 const symbols = Object.getOwnPropertySymbols(fetch);
43 const descExtra = Object.getOwnPropertyDescriptor(fetch, 'extra');
44 const descDefined = Object.getOwnPropertyDescriptor(fetch, 'defined');
45 const descSym = Object.getOwnPropertyDescriptor(fetch, sym);
46
47 const snapshot = {
48 extraRead: fetch.extra,
49 definedRead: fetch.defined,
50 protoWasUpdated: Object.getPrototypeOf(fetch) === customProto,
51 inheritedRead: fetch.fromCustomProto,
52 ownNames: names,
53 ownSymbols: symbols.map((entry) => String(entry)),
54 hasExtraName: names.includes('extra'),
55 hasDefinedName: names.includes('defined'),
56 hasSymbol: symbols.includes(sym),
57 extraDescriptor: descExtra && {
58 value: descExtra.value,
59 enumerable: descExtra.enumerable,
60 configurable: descExtra.configurable,
61 writable: descExtra.writable,
62 },
63 definedDescriptor: descDefined && {
64 value: descDefined.value,
65 enumerable: descDefined.enumerable,
66 configurable: descDefined.configurable,
67 writable: descDefined.writable,
68 },
69 symbolDescriptor: descSym && {
70 value: descSym.value,
71 enumerable: descSym.enumerable,
72 configurable: descSym.configurable,
73 writable: descSym.writable,
74 },
75 };
76
77 delete fetch.extra;
78 delete fetch.defined;
79 delete fetch[sym];
80 Object.setPrototypeOf(fetch, originalProto);
81
82 return snapshot;
83}
84
85const result = {
86 assignmentAlias: snapshotAssignmentAlias(),
87 promotedState: snapshotPromotedState(),
88};
89
90console.log(JSON.stringify(result, null, 2));