"use strict"; // 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 };