Skip to content

Commit 9c3fbb6

Browse files
committed
Set correct DLL flags in ctypes
1 parent 7e9cca6 commit 9c3fbb6

File tree

3 files changed

+28
-11
lines changed

3 files changed

+28
-11
lines changed

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/NtModuleBuiltins.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@
7979

8080
@CoreFunctions(defineModule = "nt", isEager = true)
8181
public final class NtModuleBuiltins extends PythonBuiltins {
82+
83+
public static final int LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR = 0x100;
84+
public static final int LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x1000;
85+
8286
@Override
8387
protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFactories() {
8488
return NtModuleBuiltinsFactory.getFactories();
@@ -88,8 +92,8 @@ protected List<? extends NodeFactory<? extends PythonBuiltinBaseNode>> getNodeFa
8892
public void initialize(Python3Core core) {
8993
super.initialize(core);
9094
if (PythonLanguage.getPythonOS() == PythonOS.PLATFORM_WIN32) {
91-
addBuiltinConstant("_LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR", 0x100);
92-
addBuiltinConstant("_LOAD_LIBRARY_SEARCH_DEFAULT_DIRS", 0x1000);
95+
addBuiltinConstant("_LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR", LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR);
96+
addBuiltinConstant("_LOAD_LIBRARY_SEARCH_DEFAULT_DIRS", LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
9397
core.removeBuiltinModule(T_POSIX);
9498
} else {
9599
core.removeBuiltinModule(T_NT);

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
import com.oracle.graal.python.builtins.PythonBuiltinClassType;
9999
import com.oracle.graal.python.builtins.PythonBuiltins;
100100
import com.oracle.graal.python.annotations.PythonOS;
101+
import com.oracle.graal.python.builtins.modules.NtModuleBuiltins;
101102
import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins.FsConverterNode;
102103
import com.oracle.graal.python.builtins.modules.SysModuleBuiltins.AuditNode;
103104
import com.oracle.graal.python.builtins.modules.ctypes.CFieldBuiltins.GetFuncNode;
@@ -623,13 +624,22 @@ protected abstract static class DlOpenNode extends PythonTernaryClinicBuiltinNod
623624
private static final TruffleString MACOS_Security_LIB = tsLiteral("/System/Library/Frameworks/Security.framework/Security");
624625
private static final TruffleString MACOS_CoreFoundation_LIB = tsLiteral("/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation");
625626

626-
private static final String T_RTLD_LOCAL = "RTLD_LOCAL|RTLD_NOW";
627-
private static final String T_RTLD_GLOBAL = "RTLD_GLOBAL|RTLD_NOW";
628-
629627
private static final TruffleLogger LOGGER = PythonLanguage.getLogger(DlOpenNode.class);
630628

631629
protected static String flagsToString(int flag) {
632-
return (flag & RTLD_LOCAL.getValueIfDefined()) != 0 ? T_RTLD_LOCAL : T_RTLD_GLOBAL;
630+
StringBuilder sb = new StringBuilder("RTLD_NOW");
631+
if ((flag & RTLD_LOCAL.getValueIfDefined()) != 0) {
632+
sb.append("| RTLD_LOCAL");
633+
} else {
634+
sb.append("| RTLD_GLOBAL");
635+
}
636+
if ((flag & NtModuleBuiltins.LOAD_LIBRARY_SEARCH_DEFAULT_DIRS) != 0) {
637+
sb.append("| LOAD_LIBRARY_SEARCH_DEFAULT_DIRS");
638+
}
639+
if ((flag & NtModuleBuiltins.LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR) != 0) {
640+
sb.append("| LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR");
641+
}
642+
return sb.toString();
633643
}
634644

635645
@Override

graalpython/lib-graalpython/_nt.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,21 +41,24 @@
4141

4242

4343
def _add_dll_directory(path):
44-
# TODO error handling
45-
import ctypes
44+
import ctypes, os
4645
AddDllDirectory = ctypes.windll.kernel32['AddDllDirectory']
4746
AddDllDirectory.argtypes = [ctypes.c_wchar_p]
4847
AddDllDirectory.restype = ctypes.c_void_p
49-
return AddDllDirectory(path)
48+
result = AddDllDirectory(os.fspath(path))
49+
if result == 0:
50+
raise OSError(f"add_dll_directory: {ctypes.windll.kernel32.GetLastError()}")
51+
return result
5052

5153

5254
def _remove_dll_directory(cookie):
53-
# TODO error handling
5455
import ctypes
5556
RemoveDllDirectory = ctypes.windll.kernel32['RemoveDllDirectory']
5657
RemoveDllDirectory.argtypes = [ctypes.c_void_p]
5758
RemoveDllDirectory.restype = ctypes.c_int
58-
RemoveDllDirectory(cookie)
59+
result = RemoveDllDirectory(cookie)
60+
if result == 0:
61+
raise OSError(f"remove_dll_directory: {ctypes.windll.kernel32.GetLastError()}")
5962

6063

6164
nt._add_dll_directory = _add_dll_directory

0 commit comments

Comments
 (0)