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); }
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); }
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); }
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); }
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); }