Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
// first get the types of variadic args we are working with
const argTypes = fixedArgTypes.slice();
let key = fixedKey.slice();
for (let i = 0; i < arguments.length; i++) {
const type = ref.coerceType(arguments[i]);
argTypes.push(type);
const ffi_type = Type(type);
assert(ffi_type.name);
key.push(getId(type));
}
// now figure out the return type
const rtnType = ref.coerceType(variadic_function_generator.returnType);
const rtnName = getId(rtnType);
assert(rtnName);
// first let's generate the key and see if we got a cache-hit
key = rtnName + key.join('');
let func = cache[key];
if (func) {
debug('cache hit for key:', key);
} else {
// create the `ffi_cif *` instance
debug('creating the variadic ffi_cif instance for key:', key);
const cif = CIF_var(returnType, argTypes, numFixedArgs, abi);
func = cache[key] = _ForeignFunction(cif, funcPtr, rtnType, argTypes);
}
return func;
function Function (retType, argTypes, abi) {
if (!(this instanceof Function)) {
return new Function(retType, argTypes, abi);
}
debug('creating new FunctionType');
// check args
assert(!!retType, 'expected a return "type" object as the first argument');
assert(Array.isArray(argTypes), 'expected Array of arg "type" objects as the second argument');
// normalize the "types" (they could be strings, so turn into real type
// instances)
this.retType = ref.coerceType(retType);
this.argTypes = argTypes.map(ref.coerceType);
this.abi = null == abi ? bindings.FFI_DEFAULT_ABI : abi;
}
function Type (type) {
type = ref.coerceType(type);
debug('Type()', type.name || type);
assert(type.indirection >= 1, 'invalid "type" given: ' + (type.name || type));
let ret;
// first we assume it's a regular "type". if the "indirection" is greater than
// 1, then we can just use "pointer" ffi_type, otherwise we hope "ffi_type" is
// set
if (type.indirection === 1) {
ret = type.ffi_type;
} else {
ret = bindings.FFI_TYPES.pointer;
}
// if "ret" isn't set (ffi_type was not set) then we check for "ref-array" type
if (!ret && type.type) {
// got a "ref-array" type
function Callback (retType, argTypes, abi, func) {
debug('creating new Callback');
if (typeof abi === 'function') {
func = abi;
abi = undefined;
}
// check args
assert(!!retType, 'expected a return "type" object as the first argument');
assert(Array.isArray(argTypes), 'expected Array of arg "type" objects as the second argument');
assert.equal(typeof func, 'function', 'expected a function as the third argument');
// normalize the "types" (they could be strings, so turn into real type
// instances)
retType = ref.coerceType(retType);
argTypes = argTypes.map(ref.coerceType);
// create the `ffi_cif *` instance
const cif = CIF(retType, argTypes, abi);
const argc = argTypes.length;
const callback = _Callback(cif, retType.size, argc, errorReportCallback, (retval, params) => {
debug('Callback function being invoked')
try {
const args = [];
for (var i = 0; i < argc; i++) {
const type = argTypes[i];
const argPtr = params.readPointer(i * ref.sizeof.pointer, type.size);
argPtr.type = type;
args.push(argPtr.deref());
}
function variadic_function_generator () {
debug('variadic_function_generator invoked');
// first get the types of variadic args we are working with
const argTypes = fixedArgTypes.slice();
let key = fixedKey.slice();
for (let i = 0; i < arguments.length; i++) {
const type = ref.coerceType(arguments[i]);
argTypes.push(type);
const ffi_type = Type(type);
assert(ffi_type.name);
key.push(getId(type));
}
// now figure out the return type
const rtnType = ref.coerceType(variadic_function_generator.returnType);
const rtnName = getId(rtnType);
assert(rtnName);
// first let's generate the key and see if we got a cache-hit
key = rtnName + key.join('');
let func = cache[key];
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
const cif = CIF(returnType, argTypes, abi);
// create and return the JS proxy function
return _ForeignFunction(cif, funcPtr, returnType, argTypes);
}