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.TAG_STRING:
      Pointer<NativeString> nativeString = Pointer.fromAddress(nativeValue.ref.u);
      String result = nativeStringToString(nativeString);
      freeNativeString(nativeString);
      return result;
    case JSValueType.TAG_INT:
      return nativeValue.ref.u;
    case JSValueType.TAG_BOOL:
      return nativeValue.ref.u == 1;
    case JSValueType.TAG_NULL:
      return null;
    case JSValueType.TAG_FLOAT64:
      return uInt64ToDouble(nativeValue.ref.u);
    case JSValueType.TAG_POINTER:
      JSPointerType pointerType = JSPointerType.values[nativeValue.ref.uint32];
      if (pointerType == JSPointerType.NativeBindingObject) {
        return view.getBindingObject(Pointer.fromAddress(nativeValue.ref.u));
      }

      return Pointer.fromAddress(nativeValue.ref.u);
    case JSValueType.TAG_LIST:
      Pointer<NativeValue> head = Pointer.fromAddress(nativeValue.ref.u).cast<NativeValue>();
      List result = List.generate(nativeValue.ref.uint32, (index) {
        return fromNativeValue(view, head.elementAt(index));
      });
      malloc.free(head);
      return result;
    case JSValueType.TAG_FUNCTION:
    case JSValueType.TAG_ASYNC_FUNCTION:
      break;
    case JSValueType.TAG_JSON:
      Pointer<NativeString> nativeString = Pointer.fromAddress(nativeValue.ref.u);
      dynamic value = jsonDecode(nativeStringToString(nativeString));
      freeNativeString(nativeString);
      return value;
    case JSValueType.TAG_UINT8_BYTES:
      Pointer<Uint8> buffer = Pointer.fromAddress(nativeValue.ref.u);
      return buffer.asTypedList(nativeValue.ref.uint32);
  }
}