MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at master 90 lines 2.5 kB view raw
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));