ffi
Version:
A foreign function interface (FFI) for Node.js
39 lines (30 loc) • 1.26 kB
JavaScript
/**
* Module dependencies.
*/
var CIF = require('./cif')
, _ForeignFunction = require('./_foreign_function')
, debug = require('debug')('ffi:ForeignFunction')
, assert = require('assert')
, ref = require('ref')
/**
* Represents a foreign function in another library. Manages all of the aspects
* of function execution, including marshalling the data parameters for the
* function into native types and also unmarshalling the return from function
* execution.
*/
function ForeignFunction (funcPtr, returnType, argTypes, abi) {
debug('creating new ForeignFunction', funcPtr)
// check args
assert(Buffer.isBuffer(funcPtr), 'expected Buffer as first argument')
assert(!!returnType, 'expected a return "type" object as the second argument')
assert(Array.isArray(argTypes), 'expected Array of arg "type" objects as the third argument')
// normalize the "types" (they could be strings,
// so turn into real type instances)
returnType = ref.coerceType(returnType)
argTypes = argTypes.map(ref.coerceType)
// create the `ffi_cif *` instance
var cif = CIF(returnType, argTypes, abi)
// create and return the JS proxy function
return _ForeignFunction(cif, funcPtr, returnType, argTypes)
}
module.exports = ForeignFunction