Inheritance: IPythonBufferable
示例#1
0
        public static CTypes.CData /*!*/ CheckCDataType(object o, object type)
        {
            CTypes.CData res = o as CTypes.CData;
            if (res == null && PythonOps.TryGetBoundAttr(o, "_as_parameter_", out object asParam))
            {
                res = asParam as CTypes.CData;
            }

            bool valid = true;

            // if we have an array, we can also send a pointer as long as the element types
            // for the pointer and array are the same
            if (res != null && res.NativeType is CTypes.ArrayType at)
            {
                valid = ((type is CTypes.ArrayType t) && (t.ElementType == at.ElementType)) ||
                        ((type is CTypes.PointerType p) && (p._type == at.ElementType));
            }

            if (res == null || !valid)
            {
                throw ArgumentError(type, ((PythonType)type).Name, o);
            }

            return(res);
        }
示例#2
0
 public static object CreateCData(IntPtr dataAddress, PythonType type)
 {
     CTypes.INativeType nativeType = (CTypes.INativeType)type;
     CTypes.CData       data       = (CTypes.CData)type.CreateInstance(type.Context.SharedContext);
     data._memHolder = new MemoryHolder(nativeType.Size);
     data._memHolder.CopyFrom(dataAddress, new IntPtr(nativeType.Size));
     return(data);
 }
示例#3
0
        public static object CreateNativeWrapper(PythonType type, object holder)
        {
            Debug.Assert(holder is MemoryHolder);

            CTypes.CData data = (CTypes.CData)type.CreateInstance(type.Context.SharedContext);
            data._memHolder = (MemoryHolder)holder;
            return(data);
        }
示例#4
0
        public static CTypes.CData /*!*/ CheckCDataType(object o, object type)
        {
            CTypes.CData res = o as CTypes.CData;
            object       asParam;

            if (res == null && PythonOps.TryGetBoundAttr(o, "_as_parameter_", out asParam))
            {
                res = asParam as CTypes.CData;
            }

            if (res == null || res.NativeType != type)
            {
                throw ArgumentError(type, ((PythonType)type).Name, o);
            }

            return(res);
        }
示例#5
0
        public static CTypes.CData TryCheckCDataPointerType(object o, object type)
        {
            CTypes.CData res = o as CTypes.CData;
            object       asParam;

            if (res == null && PythonOps.TryGetBoundAttr(o, "_as_parameter_", out asParam))
            {
                res = asParam as CTypes.CData;
            }
            if (res != null && res.NativeType != ((CTypes.PointerType)type)._type)
            {
                if (!(res is CTypes.Pointer))
                {
                    throw ArgumentError(type, ((PythonType)((CTypes.PointerType)type)._type).Name, o);
                }
                return(null);
            }

            return(res);
        }