示例#1
0
        private ScriptValue IntegerIndexedElementGet(double index)
        {
            //https://tc39.github.io/ecma262/#sec-integerindexedelementget
            var buffer = ViewedArrayBuffer;

            if (ArrayBufferIntrinsics.IsDetachedBuffer(buffer))
            {
                throw Agent.CreateTypeError();
            }

            if (!Agent.IsInteger(index))
            {
                return(ScriptValue.Undefined);
            }

            if (index == 0 && index.IsNegative())
            {
                return(ScriptValue.Undefined);
            }

            var length = ArrayLength;

            if (index < 0 || index >= length)
            {
                return(ScriptValue.Undefined);
            }

            var indexedPosition = (long)index * Description.Size + ByteOffset;

            return(ArrayBufferIntrinsics.GetValueFromBuffer(Agent, buffer, indexedPosition, Description, true, OrderType.Unordered, Agent.LittleEndian));
        }
示例#2
0
        private bool IntegerIndexedElementSet(double index, ScriptValue value)
        {
            //https://tc39.github.io/ecma262/#sec-integerindexedelementset
            var numberValue = Agent.ToNumber(value);
            var buffer      = ViewedArrayBuffer;

            if (ArrayBufferIntrinsics.IsDetachedBuffer(buffer))
            {
                throw Agent.CreateTypeError();
            }

            if (!Agent.IsInteger(index))
            {
                return(false);
            }

            if (index == 0 && index.IsNegative())
            {
                return(false);
            }

            var length = ArrayLength;

            if (index < 0 || index >= length)
            {
                return(false);
            }

            var indexedPosition = (long)index * Description.Size + ByteOffset;

            ArrayBufferIntrinsics.SetValueInBuffer(Agent, buffer, indexedPosition, Description, numberValue, true, OrderType.Unordered, Agent.LittleEndian);
            return(true);
        }
示例#3
0
        /// <inheritdoc />
        public override bool HasProperty(ScriptValue property)
        {
            //https://tc39.github.io/ecma262/#sec-integer-indexed-exotic-objects-hasproperty-p
            Debug.Assert(Agent.IsPropertyKey(property));
            if (property.IsString)
            {
                var numericIndex = Agent.CanonicalNumericIndexString((string)property);
                if (numericIndex.HasValue)
                {
                    var buffer = ViewedArrayBuffer;
                    if (ArrayBufferIntrinsics.IsDetachedBuffer(buffer))
                    {
                        throw Agent.CreateTypeError();
                    }

                    if (!Agent.IsInteger(numericIndex.Value))
                    {
                        return(false);
                    }

                    if (numericIndex.Value.IsNegative())
                    {
                        return(false);
                    }

                    if (numericIndex.Value >= ArrayLength)
                    {
                        return(false);
                    }

                    return(true);
                }
            }

            return(base.HasProperty(property));
        }