UNPKG

8.96 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../../src/values/ArrayValue.js"],"names":["ArrayValue","ObjectValue","constructor","realm","intrinsicName","intrinsics","ArrayPrototype","getKind","isSimpleObject","$TypedArrayName","undefined","$DefineOwnProperty","P","Desc","A","$Realm","StringValue","value","Properties","ArraySetLength","oldLenDesc","OrdinaryGetOwnProperty","ThrowIfMightHaveBeenDeleted","oldLen","Value","throwIfNotConcrete","NumberValue","index","To","ToUint32","writable","succeeded","OrdinaryDefineOwnProperty","createTemporalWithWidenedNumericProperty","args","operationDescriptor","reactArrayHint","generator","deriveConcreteObject","isPure","unknownProperty","key","descriptor","AbstractValue","createFromType","object","react","enabled","arrayHints","set","isIntrinsicAndHasWidenedNumericProperty","obj","prop","desc","kind"],"mappings":"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","sourcesContent":["/**\n * Copyright (c) 2017-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\n/* @flow strict-local */\n\nimport type { Realm } from \"../realm.js\";\nimport type { PropertyKeyValue, Descriptor, ObjectKind } from \"../types.js\";\nimport { AbstractValue, ObjectValue, StringValue, NumberValue, Value } from \"./index.js\";\nimport { IsAccessorDescriptor, IsPropertyKey, IsArrayIndex } from \"../methods/is.js\";\nimport { Properties, To } from \"../singletons.js\";\nimport { type OperationDescriptor } from \"../utils/generator.js\";\nimport invariant from \"../invariant.js\";\n\nexport default class ArrayValue extends ObjectValue {\n constructor(realm: Realm, intrinsicName?: string) {\n super(realm, realm.intrinsics.ArrayPrototype, intrinsicName);\n }\n\n getKind(): ObjectKind {\n return \"Array\";\n }\n\n isSimpleObject(): boolean {\n return this.$TypedArrayName === undefined;\n }\n\n // ECMA262 9.4.2.1\n $DefineOwnProperty(P: PropertyKeyValue, Desc: Descriptor): boolean {\n let A = this;\n\n // 1. Assert: IsPropertyKey(P) is true.\n invariant(IsPropertyKey(this.$Realm, P), \"expected a property key\");\n\n // 2. If P is \"length\", then\n if (P === \"length\" || (P instanceof StringValue && P.value === \"length\")) {\n // a. Return ? ArraySetLength(A, Desc).\n return Properties.ArraySetLength(this.$Realm, A, Desc);\n } else if (IsArrayIndex(this.$Realm, P)) {\n // 3. Else if P is an array index, then\n\n // a. Let oldLenDesc be OrdinaryGetOwnProperty(A, \"length\").\n let oldLenDesc = Properties.OrdinaryGetOwnProperty(this.$Realm, A, \"length\");\n\n // b. Assert: oldLenDesc will never be undefined or an accessor descriptor because Array objects are\n // created with a length data property that cannot be deleted or reconfigured.\n invariant(\n oldLenDesc !== undefined && !IsAccessorDescriptor(this.$Realm, oldLenDesc),\n \"cannot be undefined or an accessor descriptor\"\n );\n Properties.ThrowIfMightHaveBeenDeleted(oldLenDesc.value);\n\n // c. Let oldLen be oldLenDesc.[[Value]].\n let oldLen = oldLenDesc.value;\n invariant(oldLen instanceof Value);\n oldLen = oldLen.throwIfNotConcrete();\n invariant(oldLen instanceof NumberValue, \"expected number value\");\n oldLen = oldLen.value;\n\n // d. Let index be ! ToUint32(P).\n let index = To.ToUint32(this.$Realm, typeof P === \"string\" ? new StringValue(this.$Realm, P) : P);\n\n // e. If index ≥ oldLen and oldLenDesc.[[Writable]] is false, return false.\n if (index >= oldLen && oldLenDesc.writable === false) return false;\n\n // f. Let succeeded be ! OrdinaryDefineOwnProperty(A, P, Desc).\n let succeeded = Properties.OrdinaryDefineOwnProperty(this.$Realm, A, P, Desc);\n\n // g. If succeeded is false, return false.\n if (succeeded === false) return false;\n\n // h. If index ≥ oldLen, then\n if (index >= oldLen) {\n // i. Set oldLenDesc.[[Value]] to index + 1.\n oldLenDesc.value = new NumberValue(this.$Realm, index + 1);\n\n // ii. Let succeeded be OrdinaryDefineOwnProperty(A, \"length\", oldLenDesc).\n succeeded = Properties.OrdinaryDefineOwnProperty(this.$Realm, A, \"length\", oldLenDesc);\n\n // iii. Assert: succeeded is true.\n invariant(succeeded, \"expected length definition to succeed\");\n }\n\n // i. Return true.\n return true;\n }\n\n // 1. Return OrdinaryDefineOwnProperty(A, P, Desc).\n return Properties.OrdinaryDefineOwnProperty(this.$Realm, A, P, Desc);\n }\n\n static createTemporalWithWidenedNumericProperty(\n realm: Realm,\n args: Array<Value>,\n operationDescriptor: OperationDescriptor,\n reactArrayHint?: { func: Value, thisVal: Value }\n ): ArrayValue {\n invariant(realm.generator !== undefined);\n\n let value = realm.generator.deriveConcreteObject(\n intrinsicName => new ArrayValue(realm, intrinsicName),\n args,\n operationDescriptor,\n { isPure: true }\n );\n\n invariant(value instanceof ArrayValue);\n // Add unknownProperty so we manually handle this object property access\n value.unknownProperty = {\n key: undefined,\n descriptor: {\n value: AbstractValue.createFromType(realm, Value, \"widened numeric property\"),\n },\n object: value,\n };\n if (realm.react.enabled && reactArrayHint !== undefined) {\n realm.react.arrayHints.set(value, reactArrayHint);\n }\n return value;\n }\n\n static isIntrinsicAndHasWidenedNumericProperty(obj: Value): boolean {\n if (obj instanceof ArrayValue && obj.intrinsicName) {\n const prop = obj.unknownProperty;\n if (prop !== undefined && prop.descriptor !== undefined) {\n const desc = prop.descriptor;\n\n return desc.value instanceof AbstractValue && desc.value.kind === \"widened numeric property\";\n }\n }\n return false;\n }\n}\n"],"file":"ArrayValue.js"}
\No newline at end of file