From 2863b9cc79fafe88c1c8e6f9357b200467535065 Mon Sep 17 00:00:00 2001 From: "peng.li24" <734991033@qq.com> Date: Sat, 29 Aug 2026 19:40:24 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=86=99=E6=A7=BD=20resolve=20=E5=8F=AA?= =?UTF-8?q?=E8=BF=BD=E6=98=BE=E5=BC=8F=E8=BD=AF=E9=93=BE=E6=8E=A5=EF=BC=88?= =?UTF-8?q?handle=5Fcall=20=E4=BA=8C=E6=AC=A1=E8=B0=83=E7=94=A8=E5=86=99?= =?UTF-8?q?=E5=9B=9E=E6=97=A7=E5=80=BC=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude --- runtime/src/builtin.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/runtime/src/builtin.c b/runtime/src/builtin.c index 89503a3a..d64a01bd 100644 --- a/runtime/src/builtin.c +++ b/runtime/src/builtin.c @@ -158,16 +158,19 @@ char *kvlangBuiltinResolveWriteSlot(kvlangKv_t *kv, const char *frame_path, cons kvlangXvalue_t av; kvlangXvalueZero(&av); kvlangKvGetOne(kv, ak.p, &av); if (!kvlangXvalueNone(&av)) { + /* 只追显式软链接(ptr, ref==1)链;av 是 handle_call 已 resolve 好的 + * 最终写目标路径(普通 char),直接取字符串,勿再按值读下一跳—— + * 否则会把已写数据(char)误当路径再追,导致二次调用写回旧值。 */ kvlangXvalue_t v = av; av.data = NULL; av.len = 0; - for (;;) { - if (!kvlangXvalueIsCharKind(kvlangXvalueKind(&v))) break; - char *p = kvlangXvalueValueString(&v); - kvlangXvalue_t next; kvlangXvalueZero(&next); - kvlangKvGetOne(kv, p, &next); - if (kvlangXvalueNone(&next) || !kvlangXvalueIsCharKind(kvlangXvalueKind(&next))) { result = p; break; } - free(p); - kvlangXvalueFree(&v); v = next; + while (kvlangXvalueIsPtr(&v)) { + char *np = kvlangXvaluePtrTarget(&v); + kvlangXvalue_t nxt; kvlangXvalueZero(&nxt); + kvlangKvGetOne(kv, np, &nxt); + free(np); + kvlangXvalueFree(&v); + v = nxt; } + if (!kvlangXvalueNone(&v)) result = kvlangXvalueValueString(&v); kvlangXvalueFree(&v); } kvlangXvalueFree(&av); kvlangStrbufFree(&ak);