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 int SizeOfObject(CUdeviceptr basePtr, IType type) { int rank; if (ClrArrayType.TryGetArrayRank(type, out rank)) { var dims = new long[rank]; Context.CopyToHost(dims, basePtr); IType elementType; ClrArrayType.TryGetArrayElementType(type, out elementType); return(sizeof(long) * rank + dims.Aggregate(SizeOf(elementType), (x, y) => x * (int)y)); } else { return(SizeOf(type)); } }
private static Type ToClr(IType type) { if (type.IsPointerType(PointerKind.Box)) { return(ToClr(((PointerType)type).ElementType)); } else if (type.IsPointerType(PointerKind.Transient)) { return(ToClr(((PointerType)type).ElementType).MakePointerType()); } else if (type.IsPointerType(PointerKind.Reference)) { return(ToClr(((PointerType)type).ElementType).MakeByRefType()); } else if (type.IsRecursiveGenericInstance()) { var genArgs = type.GetRecursiveGenericArguments(); var genDecl = type.GetRecursiveGenericDeclaration(); return(ToClr(genDecl).MakeGenericType(genArgs.Select(ToClr).ToArray())); } else if (ClrArrayType.IsArrayType(type)) { IType elementType; ClrArrayType.TryGetArrayElementType(type, out elementType); int rank; ClrArrayType.TryGetArrayRank(type, out rank); var clrElementType = ToClr(elementType); return(rank == 1 ? clrElementType.MakeArrayType() : clrElementType.MakeArrayType(rank)); } else { var clrType = (ClrTypeDefinition)type; if (type.Parent.IsType) { var parent = ToClr(type.Parent.Type); return(parent.GetNestedType(clrType.Definition.Name, BindingFlags.Public | BindingFlags.NonPublic)); } else { // TODO: handle special types: delegates. return(Type.GetType($"{clrType.Definition.FullName},{clrType.Definition.Module.Assembly.FullName}", true)); } } }
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); } }