feat(lifetime): @life(escape/noescape) 升为调用点最终裁决(契约不可被推断推翻)
StructGenMixin: 新增 EscDirTable(3 槽/项:[名哈希, 强制逃逸位, 强制不逃逸位]), _RegisterFuncEscapeSummary 把 compute_escape_summary 落在 box[3]/box[4] 的指令掩码单独落表 (与 EscTable 的"推断结果"分开);新增 _DirLookup / get_param_escape_force / get_param_noescape_force。 compute_escape_summary 的指令输出缓冲由 g+68 改为 box[3](同一内存,语义显式化)。 CallGenMixin: 在常量特化、同命裁剪、跨模块回退**全部做完之后**,最后套用一次指令: esc_mask = (esc_mask | escape_force) & ~noescape_force。这样 escape(...) 不会被"死分支/同命"折掉, noescape(...) 也不会被任何上游路径重新解释成"逃逸"。
This commit is contained in:
1 parent
8881dea2e2
commit
fc7c5d5560
3 files changed
+78
-9
No files matched your search
@@ -497,6 +497,20 @@ def get_param_escapes_hard_method(pool: memhub.MemBuddy*, class_name: str, metho
|
||||
return 0
|
||||
|
||||
|
||||
# ---- 声明式指令(@life(escape/noescape))的最终裁决掩码 ----
|
||||
# 契约表与推断表分开:调用点在所有推断/裁剪之后最后套用,任何推导都不能推翻。
|
||||
def get_param_escape_force(name: str) -> int:
|
||||
"""`@life(escape(...))` 强制逃逸位掩码;0 = 无该标注"""
|
||||
if _g_gen is not None: return _g_gen.StructGen.get_param_escape_force(name)
|
||||
return 0
|
||||
|
||||
|
||||
def get_param_noescape_force(name: str) -> int:
|
||||
"""`@life(noescape(...))` 强制不逃逸位掩码;0 = 无该标注"""
|
||||
if _g_gen is not None: return _g_gen.StructGen.get_param_noescape_force(name)
|
||||
return 0
|
||||
|
||||
|
||||
# escape_leak_line - **错误路径专用**:被调者第 want_pi 号形参的"首个逃逸写入点"行号。
|
||||
# 只在 fail-fast 报错时调用(会重扫一次被调者函数体);跨模块拿不到 AST 时返回 0。
|
||||
def escape_leak_line(name: str, want_pi: int) -> int:
|
||||
|
||||
Reference in new issue
Block a user