diff --git a/App/lib/core/Handles/HandlesExpr.vp b/App/lib/core/Handles/HandlesExpr.vp index 31ca8cc..91ab9c5 100644 --- a/App/lib/core/Handles/HandlesExpr.vp +++ b/App/lib/core/Handles/HandlesExpr.vp @@ -1414,27 +1414,8 @@ def _lookup_cross_module_cdefine(pool: memhub.MemBuddy | t.CPtr, return sub_val return -1 - # 2. 复制模块名到新缓冲区(lookup_from_import 返回的是内部指针) - # 截断于空格、null、或 ':'(别名格式的分隔符) - mod_len: t.CSizeT = 0 - while mod_name_raw[mod_len] != ' ' and mod_name_raw[mod_len] != '\0' and mod_name_raw[mod_len] != ':': - mod_len += 1 - mod_name_buf: str = pool.alloc(mod_len + 1) - if mod_name_buf is None: - return -1 - for mi in range(mod_len): - mod_name_buf[mi] = mod_name_raw[mi] - mod_name_buf[mod_len] = '\0' - - # 3. 去掉相对导入的前导点 - base_mod: str = mod_name_buf - while base_mod[0] == '.': - base_mod = base_mod + 1 - - # 4. 查找模块的 SHA1 - sha1: str = HandlesExprCall._lookup_module_sha1(base_mod) - if sha1 is None: - sha1 = HandlesExprCall._lookup_module_sha1_suffix(base_mod) + # 2. 截断模块名 → 去前导点 → 精确+后缀查找 SHA1(复用 HandlesExprCall 公共逻辑) + sha1: str = HandlesExprCall._lookup_sha1_from_modname_raw(pool, mod_name_raw) if sha1 is None: return -1 diff --git a/App/lib/core/Handles/HandlesExprCall.vp b/App/lib/core/Handles/HandlesExprCall.vp index f44e286..fe3ccbd 100644 --- a/App/lib/core/Handles/HandlesExprCall.vp +++ b/App/lib/core/Handles/HandlesExprCall.vp @@ -115,6 +115,19 @@ def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports, class_name, allow_star_fallback) if mod_name_raw is None: return None + return _lookup_sha1_from_modname_raw(pool, mod_name_raw) + + +# ============================================================ +# _lookup_sha1_from_modname_raw - 原始模块名 → SHA1 +# +# 截断模块名(lookup_from_import 返回内部指针,空格/冒号/null 分隔), +# 去掉相对导入前导点,再精确+后缀查找 SHA1。 +# 供 _lookup_mod_sha1 与 HandlesExpr._lookup_cross_module_cdefine 复用。 +# ============================================================ +def _lookup_sha1_from_modname_raw(pool: memhub.MemBuddy | t.CPtr, + mod_name_raw: str) -> str: + """从原始模块名查找 SHA1,返回 None=未找到""" # 手动找到模块名结束位置(空格、null、或 ':' 别名分隔符),复制到新缓冲区 mod_len: t.CSizeT = 0 while mod_name_raw[mod_len] != ' ' and mod_name_raw[mod_len] != '\0' and mod_name_raw[mod_len] != ':':