JSObject.makeFunctionWithCallback constructor

JSObject.makeFunctionWithCallback(
  1. JSContext context, {
  2. String? name,
  3. JSObjectCallAsFunctionCallback? callAsFunction,
  4. bool autoDispose = true,
})

Convenience method for creating a JavaScript function with a given callback as its implementation. name A JSString containing the function's name. This will be used when converting the function to string. Pass NULL to create an anonymous function. callAsFunction The JSObjectCallAsFunctionCallback to invoke when the function is called.

Implementation

JSObject.makeFunctionWithCallback(
  this.context, {
  String? name,
  JSObjectCallAsFunctionCallback? callAsFunction,
  bool autoDispose = true,
}) {
  _callAsFunctionNC = NativeCallable.isolateLocal((
    JSContextRef ctx1,
    JSObjectRef function,
    JSObjectRef thiz,
    int argc,
    Pointer<JSValueRef> argv,
    Pointer<JSValueRef> exception,
  ) {
    final ctxw = JSContext(ctx1, autoDispose: false);
    final jsfunc = JSObject(ctxw, function, autoDispose: false);
    final jsthiz = JSObject(ctxw, thiz, autoDispose: false);
    final argvlist = <JSValue>[];

    for (int i = 0; i < argc; i++) {
      argvlist.add(JSValue(ctxw, argv[i]));
    }
    final jsexc = JSException(ctxw, exception);
    // auto release donot manual free
    final ret =
        callAsFunction
            ?.call(ctxw, jsfunc, jsthiz, argc, argvlist, jsexc)
            .ref ??
        nullptr;
    if (jsexc.shouldThrow) throw jsexc.error;
    return ret;
  });
  final JSString? jsname = name != null ? JSString.fromString(name) : null;
  _ref = JSObjectMakeFunctionWithCallback(
    context.ref,
    jsname?.ref ?? nullptr,
    _callAsFunctionNC?.nativeFunction ?? nullptr,
  );
  attach(calloc.nativeFree, _ref.cast(), autoDispose: autoDispose);
}