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); } }
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); } }
public override BoxPointer LoadBoxPointer(BoxPointer pointer) { var basePtr = (CUdeviceptr)(SizeT)Marshal.ReadIntPtr(pointer.ToIntPtr(this)); return(DownloadBox(basePtr)); }
public override BoxPointer IndexPointer(BoxPointer pointer, int offset) { return(new BoxPointer(pointer.BasePointer, pointer.Offset + offset)); }
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); } }
public override IType TypeOf(BoxPointer pointer) { return(pointer.TypeOf(this)); }