1
0
mirror of https://github.com/exaloop/codon.git synced 2025-06-03 15:03:52 +08:00
codon/stdlib/internal/dlopen.codon
Ibrahim Numanagić 12e8fe7666
@codon Python decorator and Python interop fixes (#19)
* Codon decorator

* Move to extra/cython, add error handling

* Small fixes

* CR

* CR

* Fix cython CI

* Fix cython CI v2

* Fix cython CI v3

* Fix cython CI v4

* Fix cython CI v5

* Fix cython CI v6

* Fix cython CI v7

* Fix cython CI v8

* Fix cython CI v9

* Fix cython CI v10

* Fix cython CI v11

* CR

* Fix CI

* Fix CI

* Fix CI

* Fix CI

* Fix CI

Co-authored-by: Ishak Numanagić <ishak.numanagic@gmail.com>
2022-03-31 10:22:26 +02:00

55 lines
1.1 KiB
Python

# (c) 2022 Exaloop Inc. All rights reserved.
@pure
@C
def seq_is_macos() -> bool:
pass
# <dlfcn.h>
from C import dlerror() -> cobj as c_dlerror
from C import dlopen(cobj, int) -> cobj as c_dlopen
from C import dlsym(cobj, cobj) -> cobj as c_dlsym
from C import dlclose(cobj) -> i32 as c_dlclose
RTLD_NOW = 2
RTLD_GLOBAL = 8 if seq_is_macos() else 256
RTLD_LOCAL = 0 if seq_is_macos() else 256
def dlext() -> str:
if seq_is_macos():
return "dylib"
else:
return "so"
@pure
def dlerror() -> str:
return str.from_ptr(c_dlerror())
def dlopen(name: str, flag: int = RTLD_NOW | RTLD_GLOBAL) -> cobj:
h = c_dlopen(cobj() if name == "" else name.c_str(), flag)
if h == cobj():
raise CError(dlerror())
return h
def dlsym(lib, name: str, Fn: type) -> Fn:
h = cobj()
if isinstance(lib, str):
h = dlopen(lib)
else:
h = lib
fn = c_dlsym(h, name.c_str())
if fn == cobj():
raise CError(dlerror())
return Fn(fn)
def dlclose(handle: cobj):
if c_dlclose(handle) != i32(0):
raise CError(dlerror())