Spaces:
Paused
Paused
| ; | |
| // Returns "Type(value) is Object" in ES terminology. | |
| function isObject(value) { | |
| return (typeof value === "object" && value !== null) || typeof value === "function"; | |
| } | |
| const hasOwn = Function.prototype.call.bind(Object.prototype.hasOwnProperty); | |
| // Like `Object.assign`, but using `[[GetOwnProperty]]` and `[[DefineOwnProperty]]` | |
| // instead of `[[Get]]` and `[[Set]]` and only allowing objects | |
| function define(target, source) { | |
| for (const key of Reflect.ownKeys(source)) { | |
| const descriptor = Reflect.getOwnPropertyDescriptor(source, key); | |
| if (descriptor && !Reflect.defineProperty(target, key, descriptor)) { | |
| throw new TypeError(`Cannot redefine property: ${String(key)}`); | |
| } | |
| } | |
| } | |
| function newObjectInRealm(globalObject, object) { | |
| const ctorRegistry = initCtorRegistry(globalObject); | |
| return Object.defineProperties( | |
| Object.create(ctorRegistry["%Object.prototype%"]), | |
| Object.getOwnPropertyDescriptors(object) | |
| ); | |
| } | |
| const wrapperSymbol = Symbol("wrapper"); | |
| const implSymbol = Symbol("impl"); | |
| const sameObjectCaches = Symbol("SameObject caches"); | |
| const ctorRegistrySymbol = Symbol.for("[webidl2js] constructor registry"); | |
| const AsyncIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf(async function* () {}).prototype); | |
| function initCtorRegistry(globalObject) { | |
| if (hasOwn(globalObject, ctorRegistrySymbol)) { | |
| return globalObject[ctorRegistrySymbol]; | |
| } | |
| const ctorRegistry = Object.create(null); | |
| // In addition to registering all the WebIDL2JS-generated types in the constructor registry, | |
| // we also register a few intrinsics that we make use of in generated code, since they are not | |
| // easy to grab from the globalObject variable. | |
| ctorRegistry["%Object.prototype%"] = globalObject.Object.prototype; | |
| ctorRegistry["%IteratorPrototype%"] = Object.getPrototypeOf( | |
| Object.getPrototypeOf(new globalObject.Array()[Symbol.iterator]()) | |
| ); | |
| try { | |
| ctorRegistry["%AsyncIteratorPrototype%"] = Object.getPrototypeOf( | |
| Object.getPrototypeOf( | |
| globalObject.eval("(async function* () {})").prototype | |
| ) | |
| ); | |
| } catch { | |
| ctorRegistry["%AsyncIteratorPrototype%"] = AsyncIteratorPrototype; | |
| } | |
| globalObject[ctorRegistrySymbol] = ctorRegistry; | |
| return ctorRegistry; | |
| } | |
| function getSameObject(wrapper, prop, creator) { | |
| if (!wrapper[sameObjectCaches]) { | |
| wrapper[sameObjectCaches] = Object.create(null); | |
| } | |
| if (prop in wrapper[sameObjectCaches]) { | |
| return wrapper[sameObjectCaches][prop]; | |
| } | |
| wrapper[sameObjectCaches][prop] = creator(); | |
| return wrapper[sameObjectCaches][prop]; | |
| } | |
| function wrapperForImpl(impl) { | |
| return impl ? impl[wrapperSymbol] : null; | |
| } | |
| function implForWrapper(wrapper) { | |
| return wrapper ? wrapper[implSymbol] : null; | |
| } | |
| function tryWrapperForImpl(impl) { | |
| const wrapper = wrapperForImpl(impl); | |
| return wrapper ? wrapper : impl; | |
| } | |
| function tryImplForWrapper(wrapper) { | |
| const impl = implForWrapper(wrapper); | |
| return impl ? impl : wrapper; | |
| } | |
| const iterInternalSymbol = Symbol("internal"); | |
| function isArrayIndexPropName(P) { | |
| if (typeof P !== "string") { | |
| return false; | |
| } | |
| const i = P >>> 0; | |
| if (i === 2 ** 32 - 1) { | |
| return false; | |
| } | |
| const s = `${i}`; | |
| if (P !== s) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| const byteLengthGetter = | |
| Object.getOwnPropertyDescriptor(ArrayBuffer.prototype, "byteLength").get; | |
| function isArrayBuffer(value) { | |
| try { | |
| byteLengthGetter.call(value); | |
| return true; | |
| } catch (e) { | |
| return false; | |
| } | |
| } | |
| function iteratorResult([key, value], kind) { | |
| let result; | |
| switch (kind) { | |
| case "key": | |
| result = key; | |
| break; | |
| case "value": | |
| result = value; | |
| break; | |
| case "key+value": | |
| result = [key, value]; | |
| break; | |
| } | |
| return { value: result, done: false }; | |
| } | |
| const supportsPropertyIndex = Symbol("supports property index"); | |
| const supportedPropertyIndices = Symbol("supported property indices"); | |
| const supportsPropertyName = Symbol("supports property name"); | |
| const supportedPropertyNames = Symbol("supported property names"); | |
| const indexedGet = Symbol("indexed property get"); | |
| const indexedSetNew = Symbol("indexed property set new"); | |
| const indexedSetExisting = Symbol("indexed property set existing"); | |
| const namedGet = Symbol("named property get"); | |
| const namedSetNew = Symbol("named property set new"); | |
| const namedSetExisting = Symbol("named property set existing"); | |
| const namedDelete = Symbol("named property delete"); | |
| const asyncIteratorNext = Symbol("async iterator get the next iteration result"); | |
| const asyncIteratorReturn = Symbol("async iterator return steps"); | |
| const asyncIteratorInit = Symbol("async iterator initialization steps"); | |
| const asyncIteratorEOI = Symbol("async iterator end of iteration"); | |
| module.exports = exports = { | |
| isObject, | |
| hasOwn, | |
| define, | |
| newObjectInRealm, | |
| wrapperSymbol, | |
| implSymbol, | |
| getSameObject, | |
| ctorRegistrySymbol, | |
| initCtorRegistry, | |
| wrapperForImpl, | |
| implForWrapper, | |
| tryWrapperForImpl, | |
| tryImplForWrapper, | |
| iterInternalSymbol, | |
| isArrayBuffer, | |
| isArrayIndexPropName, | |
| supportsPropertyIndex, | |
| supportedPropertyIndices, | |
| supportsPropertyName, | |
| supportedPropertyNames, | |
| indexedGet, | |
| indexedSetNew, | |
| indexedSetExisting, | |
| namedGet, | |
| namedSetNew, | |
| namedSetExisting, | |
| namedDelete, | |
| asyncIteratorNext, | |
| asyncIteratorReturn, | |
| asyncIteratorInit, | |
| asyncIteratorEOI, | |
| iteratorResult | |
| }; | |