mirror of
https://github.com/logos-messaging/libchat.git
synced 2026-03-26 22:23:14 +00:00
* chore(nim-bindings): replace dynlib dlopen with plain importc
The dynlib pragma hard-coded a library path and resolved it via dlopen() at
runtime, preventing static linking and forcing a specific load-time path.
Using bare {.importc.} lets consumers choose: link liblibchat dynamically
at link time (--passL:-llibchat) or link it statically into their binary.
* Rust -> Nim ABI (#62)
* Use correct build hook
* force sret like return from rust code for nim compatibility
* Fix target mismatch
* Update usages
* ci: add nim-bindings-test
* fix(nim-bindings): fix ABI mismatch in destroy_* FFI functions and add defer-based cleanup
Nim's C backend silently transforms large struct parameters (>16 bytes) into
pointer parameters when calling importc functions. The destroy_* functions were
declared taking T by value in Rust, but Nim always passed &T — causing Rust to
read garbage from the stack on x86-64 (SIGILL on CI) while accidentally working
on ARM64 macOS due to that ABI coincidentally also using pointers for large structs.
Fix by changing all destroy_* functions to take &mut T and using drop_in_place,
which is the correct idiom for dropping a value through a pointer.
On the Nim side, replace scattered manual destroy calls with defer, which
guarantees cleanup on all exit paths and prevents use-after-destroy bugs.
---------
Co-authored-by: Jazz Turner-Baggs <473256+jazzz@users.noreply.github.com>
27 lines
547 B
Nim
27 lines
547 B
Nim
# Package
|
|
|
|
version = "0.1.0"
|
|
author = "libchat"
|
|
description = "Nim Bindings for LibChat"
|
|
license = "MIT"
|
|
srcDir = "src"
|
|
bin = @["libchat"]
|
|
|
|
|
|
# Dependencies
|
|
|
|
requires "nim >= 2.2.4"
|
|
requires "results"
|
|
|
|
proc buildRust() =
|
|
exec "cargo build --release --manifest-path ../Cargo.toml"
|
|
|
|
|
|
# Build Rust library before compiling Nim
|
|
before build:
|
|
buildRust()
|
|
|
|
task pingpong, "Run pingpong example":
|
|
buildRust()
|
|
exec "nim c -r --path:src --passL:../target/release/liblibchat.a --passL:-lm examples/pingpong.nim"
|