std.dylib
API সারমর্ম (Beans source থেকে npm run coverage দিয়ে বানানো): 2টা type · 1টা constructor · 1টা static method · 4টা instance method · 3টা public field।
std.dylib program চলার সময়ে একটা dynamic library (একটা .so, .dylib, বা .dll) খোলে আর তাতে symbol খোঁজে। এটা std.dl-এর উপর বসানো। source দেখুন এখানে:
stdlib/std/dylib/dylib.b।
import std.dylibLibrary সবসময় RTLD_LOCAL দিয়ে খোলা হয়, তাই তাদের symbol global namespace-এ ফাঁস হয় না।
একটা symbol খুঁজে পেলে তার address পাওয়া যায়। ওটা call করতে হলে unsafe লাগবে, আর std.dl দিয়ে যেতে হবে। call function-গুলো হলো dl.call0 থেকে dl.call3 (0 থেকে 3টা argument)। প্রতিটা argument আর result একটা করে machine word, তাই এভাবে শুধু integer আর pointer-ই চলে। float, ছোট integer, আর by-value struct-এর জন্য বরং একটা ঠিকঠাক extern "C" declaration লাগবে, দেখুন FFI guide।
Symbol
“Symbol” সেকশনএকটা resolve হওয়া symbol: তার address, আর যে নাম দিয়ে ওটা খোঁজা হয়েছিল। একে ধরে রাখা নিরাপদ; call করা নিরাপদ না।
pub class Symbolnew Symbol(address: int, name: string)
pub address: intpub name: string
pub fn is_null() -> bool- address 0 হলে
is_nulltrue। একটা symbol সত্যিকারের অর্থেই address 0-তে থাকতে পারে, তাই এটা error check না, নেহাত একটা সুবিধা। আসল failureDylib.findএমনিতেই একটাerrহিসেবে জানায়।
Dylib
“Dylib” সেকশনএকটা খোলা shared library। এটা একটা unique class: move-only, আর drop হলে নিজেই বন্ধ হয়ে যায়।
pub unique class Dylibpub path: string
pub static fn open(path: string) -> Result<Dylib>
pub fn find(name: string) -> Result<Symbol>pub fn has(name: string) -> boolpub fn close() -> Result<bool>openpath দিয়ে একটা library খোলে। fail করলেnot_foundkind দেয়, সাথে loader-এর নিজের message, যেটা আসল সমস্যাটা missing dependency হলে সেটার নাম বলে দেয়।findএকটা symbol খোঁজে; symbol না থাকলেnot_foundkind।hasজানায় একটা symbol আছে কি না, তার না-থাকাকে error না ধরেই — একটা optional entry point পরখ করার জন্য এটা কাজের।closelibrary বন্ধ করে। এটা থেকে পাওয়া প্রতিটা address invalid হয়ে যায়, আর তার পরে একটা call করা undefined। ইতিমধ্যে বন্ধ হওয়া library-তেfind,has, বাcloseকরলেclosedkind ফেরত (hasfalseফেরত দেয়)।
import std.ioimport std.dylib
fn main() { let lib: dylib.Dylib = dylib.Dylib.open("libm.so.6").expect("open") if lib.has("cos") { let sym: dylib.Symbol = lib.find("cos").expect("find") io.println("cos at {sym.address}") // calling it needs unsafe + std.dl, and cos takes a float, // so it really needs an extern "C" declaration. }}আরও দেখুন
“আরও দেখুন” সেকশন- Unsafe guide,
unsafeকী কী করতে দেয়। - FFI guide, float আর struct সহ C call করার নিরাপদ, typed উপায়।