convertQjsResultToDart static method

dynamic convertQjsResultToDart(
  1. QjsResult res
)

将 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;
  }
}