@yuuang/ffi-rs-win32-x64-msvc
Advanced tools
Comparing version 1.0.76 to 1.0.77-alpha.0
{ | ||
"name": "@yuuang/ffi-rs-win32-x64-msvc", | ||
"version": "1.0.76", | ||
"version": "1.0.77-alpha.0", | ||
"os": [ | ||
@@ -5,0 +5,0 @@ "win32" |
132
README.md
@@ -357,3 +357,3 @@ # ffi-rs | ||
`Pointer` is complicated and underlying, `ffi-rs` provide four functions to handle this pointer include `createPointer`, `restorePointer`, `wrapPointer`, `unwrapPointer` for different scene. | ||
`Pointer` is complicated and underlying, `ffi-rs` provide four functions to handle this pointer include `createPointer`, `restorePointer`, `unwrapPointer`, `wrapPointer`, `freePointer` for different scene. | ||
@@ -458,2 +458,16 @@ ```cpp | ||
#### freePointer | ||
`freePointer` is used to free memory which are not be freed automatically. | ||
At default, `ffi-rs` will free data memory for ffi call args and return result prevent memory leak.Except in the following cases. | ||
- set `freeResultMemory: false` when call `load` method | ||
If you set freeResultMemory to false, `ffi-rs` will not release the return result memory which was malloc in c environment | ||
- Use `DataType.External` as paramsType or retType | ||
If developers use `DataType.External` as paramsType or retType, please use `freePointer` to release the memory of pointer. ref [test.ts](./test.ts#170) | ||
#### wrapPointer | ||
@@ -478,3 +492,2 @@ | ||
const wrapPtr = wrapPointer([ptr])[0] | ||
``` | ||
@@ -536,3 +549,3 @@ #### unwrapPointer | ||
`ffi-rs` supports passing js function to c, like this | ||
`ffi-rs` supports passing js function pointer to c function, like this. | ||
@@ -571,60 +584,58 @@ ```cpp | ||
```js | ||
let count = 0; | ||
const func = (a, b, c, d, e, f, g) => { | ||
equal(a, 100); | ||
equal(b, false); | ||
equal(c, "Hello, World!"); | ||
equal(d, "100.11"); | ||
deepStrictEqual(e, ["Hello", "world"]); | ||
deepStrictEqual(f, [101, 202, 303]); | ||
deepStrictEqual(g, person); | ||
console.log("callback called"); | ||
count++; | ||
if (count === 4) { | ||
logGreen("test succeed"); | ||
process.exit(0); | ||
} | ||
}; | ||
const funcExternal = createPointer({ | ||
paramsType: [funcConstructor({ | ||
paramsType: [ | ||
DataType.I32, | ||
DataType.Boolean, | ||
DataType.String, | ||
DataType.Double, | ||
arrayConstructor({ type: DataType.StringArray, length: 2 }), | ||
arrayConstructor({ type: DataType.I32Array, length: 3 }), | ||
personType, | ||
], | ||
const testFunction = () => { | ||
const func = (a, b, c, d, e, f, g) => { | ||
equal(a, 100); | ||
equal(b, false); | ||
equal(c, "Hello, World!"); | ||
equal(d, "100.11"); | ||
deepStrictEqual(e, ["Hello", "world"]); | ||
deepStrictEqual(f, [101, 202, 303]); | ||
deepStrictEqual(g, person); | ||
logGreen("test function succeed"); | ||
// free function memory when it not in use | ||
freePointer({ | ||
paramsType: [funcConstructor({ | ||
paramsType: [ | ||
DataType.I32, | ||
DataType.Boolean, | ||
DataType.String, | ||
DataType.Double, | ||
arrayConstructor({ type: DataType.StringArray, length: 2 }), | ||
arrayConstructor({ type: DataType.I32Array, length: 3 }), | ||
personType, | ||
], | ||
retType: DataType.Void, | ||
})], | ||
paramsValue: funcExternal | ||
}) | ||
if (!process.env.MEMORY) { | ||
close("libsum"); | ||
} | ||
}; | ||
// suggest use createPointer to create a function pointer for manual memory management | ||
const funcExternal = createPointer({ | ||
paramsType: [funcConstructor({ | ||
paramsType: [ | ||
DataType.I32, | ||
DataType.Boolean, | ||
DataType.String, | ||
DataType.Double, | ||
arrayConstructor({ type: DataType.StringArray, length: 2 }), | ||
arrayConstructor({ type: DataType.I32Array, length: 3 }), | ||
personType, | ||
], | ||
retType: DataType.Void, | ||
})], | ||
paramsValue: [func] | ||
}) | ||
load({ | ||
library: "libsum", | ||
funcName: "callFunction", | ||
retType: DataType.Void, | ||
})], | ||
paramsValue: [func] | ||
}) | ||
load({ | ||
library: "libsum", | ||
funcName: "callFunction", | ||
retType: DataType.Void, | ||
paramsType: [funcConstructor({ | ||
paramsType: [ | ||
DataType.I32, | ||
DataType.Boolean, | ||
DataType.String, | ||
DataType.Double, | ||
arrayConstructor({ type: DataType.StringArray, length: 2 }), | ||
arrayConstructor({ type: DataType.I32Array, length: 3 }), | ||
personType, | ||
DataType.External, | ||
], | ||
retType: DataType.Void, | ||
})], | ||
paramsValue: [func] | ||
}); | ||
load({ | ||
library: "libsum", | ||
funcName: "callFunction", | ||
retType: DataType.Void, | ||
paramsType: [ | ||
DataType.External, | ||
], | ||
paramsValue: unwrapPointer(funcExternal), | ||
}); | ||
paramsValue: unwrapPointer(funcExternal), | ||
}); | ||
} | ||
``` | ||
@@ -681,2 +692,7 @@ | ||
}) | ||
freePointer({ | ||
paramsType: [DataType.External], | ||
paramsValue: [classPointer], | ||
pointerType: PointerType.CPointer | ||
}) | ||
``` | ||
@@ -683,0 +699,0 @@ |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
591300
733
2