diff --git a/lib/core/Handles/HandlesAnnAssign.py b/lib/core/Handles/HandlesAnnAssign.py index aaa40c6..b922ef7 100644 --- a/lib/core/Handles/HandlesAnnAssign.py +++ b/lib/core/Handles/HandlesAnnAssign.py @@ -450,10 +450,18 @@ class AnnAssignHandle(BaseHandle): Gen._record_var_signedness(VarName, TypeInfo.IsUInt) return if TypeInfo.IsStr or (isinstance(Node.annotation, ast.Name) and Node.annotation.id == 'str'): - TypeInfo = CTypeInfo() - TypeInfo.BaseType = t.CChar() - TypeInfo.PtrCount = 1 - IsPtr = True + # 仅指针层数 <= 1 才算裸 str/bytes(i8*),可以压平:`str | t.CPtr` / + # `str*` 合并后 IsStr=True 但 PtrCount=2(i8**,如 argv 指针数组), + # 压平会让局部变量比模块级同名全局槽少一层指针 + # (全局走 HandlesAssign._EmitGlobalAnnAssignLlvm 的 FromNode,得到 i8**), + # 于是 includes/sys.vp `_argv = argv_arr` 被指针隐式转换 fail-fast 拦下。 + # 与 HandlesFunctions.py:599 / HandlesImports.py:1440 的 + # `IsStr and PtrCount <= 1` 同一条规则源。 + if TypeInfo.PtrCount <= 1: + TypeInfo = CTypeInfo() + TypeInfo.BaseType = t.CChar() + TypeInfo.PtrCount = 1 + IsPtr = True # FakeDuck: 为 str 变量创建影子结构体 a__meta__ (栈上, per-instance) # a 保持为 char* 用于 printf; a__meta__ 存储 __data__ 和 __mbuddy__ 字段 # 仅对 str 类型创建,bytes 和 t.CChar|t.CPtr 不创建