-
Notifications
You must be signed in to change notification settings - Fork 217
Add C Closures #1228
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Add C Closures #1228
Conversation
|
Thank you! Could you please add a test to api-test.c? |
quickjs.c
Outdated
| JSValue JS_NewCClosure(JSContext *ctx, JSCClosure *func, | ||
| int length, int magic, void *opaque, | ||
| void (*opaque_finalize)(void*)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For consistency with e.g. JS_SetModuleLoaderFunc:
| JSValue JS_NewCClosure(JSContext *ctx, JSCClosure *func, | |
| int length, int magic, void *opaque, | |
| void (*opaque_finalize)(void*)) | |
| JSValue JS_NewCClosure(JSContext *ctx, JSCClosure *func, | |
| void (*opaque_finalize)(void*), | |
| int length, int magic, void *opaque) |
And I'd add a typedef for the finalizer callback.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll defer to your judgement here, but after implementing it, it feels awkward to separate the finalizer from the data pointer. Other apis which accept opaque pointers do not have to manage the lifecycle of that pointer. Keeping the opaque_finalize argument last keeps the first 5 arguments consistent with the related JS_CFunction* apis.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
JS_EXTERN JSValue JS_NewCFunctionData2(JSContext *ctx, JSCFunctionData *func,
const char *name,
int length, int magic, int data_len,
JSValueConst *data);
typedef void JSCClosureFinalizerFunc(void*);
JS_EXTERN JSValue JS_NewCClosure(JSContext *ctx, JSCClosure *func,
const char* name,
int length, int magic,
void* opaque, JSCClosureFinalizerFunc *opaque_finalize);
This allows C objects to be attached to functions, and it also allows C code to be notified when these functions are finalized. Co-Authored-By: Andrew Krieger <[email protected]>
- Add typedef for JSCClosureFinalizerFunc - Add `name` parameter to JS_NewCClosure - Wrap closure invocation with temporary JS stack frame for debugging.
|
Ooops forgot the test. |
This allows C objects to be attached to functions, and it also allows C code to be notified when these functions are finalized.
Import of https://github.com/tbluemel/quickjscpp/blob/98bf1ddb00e39d93840c4b67211c9260943b5a83/patches/2024-01-13/0001-Add-C-Closures.patch. Trivial renaming of functions and function annotations to match local style.
Closes #1212. Closes tbluemel/quickjscpp#3.