Skip to content

Commit 2b471c6

Browse files
committed
add native _ctypes_test module and make some ctypes tests pass
1 parent 1d5d01c commit 2b471c6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+3177
-1267
lines changed

graalpython/com.oracle.graal.python.cext/modules/_ctypes_test.c

Lines changed: 1085 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/* Copyright (c) 2021, Oracle and/or its affiliates.
2+
* Copyright (C) 1996-2020 Python Software Foundation
3+
*
4+
* Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
5+
*/
6+
extern int _testfunc_i_bhilfd(char b, short h, int i, long l, float f, double d);

graalpython/com.oracle.graal.python.cext/setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,7 @@ def __call__(self):
397397
NativeBuiltinModule("_cpython_struct"),
398398
NativeBuiltinModule("_testcapi"),
399399
NativeBuiltinModule("_testmultiphase"),
400+
NativeBuiltinModule("_ctypes_test"),
400401
# the above modules are more core, we need them first to deal with later, more complex modules with dependencies
401402
NativeBuiltinModule("_bz2", deps=[Bzip2Depedency("bz2", "bzip2==1.0.8", "BZIP2")], extra_link_args=["-Wl,-rpath,%s/../lib/%s/" % (relative_rpath, SOABI)]),
402403
)
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
*ctypes.test.test_anon.AnonTest.test_anon_nonmember
2+
*ctypes.test.test_anon.AnonTest.test_anon_nonseq
3+
*ctypes.test.test_anon.AnonTest.test_issue31490
4+
*ctypes.test.test_arrays.ArrayTestCase.test_bpo36504_signed_int_overflow
5+
*ctypes.test.test_arrays.ArrayTestCase.test_cache
6+
*ctypes.test.test_arrays.ArrayTestCase.test_classcache
7+
*ctypes.test.test_arrays.ArrayTestCase.test_empty_element_array
8+
*ctypes.test.test_arrays.ArrayTestCase.test_empty_element_struct
9+
*ctypes.test.test_arrays.ArrayTestCase.test_large_array
10+
*ctypes.test.test_arrays.ArrayTestCase.test_subclass
11+
*ctypes.test.test_arrays.ArrayTestCase.test_zero_length
12+
*ctypes.test.test_as_parameter.AsParamPropertyWrapperTestCase.test_recursive_as_param
13+
*ctypes.test.test_as_parameter.AsParamWrapperTestCase.test_recursive_as_param
14+
*ctypes.test.test_as_parameter.BasicWrapTestCase.test_pointers
15+
*ctypes.test.test_as_parameter.BasicWrapTestCase.test_recursive_as_param
16+
*ctypes.test.test_as_parameter.BasicWrapTestCase.test_wchar_parm
17+
*ctypes.test.test_bitfields.BitFieldTest.test_c_wchar
18+
*ctypes.test.test_bitfields.BitFieldTest.test_mixed_1
19+
*ctypes.test.test_bitfields.BitFieldTest.test_mixed_2
20+
*ctypes.test.test_bitfields.BitFieldTest.test_mixed_3
21+
*ctypes.test.test_bitfields.BitFieldTest.test_mixed_4
22+
*ctypes.test.test_bitfields.BitFieldTest.test_nonint_types
23+
*ctypes.test.test_bitfields.BitFieldTest.test_single_bitfield_size
24+
*ctypes.test.test_bytes.BytesTest.test_BSTR
25+
*ctypes.test.test_bytes.BytesTest.test_struct_W
26+
*ctypes.test.test_byteswap.Test.test_X
27+
*ctypes.test.test_byteswap.Test.test_endian_other
28+
*ctypes.test.test_byteswap.Test.test_slots
29+
*ctypes.test.test_byteswap.Test.test_struct_fields_1
30+
*ctypes.test.test_callbacks.Callbacks.test_char_p
31+
*ctypes.test.test_callbacks.SampleCallbacksTestCase.test_issue_8959_b
32+
*ctypes.test.test_callbacks.StdcallCallbacks.test_byte
33+
*ctypes.test.test_callbacks.StdcallCallbacks.test_char
34+
*ctypes.test.test_callbacks.StdcallCallbacks.test_char_p
35+
*ctypes.test.test_callbacks.StdcallCallbacks.test_double
36+
*ctypes.test.test_callbacks.StdcallCallbacks.test_float
37+
*ctypes.test.test_callbacks.StdcallCallbacks.test_int
38+
*ctypes.test.test_callbacks.StdcallCallbacks.test_issue12483
39+
*ctypes.test.test_callbacks.StdcallCallbacks.test_issue_7959
40+
*ctypes.test.test_callbacks.StdcallCallbacks.test_long
41+
*ctypes.test.test_callbacks.StdcallCallbacks.test_longdouble
42+
*ctypes.test.test_callbacks.StdcallCallbacks.test_longlong
43+
*ctypes.test.test_callbacks.StdcallCallbacks.test_pyobject
44+
*ctypes.test.test_callbacks.StdcallCallbacks.test_short
45+
*ctypes.test.test_callbacks.StdcallCallbacks.test_ubyte
46+
*ctypes.test.test_callbacks.StdcallCallbacks.test_uint
47+
*ctypes.test.test_callbacks.StdcallCallbacks.test_ulong
48+
*ctypes.test.test_callbacks.StdcallCallbacks.test_ulonglong
49+
*ctypes.test.test_callbacks.StdcallCallbacks.test_unsupported_restype_1
50+
*ctypes.test.test_callbacks.StdcallCallbacks.test_unsupported_restype_2
51+
*ctypes.test.test_callbacks.StdcallCallbacks.test_ushort
52+
*ctypes.test.test_cast.Test.test_bad_type_arg
53+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_byte
54+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_byte_plus
55+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_callwithresult
56+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_double
57+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_double_plus
58+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_float
59+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_float_plus
60+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_int
61+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_int_plus
62+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_long
63+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_long_plus
64+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_longdouble
65+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_longdouble_plus
66+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_longlong
67+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_longlong_plus
68+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_short
69+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_short_plus
70+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_ubyte
71+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_ubyte_plus
72+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_uint
73+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_uint_plus
74+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_ulong
75+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_ulong_plus
76+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_ulonglong
77+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_ulonglong_plus
78+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_ushort
79+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_ushort_plus
80+
*ctypes.test.test_cfuncs.stdcallCFunctions.test_void
81+
*ctypes.test.test_checkretval.Test.test_oledll
82+
*ctypes.test.test_delattr.TestCase.test_chararray
83+
*ctypes.test.test_delattr.TestCase.test_simple
84+
*ctypes.test.test_errno.Test.test_GetLastError
85+
*ctypes.test.test_find.LibPathFindTest.test_find_on_libpath
86+
*ctypes.test.test_find.Test_OpenGL_libs.test_gl
87+
*ctypes.test.test_find.Test_OpenGL_libs.test_gle
88+
*ctypes.test.test_find.Test_OpenGL_libs.test_glu
89+
*ctypes.test.test_find.Test_OpenGL_libs.test_shell_injection
90+
*ctypes.test.test_frombuffer.Test.test_abstract
91+
*ctypes.test.test_frombuffer.Test.test_fortran_contiguous
92+
*ctypes.test.test_frombuffer.Test.test_from_buffer_memoryview
93+
*ctypes.test.test_functions.FunctionTestCase.test_doubleresult
94+
*ctypes.test.test_functions.FunctionTestCase.test_errors
95+
*ctypes.test.test_functions.FunctionTestCase.test_longlongresult
96+
*ctypes.test.test_functions.FunctionTestCase.test_mro
97+
*ctypes.test.test_functions.FunctionTestCase.test_stringresult
98+
*ctypes.test.test_functions.FunctionTestCase.test_struct_return_2H_stdcall
99+
*ctypes.test.test_functions.FunctionTestCase.test_struct_return_8H_stdcall
100+
*ctypes.test.test_functions.FunctionTestCase.test_wchar_parm
101+
*ctypes.test.test_internals.ObjectsTestCase.test_embedded_structs
102+
*ctypes.test.test_internals.ObjectsTestCase.test_ptr_struct
103+
*ctypes.test.test_internals.ObjectsTestCase.test_simple_struct
104+
*ctypes.test.test_keeprefs.ArrayTestCase.test_cint_array
105+
*ctypes.test.test_keeprefs.DeletePointerTestCase.test_X
106+
*ctypes.test.test_keeprefs.PointerTestCase.test_p_cint
107+
*ctypes.test.test_keeprefs.SimpleTestCase.test_cint
108+
*ctypes.test.test_keeprefs.StructureTestCase.test_cint_struct
109+
*ctypes.test.test_keeprefs.StructureTestCase.test_struct_struct
110+
*ctypes.test.test_libc.LibTest.test_sqrt
111+
*ctypes.test.test_loading.LoaderTest.test_1703286_A
112+
*ctypes.test.test_loading.LoaderTest.test_1703286_B
113+
*ctypes.test.test_loading.LoaderTest.test_find
114+
*ctypes.test.test_loading.LoaderTest.test_load
115+
*ctypes.test.test_loading.LoaderTest.test_load_dll_with_flags
116+
*ctypes.test.test_loading.LoaderTest.test_load_library
117+
*ctypes.test.test_loading.LoaderTest.test_load_ordinal_functions
118+
*ctypes.test.test_loading.LoaderTest.test_load_version
119+
*ctypes.test.test_macholib.MachOTest.test_find
120+
*ctypes.test.test_memfunctions.MemFunctionsTest.test_memmove
121+
*ctypes.test.test_memfunctions.MemFunctionsTest.test_memset
122+
*ctypes.test.test_memfunctions.MemFunctionsTest.test_overflow
123+
*ctypes.test.test_memfunctions.MemFunctionsTest.test_string_at
124+
*ctypes.test.test_memfunctions.MemFunctionsTest.test_wstring_at
125+
*ctypes.test.test_numbers.NumberTestCase.test_bool_from_address
126+
*ctypes.test.test_numbers.NumberTestCase.test_bool_values
127+
*ctypes.test.test_numbers.NumberTestCase.test_byref
128+
*ctypes.test.test_numbers.NumberTestCase.test_float_overflow
129+
*ctypes.test.test_numbers.NumberTestCase.test_from_param
130+
*ctypes.test.test_numbers.NumberTestCase.test_init
131+
*ctypes.test.test_numbers.NumberTestCase.test_perf
132+
*ctypes.test.test_numbers.NumberTestCase.test_sizes
133+
*ctypes.test.test_numbers.NumberTestCase.test_typeerror
134+
*ctypes.test.test_numbers.NumberTestCase.test_valid_ranges
135+
*ctypes.test.test_parameters.SimpleTypesTestCase.test_byref_pointer
136+
*ctypes.test.test_parameters.SimpleTypesTestCase.test_byref_pointerpointer
137+
*ctypes.test.test_parameters.SimpleTypesTestCase.test_issue31311
138+
*ctypes.test.test_parameters.SimpleTypesTestCase.test_subclasses
139+
*ctypes.test.test_parameters.SimpleTypesTestCase.test_subclasses_c_wchar_p
140+
*ctypes.test.test_pointers.PointersTestCase.test_abstract
141+
*ctypes.test.test_pointers.PointersTestCase.test_basics
142+
*ctypes.test.test_pointers.PointersTestCase.test_from_address
143+
*ctypes.test.test_pointers.PointersTestCase.test_pointer_crash
144+
*ctypes.test.test_python_api.PythonAPITestCase.test_PyLong_Long
145+
*ctypes.test.test_python_api.PythonAPITestCase.test_PyObj_FromPtr
146+
*ctypes.test.test_python_api.PythonAPITestCase.test_PyString_FromString
147+
*ctypes.test.test_refcounts.RefcountTestCase.test_1
148+
*ctypes.test.test_refcounts.RefcountTestCase.test_refcount
149+
*ctypes.test.test_simplesubclasses.Test.test_compare
150+
*ctypes.test.test_sizes.SizesTestCase.test_16
151+
*ctypes.test.test_sizes.SizesTestCase.test_32
152+
*ctypes.test.test_sizes.SizesTestCase.test_64
153+
*ctypes.test.test_sizes.SizesTestCase.test_8
154+
*ctypes.test.test_sizes.SizesTestCase.test_size_t
155+
*ctypes.test.test_sizes.SizesTestCase.test_ssize_t
156+
*ctypes.test.test_slicing.SlicesTestCase.test_char_array
157+
*ctypes.test.test_stringptr.StringPtrTestCase.test__POINTER_c_char
158+
*ctypes.test.test_strings.StringArrayTestCase.test_c_buffer_raw
159+
*ctypes.test.test_strings.StringArrayTestCase.test_c_buffer_value
160+
*ctypes.test.test_strings.StringArrayTestCase.test_param_1
161+
*ctypes.test.test_strings.StringArrayTestCase.test_param_2
162+
*ctypes.test.test_strings.StringTestCase.test_basic_strings
163+
*ctypes.test.test_strings.StringTestCase.test_initialized_strings
164+
*ctypes.test.test_strings.StringTestCase.test_perf
165+
*ctypes.test.test_strings.StringTestCase.test_sized_strings
166+
*ctypes.test.test_strings.StringTestCase.test_toolong
167+
*ctypes.test.test_strings.WStringArrayTestCase.test_nonbmp
168+
*ctypes.test.test_strings.WStringTestCase.test_basic_wstrings
169+
*ctypes.test.test_strings.WStringTestCase.test_toolong
170+
*ctypes.test.test_strings.WStringTestCase.test_wchar
171+
*ctypes.test.test_struct_fields.StructFieldsTestCase.test_1_A
172+
*ctypes.test.test_struct_fields.StructFieldsTestCase.test_1_B
173+
*ctypes.test.test_struct_fields.StructFieldsTestCase.test_2
174+
*ctypes.test.test_struct_fields.StructFieldsTestCase.test_3
175+
*ctypes.test.test_struct_fields.StructFieldsTestCase.test_4
176+
*ctypes.test.test_structures.StructureTestCase.test_abstract_class
177+
*ctypes.test.test_structures.StructureTestCase.test_bitfield_by_value
178+
*ctypes.test.test_structures.StructureTestCase.test_conflicting_initializers
179+
*ctypes.test.test_structures.StructureTestCase.test_empty
180+
*ctypes.test.test_structures.StructureTestCase.test_huge_field_name
181+
*ctypes.test.test_structures.StructureTestCase.test_invalid_field_types
182+
*ctypes.test.test_structures.StructureTestCase.test_invalid_name
183+
*ctypes.test.test_structures.StructureTestCase.test_methods
184+
*ctypes.test.test_structures.StructureTestCase.test_packed_c_limits
185+
*ctypes.test.test_structures.StructureTestCase.test_struct_alignment
186+
*ctypes.test.test_structures.StructureTestCase.test_subclass_creation
187+
*ctypes.test.test_structures.StructureTestCase.test_union_by_value
188+
*ctypes.test.test_structures.StructureTestCase.test_unions
189+
*ctypes.test.test_structures.TestRecursiveStructure.test_contains_itself
190+
*ctypes.test.test_structures.TestRecursiveStructure.test_vice_versa
191+
*ctypes.test.test_unicode.StringTestCase.test_buffers
192+
*ctypes.test.test_unicode.StringTestCase.test_func
193+
*ctypes.test.test_values.PythonValuesTestCase.test_undefined
194+
*ctypes.test.test_values.ValuesTestCase.test_undefined
195+
*ctypes.test.test_varsize_struct.VarSizeTest.test_array_invalid_length
196+
*ctypes.test.test_win32.FunctionCallTestCase.test_SEH
197+
*ctypes.test.test_win32.FunctionCallTestCase.test_noargs
198+
*ctypes.test.test_win32.ReturnStructSizesTestCase.test_sizes
199+
*ctypes.test.test_win32.TestWinError.test_winerror
200+
*ctypes.test.test_win32.TestWintypes.test_COMError
201+
*ctypes.test.test_win32.TestWintypes.test_HWND
202+
*ctypes.test.test_win32.TestWintypes.test_PARAM
203+
*ctypes.test.test_wintypes.WinTypesTest.test_variant_bool

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@
108108
import com.oracle.graal.python.builtins.modules.bz2.BZ2DecompressorBuiltins;
109109
import com.oracle.graal.python.builtins.modules.bz2.BZ2ModuleBuiltins;
110110
import com.oracle.graal.python.builtins.modules.ctypes.CArgObjectBuiltins;
111+
import com.oracle.graal.python.builtins.modules.ctypes.CDataBuiltins;
111112
import com.oracle.graal.python.builtins.modules.ctypes.CDataTypeBuiltins;
112113
import com.oracle.graal.python.builtins.modules.ctypes.CDataTypeSequenceBuiltins;
113114
import com.oracle.graal.python.builtins.modules.ctypes.CFieldBuiltins;
@@ -545,6 +546,7 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
545546
new SimpleCDataBuiltins(),
546547
new PyCArrayBuiltins(),
547548
new PyCPointerBuiltins(),
549+
new CDataBuiltins(),
548550

