private DFloat32Array createArrayFromObject(mdr.DObject array, int byteoffset = 0, int bytelength = 0)
        {
            var buffer = array as DArrayBuffer;

            if (buffer != null)
            {
                bytelength = (bytelength > 0) ? bytelength : buffer.ByteLength - byteoffset;
                checkOffsetCompatibility(byteoffset, bytelength);
                return(new DFloat32Array(TargetPrototype, buffer, byteoffset, bytelength, TypeSize));
            }

            var darray = array as DTypedArray;

            if (darray != null)
            {
                bytelength = (bytelength > 0) ? bytelength : darray.ByteLength / darray.TypeSize * TypeSize;
                checkOffsetCompatibility(byteoffset, bytelength);
                DFloat32Array tarray = new DFloat32Array(TargetPrototype, bytelength, TypeSize);
                fillArray(tarray, darray);
                return(tarray);
            }

            Trace.Fail("invalid Arguments");
            return(null);
        }
Exemple #2
0
        private DFloat32Array createArrayFromObject(mdr.DObject array, int byteoffset = 0, int bytelength = 0)
        {
            var buffer = array as DArrayBuffer;
            if (buffer != null)
            {
                bytelength = (bytelength > 0) ? bytelength : buffer.ByteLength - byteoffset;
                checkOffsetCompatibility(byteoffset, bytelength);
                return new DFloat32Array(TargetPrototype, buffer, byteoffset, bytelength, TypeSize);
            }

            var darray = array as DTypedArray;
            if (darray != null)
            {
                bytelength = (bytelength > 0) ? bytelength : darray.ByteLength / darray.TypeSize * TypeSize;
                checkOffsetCompatibility(byteoffset, bytelength);
                DFloat32Array tarray = new DFloat32Array(TargetPrototype, bytelength, TypeSize);
                fillArray(tarray, darray);
                return tarray;
            }

            Trace.Fail("invalid Arguments");
            return null;
        }
