From c82e69a997dd3bb02ad2e59515937428ba9379ae Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Tue, 23 Feb 2021 15:18:38 -0500 Subject: [PATCH] Added import-shared-object --- CHANGELOG.md | 1 + runtime.c | 20 +++++++++++++------- scheme/eval.sld | 5 +++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index be517947..3102e5f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ Features - Arthur Maciel added `opaque?` and `opaque-null?` predicates to `(cyclone foreign)`. +- Added `import-shared-object` to `(scheme eval)` to allow loading a third party C shared library. Bug Fixes diff --git a/runtime.c b/runtime.c index f7954ed4..705bfc08 100644 --- a/runtime.c +++ b/runtime.c @@ -6946,14 +6946,20 @@ void Cyc_import_shared_object(void *data, object cont, object filename, object e } dlerror(); /* Clear any existing error */ - entry_pt = (function_type) dlsym(handle, string_str(entry_pt_fnc)); - if (entry_pt == NULL) { - snprintf(buffer, 256, "%s, %s, %s", string_str(filename), string_str(entry_pt_fnc), dlerror()); - make_utf8_string(data, s, buffer); - Cyc_rt_raise2(data, "Unable to load symbol", &s); + if (string_len(entry_pt_fnc) == 0) { + // No entry point so this is a third party library. + // Just call into our continuation + return_closcall1(data, cont, boolean_t); + } else { + entry_pt = (function_type) dlsym(handle, string_str(entry_pt_fnc)); + if (entry_pt == NULL) { + snprintf(buffer, 256, "%s, %s, %s", string_str(filename), string_str(entry_pt_fnc), dlerror()); + make_utf8_string(data, s, buffer); + Cyc_rt_raise2(data, "Unable to load symbol", &s); + } + mclosure1(clo, entry_pt, cont); + entry_pt(data, 0, &clo, &clo); } - mclosure1(clo, entry_pt, cont); - entry_pt(data, 0, &clo, &clo); } /** Read */ diff --git a/scheme/eval.sld b/scheme/eval.sld index 5a8f14a7..d7d2f0a6 100644 --- a/scheme/eval.sld +++ b/scheme/eval.sld @@ -26,6 +26,8 @@ %import imported? %set-import-dirs! + import-shared-object + ;; Macros *defined-macros* get-macros macro:macro? @@ -810,6 +812,9 @@ (define (imported? lis) (c:lib-loaded? (lib:name->unique-string (lib:list->import-set lis)))) +(define (import-shared-object filename) + (c:import-shared-obj filename "")) + ;; Wrapper around the actual shared object import function (define-c c:import-shared-obj "(void *data, int argc, closure _, object k, object fn, object entry_fnc)"