Ejemplo n.º 1
0
 public override bool TryUpdatePrimitive(BoxPointer pointer, object obj, IType type)
 {
     if (obj is sbyte || obj is byte ||
         obj is short || obj is ushort || obj is char ||
         obj is int || obj is uint ||
         obj is long || obj is ulong ||
         obj is float || obj is double ||
         obj is IntPtr || obj is UIntPtr)
     {
         // These objects are immutable. They never need to be updated.
         return(true);
     }
     else if (obj is Array)
     {
         IType elementType;
         ClrArrayType.TryGetArrayElementType(type, out elementType);
         var array = (Array)obj;
         DecodeArrayContents(
             pointer,
             elementType,
             Enumerable.Range(0, array.Rank).Select(array.GetLongLength).ToArray(),
             array);
         return(true);
     }
     else
     {
         // TODO: handle delegates, etc.
         return(false);
     }
 }
Ejemplo n.º 2
0
        private void DecodeArrayContents(
            BoxPointer basePointer,
            IType elementType,
            long[] dims,
            Array array)
        {
            var elementSize = SizeOf(elementType);
            var rank        = dims.Length;

            basePointer = IndexPointer(basePointer, rank * 8);

            var  index = new long[rank];
            bool done  = false;

            while (true)
            {
                for (int i = rank - 1; i >= 0; i--)
                {
                    if (index[i] >= dims[i])
                    {
                        if (i == 0)
                        {
                            done = true;
                        }
                        else
                        {
                            index[i] = 0;
                            index[i - 1]++;
                        }
                    }
                }
                if (done)
                {
                    break;
                }

                array.SetValue(DecodeFieldlike(elementType, basePointer), index);
                index[rank - 1]++;
                basePointer = IndexPointer(basePointer, elementSize);
            }
        }
Ejemplo n.º 3
0
        public override BoxPointer LoadBoxPointer(BoxPointer pointer)
        {
            var basePtr = (CUdeviceptr)(SizeT)Marshal.ReadIntPtr(pointer.ToIntPtr(this));

            return(DownloadBox(basePtr));
        }
Ejemplo n.º 4
0
 public override BoxPointer IndexPointer(BoxPointer pointer, int offset)
 {
     return(new BoxPointer(pointer.BasePointer, pointer.Offset + offset));
 }
Ejemplo n.º 5
0
        public override bool TryDecodePrimitive(BoxPointer pointer, IType type, out object obj)
        {
            if (pointer.BasePointer == 0)
            {
                obj = null;
                return(true);
            }
            else if (type == TypeSystem.Int8)
            {
                obj = (sbyte)Marshal.ReadByte(pointer.ToIntPtr(this));
                return(true);
            }
            else if (type == TypeSystem.UInt8)
            {
                obj = Marshal.ReadByte(pointer.ToIntPtr(this));
                return(true);
            }
            else if (type == TypeSystem.Int16)
            {
                obj = Marshal.ReadInt16(pointer.ToIntPtr(this));
                return(true);
            }
            else if (type == TypeSystem.UInt16)
            {
                obj = (ushort)Marshal.ReadInt16(pointer.ToIntPtr(this));
                return(true);
            }
            else if (type == TypeSystem.Char)
            {
                obj = (char)Marshal.ReadInt16(pointer.ToIntPtr(this));
                return(true);
            }
            else if (type == TypeSystem.Int32)
            {
                obj = Marshal.ReadInt32(pointer.ToIntPtr(this));
                return(true);
            }
            else if (type == TypeSystem.UInt32)
            {
                obj = (uint)Marshal.ReadInt32(pointer.ToIntPtr(this));
                return(true);
            }
            else if (type == TypeSystem.Int64)
            {
                obj = Marshal.ReadInt64(pointer.ToIntPtr(this));
                return(true);
            }
            else if (type == TypeSystem.UInt64)
            {
                obj = (ulong)Marshal.ReadInt64(pointer.ToIntPtr(this));
                return(true);
            }
            else if (type == TypeSystem.NaturalInt)
            {
                obj = Marshal.ReadIntPtr(pointer.ToIntPtr(this));
                return(true);
            }
            else if (type == TypeSystem.NaturalUInt ||
                     type == TypeSystem.Float32 ||
                     type == TypeSystem.Float64)
            {
                throw new System.NotImplementedException();
            }
            else if (ClrArrayType.IsArrayType(type))
            {
                int rank;
                ClrArrayType.TryGetArrayRank(type, out rank);
                IType elementType;
                ClrArrayType.TryGetArrayElementType(type, out elementType);

                // Decode array dimensions.
                var ptr  = pointer.ToIntPtr(this);
                var dims = new long[rank];
                for (int i = 0; i < rank; i++)
                {
                    dims[i] = Marshal.ReadInt64(ptr);
                    ptr    += sizeof(long);
                }

                // Create a host array.
                var arr = Array.CreateInstance(ToClr(type), dims);
                obj = arr;
                RegisterDecoded(pointer, arr);

                // Decode array contents.
                DecodeArrayContents(pointer, elementType, dims, arr);
                return(true);
            }
            else
            {
                // TODO: handle delegates.
                obj = null;
                return(false);
            }
        }
Ejemplo n.º 6
0
 public override IType TypeOf(BoxPointer pointer)
 {
     return(pointer.TypeOf(this));
 }