扩展库 / plist
plist
读取和写出 Apple XML 与二进制 property list。
基于 XRT;XLang 值与 C 接口共享解析和写出核心,支持 UID、日期、数组、字典及二进制 Buffer。文本解析直接传递字符串和显式字节长度,不创建整份输入的临时 Buffer。
2026-10-30 修复首次线程错误状态分配失败后清错继续操作;binary 节点/字节/UTF-16 与容器构造 OOM 保留 MEMORY,条目超限报告 LIMIT;XML 字典避免 uint64 大上限乘二回绕。已有 PlistError/MemoryError、ABI 与零表示不限的 C 合同不变,不改编译器、XRT 或 Expat。
Windows 默认完整 587 项符合预期;C 冷启动 Windows 356 / Linux 348 场景,公开语言 JIT/AOT 各 87 预算通过。两平台同一最终夹具换旧三文件均出现 50 个冷启动失败场景、64 条 binary/限额失败断言,新实现归零。12 类值/142 OOM/48 限额/36 旧错误对照、四线程 64 诊断的 GCC/TCC JIT/AOT、41 实际 C 原型及每平台 13 份正常 AOT 通过,Linux 带 ASan/UBSan;Python plistlib 独立读取新 12 文件与原双语产物。这不是完整 Apple 私有格式或任意调度认证。
新增 portable_state 双语玩家状态范例,涵盖 XML、binary UID/null、类型/限额拒绝及恢复,核对同一黄金输出。C 显式释放文档和缓冲;输入转换和构树仍有成本,不声称完整零开销。用法、详细证据和失败留档规则见包内 README;官网源仅隔离生成,未据此宣称部署。
2026-10-26 当前 Windows/Linux 默认包门禁均通过 C/XLang 边界、分配故障和独立 EXE;两平台用 Python plistlib 分别读回 C、JIT、AOT 生成的 XML 与 binary 产物。Linux 另通过 C ASan/UBSan。
2026-10-28 用 ?? 转移可空拥有型结果,移除 XML 与诊断的返回复制,保留独立 PlistError 分类。预热空字符串完整序列化的 C 预算为 7 次,XL 从 19 降为 18 次;构树和语言对象仍有额外成本,不宣称完整零开销。新预算/错误恢复、双平台默认门禁、Linux ASan/UBSan、双语 JIT/AOT 与 plistlib 互通通过。
API
| 接口 | 用途 |
|---|---|
loads(textOrBuffer) / load(path) | 解析 XML 或自动识别二进制格式 |
dumps(value) / stringify(value) / dump(path, value) | 生成 Buffer、XML 文本或原子保存文件 |
uid / isUid / uidValue | 表达二进制 plist UID |
plist.UID | 导出 UID 类型,可用于显式声明 |
errorCode / errorLine / errorColumn / errorOffset | 读取当前线程的原生错误位置 |
范例
import plist
Buffer data = plist.dumps({"name": "xlang", "items": [1, 2]}, "binary")
var restored = plist.loads(data)
assert restored["name"] == "xlang"
plist.UID id = plist.uid(42)
二进制值和键可含 NUL,文件路径不可含嵌入 NUL;解析和写出均有可配置的资源上限。C 限额中的 0 表示不限制;传入 C 选项结构时须先调用 xrtPlistOptionsInit,外层或内嵌资源限额的版本、长度无效、保留字段或未支持的策略标志非零会报 ARGUMENT,不会回退到默认限额。读取、分配、限额、格式错误分别报告,不把失败混作格式错误。拥有型 Reader/Writer 在退出时关闭;正文成功但关闭失败时报告 IO,借用型流由调用方关闭。保存先完成序列化,再通过 XRT 原子替换目标,失败不先截断旧文件。XML 实数固定使用点号小数,不受进程区域设置影响;XML 日期只写整秒 UTC,带微秒的 time 会报错;binary plist 可以保存可精确往返的微秒时间,对无法精确表示的极值也会报错,不静默舍入。C API 见包内 include/xrt_plist.h,文档和输出缓冲由调用方释放。
2026-10-21 保存、流写入/关闭与 XML 字典排序中的内存故障按内存错误报告,XLang dump() 抛 MemoryError;真实 IO 与不支持的 XML 值仍按原错误类别报告。C 标量/字典逐点保存与 XLang 公开入口故障恢复通过 Windows/Linux 门禁;完整 AOT 的共享阻断未变。
XML 字符串及字典键中的 CR 写为 
,回读不会被规范化为 LF;C/XLang 往返用例均覆盖这一边界。XML 的 LF/Tab 与二进制编码保持原有语义。
C Reader 的输入限额从当前读取位置计算,不包含已跳过的前缀;只有 Size 而没有 Tell 的 Reader 由实际读取阶段执行限额。
C uint64_t 与 XLang uint64 直接对应,限额、字节长度和 UID 在 Linux LP64 下保持同一原型。双语范例先生成无 UID 的 XML,再生成含 UID(42) 的 binary;两平台均由 Python plistlib 独立读取 C、JIT 和 AOT 的产物。日期秒数与微秒分开换算;XML 数值使用 XRT 严格解析,Base64 数据使用 XRT 严格解码。旧发布物的 AOT 缺符号和序列策略阻断不再作为当前结论。