diff options
| author | Laytan Laats <laytanlaats@hotmail.com> | 2024-01-06 01:52:23 +0100 |
|---|---|---|
| committer | Laytan Laats <laytanlaats@hotmail.com> | 2024-01-06 02:08:11 +0100 |
| commit | 85b71708dd715c878637da317fad748769e595d6 (patch) | |
| tree | 5a21dd83427bd8b79a3a9a0df19d1c20492c14c0 /core/dynlib | |
| parent | 649b5fa528834a973c19a0624025970946bc6fd0 (diff) | |
dynlib: add last_error procedure
Diffstat (limited to 'core/dynlib')
| -rw-r--r-- | core/dynlib/lib.odin | 19 | ||||
| -rw-r--r-- | core/dynlib/lib_js.odin | 4 | ||||
| -rw-r--r-- | core/dynlib/lib_unix.odin | 5 | ||||
| -rw-r--r-- | core/dynlib/lib_windows.odin | 7 |
4 files changed, 33 insertions, 2 deletions
diff --git a/core/dynlib/lib.odin b/core/dynlib/lib.odin index 183ddd724..6a5c919a3 100644 --- a/core/dynlib/lib.odin +++ b/core/dynlib/lib.odin @@ -34,6 +34,7 @@ Example: LIBRARY_PATH :: "my_library.dll" library, ok := dynlib.load_library(LIBRARY_PATH) if ! ok { + fmt.eprintln(dynlib.last_error()) return } fmt.println("The library %q was successfully loaded", LIBRARY_PATH) @@ -58,10 +59,12 @@ Example: LIBRARY_PATH :: "my_library.dll" library, ok := dynlib.load_library(LIBRARY_PATH) if ! ok { + fmt.eprintln(dynlib.last_error()) return } did_unload := dynlib.unload_library(library) if ! did_unload { + fmt.eprintln(dynlib.last_error()) return } fmt.println("The library %q was successfully unloaded", LIBRARY_PATH) @@ -89,11 +92,16 @@ Example: LIBRARY_PATH :: "my_library.dll" library, ok := dynlib.load_library(LIBRARY_PATH) if ! ok { + fmt.eprintln(dynlib.last_error()) return } a, found_a := dynlib.symbol_address(library, "a") - if found_a do fmt.printf("The symbol %q was found at the address %v", "a", a) + if found_a { + fmt.printf("The symbol %q was found at the address %v", "a", a) + } else { + fmt.eprintln(dynlib.last_error()) + } } */ symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found: bool) #optional_ok { @@ -166,4 +174,11 @@ initialize_symbols :: proc(symbol_table: ^$T, library_name: string, symbol_prefi } } return count, count > 0 -}
\ No newline at end of file +} + +/* +Returns an error message for the last failed procedure call. +*/ +last_error :: proc() -> string { + return _last_error() +} diff --git a/core/dynlib/lib_js.odin b/core/dynlib/lib_js.odin index ace1b0939..866874ee8 100644 --- a/core/dynlib/lib_js.odin +++ b/core/dynlib/lib_js.odin @@ -13,3 +13,7 @@ _unload_library :: proc(library: Library) -> bool { _symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found: bool) { return nil, false } + +_last_error :: proc() -> string { + return "" +} diff --git a/core/dynlib/lib_unix.odin b/core/dynlib/lib_unix.odin index b0cc37e99..97f70b576 100644 --- a/core/dynlib/lib_unix.odin +++ b/core/dynlib/lib_unix.odin @@ -22,3 +22,8 @@ _symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found found = ptr != nil return } + +_last_error :: proc() -> string { + err := os.dlerror() + return "unknown" if err == "" else err +} diff --git a/core/dynlib/lib_windows.odin b/core/dynlib/lib_windows.odin index 67880df4b..9a1b5f998 100644 --- a/core/dynlib/lib_windows.odin +++ b/core/dynlib/lib_windows.odin @@ -5,6 +5,7 @@ package dynlib import win32 "core:sys/windows" import "core:strings" import "core:runtime" +import "core:reflect" _load_library :: proc(path: string, global_symbols := false) -> (Library, bool) { // NOTE(bill): 'global_symbols' is here only for consistency with POSIX which has RTLD_GLOBAL @@ -27,3 +28,9 @@ _symbol_address :: proc(library: Library, symbol: string) -> (ptr: rawptr, found found = ptr != nil return } + +_last_error :: proc() -> string { + err := win32.System_Error(win32.GetLastError()) + err_msg := reflect.enum_string(err) + return "unknown" if err_msg == "" else err_msg +} |