convertQjsResultToDart static method
将 FFI 的 QjsResult 转换为 Dart 对象
Implementation
static dynamic convertQjsResultToDart(QjsResult res) {
switch (res.type) {
case qjsTypeUndefined:
case qjsTypeNull:
return null;
case qjsTypeBool:
return res.b != 0;
case qjsTypeInt64:
return res.i64;
case qjsTypeFloat64:
return res.f64;
case qjsTypeString:
return res.s.address == 0 ? '' : res.s.toDartString();
case qjsTypeObject:
case qjsTypeFunction:
if (res.data.address == 0) {
// 如果没有二进制数据,但有 i64 指针,说明是一个存活的 JS 对象引用
if (res.i64 != 0) return true;
return null;
}
final bytes = res.data.asTypedList(res.dataLen);
// 自动探测协议:如果第一个字节不是有效的二进制标签 (0-6),则尝试 JSON 解析
bool isBinary = false;
if (bytes.isNotEmpty) {
final firstByte = bytes[0];
if (firstByte >= _binaryTagNull && firstByte <= _binaryTagMap) {
isBinary = true;
}
}
if (isBinary && _useBinaryProtocol) {
// 使用二进制协议反序列化
try {
final reader = _BinaryReader(bytes);
return reader.read();
} catch (e) {
debugPrint('二进制解析失败,尝试 JSON: $e');
// 回退到 JSON 尝试
}
}
// 使用 JSON 解析
try {
final jsonStr = utf8.decode(bytes);
return json.decode(jsonStr);
} catch (e) {
debugPrint('JSON 解析失败: $e');
return null;
}
default:
return null;
}
}