fromNativeValue function
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);
}
}