fromNativeValue function

dynamic fromNativeValue(
  1. WebFViewController view,
  2. Pointer<NativeValue> nativeValue
)

Implementation

dynamic fromNativeValue(WebFViewController view, Pointer<NativeValue> nativeValue) {
  if (nativeValue == nullptr) return null;

  JSValueType type = JSValueType.values[nativeValue.ref.tag];
  switch (type) {
    case JSValueType.tagString:
      Pointer<NativeString> nativeString = Pointer.fromAddress(nativeValue.ref.u);
      String result = nativeStringToString(nativeString);
      freeNativeString(nativeString);
      return result;
    case JSValueType.tagInt:
      return nativeValue.ref.u;
    case JSValueType.tagBool:
      return nativeValue.ref.u == 1;
    case JSValueType.tagNull:
      return null;
    case JSValueType.tagUndefined:
      return null; // Dart doesn't have undefined, so we return null but the caller can check the tag
    case JSValueType.tagFloat64:
      return uInt64ToDouble(nativeValue.ref.u);
    case JSValueType.tagPointer:
      JSPointerType pointerType = JSPointerType.values[nativeValue.ref.uint32];

      if (pointerType == JSPointerType.nativeByteData) {
        return NativeByteData(Pointer.fromAddress(nativeValue.ref.u));
      }

      if (pointerType.index < JSPointerType.nativeByteData.index) {
        return view.getBindingObject(Pointer.fromAddress(nativeValue.ref.u));
      }

      return Pointer.fromAddress(nativeValue.ref.u);
    case JSValueType.tagList:
      Pointer<NativeValue> head = Pointer.fromAddress(nativeValue.ref.u).cast<NativeValue>();
      List result = List.generate(nativeValue.ref.uint32, (index) {
        return fromNativeValue(view, head + index);
      });
      malloc.free(head);
      return result;
    case JSValueType.tagFunction:
    case JSValueType.tagAsyncFunction:
      return JSFunction(view, Pointer<NativeJSFunctionRef>.fromAddress(nativeValue.ref.u));
    case JSValueType.tagJson:
      Pointer<NativeString> nativeString = Pointer.fromAddress(nativeValue.ref.u);
      dynamic value = jsonDecode(nativeStringToString(nativeString));
      freeNativeString(nativeString);
      return value;
    case JSValueType.tagUint8Bytes:
      Pointer<Uint8> buffer = Pointer.fromAddress(nativeValue.ref.u);
      return buffer.asTypedList(nativeValue.ref.uint32);
  }
}