Exemple #3
0
        public JSFloat32Array()
            : base(new mdr.DObject(), "Float32Array", TypeSize)
        {
            JittedCode = (ref mdr.CallFrame callFrame) =>
            {
                DFloat32Array float32array = new DFloat32Array(TargetPrototype, 0, TypeSize);
                var argsCount = callFrame.PassedArgsCount;

                if (argsCount == 1)
                {
                    switch (callFrame.Arg0.ValueType)
                    {
                        case mdr.ValueTypes.Int32:
                            float32array = new DFloat32Array(TargetPrototype, callFrame.Arg0.AsInt32() * TypeSize, TypeSize);
                            break;

                        case mdr.ValueTypes.Object:
                            float32array = createArrayFromObject(callFrame.Arg0.AsDObject());
                            break;

                        case mdr.ValueTypes.Array:
                            mdr.DArray array = callFrame.Arg0.AsDArray();
                            float32array = new DFloat32Array(TargetPrototype, array.Length * TypeSize, TypeSize);
                            fillArray(float32array, array);
                            break;

                        default:
                            Trace.Fail("invalid Arguments");
                            break;
                    }
                }
                if (argsCount == 2)
                {
                    int byteoffset = callFrame.Arg1.AsInt32();
                    float32array = createArrayFromObject(callFrame.Arg0.AsDObject(), byteoffset);
                }
                if (argsCount == 3)
                {
                    var byteoffset = callFrame.Arg1.AsInt32();
                    var length = callFrame.Arg2.AsInt32();
                    checkOffsetMemBoundary(byteoffset);
                    float32array = createArrayFromObject(callFrame.Arg0.AsDObject(), byteoffset, length * TypeSize);
                }

                if (IsConstrutor)
                    callFrame.This = (float32array);
                else
                    callFrame.Return.Set(float32array);
            };

            TargetPrototype.DefineOwnProperty("subarray", new mdr.DFunction((ref mdr.CallFrame callFrame) =>
            {
                DFloat32Array array = (callFrame.This as DFloat32Array);
                var argsCount = callFrame.PassedArgsCount;
                var begin = (argsCount >= 1) ? callFrame.Arg0.AsInt32() : 0;
                var end = array.ByteLength / array.TypeSize;
                end = (argsCount >= 2) ? callFrame.Arg1.AsInt32() : end;
                begin = begin < 0 ? begin += array.ByteLength / array.TypeSize : begin;
                end = end < 0 ? end += array.ByteLength / array.TypeSize : end;
                var bytelength = Math.Max(0, (end - begin)) * array.TypeSize;
                end = Math.Max(array.ByteLength, bytelength);
                var float32array = new DFloat32Array(TargetPrototype, bytelength, array.TypeSize);
                int offset = (begin <= 0) ? 0 : begin * array.TypeSize;
                for (int i = 0; i < float32array.ByteLength; ++i)
                    float32array.Elements_[i] = array.Elements_[i + offset];
                callFrame.Return.Set(float32array);
            }), mdr.PropertyDescriptor.Attributes.NotEnumerable | mdr.PropertyDescriptor.Attributes.Data);
        }
        public JSFloat32Array()
            : base(new mdr.DObject(), "Float32Array", TypeSize)
        {
            JittedCode = (ref mdr.CallFrame callFrame) =>
            {
                DFloat32Array float32array = new DFloat32Array(TargetPrototype, 0, TypeSize);
                var           argsCount    = callFrame.PassedArgsCount;

                if (argsCount == 1)
                {
                    switch (callFrame.Arg0.ValueType)
                    {
                    case mdr.ValueTypes.Int32:
                        float32array = new DFloat32Array(TargetPrototype, callFrame.Arg0.AsInt32() * TypeSize, TypeSize);
                        break;

                    case mdr.ValueTypes.Object:
                        float32array = createArrayFromObject(callFrame.Arg0.AsDObject());
                        break;

                    case mdr.ValueTypes.Array:
                        mdr.DArray array = callFrame.Arg0.AsDArray();
                        float32array = new DFloat32Array(TargetPrototype, array.Length * TypeSize, TypeSize);
                        fillArray(float32array, array);
                        break;

                    default:
                        Trace.Fail("invalid Arguments");
                        break;
                    }
                }
                if (argsCount == 2)
                {
                    int byteoffset = callFrame.Arg1.AsInt32();
                    float32array = createArrayFromObject(callFrame.Arg0.AsDObject(), byteoffset);
                }
                if (argsCount == 3)
                {
                    var byteoffset = callFrame.Arg1.AsInt32();
                    var length     = callFrame.Arg2.AsInt32();
                    checkOffsetMemBoundary(byteoffset);
                    float32array = createArrayFromObject(callFrame.Arg0.AsDObject(), byteoffset, length * TypeSize);
                }

                if (IsConstrutor)
                {
                    callFrame.This = (float32array);
                }
                else
                {
                    callFrame.Return.Set(float32array);
                }
            };

            TargetPrototype.DefineOwnProperty("subarray", new mdr.DFunction((ref mdr.CallFrame callFrame) =>
            {
                DFloat32Array array = (callFrame.This as DFloat32Array);
                var argsCount       = callFrame.PassedArgsCount;
                var begin           = (argsCount >= 1) ? callFrame.Arg0.AsInt32() : 0;
                var end             = array.ByteLength / array.TypeSize;
                end              = (argsCount >= 2) ? callFrame.Arg1.AsInt32() : end;
                begin            = begin < 0 ? begin += array.ByteLength / array.TypeSize : begin;
                end              = end < 0 ? end += array.ByteLength / array.TypeSize : end;
                var bytelength   = Math.Max(0, (end - begin)) * array.TypeSize;
                end              = Math.Max(array.ByteLength, bytelength);
                var float32array = new DFloat32Array(TargetPrototype, bytelength, array.TypeSize);
                int offset       = (begin <= 0) ? 0 : begin * array.TypeSize;
                for (int i = 0; i < float32array.ByteLength; ++i)
                {
                    float32array.Elements_[i] = array.Elements_[i + offset];
                }
                callFrame.Return.Set(float32array);
            }), mdr.PropertyDescriptor.Attributes.NotEnumerable | mdr.PropertyDescriptor.Attributes.Data);
        }