You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
3.7 KiB
141 lines
3.7 KiB
"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); |
|
|
|
const wrapperSymbol = Symbol("wrapper"); |
|
const implSymbol = Symbol("impl"); |
|
const sameObjectCaches = Symbol("SameObject caches"); |
|
const ctorRegistrySymbol = Symbol.for("[webidl2js] constructor registry"); |
|
|
|
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"); |
|
const IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); |
|
const AsyncIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf(async function* () {}).prototype); |
|
|
|
function isArrayIndexPropName(P) { |
|
if (typeof P !== "string") { |
|
return false; |
|
} |
|
const i = P >>> 0; |
|
if (i === Math.pow(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, |
|
wrapperSymbol, |
|
implSymbol, |
|
getSameObject, |
|
ctorRegistrySymbol, |
|
wrapperForImpl, |
|
implForWrapper, |
|
tryWrapperForImpl, |
|
tryImplForWrapper, |
|
iterInternalSymbol, |
|
IteratorPrototype, |
|
AsyncIteratorPrototype, |
|
isArrayBuffer, |
|
isArrayIndexPropName, |
|
supportsPropertyIndex, |
|
supportedPropertyIndices, |
|
supportsPropertyName, |
|
supportedPropertyNames, |
|
indexedGet, |
|
indexedSetNew, |
|
indexedSetExisting, |
|
namedGet, |
|
namedSetNew, |
|
namedSetExisting, |
|
namedDelete, |
|
asyncIteratorNext, |
|
asyncIteratorReturn, |
|
asyncIteratorInit, |
|
asyncIteratorEOI, |
|
iteratorResult |
|
};
|
|
|