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.
115 lines
2.9 KiB
115 lines
2.9 KiB
"use strict"; |
|
|
|
// Returns "Type(value) is Object" in ES terminology. |
|
function isObject(value) { |
|
return typeof value === "object" && value !== null || typeof value === "function"; |
|
} |
|
|
|
function hasOwn(obj, prop) { |
|
return Object.prototype.hasOwnProperty.call(obj, prop); |
|
} |
|
|
|
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]())); |
|
|
|
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; |
|
} |
|
} |
|
|
|
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"); |
|
|
|
module.exports = exports = { |
|
isObject, |
|
hasOwn, |
|
wrapperSymbol, |
|
implSymbol, |
|
getSameObject, |
|
ctorRegistrySymbol, |
|
wrapperForImpl, |
|
implForWrapper, |
|
tryWrapperForImpl, |
|
tryImplForWrapper, |
|
iterInternalSymbol, |
|
IteratorPrototype, |
|
isArrayBuffer, |
|
isArrayIndexPropName, |
|
supportsPropertyIndex, |
|
supportedPropertyIndices, |
|
supportsPropertyName, |
|
supportedPropertyNames, |
|
indexedGet, |
|
indexedSetNew, |
|
indexedSetExisting, |
|
namedGet, |
|
namedSetNew, |
|
namedSetExisting, |
|
namedDelete |
|
};
|
|
|