fromNativeValue function

dynamic fromNativeValue(
  1. Pointer<NativeValue> nativeValue
)

Implementation

dynamic fromNativeValue(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 nativeValue.ref.float64;
    case JSValueType.TAG_POINTER:
      JSPointerType pointerType = JSPointerType.values[nativeValue.ref.float64.toInt()];
      switch (pointerType) {
        case JSPointerType.NativeBoundingClientRect:
          return Pointer.fromAddress(nativeValue.ref.u).cast<NativeBoundingClientRect>();
        case JSPointerType.NativeCanvasRenderingContext2D:
          return Pointer.fromAddress(nativeValue.ref.u).cast<NativeCanvasRenderingContext2D>();
        case JSPointerType.NativeBindingObject:
          return Pointer.fromAddress(nativeValue.ref.u).cast<NativeBindingObject>();
        default:
          return Pointer.fromAddress(nativeValue.ref.u);
      }
    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;
  }
}