549551
// _hpy_universal
550552
new GraalHPyUniversalModuleBuiltins(),

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltinClassType.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,13 @@ public final Shape getInstanceShape(PythonLanguage lang) {
685685
type.type = type.base.type;
686686
}
687687
}
688+
689+
// Finally, we set all remaining types to PythonClass.
690+
for (PythonBuiltinClassType type : VALUES) {
691+
if (type.type == null) {
692+
type.type = PythonClass;
693+
}
694+
}
688695
}
689696

690697
// Proxy InteropLibrary messages to the PythonBuiltinClass

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ctypes/CArgObjectBuiltins.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import com.oracle.graal.python.builtins.PythonBuiltins;
5252
import com.oracle.graal.python.builtins.modules.ctypes.FFIType.FieldDesc;
5353
import com.oracle.graal.python.builtins.modules.ctypes.PtrValue.ByteArrayStorage;
54+
import com.oracle.graal.python.builtins.objects.PythonAbstractObject;
5455
import com.oracle.graal.python.builtins.objects.str.PString;
5556
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5657
import com.oracle.graal.python.nodes.function.builtins.PythonBinaryBuiltinNode;
@@ -116,19 +117,19 @@ Object doit(PyCArgObject self) {
116117
if (isLiteralChar((char) bytes[0])) {
117118
return PythonUtils.format("<cparam '%c' ('%c')>", self.tag, self.value);
118119
} else {
119-
return PythonUtils.format("<cparam '%c' ('\\x%02x')>", self.tag, self.value);
120+
return PythonUtils.format("<cparam '%c' ('\\x%02x')>", self.tag, PythonAbstractObject.systemHashCode(self.value));
120121
}
121122

122123
case 'z':
123124
case 'Z':
124125
case 'P':
125-
return PythonUtils.format("<cparam '%c' (%p)>", self.tag, self.value);
126+
return PythonUtils.format("<cparam '%c' 0x%x>", self.tag, PythonAbstractObject.systemHashCode(self.value));
126127

127128
default:
128129
if (isLiteralChar(self.tag)) {
129-
return PythonUtils.format("<cparam '%c' at %p>", self.tag, self);
130+
return PythonUtils.format("<cparam '%c' at 0x%x>", self.tag, PythonAbstractObject.systemHashCode(self));
130131
} else {
131-
return PythonUtils.format("<cparam 0x%02x at %p>", self.tag, self);
132+
return PythonUtils.format("<cparam 0x%02x at 0x%x>", self.tag, PythonAbstractObject.systemHashCode(self));
132133
}
133134
}
134135
}
@@ -159,7 +160,7 @@ protected static PyCArgObject paramFunc(int f, CDataObject self, StgDictObject s
159160
parg.value = self.b_ptr;
160161
return parg;
161162
case PyCSimpleTypeParamFunc: // Corresponds to PyCSimpleType_paramfunc
162-
assert stgDict != null; /* Cannot be NULL for CDataObject instances */
163+
assert stgDict != null : "Cannot be NULL for CDataObject instances";
163164
String fmt = (String) stgDict.proto;
164165
assert fmt != null;
165166

@@ -193,7 +194,7 @@ protected static PyCArgObject paramFunc(int f, CDataObject self, StgDictObject s
193194
struct_param.ptr = ptr;
194195
}
195196

196-
assert stgDict != null; /* Cannot be NULL for structure/union instances */
197+
assert stgDict != null : "Cannot be NULL for structure/union instances";
197198
parg.pffi_type = stgDict.ffi_type_pointer;
198199
parg.tag = 'V';
199200
parg.value = ptr;

0 commit comments

Comments
 (0)