Jordan, You are oh, so right! Thank you for helping me resolve a particularly major piece of stupidity on my part.
The following code seems (subject to testing, of course), achieve what I’m looking for: public extension String { public func localized(dsoHandle : UnsafeRawPointer = #dsohandle) -> String { var dlInformation : dl_info = dl_info() let _ = dladdr(dsoHandle, &dlInformation) let path = String(cString: dlInformation.dli_fname) let url = URL(fileURLWithPath: path).deletingLastPathComponent() let bundle = Bundle(url: url) let str = bundle?.localizedString(forKey: self, value: self, table: nil) return str! } } Cheers, Rick > On Dec 2, 2016, at 5:37 PM, Jordan Rose <jordan_r...@apple.com> wrote: > > >> On Dec 2, 2016, at 15:36, Rick Aurbach <rla...@icloud.com >> <mailto:rla...@icloud.com>> wrote: >> >> Greg, >> >> This is looking quite strange, because I didn’t see anything like what I >> expected. >> >> Here’s the code that I’ve been using to test #dsohandle: >> >> public extension String { >> >> public func localized(dsoHandle : UnsafeRawPointer = #dsohandle) { >> var dlInformation : dl_info = dl_info() >> let _ = dladdr(dsoHandle, &dlInformation) >> let path = String(describing: dlInformation.dli_fname!) > > ^ You asked for a string describing a pointer and you got one. :-) Try > String(cString:) instead. > > > >> let bundle = Bundle(path: path) >> } >> } >> >> which is consistent with the following excerpt from the header file: >> >> /* >> * Structure filled in by dladdr(). >> */ >> public struct dl_info { >> >> public var dli_fname: UnsafePointer<Int8>! /* Pathname of shared object >> */ >> >> public var dli_fbase: UnsafeMutableRawPointer! /* Base address of shared >> object */ >> >> public var dli_sname: UnsafePointer<Int8>! /* Name of nearest symbol */ >> >> public var dli_saddr: UnsafeMutableRawPointer! /* Address of nearest >> symbol */ >> >> public init() >> >> public init(dli_fname: UnsafePointer<Int8>!, dli_fbase: >> UnsafeMutableRawPointer!, dli_sname: UnsafePointer<Int8>!, dli_saddr: >> UnsafeMutableRawPointer!) >> } >> public typealias Dl_info = dl_info >> >> public func dladdr(_: UnsafeRawPointer!, _: UnsafeMutablePointer<Dl_info>!) >> -> Int32 >> /* not POSIX */ >> >> >> I would have expected path to look something like a URL. However, here is >> what the debugger says (with a breakpoint on the “let bundle…” line: >> >> <Capto_Annotation.png> >> >> As you can see, dli_fname doesn’t look anything like the “pathname of the >> shared object”. Instead it looks more like the address where it was loaded. >> Which, unfortunately, doesn’t get me any further along. >> >> Thoughts? >> >> Has this gotten hairy (and time consuming) enough that I should handle this >> as a Technical Incident?? >> >> Cheers, >> >> Rick Aurbach >> >>> On Dec 2, 2016, at 3:08 PM, Greg Parker <gpar...@apple.com >>> <mailto:gpar...@apple.com>> wrote: >>> >>> On Darwin #dsohandle points to a Mach-O file header. You can pass that >>> address to dyld but I don't see an easy way to pass it to NSBundle. >>> >>> This might work: >>> 1. Pass #dsohandle to dladdr() >>> 2. Pass the dli_fname returned by dladdr() to NSBundle(path:). >>> >>> >>>> On Dec 2, 2016, at 12:50 PM, Rick Aurbach <rla...@icloud.com >>>> <mailto:rla...@icloud.com>> wrote: >>>> >>>> Jordan, >>>> >>>> I agree — #dsohandle is, indeed, little known. In fact, I’m having a devil >>>> of a time figuring out what it is and what I can do with it. It is clearly >>>> an UnsafeRawPointer, but to what?? >>>> >>>> Can you offer either a reference or a few lines of code that can help me >>>> get the information I need from it? [recall that I want the framework’s >>>> bundle so I can find it’s localized.strings file]. >>>> >>>> Cheers, >>>> >>>> Rick Aurbach >>>> >>>>> On Dec 2, 2016, at 12:56 PM, Jordan Rose <jordan_r...@apple.com >>>>> <mailto:jordan_r...@apple.com>> wrote: >>>>> >>>>> On Apple platforms, we'd probably prefer you use the little-known >>>>> #dsoHandle, a magic pointer that's unique to the current dylib. Parsing >>>>> out a module name seems incredibly brittle; the form of #function is not >>>>> guaranteed to be stable or useful across Swift versions. >>>>> >>>>> Jordan >> >> >
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users