123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- "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
- };
|