76 wiersze
1.7 KiB
JavaScript
76 wiersze
1.7 KiB
JavaScript
|
|
/**
|
|
* Module dependencies.
|
|
*/
|
|
|
|
var DynamicLibrary = require('./dynamic_library')
|
|
, ForeignFunction = require('./foreign_function')
|
|
, VariadicForeignFunction = require('./foreign_function_var')
|
|
, debug = require('debug')('ffi:Library')
|
|
, RTLD_NOW = DynamicLibrary.FLAGS.RTLD_NOW
|
|
|
|
/**
|
|
* The extension to use on libraries.
|
|
* i.e. libm -> libm.so on linux
|
|
*/
|
|
|
|
var EXT = Library.EXT = {
|
|
'linux': '.so'
|
|
, 'linux2': '.so'
|
|
, 'sunos': '.so'
|
|
, 'solaris':'.so'
|
|
, 'freebsd':'.so'
|
|
, 'openbsd':'.so'
|
|
, 'darwin': '.dylib'
|
|
, 'mac': '.dylib'
|
|
, 'win32': '.dll'
|
|
}[process.platform]
|
|
|
|
/**
|
|
* Provides a friendly abstraction/API on-top of DynamicLibrary and
|
|
* ForeignFunction.
|
|
*/
|
|
|
|
function Library (libfile, funcs, lib) {
|
|
debug('creating Library object for', libfile)
|
|
|
|
if (libfile && libfile.indexOf(EXT) === -1) {
|
|
debug('appending library extension to library name', EXT)
|
|
libfile += EXT
|
|
}
|
|
|
|
if (!lib) {
|
|
lib = {}
|
|
}
|
|
var dl = new DynamicLibrary(libfile || null, RTLD_NOW)
|
|
|
|
Object.keys(funcs || {}).forEach(function (func) {
|
|
debug('defining function', func)
|
|
|
|
var fptr = dl.get(func)
|
|
, info = funcs[func]
|
|
|
|
if (fptr.isNull()) {
|
|
throw new Error('Library: "' + libfile
|
|
+ '" returned NULL function pointer for "' + func + '"')
|
|
}
|
|
|
|
var resultType = info[0]
|
|
, paramTypes = info[1]
|
|
, fopts = info[2]
|
|
, abi = fopts && fopts.abi
|
|
, async = fopts && fopts.async
|
|
, varargs = fopts && fopts.varargs
|
|
|
|
if (varargs) {
|
|
lib[func] = VariadicForeignFunction(fptr, resultType, paramTypes, abi)
|
|
} else {
|
|
var ff = ForeignFunction(fptr, resultType, paramTypes, abi)
|
|
lib[func] = async ? ff.async : ff
|
|
}
|
|
})
|
|
|
|
return lib
|
|
}
|
|
module.exports = Library
|