invokeMethod method

dynamic invokeMethod(
  1. Pointer<Void> ctxHandle,
  2. Pointer<QjsResult> obj,
  3. String name,
  4. List args,
)

Implementation

dynamic invokeMethod(
  Pointer<Void> ctxHandle,
  Pointer<QjsResult> obj,
  String name,
  List<dynamic> args,
) {
  final cname = name.toNativeUtf8();
  final out = ffi.calloc<QjsResult>();
  final cargs = ffi.calloc<QjsResult>(args.length);
  for (var i = 0; i < args.length; i++) {
    QuickJsFFI.writeOut(cargs + i, args[i]);
  }

  _invokeMethod(ctxHandle, obj, cname, cargs, args.length, out);

  ffi.malloc.free(cname);
  for (var i = 0; i < args.length; i++) {
    _freeResult(cargs + i);
  }
  ffi.calloc.free(cargs);

  if (out.ref.error != 0) {
    final msg = out.ref.s.address == 0
        ? 'Unknown error'
        : out.ref.s.toDartString();
    _freeResult(out);
    ffi.calloc.free(out);
    throw Exception(msg);
  }

  final res = convertQjsResultToDart(out.ref);
  if (out.ref.type == qjsTypeObject || out.ref.type == qjsTypeFunction) {
    _freeValue(ctxHandle, out);
  }
  _freeResult(out);
  ffi.calloc.free(out);
  return res;
}