From f185241a71afdc85150bd7371851a85cc63e3afe Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Thu, 27 Aug 2026 00:45:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(gen):=20translate=5Fsubscript=20=E6=94=AF?= =?UTF-8?q?=E6=8C=81=20Slice=20=E5=88=87=E7=89=87=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=EF=BC=88a[start:end]=EF=BC=89=E2=80=94=E2=80=94?= =?UTF-8?q?=E6=AD=A4=E5=89=8D=E8=BF=94=E5=9B=9E=20None=20=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E5=87=BD=E6=95=B0=E5=AE=9E=E5=8F=82=E8=A2=AB=E4=B8=A2?= =?UTF-8?q?=E5=BC=83=EF=BC=88create=5Fprocess(path[n:],entry)=20=E4=B8=A2?= =?UTF-8?q?=20name=E3=80=81entry=20=E9=94=99=E4=BD=8D=20=E2=86=92=20p.entr?= =?UTF-8?q?y=20=E5=9E=83=E5=9C=BE=20=E2=86=92=20=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=BF=9B=E7=A8=8B=20iretq=20=E5=9E=83=E5=9C=BE=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=20PF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/lib/core/Gen/ExprGenName.vp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/App/lib/core/Gen/ExprGenName.vp b/App/lib/core/Gen/ExprGenName.vp index 643d513..1e3887c 100644 --- a/App/lib/core/Gen/ExprGenName.vp +++ b/App/lib/core/Gen/ExprGenName.vp @@ -634,6 +634,34 @@ class ExprGenName(ExprGenBase.ExprGenBase): if sub is None: return None + # 切片形式 a[start:end](如 path[n:]):返回 i8* 基指针 + start 偏移。 + # 此前 Slice AST 被当作单索引 translate_value → 无 Slice 分支返回 None → + # 作为函数实参时整个参数被丢弃(spawn_elf 的 + # create_process(path[n:], entry) 丢 name → entry 错位成第一参数 → + # p.entry 垃圾 → 用户进程 iretq 到垃圾地址 → PF)。 + if sub.slice is not None and sub.slice.kind() == ast.ASTKind.Slice: + slc: ast.Slice | t.CPtr = (ast.Slice | t.CPtr)(sub.slice) + base_v: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( + builder, pool, mod, sub.value, None, 0, trans) + if base_v is None: + return None + if slc.lower is None: + return base_v + start_v: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( + builder, pool, mod, slc.lower, None, 0, trans) + if start_v is None: + return None + i64_sc: llvmlite.LLVMType | t.CPtr = llvmlite.Int64(pool) + start_w: llvmlite.Value | t.CPtr = start_v + if start_v.Ty is not None: + bt_sc: int = self.Gen.ExprGenBase.get_llvm_type_bits(start_v.Ty) + if bt_sc != 0 and bt_sc < 64: + start_w = llvmlite.build_sext(builder, start_v, i64_sc) + if start_w is None: + return None + i8_sc: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool) + return llvmlite.build_gep(builder, i8_sc, base_v, start_w) + # 翻译索引 idx_val: llvmlite.Value | t.CPtr = self.Gen.ExprGen.translate_value( builder, pool, mod, sub.slice, None, 0, trans)