🔴 P0 | 所有 #[uniffi::export] 函数迁移到 out-pointer FFI 方式 #37

Closed
opened 2026-06-06 12:33:02 +08:00 by wangdl · 2 comments
Owner

背景

ARM64 iOS 上 24 字节结构体跨 FFI 传参存在 ABI 不兼容问题,#36 已修复 parseMarkdown 路径(out-pointer)。但以下函数仍使用 struct-passing 的 #[uniffi::export] 方式,在 iOS 上同样损坏:

  • parse_text
  • read_text_stats
  • read_image_meta
  • detect_material_type
  • push_reading_event
  • update_reading_position
  • export_pending_events
  • clear_exported_events
  • create_note_anchor
  • search_markdown_blocks
  • search_text_content

修复方案

参照 ffi_zx_document_ffi_parse_markdown_separate 的模式:

  1. Rust 侧为每个函数新增 out-pointer extern C 版本
  2. Swift 侧 patch 脚本更新 @_silgen_name 声明
  3. 旧的 #[uniffi::export] 版本可保留(macOS/android 仍可用),但 iOS binding 指向 out-pointer 版本

依赖

承接 #36。

## 背景 ARM64 iOS 上 24 字节结构体跨 FFI 传参存在 ABI 不兼容问题,#36 已修复 parseMarkdown 路径(out-pointer)。但以下函数仍使用 struct-passing 的 #[uniffi::export] 方式,在 iOS 上同样损坏: - parse_text - read_text_stats - read_image_meta - detect_material_type - push_reading_event - update_reading_position - export_pending_events - clear_exported_events - create_note_anchor - search_markdown_blocks - search_text_content ## 修复方案 参照 ffi_zx_document_ffi_parse_markdown_separate 的模式: 1. Rust 侧为每个函数新增 out-pointer extern C 版本 2. Swift 侧 patch 脚本更新 @_silgen_name 声明 3. 旧的 #[uniffi::export] 版本可保留(macOS/android 仍可用),但 iOS binding 指向 out-pointer 版本 ## 依赖 承接 #36。
wangdl added this to the M6:Code Review 质量完善(2026-06-06) milestone 2026-06-06 12:33:02 +08:00
Author
Owner

修复完成 (2026-06-06)

Rust 侧

全部 11 个需要迁移的函数已新增 out-pointer _separate 版本,通过 write_result_to_out! 宏和 lift_from_raw! 宏减少样板代码。

Batch 函数数 说明
1 4 String 输入型:detect/read_image_meta/read_text_stats/parse_text
2 4 复合类型:push_event/update_position/export_events/create_anchor
3 2 搜索:search_markdown/search_text
已有 1 clear_exported_events 无需改(u32→void)

待完成

Swift 侧仍需更新 zx_document.swift 中的 @_silgen_name 声明和调用点,指向新的 _separate 函数。建议在 M6 后续迭代中统一处理。

状态

🟡 Rust 侧完成,Swift binding 待更新。

## 修复完成 (2026-06-06) ### Rust 侧 全部 11 个需要迁移的函数已新增 out-pointer `_separate` 版本,通过 `write_result_to_out!` 宏和 `lift_from_raw!` 宏减少样板代码。 | Batch | 函数数 | 说明 | |-------|--------|------| | 1 | 4 | String 输入型:detect/read_image_meta/read_text_stats/parse_text | | 2 | 4 | 复合类型:push_event/update_position/export_events/create_anchor | | 3 | 2 | 搜索:search_markdown/search_text | | 已有 | 1 | clear_exported_events 无需改(u32→void)| ### 待完成 Swift 侧仍需更新 `zx_document.swift` 中的 `@_silgen_name` 声明和调用点,指向新的 `_separate` 函数。建议在 M6 后续迭代中统一处理。 ### 状态 🟡 Rust 侧完成,Swift binding 待更新。
Author
Owner

Swift 侧完成 (2026-06-06)

修改

iOS zx_document.swift 全部 Swift 函数已更新为 out-pointer FFI:

  • detectMaterialType、readImageMeta、readTextStats、parseText → _separate 版本
  • pushReadingEvent、updateReadingPosition → _separate 版本
  • exportPendingEvents、createNoteAnchor → _separate 版本
  • searchMarkdownBlocks、searchTextContent → _separate 版本

说明

所有 @_silgen_name 的新 _separate 声明已添加。旧的 uniffi_* 声明保留作为参考(macOS/Android 路径仍可用)。

状态

Rust + Swift 双端完成,M6 #37 关闭。

## Swift 侧完成 (2026-06-06) ### 修改 iOS `zx_document.swift` 全部 Swift 函数已更新为 out-pointer FFI: - detectMaterialType、readImageMeta、readTextStats、parseText → `_separate` 版本 - pushReadingEvent、updateReadingPosition → `_separate` 版本 - exportPendingEvents、createNoteAnchor → `_separate` 版本 - searchMarkdownBlocks、searchTextContent → `_separate` 版本 ### 说明 所有 `@_silgen_name` 的新 `_separate` 声明已添加。旧的 `uniffi_*` 声明保留作为参考(macOS/Android 路径仍可用)。 ### 状态 ✅ Rust + Swift 双端完成,M6 #37 关闭。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: wangdl/zhixi-document-runtime#37
No description provided.