From 9257dd841f6d8ee59430e55e3d511e8b7494cb34 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 12 Sep 2026 11:24:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(tpc):=20rowptr[X]=20=E5=AD=97=E6=AE=B5=20el?= =?UTF-8?q?ement=5Fclass=20=E7=99=BB=E8=AE=B0=E8=A1=A5=E7=9F=AD=E5=90=8D?= =?UTF-8?q?=E6=A8=A1=E7=B3=8A=E6=89=AB=E6=8F=8F=EF=BC=8C=E4=BF=AE=20Unknow?= =?UTF-8?q?n=20module=20=E8=AF=AF=E6=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/core/Handles/HandlesClassDef.py | 16 +++++++++++++++- lib/core/Handles/HandlesImports.py | 16 +++++++++++++++- .../HandlesClassDef.cpython-312.pyc | Bin 77269 -> 77429 bytes .../HandlesImports.cpython-312.pyc | Bin 160835 -> 160995 bytes 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/lib/core/Handles/HandlesClassDef.py b/lib/core/Handles/HandlesClassDef.py index c4e85e2..73940f9 100644 --- a/lib/core/Handles/HandlesClassDef.py +++ b/lib/core/Handles/HandlesClassDef.py @@ -874,7 +874,21 @@ class ClassHandle(BaseHandle): _ec_target_c = _slc_name_c else: _st_sha1_c: str | None = (getattr(Gen, 'class_sha1_map', {}) or {}).get(_slc_name_c) - _ec_target_c = f'{_st_sha1_c}.{_slc_name_c}' if _st_sha1_c and f'{_st_sha1_c}.{_slc_name_c}' in Gen.structs else None + if _st_sha1_c and f'{_st_sha1_c}.{_slc_name_c}' in Gen.structs: + _ec_target_c = f'{_st_sha1_c}.{_slc_name_c}' + else: + # 短名模糊扫描(对齐 HandlesAnnAssign 变量侧 + # 补偿 L597-602):跨模块 `mod.Class` 形态的 + # rowptr[Class] 字段在 class_sha1_map 尚无该短名 + # 时上面两路全 miss → element_class 静默缺失 → + # 字段方法调用(factory.PermPool.alloc)链尾类名 + # 丢失 → TPC 调用分派返回 i32 0 哨兵 → 误报 + # "Unknown module: ...PermPool"。 + for _ec_k_c in Gen.structs: + _ec_short_c: str = _ec_k_c.split('.')[-1] if '.' in _ec_k_c else _ec_k_c + if _ec_short_c == _slc_name_c: + _ec_target_c = _ec_k_c + break if _ec_target_c: if ClassName not in Gen.class_member_element_class: Gen.class_member_element_class[ClassName] = {} diff --git a/lib/core/Handles/HandlesImports.py b/lib/core/Handles/HandlesImports.py index 5eb421d..7a7d3f5 100644 --- a/lib/core/Handles/HandlesImports.py +++ b/lib/core/Handles/HandlesImports.py @@ -1864,7 +1864,21 @@ class ImportHandle(BaseHandle): _ec_target_s = _slc_name_s else: _st_sha1_s: str | None = (getattr(Gen, 'class_sha1_map', {}) or {}).get(_slc_name_s) - _ec_target_s = f'{_st_sha1_s}.{_slc_name_s}' if _st_sha1_s and f'{_st_sha1_s}.{_slc_name_s}' in Gen.structs else None + if _st_sha1_s and f'{_st_sha1_s}.{_slc_name_s}' in Gen.structs: + _ec_target_s = f'{_st_sha1_s}.{_slc_name_s}' + else: + # 短名模糊扫描(对齐 HandlesAnnAssign 变量侧 + # 补偿 L597-602):跨模块 `mod.Class` 形态的 + # rowptr[Class] 字段在 class_sha1_map 尚无该短名 + # 时上面两路全 miss → element_class 静默缺失 → + # 字段方法调用(factory.PermPool.alloc)链尾类名 + # 丢失 → TPC 调用分派返回 i32 0 哨兵 → 误报 + # "Unknown module: ...PermPool"。 + for _ec_k_s in Gen.structs: + _ec_short_s: str = _ec_k_s.split('.')[-1] if '.' in _ec_k_s else _ec_k_s + if _ec_short_s == _slc_name_s: + _ec_target_s = _ec_k_s + break if _ec_target_s: if ClassName not in Gen.class_member_element_class: Gen.class_member_element_class[ClassName] = {} diff --git a/lib/core/Handles/__pycache__/HandlesClassDef.cpython-312.pyc b/lib/core/Handles/__pycache__/HandlesClassDef.cpython-312.pyc index 25f0f62d09c5212f6757676a8e1891db77b1e683..3aa8bb3874874a6c3cd82aa7a9d064d947d5ff74 100644 GIT binary patch delta 2495 zcmZuy3s6+o8NUDB2g~~n3%K%ri>NH`=Xwd6MF%Waqkyou3jzzmWqB;z4cN3XBqY$D zvDa2*piO4th!MS3NK91HrqDLA7}}8nQB0=kXqyyJV{1~|^DlO)ncms?&VRoD{oix$ z{&8M@e?ji{J6BgHhCUyD@Os_*9cSGJOI1UW40D(}oKJ3TRm)!H1ToJYeA!-(d|rAR zIBB}<2n!sku1I#}P67Hd3@}vPWbz}IDl}BLV8@3Q`>DLIGRgf3JAtj!ir@v_M|!{; zgHBZ@Q>#aI)EY!8e`qM77*d6ia_m@ErBQNOG*2z@w5lCfMMhwWVbX`jkSnPh}^mXQ5%CBaPUf*|lIiCy}3n8EU&A5^3)|x_TM|q}rbT?Oj zKsTFeVsTS;;D;=iMLcT*Bvq|ly|3Gk=<9Y+ljC(9PGHd-Ptm0zkz!UuBpfC0b_S7~ zbwT84!*3|pV+$Z%jXtm-4KxO!!%~|cNxbez5?X!eZn23rC_QSjV!EeQBRuy0TfPKd zB?HZVMBCEk`DbCHF{nOPcXxlglA{}j!o+=^z z7-Mu1QjakwWK^f6hJIf8OgTL!whXGsXk&OEA%k2oMF(ftGKEYb73*w)zHlMKmIh2C z$QdDxPkg#2+Tooxjo%a12%8R-8yQ=cBV#0IyVd0KejoCY#fOx)dpKkXS>F!uxT!2` ziU#|2dppIPj!25ejv|WZ?ed&mjiap2~6Et((LF>UbTj~W((OZ?0~Y*AY{|? zG%?}h(fdS2RMAQntpU{ap*7s&Y0WV?Ias0o?>XMvNskf{I>RA{40Rq+lcA#?a> z%Kg+9D&y#S$(BvYZ)~P--C=qL$cxWozeCTTq^R#c6~v81oRZOm^Z}-C3w@XFd`K@x zZ}J~VZjmpE>`_z8oSsyQZ9VCs%08!drbD)eX@_ve^0QS>hKZoH1B35Zn(m2kfoG)q zeV(khLxpL7MSaEoIcF4F4jkkyMAp9to*~7%LP%486dCSMfUDB)`;V*Gt*q2=RFJ_8 zxpSsp%h?r{m6cF4D~j$2@9r(CiQPO@x?8`(S@ z4rQczI6OzMkx#`1>-1sr<&rF@jmk$;Va!59e{&r`mK z>^r1-ya2XIr^hQ<7$j~NOQ2Dzy7-eXuSnFqMfn91Uy`BuZ{Ptrv9K4Wq<<`Qd56eZ%I`(xZVGdb z1?GbW%T8;PiC;!iLCBH`vdKS}q^Mg+_@MpgC_O@ZMMZ_hP{Y%21;ani`SG$A{!JWK z3=w}vb_pTDUNB0&DA|)9#_d<6Z)F|Ju;iVUHGzLcCJ+tm@%&JFT=&w-m*7Nh-VFma zVeiGjBNBfv7c`{)UW&#UOM06c&nX%j4Gku`SZD)ttfiKJKrY>@fd^95{eCadh!-3n zk}eAl5CK6Vs30~_gWj)UsvjWqBdiuK=BpsvIRy2g2w`HM3VI=1^mBwfcx`OABdl@r zcpZy=10fn+Z;3DXL!1{5hrf+*heB*Le@49Q4~+#QNS#M`i^80Pxwf(1P-Egpkvf3^ z1`*EU_QxnSp_#14)WjDdw+G>z*rJB@&MPS2Mfim{qJ}e2AeIHddT zLORylM!8reAB;q+I3EL>X^6G4Pz8hHp;*X@8bqs(|KpiK760@6EEbCWKS4^hdL69j zVnzrQ^>L8v*+k_|m7&G5o->%ud^0N^iUEJ<6wk#$oyQEOX+|(1+z{8rgGOmV|6;Ky zp8m&{I4HDt>%?Ei!)@3io?ZtB;0w_&fws3IrX;||z+yBG$3{XaJXB>h95l9?O*#B4 U;-LiKJn5TK55(PPaJAe02gjHJp8x;= delta 2402 zcmZuxeNa@_6@TX~yX?vW0t@@W=L#5>&nk$3u)oc{@6K0YksKs^>kXz{@fFH)_kW8D=N9vzC0k+N64x6Q!wG zNMwgN^3RP|fs-$6`Uwjh+3Hvp%^d;EWf)+n+viRquR2nxZ&JZ89b2frxwSa9 zl#sZ$5~K`(1T1>4bs3Gitzd~$qWXDfGsO%SRS=rpqT? zYknJL4b!E^5a0CN<|k*Yu#Bv zDb=uh@eJ{OqMYgK&s_L*9l8+eY>Ob<946%+W(|GwhOVX&_kFbO%l(Q_~XRpdY@9jeH9$V_ocFpwJ|Bh?Os48$TXQ*mM?Stky~+J`u0zjoYj zxO#qBPY)PKVt6V21y_gDV{3wppb@KiYd<|WTup*us~I^p0z@lhLqI zr%XfbG_>yCx$Nq@kCHyNH}9K+nnN6|uy}hF-8jG9ecvO->v4U1GWBT(ens)bz!4*N zH0y|Jz78G0rkiXRP@tJJ$bAeJ4eP$8G?$kIcd{MZlUSn|~F z^-xD1UY|jxcV`jnZ~+{Xn}$cUY(L1K?h#e+7vdT5fA0sb3!cD*j_wQH!D)u+g*ujs z9;ipr4l7YKun)0cplD%d{x900g&oTsOBsJ;JT%_*-trb2xPjfwzNG(qW|6#Z-x*lY zt?CEegD~BzlFdJVlVy9N$v+Ne(#2~IW!f8T5$AH#xrV}snbKukLoxgBQXAK(X1~hQ zbB)G`*BXkWxJFj}S|fe0id0kEKLJ!+$5-`FDfEg2uH(Y%7}7}1-Cx`toAW^;bI2Nk~b~}G}n;0PHHA^!5pdj za0C2K-t%E7A%kTpzX6@!r!b*g)w#_XXzBC0h0l;wk>VLQ6p^3J$crx_5s&egQM-ll zYKJ4>Y!k|mxO1lPc?o<)Ui{pd^(nG95DJurQAUfzR*ER%)&$1^e+$|z|>1prU`Q6aXG>jgnv=6Js|u>a+tuo>eon} zKsZWaBC@l?`?#~sEgVB?9~Rh;a2(B_qUOUeRh!!QgUs~XGHN>52%YZ8pppu%hp}DLcCu*fI5#8nPa=8UZ z(AnAT_6sg_=n>oqxL4ti2+Bx%rHO240pqEn#ju72zZA})NBO1abD#mbrOP=`0s+Zv zgLEp&ZD6(fvC1(lpg}0degl-VX@qnn{8GpUwY0>mHgLg+WX*-j#UmIM{FclL>bRTv zWG*~xyoi)`{yFquiU+|YeUb~+abBwTYn}c;VV$$HQ`p8zRvQ?hS6Y_`o`vt>F;5`4 z5hkVcd623RFn_J|Ssr*bD4@Bv}igF3xQN({Sz_gHnn6AAEAQOaK4? diff --git a/lib/core/Handles/__pycache__/HandlesImports.cpython-312.pyc b/lib/core/Handles/__pycache__/HandlesImports.cpython-312.pyc index c7a2ab3df2f289a849f5e9e2e1ecf6380a1041a3..aa143955917a5ff0945483a061e386a336848563 100644 GIT binary patch delta 7565 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 delta 7366 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 URuopX01^h5e<2Ahr%-bL51essj{pDw