Beispiel #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);
     }
 }
Beispiel #2
0
        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));
            }
        }
Beispiel #3
0
 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));
         }
     }
 }
Beispiel #4
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);
            }
        }