invokeBindingMethodFromNativeImpl function

void invokeBindingMethodFromNativeImpl(
  1. int contextId,
  2. Pointer<NativeBindingObject> nativeBindingObject,
  3. Pointer<NativeValue> returnValue,
  4. Pointer<NativeValue> nativeMethod,
  5. int argc,
  6. Pointer<NativeValue> argv,
)

Implementation

void invokeBindingMethodFromNativeImpl(int contextId, Pointer<NativeBindingObject> nativeBindingObject,
    Pointer<NativeValue> returnValue, Pointer<NativeValue> nativeMethod, int argc, Pointer<NativeValue> argv) {
  MercuryController controller = MercuryController.getControllerOfJSContextId(contextId)!;
  dynamic method = fromNativeValue(controller.context, nativeMethod);
  List<dynamic> values = List.generate(argc, (i) {
    Pointer<NativeValue> nativeValue = argv.elementAt(i);
    return fromNativeValue(controller.context, nativeValue);
  });

  BindingObject bindingObject = controller.context.getBindingObject(nativeBindingObject);

  var result = null;
  try {
    // Method is binding call method operations from internal.
    if (method is int) {
      // Get and setter ops
      result = bindingCallMethodDispatchTable[method](bindingObject, values);
    } else {
      BindingObject bindingObject = controller.context.getBindingObject(nativeBindingObject);
      // invokeBindingMethod directly
      Stopwatch? stopwatch;
      if (isEnabledLog) {
        stopwatch = Stopwatch()..start();
      }
      result = bindingObject._invokeBindingMethodSync(method, values);
      if (isEnabledLog) {
        print('$bindingObject invokeBindingMethod method: $method args: $values result: $result time: ${stopwatch!.elapsedMicroseconds}us');
      }
    }
  } catch (e, stack) {
    print('$e\n$stack');
  } finally {
    toNativeValue(returnValue, result, bindingObject);
  }
}