From 0bda395eccbc806aa5dfaae7b5444fe23e1653cb Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Tue, 8 Sep 2026 12:52:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(translator,peephole):=20TPC=20=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E9=93=BE=E8=A7=A3=E6=9E=90=E4=BF=AE=E5=A4=8D=E4=B8=8E?= =?UTF-8?q?=E7=AA=A5=E5=AD=94=20T1-T3=20=E6=94=B6=E5=B0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - TPC(lib/core): 泛型父特化形参按声明类登记 var_struct_class; _find_struct_key 键归一支持方括号内嵌 sha 前缀; 字段探测失败不再冒泡 FuncGen fail-fast; cast 局部通用指针槽按静态类 bitcast; 属性解析失败附诊断 - 窥孔(includes/llvmlite/__function.vp): 窥孔移至 Renumber 前使输出 SSA 编号连续; T3 no-op bitcast 消除; T4(数组 bitcast->GEP)验证干扰返回类型收敛已移除 - 附调试打点与 1.log --- PROF/main_prof_60304.prof | Bin 0 -> 255464 bytes PROF/main_time.txt | 2 +- .../output/42e09c6149524d9d.deps.json | 1 - .../temp/285b6aa29a34754d.stub.ll.dep | 0 Test/GenericTest4/temp/285b6aa29a34754d.vpi | 23 --- .../temp/42e09c6149524d9d.doc.json | 1 - Test/GenericTest4/temp/42e09c6149524d9d.vpi | 49 ------- .../temp/748d0424e8976fa0.stub.ll.dep | 1 - Test/GenericTest4/temp/748d0424e8976fa0.vpi | 31 ---- Test/GenericTest4/temp/_phase1_manifest.json | 1 - Test/GenericTest4/temp/_sha1_map.txt | 6 - .../temp/bbdf3bbd4c3bc28c.stub.ll.dep | 1 - Test/GenericTest4/temp/bbdf3bbd4c3bc28c.vpi | 138 ------------------ .../temp/f5522571bcce7bcb.stub.ll.dep | 0 Test/GenericTest4/temp/f5522571bcce7bcb.vpi | 100 ------------- .../temp/fc980acec33d69a7.stub.ll.dep | 1 - Test/GenericTest4/temp/fc980acec33d69a7.vpi | 100 ------------- lib/core/Handles/HandlesExprAttr.py | 67 +++++++-- lib/core/Handles/HandlesFunctions.py | 38 +++++ lib/core/LLVMCG/FuncGen.py | 6 + 20 files changed, 103 insertions(+), 463 deletions(-) create mode 100644 PROF/main_prof_60304.prof delete mode 100644 Test/GenericTest4/output/42e09c6149524d9d.deps.json delete mode 100644 Test/GenericTest4/temp/285b6aa29a34754d.stub.ll.dep delete mode 100644 Test/GenericTest4/temp/285b6aa29a34754d.vpi delete mode 100644 Test/GenericTest4/temp/42e09c6149524d9d.doc.json delete mode 100644 Test/GenericTest4/temp/42e09c6149524d9d.vpi delete mode 100644 Test/GenericTest4/temp/748d0424e8976fa0.stub.ll.dep delete mode 100644 Test/GenericTest4/temp/748d0424e8976fa0.vpi delete mode 100644 Test/GenericTest4/temp/_phase1_manifest.json delete mode 100644 Test/GenericTest4/temp/_sha1_map.txt delete mode 100644 Test/GenericTest4/temp/bbdf3bbd4c3bc28c.stub.ll.dep delete mode 100644 Test/GenericTest4/temp/bbdf3bbd4c3bc28c.vpi delete mode 100644 Test/GenericTest4/temp/f5522571bcce7bcb.stub.ll.dep delete mode 100644 Test/GenericTest4/temp/f5522571bcce7bcb.vpi delete mode 100644 Test/GenericTest4/temp/fc980acec33d69a7.stub.ll.dep delete mode 100644 Test/GenericTest4/temp/fc980acec33d69a7.vpi diff --git a/PROF/main_prof_60304.prof b/PROF/main_prof_60304.prof new file mode 100644 index 0000000000000000000000000000000000000000..b979f43787a124d90291ed6d715df9ef477d1ae6 GIT binary patch literal 255464 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 z

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

