From 2f3ad496807a0c9ab9b5573ee8b930648e24b975 Mon Sep 17 00:00:00 2001 From: Pavel Koneski Date: Sat, 22 Feb 2025 19:30:27 -0800 Subject: [PATCH 1/2] Implement C `long` as 64-bit on POSIX --- src/core/IronPython.Modules/ModuleOps.cs | 4 +- .../IronPython.Modules/_ctypes/SimpleType.cs | 39 +- .../IronPython.Modules/_ctypes/_ctypes.cs | 2 +- src/core/IronPython.Modules/_struct.cs | 81 +++- src/core/IronPython.Modules/array.cs | 84 ++-- src/core/IronPython/Runtime/MemoryView.cs | 2 +- src/core/IronPython/Runtime/TypecodeOps.cs | 36 +- tests/ctypes_test/Makefile | 2 +- tests/ctypes_test/_ctypes_test.c | 391 ++++++++---------- tests/suite/_ctypes_test_darwin_arm64.pyd | Bin 59888 -> 59152 bytes tests/suite/_ctypes_test_darwin_x86_64.pyd | Bin 26488 -> 25752 bytes tests/suite/_ctypes_test_linux_aarch64.pyd | Bin 95408 -> 94000 bytes tests/suite/_ctypes_test_linux_i686.pyd | Bin 38452 -> 43292 bytes tests/suite/_ctypes_test_linux_x86_64.pyd | Bin 56552 -> 47992 bytes .../suite/modules/io_related/test__bytesio.py | 40 +- .../suite/modules/io_related/test__fileio.py | 50 ++- .../modules/type_related/test__struct.py | 33 +- .../suite/modules/type_related/test_array.py | 34 +- .../suite/modules/type_related/test_ctypes.py | 32 +- tests/suite/test_memoryview.py | 8 +- tests/suite/test_regressions.py | 22 +- tests/suite/test_struct.py | 18 + 22 files changed, 510 insertions(+), 368 deletions(-) mode change 100644 => 100755 tests/suite/_ctypes_test_linux_i686.pyd mode change 100644 => 100755 tests/suite/_ctypes_test_linux_x86_64.pyd diff --git a/src/core/IronPython.Modules/ModuleOps.cs b/src/core/IronPython.Modules/ModuleOps.cs index 9e3336a4d..2d7d678f2 100644 --- a/src/core/IronPython.Modules/ModuleOps.cs +++ b/src/core/IronPython.Modules/ModuleOps.cs @@ -376,7 +376,7 @@ public static uint GetUnsignedInt(object value, object type) { public static long GetSignedLong(object value, object type) { if (TryToIntStrict(value, out BigInteger bi)) { - return unchecked((long)(ulong)(bi & uint.MaxValue)); + return unchecked((long)(ulong)(bi & (TypecodeOps.IsCLong32Bit ? uint.MaxValue : ulong.MaxValue))); } if (PythonOps.TryGetBoundAttr(value, "_as_parameter_", out object asParam)) { @@ -388,7 +388,7 @@ public static long GetSignedLong(object value, object type) { public static ulong GetUnsignedLong(object value, object type) { if (TryToIntStrict(value, out BigInteger bi)) { - return (ulong)(bi & uint.MaxValue); + return (ulong)(bi & (TypecodeOps.IsCLong32Bit ? uint.MaxValue : ulong.MaxValue)); } if (PythonOps.TryGetBoundAttr(value, "_as_parameter_", out object asParam)) { diff --git a/src/core/IronPython.Modules/_ctypes/SimpleType.cs b/src/core/IronPython.Modules/_ctypes/SimpleType.cs index 03504a09d..14475cc33 100644 --- a/src/core/IronPython.Modules/_ctypes/SimpleType.cs +++ b/src/core/IronPython.Modules/_ctypes/SimpleType.cs @@ -182,10 +182,11 @@ int INativeType.Size { return 2; case SimpleTypeKind.SignedInt: case SimpleTypeKind.UnsignedInt: - case SimpleTypeKind.SignedLong: - case SimpleTypeKind.UnsignedLong: case SimpleTypeKind.Single: return 4; + case SimpleTypeKind.SignedLong: + case SimpleTypeKind.UnsignedLong: + return TypecodeOps.IsCLong32Bit ? 4 : 8; case SimpleTypeKind.UnsignedLongLong: case SimpleTypeKind.SignedLongLong: case SimpleTypeKind.Double: @@ -220,8 +221,8 @@ object INativeType.GetValue(MemoryHolder/*!*/ owner, object readingFrom, int off case SimpleTypeKind.UnsignedShort: res = GetIntReturn((ushort)owner.ReadInt16(offset, _swap)); break; case SimpleTypeKind.SignedInt: res = GetIntReturn(owner.ReadInt32(offset, _swap)); break; case SimpleTypeKind.UnsignedInt: res = GetIntReturn((uint)owner.ReadInt32(offset, _swap)); break; - case SimpleTypeKind.SignedLong: res = GetIntReturn(owner.ReadInt32(offset, _swap)); break; - case SimpleTypeKind.UnsignedLong: res = GetIntReturn((uint)owner.ReadInt32(offset, _swap)); break; + case SimpleTypeKind.SignedLong: if (TypecodeOps.IsCLong32Bit) goto case SimpleTypeKind.SignedInt; else goto case SimpleTypeKind.SignedLongLong; + case SimpleTypeKind.UnsignedLong: if (TypecodeOps.IsCLong32Bit) goto case SimpleTypeKind.UnsignedInt; else goto case SimpleTypeKind.UnsignedLongLong; case SimpleTypeKind.SignedLongLong: res = GetIntReturn(owner.ReadInt64(offset, _swap)); break; case SimpleTypeKind.UnsignedLongLong: res = GetIntReturn((ulong)owner.ReadInt64(offset, _swap)); break; case SimpleTypeKind.Single: res = GetSingleReturn(owner.ReadInt32(offset, _swap)); break; @@ -259,8 +260,20 @@ object INativeType.SetValue(MemoryHolder/*!*/ owner, int offset, object value) { case SimpleTypeKind.UnsignedShort: owner.WriteInt16(offset, unchecked((short)ModuleOps.GetUnsignedShort(value, this)), _swap); break; case SimpleTypeKind.SignedInt: owner.WriteInt32(offset, ModuleOps.GetSignedInt(value, this), _swap); break; case SimpleTypeKind.UnsignedInt: owner.WriteInt32(offset, unchecked((int)ModuleOps.GetUnsignedInt(value, this)), _swap); break; - case SimpleTypeKind.SignedLong: owner.WriteInt32(offset, unchecked((int)ModuleOps.GetSignedLong(value, this)), _swap); break; - case SimpleTypeKind.UnsignedLong: owner.WriteInt32(offset, unchecked((int)ModuleOps.GetUnsignedLong(value, this)), _swap); break; + case SimpleTypeKind.SignedLong: + if (TypecodeOps.IsCLong32Bit) { + owner.WriteInt32(offset, unchecked((int)ModuleOps.GetSignedLong(value, this)), _swap); + } else { + owner.WriteInt64(offset, ModuleOps.GetSignedLong(value, this), _swap); + } + break; + case SimpleTypeKind.UnsignedLong: + if (TypecodeOps.IsCLong32Bit) { + owner.WriteInt32(offset, unchecked((int)ModuleOps.GetUnsignedLong(value, this)), _swap); + } else { + owner.WriteInt64(offset, unchecked((long)ModuleOps.GetUnsignedLong(value, this)), _swap); + } + break; case SimpleTypeKind.UnsignedLongLong: owner.WriteInt64(offset, unchecked((long)ModuleOps.GetUnsignedLongLong(value, this)), _swap); break; case SimpleTypeKind.SignedLongLong: owner.WriteInt64(offset, ModuleOps.GetSignedLongLong(value, this), _swap); break; case SimpleTypeKind.Single: owner.WriteInt32(offset, ModuleOps.GetSingleBits(value), _swap); break; @@ -301,11 +314,13 @@ object INativeType.SetValue(MemoryHolder/*!*/ owner, int offset, object value) { case SimpleTypeKind.UnsignedShort: return typeof(ushort); case SimpleTypeKind.SignedInt: - case SimpleTypeKind.SignedLong: return typeof(int); case SimpleTypeKind.UnsignedInt: - case SimpleTypeKind.UnsignedLong: return typeof(uint); + case SimpleTypeKind.SignedLong: + return TypecodeOps.IsCLong32Bit ? typeof(int) : typeof(long); + case SimpleTypeKind.UnsignedLong: + return TypecodeOps.IsCLong32Bit ? typeof(uint) : typeof(ulong); case SimpleTypeKind.SignedLongLong: return typeof(long); case SimpleTypeKind.UnsignedLongLong: @@ -589,8 +604,9 @@ private Type GetPythonTypeWorker() { case SimpleTypeKind.SignedShort: case SimpleTypeKind.UnsignedShort: case SimpleTypeKind.SignedInt: - case SimpleTypeKind.SignedLong: return typeof(int); + case SimpleTypeKind.SignedLong: + return TypecodeOps.IsCLong32Bit ? typeof(int) : typeof(object); case SimpleTypeKind.UnsignedInt: case SimpleTypeKind.UnsignedLong: case SimpleTypeKind.UnsignedLongLong: @@ -618,7 +634,6 @@ void INativeType.EmitReverseMarshalling(ILGenerator method, LocalOrArg value, Li break; case SimpleTypeKind.Boolean: case SimpleTypeKind.SignedInt: - case SimpleTypeKind.SignedLong: break; case SimpleTypeKind.Single: method.Emit(OpCodes.Conv_R8); @@ -630,6 +645,10 @@ void INativeType.EmitReverseMarshalling(ILGenerator method, LocalOrArg value, Li case SimpleTypeKind.UnsignedLongLong: EmitUIntToObject(method, value); break; + case SimpleTypeKind.SignedLong: + if (TypecodeOps.IsCLong32Bit) break; // no conversion needed + EmitInt64ToObject(method, value); + break; case SimpleTypeKind.SignedLongLong: EmitInt64ToObject(method, value); break; diff --git a/src/core/IronPython.Modules/_ctypes/_ctypes.cs b/src/core/IronPython.Modules/_ctypes/_ctypes.cs index 01de2d51a..acdd300c6 100644 --- a/src/core/IronPython.Modules/_ctypes/_ctypes.cs +++ b/src/core/IronPython.Modules/_ctypes/_ctypes.cs @@ -465,7 +465,7 @@ public static int set_last_error(int errorCode) { } public static int @sizeof(PythonType/*!*/ type) { - if (!(type is INativeType simpleType)) { + if (type is not INativeType simpleType) { throw PythonOps.TypeError("this type has no size"); } diff --git a/src/core/IronPython.Modules/_struct.cs b/src/core/IronPython.Modules/_struct.cs index 9758b8640..cdebb289c 100644 --- a/src/core/IronPython.Modules/_struct.cs +++ b/src/core/IronPython.Modules/_struct.cs @@ -142,12 +142,25 @@ public void __init__(CodeContext/*!*/ context, object fmt) { break; case FormatType.UnsignedInt: for (int j = 0; j < curFormat.Count; j++) { - WriteUInt(res, _isLittleEndian, GetULongValue(context, curObj++, values)); + WriteUInt(res, _isLittleEndian, GetUIntValue(context, curObj++, values)); + } + break; + case FormatType.Long: + for (int j = 0; j < curFormat.Count; j++) { + if (_isStandardized || TypecodeOps.IsCLong32Bit) { + WriteInt(res, _isLittleEndian, GetIntValue(context, curObj++, values)); + } else { + WriteLong(res, _isLittleEndian, GetLongValue(context, curObj++, values)); + } } break; case FormatType.UnsignedLong: for (int j = 0; j < curFormat.Count; j++) { - WriteUInt(res, _isLittleEndian, GetULongValue(context, curObj++, values)); + if (_isStandardized || TypecodeOps.IsCLong32Bit) { + WriteUInt(res, _isLittleEndian, GetUIntValue(context, curObj++, values)); + } else { + WriteULong(res, _isLittleEndian, GetULongValue(context, curObj++, values)); + } } break; case FormatType.LongLong: @@ -310,11 +323,28 @@ public void pack_into(CodeContext/*!*/ context, [NotNone] IBufferProtocol/*!*/ b } break; case FormatType.UnsignedInt: - case FormatType.UnsignedLong: for (int j = 0; j < curFormat.Count; j++) { res[res_idx++] = BigIntegerOps.__int__(CreateUIntValue(context, ref curIndex, _isLittleEndian, data)); } break; + case FormatType.Long: + for (int j = 0; j < curFormat.Count; j++) { + if (_isStandardized || TypecodeOps.IsCLong32Bit) { + res[res_idx++] = CreateIntValue(context, ref curIndex, _isLittleEndian, data); + } else { + res[res_idx++] = BigIntegerOps.__int__(CreateLongValue(context, ref curIndex, _isLittleEndian, data)); + } + } + break; + case FormatType.UnsignedLong: + for (int j = 0; j < curFormat.Count; j++) { + if (_isStandardized || TypecodeOps.IsCLong32Bit) { + res[res_idx++] = BigIntegerOps.__int__(CreateUIntValue(context, ref curIndex, _isLittleEndian, data)); + } else { + res[res_idx++] = BigIntegerOps.__int__(CreateULongValue(context, ref curIndex, _isLittleEndian, data)); + } + } + break; case FormatType.LongLong: for (int j = 0; j < curFormat.Count; j++) { res[res_idx++] = BigIntegerOps.__int__(CreateLongValue(context, ref curIndex, _isLittleEndian, data)); @@ -472,7 +502,6 @@ private static Struct CompileAndCache(CodeContext/*!*/ context, string/*!*/ fmt) count = 1; break; case 'i': // int - case 'l': // long res.Add(new Format(FormatType.Int, count)); count = 1; break; @@ -480,6 +509,10 @@ private static Struct CompileAndCache(CodeContext/*!*/ context, string/*!*/ fmt) res.Add(new Format(FormatType.UnsignedInt, count)); count = 1; break; + case 'l': // long + res.Add(new Format(FormatType.Long, count)); + count = 1; + break; case 'L': // unsigned long res.Add(new Format(FormatType.UnsignedLong, count)); count = 1; @@ -624,7 +657,7 @@ private void InitCountAndSize() { encodingSize = Align(encodingSize, format.NativeSize); } - encodingSize += GetNativeSize(format.Type) * format.Count; + encodingSize += GetNativeSize(format.Type, _isStandardized) * format.Count; } _encodingCount = encodingCount; _encodingSize = encodingSize; @@ -729,6 +762,7 @@ private enum FormatType { Int, UnsignedInt, + Long, UnsignedLong, Float, @@ -747,7 +781,7 @@ private enum FormatType { SizeT, } - private static int GetNativeSize(FormatType c) { + private static int GetNativeSize(FormatType c, bool isStandardized) { switch (c) { case FormatType.Char: case FormatType.SignedChar: @@ -765,11 +799,13 @@ private static int GetNativeSize(FormatType c) { return 2; case FormatType.Int: case FormatType.UnsignedInt: - case FormatType.UnsignedLong: case FormatType.Float: case FormatType.SignedSizeT: case FormatType.SizeT: return 4; + case FormatType.Long: + case FormatType.UnsignedLong: + return isStandardized || TypecodeOps.IsCLong32Bit ? 4 : 8; case FormatType.LongLong: case FormatType.UnsignedLongLong: case FormatType.Double: @@ -786,16 +822,11 @@ private static int GetNativeSize(FormatType c) { /// /// Struct used to store the format and the number of times it should be repeated. /// - private readonly struct Format { - public readonly FormatType Type; - public readonly int Count; - - public Format(FormatType type, int count) { - Type = type; - Count = count; - } + private readonly struct Format(FormatType type, int count) { + public readonly FormatType Type = type; + public readonly int Count = count; - public int NativeSize => GetNativeSize(Type); + public int NativeSize => GetNativeSize(Type, isStandardized: false); } #endregion @@ -1106,19 +1137,33 @@ internal static int GetIntValue(CodeContext/*!*/ context, int index, object[] ar return res; } - internal static uint GetULongValue(CodeContext/*!*/ context, int index, object[] args) { + internal static uint GetUIntValue(CodeContext/*!*/ context, int index, object[] args) { BigInteger val = GetIntegerValue(context, index, args); if (!val.AsUInt32(out uint res)) throw Error(context, "argument out of range"); return res; } + internal static long GetLongValue(CodeContext/*!*/ context, int index, object[] args) { + BigInteger val = GetIntegerValue(context, index, args); + if (!val.AsInt64(out long res)) + throw Error(context, "argument out of range"); + return res; + } + + internal static ulong GetULongValue(CodeContext/*!*/ context, int index, object[] args) { + BigInteger val = GetIntegerValue(context, index, args); + if (!val.AsUInt64(out ulong res)) + throw Error(context, "argument out of range"); + return res; + } + internal static int GetSignedSizeT(CodeContext/*!*/ context, int index, object[] args) { return GetIntValue(context, index, args); } internal static uint GetSizeT(CodeContext/*!*/ context, int index, object[] args) { - return GetULongValue(context, index, args); + return GetUIntValue(context, index, args); } internal static ulong GetPointer(CodeContext/*!*/ context, int index, object[] args) { diff --git a/src/core/IronPython.Modules/array.cs b/src/core/IronPython.Modules/array.cs index 32a29b1f0..ed2919433 100644 --- a/src/core/IronPython.Modules/array.cs +++ b/src/core/IronPython.Modules/array.cs @@ -43,6 +43,10 @@ private static array ArrayReconstructor(CodeContext context, [NotNone] PythonTyp throw PythonOps.ValueError("bad typecode (must be b, B, u, h, H, i, I, l, L, q, Q, f or d)"); var actualTypeCode = MachineFormatToTypeCode(mformat_code, out bool isBigEndian, out string? encoding); + if (TypeCodeToMachineFormat(typecode[0]) == mformat_code) { + // if typecodes are equivelent, use original + actualTypeCode = typecode; + } var arrayType = DynamicHelpers.GetPythonTypeFromType(typeof(array)); @@ -106,6 +110,26 @@ static string MachineFormatToTypeCode(int machineFormat, out bool isBigEndian, o } } + private static int TypeCodeToMachineFormat(char typeCode) { + return typeCode switch + { + 'b' => 1, + 'B' => 0, + 'u' => 18, + 'h' => 4, + 'H' => 2, + 'i' => 8, + 'I' => 6, + 'l' => TypecodeOps.IsCLong32Bit ? 8 : 12, + 'L' => TypecodeOps.IsCLong32Bit ? 6 : 10, + 'q' => 12, + 'Q' => 10, + 'f' => 14, + 'd' => 16, + _ => throw new InvalidOperationException(),// should never happen + }; + } + public static readonly BuiltinFunction _array_reconstructor = BuiltinFunction.MakeFunction(nameof(_array_reconstructor), ArrayUtils.ConvertAll(typeof(ArrayModule).GetMember(nameof(ArrayReconstructor), BindingFlags.NonPublic | BindingFlags.Static), x => (MethodBase)x), typeof(ArrayModule)); [PythonType] @@ -166,8 +190,8 @@ private static ArrayData CreateData(char typecode) { 'H' => new ArrayData(), 'i' => new ArrayData(), 'I' => new ArrayData(), - 'l' => new ArrayData(), - 'L' => new ArrayData(), + 'l' => TypecodeOps.IsCLong32Bit ? new ArrayData() : new ArrayData(), + 'L' => TypecodeOps.IsCLong32Bit ? new ArrayData() : new ArrayData(), 'q' => new ArrayData(), 'Q' => new ArrayData(), 'f' => new ArrayData(), @@ -420,8 +444,8 @@ public virtual object this[int index] { case 'H': return (int)((ArrayData)_data)[index]; case 'i': return ((ArrayData)_data)[index]; case 'I': return (BigInteger)((ArrayData)_data)[index]; - case 'l': return ((ArrayData)_data)[index]; - case 'L': return (BigInteger)((ArrayData)_data)[index]; + case 'l': if (TypecodeOps.IsCLong32Bit) goto case 'i'; else goto case 'q'; + case 'L': if (TypecodeOps.IsCLong32Bit) goto case 'I'; else goto case 'Q'; case 'q': return (BigInteger)((ArrayData)_data)[index]; case 'Q': return (BigInteger)((ArrayData)_data)[index]; case 'f': return (double)((ArrayData)_data)[index]; @@ -447,8 +471,8 @@ internal byte[] RawGetItem(int index) { case 'H': bw.Write(((ArrayData)_data)[index]); break; case 'i': bw.Write(((ArrayData)_data)[index]); break; case 'I': bw.Write(((ArrayData)_data)[index]); break; - case 'l': bw.Write(((ArrayData)_data)[index]); break; - case 'L': bw.Write(((ArrayData)_data)[index]); break; + case 'l': if (TypecodeOps.IsCLong32Bit) goto case 'i'; else goto case 'q'; + case 'L': if (TypecodeOps.IsCLong32Bit) goto case 'I'; else goto case 'Q'; case 'q': bw.Write(((ArrayData)_data)[index]); break; case 'Q': bw.Write(((ArrayData)_data)[index]); break; case 'f': bw.Write(((ArrayData)_data)[index]); break; @@ -552,26 +576,6 @@ public PythonTuple __reduce_ex__(CodeContext context, int version) { tobytes() ), dict); - - static int TypeCodeToMachineFormat(char typeCode) { - return typeCode switch - { - 'b' => 1, - 'B' => 0, - 'u' => 18, - 'h' => 4, - 'H' => 2, - 'i' => 8, - 'I' => 6, - 'l' => 8, - 'L' => 6, - 'q' => 12, - 'Q' => 10, - 'f' => 14, - 'd' => 16, - _ => throw new InvalidOperationException(),// should never happen - }; - } } private void SliceAssign(int index, object? value) { @@ -630,8 +634,8 @@ internal void ToStream(Stream ms) { case 'H': bw.Write(((ArrayData)_data)[i]); break; case 'i': bw.Write(((ArrayData)_data)[i]); break; case 'I': bw.Write(((ArrayData)_data)[i]); break; - case 'l': bw.Write(((ArrayData)_data)[i]); break; - case 'L': bw.Write(((ArrayData)_data)[i]); break; + case 'l': if (TypecodeOps.IsCLong32Bit) goto case 'i'; else goto case 'q'; + case 'L': if (TypecodeOps.IsCLong32Bit) goto case 'I'; else goto case 'Q'; case 'q': bw.Write(((ArrayData)_data)[i]); break; case 'Q': bw.Write(((ArrayData)_data)[i]); break; case 'f': bw.Write(((ArrayData)_data)[i]); break; @@ -679,8 +683,8 @@ internal void FromStream(Stream ms) { case 'H': ((ArrayData)_data).Add(br.ReadUInt16()); break; case 'i': ((ArrayData)_data).Add(br.ReadInt32()); break; case 'I': ((ArrayData)_data).Add(br.ReadUInt32()); break; - case 'l': ((ArrayData)_data).Add(br.ReadInt32()); break; - case 'L': ((ArrayData)_data).Add(br.ReadUInt32()); break; + case 'l': if (TypecodeOps.IsCLong32Bit) goto case 'i'; else goto case 'q'; + case 'L': if (TypecodeOps.IsCLong32Bit) goto case 'I'; else goto case 'Q'; case 'q': ((ArrayData)_data).Add(br.ReadInt64()); break; case 'Q': ((ArrayData)_data).Add(br.ReadUInt64()); break; case 'f': ((ArrayData)_data).Add(br.ReadSingle()); break; @@ -703,8 +707,8 @@ internal void FromStream(Stream ms, int index) { case 'H': ((ArrayData)_data)[i] = br.ReadUInt16(); break; case 'i': ((ArrayData)_data)[i] = br.ReadInt32(); break; case 'I': ((ArrayData)_data)[i] = br.ReadUInt32(); break; - case 'l': ((ArrayData)_data)[i] = br.ReadInt32(); break; - case 'L': ((ArrayData)_data)[i] = br.ReadUInt32(); break; + case 'l': if (TypecodeOps.IsCLong32Bit) goto case 'i'; else goto case 'q'; + case 'L': if (TypecodeOps.IsCLong32Bit) goto case 'I'; else goto case 'Q'; case 'q': ((ArrayData)_data)[i] = br.ReadInt64(); break; case 'Q': ((ArrayData)_data)[i] = br.ReadUInt64(); break; case 'f': ((ArrayData)_data)[i] = br.ReadSingle(); break; @@ -733,8 +737,8 @@ internal long FromStream(Stream ms, int index, int nbytes) { case 'H': ((ArrayData)_data)[i] = br.ReadUInt16(); break; case 'i': ((ArrayData)_data)[i] = br.ReadInt32(); break; case 'I': ((ArrayData)_data)[i] = br.ReadUInt32(); break; - case 'l': ((ArrayData)_data)[i] = br.ReadInt32(); break; - case 'L': ((ArrayData)_data)[i] = br.ReadUInt32(); break; + case 'l': if (TypecodeOps.IsCLong32Bit) goto case 'i'; else goto case 'q'; + case 'L': if (TypecodeOps.IsCLong32Bit) goto case 'I'; else goto case 'Q'; case 'q': ((ArrayData)_data)[i] = br.ReadInt64(); break; case 'Q': ((ArrayData)_data)[i] = br.ReadUInt64(); break; case 'f': ((ArrayData)_data)[i] = br.ReadSingle(); break; @@ -771,8 +775,8 @@ private byte[] ToBytes(int index) { case 'H': return BitConverter.GetBytes(((ArrayData)_data)[index]); case 'i': return BitConverter.GetBytes(((ArrayData)_data)[index]); case 'I': return BitConverter.GetBytes(((ArrayData)_data)[index]); - case 'l': return BitConverter.GetBytes(((ArrayData)_data)[index]); - case 'L': return BitConverter.GetBytes(((ArrayData)_data)[index]); + case 'l': if (TypecodeOps.IsCLong32Bit) goto case 'i'; else goto case 'q'; + case 'L': if (TypecodeOps.IsCLong32Bit) goto case 'I'; else goto case 'Q'; case 'q': return BitConverter.GetBytes(((ArrayData)_data)[index]); case 'Q': return BitConverter.GetBytes(((ArrayData)_data)[index]); case 'f': return BitConverter.GetBytes(((ArrayData)_data)[index]); @@ -790,8 +794,8 @@ private object FromBytes(byte[] bytes) { case 'H': return BitConverter.ToUInt16(bytes, 0); case 'i': return BitConverter.ToInt32(bytes, 0); case 'I': return BitConverter.ToUInt32(bytes, 0); - case 'l': return BitConverter.ToInt32(bytes, 0); - case 'L': return BitConverter.ToInt32(bytes, 0); + case 'l': if (TypecodeOps.IsCLong32Bit) goto case 'i'; else goto case 'q'; + case 'L': if (TypecodeOps.IsCLong32Bit) goto case 'I'; else goto case 'Q'; case 'q': return BitConverter.ToInt64(bytes, 0); case 'Q': return BitConverter.ToInt64(bytes, 0); case 'f': return BitConverter.ToSingle(bytes, 0); @@ -815,8 +819,8 @@ int IStructuralEquatable.GetHashCode(IEqualityComparer comparer) { case 'H': dataTuple = PythonTuple.MakeTuple(((ArrayData)_data).Data); break; case 'i': dataTuple = PythonTuple.MakeTuple(((ArrayData)_data).Data); break; case 'I': dataTuple = PythonTuple.MakeTuple(((ArrayData)_data).Data); break; - case 'l': dataTuple = PythonTuple.MakeTuple(((ArrayData)_data).Data); break; - case 'L': dataTuple = PythonTuple.MakeTuple(((ArrayData)_data).Data); break; + case 'l': if (TypecodeOps.IsCLong32Bit) goto case 'i'; else goto case 'q'; + case 'L': if (TypecodeOps.IsCLong32Bit) goto case 'I'; else goto case 'Q'; case 'q': dataTuple = PythonTuple.MakeTuple(((ArrayData)_data).Data); break; case 'Q': dataTuple = PythonTuple.MakeTuple(((ArrayData)_data).Data); break; case 'f': dataTuple = PythonTuple.MakeTuple(((ArrayData)_data).Data); break; diff --git a/src/core/IronPython/Runtime/MemoryView.cs b/src/core/IronPython/Runtime/MemoryView.cs index 33912144f..a0d78ba49 100644 --- a/src/core/IronPython/Runtime/MemoryView.cs +++ b/src/core/IronPython/Runtime/MemoryView.cs @@ -589,7 +589,7 @@ private void SetItem(int offset, object? value) { throw PythonOps.ValueError("memoryview: invalid value for format '{0}'", _format); } - if (typecode == 'Q') { + if (typecode is 'Q' or 'L' or 'N') { value = Converter.ConvertToUInt64(value); } else { value = Converter.ConvertToInt64(value); diff --git a/src/core/IronPython/Runtime/TypecodeOps.cs b/src/core/IronPython/Runtime/TypecodeOps.cs index 58c5b6afe..cfd9ed3cf 100644 --- a/src/core/IronPython/Runtime/TypecodeOps.cs +++ b/src/core/IronPython/Runtime/TypecodeOps.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the Apache 2.0 License. // See the LICENSE file in the project root for more information. @@ -48,6 +48,9 @@ public static bool IsByteCode(char typecode) public static bool IsFloatCode(char typecode) => typecode == 'f' || typecode == 'd'; + public static bool IsCLong32Bit { get; } + = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) || IntPtr.Size == 4; + public static int GetTypecodeWidth(char typecode) { switch (typecode) { case '?': // bool @@ -61,12 +64,13 @@ public static int GetTypecodeWidth(char typecode) { return 2; case 'i': // signed int case 'I': // unsigned int - case 'l': // signed long - case 'L': // unsigned long case 'f': // float case 'n': // signed index case 'N': // unsigned index return 4; + case 'l': // signed long + case 'L': // unsigned long + return IsCLong32Bit ? 4 : 8; case 'q': // signed long long case 'Q': // unsigned long long case 'd': // double @@ -102,16 +106,20 @@ public static bool TryGetFromBytes(char typecode, ReadOnlySpan bytes, [Not case 'H': result = MemoryMarshal.Read(bytes); return true; - case 'l': case 'i': case 'n': result = MemoryMarshal.Read(bytes); return true; - case 'L': case 'I': case 'N': result = MemoryMarshal.Read(bytes); return true; + case 'l': + if (IsCLong32Bit) goto case 'i'; + else goto case 'q'; + case 'L': + if (IsCLong32Bit) goto case 'I'; + else goto case 'Q'; case 'q': result = MemoryMarshal.Read(bytes); return true; @@ -125,7 +133,7 @@ public static bool TryGetFromBytes(char typecode, ReadOnlySpan bytes, [Not result = MemoryMarshal.Read(bytes); return true; case 'P': - if (UIntPtr.Size == 4) goto case 'L'; + if (UIntPtr.Size == 4) goto case 'I'; else goto case 'Q'; case 'r': result = MemoryMarshal.Read(bytes); @@ -160,16 +168,20 @@ public static bool TryGetBytes(char typecode, object obj, Span dest) { case 'H': var ushortVal = Convert.ToUInt16(obj); return MemoryMarshal.TryWrite(dest, ref ushortVal); - case 'l': case 'i': case 'n': var intVal = Convert.ToInt32(obj); return MemoryMarshal.TryWrite(dest, ref intVal); - case 'L': case 'I': case 'N': var uintVal = Convert.ToUInt32(obj); return MemoryMarshal.TryWrite(dest, ref uintVal); + case 'l': + if (IsCLong32Bit) goto case 'i'; + else goto case 'q'; + case 'L': + if (IsCLong32Bit) goto case 'I'; + else goto case 'Q'; case 'q': var longVal = Convert.ToInt64(obj); return MemoryMarshal.TryWrite(dest, ref longVal); @@ -239,17 +251,21 @@ public static bool CausesOverflow(object value, char typecode) { maxValue = ushort.MaxValue; break; case 'i': // signed int - case 'l': // signed long case 'n': // signed index minValue = int.MinValue; maxValue = int.MaxValue; break; case 'I': // unsigned int - case 'L': // unsigned long case 'N': // unsigned index minValue = uint.MinValue; maxValue = uint.MaxValue; break; + case 'l': // signed long + if (IsCLong32Bit) goto case 'i'; + else goto case 'q'; + case 'L': // unsigned long + if (IsCLong32Bit) goto case 'I'; + goto case 'Q'; case 'q': // signed long long minValue = long.MinValue; maxValue = long.MaxValue; diff --git a/tests/ctypes_test/Makefile b/tests/ctypes_test/Makefile index 535788a05..5724155c3 100644 --- a/tests/ctypes_test/Makefile +++ b/tests/ctypes_test/Makefile @@ -2,7 +2,7 @@ OS := $(shell uname -s | tr '[:upper:]' '[:lower:]') MACHINE ?= $(shell uname -m) BITS ?= 64 CC = gcc -CFLAGS = -fPIC -Wall -Wextra -O2 -g +CFLAGS = -fPIC -Wall -Wextra -Wno-unused-parameter -O2 -g LDFLAGS = -shared RM = rm -f PLATFORM = $(OS)_$(MACHINE) diff --git a/tests/ctypes_test/_ctypes_test.c b/tests/ctypes_test/_ctypes_test.c index 4ab50391e..b68b0d2b9 100644 --- a/tests/ctypes_test/_ctypes_test.c +++ b/tests/ctypes_test/_ctypes_test.c @@ -1,3 +1,14 @@ +#include +#include +#include +#include +#include +#include +#include + +#define HAVE_LONG_LONG +#define PY_LONG_LONG long long + #ifdef MS_WIN32 #include #endif @@ -8,87 +19,47 @@ #define EXPORT(x) x #endif -#include -#include -#include -#include -#include -#include -#include - - /* some functions handy for testing */ -EXPORT(int32_t) - _testfunc_cbk_reg_int(int32_t a, int32_t b, int32_t c, int32_t d, int32_t e, - int32_t(*func)(int32_t, int32_t, int32_t, int32_t, int32_t)) +EXPORT(int) +_testfunc_cbk_reg_int(int a, int b, int c, int d, int e, + int (*func)(int, int, int, int, int)) { return func(a*a, b*b, c*c, d*d, e*e); } EXPORT(double) - _testfunc_cbk_reg_double(double a, double b, double c, double d, double e, - double(*func)(double, double, double, double, double)) +_testfunc_cbk_reg_double(double a, double b, double c, double d, double e, + double (*func)(double, double, double, double, double)) { return func(a*a, b*b, c*c, d*d, e*e); } /* -* This structure should be the same as in test_callbacks.py and the -* method test_callback_large_struct. See issues 17310 and 20160: the -* structure must be larger than 8 bytes int32_t. -*/ + * This structure should be the same as in test_callbacks.py and the + * method test_callback_large_struct. See issues 17310 and 20160: the + * structure must be larger than 8 bytes long. + */ typedef struct { - uint32_t first; - uint32_t second; - uint32_t third; + unsigned long first; + unsigned long second; + unsigned long third; } Test; EXPORT(void) - _testfunc_cbk_large_struct(Test in, void(*func)(Test)) +_testfunc_cbk_large_struct(Test in, void (*func)(Test)) { func(in); } -/* -* See issue 29565. Update a structure passed by value; -* the caller should not see any change. -*/ - -EXPORT(void) - _testfunc_large_struct_update_value(Test in) -{ - ((volatile Test *)&in)->first = 0x0badf00d; - ((volatile Test *)&in)->second = 0x0badf00d; - ((volatile Test *)&in)->third = 0x0badf00d; -} - -typedef struct { - uint32_t first; - uint32_t second; -} TestReg; - - -EXPORT(TestReg) last_tfrsuv_arg = { 0 }; - - -EXPORT(void) - _testfunc_reg_struct_update_value(TestReg in) -{ - last_tfrsuv_arg = in; - ((volatile TestReg *)&in)->first = 0x0badf00d; - ((volatile TestReg *)&in)->second = 0x0badf00d; -} - - -EXPORT(void)testfunc_array(int32_t values[4]) +EXPORT(void)testfunc_array(int values[4]) { printf("testfunc_array %d %d %d %d\n", - values[0], - values[1], - values[2], - values[3]); + values[0], + values[1], + values[2], + values[3]); } EXPORT(long double)testfunc_Ddd(double a, double b) @@ -107,16 +78,16 @@ EXPORT(long double)testfunc_DDD(long double a, long double b) return result; } -EXPORT(int32_t)testfunc_iii(int32_t a, int32_t b) +EXPORT(int)testfunc_iii(int a, int b) { - int32_t result = a * b; + int result = a * b; printf("testfunc_iii(%p, %p)\n", &a, &b); return result; } -EXPORT(int32_t)myprintf(char *fmt, ...) +EXPORT(int)myprintf(char *fmt, ...) { - int32_t result; + int result; va_list argptr; va_start(argptr, fmt); result = vprintf(fmt, argptr); @@ -129,7 +100,7 @@ EXPORT(char *)my_strtok(char *token, const char *delim) return strtok(token, delim); } -EXPORT(char *)my_strchr(const char *s, int32_t c) +EXPORT(char *)my_strchr(const char *s, int c) { return strchr(s, c); } @@ -140,50 +111,50 @@ EXPORT(double) my_sqrt(double a) return sqrt(a); } -EXPORT(void) my_qsort(void *base, size_t num, size_t width, int32_t(*compare)(const void*, const void*)) +EXPORT(void) my_qsort(void *base, size_t num, size_t width, int(*compare)(const void*, const void*)) { qsort(base, num, width, compare); } -EXPORT(int32_t *) _testfunc_ai8(int32_t a[8]) +EXPORT(int *) _testfunc_ai8(int a[8]) { return a; } -EXPORT(void) _testfunc_v(int32_t a, int32_t b, int32_t *presult) +EXPORT(void) _testfunc_v(int a, int b, int *presult) { *presult = a + b; } -EXPORT(int32_t) _testfunc_i_bhilfd(int8_t b, short h, int32_t i, int32_t l, float f, double d) +EXPORT(int) _testfunc_i_bhilfd(signed char b, short h, int i, long l, float f, double d) { - /* printf("_testfunc_i_bhilfd got %d %d %d %ld %f %f\n", - b, h, i, l, f, d); - */ - return (int32_t)(b + h + i + l + f + d); +/* printf("_testfunc_i_bhilfd got %d %d %d %ld %f %f\n", + b, h, i, l, f, d); +*/ + return (int)(b + h + i + l + f + d); } -EXPORT(float) _testfunc_f_bhilfd(int8_t b, short h, int32_t i, int32_t l, float f, double d) +EXPORT(float) _testfunc_f_bhilfd(signed char b, short h, int i, long l, float f, double d) { - /* printf("_testfunc_f_bhilfd got %d %d %d %ld %f %f\n", - b, h, i, l, f, d); - */ +/* printf("_testfunc_f_bhilfd got %d %d %d %ld %f %f\n", + b, h, i, l, f, d); +*/ return (float)(b + h + i + l + f + d); } -EXPORT(double) _testfunc_d_bhilfd(int8_t b, short h, int32_t i, int32_t l, float f, double d) +EXPORT(double) _testfunc_d_bhilfd(signed char b, short h, int i, long l, float f, double d) { - /* printf("_testfunc_d_bhilfd got %d %d %d %ld %f %f\n", - b, h, i, l, f, d); - */ +/* printf("_testfunc_d_bhilfd got %d %d %d %ld %f %f\n", + b, h, i, l, f, d); +*/ return (double)(b + h + i + l + f + d); } -EXPORT(long double) _testfunc_D_bhilfD(int8_t b, short h, int32_t i, int32_t l, float f, long double d) +EXPORT(long double) _testfunc_D_bhilfD(signed char b, short h, int i, long l, float f, long double d) { - /* printf("_testfunc_d_bhilfd got %d %d %d %ld %f %f\n", - b, h, i, l, f, d); - */ +/* printf("_testfunc_d_bhilfd got %d %d %d %ld %f %f\n", + b, h, i, l, f, d); +*/ return (long double)(b + h + i + l + f + d); } @@ -192,9 +163,9 @@ EXPORT(char *) _testfunc_p_p(void *s) return (char *)s; } -EXPORT(void *) _testfunc_c_p_p(int32_t *argcp, char **argv) +EXPORT(void *) _testfunc_c_p_p(int *argcp, char **argv) { - return argv[(*argcp) - 1]; + return argv[(*argcp)-1]; } EXPORT(void *) get_strchr(void) @@ -204,7 +175,7 @@ EXPORT(void *) get_strchr(void) EXPORT(char *) my_strdup(char *src) { - char *dst = (char *)malloc(strlen(src) + 1); + char *dst = (char *)malloc(strlen(src)+1); if (!dst) return NULL; strcpy(dst, src); @@ -216,13 +187,14 @@ EXPORT(void)my_free(void *ptr) free(ptr); } +#ifdef HAVE_WCHAR_H EXPORT(wchar_t *) my_wcsdup(wchar_t *src) { size_t len = wcslen(src); wchar_t *ptr = (wchar_t *)malloc((len + 1) * sizeof(wchar_t)); if (ptr == NULL) return NULL; - memcpy(ptr, src, (len + 1) * sizeof(wchar_t)); + memcpy(ptr, src, (len+1) * sizeof(wchar_t)); return ptr; } @@ -230,6 +202,7 @@ EXPORT(size_t) my_wcslen(wchar_t *src) { return wcslen(src); } +#endif #ifndef MS_WIN32 # ifndef __stdcall @@ -238,51 +211,52 @@ EXPORT(size_t) my_wcslen(wchar_t *src) #endif typedef struct { - int32_t(*c)(int32_t, int32_t); - int32_t(__stdcall *s)(int32_t, int32_t); + int (*c)(int, int); + int (__stdcall *s)(int, int); } FUNCS; -EXPORT(int32_t) _testfunc_callfuncp(FUNCS *fp) +EXPORT(int) _testfunc_callfuncp(FUNCS *fp) { fp->c(1, 2); fp->s(3, 4); return 0; } -EXPORT(int32_t) _testfunc_deref_pointer(int32_t *pi) +EXPORT(int) _testfunc_deref_pointer(int *pi) { return *pi; } #ifdef MS_WIN32 -EXPORT(int32_t) _testfunc_piunk(IUnknown FAR *piunk) +EXPORT(int) _testfunc_piunk(IUnknown FAR *piunk) { piunk->lpVtbl->AddRef(piunk); return piunk->lpVtbl->Release(piunk); } #endif -EXPORT(int32_t) _testfunc_callback_with_pointer(int32_t(*func)(int32_t *)) +EXPORT(int) _testfunc_callback_with_pointer(int (*func)(int *)) { - int32_t table[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; + int table[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; return (*func)(table); } -EXPORT(int64_t) _testfunc_q_bhilfdq(int8_t b, short h, int32_t i, int32_t l, float f, - double d, int64_t q) +#ifdef HAVE_LONG_LONG +EXPORT(PY_LONG_LONG) _testfunc_q_bhilfdq(signed char b, short h, int i, long l, float f, + double d, PY_LONG_LONG q) { - return (int64_t)(b + h + i + l + f + d + q); + return (PY_LONG_LONG)(b + h + i + l + f + d + q); } -EXPORT(int64_t) _testfunc_q_bhilfd(int8_t b, short h, int32_t i, int32_t l, float f, double d) +EXPORT(PY_LONG_LONG) _testfunc_q_bhilfd(signed char b, short h, int i, long l, float f, double d) { - return (int64_t)(b + h + i + l + f + d); + return (PY_LONG_LONG)(b + h + i + l + f + d); } -EXPORT(int32_t) _testfunc_callback_i_if(int32_t value, int32_t(*func)(int32_t)) +EXPORT(int) _testfunc_callback_i_if(int value, int (*func)(int)) { - int32_t sum = 0; + int sum = 0; while (value != 0) { sum += func(value); value /= 2; @@ -290,10 +264,10 @@ EXPORT(int32_t) _testfunc_callback_i_if(int32_t value, int32_t(*func)(int32_t)) return sum; } -EXPORT(int64_t) _testfunc_callback_q_qf(int64_t value, - int64_t(*func)(int64_t)) +EXPORT(PY_LONG_LONG) _testfunc_callback_q_qf(PY_LONG_LONG value, + PY_LONG_LONG (*func)(PY_LONG_LONG)) { - int64_t sum = 0; + PY_LONG_LONG sum = 0; while (value != 0) { sum += func(value); @@ -302,6 +276,8 @@ EXPORT(int64_t) _testfunc_callback_q_qf(int64_t value, return sum; } +#endif + typedef struct { char *name; char *value; @@ -309,31 +285,31 @@ typedef struct { typedef struct { char *name; - int32_t num_spams; + int num_spams; SPAM *spams; } EGG; SPAM my_spams[2] = { { "name1", "value1" }, -{ "name2", "value2" }, + { "name2", "value2" }, }; EGG my_eggs[1] = { { "first egg", 1, my_spams } }; -EXPORT(int32_t) getSPAMANDEGGS(EGG **eggs) +EXPORT(int) getSPAMANDEGGS(EGG **eggs) { *eggs = my_eggs; return 1; } typedef struct tagpoint { - int32_t x; - int32_t y; + int x; + int y; } point; -EXPORT(int32_t) _testfunc_byval(point in, point *pout) +EXPORT(int) _testfunc_byval(point in, point *pout) { if (pout) { pout->x = in.x; @@ -342,27 +318,27 @@ EXPORT(int32_t) _testfunc_byval(point in, point *pout) return in.x + in.y; } -EXPORT(int32_t) an_integer = 42; +EXPORT (int) an_integer = 42; -EXPORT(int32_t) get_an_integer(void) +EXPORT(int) get_an_integer(void) { return an_integer; } EXPORT(double) - integrate(double a, double b, double(*f)(double), int32_t nstep) +integrate(double a, double b, double (*f)(double), long nstep) { - double x, sum = 0.0, dx = (b - a) / (double)nstep; - for (x = a + 0.5*dx; (b - x)*(x - a) > 0.0; x += dx) + double x, sum=0.0, dx=(b-a)/(double)nstep; + for(x=a+0.5*dx; (b-x)*(x-a)>0.0; x+=dx) sum += f(x); - return sum / (double)nstep; + return sum/(double)nstep; } typedef struct { - void(*initialize)(void *(*)(int32_t), void(*)(void *)); + void (*initialize)(void *(*)(int), void(*)(void *)); } xxx_library; -static void _xxx_init(void *(*Xalloc)(int32_t), void(*Xfree)(void *)) +static void _xxx_init(void *(*Xalloc)(int), void (*Xfree)(void *)) { void *ptr; @@ -390,26 +366,26 @@ EXPORT(void) GetString(BSTR *pbstr) } #endif -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-parameter" -EXPORT(void) _py_func_si(char *s, int32_t i) +/* + * Some do-nothing functions, for speed tests + */ +EXPORT(void) _py_func_si(char *s, int i) { } -#pragma GCC diagnostic pop EXPORT(void) _py_func(void) { } -EXPORT(int64_t) last_tf_arg_s = 0; -EXPORT(uint64_t) last_tf_arg_u = 0; +EXPORT(PY_LONG_LONG) last_tf_arg_s; +EXPORT(unsigned PY_LONG_LONG) last_tf_arg_u; struct BITS { - int32_t A : 1, B : 2, C : 3, D : 4, E : 5, F : 6, G : 7, H : 8, I : 9; - short M : 1, N : 2, O : 3, P : 4, Q : 5, R : 6, S : 7; + int A: 1, B:2, C:3, D:4, E: 5, F: 6, G: 7, H: 8, I: 9; + short M: 1, N: 2, O: 3, P: 4, Q: 5, R: 6, S: 7; }; -EXPORT(void) set_bitfields(struct BITS *bits, char name, int32_t value) +EXPORT(void) set_bitfields(struct BITS *bits, char name, int value) { switch (name) { case 'A': bits->A = value; break; @@ -432,7 +408,7 @@ EXPORT(void) set_bitfields(struct BITS *bits, char name, int32_t value) } } -EXPORT(int32_t) unpack_bitfields(struct BITS *bits, char name) +EXPORT(int) unpack_bitfields(struct BITS *bits, char name) { switch (name) { case 'A': return bits->A; @@ -456,73 +432,70 @@ EXPORT(int32_t) unpack_bitfields(struct BITS *bits, char name) return 0; } -#define S last_tf_arg_s = (int64_t)c -#define U last_tf_arg_u = (uint64_t)c +#define S last_tf_arg_s = (PY_LONG_LONG)c +#define U last_tf_arg_u = (unsigned PY_LONG_LONG)c -EXPORT(int8_t) tf_b(int8_t c) { S; return c / 3; } -EXPORT(uint8_t) tf_B(uint8_t c) { U; return c / 3; } -EXPORT(short) tf_h(short c) { S; return c / 3; } -EXPORT(uint16_t) tf_H(uint16_t c) { U; return c / 3; } -EXPORT(int32_t) tf_i(int32_t c) { S; return c / 3; } -EXPORT(uint32_t) tf_I(uint32_t c) { U; return c / 3; } -EXPORT(int32_t) tf_l(int32_t c) { S; return c / 3; } -EXPORT(uint32_t) tf_L(uint32_t c) { U; return c / 3; } -EXPORT(int64_t) tf_q(int64_t c) { S; return c / 3; } -EXPORT(uint64_t) tf_Q(uint64_t c) { U; return c / 3; } -EXPORT(float) tf_f(float c) { S; return c / 3; } -EXPORT(double) tf_d(double c) { S; return c / 3; } -EXPORT(long double) tf_D(long double c) { S; return c / 3; } +EXPORT(signed char) tf_b(signed char c) { S; return c/3; } +EXPORT(unsigned char) tf_B(unsigned char c) { U; return c/3; } +EXPORT(short) tf_h(short c) { S; return c/3; } +EXPORT(unsigned short) tf_H(unsigned short c) { U; return c/3; } +EXPORT(int) tf_i(int c) { S; return c/3; } +EXPORT(unsigned int) tf_I(unsigned int c) { U; return c/3; } +EXPORT(long) tf_l(long c) { S; return c/3; } +EXPORT(unsigned long) tf_L(unsigned long c) { U; return c/3; } +EXPORT(PY_LONG_LONG) tf_q(PY_LONG_LONG c) { S; return c/3; } +EXPORT(unsigned PY_LONG_LONG) tf_Q(unsigned PY_LONG_LONG c) { U; return c/3; } +EXPORT(float) tf_f(float c) { S; return c/3; } +EXPORT(double) tf_d(double c) { S; return c/3; } +EXPORT(long double) tf_D(long double c) { S; return c/3; } #ifdef MS_WIN32 -EXPORT(int8_t) __stdcall s_tf_b(int8_t c) { S; return c / 3; } -EXPORT(uint8_t) __stdcall s_tf_B(uint8_t c) { U; return c / 3; } -EXPORT(short) __stdcall s_tf_h(short c) { S; return c / 3; } -EXPORT(uint16_t) __stdcall s_tf_H(uint16_t c) { U; return c / 3; } -EXPORT(int32_t) __stdcall s_tf_i(int32_t c) { S; return c / 3; } -EXPORT(uint32_t) __stdcall s_tf_I(uint32_t c) { U; return c / 3; } -EXPORT(int32_t) __stdcall s_tf_l(int32_t c) { S; return c / 3; } -EXPORT(uint32_t) __stdcall s_tf_L(uint32_t c) { U; return c / 3; } -EXPORT(int64_t) __stdcall s_tf_q(int64_t c) { S; return c / 3; } -EXPORT(uint64_t) __stdcall s_tf_Q(uint64_t c) { U; return c / 3; } -EXPORT(float) __stdcall s_tf_f(float c) { S; return c / 3; } -EXPORT(double) __stdcall s_tf_d(double c) { S; return c / 3; } -EXPORT(long double) __stdcall s_tf_D(long double c) { S; return c / 3; } +EXPORT(signed char) __stdcall s_tf_b(signed char c) { S; return c/3; } +EXPORT(unsigned char) __stdcall s_tf_B(unsigned char c) { U; return c/3; } +EXPORT(short) __stdcall s_tf_h(short c) { S; return c/3; } +EXPORT(unsigned short) __stdcall s_tf_H(unsigned short c) { U; return c/3; } +EXPORT(int) __stdcall s_tf_i(int c) { S; return c/3; } +EXPORT(unsigned int) __stdcall s_tf_I(unsigned int c) { U; return c/3; } +EXPORT(long) __stdcall s_tf_l(long c) { S; return c/3; } +EXPORT(unsigned long) __stdcall s_tf_L(unsigned long c) { U; return c/3; } +EXPORT(PY_LONG_LONG) __stdcall s_tf_q(PY_LONG_LONG c) { S; return c/3; } +EXPORT(unsigned PY_LONG_LONG) __stdcall s_tf_Q(unsigned PY_LONG_LONG c) { U; return c/3; } +EXPORT(float) __stdcall s_tf_f(float c) { S; return c/3; } +EXPORT(double) __stdcall s_tf_d(double c) { S; return c/3; } +EXPORT(long double) __stdcall s_tf_D(long double c) { S; return c/3; } #endif /*******/ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-parameter" -EXPORT(int8_t) tf_bb(int8_t x, int8_t c) { S; return c / 3; } -EXPORT(uint8_t) tf_bB(int8_t x, uint8_t c) { U; return c / 3; } -EXPORT(short) tf_bh(int8_t x, short c) { S; return c / 3; } -EXPORT(uint16_t) tf_bH(int8_t x, uint16_t c) { U; return c / 3; } -EXPORT(int32_t) tf_bi(int8_t x, int32_t c) { S; return c / 3; } -EXPORT(uint32_t) tf_bI(int8_t x, uint32_t c) { U; return c / 3; } -EXPORT(int32_t) tf_bl(int8_t x, int32_t c) { S; return c / 3; } -EXPORT(uint32_t) tf_bL(int8_t x, uint32_t c) { U; return c / 3; } -EXPORT(int64_t) tf_bq(int8_t x, int64_t c) { S; return c / 3; } -EXPORT(uint64_t) tf_bQ(int8_t x, uint64_t c) { U; return c / 3; } -EXPORT(float) tf_bf(int8_t x, float c) { S; return c / 3; } -EXPORT(double) tf_bd(int8_t x, double c) { S; return c / 3; } -EXPORT(long double) tf_bD(int8_t x, long double c) { S; return c / 3; } -EXPORT(void) tv_i(int32_t c) { S; return; } -#pragma GCC diagnostic pop +EXPORT(signed char) tf_bb(signed char x, signed char c) { S; return c/3; } +EXPORT(unsigned char) tf_bB(signed char x, unsigned char c) { U; return c/3; } +EXPORT(short) tf_bh(signed char x, short c) { S; return c/3; } +EXPORT(unsigned short) tf_bH(signed char x, unsigned short c) { U; return c/3; } +EXPORT(int) tf_bi(signed char x, int c) { S; return c/3; } +EXPORT(unsigned int) tf_bI(signed char x, unsigned int c) { U; return c/3; } +EXPORT(long) tf_bl(signed char x, long c) { S; return c/3; } +EXPORT(unsigned long) tf_bL(signed char x, unsigned long c) { U; return c/3; } +EXPORT(PY_LONG_LONG) tf_bq(signed char x, PY_LONG_LONG c) { S; return c/3; } +EXPORT(unsigned PY_LONG_LONG) tf_bQ(signed char x, unsigned PY_LONG_LONG c) { U; return c/3; } +EXPORT(float) tf_bf(signed char x, float c) { S; return c/3; } +EXPORT(double) tf_bd(signed char x, double c) { S; return c/3; } +EXPORT(long double) tf_bD(signed char x, long double c) { S; return c/3; } +EXPORT(void) tv_i(int c) { S; return; } #ifdef MS_WIN32 -EXPORT(int8_t) __stdcall s_tf_bb(int8_t x, int8_t c) { S; return c / 3; } -EXPORT(uint8_t) __stdcall s_tf_bB(int8_t x, uint8_t c) { U; return c / 3; } -EXPORT(short) __stdcall s_tf_bh(int8_t x, short c) { S; return c / 3; } -EXPORT(uint16_t) __stdcall s_tf_bH(int8_t x, uint16_t c) { U; return c / 3; } -EXPORT(int32_t) __stdcall s_tf_bi(int8_t x, int32_t c) { S; return c / 3; } -EXPORT(uint32_t) __stdcall s_tf_bI(int8_t x, uint32_t c) { U; return c / 3; } -EXPORT(int32_t) __stdcall s_tf_bl(int8_t x, int32_t c) { S; return c / 3; } -EXPORT(uint32_t) __stdcall s_tf_bL(int8_t x, uint32_t c) { U; return c / 3; } -EXPORT(int64_t) __stdcall s_tf_bq(int8_t x, int64_t c) { S; return c / 3; } -EXPORT(uint64_t) __stdcall s_tf_bQ(int8_t x, uint64_t c) { U; return c / 3; } -EXPORT(float) __stdcall s_tf_bf(int8_t x, float c) { S; return c / 3; } -EXPORT(double) __stdcall s_tf_bd(int8_t x, double c) { S; return c / 3; } -EXPORT(long double) __stdcall s_tf_bD(int8_t x, long double c) { S; return c / 3; } -EXPORT(void) __stdcall s_tv_i(int32_t c) { S; return; } +EXPORT(signed char) __stdcall s_tf_bb(signed char x, signed char c) { S; return c/3; } +EXPORT(unsigned char) __stdcall s_tf_bB(signed char x, unsigned char c) { U; return c/3; } +EXPORT(short) __stdcall s_tf_bh(signed char x, short c) { S; return c/3; } +EXPORT(unsigned short) __stdcall s_tf_bH(signed char x, unsigned short c) { U; return c/3; } +EXPORT(int) __stdcall s_tf_bi(signed char x, int c) { S; return c/3; } +EXPORT(unsigned int) __stdcall s_tf_bI(signed char x, unsigned int c) { U; return c/3; } +EXPORT(long) __stdcall s_tf_bl(signed char x, long c) { S; return c/3; } +EXPORT(unsigned long) __stdcall s_tf_bL(signed char x, unsigned long c) { U; return c/3; } +EXPORT(PY_LONG_LONG) __stdcall s_tf_bq(signed char x, PY_LONG_LONG c) { S; return c/3; } +EXPORT(unsigned PY_LONG_LONG) __stdcall s_tf_bQ(signed char x, unsigned PY_LONG_LONG c) { U; return c/3; } +EXPORT(float) __stdcall s_tf_bf(signed char x, float c) { S; return c/3; } +EXPORT(double) __stdcall s_tf_bd(signed char x, double c) { S; return c/3; } +EXPORT(long double) __stdcall s_tf_bD(signed char x, long double c) { S; return c/3; } +EXPORT(void) __stdcall s_tv_i(int c) { S; return; } #endif /********/ @@ -530,20 +503,20 @@ EXPORT(void) __stdcall s_tv_i(int32_t c) { S; return; } #ifndef MS_WIN32 typedef struct { - int32_t x; - int32_t y; + long x; + long y; } POINT; typedef struct { - int32_t left; - int32_t top; - int32_t right; - int32_t bottom; + long left; + long top; + long right; + long bottom; } RECT; #endif -EXPORT(int32_t) PointInRect(RECT *prc, POINT pt) +EXPORT(int) PointInRect(RECT *prc, POINT pt) { if (pt.x < prc->left) return 0; @@ -556,13 +529,13 @@ EXPORT(int32_t) PointInRect(RECT *prc, POINT pt) return 1; } -EXPORT(int32_t left = 10); -EXPORT(int32_t top = 20); -EXPORT(int32_t right = 30); -EXPORT(int32_t bottom = 40); +EXPORT(long left = 10); +EXPORT(long top = 20); +EXPORT(long right = 30); +EXPORT(long bottom = 40); -EXPORT(RECT) ReturnRect(int32_t i, RECT ar, RECT* br, POINT cp, RECT dr, - RECT *er, POINT fp, RECT gr) +EXPORT(RECT) ReturnRect(int i, RECT ar, RECT* br, POINT cp, RECT dr, + RECT *er, POINT fp, RECT gr) { /*Check input */ if (ar.left + br->left + dr.left + er->left + gr.left != left * 5) @@ -583,7 +556,7 @@ EXPORT(RECT) ReturnRect(int32_t i, RECT ar, RECT* br, POINT cp, RECT dr, { ar.left = -200; } - switch (i) + switch(i) { case 0: return ar; @@ -612,7 +585,7 @@ EXPORT(S2H) ret_2h_func(S2H inp) } typedef struct { - int32_t a, b, c, d, e, f, g, h; + int a, b, c, d, e, f, g, h; } S8I; EXPORT(S8I) ret_8i_func(S8I inp) @@ -628,18 +601,18 @@ EXPORT(S8I) ret_8i_func(S8I inp) return inp; } -EXPORT(int32_t) GetRectangle(int32_t flag, RECT *prect) +EXPORT(int) GetRectangle(int flag, RECT *prect) { if (flag == 0) return 0; - prect->left = (int32_t)flag; - prect->top = (int32_t)flag + 1; - prect->right = (int32_t)flag + 2; - prect->bottom = (int32_t)flag + 3; + prect->left = (int)flag; + prect->top = (int)flag + 1; + prect->right = (int)flag + 2; + prect->bottom = (int)flag + 3; return 1; } -EXPORT(void) TwoOutArgs(int32_t a, int32_t *pi, int32_t b, int32_t *pj) +EXPORT(void) TwoOutArgs(int a, int *pi, int b, int *pj) { *pi += a; *pj += b; @@ -655,7 +628,7 @@ EXPORT(S8I) __stdcall s_ret_8i_func(S8I inp) { return ret_8i_func(inp); } #include #include -EXPORT(HRESULT) KeepObject(IUnknown *punk) +EXPORT (HRESULT) KeepObject(IUnknown *punk) { static IUnknown *pobj; if (punk) diff --git a/tests/suite/_ctypes_test_darwin_arm64.pyd b/tests/suite/_ctypes_test_darwin_arm64.pyd index f9be35a8bcea187eeb83aaaf226af2ebce9b5e67..ae5b989b5976549b93c913cd543c35ce9f7b6fce 100755 GIT binary patch literal 59152 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

*o%$C1K9sWgYfSh(c0YJ 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 literal 26488 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 gs@~GZU*77%MWm+TM>TZ-*r9KD$8@BKCLjV8( diff --git a/tests/suite/_ctypes_test_linux_aarch64.pyd b/tests/suite/_ctypes_test_linux_aarch64.pyd index 60134028b6ae98b84ebbfcb98b301a0ae4290087..4899a64f6c107d665f976633fb78bab9f6e32b00 100755 GIT binary patch literal 94000 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 literal 95408 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

#a*}S?thrvxE4P z{w2??7yh66KY}jx9nqKnmuFaC;wR@V?MfVf0$mER=*$1f$3FpxgZiiU5PeB=sPyW~ z^YSg$PkNP+7d=UTYUq!1Pr&aCDa~H>>3)cwAU{KfF!5jh|DR+1un2N$>gRz|OUDd3 z(dVz7PObJz>k#-${0Zg=A@jeCns!au-F@^Q_G!t6$GukfwiSSwX_GXL)9(x5pr70G z9;R&5KKk#_4^!Ys$QNriV(LH2`sR7I@B^oABjBPhY5P9^o718ks{{9?)5)PTy>2a6z kU1XhOwqLjOYgrh$#%!Pd2VP45Z)h889Dimg7)9&<02kVpFaQ7m diff --git a/tests/suite/_ctypes_test_linux_i686.pyd b/tests/suite/_ctypes_test_linux_i686.pyd old mode 100644 new mode 100755 index 4c7b25deee4aaeac2905c47bfc8a2ffed2e8bb60..3e8f5a186a3d4ef4e49c8ad5c113c967ddb8a597 GIT binary patch literal 43292 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 JB!Xrp{}&*QMH~PC literal 38452 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 A4FCWD diff --git a/tests/suite/_ctypes_test_linux_x86_64.pyd b/tests/suite/_ctypes_test_linux_x86_64.pyd old mode 100644 new mode 100755 index cf2ebf7df34ce874e672374197543e93cfa540c0..b7fe4fb93d3eb58ff40fed8f6a23ec0df38c4eee GIT binary patch literal 47992 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 n$6som9(zhd{q{ViXs2~xQE6xS34jOE&wWd diff --git a/tests/suite/modules/io_related/test__bytesio.py b/tests/suite/modules/io_related/test__bytesio.py index db8f9621e..3f3fe5c3b 100644 --- a/tests/suite/modules/io_related/test__bytesio.py +++ b/tests/suite/modules/io_related/test__bytesio.py @@ -11,7 +11,9 @@ from _io import BytesIO -from iptest import big, run_test +from iptest import big, is_32, is_windows, run_test + +is_long32bit = is_32 or is_windows def bytesio_helper(): return (BytesIO(bytearray(b'')), @@ -254,25 +256,41 @@ def test_coverage(self): [[],[],[],[],[],[],[],[],[],[]], [0,0,0,0,0,0,0,0,0,0]], [('l',[-1]), - [[-1],[-159],[-40351],[-10263967],[1684234849],[1684234849],[1684234849],[1684234849],[1684234849],[1684234849]], - [0,1,2,3,4,4,4,4,4,4]], + [[-1],[-159],[-40351],[-10263967],[1684234849],[1684234849],[1684234849],[1684234849],[1684234849],[1684234849]] + if is_long32bit else + [[big(-1)],[big(-159)],[big(-40351)],[big(-10263967)],[big(-2610732447)],[big(-664035696031)],[big(-168889314745759)],[big(-42953085774765471)],[big(7523094288207667809)],[big(7523094288207667809)]], + [0,1,2,3,4,4,4,4,4,4] + if is_long32bit else + [0,1,2,3,4,5,6,7,8,8]], [('l',[1,-99,47]), - [[1,-99,47],[97,-99,47],[25185,-99,47],[6513249,-99,47],[1684234849,-99,47],[1684234849,-155,47],[1684234849,-39323,47],[1684234849,-10000795,47],[1684234849,1751606885,47],[1684234849,1751606885,105]], + [[1,-99,47],[97,-99,47],[25185,-99,47],[6513249,-99,47],[1684234849,-99,47],[1684234849,-155,47],[1684234849,-39323,47],[1684234849,-10000795,47],[1684234849,1751606885,47],[1684234849,1751606885,105]] + if is_long32bit else + [[big(1),big(-99),big(47)],[big(97),big(-99),big(47)],[big(25185),big(-99),big(47)],[big(6513249),big(-99),big(47)],[big(1684234849),big(-99),big(47)],[big(435475931745),big(-99),big(47)],[big(112585661964897),big(-99),big(47)],[big(29104508263162465),big(-99),big(47)],[big(7523094288207667809),big(-99),big(47)],[big(7523094288207667809),big(-151),big(47)]], [0,1,2,3,4,5,6,7,8,9]], [('l',[1,-99,47,48]), - [[1,-99,47,48],[97,-99,47,48],[25185,-99,47,48],[6513249,-99,47,48],[1684234849,-99,47,48],[1684234849,-155,47,48],[1684234849,-39323,47,48],[1684234849,-10000795,47,48],[1684234849,1751606885,47,48],[1684234849,1751606885,105,48]], + [[1,-99,47,48],[97,-99,47,48],[25185,-99,47,48],[6513249,-99,47,48],[1684234849,-99,47,48],[1684234849,-155,47,48],[1684234849,-39323,47,48],[1684234849,-10000795,47,48],[1684234849,1751606885,47,48],[1684234849,1751606885,105,48]] + if is_long32bit else + [[big(1),big(-99),big(47),big(48)],[big(97),big(-99),big(47),big(48)],[big(25185),big(-99),big(47),big(48)],[big(6513249),big(-99),big(47),big(48)],[big(1684234849),big(-99),big(47),big(48)],[big(435475931745),big(-99),big(47),big(48)],[big(112585661964897),big(-99),big(47),big(48)],[big(29104508263162465),big(-99),big(47),big(48)],[big(7523094288207667809),big(-99),big(47),big(48)],[big(7523094288207667809),big(-151),big(47),big(48)]], [0,1,2,3,4,5,6,7,8,9]], [('l',[1,-99,47,48,49]), - [[1,-99,47,48,49],[97,-99,47,48,49],[25185,-99,47,48,49],[6513249,-99,47,48,49],[1684234849,-99,47,48,49],[1684234849,-155,47,48,49],[1684234849,-39323,47,48,49],[1684234849,-10000795,47,48,49],[1684234849,1751606885,47,48,49],[1684234849,1751606885,105,48,49]], + [[1,-99,47,48,49],[97,-99,47,48,49],[25185,-99,47,48,49],[6513249,-99,47,48,49],[1684234849,-99,47,48,49],[1684234849,-155,47,48,49],[1684234849,-39323,47,48,49],[1684234849,-10000795,47,48,49],[1684234849,1751606885,47,48,49],[1684234849,1751606885,105,48,49]] + if is_long32bit else + [[big(1),big(-99),big(47),big(48),big(49)],[big(97),big(-99),big(47),big(48),big(49)],[big(25185),big(-99),big(47),big(48),big(49)],[big(6513249),big(-99),big(47),big(48),big(49)],[big(1684234849),big(-99),big(47),big(48),big(49)],[big(435475931745),big(-99),big(47),big(48),big(49)],[big(112585661964897),big(-99),big(47),big(48),big(49)],[big(29104508263162465),big(-99),big(47),big(48),big(49)],[big(7523094288207667809),big(-99),big(47),big(48),big(49)],[big(7523094288207667809),big(-151),big(47),big(48),big(49)]], [0,1,2,3,4,5,6,7,8,9]], [('L',), [[],[],[],[],[],[],[],[],[],[]], [0,0,0,0,0,0,0,0,0,0]], [('L',[big(100000000)]), - [[big(100000000)],[big(100000097)],[big(99967585)],[big(90399329)],[big(1684234849)],[big(1684234849)],[big(1684234849)],[big(1684234849)],[big(1684234849)],[big(1684234849)]], - [0,1,2,3,4,4,4,4,4,4]], + [[big(100000000)],[big(100000097)],[big(99967585)],[big(90399329)],[big(1684234849)],[big(1684234849)],[big(1684234849)],[big(1684234849)],[big(1684234849)],[big(1684234849)]] + if is_long32bit else + [[big(100000000)],[big(100000097)],[big(99967585)],[big(90399329)],[big(1684234849)],[big(435475931745)],[big(112585661964897)],[big(29104508263162465)],[big(7523094288207667809)],[big(7523094288207667809)]], + [0,1,2,3,4,4,4,4,4,4] + if is_long32bit else + [0,1,2,3,4,5,6,7,8,8]], [('L',[big(1),big(99),big(47)]), - [[big(1),big(99),big(47)],[big(97),big(99),big(47)],[big(25185),big(99),big(47)],[big(6513249),big(99),big(47)],[big(1684234849),big(99),big(47)],[big(1684234849),big(101),big(47)],[big(1684234849),big(26213),big(47)],[big(1684234849),big(6776421),big(47)],[big(1684234849),big(1751606885),big(47)],[big(1684234849),big(1751606885),big(105)]], + [[big(1),big(99),big(47)],[big(97),big(99),big(47)],[big(25185),big(99),big(47)],[big(6513249),big(99),big(47)],[big(1684234849),big(99),big(47)],[big(1684234849),big(101),big(47)],[big(1684234849),big(26213),big(47)],[big(1684234849),big(6776421),big(47)],[big(1684234849),big(1751606885),big(47)],[big(1684234849),big(1751606885),big(105)]] + if is_long32bit else + [[big(1),big(99),big(47)],[big(97),big(99),big(47)],[big(25185),big(99),big(47)],[big(6513249),big(99),big(47)],[big(1684234849),big(99),big(47)],[big(435475931745),big(99),big(47)],[big(112585661964897),big(99),big(47)],[big(29104508263162465),big(99),big(47)],[big(7523094288207667809),big(99),big(47)],[big(7523094288207667809),big(105),big(47)]], [0,1,2,3,4,5,6,7,8,9]], [('f',[]), [[],[],[],[],[],[],[],[],[],[]], @@ -298,7 +316,7 @@ def test_coverage(self): [('d',[1.0,3.1400000000000001,0.99734343339999998,1.1000000000000001,2.2000000000000002,3.2999999999999998,4.4000000000000004,5.5,6.5999999999999996]), [[1.0,3.1400000000000001,0.99734343339999998,1.1000000000000001,2.2000000000000002,3.2999999999999998,4.4000000000000004,5.5,6.5999999999999996],[1.0000000000000215,3.1400000000000001,0.99734343339999998,1.1000000000000001,2.2000000000000002,3.2999999999999998,4.4000000000000004,5.5,6.5999999999999996],[1.0000000000055922,3.1400000000000001,0.99734343339999998,1.1000000000000001,2.2000000000000002,3.2999999999999998,4.4000000000000004,5.5,6.5999999999999996],[1.0000000014462318,3.1400000000000001,0.99734343339999998,1.1000000000000001,2.2000000000000002,3.2999999999999998,4.4000000000000004,5.5,6.5999999999999996],[1.0000003739752616,3.1400000000000001,0.99734343339999998,1.1000000000000001,2.2000000000000002,3.2999999999999998,4.4000000000000004,5.5,6.5999999999999996],[1.0000966950812187,3.1400000000000001,0.99734343339999998,1.1000000000000001,2.2000000000000002,3.2999999999999998,4.4000000000000004,5.5,6.5999999999999996],[1.0249990388312187,3.1400000000000001,0.99734343339999998,1.1000000000000001,2.2000000000000002,3.2999999999999998,4.4000000000000004,5.5,6.5999999999999996],[0.002856443435217224,3.1400000000000001,0.99734343339999998,1.1000000000000001,2.2000000000000002,3.2999999999999998,4.4000000000000004,5.5,6.5999999999999996],[8.5408832230361244e+194,3.1400000000000001,0.99734343339999998,1.1000000000000001,2.2000000000000002,3.2999999999999998,4.4000000000000004,5.5,6.5999999999999996],[8.5408832230361244e+194,3.140000000000033,0.99734343339999998,1.1000000000000001,2.2000000000000002,3.2999999999999998,4.4000000000000004,5.5,6.5999999999999996]], [0,1,2,3,4,5,6,7,8,9]], - ] + ] for a_params, a_expected, b_expected in readinto_cases: b_list = bytesio_helper() @@ -309,7 +327,7 @@ def test_coverage(self): self.assertEqual(b.readinto(a), b_expected[i]) self.assertEqual(a.tolist(), - a_expected[i]) + a_expected[i], "Failed on case %s" % str(a_params)) def test_ipy2_gh711(self): """https://github.com/IronLanguages/ironpython2/issues/711""" diff --git a/tests/suite/modules/io_related/test__fileio.py b/tests/suite/modules/io_related/test__fileio.py index 07cb8a04b..eb75696de 100644 --- a/tests/suite/modules/io_related/test__fileio.py +++ b/tests/suite/modules/io_related/test__fileio.py @@ -13,7 +13,9 @@ from _io import FileIO -from iptest import IronPythonTestCase, run_test +from iptest import IronPythonTestCase, big, is_32, is_windows, run_test + +is_long32bit = is_32 or is_windows def bytesio_helper(): return (bytes(bytearray(b'')), @@ -366,27 +368,47 @@ def test_coverage(self): #http://ironpython.codeplex.com/WorkItem/View.aspx?WorkItemId=24317 [('l',[1,2]), - [[1,2],[97,2],[25185,2],[6513249,2],[1684234849,2],[1684234849,101],[1684234849,26213],[1684234849,6776421],[1684234849,1751606885],[1684234849,1751606885]], - [0,1,2,3,4,5,6,7,8,8]], + [[1,2],[97,2],[25185,2],[6513249,2],[1684234849,2],[1684234849,101],[1684234849,26213],[1684234849,6776421],[1684234849,1751606885],[1684234849,1751606885]] + if is_long32bit else + [[big(1),big(2)],[big(97),big(2)],[big(25185),big(2)],[big(6513249),big(2)],[big(1684234849),big(2)],[big(435475931745),big(2)],[big(112585661964897),big(2)],[big(29104508263162465),big(2)],[big(7523094288207667809),big(2)],[big(7523094288207667809),big(105)]], + [0,1,2,3,4,5,6,7,8,8] + if is_long32bit else + [0,1,2,3,4,5,6,7,8,9]], [('l',[-1]), - [[-1],[-159],[-40351],[-10263967],[1684234849],[1684234849],[1684234849],[1684234849],[1684234849],[1684234849]], - [0,1,2,3,4,4,4,4,4,4]], + [[-1],[-159],[-40351],[-10263967],[1684234849],[1684234849],[1684234849],[1684234849],[1684234849],[1684234849]] + if is_long32bit else + [[big(-1)],[big(-159)],[big(-40351)],[big(-10263967)],[big(-2610732447)],[big(-664035696031)],[big(-168889314745759)],[big(-42953085774765471)],[big(7523094288207667809)],[big(7523094288207667809)]], + [0,1,2,3,4,4,4,4,4,4] + if is_long32bit else + [0,1,2,3,4,5,6,7,8,8]], [('l',[1,-99,47]), - [[1,-99,47],[97,-99,47],[25185,-99,47],[6513249,-99,47],[1684234849,-99,47],[1684234849,-155,47],[1684234849,-39323,47],[1684234849,-10000795,47],[1684234849,1751606885,47],[1684234849,1751606885,105]], + [[1,-99,47],[97,-99,47],[25185,-99,47],[6513249,-99,47],[1684234849,-99,47],[1684234849,-155,47],[1684234849,-39323,47],[1684234849,-10000795,47],[1684234849,1751606885,47],[1684234849,1751606885,105]] + if is_long32bit else + [[big(1),big(-99),big(47)],[big(97),big(-99),big(47)],[big(25185),big(-99),big(47)],[big(6513249),big(-99),big(47)],[big(1684234849),big(-99),big(47)],[big(435475931745),big(-99),big(47)],[big(112585661964897),big(-99),big(47)],[big(29104508263162465),big(-99),big(47)],[big(7523094288207667809),big(-99),big(47)],[big(7523094288207667809),big(-151),big(47)]], [0,1,2,3,4,5,6,7,8,9]], [('l',[1,-99,47,48]), - [[1,-99,47,48],[97,-99,47,48],[25185,-99,47,48],[6513249,-99,47,48],[1684234849,-99,47,48],[1684234849,-155,47,48],[1684234849,-39323,47,48],[1684234849,-10000795,47,48],[1684234849,1751606885,47,48],[1684234849,1751606885,105,48]], + [[1,-99,47,48],[97,-99,47,48],[25185,-99,47,48],[6513249,-99,47,48],[1684234849,-99,47,48],[1684234849,-155,47,48],[1684234849,-39323,47,48],[1684234849,-10000795,47,48],[1684234849,1751606885,47,48],[1684234849,1751606885,105,48]] + if is_long32bit else + [[big(1),big(-99),big(47),big(48)],[big(97),big(-99),big(47),big(48)],[big(25185),big(-99),big(47),big(48)],[big(6513249),big(-99),big(47),big(48)],[big(1684234849),big(-99),big(47),big(48)],[big(435475931745),big(-99),big(47),big(48)],[big(112585661964897),big(-99),big(47),big(48)],[big(29104508263162465),big(-99),big(47),big(48)],[big(7523094288207667809),big(-99),big(47),big(48)],[big(7523094288207667809),big(-151),big(47),big(48)]], [0,1,2,3,4,5,6,7,8,9]], [('l',[1,-99,47,48,49]), - [[1,-99,47,48,49],[97,-99,47,48,49],[25185,-99,47,48,49],[6513249,-99,47,48,49],[1684234849,-99,47,48,49],[1684234849,-155,47,48,49],[1684234849,-39323,47,48,49],[1684234849,-10000795,47,48,49],[1684234849,1751606885,47,48,49],[1684234849,1751606885,105,48,49]], + [[1,-99,47,48,49],[97,-99,47,48,49],[25185,-99,47,48,49],[6513249,-99,47,48,49],[1684234849,-99,47,48,49],[1684234849,-155,47,48,49],[1684234849,-39323,47,48,49],[1684234849,-10000795,47,48,49],[1684234849,1751606885,47,48,49],[1684234849,1751606885,105,48,49]] + if is_long32bit else + [[big(1),big(-99),big(47),big(48),big(49)],[big(97),big(-99),big(47),big(48),big(49)],[big(25185),big(-99),big(47),big(48),big(49)],[big(6513249),big(-99),big(47),big(48),big(49)],[big(1684234849),big(-99),big(47),big(48),big(49)],[big(435475931745),big(-99),big(47),big(48),big(49)],[big(112585661964897),big(-99),big(47),big(48),big(49)],[big(29104508263162465),big(-99),big(47),big(48),big(49)],[big(7523094288207667809),big(-99),big(47),big(48),big(49)],[big(7523094288207667809),big(-151),big(47),big(48),big(49)]], [0,1,2,3,4,5,6,7,8,9]], #http://ironpython.codeplex.com/WorkItem/View.aspx?WorkItemId=24318 - [('L',[100000000]), - [[100000000],[100000097],[99967585],[90399329],[1684234849],[1684234849],[1684234849],[1684234849],[1684234849],[1684234849]], - [0,1,2,3,4,4,4,4,4,4]], - [('L',[1,99,47]), - [[1,99,47],[97,99,47],[25185,99,47],[6513249,99,47],[1684234849,99,47],[1684234849,101,47],[1684234849,26213,47],[1684234849,6776421,47],[1684234849,1751606885,47],[1684234849,1751606885,105]], + [('L',[big(100000000)]), + [[big(100000000)],[big(100000097)],[big(99967585)],[big(90399329)],[big(1684234849)],[big(1684234849)],[big(1684234849)],[big(1684234849)],[big(1684234849)],[big(1684234849)]] + if is_long32bit else + [[big(100000000)],[big(100000097)],[big(99967585)],[big(90399329)],[big(1684234849)],[big(435475931745)],[big(112585661964897)],[big(29104508263162465)],[big(7523094288207667809)],[big(7523094288207667809)]], + [0,1,2,3,4,4,4,4,4,4] + if is_long32bit else + [0,1,2,3,4,5,6,7,8,8]], + [('L',[big(1),big(99),big(47)]), + [[big(1),big(99),big(47)],[big(97),big(99),big(47)],[big(25185),big(99),big(47)],[big(6513249),big(99),big(47)],[big(1684234849),big(99),big(47)],[big(1684234849),big(101),big(47)],[big(1684234849),big(26213),big(47)],[big(1684234849),big(6776421),big(47)],[big(1684234849),big(1751606885),big(47)],[big(1684234849),big(1751606885),big(105)]] + if is_long32bit else + [[big(1),big(99),big(47)],[big(97),big(99),big(47)],[big(25185),big(99),big(47)],[big(6513249),big(99),big(47)],[big(1684234849),big(99),big(47)],[big(435475931745),big(99),big(47)],[big(112585661964897),big(99),big(47)],[big(29104508263162465),big(99),big(47)],[big(7523094288207667809),big(99),big(47)],[big(7523094288207667809),big(105),big(47)]], [0,1,2,3,4,5,6,7,8,9]], #http://ironpython.codeplex.com/WorkItem/View.aspx?WorkItemId=24319 @@ -425,7 +447,7 @@ def test_coverage(self): self.assertEqual(f.readinto(a), f_expected[i]) self.assertEqual(a.tolist(), - a_expected[i]) + a_expected[i], "Failed on case %s" % str(a_params)) # try with bytearray as well - https://github.com/IronLanguages/ironpython2/issues/713 f.seek(0) diff --git a/tests/suite/modules/type_related/test__struct.py b/tests/suite/modules/type_related/test__struct.py index 6d36c3b0f..f8eec4661 100644 --- a/tests/suite/modules/type_related/test__struct.py +++ b/tests/suite/modules/type_related/test__struct.py @@ -5,7 +5,9 @@ import _struct import sys -from iptest import IronPythonTestCase, is_64, is_cli, is_cpython, run_test +from iptest import IronPythonTestCase, is_32, is_64, is_cli, is_cpython, is_windows, run_test + +is_long32bit = is_32 or is_windows def pack(f, *v): return _struct.Struct(f).pack(*v) @@ -78,16 +80,16 @@ def test_cp3092(self): def test_cp9347(self): temp_list = [("2xB", b'\x00\x00\xff', 255), - ("4s4x", b'AAAA\x00\x00\x00\x00', b"AAAA"), - ("x", b'\x00'), - ("ix", b'\x01\x00\x00\x00\x00', 1), - ("ix", b'\x01\x00\x00\x80\x00', -(2**(32-1)-1)), - ("xI", b'\x00\x00\x00\x00\xff\xff\xff\xff', 2**32-1), - ("xlx", b'\x00\x00\x00\x00x\xec\xff\xff\x00', -5000), - ("LxL", b'~\x00\x00\x00\x00\x00\x00\x00~\x00\x00\x00', 126, 126), - ("LxxL", b'~\x00\x00\x00\x00\x00\x00\x00~\x00\x00\x00', 126, 126), - ("32xLL", b'\x00' *32 + b'~\x00\x00\x00~\x00\x00\x00', 126, 126), - ("LxL8xLL", b'~\x00\x00\x00\x00\x00\x00\x00~\x00\x00\x00' + b'\x00'*8 + b'~\x00\x00\x00'*2, 126, 126, 126, 126), + ("4s4x", b'AAAA\x00\x00\x00\x00', b"AAAA"), + ("x", b'\x00'), + ("ix", b'\x01\x00\x00\x00\x00', 1), + ("ix", b'\x01\x00\x00\x80\x00', -(2**(32-1)-1)), + ("xI", b'\x00\x00\x00\x00\xff\xff\xff\xff', 2**32-1), + ("xix", b'\x00\x00\x00\x00x\xec\xff\xff\x00', -5000), + ("IxI", b'~\x00\x00\x00\x00\x00\x00\x00~\x00\x00\x00', 126, 126), + ("IxxI", b'~\x00\x00\x00\x00\x00\x00\x00~\x00\x00\x00', 126, 126), + ("32xII", b'\x00' *32 + b'~\x00\x00\x00~\x00\x00\x00', 126, 126), + ("IxI8xII", b'~\x00\x00\x00\x00\x00\x00\x00~\x00\x00\x00' + b'\x00'*8 + b'~\x00\x00\x00'*2, 126, 126, 126, 126), ] for stuff in temp_list: @@ -96,7 +98,7 @@ def test_cp9347(self): params = stuff[2:] actual = pack(format, *params) - self.assertEqual(expected_val, actual) + self.assertEqual(expected_val, actual, "Test failed for format: " + format) self.assertEqual(unpack(format, actual), params) @@ -168,7 +170,10 @@ def test_calcsize_alignment(self): for x in struct_format: for y in struct_format: temp_str = str(x) + str(y) - expected_size = expected[temp_str] + if is_long32bit: + expected_size = expected[temp_str] + else: + expected_size = expected[temp_str.replace("l", "q").replace("L", "Q")] if is_64: if x == "P": expected_size = min(expected_size + 4, 16) if y == "P": expected_size = 16 @@ -181,7 +186,7 @@ def test_new_init(self): for x in (_struct.Struct.__new__(_struct.Struct), _struct.Struct.__new__(_struct.Struct, a = 2)): # state of uninitialized object... self.assertEqual(x.size, -1) - self.assertEqual(x.format, None if is_cli or is_cpython and sys.version_info < (3,7) else '\x00\x00\x00\x00\x00\x00\x00') + self.assertEqual(x.format, None if is_cli or is_cpython and sys.version_info < (3,7) else '\x00\x00\x00\x00\x00\x00\x00\x00') self.assertRaisesMessage(_struct.error, "pack requires exactly -1 arguments" if is_cli else "pack expected -1 items for packing (got 0)", x.pack) self.assertRaisesMessage(_struct.error, "unpack requires a bytes object of length -1" if is_cli or is_cpython and sys.version_info < (3,6) else "unpack requires a buffer of -1 bytes", x.unpack, b'') diff --git a/tests/suite/modules/type_related/test_array.py b/tests/suite/modules/type_related/test_array.py index 848c4343b..55fe4b111 100644 --- a/tests/suite/modules/type_related/test_array.py +++ b/tests/suite/modules/type_related/test_array.py @@ -8,6 +8,7 @@ import array import sys +import pickle from iptest import IronPythonTestCase, is_cli, is_mono, big, run_test @@ -162,9 +163,14 @@ def test_array___init__(self): self.assertEqual(a, b) #--L - a = array.array('L', b"\x12\x34\x45\x67") - self.assertEqual(1, len(a)) - self.assertEqual(1732588562, a[0]) + a = array.array('L', b"\x12\x34\x45\x67" * 2) + self.assertTrue(a.itemsize == 4 or a.itemsize == 8) + if a.itemsize == 4: + self.assertEqual(2, len(a)) + self.assertEqual(1732588562, a[0]) + else: + self.assertEqual(1, len(a)) + self.assertEqual(7441411212946256914, a[0]) #--B a = array.array('B', [0]) * big(2) @@ -248,6 +254,17 @@ def test_array___reduce_ex__(self): with self.assertRaises(TypeError): x.__reduce_ex__() + def test_array_pickle(self): + int_codes = 'BHILQ' + for code in int_codes + int_codes.lower() + 'fd': + with self.subTest(code=code): + a = array.array(code, [1,2,3]) + pickled = pickle.dumps(a) + b = pickle.loads(pickled) + self.assertEqual(a, b) + self.assertEqual(a.typecode, b.typecode) + self.assertEqual(a.itemsize, b.itemsize) + def test_array___repr__(self): ''' TODO @@ -454,9 +471,16 @@ def test_cp9348(self): ('i', b"\x12\x34\x45\x67") : "array('i', [1732588562])", ('I', b"\x12\x34\x45\x67") : "array('I', [1732588562])", ('I', b"\x01\x00\x00\x00") : "array('I', [1])", - ('l', b"\x12\x34\x45\x67") : "array('l', [1732588562])", - ('L', b"\x12\x34\x45\x67") : "array('L', [1732588562])", + ('q', b"\x12\x34\x45\x67\x89\xab\xcd\xef") : "array('q', [-1167088121787632622])", + ('Q', b"\x12\x34\x45\x67\x89\xab\xcd\xef") : "array('Q', [17279655951921918994])", } + if array.array('L').itemsize == 4: + test_cases[('l', b"\x12\x34\x45\x67")] = "array('l', [1732588562])" + test_cases[('L', b"\x12\x34\x45\x67")] = "array('L', [1732588562])" + else: + test_cases[('l', b"\x12\x34\x45\x67\x89\xab\xcd\xef")] = "array('l', [-1167088121787632622])" + test_cases[('L', b"\x12\x34\x45\x67\x89\xab\xcd\xef")] = "array('L', [17279655951921918994])" + if is_cli: # https://github.com/IronLanguages/ironpython2/issues/102 test_cases[('d', b"\x12\x34\x45\x67\x12\x34\x45\x67")] = "array('d', [2.9522485325887698e+189])" test_cases[('f', b"\x12\x34\x45\x67")] = "array('f', [9.3126672485384569e+23])" diff --git a/tests/suite/modules/type_related/test_ctypes.py b/tests/suite/modules/type_related/test_ctypes.py index baa14825e..8c3a2208e 100644 --- a/tests/suite/modules/type_related/test_ctypes.py +++ b/tests/suite/modules/type_related/test_ctypes.py @@ -8,6 +8,7 @@ from ctypes import * from array import array +from struct import calcsize import sys import gc import unittest @@ -177,13 +178,7 @@ def test_bitfield_bool_truthy(self): class Test(Structure): _fields_ = [("x", c_bool, 1)] - class myindex: - def __init__(self, value): - self.value = value - def __index__(self): - return self.value - - for val in (None, "", "False", "True", "0", "1", 0, 1, 2, 0.0, 1.0, [], (), {}, object(), myindex(0), myindex(1)): + for val in (None, "", "False", "True", "0", "1", 0, 1, 2, 0.0, 1.0, [], (), {}, object(), MyIndex(0), MyIndex(1)): with self.subTest(val=val): self.assertIs(Test(val).x, bool(val)) @@ -191,24 +186,18 @@ def __index__(self): s.x = val self.assertIs(s.x, bool(val)) - def test_bitfield_long(self): - """Tests for bitfields of type c_long""" + def test_bitfield_int(self): + """Tests for bitfields of type c_int""" class Test(Structure): - _fields_ = [("x", c_long, 16), ("y", c_long, 16), ("z", c_long, 32)] - - class myindex: - def __init__(self, value): - self.value = value - def __index__(self): - return self.value + _fields_ = [("x", c_int, 16), ("y", c_int, 16), ("z", c_int, 32)] self.assertEqual(Test(0x1234).x, 0x1234) self.assertEqual(Test(big(0x1234)).x, 0x1234) self.assertEqual(Test(myint(0x1234)).x, 0x1234) self.assertEqual(Test(True).x, 1) if is_cli or sys.version_info >= (3, 8): - self.assertEqual(Test(myindex(0x1234)).x, 0x1234) + self.assertEqual(Test(MyIndex(0x1234)).x, 0x1234) if is_cli or sys.version_info >= (3, 10): msg = "'float' object cannot be interpreted as an integer" else: @@ -218,10 +207,11 @@ def __index__(self): with self.assertRaisesMessage(ValueError, "number of bits invalid for bit field"): class Test(Structure): _fields_ = [("x", c_int, 0)] - - self.assertEqual(repr(Test.x), "") - self.assertEqual(repr(Test.y), "") - self.assertEqual(repr(Test.z), "") + # if c_long and c_int are the same size, c_long is used + typename = "c_long" if calcsize('l') == calcsize('i') else "c_int" + self.assertEqual(repr(Test.x), "".format(typename)) + self.assertEqual(repr(Test.y), "".format(typename)) + self.assertEqual(repr(Test.z), "".format(typename)) self.assertEqual((Test.x.offset, Test.x.size), (0, (16 << 16) + 0)) self.assertEqual((Test.y.offset, Test.y.size), (0, (16 << 16) + 16)) diff --git a/tests/suite/test_memoryview.py b/tests/suite/test_memoryview.py index b8704a6c7..d4240ad54 100644 --- a/tests/suite/test_memoryview.py +++ b/tests/suite/test_memoryview.py @@ -9,7 +9,9 @@ import unittest import warnings -from iptest import run_test, is_mono, is_cli, is_64 +from iptest import run_test, is_mono, is_cli, is_32, is_64, is_windows + +is_long32bit = is_32 or is_windows class SliceTests(unittest.TestCase): def testGet(self): @@ -191,7 +193,7 @@ def test_equality_structural(self): self.assertFalse(mv_i == mv) self.assertFalse(mv_i == mv_h) mv_L = mv.cast('L') - self.assertTrue(mv_i == mv_L) + self.assertEquals(mv_i == mv_L, is_long32bit) mv_f = mv.cast('f') self.assertFalse(mv_i == mv_f) @@ -206,7 +208,7 @@ def test_equality_structural(self): mv_P = mv.cast('P') self.assertFalse(mv_P == mv_i) - self.assertFalse(mv_P == mv_L) + self.assertEqual(mv_P == mv_L, not is_long32bit) self.assertTrue(mv_P == mv_q) self.assertTrue(mv_P == mv_Q) diff --git a/tests/suite/test_regressions.py b/tests/suite/test_regressions.py index b9ab08ab9..37d6ce28d 100644 --- a/tests/suite/test_regressions.py +++ b/tests/suite/test_regressions.py @@ -18,7 +18,9 @@ def test_cp1234(): ... import sys import unittest -from iptest import IronPythonTestCase, is_cli, is_mono, is_netcoreapp, is_netcoreapp21, is_posix, run_test, skipUnlessIronPython, stdout_trapper +from iptest import IronPythonTestCase, is_32, is_cli, is_mono, is_netcoreapp, is_netcoreapp21, is_windows, is_posix, run_test, skipUnlessIronPython, stdout_trapper + +is_long32bit = is_32 or is_windows class RegressionTest(IronPythonTestCase): @@ -229,18 +231,22 @@ def __int__(self): andCalled = False for code in ['L', 'I']: - self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct(code).pack, 0x100000000) + if code != 'L' or is_long32bit: + self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct(code).pack, 0x100000000) self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct(code).pack, -1) for code in ['l', 'i', 'h', 'H', 'B', 'b']: - self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct(code).pack, 0x80000000) - self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct(code).pack, -0x80000001) + if code != 'l' or is_long32bit: + self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct(code).pack, 0x80000000) + self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct(code).pack, -0x80000001) - self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct('Q').pack, 0x10000000000000000) - self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct('Q').pack, -1) + for code in ['L', 'Q']: + self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct(code).pack, 0x10000000000000000) + self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct(code).pack, -1) - self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct('q').pack, 0x8000000000000000) - self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct('q').pack, -0x8000000000000001) + for code in ['l', 'q']: + self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct(code).pack, 0x8000000000000000) + self.assertRaisesRegex(_struct.error, "argument out of range", _struct.Struct(code).pack, -0x8000000000000001) self.assertRaisesRegex(_struct.error, r"ushort format requires 0 <= number .*", _struct.Struct('H').pack, 0x10000) self.assertRaisesRegex(_struct.error, r"ushort format requires 0 <= number .*", _struct.Struct('H').pack, -1) diff --git a/tests/suite/test_struct.py b/tests/suite/test_struct.py index b08651f6b..819838f70 100644 --- a/tests/suite/test_struct.py +++ b/tests/suite/test_struct.py @@ -97,4 +97,22 @@ def test_iter_unpack(self): # struct.error: iterative unpacking requires a buffer of a multiple of {N} bytes self.assertRaises(struct.error, struct.iter_unpack, "h", b"\0") + + def test_sizes(self): + # test sizes of standard struct types + for mode in ('<', '>', '=', '!'): + self.assertEqual(struct.calcsize(mode + 'b'), 1) + self.assertEqual(struct.calcsize(mode + 'B'), 1) + self.assertEqual(struct.calcsize(mode + 'h'), 2) + self.assertEqual(struct.calcsize(mode + 'H'), 2) + self.assertEqual(struct.calcsize(mode + 'i'), 4) + self.assertEqual(struct.calcsize(mode + 'I'), 4) + self.assertEqual(struct.calcsize(mode + 'l'), 4) + self.assertEqual(struct.calcsize(mode + 'L'), 4) + self.assertEqual(struct.calcsize(mode + 'q'), 8) + self.assertEqual(struct.calcsize(mode + 'Q'), 8) + self.assertEqual(struct.calcsize(mode + 'f'), 4) + self.assertEqual(struct.calcsize(mode + 'd'), 8) + + run_test(__name__) From 8bcdb22a2301040f8d4e2794191c2a6f7d47e95d Mon Sep 17 00:00:00 2001 From: Pavel Koneski Date: Sun, 23 Feb 2025 13:42:53 -0800 Subject: [PATCH 2/2] Fix spelling --- tests/suite/test_memoryview.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/suite/test_memoryview.py b/tests/suite/test_memoryview.py index d4240ad54..45004b8f3 100644 --- a/tests/suite/test_memoryview.py +++ b/tests/suite/test_memoryview.py @@ -193,7 +193,7 @@ def test_equality_structural(self): self.assertFalse(mv_i == mv) self.assertFalse(mv_i == mv_h) mv_L = mv.cast('L') - self.assertEquals(mv_i == mv_L, is_long32bit) + self.assertEqual(mv_i == mv_L, is_long32bit) mv_f = mv.cast('f') self.assertFalse(mv_i == mv_f)