N@}ZC&fWzula|RT%>hH5@ZjECH1P7Y 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 literal 0 HcmV?d00001 diff --git a/PROF/main_time.txt b/PROF/main_time.txt index 684101d..e60e879 100644 --- a/PROF/main_time.txt +++ b/PROF/main_time.txt @@ -1 +1 @@ -成功 90.80 +成功 120.25 diff --git a/Test/GenericTest4/output/42e09c6149524d9d.deps.json b/Test/GenericTest4/output/42e09c6149524d9d.deps.json deleted file mode 100644 index f9587e9..0000000 --- a/Test/GenericTest4/output/42e09c6149524d9d.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"stdio": "285b6aa29a34754d", "testcheck": "748d0424e8976fa0", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb", "w32.win32base": "fc980acec33d69a7", "win32base": "fc980acec33d69a7"} \ No newline at end of file diff --git a/Test/GenericTest4/temp/285b6aa29a34754d.stub.ll.dep b/Test/GenericTest4/temp/285b6aa29a34754d.stub.ll.dep deleted file mode 100644 index e69de29..0000000 diff --git a/Test/GenericTest4/temp/285b6aa29a34754d.vpi b/Test/GenericTest4/temp/285b6aa29a34754d.vpi deleted file mode 100644 index acc57c7..0000000 --- a/Test/GenericTest4/temp/285b6aa29a34754d.vpi +++ /dev/null @@ -1,23 +0,0 @@ -""" -Auto-generated Python stub file from stdio.vp -Module: stdio -""" - - -import t, c - -def printf(fmt: t.CConst | str, *args) -> int | t.State: pass - -def fprintf(stream: bytes, fmt: t.CConst | str, *args) -> int | t.State: pass - -def sprintf(buf: bytes, fmt: t.CConst | str, *args) -> int | t.State: pass - -def snprintf(buf: bytes, size: t.CSizeT, fmt: t.CConst | str, *args) -> int | t.State: pass - -def puts(s: t.CConst | str) -> int | t.State: pass - -def fputs(s: t.CConst | str, stream: bytes) -> int | t.State: pass - -def fgets(buf: bytes, size: int, stream: bytes) -> bytes | t.State: pass - -def fflush(stream: bytes) -> int | t.State: pass diff --git a/Test/GenericTest4/temp/42e09c6149524d9d.doc.json b/Test/GenericTest4/temp/42e09c6149524d9d.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/Test/GenericTest4/temp/42e09c6149524d9d.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/Test/GenericTest4/temp/42e09c6149524d9d.vpi b/Test/GenericTest4/temp/42e09c6149524d9d.vpi deleted file mode 100644 index aced38b..0000000 --- a/Test/GenericTest4/temp/42e09c6149524d9d.vpi +++ /dev/null @@ -1,49 +0,0 @@ -""" -Auto-generated Python stub file from main.vp -Module: main -""" - -import c - - -import t -import stdio -import testcheck - -class Box[T]: - value: T - def __init__(self: Box, v: T) -> t.CInt: pass - def get(self: Box) -> T: pass - def set(self: Box, v: T) -> t.CInt: pass - -def test_explicit_box() -> t.CInt: pass - - -class Pair[T1, T2]: - first: T1 - second: T2 - def __init__(self: Pair, a: T1, b: T2) -> t.CInt: pass - def sum_as_int(self: Pair) -> t.CInt: pass - -def test_explicit_pair() -> t.CInt: pass - - -class Wrapper[T]: - data: T - def __init__(self: Wrapper, v: T) -> t.CInt: pass - def get(self: Wrapper) -> T: pass - -def test_mixed_generic_class() -> t.CInt: pass - - -class Counter[T]: - count: T - def __init__(self: Counter, start: T) -> t.CInt: pass - def increment(self: Counter) -> t.CInt: pass - def get_count(self: Counter) -> T: pass - -def test_explicit_counter() -> t.CInt: pass - -def test_explicit_box_set() -> t.CInt: pass - -def main() -> t.CInt: pass diff --git a/Test/GenericTest4/temp/748d0424e8976fa0.stub.ll.dep b/Test/GenericTest4/temp/748d0424e8976fa0.stub.ll.dep deleted file mode 100644 index be4eebc..0000000 --- a/Test/GenericTest4/temp/748d0424e8976fa0.stub.ll.dep +++ /dev/null @@ -1 +0,0 @@ -285b6aa29a34754d|bbdf3bbd4c3bc28c|f5522571bcce7bcb|fc980acec33d69a7 \ No newline at end of file diff --git a/Test/GenericTest4/temp/748d0424e8976fa0.vpi b/Test/GenericTest4/temp/748d0424e8976fa0.vpi deleted file mode 100644 index 5ff4850..0000000 --- a/Test/GenericTest4/temp/748d0424e8976fa0.vpi +++ /dev/null @@ -1,31 +0,0 @@ -""" -Auto-generated Python stub file from testcheck.vp -Module: testcheck -""" - - -import t, c -import stdio -from w32.win32console import SetConsoleOutputCP, SetConsoleCP - -CP_UTF8: t.CDefine = 65001 -_pass_count: t.CExtern | t.CInt -_fail_count: t.CExtern | t.CInt -_total_pass: t.CExtern | t.CInt -_total_fail: t.CExtern | t.CInt - -def begin(name: str) -> t.CInt: pass - -def section(name: str) -> t.CInt: pass - -def ok(msg: str) -> t.CInt: pass - -def fail(msg: str) -> t.CInt: pass - -def check(cond: t.CInt, ok_msg: str, fail_msg: str) -> t.CInt: pass - -def info(msg: str) -> t.CInt: pass - -def end() -> t.CInt: pass - -def summary() -> t.CInt: pass diff --git a/Test/GenericTest4/temp/_phase1_manifest.json b/Test/GenericTest4/temp/_phase1_manifest.json deleted file mode 100644 index d634067..0000000 --- a/Test/GenericTest4/temp/_phase1_manifest.json +++ /dev/null @@ -1 +0,0 @@ -{"d:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\GenericTest4\\App\\main.vp": {"sha1": "42e09c6149524d9d", "mtime": 1784741370.3625746, "size": 3247}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.vp": {"sha1": "f5522571bcce7bcb", "mtime": 1785563642.3805652, "size": 4356}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.vp": {"sha1": "285b6aa29a34754d", "mtime": 1785332415.1829746, "size": 561}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.vp": {"sha1": "748d0424e8976fa0", "mtime": 1785332415.20287, "size": 1919}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.vp": {"sha1": "fc980acec33d69a7", "mtime": 1785332415.2228394, "size": 2653}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.vp": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/GenericTest4/temp/_sha1_map.txt b/Test/GenericTest4/temp/_sha1_map.txt deleted file mode 100644 index 5d7d5e1..0000000 --- a/Test/GenericTest4/temp/_sha1_map.txt +++ /dev/null @@ -1,6 +0,0 @@ -285b6aa29a34754d:includes/stdio.vp -42e09c6149524d9d:main.vp -748d0424e8976fa0:includes/testcheck.vp -bbdf3bbd4c3bc28c:includes/w32\win32console.vp -f5522571bcce7bcb:includes/stdint.vp -fc980acec33d69a7:includes/w32\win32base.vp diff --git a/Test/GenericTest4/temp/bbdf3bbd4c3bc28c.stub.ll.dep b/Test/GenericTest4/temp/bbdf3bbd4c3bc28c.stub.ll.dep deleted file mode 100644 index d4b382c..0000000 --- a/Test/GenericTest4/temp/bbdf3bbd4c3bc28c.stub.ll.dep +++ /dev/null @@ -1 +0,0 @@ -f5522571bcce7bcb|fc980acec33d69a7 \ No newline at end of file diff --git a/Test/GenericTest4/temp/bbdf3bbd4c3bc28c.vpi b/Test/GenericTest4/temp/bbdf3bbd4c3bc28c.vpi deleted file mode 100644 index 4709b3e..0000000 --- a/Test/GenericTest4/temp/bbdf3bbd4c3bc28c.vpi +++ /dev/null @@ -1,138 +0,0 @@ -""" -Auto-generated Python stub file from w32.win32console.vp -Module: w32.win32console -""" - -import c - - -import t -from stdint import * -from w32.win32base import * - -ENABLE_PROCESSED_INPUT: t.CDefine = 0x0001 -ENABLE_LINE_INPUT: t.CDefine = 0x0002 -ENABLE_ECHO_INPUT: t.CDefine = 0x0004 -ENABLE_WINDOW_INPUT: t.CDefine = 0x0008 -ENABLE_MOUSE_INPUT: t.CDefine = 0x0010 -ENABLE_INSERT_MODE: t.CDefine = 0x0020 -ENABLE_QUICK_EDIT_MODE: t.CDefine = 0x0040 -ENABLE_EXTENDED_FLAGS: t.CDefine = 0x0080 -ENABLE_PROCESSED_OUTPUT: t.CDefine = 0x0001 -ENABLE_WRAP_AT_EOL_OUTPUT: t.CDefine = 0x0002 -ENABLE_VIRTUAL_TERMINAL_PROCESSING: t.CDefine = 0x0004 -DISABLE_NEWLINE_AUTO_RETURN: t.CDefine = 0x0008 -ENABLE_LVB_GRID_WORLDWIDE: t.CDefine = 0x0010 -FOREGROUND_BLUE: t.CDefine = 0x0001 -FOREGROUND_GREEN: t.CDefine = 0x0002 -FOREGROUND_RED: t.CDefine = 0x0004 -FOREGROUND_INTENSITY: t.CDefine = 0x0008 -BACKGROUND_BLUE: t.CDefine = 0x0010 -BACKGROUND_GREEN: t.CDefine = 0x0020 -BACKGROUND_RED: t.CDefine = 0x0040 -BACKGROUND_INTENSITY: t.CDefine = 0x0080 -KEY_EVENT: t.CDefine = 0x0001 -MOUSE_EVENT: t.CDefine = 0x0002 -WINDOW_BUFFER_SIZE_EVENT: t.CDefine = 0x0004 -MENU_EVENT: t.CDefine = 0x0008 -FOCUS_EVENT: t.CDefine = 0x0010 - -class COORD: - X: SHORT - Y: SHORT -class SMALL_RECT: - Left: SHORT - Top: SHORT - Right: SHORT - Bottom: SHORT -class CONSOLE_SCREEN_BUFFER_INFO: - dwSize: COORD - dwCursorPosition: COORD - wAttributes: WORD - srWindow: SMALL_RECT - dwMaximumWindowSize: COORD -class CONSOLE_CURSOR_INFO: - dwSize: ULONG - bVisible: BOOL -class CHAR_INFO: - UnicodeChar: WCHAR - Attributes: WORD -class KEY_EVENT_RECORD: - bKeyDown: BOOL - wRepeatCount: WORD - wVirtualKeyCode: WORD - wVirtualScanCode: WORD - uChar: WCHAR - dwControlKeyState: ULONG -class MOUSE_EVENT_RECORD: - dwMousePosition: COORD - dwButtonState: ULONG - dwControlKeyState: ULONG - dwEventFlags: ULONG -class WINDOW_BUFFER_SIZE_RECORD: - dwSize: COORD -class INPUT_RECORD: - EventType: WORD - Event: KEY_EVENT_RECORD - -def SetConsoleOutputCP(codepage: UINT) -> BOOL | t.State: pass - -def SetConsoleCP(codepage: UINT) -> BOOL | t.State: pass - -def GetConsoleCP() -> UINT | t.State: pass - -def GetConsoleOutputCP() -> UINT | t.State: pass - -def GetConsoleScreenBufferInfo(hConsoleOutput: HANDLE, lpConsoleScreenBufferInfo: CONSOLE_SCREEN_BUFFER_INFO | t.CPtr) -> BOOL | t.State: pass - -def SetConsoleScreenBufferSize(hConsoleOutput: HANDLE, dwSize: COORD) -> BOOL | t.State: pass - -def SetConsoleCursorPosition(hConsoleOutput: HANDLE, dwCursorPosition: COORD) -> BOOL | t.State: pass - -def GetConsoleCursorInfo(hConsoleOutput: HANDLE, lpConsoleCursorInfo: CONSOLE_CURSOR_INFO | t.CPtr) -> BOOL | t.State: pass - -def SetConsoleCursorInfo(hConsoleOutput: HANDLE, lpConsoleCursorInfo: CONSOLE_CURSOR_INFO | t.CPtr) -> BOOL | t.State: pass - -def SetConsoleTextAttribute(hConsoleOutput: HANDLE, wAttributes: WORD) -> BOOL | t.State: pass - -def FillConsoleOutputCharacterA(hConsoleOutput: HANDLE, cCharacter: t.CChar, nLength: ULONG, dwWriteCoord: COORD, lpNumberOfCharsWritten: ULONG | t.CPtr) -> BOOL | t.State: pass - -def FillConsoleOutputCharacterW(hConsoleOutput: HANDLE, cCharacter: WCHAR, nLength: ULONG, dwWriteCoord: COORD, lpNumberOfCharsWritten: ULONG | t.CPtr) -> BOOL | t.State: pass - -def FillConsoleOutputAttribute(hConsoleOutput: HANDLE, wAttribute: WORD, nLength: ULONG, dwWriteCoord: COORD, lpNumberOfAttrsWritten: ULONG | t.CPtr) -> BOOL | t.State: pass - -def WriteConsoleA(hConsoleOutput: HANDLE, lpBuffer: t.CConst | VOIDPTR, nNumberOfCharsToWrite: ULONG, lpNumberOfCharsWritten: ULONG | t.CPtr, lpReserved: VOIDPTR) -> BOOL | t.State: pass - -def WriteConsoleW(hConsoleOutput: HANDLE, lpBuffer: t.CConst | VOIDPTR, nNumberOfCharsToWrite: ULONG, lpNumberOfCharsWritten: ULONG | t.CPtr, lpReserved: VOIDPTR) -> BOOL | t.State: pass - -def ReadConsoleA(hConsoleInput: HANDLE, lpBuffer: VOIDPTR, nNumberOfCharsToRead: ULONG, lpNumberOfCharsRead: ULONG | t.CPtr, pInputControl: VOIDPTR) -> BOOL | t.State: pass - -def ReadConsoleW(hConsoleInput: HANDLE, lpBuffer: VOIDPTR, nNumberOfCharsToRead: ULONG, lpNumberOfCharsRead: ULONG | t.CPtr, pInputControl: VOIDPTR) -> BOOL | t.State: pass - -def GetConsoleMode(hConsoleHandle: HANDLE, lpMode: ULONG | t.CPtr) -> BOOL | t.State: pass - -def SetConsoleMode(hConsoleHandle: HANDLE, dwMode: ULONG) -> BOOL | t.State: pass - -def ReadConsoleInputA(hConsoleInput: HANDLE, lpBuffer: INPUT_RECORD | t.CPtr, nLength: ULONG, lpNumberOfEventsRead: ULONG | t.CPtr) -> BOOL | t.State: pass - -def ReadConsoleInputW(hConsoleInput: HANDLE, lpBuffer: INPUT_RECORD | t.CPtr, nLength: ULONG, lpNumberOfEventsRead: ULONG | t.CPtr) -> BOOL | t.State: pass - -def GetNumberOfConsoleInputEvents(hConsoleInput: HANDLE, lpNumberOfEvents: ULONG | t.CPtr) -> BOOL | t.State: pass - -def FlushConsoleInputBuffer(hConsoleInput: HANDLE) -> BOOL | t.State: pass - -def SetConsoleTitleA(lpConsoleTitle: LPCSTR) -> BOOL | t.State: pass - -def SetConsoleTitleW(lpConsoleTitle: LPCWSTR) -> BOOL | t.State: pass - -def GetConsoleTitleA(lpConsoleTitle: CHARPTR, nSize: ULONG) -> ULONG | t.State: pass - -def GetConsoleTitleW(lpConsoleTitle: WCHARPTR, nSize: ULONG) -> ULONG | t.State: pass - -def AllocConsole() -> BOOL | t.State: pass - -def FreeConsole() -> BOOL | t.State: pass - -def SetConsoleWindowInfo(hConsoleOutput: HANDLE, bAbsolute: BOOL, lpConsoleWindow: SMALL_RECT | t.CPtr) -> BOOL | t.State: pass - -def ScrollConsoleScreenBufferA(hConsoleOutput: HANDLE, lpScrollRectangle: SMALL_RECT | t.CPtr, lpClipRectangle: SMALL_RECT | t.CPtr, dwDestinationOrigin: COORD, lpFill: CHAR_INFO | t.CPtr) -> BOOL | t.State: pass diff --git a/Test/GenericTest4/temp/f5522571bcce7bcb.stub.ll.dep b/Test/GenericTest4/temp/f5522571bcce7bcb.stub.ll.dep deleted file mode 100644 index e69de29..0000000 diff --git a/Test/GenericTest4/temp/f5522571bcce7bcb.vpi b/Test/GenericTest4/temp/f5522571bcce7bcb.vpi deleted file mode 100644 index f0bc071..0000000 --- a/Test/GenericTest4/temp/f5522571bcce7bcb.vpi +++ /dev/null @@ -1,100 +0,0 @@ -""" -Auto-generated Python stub file from stdint.vp -Module: stdint -""" - -import c - - -import t - -INT: t.CTypedef = t.CInt -INTPTR: t.CTypedef = t.CInt | t.CPtr -BOOL: t.CTypedef = t.CInt -UINT: t.CTypedef = t.CUnsignedInt -UINTPTR: t.CTypedef = UINT | t.CPtr -BYTE: t.CTypedef = t.CUnsignedChar -BYTEPTR: t.CTypedef = BYTE | t.CPtr -WORD: t.CTypedef = t.CUInt16T -DWORD: t.CTypedef = t.CUInt32T -QWORD: t.CTypedef = t.CUInt64T -TCHAR: t.CTypedef = t.CChar -CHARLIST: t.CTypedef = str | t.CPtr -VOID: t.CTypedef = t.CVoid -SHORT: t.CTypedef = t.CShort -SHORTPTR: t.CTypedef = t.CShort | t.CPtr -USHORT: t.CTypedef = t.CUnsignedShort -USHORTPTR: t.CTypedef = t.CUnsignedShort | t.CPtr -LONGLONG: t.CTypedef = t.CLongLong -ULONGLONG: t.CTypedef = t.CUnsignedLongLong -LONG: t.CTypedef = t.CLong -ULONG: t.CTypedef = t.CUnsignedLong -WCHAR: t.CTypedef = WORD -WCHARPTR: t.CTypedef = WORD | t.CPtr -CHARPTR: t.CTypedef = t.CChar | t.CPtr -FSIZE_t: t.CTypedef = DWORD -LBA_t: t.CTypedef = DWORD -VOIDPTR: t.CTypedef = t.CVoid | t.CPtr -FLOAT: t.CTypedef = t.CFloat -DOUBLE: t.CTypedef = t.CDouble -FLOAT8: t.CTypedef = t.CFloat8T -FLOAT16: t.CTypedef = t.CFloat16T -FLOAT32: t.CTypedef = t.CFloat32T -FLOAT64: t.CTypedef = t.CFloat64T -FLOAT128: t.CTypedef = t.CFloat128T -INT8: t.CTypedef = t.CInt8T -INT16: t.CTypedef = t.CInt16T -INT32: t.CTypedef = t.CInt32T -INT64: t.CTypedef = t.CInt64T -UINT8: t.CTypedef = t.CUInt8T -UINT16: t.CTypedef = t.CUInt16T -UINT32: t.CTypedef = t.CUInt32T -UINT64: t.CTypedef = t.CUInt64T -INT8PTR: t.CTypedef = t.CInt8T | t.CPtr -INT16PTR: t.CTypedef = t.CInt16T | t.CPtr -INT32PTR: t.CTypedef = t.CInt32T | t.CPtr -INT64PTR: t.CTypedef = t.CInt64T | t.CPtr -UINT8PTR: t.CTypedef = t.CUInt8T | t.CPtr -UINT16PTR: t.CTypedef = t.CUInt16T | t.CPtr -UINT32PTR: t.CTypedef = t.CUInt32T | t.CPtr -UINT64PTR: t.CTypedef = t.CUInt64T | t.CPtr -CHAR8: t.CTypedef = t.CChar8T -CHAR16: t.CTypedef = t.CChar16T -CHAR32: t.CTypedef = t.CChar32T -CHAR8PTR: t.CTypedef = t.CChar8T | t.CPtr -CHAR16PTR: t.CTypedef = t.CChar16T | t.CPtr -CHAR32PTR: t.CTypedef = t.CChar32T | t.CPtr -i8: t.CTypedef = t.CInt8T -i16: t.CTypedef = t.CInt16T -i32: t.CTypedef = t.CInt32T -i64: t.CTypedef = t.CInt64T -u8: t.CTypedef = t.CUInt8T -u16: t.CTypedef = t.CUInt16T -u32: t.CTypedef = t.CUInt32T -u64: t.CTypedef = t.CUInt64T -SIZE_T: t.CTypedef = t.CSizeT -SSIZE_T: t.CTypedef = t.CPtrDiffT -PTRDIFF_T: t.CTypedef = t.CPtrDiffT -int8_t: t.CTypedef = t.CInt8T -int16_t: t.CTypedef = t.CInt16T -int32_t: t.CTypedef = t.CInt32T -int64_t: t.CTypedef = t.CInt64T -uint8_t: t.CTypedef = t.CUInt8T -uint16_t: t.CTypedef = t.CUInt16T -uint32_t: t.CTypedef = t.CUInt32T -uint64_t: t.CTypedef = t.CUInt64T -size_t: t.CTypedef = t.CSizeT -ssize_t: t.CTypedef = t.CPtrDiffT -ptrdiff_t: t.CTypedef = t.CPtrDiffT -intptr_t: t.CTypedef = t.CIntPtrT -uintptr_t: t.CTypedef = t.CUIntPtrT -wchar_t: t.CTypedef = t.CWCharT -char8_t: t.CTypedef = t.CChar8T -char16_t: t.CTypedef = t.CChar16T -char32_t: t.CTypedef = t.CChar32T -float8_t: t.CTypedef = t.CFloat8T -float16_t: t.CTypedef = t.CFloat16T -float32_t: t.CTypedef = t.CFloat32T -float64_t: t.CTypedef = t.CFloat64T -float128_t: t.CTypedef = t.CFloat128T -_Bool: t.CTypedef = t.CBool \ No newline at end of file diff --git a/Test/GenericTest4/temp/fc980acec33d69a7.stub.ll.dep b/Test/GenericTest4/temp/fc980acec33d69a7.stub.ll.dep deleted file mode 100644 index 793e7ed..0000000 --- a/Test/GenericTest4/temp/fc980acec33d69a7.stub.ll.dep +++ /dev/null @@ -1 +0,0 @@ -f5522571bcce7bcb \ No newline at end of file diff --git a/Test/GenericTest4/temp/fc980acec33d69a7.vpi b/Test/GenericTest4/temp/fc980acec33d69a7.vpi deleted file mode 100644 index 3f9feff..0000000 --- a/Test/GenericTest4/temp/fc980acec33d69a7.vpi +++ /dev/null @@ -1,100 +0,0 @@ -""" -Auto-generated Python stub file from w32.win32base.vp -Module: w32.win32base -""" - -import c - - -import t -from stdint import * - -HANDLE: t.CTypedef = VOIDPTR -LPCSTR: t.CTypedef = t.CConst | t.CChar | t.CPtr -LPCWSTR: t.CTypedef = t.CConst | t.CUnsignedShort | t.CPtr -INVALID_HANDLE_VALUE: t.CDefine = -1 -NULL: t.CDefine = 0 -TRUE: t.CDefine = 1 -FALSE: t.CDefine = 0 -INFINITE: t.CDefine = 0xFFFFFFFF -WAIT_FAILED: t.CDefine = 0xFFFFFFFF -WAIT_OBJECT_0: t.CDefine = 0 -WAIT_TIMEOUT: t.CDefine = 258 -WAIT_ABANDONED: t.CDefine = 0x80 -MAX_PATH: t.CDefine = 260 -ERROR_SUCCESS: t.CDefine = 0 -ERROR_FILE_NOT_FOUND: t.CDefine = 2 -ERROR_ACCESS_DENIED: t.CDefine = 5 -ERROR_INSUFFICIENT_BUFFER: t.CDefine = 122 - -class SECURITY_ATTRIBUTES: - nLength: ULONG - lpSecurityDescriptor: VOIDPTR - bInheritHandle: BOOL -class OVERLAPPED: - Internal: ULONGLONG - InternalHigh: ULONGLONG - Offset: ULONG - OffsetHigh: ULONG - hEvent: HANDLE -class FILETIME: - dwLowDateTime: DWORD - dwHighDateTime: DWORD -class SYSTEMTIME: - wYear: WORD - wMonth: WORD - wDayOfWeek: WORD - wDay: WORD - wHour: WORD - wMinute: WORD - wSecond: WORD - wMilliseconds: WORD -class GUID: - Data1: DWORD - Data2: WORD - Data3: WORD - Data4: BYTEPTR -class LARGE_INTEGER: - QuadPart: LONGLONG -class ULARGE_INTEGER: - QuadPart: ULONGLONG - -def GetLastError() -> ULONG | t.State: pass - -def SetLastError(dwErrCode: ULONG) -> t.State: pass - -def CloseHandle(hObject: HANDLE) -> BOOL | t.State: pass - -def GetProcAddress(hModule: HANDLE, lpProcName: LPCSTR) -> VOIDPTR | t.State: pass - -def GetModuleHandleA(lpModuleName: LPCSTR) -> HANDLE | t.State: pass - -def GetModuleHandleW(lpModuleName: LPCWSTR) -> HANDLE | t.State: pass - -def LoadLibraryA(lpLibFileName: LPCSTR) -> HANDLE | t.State: pass - -def LoadLibraryW(lpLibFileName: LPCWSTR) -> HANDLE | t.State: pass - -def FreeLibrary(hLibModule: HANDLE) -> BOOL | t.State: pass - -def GetSystemTime(lpSystemTime: SYSTEMTIME | t.CPtr) -> t.State: pass - -def GetLocalTime(lpSystemTime: SYSTEMTIME | t.CPtr) -> t.State: pass - -def FileTimeToSystemTime(lpFileTime: FILETIME | t.CPtr, lpSystemTime: SYSTEMTIME | t.CPtr) -> BOOL | t.State: pass - -def SystemTimeToFileTime(lpSystemTime: SYSTEMTIME | t.CPtr, lpFileTime: FILETIME | t.CPtr) -> BOOL | t.State: pass - -def QueryPerformanceCounter(lpPerformanceCount: LARGE_INTEGER | t.CPtr) -> BOOL | t.State: pass - -def QueryPerformanceFrequency(lpFrequency: LARGE_INTEGER | t.CPtr) -> BOOL | t.State: pass - -def Sleep(dwMilliseconds: ULONG) -> t.State: pass - -def SleepEx(dwMilliseconds: ULONG, bAlertable: BOOL) -> ULONG | t.State: pass - -def GetTickCount() -> ULONG | t.State: pass - -def GetTickCount64() -> ULONGLONG | t.State: pass - -def GetCommandLineA() -> CHARPTR | t.State: pass diff --git a/lib/core/Handles/HandlesExprAttr.py b/lib/core/Handles/HandlesExprAttr.py index b1b921a..0e1f566 100644 --- a/lib/core/Handles/HandlesExprAttr.py +++ b/lib/core/Handles/HandlesExprAttr.py @@ -652,7 +652,16 @@ class ExprAttrHandle(BaseHandle): Gen.class_member_bitoffsets[ClassName][AttrName] = bo return self._load_bitfield_member(ObjVal, ClassName, AttrName) - offset = Gen._get_member_offset(AttrName, ClassName) + try: + offset = Gen._get_member_offset(AttrName, ClassName) + except KeyError as _ke: + _vsc2: Any = getattr(Gen, 'var_struct_class', {}) or {} + raise KeyError( + f"{_ke} | [attr-diag] var={VarName} " + f"var_struct_class={_vsc2.get(VarName)!r} " + f"objval_pointee={getattr(getattr(ObjVal, 'type', None), 'pointee', None)!r} " + f"node={self._ExprText(Node)!r} " + f"base={self._ExprText(Node.value)!r}") from None # 检查 offset 是否超出实际结构体 if isinstance(ObjVal.type, ir.PointerType): actual_pointee: Any = ObjVal.type.pointee @@ -763,8 +772,18 @@ class ExprAttrHandle(BaseHandle): return cdefine_result ObjVal: Any = self.HandleExprLlvm(Node.value) if not ObjVal or not isinstance(ObjVal.type, ir.PointerType): + import sys as _sys1 + _sys1.stderr.write( + f"[CHAIN-DBG] nested no-obj: node={self._ExprText(Node)!r} " + f"inner={self._ExprText(Node.value)!r} objval_type={getattr(ObjVal, 'type', None)!r}\n") return None pointee: Any = ObjVal.type.pointee + if not (isinstance(pointee, ir.IntType) + or isinstance(pointee, (ir.LiteralStructType, ir.IdentifiedStructType))): + import sys as _sys1b + _sys1b.stderr.write( + f"[CHAIN-DBG] nested unhandled-pointee: node={self._ExprText(Node)!r} " + f"objval_type={ObjVal.type!r} pointee={pointee!r}\n") # char* → struct* cast + 成员访问 if isinstance(pointee, ir.IntType) and pointee.width == 8: @@ -788,23 +807,34 @@ class ExprAttrHandle(BaseHandle): AttrClassName = self._resolve_attr_parent_hint(Node.value, Gen) ResolvedKey: str | None = self._find_struct_key_for_class_hint(Gen, AttrClassName) if ResolvedKey is None or ResolvedKey not in Gen.structs: + import sys as _sys2 + _sys2.stderr.write( + f"[CHAIN-DBG] char* key-miss: node={self._ExprText(Node)!r} " + f"attr_class={AttrClassName!r} resolved_key={ResolvedKey!r} " + f"objval_type={ObjVal.type!r}\n") return None st: Any ok: bool st, ok = self._try_Load_struct_from_stub(Gen, ResolvedKey) if not isinstance(st, ir.IdentifiedStructType): + import sys as _sys3 + _sys3.stderr.write(f"[CHAIN-DBG] char* not-struct: key={ResolvedKey!r} st={st!r}\n") return None if st.elements is None: # stub 仍 opaque(如跨模块泛型仅声明):走泛型特化候选访问 spec_val: Any = self._try_access_opaque_generic_member(Gen, ObjVal, st, Node, ResolvedKey, AttrClassName) if spec_val is not None: return spec_val + import sys as _sys4 + _sys4.stderr.write(f"[CHAIN-DBG] char* opaque-miss: key={ResolvedKey!r} node={self._ExprText(Node)!r}\n") return None CastedObj: Any = Gen.builder.bitcast(ObjVal, ir.PointerType(st), name=f"cast_{ResolvedKey}") if Node.attr in Gen.class_member_bitoffsets.get(ResolvedKey, {}): return self._load_bitfield_member(CastedObj, ResolvedKey, Node.attr) offset: int | None = Gen._get_member_offset(Node.attr, ResolvedKey) if offset is None: + import sys as _sys5 + _sys5.stderr.write(f"[CHAIN-DBG] char* offset-miss: key={ResolvedKey!r} attr={Node.attr!r} st={st!r}\n") return None if offset < len(st.elements) and isinstance(st.elements[offset], ir.VoidType): return None @@ -833,7 +863,15 @@ class ExprAttrHandle(BaseHandle): bitfield_offsets: Any = Gen.class_member_bitoffsets.get(CN, {}) if Node.attr in bitfield_offsets: return self._load_bitfield_member(ObjVal, CN, Node.attr) - offset = Gen._get_member_offset(Node.attr, CN) + try: + offset = Gen._get_member_offset(Node.attr, CN) + except KeyError as _ke2: + raise KeyError( + f"{_ke2} | [attr-diag-nested] " + f"objval_pointee={getattr(getattr(ObjVal, 'type', None), 'pointee', None)!r} " + f"node={self._ExprText(Node)!r} " + f"inner={self._ExprText(Node.value)!r} " + f"parent_hint={parent_hint!r}") from None if offset is None: break # 泛型基础类型字段特化(根本修复): @@ -1732,15 +1770,20 @@ class ExprAttrHandle(BaseHandle): """把 class_member_element_class 记录的类/特化名解析为 Gen.structs 的真实键。 记录值可能是裸名('GSList[BasicBlock]')或带 sha1 前缀 - ('8e92345fd262a343.GSList[BasicBlock]'),而 Gen.structs 的键可能是 - 另一种形态。依次尝试:精确键 → 短名键 → class_sha1_map 重建前缀键 → - 遍历 Gen.structs 按短名匹配。 + ('8e92345fd262a343.GSList[BasicBlock]'),且**方括号内元素也可能带模块 + 前缀**('GSList[29fdb5e25dc949f4.BasicBlock]',跨模块泛型特化登记值)。 + Gen.structs 的键可能是另一种形态。比较前统一剥除所有 '<16hex>.' 片段: + 依次尝试:精确键 → 归一短名键 → class_sha1_map 重建前缀键 → + 遍历 Gen.structs 按归一短名匹配。 """ if not ClassHint: return None if ClassHint in Gen.structs: return ClassHint - short: str = Gen._extract_short_name(ClassHint) + import re as _re_sha + def _strip_sha(s: str) -> str: + return _re_sha.sub(r'(?i)[0-9a-f]{16}\.', '', s) + short: str = _strip_sha(Gen._extract_short_name(ClassHint)) if short in Gen.structs: return short expected_sha1: str | None = (getattr(Gen, 'class_sha1_map', {}) or {}).get(short) @@ -1749,7 +1792,7 @@ class ExprAttrHandle(BaseHandle): if prefixed in Gen.structs: return prefixed for key in Gen.structs: - if Gen._extract_short_name(key) == short: + if _strip_sha(Gen._extract_short_name(key)) == short: return key return None @@ -1883,7 +1926,10 @@ class ExprAttrHandle(BaseHandle): ok_v: bool st_v, ok_v = self._try_Load_struct_from_stub(Gen, owner_key) if isinstance(st_v, ir.IdentifiedStructType) and st_v.elements is not None: - off: int | None = Gen._get_member_offset(AttrName, owner_key) + try: + off: int | None = Gen._get_member_offset(AttrName, owner_key) + except KeyError: + off = None if off is not None and off < len(st_v.elements): k3: str | None = self._pointee_llvm_to_struct_key(Gen, st_v.elements[off]) if k3: @@ -1898,7 +1944,10 @@ class ExprAttrHandle(BaseHandle): p_ok: bool p_st, p_ok = self._try_Load_struct_from_stub(Gen, p_key) if isinstance(p_st, ir.IdentifiedStructType) and p_st.elements is not None: - p_off: int | None = Gen._get_member_offset(AttrName, p_key) + try: + p_off: int | None = Gen._get_member_offset(AttrName, p_key) + except KeyError: + p_off = None if p_off is not None and p_off < len(p_st.elements): k4: str | None = self._pointee_llvm_to_struct_key(Gen, p_st.elements[p_off]) if k4: diff --git a/lib/core/Handles/HandlesFunctions.py b/lib/core/Handles/HandlesFunctions.py index 69b1d5d..5ac351d 100644 --- a/lib/core/Handles/HandlesFunctions.py +++ b/lib/core/Handles/HandlesFunctions.py @@ -1792,6 +1792,44 @@ class FunctionHandle(BaseHandle): found_struct: str | None = FindStructNameInAnnotation(arg.annotation, Gen.structs) if found_struct: Gen.var_struct_class[param_name] = found_struct + # 普通类注解形参(非 BinOp 联合):rowptr[X] / t.CPtr[X] / X / t.X + # 一律按"声明类"登记 var_struct_class。避免按 param.type.pointee 匹配 + # 到泛型父特化(如 class Function(GSListNode[Function]) 的形参 func 被 + # 登记成 GSListNode[Function],其 struct 仅含 Next → func.Blocks 访问 + # fast-fail "属性 'Blocks' 在类 'GSListNode[Function]' 中找不到")。 + # 泛型占位(rowptr[T])的 T 不在 Gen.structs,自动跳过、保留 pointee 匹配。 + for i, arg in enumerate(Node.args.args): + if arg.annotation is None: + continue + if isinstance(arg.annotation, ast.BinOp) and isinstance(arg.annotation.op, ast.BitOr): + continue # 联合注解由上方循环处理 + param_name = ParamNames[i] if i < len(ParamNames) else arg.arg + if param_name not in Gen.variables: + continue + ann = arg.annotation + target: str | None = None + if isinstance(ann, ast.Name): + target = ann.id + elif isinstance(ann, ast.Attribute): + target = ann.attr + elif isinstance(ann, ast.Subscript): + subv = ann.value + subname = getattr(subv, 'id', None) or getattr(subv, 'attr', '') + if subname in ('rowptr', 'CPtr', 'Ptr'): + slc = ann.slice + if isinstance(slc, ast.Name): + target = slc.id + elif isinstance(slc, ast.Attribute): + target = slc.attr + if not target: + continue + key: str | None = target if target in Gen.structs else None + if key is None: + _sha_t: str | None = (getattr(Gen, 'class_sha1_map', {}) or {}).get(target) + if _sha_t and f'{_sha_t}.{target}' in Gen.structs: + key = f'{_sha_t}.{target}' + if key: + Gen.var_struct_class[param_name] = key if ResolvedClassName and (IsMethod or RawFuncName == '__init__'): self.Trans._CurrentCpythonObjectClass = ResolvedClassName Gen._variadic_info = None diff --git a/lib/core/LLVMCG/FuncGen.py b/lib/core/LLVMCG/FuncGen.py index 54bcd73..3154d29 100644 --- a/lib/core/LLVMCG/FuncGen.py +++ b/lib/core/LLVMCG/FuncGen.py @@ -3,6 +3,7 @@ from typing import Any import vast as ast import os import re +import sys import llvmlite.ir as ir from lib.core.Handles.HandlesBase import CTypeInfo from lib.core.VLogger import get_logger as _vlog @@ -502,6 +503,11 @@ class FuncGenMixin: if isinstance(_st_diag, ir.IdentifiedStructType): _struct_diag = f"{len(_st_diag.elements)} elems" if _st_diag.elements is not None else 'opaque' _member_names_diag: list = [n for n, _ in _members_diag][:16] + try: + import traceback as _tb + _tb.print_stack(file=sys.stderr) + except Exception: + pass raise KeyError( f"[fast-fail] 属性 '{field_name}' 在类 '{ClassName}' 中找不到" f"(class_members={len(_members_diag)} 个: {_member_names_diag}, struct={_struct_diag})"