From 4e66207ba1de6b27b5e2976584fbcd6c864227fc Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sun, 19 Jul 2026 11:38:15 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E7=BD=AE=E4=B8=8A=E4=BC=A0=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=E5=A4=9A=E4=B8=AA=E6=A0=87=E5=87=86?= =?UTF-8?q?=E5=BA=93=EF=BC=8C=E5=BC=80=E5=A7=8B=20TransPyV=20=E8=87=AA?= =?UTF-8?q?=E4=B8=BE=E5=AE=9E=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .transpyc_cache/0019c939aae7f9f1.pyi | 14 - .transpyc_cache/001c1416e7a7dc50.doc.json | 1 - .transpyc_cache/001c1416e7a7dc50.pyi | 31 - .transpyc_cache/0029db369f740dd9.doc.json | 1 - .transpyc_cache/0029db369f740dd9.pyi | 30 - .transpyc_cache/02885f6f134079c2.doc.json | 1 - .transpyc_cache/02885f6f134079c2.pyi | 68 - .transpyc_cache/02d833b3cf571c5b.pyi | 18 - .transpyc_cache/03b24bc1d9327958.pyi | 21 - .transpyc_cache/03eeb0bea44f6637.doc.json | 1 - .transpyc_cache/03eeb0bea44f6637.pyi | 171 -- .transpyc_cache/04673ecc3aec489e.doc.json | 1 - .transpyc_cache/04673ecc3aec489e.pyi | 171 -- .transpyc_cache/05c11f22675c60cb.pyi | 50 - .transpyc_cache/05db996fc87ebdaa.doc.json | 1 - .transpyc_cache/05db996fc87ebdaa.pyi | 52 - .transpyc_cache/067f811511854c88.pyi | 48 - .transpyc_cache/07a8c82a8ca2be90.doc.json | 1 - .transpyc_cache/07a8c82a8ca2be90.pyi | 24 - .transpyc_cache/07f7da85af876124.doc.json | 1 - .transpyc_cache/07f7da85af876124.pyi | 10 - .transpyc_cache/0853acdbdfc9b27c.doc.json | 1 - .transpyc_cache/0853acdbdfc9b27c.pyi | 22 - .transpyc_cache/08ea5281873244fd.doc.json | 1 - .transpyc_cache/08ea5281873244fd.pyi | 19 - .transpyc_cache/08f96e9e0bc0501b.doc.json | 1 - .transpyc_cache/08f96e9e0bc0501b.pyi | 34 - .transpyc_cache/0900c165e9bcb8f1.doc.json | 1 - .transpyc_cache/0900c165e9bcb8f1.pyi | 173 -- .transpyc_cache/0b82fcb0aa3212c5.doc.json | 1 - .transpyc_cache/0b82fcb0aa3212c5.pyi | 31 - .transpyc_cache/0c212981c180e7fb.pyi | 67 - .transpyc_cache/0c56128647a0b845.doc.json | 1 - .transpyc_cache/0c56128647a0b845.pyi | 74 - .transpyc_cache/0df65b8ed15664b0.pyi | 30 - .transpyc_cache/0e1189314c937ef1.doc.json | 1 - .transpyc_cache/0e1189314c937ef1.pyi | 30 - .transpyc_cache/0eccc2393466d940.doc.json | 1 - .transpyc_cache/0eccc2393466d940.pyi | 18 - .transpyc_cache/0f8134f67bdaba8f.doc.json | 1 - .transpyc_cache/0f8134f67bdaba8f.pyi | 122 -- .transpyc_cache/0fef3cb77da3dae3.doc.json | 1 - .transpyc_cache/0fef3cb77da3dae3.pyi | 171 -- .transpyc_cache/10ac4af023af7962.doc.json | 1 - .transpyc_cache/10ac4af023af7962.pyi | 66 - .transpyc_cache/117b4962d332b4c5.doc.json | 1 - .transpyc_cache/117b4962d332b4c5.pyi | 60 - .transpyc_cache/1193c9cd16698da8.doc.json | 1 - .transpyc_cache/1193c9cd16698da8.pyi | 39 - .transpyc_cache/13110effbb0bb06c.pyi | 35 - .transpyc_cache/13d9449413372bde.pyi | 93 - .transpyc_cache/1446e90e8296beae.doc.json | 1 - .transpyc_cache/1446e90e8296beae.pyi | 171 -- .transpyc_cache/146a976893eef52b.doc.json | 1 - .transpyc_cache/146a976893eef52b.pyi | 104 - .transpyc_cache/14a9b576ab5d21c9.doc.json | 1 - .transpyc_cache/14a9b576ab5d21c9.pyi | 32 - ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 .transpyc_cache/16e1f65b154831e8.doc.json | 1 - .transpyc_cache/16e1f65b154831e8.pyi | 64 - .transpyc_cache/17c0dfbcebfa3a0e.doc.json | 1 - .transpyc_cache/17c0dfbcebfa3a0e.pyi | 71 - .transpyc_cache/19b6605d568c8584.doc.json | 1 - .transpyc_cache/19b6605d568c8584.pyi | 60 - .transpyc_cache/19f8024d10c828e8.pyi | 35 - .transpyc_cache/1a3af346a22d2cb6.doc.json | 1 - .transpyc_cache/1a3af346a22d2cb6.pyi | 34 - .transpyc_cache/1b58766d38d05de3.doc.json | 1 - .transpyc_cache/1b58766d38d05de3.pyi | 35 - .transpyc_cache/1b9ab264a942c56b.doc.json | 1 - .transpyc_cache/1b9ab264a942c56b.pyi | 27 - .transpyc_cache/1c46d554b3a3f9f3.pyi | 125 -- .transpyc_cache/1c8a1eceb26a43f4.doc.json | 1 - .transpyc_cache/1c8a1eceb26a43f4.pyi | 26 - .transpyc_cache/1df40188ee73ee05.doc.json | 1 - .transpyc_cache/1df40188ee73ee05.pyi | 23 - .transpyc_cache/1e19f516dc857768.doc.json | 1 - .transpyc_cache/1e19f516dc857768.pyi | 104 - .transpyc_cache/1eb1c9fc7e85d9f8.doc.json | 1 - .transpyc_cache/1eb1c9fc7e85d9f8.pyi | 10 - .transpyc_cache/1ed8ca4986cb0d65.doc.json | 1 - .transpyc_cache/1ed8ca4986cb0d65.pyi | 77 - .transpyc_cache/1ff2c5eb32359e40.doc.json | 1 - .transpyc_cache/1ff2c5eb32359e40.pyi | 16 - .transpyc_cache/2020b02f319dd87d.doc.json | 1 - .transpyc_cache/2020b02f319dd87d.pyi | 30 - .transpyc_cache/20cd49775c100a38.pyi | 22 - .transpyc_cache/212fb1de4f9d6e5c.doc.json | 1 - .transpyc_cache/212fb1de4f9d6e5c.pyi | 171 -- .transpyc_cache/213348433fb01cc6.pyi | 67 - .transpyc_cache/21a7fcfc665f75ef.pyi | 87 - .transpyc_cache/21fffba3315e81b4.doc.json | 1 - .transpyc_cache/21fffba3315e81b4.pyi | 60 - .transpyc_cache/22650858c377c847.doc.json | 1 - .transpyc_cache/22650858c377c847.pyi | 64 - .transpyc_cache/240a9a4157959a9f.pyi | 38 - .transpyc_cache/249b0b9083e25ad2.doc.json | 1 - .transpyc_cache/249b0b9083e25ad2.pyi | 31 - .transpyc_cache/24b9e251de12bd96.doc.json | 1 - .transpyc_cache/24b9e251de12bd96.pyi | 171 -- .transpyc_cache/24e26a8de1173993.doc.json | 1 - .transpyc_cache/24e26a8de1173993.pyi | 39 - .transpyc_cache/257e074b935c33b4.pyi | 45 - .transpyc_cache/25c18686adb93279.doc.json | 1 - .transpyc_cache/25c18686adb93279.pyi | 171 -- .transpyc_cache/2769dee537308b00.doc.json | 1 - .transpyc_cache/2769dee537308b00.pyi | 22 - .transpyc_cache/27b003cb178b709a.doc.json | 1 - .transpyc_cache/27b003cb178b709a.pyi | 104 - .transpyc_cache/2998b8f78d7022bf.doc.json | 1 - .transpyc_cache/2998b8f78d7022bf.pyi | 90 - .transpyc_cache/2ae1bee155fb09d3.doc.json | 1 - .transpyc_cache/2ae1bee155fb09d3.pyi | 139 -- .transpyc_cache/2c8ff1a30ee46867.doc.json | 1 - .transpyc_cache/2c8ff1a30ee46867.pyi | 84 - .transpyc_cache/2d39c6c7d3557b3e.pyi | 63 - .transpyc_cache/2da636c61863c815.pyi | 33 - .transpyc_cache/2ed380190e9df89e.doc.json | 1 - .transpyc_cache/2ed380190e9df89e.pyi | 33 - .transpyc_cache/2fcb6780db4d937f.doc.json | 1 - .transpyc_cache/2fcb6780db4d937f.pyi | 53 - .transpyc_cache/30a88f26e7679645.doc.json | 1 - .transpyc_cache/30a88f26e7679645.pyi | 171 -- .transpyc_cache/33a854a5c4f67d74.doc.json | 1 - .transpyc_cache/33a854a5c4f67d74.pyi | 38 - .transpyc_cache/34548789d646f432.pyi | 26 - .transpyc_cache/352a68eefae37a7c.doc.json | 1 - .transpyc_cache/352a68eefae37a7c.pyi | 171 -- .transpyc_cache/39178dc5ba692b92.doc.json | 1 - .transpyc_cache/39178dc5ba692b92.pyi | 31 - .transpyc_cache/3a56c52de621df8f.doc.json | 1 - .transpyc_cache/3a56c52de621df8f.pyi | 173 -- .transpyc_cache/3a769816ec956305.doc.json | 1 - .transpyc_cache/3a769816ec956305.pyi | 60 - .transpyc_cache/3ab9ec935db9efeb.doc.json | 1 - .transpyc_cache/3ab9ec935db9efeb.pyi | 89 - .transpyc_cache/3b76f342dcafa255.doc.json | 1 - .transpyc_cache/3b76f342dcafa255.pyi | 104 - .transpyc_cache/3c15289dd3f27ff8.doc.json | 1 - .transpyc_cache/3c15289dd3f27ff8.pyi | 84 - .transpyc_cache/3c2fbc9e35ad3bf2.doc.json | 1 - .transpyc_cache/3c2fbc9e35ad3bf2.pyi | 22 - .transpyc_cache/3cd87018ba1e76bc.doc.json | 1 - .transpyc_cache/3cd87018ba1e76bc.pyi | 108 -- .transpyc_cache/3d3edda4a4e6c08b.doc.json | 1 - .transpyc_cache/3d3edda4a4e6c08b.pyi | 30 - .transpyc_cache/3e914ffe8cc3c120.doc.json | 1 - .transpyc_cache/3f7c5e78d8652535.pyi | 128 -- .transpyc_cache/4020cac9bab5e9f1.doc.json | 1 - .transpyc_cache/4020cac9bab5e9f1.pyi | 45 - .transpyc_cache/4031ec3fbcff0767.doc.json | 1 - .transpyc_cache/4031ec3fbcff0767.pyi | 29 - .transpyc_cache/4175f14c5fbef360.doc.json | 1 - .transpyc_cache/4175f14c5fbef360.pyi | 17 - .transpyc_cache/42ced27d9e76aef5.pyi | 11 - .transpyc_cache/4337fb260448bbe2.pyi | 73 - .transpyc_cache/43b4b8f6ce3ed278.doc.json | 1 - .transpyc_cache/43b4b8f6ce3ed278.pyi | 171 -- .transpyc_cache/440f18f9dce85a95.doc.json | 1 - .transpyc_cache/440f18f9dce85a95.pyi | 52 - .transpyc_cache/451745df21e598af.pyi | 52 - .transpyc_cache/45242e16a6829016.doc.json | 1 - .transpyc_cache/45242e16a6829016.pyi | 104 - .transpyc_cache/47767b5026a8ee15.pyi | 241 --- .transpyc_cache/48dd999d59d8c008.doc.json | 1 - .transpyc_cache/48dd999d59d8c008.pyi | 75 - .transpyc_cache/48fa8cc758d3826b.doc.json | 1 - .transpyc_cache/48fa8cc758d3826b.pyi | 28 - .transpyc_cache/494eeec1e4c2f2ec.doc.json | 1 - .transpyc_cache/494eeec1e4c2f2ec.pyi | 60 - .transpyc_cache/49cae05490a513cb.doc.json | 1 - .transpyc_cache/49cae05490a513cb.pyi | 19 - .transpyc_cache/49cf633017627a4a.doc.json | 1 - .transpyc_cache/49cf633017627a4a.pyi | 44 - .transpyc_cache/4b639fa48e802b3b.doc.json | 1 - .transpyc_cache/4b639fa48e802b3b.pyi | 29 - .transpyc_cache/4ca69b583c572f13.doc.json | 1 - .transpyc_cache/4ca69b583c572f13.pyi | 68 - .transpyc_cache/4dd6b3f1427d1cc5.pyi | 82 - .transpyc_cache/4ebd3745aa9cf570.doc.json | 1 - .transpyc_cache/4ed910ba727b5e92.doc.json | 1 - .transpyc_cache/4ed910ba727b5e92.pyi | 171 -- .transpyc_cache/4ee832f9cf4db211.doc.json | 1 - .transpyc_cache/4ee832f9cf4db211.pyi | 81 - .transpyc_cache/4f90956b289db68b.doc.json | 1 - .transpyc_cache/4f90956b289db68b.pyi | 173 -- .transpyc_cache/4fb8940ff5ab1022.doc.json | 1 - .transpyc_cache/4fb8940ff5ab1022.pyi | 34 - .transpyc_cache/51f0144d6e8188d9.doc.json | 1 - .transpyc_cache/51f0144d6e8188d9.pyi | 25 - .transpyc_cache/52e6b51da061882f.doc.json | 1 - .transpyc_cache/52e6b51da061882f.pyi | 43 - .transpyc_cache/54014f6c53e9640b.doc.json | 1 - .transpyc_cache/54014f6c53e9640b.pyi | 139 -- .transpyc_cache/541a090dde0cc1ba.doc.json | 1 - .transpyc_cache/541a090dde0cc1ba.pyi | 27 - .transpyc_cache/541a1ed9b8be53c8.doc.json | 1 - .transpyc_cache/541a1ed9b8be53c8.pyi | 16 - .transpyc_cache/542aabc6fb546c35.doc.json | 1 - .transpyc_cache/542aabc6fb546c35.pyi | 52 - .transpyc_cache/55cbbb5dec4fef2c.doc.json | 1 - .transpyc_cache/55cbbb5dec4fef2c.pyi | 10 - .transpyc_cache/570919ef3f7c03ad.doc.json | 1 - .transpyc_cache/570919ef3f7c03ad.pyi | 60 - .transpyc_cache/57288496f7c2d1ad.pyi | 71 - .transpyc_cache/58f94f7fed04c816.doc.json | 1 - .transpyc_cache/58f94f7fed04c816.pyi | 104 - .transpyc_cache/594332d751ff7756.doc.json | 1 - .transpyc_cache/594332d751ff7756.pyi | 171 -- .transpyc_cache/5974af27e1cdb182.doc.json | 1 - .transpyc_cache/5974af27e1cdb182.pyi | 31 - .transpyc_cache/59e00d50660b941e.doc.json | 1 - .transpyc_cache/59e00d50660b941e.pyi | 19 - .transpyc_cache/59f7d653d72cce3a.doc.json | 1 - .transpyc_cache/59f7d653d72cce3a.pyi | 69 - .transpyc_cache/5b12e242d96b322f.doc.json | 1 - .transpyc_cache/5b12e242d96b322f.pyi | 104 - .transpyc_cache/5dab8cb390496d22.pyi | 182 -- .transpyc_cache/5e3d33857a0e37f6.doc.json | 1 - .transpyc_cache/5e3d33857a0e37f6.pyi | 171 -- .transpyc_cache/5e430ae5bf7af3a2.doc.json | 1 - .transpyc_cache/5e430ae5bf7af3a2.pyi | 13 - .transpyc_cache/5faaecd48491dce0.doc.json | 1 - .transpyc_cache/5faaecd48491dce0.pyi | 171 -- .transpyc_cache/5fc006555963c808.doc.json | 1 - .transpyc_cache/5fc006555963c808.pyi | 171 -- .transpyc_cache/605efc3aeda6b7a7.doc.json | 1 - .transpyc_cache/605efc3aeda6b7a7.pyi | 60 - .transpyc_cache/62cc01c2bb770ca3.pyi | 77 - .transpyc_cache/64ac83614c9bdbc6.doc.json | 1 - .transpyc_cache/64ac83614c9bdbc6.pyi | 85 - .transpyc_cache/6503c97dde0c79c4.pyi | 189 -- .transpyc_cache/6521d5529dba8eba.doc.json | 1 - .transpyc_cache/6521d5529dba8eba.pyi | 23 - .transpyc_cache/657e182b27c2a022.pyi | 226 --- .transpyc_cache/65c212dc0785f1aa.doc.json | 1 - .transpyc_cache/65c212dc0785f1aa.pyi | 104 - .transpyc_cache/663db7700139418e.doc.json | 1 - .transpyc_cache/663db7700139418e.pyi | 50 - .transpyc_cache/66de93aaeebc0601.doc.json | 1 - .transpyc_cache/66de93aaeebc0601.pyi | 25 - .transpyc_cache/6712b7f4f0f0e65d.doc.json | 1 - .transpyc_cache/6712b7f4f0f0e65d.pyi | 104 - .transpyc_cache/67e6e5ea72c0e13c.doc.json | 1 - .transpyc_cache/67e6e5ea72c0e13c.pyi | 171 -- .transpyc_cache/68ee8e1ac0994b13.doc.json | 1 - .transpyc_cache/68ee8e1ac0994b13.pyi | 139 -- .transpyc_cache/6961b76a167891e5.doc.json | 1 - .transpyc_cache/6961b76a167891e5.pyi | 88 - .transpyc_cache/69b86cf4726da53f.doc.json | 1 - .transpyc_cache/69b86cf4726da53f.pyi | 28 - .transpyc_cache/6a1088ddb47c1d62.doc.json | 1 - .transpyc_cache/6a1088ddb47c1d62.pyi | 104 - .transpyc_cache/6ab1c6b14ca3ded8.doc.json | 1 - .transpyc_cache/6ab1c6b14ca3ded8.pyi | 50 - .transpyc_cache/6b8853854d6ef556.doc.json | 1 - .transpyc_cache/6b8853854d6ef556.pyi | 23 - .transpyc_cache/6ba73c618fc5471e.doc.json | 1 - .transpyc_cache/6ba73c618fc5471e.pyi | 171 -- .transpyc_cache/6deb1a24b47f47fc.doc.json | 1 - .transpyc_cache/6deb1a24b47f47fc.pyi | 36 - .transpyc_cache/6f43cc10b998bf0b.doc.json | 1 - .transpyc_cache/6f43cc10b998bf0b.pyi | 104 - .transpyc_cache/6f5e876273093314.doc.json | 1 - .transpyc_cache/6f5e876273093314.pyi | 10 - .transpyc_cache/6ff26590374ae6fc.pyi | 39 - .transpyc_cache/717c696d67fecfc6.doc.json | 1 - .transpyc_cache/717c696d67fecfc6.pyi | 60 - .transpyc_cache/71b5771c2400c31a.doc.json | 1 - .transpyc_cache/71b5771c2400c31a.pyi | 81 - .transpyc_cache/71d73729480f2fd2.doc.json | 1 - .transpyc_cache/71d73729480f2fd2.pyi | 26 - .transpyc_cache/71e0a3ffcb3ebfad.pyi | 20 - .transpyc_cache/7259cdb36d66dc67.doc.json | 1 - .transpyc_cache/7259cdb36d66dc67.pyi | 39 - .transpyc_cache/73a5dbb3cd24b3bf.doc.json | 1 - .transpyc_cache/73a5dbb3cd24b3bf.pyi | 29 - .transpyc_cache/73fcdc4dd1618580.pyi | 29 - .transpyc_cache/744224bb5e87b5ef.doc.json | 1 - .transpyc_cache/744224bb5e87b5ef.pyi | 171 -- .transpyc_cache/74ca31446cac2107.doc.json | 1 - .transpyc_cache/74ca31446cac2107.pyi | 11 - .transpyc_cache/75583f20a922ab2e.doc.json | 1 - .transpyc_cache/75583f20a922ab2e.pyi | 38 - .transpyc_cache/75dc9247529e6e0e.doc.json | 1 - .transpyc_cache/75dc9247529e6e0e.pyi | 48 - .transpyc_cache/766d8e14db1ff917.doc.json | 1 - .transpyc_cache/766d8e14db1ff917.pyi | 169 -- .transpyc_cache/76dd6c275aa72b3b.pyi | 41 - .transpyc_cache/78418cf2ee722f0f.doc.json | 1 - .transpyc_cache/78418cf2ee722f0f.pyi | 50 - .transpyc_cache/784dde8a8697b7ab.doc.json | 1 - .transpyc_cache/784dde8a8697b7ab.pyi | 54 - .transpyc_cache/78943d0dbc89a29a.doc.json | 1 - .transpyc_cache/78943d0dbc89a29a.pyi | 16 - .transpyc_cache/78bbe886bbe5ca8f.doc.json | 1 - .transpyc_cache/78bbe886bbe5ca8f.pyi | 38 - .transpyc_cache/79ce76014465c04f.doc.json | 1 - .transpyc_cache/79ce76014465c04f.pyi | 136 -- .transpyc_cache/79ef7477acd14bd7.doc.json | 1 - .transpyc_cache/79ef7477acd14bd7.pyi | 69 - .transpyc_cache/7b6b920fefb08181.doc.json | 1 - .transpyc_cache/7b6b920fefb08181.pyi | 28 - .transpyc_cache/7bb99cc1646d2ae2.doc.json | 1 - .transpyc_cache/7bb99cc1646d2ae2.pyi | 44 - .transpyc_cache/7c5d5ec59c5fb0a8.doc.json | 1 - .transpyc_cache/7c5d5ec59c5fb0a8.pyi | 765 -------- .transpyc_cache/7e260c14d2712119.doc.json | 1 - .transpyc_cache/7e260c14d2712119.pyi | 42 - .transpyc_cache/7eb1251b89cc1b7d.doc.json | 1 - .transpyc_cache/7eb1251b89cc1b7d.pyi | 50 - .transpyc_cache/7fa5782c9657b2ba.doc.json | 1 - .transpyc_cache/7fa5782c9657b2ba.pyi | 14 - .transpyc_cache/7fff0dc7524a3a93.doc.json | 1 - .transpyc_cache/7fff0dc7524a3a93.pyi | 171 -- .transpyc_cache/80241c7d6f357bd1.doc.json | 1 - .transpyc_cache/80241c7d6f357bd1.pyi | 10 - .transpyc_cache/8046d45456d0b153.doc.json | 1 - .transpyc_cache/8046d45456d0b153.pyi | 18 - .transpyc_cache/814e6b31adfc6256.doc.json | 1 - .transpyc_cache/814e6b31adfc6256.pyi | 69 - .transpyc_cache/81eb28ba912467a6.doc.json | 1 - .transpyc_cache/81eb28ba912467a6.pyi | 35 - .transpyc_cache/83ba314b4637eec9.doc.json | 1 - .transpyc_cache/83ba314b4637eec9.pyi | 54 - .transpyc_cache/862591435f13ef30.doc.json | 1 - .transpyc_cache/862591435f13ef30.pyi | 171 -- .transpyc_cache/8639fbe371566e75.doc.json | 1 - .transpyc_cache/8639fbe371566e75.pyi | 29 - .transpyc_cache/8642175afa282a4f.doc.json | 1 - .transpyc_cache/8642175afa282a4f.pyi | 60 - .transpyc_cache/86e203c56ae4de20.doc.json | 1 - .transpyc_cache/86e203c56ae4de20.pyi | 27 - .transpyc_cache/888ea5bd6ab516ae.doc.json | 1 - .transpyc_cache/888ea5bd6ab516ae.pyi | 21 - .transpyc_cache/895376eafe64af68.doc.json | 1 - .transpyc_cache/895376eafe64af68.pyi | 12 - .transpyc_cache/8959998ad305c7b1.doc.json | 1 - .transpyc_cache/8959998ad305c7b1.pyi | 171 -- .transpyc_cache/8a97754e9e3c2b9a.doc.json | 1 - .transpyc_cache/8a97754e9e3c2b9a.pyi | 30 - .transpyc_cache/8e0d8fdba991b3b4.doc.json | 1 - .transpyc_cache/8e0d8fdba991b3b4.pyi | 25 - .transpyc_cache/8ebed83a7817fa0c.pyi | 15 - .transpyc_cache/8f12094c840be06a.doc.json | 1 - .transpyc_cache/8f12094c840be06a.pyi | 14 - .transpyc_cache/90921d009fdd674c.pyi | 56 - .transpyc_cache/90d4bbcb87a33305.doc.json | 1 - .transpyc_cache/90d4bbcb87a33305.pyi | 171 -- .transpyc_cache/9172f37e8d46721b.doc.json | 1 - .transpyc_cache/9172f37e8d46721b.pyi | 173 -- .transpyc_cache/91a2bd55f6b00ffc.doc.json | 1 - .transpyc_cache/91a2bd55f6b00ffc.pyi | 39 - .transpyc_cache/924ed8cd4ea5c4c2.doc.json | 1 - .transpyc_cache/924ed8cd4ea5c4c2.pyi | 38 - .transpyc_cache/93427ff78e455f30.doc.json | 1 - .transpyc_cache/93427ff78e455f30.pyi | 26 - .transpyc_cache/93816021912fb156.doc.json | 1 - .transpyc_cache/93816021912fb156.pyi | 27 - .transpyc_cache/93964ed348985612.doc.json | 1 - .transpyc_cache/93964ed348985612.pyi | 81 - .transpyc_cache/93c1d18e35d188d6.pyi | 53 - .../9474791561654346.pyi | 11 + .transpyc_cache/950028de389b7a7b.doc.json | 1 - .transpyc_cache/950028de389b7a7b.pyi | 41 - .transpyc_cache/953883473b8184c1.doc.json | 1 - .transpyc_cache/953883473b8184c1.pyi | 43 - .transpyc_cache/95394ca8da0f655a.pyi | 70 - .transpyc_cache/96368aa26ab1b560.doc.json | 1 - .transpyc_cache/96368aa26ab1b560.pyi | 56 - .transpyc_cache/96837bcc64032444.pyi | 13 - .transpyc_cache/969c589035910845.doc.json | 1 - .transpyc_cache/969c589035910845.pyi | 10 - .transpyc_cache/97043f0d52da437f.doc.json | 1 - .transpyc_cache/97043f0d52da437f.pyi | 26 - .transpyc_cache/982690df9fb41dde.doc.json | 1 - .transpyc_cache/982690df9fb41dde.pyi | 35 - .transpyc_cache/9852dff1297b8322.doc.json | 1 - .transpyc_cache/9852dff1297b8322.pyi | 169 -- .transpyc_cache/98826042e4664018.doc.json | 1 - .transpyc_cache/98826042e4664018.pyi | 56 - .transpyc_cache/9928c0bfda57ff30.doc.json | 1 - .transpyc_cache/9928c0bfda57ff30.pyi | 34 - .transpyc_cache/9b52a4613d3ad296.doc.json | 1 - .transpyc_cache/9b52a4613d3ad296.pyi | 41 - .transpyc_cache/9b7d2adaae94f021.doc.json | 1 - .transpyc_cache/9b7d2adaae94f021.pyi | 65 - .transpyc_cache/9ba128b762cf2b4d.doc.json | 1 - .transpyc_cache/9ba128b762cf2b4d.pyi | 139 -- .transpyc_cache/9d798d964b9d3411.doc.json | 1 - .transpyc_cache/9d798d964b9d3411.pyi | 28 - .transpyc_cache/9d8e1c9631c28b1b.doc.json | 1 - .transpyc_cache/9d8e1c9631c28b1b.pyi | 16 - .transpyc_cache/9e38ca4de81ccb6d.doc.json | 1 - .transpyc_cache/9e38ca4de81ccb6d.pyi | 171 -- .transpyc_cache/9f6e387913081f0e.doc.json | 1 - .transpyc_cache/9f6e387913081f0e.pyi | 88 - .transpyc_cache/9fdf7e28103d0ff0.doc.json | 1 - .transpyc_cache/9fdf7e28103d0ff0.pyi | 139 -- .transpyc_cache/a03139660029514f.doc.json | 1 - .transpyc_cache/a03139660029514f.pyi | 34 - .transpyc_cache/a0612a85a12439a9.doc.json | 1 - .transpyc_cache/a0612a85a12439a9.pyi | 171 -- .transpyc_cache/a0e0675172e4f01f.doc.json | 1 - .transpyc_cache/a0e0675172e4f01f.pyi | 43 - .transpyc_cache/a30bd51aa00f0bef.doc.json | 1 - .transpyc_cache/a30bd51aa00f0bef.pyi | 89 - .transpyc_cache/a47313ed1481da7d.doc.json | 1 - .transpyc_cache/a47313ed1481da7d.pyi | 104 - .transpyc_cache/a5407d80d9f015ed.doc.json | 1 - .transpyc_cache/a5407d80d9f015ed.pyi | 39 - .transpyc_cache/a68b70f233541a7f.pyi | 44 - .transpyc_cache/a6972611852b8a4e.doc.json | 1 - .transpyc_cache/a6972611852b8a4e.pyi | 171 -- .transpyc_cache/a6a3e195cd7dd0b4.doc.json | 1 - .transpyc_cache/a6a3e195cd7dd0b4.pyi | 31 - .transpyc_cache/a711c9c66fd7c6ca.doc.json | 1 - .transpyc_cache/a711c9c66fd7c6ca.pyi | 20 - .transpyc_cache/a7cf0ce4066332ae.doc.json | 1 - .transpyc_cache/a7cf0ce4066332ae.pyi | 44 - .transpyc_cache/a9ad5e41081c9377.doc.json | 1 - .transpyc_cache/a9ad5e41081c9377.pyi | 173 -- .transpyc_cache/a9b97a11bf30daa0.doc.json | 1 - .transpyc_cache/a9b97a11bf30daa0.pyi | 52 - .transpyc_cache/a9df037d9178888f.doc.json | 1 - .transpyc_cache/a9df037d9178888f.pyi | 31 - .transpyc_cache/aba439b7882ad9d6.pyi | 67 - .transpyc_cache/abbcbd92436cc16a.pyi | 41 - .transpyc_cache/ac0d686cb2cc783b.doc.json | 1 - .transpyc_cache/ac0d686cb2cc783b.pyi | 73 - .transpyc_cache/aca085940d1ca494.doc.json | 1 - .transpyc_cache/aca085940d1ca494.pyi | 173 -- .transpyc_cache/ae0cc890f657076d.doc.json | 1 - .transpyc_cache/ae0cc890f657076d.pyi | 88 - .transpyc_cache/ae1e8a6903834d9c.doc.json | 1 - .transpyc_cache/ae1e8a6903834d9c.pyi | 171 -- .transpyc_cache/aeb670958072076e.pyi | 33 - .transpyc_cache/aeb8034bdb2b370b.doc.json | 1 - .transpyc_cache/aeb8034bdb2b370b.pyi | 171 -- .transpyc_cache/af9484a65085bf4b.doc.json | 1 - .transpyc_cache/af9484a65085bf4b.pyi | 21 - .transpyc_cache/b1122357fee8fd68.doc.json | 1 - .transpyc_cache/b1122357fee8fd68.pyi | 36 - .transpyc_cache/b235d6477436c524.doc.json | 1 - .transpyc_cache/b235d6477436c524.pyi | 131 -- .transpyc_cache/b298756207e2da58.doc.json | 1 - .transpyc_cache/b298756207e2da58.pyi | 171 -- .transpyc_cache/b29b80b6106e4be7.doc.json | 1 - .transpyc_cache/b29b80b6106e4be7.pyi | 173 -- .transpyc_cache/b3c2b99b6f3be4c7.doc.json | 1 - .transpyc_cache/b3c2b99b6f3be4c7.pyi | 17 - .transpyc_cache/b3fd73f7abbd88a8.doc.json | 1 - .transpyc_cache/b3fd73f7abbd88a8.pyi | 60 - .transpyc_cache/b436212dcff1be29.doc.json | 1 - .transpyc_cache/b436212dcff1be29.pyi | 48 - .transpyc_cache/b547ac4f380bddb6.pyi | 166 -- .transpyc_cache/b558d8d8f01f4825.pyi | 39 - .transpyc_cache/b5a965302cded36b.pyi | 44 - .transpyc_cache/b5d05dbd7fee36ef.doc.json | 1 - .transpyc_cache/b5d05dbd7fee36ef.pyi | 60 - .transpyc_cache/b69cdee68f223fef.doc.json | 1 - .transpyc_cache/b777c587cc21465a.doc.json | 1 - .transpyc_cache/b777c587cc21465a.pyi | 16 - .transpyc_cache/b7eeff93aa63e70f.doc.json | 1 - .transpyc_cache/b7eeff93aa63e70f.pyi | 25 - .transpyc_cache/b8c66c8ff44eb874.pyi | 46 - .transpyc_cache/b8cbe044a10adcca.doc.json | 1 - .transpyc_cache/b8cbe044a10adcca.pyi | 23 - .transpyc_cache/bc52b7a79738d25a.doc.json | 1 - .transpyc_cache/bc52b7a79738d25a.pyi | 171 -- .transpyc_cache/bd82e3ca81546c76.doc.json | 1 - .transpyc_cache/bd82e3ca81546c76.pyi | 45 - .transpyc_cache/bdfc8bd243b7e5b7.doc.json | 1 - .transpyc_cache/bdfc8bd243b7e5b7.pyi | 87 - .transpyc_cache/bf38ca6c448d2d33.doc.json | 1 - .transpyc_cache/bf38ca6c448d2d33.pyi | 60 - .transpyc_cache/c01b27dbcd683245.doc.json | 1 - .transpyc_cache/c01b27dbcd683245.pyi | 30 - .transpyc_cache/c1416dfae155d6e2.doc.json | 1 - .transpyc_cache/c1416dfae155d6e2.pyi | 39 - .transpyc_cache/c24f25b14b4bbd0a.pyi | 91 - .transpyc_cache/c2ed034f4bfaad51.doc.json | 1 - .transpyc_cache/c2ed034f4bfaad51.pyi | 34 - .transpyc_cache/c2f78fe75716e993.doc.json | 1 - .transpyc_cache/c2f78fe75716e993.pyi | 84 - .transpyc_cache/c325121077fc50d9.doc.json | 1 - .transpyc_cache/c325121077fc50d9.pyi | 30 - .transpyc_cache/c39f3e540adb7b4e.doc.json | 1 - .transpyc_cache/c39f3e540adb7b4e.pyi | 41 - .transpyc_cache/c3a6aed1f1fb8b1e.pyi | 240 --- .transpyc_cache/c3b259b4059f8668.pyi | 23 - .transpyc_cache/c4960bf577b21f14.doc.json | 1 - .transpyc_cache/c4960bf577b21f14.pyi | 41 - .transpyc_cache/c4f2d483ec0f4db5.doc.json | 1 - .transpyc_cache/c4f2d483ec0f4db5.pyi | 104 - .transpyc_cache/c688cec0f891dd97.doc.json | 1 - .transpyc_cache/c688cec0f891dd97.pyi | 60 - .transpyc_cache/c70684ccfe48a5a9.doc.json | 1 - .transpyc_cache/c70684ccfe48a5a9.pyi | 24 - .transpyc_cache/c7b66e67f49c5c06.doc.json | 1 - .transpyc_cache/c7b66e67f49c5c06.pyi | 104 - .transpyc_cache/c7ef33270dce36e3.doc.json | 1 - .transpyc_cache/c7ef33270dce36e3.pyi | 30 - .transpyc_cache/c9d54a4158f7f5a8.pyi | 34 - .transpyc_cache/cb151b297f4ea56d.doc.json | 1 - .transpyc_cache/cb151b297f4ea56d.pyi | 15 - .transpyc_cache/cc3ad7f3bc880326.doc.json | 1 - .transpyc_cache/cc3ad7f3bc880326.pyi | 12 - .transpyc_cache/cc436a125bbaf28c.pyi | 34 - .transpyc_cache/cdff0d7b58fc935b.doc.json | 1 - .transpyc_cache/cdff0d7b58fc935b.pyi | 14 - .transpyc_cache/cfc83b830141b00e.doc.json | 1 - .transpyc_cache/cfc83b830141b00e.pyi | 27 - .transpyc_cache/d152115b49e50218.pyi | 42 - .transpyc_cache/d1599ecbac5b6586.doc.json | 1 - .transpyc_cache/d1599ecbac5b6586.pyi | 51 - .transpyc_cache/d28c16ea0550c4a4.doc.json | 1 - .transpyc_cache/d28c16ea0550c4a4.pyi | 81 - .transpyc_cache/d33c3f139167d275.doc.json | 1 - .transpyc_cache/d33c3f139167d275.pyi | 104 - .transpyc_cache/d358712e53b4da98.doc.json | 1 - .transpyc_cache/d358712e53b4da98.pyi | 28 - .transpyc_cache/d541ade6afb689a5.pyi | 44 - .transpyc_cache/d63d2c2a2bd9bd2a.pyi | 10 - .transpyc_cache/d7662500f1c2c0ff.doc.json | 1 - .transpyc_cache/d7662500f1c2c0ff.pyi | 12 - .transpyc_cache/d7e3386b828acb66.pyi | 115 -- .transpyc_cache/d855b3e66d1d6522.doc.json | 1 - .transpyc_cache/d855b3e66d1d6522.pyi | 66 - .transpyc_cache/d9322f0db660edd8.doc.json | 1 - .transpyc_cache/d9322f0db660edd8.pyi | 23 - .transpyc_cache/da80633346bb66e2.doc.json | 1 - .transpyc_cache/da80633346bb66e2.pyi | 171 -- .transpyc_cache/db434883fc668c7c.doc.json | 1 - .transpyc_cache/db434883fc668c7c.pyi | 66 - .transpyc_cache/db4aafce81f39b32.doc.json | 1 - .transpyc_cache/db4aafce81f39b32.pyi | 39 - .transpyc_cache/db7c4a8f09d02a17.doc.json | 1 - .transpyc_cache/db7c4a8f09d02a17.pyi | 32 - .transpyc_cache/dd19090b337e9bea.doc.json | 1 - .transpyc_cache/dd19090b337e9bea.pyi | 41 - .transpyc_cache/df4ee63d3fef30a0.doc.json | 1 - .transpyc_cache/df4ee63d3fef30a0.pyi | 171 -- .transpyc_cache/e0009679269c6b63.doc.json | 1 - .transpyc_cache/e0009679269c6b63.pyi | 23 - .transpyc_cache/e0b84369e50c937c.pyi | 93 - .transpyc_cache/e24a7f4a875f4518.doc.json | 1 - .transpyc_cache/e24a7f4a875f4518.pyi | 13 - .transpyc_cache/e272d279f536a678.doc.json | 1 - .transpyc_cache/e272d279f536a678.pyi | 60 - .transpyc_cache/e285a7afdd9d844f.doc.json | 1 - .transpyc_cache/e285a7afdd9d844f.pyi | 171 -- .transpyc_cache/e306c57855054e23.doc.json | 1 - .transpyc_cache/e306c57855054e23.pyi | 171 -- .transpyc_cache/e36333e2cadb713a.doc.json | 1 - .transpyc_cache/e36333e2cadb713a.pyi | 40 - .transpyc_cache/e3834089153af692.doc.json | 1 - .transpyc_cache/e3834089153af692.pyi | 173 -- .transpyc_cache/e3ac223bdaf94a0c.doc.json | 1 - .transpyc_cache/e3ac223bdaf94a0c.pyi | 110 -- .transpyc_cache/e3e7b6de8d7d8b03.pyi | 53 - .transpyc_cache/e3f3b9ed2a5030c6.doc.json | 1 - .transpyc_cache/e3f3b9ed2a5030c6.pyi | 60 - .transpyc_cache/e445a2bb299d1b7d.doc.json | 1 - .transpyc_cache/e445a2bb299d1b7d.pyi | 51 - .transpyc_cache/e4c98f097b75da35.doc.json | 1 - .transpyc_cache/e4c98f097b75da35.pyi | 31 - .transpyc_cache/e5be27ae4fe7ce04.doc.json | 1 - .transpyc_cache/e5be27ae4fe7ce04.pyi | 48 - .transpyc_cache/e5fb16127bce8f68.doc.json | 1 - .transpyc_cache/e5fb16127bce8f68.pyi | 66 - .transpyc_cache/e7183a8c64d4872d.doc.json | 1 - .transpyc_cache/e7183a8c64d4872d.pyi | 104 - .transpyc_cache/e74870eba3e6d774.doc.json | 1 - .transpyc_cache/e74870eba3e6d774.pyi | 15 - .transpyc_cache/e773fbfd4a1e4587.doc.json | 1 - .transpyc_cache/e773fbfd4a1e4587.pyi | 60 - .transpyc_cache/eb252050d92f8fb9.doc.json | 1 - .transpyc_cache/eb252050d92f8fb9.pyi | 10 - .transpyc_cache/ed1c124f3cb787c9.doc.json | 1 - .transpyc_cache/ed1c124f3cb787c9.pyi | 10 - .transpyc_cache/ee52c08239684346.pyi | 215 --- .transpyc_cache/ef45adce81bf5b2d.doc.json | 1 - .transpyc_cache/ef45adce81bf5b2d.pyi | 12 - .transpyc_cache/f08abd3a207590f0.doc.json | 1 - .transpyc_cache/f08abd3a207590f0.pyi | 173 -- .transpyc_cache/f26cd4c78b4d554c.doc.json | 1 - .transpyc_cache/f26cd4c78b4d554c.pyi | 171 -- .transpyc_cache/f26d7266c4f8762b.doc.json | 1 - .transpyc_cache/f26d7266c4f8762b.pyi | 19 - .transpyc_cache/f2fc34882dad695a.doc.json | 1 - .transpyc_cache/f2fc34882dad695a.pyi | 171 -- .../f3560b99de458aec.pyi | 9 +- .transpyc_cache/f492cb40d913400b.doc.json | 1 - .transpyc_cache/f492cb40d913400b.pyi | 15 - .transpyc_cache/f49abd3c81119ada.doc.json | 1 - .transpyc_cache/f49abd3c81119ada.pyi | 60 - .transpyc_cache/f9c68a21786049ce.doc.json | 1 - .transpyc_cache/f9c68a21786049ce.pyi | 52 - .transpyc_cache/faec3233d98371da.doc.json | 1 - .transpyc_cache/faec3233d98371da.pyi | 54 - .transpyc_cache/fb6cea4f70fade7a.doc.json | 1 - .transpyc_cache/fb6cea4f70fade7a.pyi | 29 - .transpyc_cache/ff3ad21889888a9a.doc.json | 1 - .transpyc_cache/ff3ad21889888a9a.pyi | 104 - .../output/08ea5281873244fd.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 .../temp/9474791561654346.pyi} | 11 + Test/ArgparseTest/temp/_phase1_manifest.json | 2 +- Test/ArgparseTest/temp/_sha1_map.txt | 6 +- .../ArgparseTest/temp/f3560b99de458aec.pyi | 9 +- .../AstTest/output/0853acdbdfc9b27c.deps.json | 2 +- .../temp/9474791561654346.pyi} | 11 + Test/AstTest/temp/_phase1_manifest.json | 2 +- Test/AstTest/temp/_sha1_map.txt | 4 +- ...84e9fc6ee413a.pyi => f3560b99de458aec.pyi} | 9 +- Test/BuddyTest/App/mbuddytest.py | 6 + .../output/5a3d93d7860d5dc0.deps.json | 1 + .../output/5e430ae5bf7af3a2.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 .../BuddyTest/temp/5a3d93d7860d5dc0.doc.json | 0 .../BuddyTest/temp/5a3d93d7860d5dc0.pyi | 0 .../BuddyTest/temp/9474791561654346.pyi | 11 + Test/BuddyTest/temp/_phase1_manifest.json | 2 +- Test/BuddyTest/temp/_sha1_map.txt | 8 +- Test/BuddyTest/temp/_shared_sym.json | Bin 897978 -> 426400 bytes Test/BuddyTest/temp/b69cdee68f223fef.doc.json | 1 - Test/BuddyTest/temp/b69cdee68f223fef.pyi | 21 - ...84e9fc6ee413a.pyi => f3560b99de458aec.pyi} | 9 +- .../output/e3ac223bdaf94a0c.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 .../temp/_phase1_manifest.json | 2 +- Test/BuiltinDecoratorTest/temp/_sha1_map.txt | 2 +- .../output/7c5d5ec59c5fb0a8.deps.json | 2 +- .../output/fb6cea4f70fade7a.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/CPythonTest/temp/_phase1_manifest.json | 2 +- Test/CPythonTest/temp/_sha1_map.txt | 2 +- Test/CPythonTest/temp/_shared_sym.json | Bin 1043558 -> 567405 bytes .../output/52e6b51da061882f.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/ClosureTest/temp/_phase1_manifest.json | 2 +- Test/ClosureTest/temp/_sha1_map.txt | 2 +- .../output/440f18f9dce85a95.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/ClosureTest2/temp/_phase1_manifest.json | 2 +- Test/ClosureTest2/temp/_sha1_map.txt | 2 +- .../output/b1122357fee8fd68.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 .../temp/_phase1_manifest.json | 2 +- Test/DecoratorMarkerTest/temp/_sha1_map.txt | 2 +- .../output/814e6b31adfc6256.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/DecoratorTest/temp/_phase1_manifest.json | 2 +- Test/DecoratorTest/temp/_sha1_map.txt | 2 +- .../output/b3c2b99b6f3be4c7.deps.json | 1 + ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/DictTest/temp/9474791561654346.pyi | 59 + Test/DictTest/temp/_phase1_manifest.json | 2 +- Test/DictTest/temp/_sha1_map.txt | 6 +- Test/DictTest/temp/ab6e54ba9a669f76.pyi | 48 - Test/DictTest/temp/ee084e9fc6ee413a.pyi | 81 - Test/DictTest/temp/f3560b99de458aec.pyi | 86 + .../DocTest/output/14a9b576ab5d21c9.deps.json | 2 +- .../DocTest/output/f26d7266c4f8762b.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/DocTest/temp/9474791561654346.pyi | 59 + Test/DocTest/temp/_phase1_manifest.json | 2 +- Test/DocTest/temp/_sha1_map.txt | 4 +- Test/DocTest/temp/_shared_sym.json | Bin 778315 -> 306737 bytes Test/DocTest/temp/ab6e54ba9a669f76.pyi | 48 - .../output/ac0d686cb2cc783b.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/EdgeCaseTest/temp/_phase1_manifest.json | 2 +- Test/EdgeCaseTest/temp/_sha1_map.txt | 2 +- Test/EqTest/output/78943d0dbc89a29a.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/EqTest/temp/9474791561654346.pyi | 59 + Test/EqTest/temp/_phase1_manifest.json | 2 +- Test/EqTest/temp/_sha1_map.txt | 4 +- Test/EqTest/temp/ab6e54ba9a669f76.pyi | 48 - .../output/0035c95a18d4f8e8.deps.json | 1 + .../output/067c78e9f121dce3.deps.json | 1 + .../output/06f53cc594b4ac6c.deps.json | 1 + .../output/14d33679f7fadf1f.deps.json | 1 + .../output/271ea3decb810db2.deps.json | 1 + .../output/48352329f97d0858.deps.json | 2 +- .../output/5b2e220c5bae60c9.deps.json | 1 + .../output/6446627d4f07a1b5.deps.json | 1 + .../output/72e2d5ccb7cedcf1.deps.json | 1 + .../output/79b337e5ea8951e2.deps.json | 1 + .../output/7e529fe7a078cfef.deps.json | 1 + .../output/9474791561654346.deps.json | 1 + .../output/_shared_sym_includes.pickle | Bin 0 -> 623853 bytes .../output/bbdf3bbd4c3bc28c.deps.json | 1 + .../output/c9f4be41ca1cc2b4.deps.json | 1 + .../output/f2ecbf8ced20575c.deps.json | 1 + .../output/f3560b99de458aec.deps.json | 1 + .../output/f6b51804a0ba8ff0.deps.json | 1 + ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/FakeDuckTest/temp/9474791561654346.pyi | 59 + Test/FakeDuckTest/temp/_phase1_manifest.json | 2 +- Test/FakeDuckTest/temp/_sha1_map.txt | 6 +- Test/FakeDuckTest/temp/ab6e54ba9a669f76.pyi | 48 - Test/FakeDuckTest/temp/ee084e9fc6ee413a.pyi | 81 - Test/FakeDuckTest/temp/f3560b99de458aec.pyi | 86 + .../output/6deb1a24b47f47fc.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/ForAndLoopTest/temp/9474791561654346.pyi | 59 + .../ForAndLoopTest/temp/_phase1_manifest.json | 2 +- Test/ForAndLoopTest/temp/_sha1_map.txt | 6 +- Test/ForAndLoopTest/temp/ab6e54ba9a669f76.pyi | 48 - Test/ForAndLoopTest/temp/ee084e9fc6ee413a.pyi | 81 - Test/ForAndLoopTest/temp/f3560b99de458aec.pyi | 86 + .../output/cdff0d7b58fc935b.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 .../temp/_phase1_manifest.json | 2 +- Test/FormatStringTest/temp/_sha1_map.txt | 2 +- .../output/067f811511854c88.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/FuncTest/temp/_phase1_manifest.json | 2 +- Test/FuncTest/temp/_sha1_map.txt | 2 +- .../output/16e1f65b154831e8.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/GenericTest/temp/_phase1_manifest.json | 2 +- Test/GenericTest/temp/_sha1_map.txt | 2 +- .../output/bdfc8bd243b7e5b7.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/GenericTest2/temp/_phase1_manifest.json | 2 +- Test/GenericTest2/temp/_sha1_map.txt | 2 +- .../output/02d833b3cf571c5b.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/HashTableTest/temp/9474791561654346.pyi | 59 + Test/HashTableTest/temp/_phase1_manifest.json | 2 +- Test/HashTableTest/temp/_sha1_map.txt | 6 +- Test/HashTableTest/temp/ab6e54ba9a669f76.pyi | 48 - Test/HashTableTest/temp/ee084e9fc6ee413a.pyi | 81 - Test/HashTableTest/temp/f3560b99de458aec.pyi | 86 + .../output/6b8853854d6ef556.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/IterTest/temp/9474791561654346.pyi | 59 + Test/IterTest/temp/_phase1_manifest.json | 2 +- Test/IterTest/temp/_sha1_map.txt | 4 +- Test/IterTest/temp/ab6e54ba9a669f76.pyi | 48 - .../output/8a97754e9e3c2b9a.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/JsonTest/temp/9474791561654346.pyi | 59 + Test/JsonTest/temp/_phase1_manifest.json | 2 +- Test/JsonTest/temp/_sha1_map.txt | 6 +- Test/JsonTest/temp/ab6e54ba9a669f76.pyi | 48 - Test/JsonTest/temp/ee084e9fc6ee413a.pyi | 81 - Test/JsonTest/temp/f3560b99de458aec.pyi | 86 + Test/LLvmLiteTest/App/main.py | 14 + .../output/3e914ffe8cc3c120.deps.json | 1 - .../output/5b8cf12a5862b640.deps.json | 1 + ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 .../LLvmLiteTest/temp/15f1ded02f3aa5bc.pyi | 1 + .../temp/3e914ffe8cc3c120.doc.json | 1 - Test/LLvmLiteTest/temp/3e914ffe8cc3c120.pyi | 72 - Test/LLvmLiteTest/temp/455ff4e74c3dbfb0.pyi | 120 -- Test/LLvmLiteTest/temp/46ea362b72c10a9e.pyi | 219 --- ...84369e50c937c.pyi => 4dad2ba72ed7ba09.pyi} | 4 + .../temp/5b8cf12a5862b640.doc.json | 0 .../LLvmLiteTest/temp/5b8cf12a5862b640.pyi | 0 .../LLvmLiteTest/temp/6b3bc463fd044545.pyi | 1 + .../LLvmLiteTest/temp/946e087da91aaada.pyi | 3 + Test/LLvmLiteTest/temp/9474791561654346.pyi | 59 + Test/LLvmLiteTest/temp/_phase1_manifest.json | 2 +- Test/LLvmLiteTest/temp/_sha1_map.txt | 18 +- Test/LLvmLiteTest/temp/ab6e54ba9a669f76.pyi | 48 - Test/LLvmLiteTest/temp/d4117f5e00a6c3b5.pyi | 62 - Test/LLvmLiteTest/temp/ee084e9fc6ee413a.pyi | 81 - Test/LLvmLiteTest/temp/f3560b99de458aec.pyi | 86 + ...11f22675c60cb.pyi => f9e36e2cd6fa659f.pyi} | 1 + .../output/1ff2c5eb32359e40.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/ListTest/temp/9474791561654346.pyi | 59 + Test/ListTest/temp/_phase1_manifest.json | 2 +- Test/ListTest/temp/_sha1_map.txt | 6 +- Test/ListTest/temp/ab6e54ba9a669f76.pyi | 48 - Test/ListTest/temp/ee084e9fc6ee413a.pyi | 81 - Test/ListTest/temp/f3560b99de458aec.pyi | 86 + .../output/86e203c56ae4de20.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/LoopTest/temp/_phase1_manifest.json | 2 +- Test/LoopTest/temp/_sha1_map.txt | 2 +- Test/MemhubTest/App/main.py | 2 +- .../output/3ff210e50f345c7c.deps.json | 1 + .../output/4ebd3745aa9cf570.deps.json | 1 - ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 .../MemhubTest/temp/3ff210e50f345c7c.doc.json | 0 .../MemhubTest/temp/3ff210e50f345c7c.pyi | 0 .../MemhubTest/temp/4ebd3745aa9cf570.doc.json | 1 - Test/MemhubTest/temp/4ebd3745aa9cf570.pyi | 19 - Test/MemhubTest/temp/9474791561654346.pyi | 59 + Test/MemhubTest/temp/_phase1_manifest.json | 2 +- Test/MemhubTest/temp/_sha1_map.txt | 8 +- Test/MemhubTest/temp/ab6e54ba9a669f76.pyi | 48 - Test/MemhubTest/temp/ee084e9fc6ee413a.pyi | 81 - Test/MemhubTest/temp/f3560b99de458aec.pyi | 86 + .../output/4175f14c5fbef360.deps.json | 2 +- Test/NewAstTest/temp/9474791561654346.pyi | 59 + Test/NewAstTest/temp/_phase1_manifest.json | 2 +- Test/NewAstTest/temp/_sha1_map.txt | 4 +- Test/NewAstTest/temp/ab6e54ba9a669f76.pyi | 48 - Test/NewAstTest/temp/ee084e9fc6ee413a.pyi | 81 - Test/NewAstTest/temp/f3560b99de458aec.pyi | 86 + .../output/22650858c377c847.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/NoVTableTest/temp/9474791561654346.pyi | 59 + Test/NoVTableTest/temp/_phase1_manifest.json | 2 +- Test/NoVTableTest/temp/_sha1_map.txt | 4 +- Test/NoVTableTest/temp/ab6e54ba9a669f76.pyi | 48 - .../output/b436212dcff1be29.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/PointerTest/temp/9474791561654346.pyi | 59 + Test/PointerTest/temp/_phase1_manifest.json | 2 +- Test/PointerTest/temp/_sha1_map.txt | 4 +- Test/PointerTest/temp/ab6e54ba9a669f76.pyi | 48 - .../output/a711c9c66fd7c6ca.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 .../temp/9474791561654346.pyi | 59 + .../temp/_phase1_manifest.json | 2 +- Test/ShortCircuitTest/temp/_sha1_map.txt | 4 +- .../temp/ab6e54ba9a669f76.pyi | 48 - .../output/2fcb6780db4d937f.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/SimdTest/temp/9474791561654346.pyi | 59 + Test/SimdTest/temp/_phase1_manifest.json | 2 +- Test/SimdTest/temp/_sha1_map.txt | 6 +- Test/SimdTest/temp/ab6e54ba9a669f76.pyi | 48 - Test/SimdTest/temp/ee084e9fc6ee413a.pyi | 81 - Test/SimdTest/temp/f3560b99de458aec.pyi | 86 + .../output/f492cb40d913400b.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/SprintfTest/temp/_phase1_manifest.json | 2 +- Test/SprintfTest/temp/_sha1_map.txt | 2 +- .../output/924ed8cd4ea5c4c2.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/StringIterTest/temp/9474791561654346.pyi | 59 + .../StringIterTest/temp/_phase1_manifest.json | 2 +- Test/StringIterTest/temp/_sha1_map.txt | 6 +- Test/StringIterTest/temp/ab6e54ba9a669f76.pyi | 48 - Test/StringIterTest/temp/ee084e9fc6ee413a.pyi | 81 - Test/StringIterTest/temp/f3560b99de458aec.pyi | 86 + .../output/39178dc5ba692b92.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/StringTest/temp/9474791561654346.pyi | 59 + Test/StringTest/temp/_phase1_manifest.json | 2 +- Test/StringTest/temp/_sha1_map.txt | 4 +- Test/StringTest/temp/ab6e54ba9a669f76.pyi | 48 - .../output/24e26a8de1173993.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/StructTest/temp/9474791561654346.pyi | 59 + Test/StructTest/temp/_phase1_manifest.json | 2 +- Test/StructTest/temp/_sha1_map.txt | 4 +- Test/StructTest/temp/ab6e54ba9a669f76.pyi | 48 - .../output/59e00d50660b941e.deps.json | 2 +- .../output/a03139660029514f.deps.json | 2 +- .../output/c70684ccfe48a5a9.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/SysLibTest/temp/9474791561654346.pyi | 59 + Test/SysLibTest/temp/_phase1_manifest.json | 2 +- Test/SysLibTest/temp/_sha1_map.txt | 6 +- Test/SysLibTest/temp/_shared_sym.json | Bin 1170670 -> 699092 bytes Test/SysLibTest/temp/ab6e54ba9a669f76.pyi | 48 - Test/SysLibTest/temp/ee084e9fc6ee413a.pyi | 81 - Test/SysLibTest/temp/f3560b99de458aec.pyi | 86 + .../output/4fb8940ff5ab1022.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/TestFBProject/temp/_phase1_manifest.json | 2 +- Test/TestFBProject/temp/_sha1_map.txt | 2 +- .../output/3cd87018ba1e76bc.deps.json | 2 +- .../output/49cae05490a513cb.deps.json | 2 +- .../output/75583f20a922ab2e.deps.json | 2 +- .../output/8e0d8fdba991b3b4.deps.json | 2 +- .../output/cfc83b830141b00e.deps.json | 2 +- .../output/e5fb16127bce8f68.deps.json | 2 +- .../output/faec3233d98371da.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/TestProject/temp/9474791561654346.pyi | 59 + Test/TestProject/temp/_phase1_manifest.json | 2 +- Test/TestProject/temp/_sha1_map.txt | 6 +- Test/TestProject/temp/_shared_sym.json | Bin 1026702 -> 555124 bytes Test/TestProject/temp/ab6e54ba9a669f76.pyi | 48 - Test/TestProject/temp/ee084e9fc6ee413a.pyi | 81 - Test/TestProject/temp/f3560b99de458aec.pyi | 86 + .../output/0df65b8ed15664b0.deps.json | 1 - .../output/19f8024d10c828e8.deps.json | 1 - .../output/213348433fb01cc6.deps.json | 1 - .../output/257e074b935c33b4.deps.json | 1 - .../output/451745df21e598af.deps.json | 1 - .../output/541a1ed9b8be53c8.deps.json | 2 +- .../output/6ff26590374ae6fc.deps.json | 1 - .../output/8ebed83a7817fa0c.deps.json | 1 - .../output/90921d009fdd674c.deps.json | 1 - .../output/_shared_sym_includes.pickle | Bin 1195877 -> 0 bytes .../output/c9d54a4158f7f5a8.deps.json | 1 - .../output/cfc83b830141b00e.deps.json | 2 +- .../output/d541ade6afb689a5.deps.json | 1 - ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/TestProject2/temp/9474791561654346.pyi | 59 + Test/TestProject2/temp/_phase1_manifest.json | 2 +- Test/TestProject2/temp/_sha1_map.txt | 6 +- Test/TestProject2/temp/_shared_sym.json | Bin 935260 -> 463682 bytes Test/TestProject2/temp/ab6e54ba9a669f76.pyi | 48 - Test/TestProject2/temp/ee084e9fc6ee413a.pyi | 81 - Test/TestProject2/temp/f3560b99de458aec.pyi | 86 + .../output/0019c939aae7f9f1.deps.json | 1 + .../output/1b58766d38d05de3.deps.json | 2 +- .../output/64ac83614c9bdbc6.deps.json | 2 +- .../output/b235d6477436c524.deps.json | 2 +- .../output/b777c587cc21465a.deps.json | 2 +- .../output/c01b27dbcd683245.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 .../TestProject3/temp/285a822aa26bfbda.pyi | 0 Test/TestProject3/temp/9474791561654346.pyi | 59 + Test/TestProject3/temp/_phase1_manifest.json | 2 +- Test/TestProject3/temp/_sha1_map.txt | 8 +- Test/TestProject3/temp/_shared_sym.json | Bin 992958 -> 521371 bytes Test/TestProject3/temp/ab6e54ba9a669f76.pyi | 48 - Test/TestProject3/temp/bf9813f6e3c9d351.pyi | 24 - Test/TestProject3/temp/ee084e9fc6ee413a.pyi | 81 - Test/TestProject3/temp/f3560b99de458aec.pyi | 86 + .../output/78418cf2ee722f0f.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/TypeCastTest/temp/9474791561654346.pyi | 59 + Test/TypeCastTest/temp/_phase1_manifest.json | 2 +- Test/TypeCastTest/temp/_sha1_map.txt | 4 +- Test/TypeCastTest/temp/ab6e54ba9a669f76.pyi | 48 - .../output/e24a7f4a875f4518.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/VRandomTest/temp/_phase1_manifest.json | 2 +- Test/VRandomTest/temp/_sha1_map.txt | 2 +- .../output/c1416dfae155d6e2.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/VariadicTest/temp/9474791561654346.pyi | 59 + Test/VariadicTest/temp/_phase1_manifest.json | 2 +- Test/VariadicTest/temp/_sha1_map.txt | 4 +- Test/VariadicTest/temp/ab6e54ba9a669f76.pyi | 48 - .../WebTest/output/8046d45456d0b153.deps.json | 2 +- Test/WebTest/temp/9474791561654346.pyi | 59 + Test/WebTest/temp/_phase1_manifest.json | 2 +- Test/WebTest/temp/_sha1_map.txt | 4 +- Test/WebTest/temp/ab6e54ba9a669f76.pyi | 48 - Test/WebTest/temp/ee084e9fc6ee413a.pyi | 81 - Test/WebTest/temp/f3560b99de458aec.pyi | 86 + .../output/03b24bc1d9327958.deps.json | 2 +- .../output/0f8134f67bdaba8f.deps.json | 1 + .../output/784dde8a8697b7ab.deps.json | 2 +- .../output/9b7d2adaae94f021.deps.json | 2 +- .../output/cb151b297f4ea56d.deps.json | 2 +- .../output/d855b3e66d1d6522.deps.json | 2 +- .../output/dd19090b337e9bea.deps.json | 2 +- .../output/e445a2bb299d1b7d.deps.json | 2 +- ...002730623424b.pyi => 14d33679f7fadf1f.pyi} | 0 Test/ZlibTest/temp/9474791561654346.pyi | 59 + Test/ZlibTest/temp/_phase1_manifest.json | 2 +- Test/ZlibTest/temp/_sha1_map.txt | 4 +- Test/ZlibTest/temp/_shared_sym.json | Bin 908538 -> 436960 bytes Test/ZlibTest/temp/ab6e54ba9a669f76.pyi | 48 - ...24b.deps.txt => 14d33679f7fadf1f.deps.txt} | 0 ...351.deps.txt => 285a822aa26bfbda.deps.txt} | 0 TransPyV/Test/temp/_sha1_map.txt | 4 +- ...13a.deps.txt => f3560b99de458aec.deps.txt} | 0 TransPyV/temp/_shared_sym.json | Bin 2245844 -> 2245844 bytes debug_dict_full.txt | 83 + debug_dict_output.txt | 1 + full_log.txt | 1 + full_log2.txt | 378 ++++ includes/hello.py | 5 + includes/llvmlite/__builder.py | 10 + includes/llvmlite/__function.py | 19 +- includes/llvmlite/__types.py | 3 + includes/llvmlite/__values.py | 3 + includes/llvmlite/__verify.py | 3 + includes/memhub.py | 54 +- includes/string.py | 17 +- includes/testcheck.py | 7 + includes/vector.py | 3 +- lib/Projectrans/DeclarationGenerator.py | 168 ++ lib/core/Handles/HandlesClassDef.py | 40 +- lib/core/Handles/HandlesExprBuiltin.py | 5 +- lib/core/Handles/HandlesExprCall.py | 211 +- lib/core/Handles/HandlesFunctions.py | 23 +- lib/core/Handles/HandlesImports.py | 197 +- lib/core/Handles/HandlesTypeMerge.py | 5 +- lib/core/Handles/HandlesWith.py | 46 +- lib/core/LLVMCG/BaseGen.py | 12 + lib/core/LLVMCG/StructGen.py | 68 +- lib/includes/t.py | 2 +- regression_output.txt | 1710 +++++++++++++++++ test_inherited_decls.py | 67 + thistest/App/benchmark_main.py | 45 +- thistest/output/0035c95a18d4f8e8.deps.json | 1 - thistest/output/067c78e9f121dce3.deps.json | 1 - thistest/output/06f53cc594b4ac6c.deps.json | 1 - thistest/output/6166aecc7fa7ad65.deps.json | 1 + thistest/output/6446627d4f07a1b5.deps.json | 1 - thistest/output/72e2d5ccb7cedcf1.deps.json | 1 - thistest/output/7e529fe7a078cfef.deps.json | 1 - thistest/output/8c37156d7b67c1f5.deps.json | 1 + thistest/output/_shared_sym_includes.pickle | Bin 511299 -> 582206 bytes thistest/output/a7bc8c01684c0001.deps.json | 2 +- thistest/output/bbdf3bbd4c3bc28c.deps.json | 1 - thistest/output/c1371d3dc6b676c2.deps.json | 1 - thistest/output/f6b51804a0ba8ff0.deps.json | 1 - thistest/temp/153805db5704f3e0.pyi | 11 - thistest/temp/203a3999d5300163.pyi | 80 - thistest/temp/271ea3decb810db2.pyi | 26 + thistest/temp/28d30831dd445f0f.pyi | 11 - thistest/temp/2db2d238d218d3d8.pyi | 9 - thistest/temp/2df45af226a48b4b.pyi | 11 - thistest/temp/3624cfde3c5cb6cb.pyi | 10 + thistest/temp/6166aecc7fa7ad65.pyi | 12 + thistest/temp/77dcdc6020d63dc5.pyi | 11 - thistest/temp/81d55b73067644b3.doc.json | 1 - thistest/temp/81d55b73067644b3.pyi | 14 - thistest/temp/86df096a4b57c422.pyi | 11 - thistest/temp/87f45d9188e9d92f.pyi | 11 - .../temp/8c37156d7b67c1f5.doc.json | 0 ...71d3dc6b676c2.pyi => 8c37156d7b67c1f5.pyi} | 9 + thistest/temp/90c53dd6db8d41cf.pyi | 20 + thistest/temp/9474791561654346.pyi | 59 + thistest/temp/9664af47f66007d8.pyi | 11 - thistest/temp/98028bc8b755b5f0.pyi | 11 - thistest/temp/9db454840b9dbfe8.pyi | 11 - thistest/temp/_phase1_manifest.json | 2 +- thistest/temp/_sha1_map.txt | 9 +- thistest/temp/a642413df3ed705a.pyi | 11 - thistest/temp/bbc118f202878cbe.pyi | 11 - thistest/temp/bc52093344ff9400.pyi | 11 - thistest/temp/c1371d3dc6b676c2.doc.json | 1 - thistest/temp/c38e082ec6d38c8e.pyi | 11 - thistest/temp/c9f4be41ca1cc2b4.pyi | 22 + thistest/temp/e907dcfbc2e1b32b.pyi | 11 - thistest/temp/f3560b99de458aec.pyi | 86 + thistest/temp/f69ce03954b469e7.pyi | 11 - thistest/temp/f6d5ab5251ee8b21.pyi | 11 - thistest/temp/f71cf01f35e2325a.doc.json | 1 - thistest/temp/f71cf01f35e2325a.pyi | 13 - 1041 files changed, 6597 insertions(+), 27814 deletions(-) delete mode 100644 .transpyc_cache/0019c939aae7f9f1.pyi delete mode 100644 .transpyc_cache/001c1416e7a7dc50.doc.json delete mode 100644 .transpyc_cache/001c1416e7a7dc50.pyi delete mode 100644 .transpyc_cache/0029db369f740dd9.doc.json delete mode 100644 .transpyc_cache/0029db369f740dd9.pyi delete mode 100644 .transpyc_cache/02885f6f134079c2.doc.json delete mode 100644 .transpyc_cache/02885f6f134079c2.pyi delete mode 100644 .transpyc_cache/02d833b3cf571c5b.pyi delete mode 100644 .transpyc_cache/03b24bc1d9327958.pyi delete mode 100644 .transpyc_cache/03eeb0bea44f6637.doc.json delete mode 100644 .transpyc_cache/03eeb0bea44f6637.pyi delete mode 100644 .transpyc_cache/04673ecc3aec489e.doc.json delete mode 100644 .transpyc_cache/04673ecc3aec489e.pyi delete mode 100644 .transpyc_cache/05c11f22675c60cb.pyi delete mode 100644 .transpyc_cache/05db996fc87ebdaa.doc.json delete mode 100644 .transpyc_cache/05db996fc87ebdaa.pyi delete mode 100644 .transpyc_cache/067f811511854c88.pyi delete mode 100644 .transpyc_cache/07a8c82a8ca2be90.doc.json delete mode 100644 .transpyc_cache/07a8c82a8ca2be90.pyi delete mode 100644 .transpyc_cache/07f7da85af876124.doc.json delete mode 100644 .transpyc_cache/07f7da85af876124.pyi delete mode 100644 .transpyc_cache/0853acdbdfc9b27c.doc.json delete mode 100644 .transpyc_cache/0853acdbdfc9b27c.pyi delete mode 100644 .transpyc_cache/08ea5281873244fd.doc.json delete mode 100644 .transpyc_cache/08ea5281873244fd.pyi delete mode 100644 .transpyc_cache/08f96e9e0bc0501b.doc.json delete mode 100644 .transpyc_cache/08f96e9e0bc0501b.pyi delete mode 100644 .transpyc_cache/0900c165e9bcb8f1.doc.json delete mode 100644 .transpyc_cache/0900c165e9bcb8f1.pyi delete mode 100644 .transpyc_cache/0b82fcb0aa3212c5.doc.json delete mode 100644 .transpyc_cache/0b82fcb0aa3212c5.pyi delete mode 100644 .transpyc_cache/0c212981c180e7fb.pyi delete mode 100644 .transpyc_cache/0c56128647a0b845.doc.json delete mode 100644 .transpyc_cache/0c56128647a0b845.pyi delete mode 100644 .transpyc_cache/0df65b8ed15664b0.pyi delete mode 100644 .transpyc_cache/0e1189314c937ef1.doc.json delete mode 100644 .transpyc_cache/0e1189314c937ef1.pyi delete mode 100644 .transpyc_cache/0eccc2393466d940.doc.json delete mode 100644 .transpyc_cache/0eccc2393466d940.pyi delete mode 100644 .transpyc_cache/0f8134f67bdaba8f.doc.json delete mode 100644 .transpyc_cache/0f8134f67bdaba8f.pyi delete mode 100644 .transpyc_cache/0fef3cb77da3dae3.doc.json delete mode 100644 .transpyc_cache/0fef3cb77da3dae3.pyi delete mode 100644 .transpyc_cache/10ac4af023af7962.doc.json delete mode 100644 .transpyc_cache/10ac4af023af7962.pyi delete mode 100644 .transpyc_cache/117b4962d332b4c5.doc.json delete mode 100644 .transpyc_cache/117b4962d332b4c5.pyi delete mode 100644 .transpyc_cache/1193c9cd16698da8.doc.json delete mode 100644 .transpyc_cache/1193c9cd16698da8.pyi delete mode 100644 .transpyc_cache/13110effbb0bb06c.pyi delete mode 100644 .transpyc_cache/13d9449413372bde.pyi delete mode 100644 .transpyc_cache/1446e90e8296beae.doc.json delete mode 100644 .transpyc_cache/1446e90e8296beae.pyi delete mode 100644 .transpyc_cache/146a976893eef52b.doc.json delete mode 100644 .transpyc_cache/146a976893eef52b.pyi delete mode 100644 .transpyc_cache/14a9b576ab5d21c9.doc.json delete mode 100644 .transpyc_cache/14a9b576ab5d21c9.pyi rename .transpyc_cache/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) delete mode 100644 .transpyc_cache/16e1f65b154831e8.doc.json delete mode 100644 .transpyc_cache/16e1f65b154831e8.pyi delete mode 100644 .transpyc_cache/17c0dfbcebfa3a0e.doc.json delete mode 100644 .transpyc_cache/17c0dfbcebfa3a0e.pyi delete mode 100644 .transpyc_cache/19b6605d568c8584.doc.json delete mode 100644 .transpyc_cache/19b6605d568c8584.pyi delete mode 100644 .transpyc_cache/19f8024d10c828e8.pyi delete mode 100644 .transpyc_cache/1a3af346a22d2cb6.doc.json delete mode 100644 .transpyc_cache/1a3af346a22d2cb6.pyi delete mode 100644 .transpyc_cache/1b58766d38d05de3.doc.json delete mode 100644 .transpyc_cache/1b58766d38d05de3.pyi delete mode 100644 .transpyc_cache/1b9ab264a942c56b.doc.json delete mode 100644 .transpyc_cache/1b9ab264a942c56b.pyi delete mode 100644 .transpyc_cache/1c46d554b3a3f9f3.pyi delete mode 100644 .transpyc_cache/1c8a1eceb26a43f4.doc.json delete mode 100644 .transpyc_cache/1c8a1eceb26a43f4.pyi delete mode 100644 .transpyc_cache/1df40188ee73ee05.doc.json delete mode 100644 .transpyc_cache/1df40188ee73ee05.pyi delete mode 100644 .transpyc_cache/1e19f516dc857768.doc.json delete mode 100644 .transpyc_cache/1e19f516dc857768.pyi delete mode 100644 .transpyc_cache/1eb1c9fc7e85d9f8.doc.json delete mode 100644 .transpyc_cache/1eb1c9fc7e85d9f8.pyi delete mode 100644 .transpyc_cache/1ed8ca4986cb0d65.doc.json delete mode 100644 .transpyc_cache/1ed8ca4986cb0d65.pyi delete mode 100644 .transpyc_cache/1ff2c5eb32359e40.doc.json delete mode 100644 .transpyc_cache/1ff2c5eb32359e40.pyi delete mode 100644 .transpyc_cache/2020b02f319dd87d.doc.json delete mode 100644 .transpyc_cache/2020b02f319dd87d.pyi delete mode 100644 .transpyc_cache/20cd49775c100a38.pyi delete mode 100644 .transpyc_cache/212fb1de4f9d6e5c.doc.json delete mode 100644 .transpyc_cache/212fb1de4f9d6e5c.pyi delete mode 100644 .transpyc_cache/213348433fb01cc6.pyi delete mode 100644 .transpyc_cache/21a7fcfc665f75ef.pyi delete mode 100644 .transpyc_cache/21fffba3315e81b4.doc.json delete mode 100644 .transpyc_cache/21fffba3315e81b4.pyi delete mode 100644 .transpyc_cache/22650858c377c847.doc.json delete mode 100644 .transpyc_cache/22650858c377c847.pyi delete mode 100644 .transpyc_cache/240a9a4157959a9f.pyi delete mode 100644 .transpyc_cache/249b0b9083e25ad2.doc.json delete mode 100644 .transpyc_cache/249b0b9083e25ad2.pyi delete mode 100644 .transpyc_cache/24b9e251de12bd96.doc.json delete mode 100644 .transpyc_cache/24b9e251de12bd96.pyi delete mode 100644 .transpyc_cache/24e26a8de1173993.doc.json delete mode 100644 .transpyc_cache/24e26a8de1173993.pyi delete mode 100644 .transpyc_cache/257e074b935c33b4.pyi delete mode 100644 .transpyc_cache/25c18686adb93279.doc.json delete mode 100644 .transpyc_cache/25c18686adb93279.pyi delete mode 100644 .transpyc_cache/2769dee537308b00.doc.json delete mode 100644 .transpyc_cache/2769dee537308b00.pyi delete mode 100644 .transpyc_cache/27b003cb178b709a.doc.json delete mode 100644 .transpyc_cache/27b003cb178b709a.pyi delete mode 100644 .transpyc_cache/2998b8f78d7022bf.doc.json delete mode 100644 .transpyc_cache/2998b8f78d7022bf.pyi delete mode 100644 .transpyc_cache/2ae1bee155fb09d3.doc.json delete mode 100644 .transpyc_cache/2ae1bee155fb09d3.pyi delete mode 100644 .transpyc_cache/2c8ff1a30ee46867.doc.json delete mode 100644 .transpyc_cache/2c8ff1a30ee46867.pyi delete mode 100644 .transpyc_cache/2d39c6c7d3557b3e.pyi delete mode 100644 .transpyc_cache/2da636c61863c815.pyi delete mode 100644 .transpyc_cache/2ed380190e9df89e.doc.json delete mode 100644 .transpyc_cache/2ed380190e9df89e.pyi delete mode 100644 .transpyc_cache/2fcb6780db4d937f.doc.json delete mode 100644 .transpyc_cache/2fcb6780db4d937f.pyi delete mode 100644 .transpyc_cache/30a88f26e7679645.doc.json delete mode 100644 .transpyc_cache/30a88f26e7679645.pyi delete mode 100644 .transpyc_cache/33a854a5c4f67d74.doc.json delete mode 100644 .transpyc_cache/33a854a5c4f67d74.pyi delete mode 100644 .transpyc_cache/34548789d646f432.pyi delete mode 100644 .transpyc_cache/352a68eefae37a7c.doc.json delete mode 100644 .transpyc_cache/352a68eefae37a7c.pyi delete mode 100644 .transpyc_cache/39178dc5ba692b92.doc.json delete mode 100644 .transpyc_cache/39178dc5ba692b92.pyi delete mode 100644 .transpyc_cache/3a56c52de621df8f.doc.json delete mode 100644 .transpyc_cache/3a56c52de621df8f.pyi delete mode 100644 .transpyc_cache/3a769816ec956305.doc.json delete mode 100644 .transpyc_cache/3a769816ec956305.pyi delete mode 100644 .transpyc_cache/3ab9ec935db9efeb.doc.json delete mode 100644 .transpyc_cache/3ab9ec935db9efeb.pyi delete mode 100644 .transpyc_cache/3b76f342dcafa255.doc.json delete mode 100644 .transpyc_cache/3b76f342dcafa255.pyi delete mode 100644 .transpyc_cache/3c15289dd3f27ff8.doc.json delete mode 100644 .transpyc_cache/3c15289dd3f27ff8.pyi delete mode 100644 .transpyc_cache/3c2fbc9e35ad3bf2.doc.json delete mode 100644 .transpyc_cache/3c2fbc9e35ad3bf2.pyi delete mode 100644 .transpyc_cache/3cd87018ba1e76bc.doc.json delete mode 100644 .transpyc_cache/3cd87018ba1e76bc.pyi delete mode 100644 .transpyc_cache/3d3edda4a4e6c08b.doc.json delete mode 100644 .transpyc_cache/3d3edda4a4e6c08b.pyi delete mode 100644 .transpyc_cache/3e914ffe8cc3c120.doc.json delete mode 100644 .transpyc_cache/3f7c5e78d8652535.pyi delete mode 100644 .transpyc_cache/4020cac9bab5e9f1.doc.json delete mode 100644 .transpyc_cache/4020cac9bab5e9f1.pyi delete mode 100644 .transpyc_cache/4031ec3fbcff0767.doc.json delete mode 100644 .transpyc_cache/4031ec3fbcff0767.pyi delete mode 100644 .transpyc_cache/4175f14c5fbef360.doc.json delete mode 100644 .transpyc_cache/4175f14c5fbef360.pyi delete mode 100644 .transpyc_cache/42ced27d9e76aef5.pyi delete mode 100644 .transpyc_cache/4337fb260448bbe2.pyi delete mode 100644 .transpyc_cache/43b4b8f6ce3ed278.doc.json delete mode 100644 .transpyc_cache/43b4b8f6ce3ed278.pyi delete mode 100644 .transpyc_cache/440f18f9dce85a95.doc.json delete mode 100644 .transpyc_cache/440f18f9dce85a95.pyi delete mode 100644 .transpyc_cache/451745df21e598af.pyi delete mode 100644 .transpyc_cache/45242e16a6829016.doc.json delete mode 100644 .transpyc_cache/45242e16a6829016.pyi delete mode 100644 .transpyc_cache/47767b5026a8ee15.pyi delete mode 100644 .transpyc_cache/48dd999d59d8c008.doc.json delete mode 100644 .transpyc_cache/48dd999d59d8c008.pyi delete mode 100644 .transpyc_cache/48fa8cc758d3826b.doc.json delete mode 100644 .transpyc_cache/48fa8cc758d3826b.pyi delete mode 100644 .transpyc_cache/494eeec1e4c2f2ec.doc.json delete mode 100644 .transpyc_cache/494eeec1e4c2f2ec.pyi delete mode 100644 .transpyc_cache/49cae05490a513cb.doc.json delete mode 100644 .transpyc_cache/49cae05490a513cb.pyi delete mode 100644 .transpyc_cache/49cf633017627a4a.doc.json delete mode 100644 .transpyc_cache/49cf633017627a4a.pyi delete mode 100644 .transpyc_cache/4b639fa48e802b3b.doc.json delete mode 100644 .transpyc_cache/4b639fa48e802b3b.pyi delete mode 100644 .transpyc_cache/4ca69b583c572f13.doc.json delete mode 100644 .transpyc_cache/4ca69b583c572f13.pyi delete mode 100644 .transpyc_cache/4dd6b3f1427d1cc5.pyi delete mode 100644 .transpyc_cache/4ebd3745aa9cf570.doc.json delete mode 100644 .transpyc_cache/4ed910ba727b5e92.doc.json delete mode 100644 .transpyc_cache/4ed910ba727b5e92.pyi delete mode 100644 .transpyc_cache/4ee832f9cf4db211.doc.json delete mode 100644 .transpyc_cache/4ee832f9cf4db211.pyi delete mode 100644 .transpyc_cache/4f90956b289db68b.doc.json delete mode 100644 .transpyc_cache/4f90956b289db68b.pyi delete mode 100644 .transpyc_cache/4fb8940ff5ab1022.doc.json delete mode 100644 .transpyc_cache/4fb8940ff5ab1022.pyi delete mode 100644 .transpyc_cache/51f0144d6e8188d9.doc.json delete mode 100644 .transpyc_cache/51f0144d6e8188d9.pyi delete mode 100644 .transpyc_cache/52e6b51da061882f.doc.json delete mode 100644 .transpyc_cache/52e6b51da061882f.pyi delete mode 100644 .transpyc_cache/54014f6c53e9640b.doc.json delete mode 100644 .transpyc_cache/54014f6c53e9640b.pyi delete mode 100644 .transpyc_cache/541a090dde0cc1ba.doc.json delete mode 100644 .transpyc_cache/541a090dde0cc1ba.pyi delete mode 100644 .transpyc_cache/541a1ed9b8be53c8.doc.json delete mode 100644 .transpyc_cache/541a1ed9b8be53c8.pyi delete mode 100644 .transpyc_cache/542aabc6fb546c35.doc.json delete mode 100644 .transpyc_cache/542aabc6fb546c35.pyi delete mode 100644 .transpyc_cache/55cbbb5dec4fef2c.doc.json delete mode 100644 .transpyc_cache/55cbbb5dec4fef2c.pyi delete mode 100644 .transpyc_cache/570919ef3f7c03ad.doc.json delete mode 100644 .transpyc_cache/570919ef3f7c03ad.pyi delete mode 100644 .transpyc_cache/57288496f7c2d1ad.pyi delete mode 100644 .transpyc_cache/58f94f7fed04c816.doc.json delete mode 100644 .transpyc_cache/58f94f7fed04c816.pyi delete mode 100644 .transpyc_cache/594332d751ff7756.doc.json delete mode 100644 .transpyc_cache/594332d751ff7756.pyi delete mode 100644 .transpyc_cache/5974af27e1cdb182.doc.json delete mode 100644 .transpyc_cache/5974af27e1cdb182.pyi delete mode 100644 .transpyc_cache/59e00d50660b941e.doc.json delete mode 100644 .transpyc_cache/59e00d50660b941e.pyi delete mode 100644 .transpyc_cache/59f7d653d72cce3a.doc.json delete mode 100644 .transpyc_cache/59f7d653d72cce3a.pyi delete mode 100644 .transpyc_cache/5b12e242d96b322f.doc.json delete mode 100644 .transpyc_cache/5b12e242d96b322f.pyi delete mode 100644 .transpyc_cache/5dab8cb390496d22.pyi delete mode 100644 .transpyc_cache/5e3d33857a0e37f6.doc.json delete mode 100644 .transpyc_cache/5e3d33857a0e37f6.pyi delete mode 100644 .transpyc_cache/5e430ae5bf7af3a2.doc.json delete mode 100644 .transpyc_cache/5e430ae5bf7af3a2.pyi delete mode 100644 .transpyc_cache/5faaecd48491dce0.doc.json delete mode 100644 .transpyc_cache/5faaecd48491dce0.pyi delete mode 100644 .transpyc_cache/5fc006555963c808.doc.json delete mode 100644 .transpyc_cache/5fc006555963c808.pyi delete mode 100644 .transpyc_cache/605efc3aeda6b7a7.doc.json delete mode 100644 .transpyc_cache/605efc3aeda6b7a7.pyi delete mode 100644 .transpyc_cache/62cc01c2bb770ca3.pyi delete mode 100644 .transpyc_cache/64ac83614c9bdbc6.doc.json delete mode 100644 .transpyc_cache/64ac83614c9bdbc6.pyi delete mode 100644 .transpyc_cache/6503c97dde0c79c4.pyi delete mode 100644 .transpyc_cache/6521d5529dba8eba.doc.json delete mode 100644 .transpyc_cache/6521d5529dba8eba.pyi delete mode 100644 .transpyc_cache/657e182b27c2a022.pyi delete mode 100644 .transpyc_cache/65c212dc0785f1aa.doc.json delete mode 100644 .transpyc_cache/65c212dc0785f1aa.pyi delete mode 100644 .transpyc_cache/663db7700139418e.doc.json delete mode 100644 .transpyc_cache/663db7700139418e.pyi delete mode 100644 .transpyc_cache/66de93aaeebc0601.doc.json delete mode 100644 .transpyc_cache/66de93aaeebc0601.pyi delete mode 100644 .transpyc_cache/6712b7f4f0f0e65d.doc.json delete mode 100644 .transpyc_cache/6712b7f4f0f0e65d.pyi delete mode 100644 .transpyc_cache/67e6e5ea72c0e13c.doc.json delete mode 100644 .transpyc_cache/67e6e5ea72c0e13c.pyi delete mode 100644 .transpyc_cache/68ee8e1ac0994b13.doc.json delete mode 100644 .transpyc_cache/68ee8e1ac0994b13.pyi delete mode 100644 .transpyc_cache/6961b76a167891e5.doc.json delete mode 100644 .transpyc_cache/6961b76a167891e5.pyi delete mode 100644 .transpyc_cache/69b86cf4726da53f.doc.json delete mode 100644 .transpyc_cache/69b86cf4726da53f.pyi delete mode 100644 .transpyc_cache/6a1088ddb47c1d62.doc.json delete mode 100644 .transpyc_cache/6a1088ddb47c1d62.pyi delete mode 100644 .transpyc_cache/6ab1c6b14ca3ded8.doc.json delete mode 100644 .transpyc_cache/6ab1c6b14ca3ded8.pyi delete mode 100644 .transpyc_cache/6b8853854d6ef556.doc.json delete mode 100644 .transpyc_cache/6b8853854d6ef556.pyi delete mode 100644 .transpyc_cache/6ba73c618fc5471e.doc.json delete mode 100644 .transpyc_cache/6ba73c618fc5471e.pyi delete mode 100644 .transpyc_cache/6deb1a24b47f47fc.doc.json delete mode 100644 .transpyc_cache/6deb1a24b47f47fc.pyi delete mode 100644 .transpyc_cache/6f43cc10b998bf0b.doc.json delete mode 100644 .transpyc_cache/6f43cc10b998bf0b.pyi delete mode 100644 .transpyc_cache/6f5e876273093314.doc.json delete mode 100644 .transpyc_cache/6f5e876273093314.pyi delete mode 100644 .transpyc_cache/6ff26590374ae6fc.pyi delete mode 100644 .transpyc_cache/717c696d67fecfc6.doc.json delete mode 100644 .transpyc_cache/717c696d67fecfc6.pyi delete mode 100644 .transpyc_cache/71b5771c2400c31a.doc.json delete mode 100644 .transpyc_cache/71b5771c2400c31a.pyi delete mode 100644 .transpyc_cache/71d73729480f2fd2.doc.json delete mode 100644 .transpyc_cache/71d73729480f2fd2.pyi delete mode 100644 .transpyc_cache/71e0a3ffcb3ebfad.pyi delete mode 100644 .transpyc_cache/7259cdb36d66dc67.doc.json delete mode 100644 .transpyc_cache/7259cdb36d66dc67.pyi delete mode 100644 .transpyc_cache/73a5dbb3cd24b3bf.doc.json delete mode 100644 .transpyc_cache/73a5dbb3cd24b3bf.pyi delete mode 100644 .transpyc_cache/73fcdc4dd1618580.pyi delete mode 100644 .transpyc_cache/744224bb5e87b5ef.doc.json delete mode 100644 .transpyc_cache/744224bb5e87b5ef.pyi delete mode 100644 .transpyc_cache/74ca31446cac2107.doc.json delete mode 100644 .transpyc_cache/74ca31446cac2107.pyi delete mode 100644 .transpyc_cache/75583f20a922ab2e.doc.json delete mode 100644 .transpyc_cache/75583f20a922ab2e.pyi delete mode 100644 .transpyc_cache/75dc9247529e6e0e.doc.json delete mode 100644 .transpyc_cache/75dc9247529e6e0e.pyi delete mode 100644 .transpyc_cache/766d8e14db1ff917.doc.json delete mode 100644 .transpyc_cache/766d8e14db1ff917.pyi delete mode 100644 .transpyc_cache/76dd6c275aa72b3b.pyi delete mode 100644 .transpyc_cache/78418cf2ee722f0f.doc.json delete mode 100644 .transpyc_cache/78418cf2ee722f0f.pyi delete mode 100644 .transpyc_cache/784dde8a8697b7ab.doc.json delete mode 100644 .transpyc_cache/784dde8a8697b7ab.pyi delete mode 100644 .transpyc_cache/78943d0dbc89a29a.doc.json delete mode 100644 .transpyc_cache/78943d0dbc89a29a.pyi delete mode 100644 .transpyc_cache/78bbe886bbe5ca8f.doc.json delete mode 100644 .transpyc_cache/78bbe886bbe5ca8f.pyi delete mode 100644 .transpyc_cache/79ce76014465c04f.doc.json delete mode 100644 .transpyc_cache/79ce76014465c04f.pyi delete mode 100644 .transpyc_cache/79ef7477acd14bd7.doc.json delete mode 100644 .transpyc_cache/79ef7477acd14bd7.pyi delete mode 100644 .transpyc_cache/7b6b920fefb08181.doc.json delete mode 100644 .transpyc_cache/7b6b920fefb08181.pyi delete mode 100644 .transpyc_cache/7bb99cc1646d2ae2.doc.json delete mode 100644 .transpyc_cache/7bb99cc1646d2ae2.pyi delete mode 100644 .transpyc_cache/7c5d5ec59c5fb0a8.doc.json delete mode 100644 .transpyc_cache/7c5d5ec59c5fb0a8.pyi delete mode 100644 .transpyc_cache/7e260c14d2712119.doc.json delete mode 100644 .transpyc_cache/7e260c14d2712119.pyi delete mode 100644 .transpyc_cache/7eb1251b89cc1b7d.doc.json delete mode 100644 .transpyc_cache/7eb1251b89cc1b7d.pyi delete mode 100644 .transpyc_cache/7fa5782c9657b2ba.doc.json delete mode 100644 .transpyc_cache/7fa5782c9657b2ba.pyi delete mode 100644 .transpyc_cache/7fff0dc7524a3a93.doc.json delete mode 100644 .transpyc_cache/7fff0dc7524a3a93.pyi delete mode 100644 .transpyc_cache/80241c7d6f357bd1.doc.json delete mode 100644 .transpyc_cache/80241c7d6f357bd1.pyi delete mode 100644 .transpyc_cache/8046d45456d0b153.doc.json delete mode 100644 .transpyc_cache/8046d45456d0b153.pyi delete mode 100644 .transpyc_cache/814e6b31adfc6256.doc.json delete mode 100644 .transpyc_cache/814e6b31adfc6256.pyi delete mode 100644 .transpyc_cache/81eb28ba912467a6.doc.json delete mode 100644 .transpyc_cache/81eb28ba912467a6.pyi delete mode 100644 .transpyc_cache/83ba314b4637eec9.doc.json delete mode 100644 .transpyc_cache/83ba314b4637eec9.pyi delete mode 100644 .transpyc_cache/862591435f13ef30.doc.json delete mode 100644 .transpyc_cache/862591435f13ef30.pyi delete mode 100644 .transpyc_cache/8639fbe371566e75.doc.json delete mode 100644 .transpyc_cache/8639fbe371566e75.pyi delete mode 100644 .transpyc_cache/8642175afa282a4f.doc.json delete mode 100644 .transpyc_cache/8642175afa282a4f.pyi delete mode 100644 .transpyc_cache/86e203c56ae4de20.doc.json delete mode 100644 .transpyc_cache/86e203c56ae4de20.pyi delete mode 100644 .transpyc_cache/888ea5bd6ab516ae.doc.json delete mode 100644 .transpyc_cache/888ea5bd6ab516ae.pyi delete mode 100644 .transpyc_cache/895376eafe64af68.doc.json delete mode 100644 .transpyc_cache/895376eafe64af68.pyi delete mode 100644 .transpyc_cache/8959998ad305c7b1.doc.json delete mode 100644 .transpyc_cache/8959998ad305c7b1.pyi delete mode 100644 .transpyc_cache/8a97754e9e3c2b9a.doc.json delete mode 100644 .transpyc_cache/8a97754e9e3c2b9a.pyi delete mode 100644 .transpyc_cache/8e0d8fdba991b3b4.doc.json delete mode 100644 .transpyc_cache/8e0d8fdba991b3b4.pyi delete mode 100644 .transpyc_cache/8ebed83a7817fa0c.pyi delete mode 100644 .transpyc_cache/8f12094c840be06a.doc.json delete mode 100644 .transpyc_cache/8f12094c840be06a.pyi delete mode 100644 .transpyc_cache/90921d009fdd674c.pyi delete mode 100644 .transpyc_cache/90d4bbcb87a33305.doc.json delete mode 100644 .transpyc_cache/90d4bbcb87a33305.pyi delete mode 100644 .transpyc_cache/9172f37e8d46721b.doc.json delete mode 100644 .transpyc_cache/9172f37e8d46721b.pyi delete mode 100644 .transpyc_cache/91a2bd55f6b00ffc.doc.json delete mode 100644 .transpyc_cache/91a2bd55f6b00ffc.pyi delete mode 100644 .transpyc_cache/924ed8cd4ea5c4c2.doc.json delete mode 100644 .transpyc_cache/924ed8cd4ea5c4c2.pyi delete mode 100644 .transpyc_cache/93427ff78e455f30.doc.json delete mode 100644 .transpyc_cache/93427ff78e455f30.pyi delete mode 100644 .transpyc_cache/93816021912fb156.doc.json delete mode 100644 .transpyc_cache/93816021912fb156.pyi delete mode 100644 .transpyc_cache/93964ed348985612.doc.json delete mode 100644 .transpyc_cache/93964ed348985612.pyi delete mode 100644 .transpyc_cache/93c1d18e35d188d6.pyi rename Test/AstTest/temp/ab6e54ba9a669f76.pyi => .transpyc_cache/9474791561654346.pyi (83%) delete mode 100644 .transpyc_cache/950028de389b7a7b.doc.json delete mode 100644 .transpyc_cache/950028de389b7a7b.pyi delete mode 100644 .transpyc_cache/953883473b8184c1.doc.json delete mode 100644 .transpyc_cache/953883473b8184c1.pyi delete mode 100644 .transpyc_cache/95394ca8da0f655a.pyi delete mode 100644 .transpyc_cache/96368aa26ab1b560.doc.json delete mode 100644 .transpyc_cache/96368aa26ab1b560.pyi delete mode 100644 .transpyc_cache/96837bcc64032444.pyi delete mode 100644 .transpyc_cache/969c589035910845.doc.json delete mode 100644 .transpyc_cache/969c589035910845.pyi delete mode 100644 .transpyc_cache/97043f0d52da437f.doc.json delete mode 100644 .transpyc_cache/97043f0d52da437f.pyi delete mode 100644 .transpyc_cache/982690df9fb41dde.doc.json delete mode 100644 .transpyc_cache/982690df9fb41dde.pyi delete mode 100644 .transpyc_cache/9852dff1297b8322.doc.json delete mode 100644 .transpyc_cache/9852dff1297b8322.pyi delete mode 100644 .transpyc_cache/98826042e4664018.doc.json delete mode 100644 .transpyc_cache/98826042e4664018.pyi delete mode 100644 .transpyc_cache/9928c0bfda57ff30.doc.json delete mode 100644 .transpyc_cache/9928c0bfda57ff30.pyi delete mode 100644 .transpyc_cache/9b52a4613d3ad296.doc.json delete mode 100644 .transpyc_cache/9b52a4613d3ad296.pyi delete mode 100644 .transpyc_cache/9b7d2adaae94f021.doc.json delete mode 100644 .transpyc_cache/9b7d2adaae94f021.pyi delete mode 100644 .transpyc_cache/9ba128b762cf2b4d.doc.json delete mode 100644 .transpyc_cache/9ba128b762cf2b4d.pyi delete mode 100644 .transpyc_cache/9d798d964b9d3411.doc.json delete mode 100644 .transpyc_cache/9d798d964b9d3411.pyi delete mode 100644 .transpyc_cache/9d8e1c9631c28b1b.doc.json delete mode 100644 .transpyc_cache/9d8e1c9631c28b1b.pyi delete mode 100644 .transpyc_cache/9e38ca4de81ccb6d.doc.json delete mode 100644 .transpyc_cache/9e38ca4de81ccb6d.pyi delete mode 100644 .transpyc_cache/9f6e387913081f0e.doc.json delete mode 100644 .transpyc_cache/9f6e387913081f0e.pyi delete mode 100644 .transpyc_cache/9fdf7e28103d0ff0.doc.json delete mode 100644 .transpyc_cache/9fdf7e28103d0ff0.pyi delete mode 100644 .transpyc_cache/a03139660029514f.doc.json delete mode 100644 .transpyc_cache/a03139660029514f.pyi delete mode 100644 .transpyc_cache/a0612a85a12439a9.doc.json delete mode 100644 .transpyc_cache/a0612a85a12439a9.pyi delete mode 100644 .transpyc_cache/a0e0675172e4f01f.doc.json delete mode 100644 .transpyc_cache/a0e0675172e4f01f.pyi delete mode 100644 .transpyc_cache/a30bd51aa00f0bef.doc.json delete mode 100644 .transpyc_cache/a30bd51aa00f0bef.pyi delete mode 100644 .transpyc_cache/a47313ed1481da7d.doc.json delete mode 100644 .transpyc_cache/a47313ed1481da7d.pyi delete mode 100644 .transpyc_cache/a5407d80d9f015ed.doc.json delete mode 100644 .transpyc_cache/a5407d80d9f015ed.pyi delete mode 100644 .transpyc_cache/a68b70f233541a7f.pyi delete mode 100644 .transpyc_cache/a6972611852b8a4e.doc.json delete mode 100644 .transpyc_cache/a6972611852b8a4e.pyi delete mode 100644 .transpyc_cache/a6a3e195cd7dd0b4.doc.json delete mode 100644 .transpyc_cache/a6a3e195cd7dd0b4.pyi delete mode 100644 .transpyc_cache/a711c9c66fd7c6ca.doc.json delete mode 100644 .transpyc_cache/a711c9c66fd7c6ca.pyi delete mode 100644 .transpyc_cache/a7cf0ce4066332ae.doc.json delete mode 100644 .transpyc_cache/a7cf0ce4066332ae.pyi delete mode 100644 .transpyc_cache/a9ad5e41081c9377.doc.json delete mode 100644 .transpyc_cache/a9ad5e41081c9377.pyi delete mode 100644 .transpyc_cache/a9b97a11bf30daa0.doc.json delete mode 100644 .transpyc_cache/a9b97a11bf30daa0.pyi delete mode 100644 .transpyc_cache/a9df037d9178888f.doc.json delete mode 100644 .transpyc_cache/a9df037d9178888f.pyi delete mode 100644 .transpyc_cache/aba439b7882ad9d6.pyi delete mode 100644 .transpyc_cache/abbcbd92436cc16a.pyi delete mode 100644 .transpyc_cache/ac0d686cb2cc783b.doc.json delete mode 100644 .transpyc_cache/ac0d686cb2cc783b.pyi delete mode 100644 .transpyc_cache/aca085940d1ca494.doc.json delete mode 100644 .transpyc_cache/aca085940d1ca494.pyi delete mode 100644 .transpyc_cache/ae0cc890f657076d.doc.json delete mode 100644 .transpyc_cache/ae0cc890f657076d.pyi delete mode 100644 .transpyc_cache/ae1e8a6903834d9c.doc.json delete mode 100644 .transpyc_cache/ae1e8a6903834d9c.pyi delete mode 100644 .transpyc_cache/aeb670958072076e.pyi delete mode 100644 .transpyc_cache/aeb8034bdb2b370b.doc.json delete mode 100644 .transpyc_cache/aeb8034bdb2b370b.pyi delete mode 100644 .transpyc_cache/af9484a65085bf4b.doc.json delete mode 100644 .transpyc_cache/af9484a65085bf4b.pyi delete mode 100644 .transpyc_cache/b1122357fee8fd68.doc.json delete mode 100644 .transpyc_cache/b1122357fee8fd68.pyi delete mode 100644 .transpyc_cache/b235d6477436c524.doc.json delete mode 100644 .transpyc_cache/b235d6477436c524.pyi delete mode 100644 .transpyc_cache/b298756207e2da58.doc.json delete mode 100644 .transpyc_cache/b298756207e2da58.pyi delete mode 100644 .transpyc_cache/b29b80b6106e4be7.doc.json delete mode 100644 .transpyc_cache/b29b80b6106e4be7.pyi delete mode 100644 .transpyc_cache/b3c2b99b6f3be4c7.doc.json delete mode 100644 .transpyc_cache/b3c2b99b6f3be4c7.pyi delete mode 100644 .transpyc_cache/b3fd73f7abbd88a8.doc.json delete mode 100644 .transpyc_cache/b3fd73f7abbd88a8.pyi delete mode 100644 .transpyc_cache/b436212dcff1be29.doc.json delete mode 100644 .transpyc_cache/b436212dcff1be29.pyi delete mode 100644 .transpyc_cache/b547ac4f380bddb6.pyi delete mode 100644 .transpyc_cache/b558d8d8f01f4825.pyi delete mode 100644 .transpyc_cache/b5a965302cded36b.pyi delete mode 100644 .transpyc_cache/b5d05dbd7fee36ef.doc.json delete mode 100644 .transpyc_cache/b5d05dbd7fee36ef.pyi delete mode 100644 .transpyc_cache/b69cdee68f223fef.doc.json delete mode 100644 .transpyc_cache/b777c587cc21465a.doc.json delete mode 100644 .transpyc_cache/b777c587cc21465a.pyi delete mode 100644 .transpyc_cache/b7eeff93aa63e70f.doc.json delete mode 100644 .transpyc_cache/b7eeff93aa63e70f.pyi delete mode 100644 .transpyc_cache/b8c66c8ff44eb874.pyi delete mode 100644 .transpyc_cache/b8cbe044a10adcca.doc.json delete mode 100644 .transpyc_cache/b8cbe044a10adcca.pyi delete mode 100644 .transpyc_cache/bc52b7a79738d25a.doc.json delete mode 100644 .transpyc_cache/bc52b7a79738d25a.pyi delete mode 100644 .transpyc_cache/bd82e3ca81546c76.doc.json delete mode 100644 .transpyc_cache/bd82e3ca81546c76.pyi delete mode 100644 .transpyc_cache/bdfc8bd243b7e5b7.doc.json delete mode 100644 .transpyc_cache/bdfc8bd243b7e5b7.pyi delete mode 100644 .transpyc_cache/bf38ca6c448d2d33.doc.json delete mode 100644 .transpyc_cache/bf38ca6c448d2d33.pyi delete mode 100644 .transpyc_cache/c01b27dbcd683245.doc.json delete mode 100644 .transpyc_cache/c01b27dbcd683245.pyi delete mode 100644 .transpyc_cache/c1416dfae155d6e2.doc.json delete mode 100644 .transpyc_cache/c1416dfae155d6e2.pyi delete mode 100644 .transpyc_cache/c24f25b14b4bbd0a.pyi delete mode 100644 .transpyc_cache/c2ed034f4bfaad51.doc.json delete mode 100644 .transpyc_cache/c2ed034f4bfaad51.pyi delete mode 100644 .transpyc_cache/c2f78fe75716e993.doc.json delete mode 100644 .transpyc_cache/c2f78fe75716e993.pyi delete mode 100644 .transpyc_cache/c325121077fc50d9.doc.json delete mode 100644 .transpyc_cache/c325121077fc50d9.pyi delete mode 100644 .transpyc_cache/c39f3e540adb7b4e.doc.json delete mode 100644 .transpyc_cache/c39f3e540adb7b4e.pyi delete mode 100644 .transpyc_cache/c3a6aed1f1fb8b1e.pyi delete mode 100644 .transpyc_cache/c3b259b4059f8668.pyi delete mode 100644 .transpyc_cache/c4960bf577b21f14.doc.json delete mode 100644 .transpyc_cache/c4960bf577b21f14.pyi delete mode 100644 .transpyc_cache/c4f2d483ec0f4db5.doc.json delete mode 100644 .transpyc_cache/c4f2d483ec0f4db5.pyi delete mode 100644 .transpyc_cache/c688cec0f891dd97.doc.json delete mode 100644 .transpyc_cache/c688cec0f891dd97.pyi delete mode 100644 .transpyc_cache/c70684ccfe48a5a9.doc.json delete mode 100644 .transpyc_cache/c70684ccfe48a5a9.pyi delete mode 100644 .transpyc_cache/c7b66e67f49c5c06.doc.json delete mode 100644 .transpyc_cache/c7b66e67f49c5c06.pyi delete mode 100644 .transpyc_cache/c7ef33270dce36e3.doc.json delete mode 100644 .transpyc_cache/c7ef33270dce36e3.pyi delete mode 100644 .transpyc_cache/c9d54a4158f7f5a8.pyi delete mode 100644 .transpyc_cache/cb151b297f4ea56d.doc.json delete mode 100644 .transpyc_cache/cb151b297f4ea56d.pyi delete mode 100644 .transpyc_cache/cc3ad7f3bc880326.doc.json delete mode 100644 .transpyc_cache/cc3ad7f3bc880326.pyi delete mode 100644 .transpyc_cache/cc436a125bbaf28c.pyi delete mode 100644 .transpyc_cache/cdff0d7b58fc935b.doc.json delete mode 100644 .transpyc_cache/cdff0d7b58fc935b.pyi delete mode 100644 .transpyc_cache/cfc83b830141b00e.doc.json delete mode 100644 .transpyc_cache/cfc83b830141b00e.pyi delete mode 100644 .transpyc_cache/d152115b49e50218.pyi delete mode 100644 .transpyc_cache/d1599ecbac5b6586.doc.json delete mode 100644 .transpyc_cache/d1599ecbac5b6586.pyi delete mode 100644 .transpyc_cache/d28c16ea0550c4a4.doc.json delete mode 100644 .transpyc_cache/d28c16ea0550c4a4.pyi delete mode 100644 .transpyc_cache/d33c3f139167d275.doc.json delete mode 100644 .transpyc_cache/d33c3f139167d275.pyi delete mode 100644 .transpyc_cache/d358712e53b4da98.doc.json delete mode 100644 .transpyc_cache/d358712e53b4da98.pyi delete mode 100644 .transpyc_cache/d541ade6afb689a5.pyi delete mode 100644 .transpyc_cache/d63d2c2a2bd9bd2a.pyi delete mode 100644 .transpyc_cache/d7662500f1c2c0ff.doc.json delete mode 100644 .transpyc_cache/d7662500f1c2c0ff.pyi delete mode 100644 .transpyc_cache/d7e3386b828acb66.pyi delete mode 100644 .transpyc_cache/d855b3e66d1d6522.doc.json delete mode 100644 .transpyc_cache/d855b3e66d1d6522.pyi delete mode 100644 .transpyc_cache/d9322f0db660edd8.doc.json delete mode 100644 .transpyc_cache/d9322f0db660edd8.pyi delete mode 100644 .transpyc_cache/da80633346bb66e2.doc.json delete mode 100644 .transpyc_cache/da80633346bb66e2.pyi delete mode 100644 .transpyc_cache/db434883fc668c7c.doc.json delete mode 100644 .transpyc_cache/db434883fc668c7c.pyi delete mode 100644 .transpyc_cache/db4aafce81f39b32.doc.json delete mode 100644 .transpyc_cache/db4aafce81f39b32.pyi delete mode 100644 .transpyc_cache/db7c4a8f09d02a17.doc.json delete mode 100644 .transpyc_cache/db7c4a8f09d02a17.pyi delete mode 100644 .transpyc_cache/dd19090b337e9bea.doc.json delete mode 100644 .transpyc_cache/dd19090b337e9bea.pyi delete mode 100644 .transpyc_cache/df4ee63d3fef30a0.doc.json delete mode 100644 .transpyc_cache/df4ee63d3fef30a0.pyi delete mode 100644 .transpyc_cache/e0009679269c6b63.doc.json delete mode 100644 .transpyc_cache/e0009679269c6b63.pyi delete mode 100644 .transpyc_cache/e0b84369e50c937c.pyi delete mode 100644 .transpyc_cache/e24a7f4a875f4518.doc.json delete mode 100644 .transpyc_cache/e24a7f4a875f4518.pyi delete mode 100644 .transpyc_cache/e272d279f536a678.doc.json delete mode 100644 .transpyc_cache/e272d279f536a678.pyi delete mode 100644 .transpyc_cache/e285a7afdd9d844f.doc.json delete mode 100644 .transpyc_cache/e285a7afdd9d844f.pyi delete mode 100644 .transpyc_cache/e306c57855054e23.doc.json delete mode 100644 .transpyc_cache/e306c57855054e23.pyi delete mode 100644 .transpyc_cache/e36333e2cadb713a.doc.json delete mode 100644 .transpyc_cache/e36333e2cadb713a.pyi delete mode 100644 .transpyc_cache/e3834089153af692.doc.json delete mode 100644 .transpyc_cache/e3834089153af692.pyi delete mode 100644 .transpyc_cache/e3ac223bdaf94a0c.doc.json delete mode 100644 .transpyc_cache/e3ac223bdaf94a0c.pyi delete mode 100644 .transpyc_cache/e3e7b6de8d7d8b03.pyi delete mode 100644 .transpyc_cache/e3f3b9ed2a5030c6.doc.json delete mode 100644 .transpyc_cache/e3f3b9ed2a5030c6.pyi delete mode 100644 .transpyc_cache/e445a2bb299d1b7d.doc.json delete mode 100644 .transpyc_cache/e445a2bb299d1b7d.pyi delete mode 100644 .transpyc_cache/e4c98f097b75da35.doc.json delete mode 100644 .transpyc_cache/e4c98f097b75da35.pyi delete mode 100644 .transpyc_cache/e5be27ae4fe7ce04.doc.json delete mode 100644 .transpyc_cache/e5be27ae4fe7ce04.pyi delete mode 100644 .transpyc_cache/e5fb16127bce8f68.doc.json delete mode 100644 .transpyc_cache/e5fb16127bce8f68.pyi delete mode 100644 .transpyc_cache/e7183a8c64d4872d.doc.json delete mode 100644 .transpyc_cache/e7183a8c64d4872d.pyi delete mode 100644 .transpyc_cache/e74870eba3e6d774.doc.json delete mode 100644 .transpyc_cache/e74870eba3e6d774.pyi delete mode 100644 .transpyc_cache/e773fbfd4a1e4587.doc.json delete mode 100644 .transpyc_cache/e773fbfd4a1e4587.pyi delete mode 100644 .transpyc_cache/eb252050d92f8fb9.doc.json delete mode 100644 .transpyc_cache/eb252050d92f8fb9.pyi delete mode 100644 .transpyc_cache/ed1c124f3cb787c9.doc.json delete mode 100644 .transpyc_cache/ed1c124f3cb787c9.pyi delete mode 100644 .transpyc_cache/ee52c08239684346.pyi delete mode 100644 .transpyc_cache/ef45adce81bf5b2d.doc.json delete mode 100644 .transpyc_cache/ef45adce81bf5b2d.pyi delete mode 100644 .transpyc_cache/f08abd3a207590f0.doc.json delete mode 100644 .transpyc_cache/f08abd3a207590f0.pyi delete mode 100644 .transpyc_cache/f26cd4c78b4d554c.doc.json delete mode 100644 .transpyc_cache/f26cd4c78b4d554c.pyi delete mode 100644 .transpyc_cache/f26d7266c4f8762b.doc.json delete mode 100644 .transpyc_cache/f26d7266c4f8762b.pyi delete mode 100644 .transpyc_cache/f2fc34882dad695a.doc.json delete mode 100644 .transpyc_cache/f2fc34882dad695a.pyi rename Test/ArgparseTest/temp/ee084e9fc6ee413a.pyi => .transpyc_cache/f3560b99de458aec.pyi (88%) delete mode 100644 .transpyc_cache/f492cb40d913400b.doc.json delete mode 100644 .transpyc_cache/f492cb40d913400b.pyi delete mode 100644 .transpyc_cache/f49abd3c81119ada.doc.json delete mode 100644 .transpyc_cache/f49abd3c81119ada.pyi delete mode 100644 .transpyc_cache/f9c68a21786049ce.doc.json delete mode 100644 .transpyc_cache/f9c68a21786049ce.pyi delete mode 100644 .transpyc_cache/faec3233d98371da.doc.json delete mode 100644 .transpyc_cache/faec3233d98371da.pyi delete mode 100644 .transpyc_cache/fb6cea4f70fade7a.doc.json delete mode 100644 .transpyc_cache/fb6cea4f70fade7a.pyi delete mode 100644 .transpyc_cache/ff3ad21889888a9a.doc.json delete mode 100644 .transpyc_cache/ff3ad21889888a9a.pyi rename Test/ArgparseTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename Test/{BuddyTest/temp/ab6e54ba9a669f76.pyi => ArgparseTest/temp/9474791561654346.pyi} (83%) rename .transpyc_cache/ee084e9fc6ee413a.pyi => Test/ArgparseTest/temp/f3560b99de458aec.pyi (88%) rename Test/{ArgparseTest/temp/ab6e54ba9a669f76.pyi => AstTest/temp/9474791561654346.pyi} (83%) rename Test/AstTest/temp/{ee084e9fc6ee413a.pyi => f3560b99de458aec.pyi} (88%) create mode 100644 Test/BuddyTest/output/5a3d93d7860d5dc0.deps.json rename Test/BuddyTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename .transpyc_cache/0019c939aae7f9f1.doc.json => Test/BuddyTest/temp/5a3d93d7860d5dc0.doc.json (100%) rename .transpyc_cache/b69cdee68f223fef.pyi => Test/BuddyTest/temp/5a3d93d7860d5dc0.pyi (100%) rename .transpyc_cache/ab6e54ba9a669f76.pyi => Test/BuddyTest/temp/9474791561654346.pyi (83%) delete mode 100644 Test/BuddyTest/temp/b69cdee68f223fef.doc.json delete mode 100644 Test/BuddyTest/temp/b69cdee68f223fef.pyi rename Test/BuddyTest/temp/{ee084e9fc6ee413a.pyi => f3560b99de458aec.pyi} (88%) rename Test/BuiltinDecoratorTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename Test/CPythonTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename Test/ClosureTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename Test/ClosureTest2/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename Test/DecoratorMarkerTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename Test/DecoratorTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/DictTest/output/b3c2b99b6f3be4c7.deps.json rename Test/DictTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/DictTest/temp/9474791561654346.pyi delete mode 100644 Test/DictTest/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/DictTest/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/DictTest/temp/f3560b99de458aec.pyi rename Test/DocTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/DocTest/temp/9474791561654346.pyi delete mode 100644 Test/DocTest/temp/ab6e54ba9a669f76.pyi rename Test/EdgeCaseTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename Test/EqTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/EqTest/temp/9474791561654346.pyi delete mode 100644 Test/EqTest/temp/ab6e54ba9a669f76.pyi create mode 100644 Test/FakeDuckTest/output/0035c95a18d4f8e8.deps.json create mode 100644 Test/FakeDuckTest/output/067c78e9f121dce3.deps.json create mode 100644 Test/FakeDuckTest/output/06f53cc594b4ac6c.deps.json create mode 100644 Test/FakeDuckTest/output/14d33679f7fadf1f.deps.json create mode 100644 Test/FakeDuckTest/output/271ea3decb810db2.deps.json create mode 100644 Test/FakeDuckTest/output/5b2e220c5bae60c9.deps.json create mode 100644 Test/FakeDuckTest/output/6446627d4f07a1b5.deps.json create mode 100644 Test/FakeDuckTest/output/72e2d5ccb7cedcf1.deps.json create mode 100644 Test/FakeDuckTest/output/79b337e5ea8951e2.deps.json create mode 100644 Test/FakeDuckTest/output/7e529fe7a078cfef.deps.json create mode 100644 Test/FakeDuckTest/output/9474791561654346.deps.json create mode 100644 Test/FakeDuckTest/output/_shared_sym_includes.pickle create mode 100644 Test/FakeDuckTest/output/bbdf3bbd4c3bc28c.deps.json create mode 100644 Test/FakeDuckTest/output/c9f4be41ca1cc2b4.deps.json create mode 100644 Test/FakeDuckTest/output/f2ecbf8ced20575c.deps.json create mode 100644 Test/FakeDuckTest/output/f3560b99de458aec.deps.json create mode 100644 Test/FakeDuckTest/output/f6b51804a0ba8ff0.deps.json rename Test/FakeDuckTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/FakeDuckTest/temp/9474791561654346.pyi delete mode 100644 Test/FakeDuckTest/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/FakeDuckTest/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/FakeDuckTest/temp/f3560b99de458aec.pyi rename Test/ForAndLoopTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/ForAndLoopTest/temp/9474791561654346.pyi delete mode 100644 Test/ForAndLoopTest/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/ForAndLoopTest/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/ForAndLoopTest/temp/f3560b99de458aec.pyi rename Test/FormatStringTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename Test/FuncTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename Test/GenericTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename Test/GenericTest2/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename Test/HashTableTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/HashTableTest/temp/9474791561654346.pyi delete mode 100644 Test/HashTableTest/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/HashTableTest/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/HashTableTest/temp/f3560b99de458aec.pyi rename Test/IterTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/IterTest/temp/9474791561654346.pyi delete mode 100644 Test/IterTest/temp/ab6e54ba9a669f76.pyi rename Test/JsonTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/JsonTest/temp/9474791561654346.pyi delete mode 100644 Test/JsonTest/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/JsonTest/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/JsonTest/temp/f3560b99de458aec.pyi delete mode 100644 Test/LLvmLiteTest/output/3e914ffe8cc3c120.deps.json create mode 100644 Test/LLvmLiteTest/output/5b8cf12a5862b640.deps.json rename Test/LLvmLiteTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename .transpyc_cache/455ff4e74c3dbfb0.pyi => Test/LLvmLiteTest/temp/15f1ded02f3aa5bc.pyi (99%) delete mode 100644 Test/LLvmLiteTest/temp/3e914ffe8cc3c120.doc.json delete mode 100644 Test/LLvmLiteTest/temp/3e914ffe8cc3c120.pyi delete mode 100644 Test/LLvmLiteTest/temp/455ff4e74c3dbfb0.pyi delete mode 100644 Test/LLvmLiteTest/temp/46ea362b72c10a9e.pyi rename Test/LLvmLiteTest/temp/{e0b84369e50c937c.pyi => 4dad2ba72ed7ba09.pyi} (98%) rename .transpyc_cache/02d833b3cf571c5b.doc.json => Test/LLvmLiteTest/temp/5b8cf12a5862b640.doc.json (100%) rename .transpyc_cache/3e914ffe8cc3c120.pyi => Test/LLvmLiteTest/temp/5b8cf12a5862b640.pyi (100%) rename .transpyc_cache/d4117f5e00a6c3b5.pyi => Test/LLvmLiteTest/temp/6b3bc463fd044545.pyi (99%) rename .transpyc_cache/46ea362b72c10a9e.pyi => Test/LLvmLiteTest/temp/946e087da91aaada.pyi (99%) create mode 100644 Test/LLvmLiteTest/temp/9474791561654346.pyi delete mode 100644 Test/LLvmLiteTest/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/LLvmLiteTest/temp/d4117f5e00a6c3b5.pyi delete mode 100644 Test/LLvmLiteTest/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/LLvmLiteTest/temp/f3560b99de458aec.pyi rename Test/LLvmLiteTest/temp/{05c11f22675c60cb.pyi => f9e36e2cd6fa659f.pyi} (99%) rename Test/ListTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/ListTest/temp/9474791561654346.pyi delete mode 100644 Test/ListTest/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/ListTest/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/ListTest/temp/f3560b99de458aec.pyi rename Test/LoopTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/MemhubTest/output/3ff210e50f345c7c.deps.json delete mode 100644 Test/MemhubTest/output/4ebd3745aa9cf570.deps.json rename Test/MemhubTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename .transpyc_cache/03b24bc1d9327958.doc.json => Test/MemhubTest/temp/3ff210e50f345c7c.doc.json (100%) rename .transpyc_cache/4ebd3745aa9cf570.pyi => Test/MemhubTest/temp/3ff210e50f345c7c.pyi (100%) delete mode 100644 Test/MemhubTest/temp/4ebd3745aa9cf570.doc.json delete mode 100644 Test/MemhubTest/temp/4ebd3745aa9cf570.pyi create mode 100644 Test/MemhubTest/temp/9474791561654346.pyi delete mode 100644 Test/MemhubTest/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/MemhubTest/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/MemhubTest/temp/f3560b99de458aec.pyi create mode 100644 Test/NewAstTest/temp/9474791561654346.pyi delete mode 100644 Test/NewAstTest/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/NewAstTest/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/NewAstTest/temp/f3560b99de458aec.pyi rename Test/NoVTableTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/NoVTableTest/temp/9474791561654346.pyi delete mode 100644 Test/NoVTableTest/temp/ab6e54ba9a669f76.pyi rename Test/PointerTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/PointerTest/temp/9474791561654346.pyi delete mode 100644 Test/PointerTest/temp/ab6e54ba9a669f76.pyi rename Test/ShortCircuitTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/ShortCircuitTest/temp/9474791561654346.pyi delete mode 100644 Test/ShortCircuitTest/temp/ab6e54ba9a669f76.pyi rename Test/SimdTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/SimdTest/temp/9474791561654346.pyi delete mode 100644 Test/SimdTest/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/SimdTest/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/SimdTest/temp/f3560b99de458aec.pyi rename Test/SprintfTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename Test/StringIterTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/StringIterTest/temp/9474791561654346.pyi delete mode 100644 Test/StringIterTest/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/StringIterTest/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/StringIterTest/temp/f3560b99de458aec.pyi rename Test/StringTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/StringTest/temp/9474791561654346.pyi delete mode 100644 Test/StringTest/temp/ab6e54ba9a669f76.pyi rename Test/StructTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/StructTest/temp/9474791561654346.pyi delete mode 100644 Test/StructTest/temp/ab6e54ba9a669f76.pyi rename Test/SysLibTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/SysLibTest/temp/9474791561654346.pyi delete mode 100644 Test/SysLibTest/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/SysLibTest/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/SysLibTest/temp/f3560b99de458aec.pyi rename Test/TestFBProject/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename Test/TestProject/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/TestProject/temp/9474791561654346.pyi delete mode 100644 Test/TestProject/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/TestProject/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/TestProject/temp/f3560b99de458aec.pyi delete mode 100644 Test/TestProject2/output/0df65b8ed15664b0.deps.json delete mode 100644 Test/TestProject2/output/19f8024d10c828e8.deps.json delete mode 100644 Test/TestProject2/output/213348433fb01cc6.deps.json delete mode 100644 Test/TestProject2/output/257e074b935c33b4.deps.json delete mode 100644 Test/TestProject2/output/451745df21e598af.deps.json delete mode 100644 Test/TestProject2/output/6ff26590374ae6fc.deps.json delete mode 100644 Test/TestProject2/output/8ebed83a7817fa0c.deps.json delete mode 100644 Test/TestProject2/output/90921d009fdd674c.deps.json delete mode 100644 Test/TestProject2/output/_shared_sym_includes.pickle delete mode 100644 Test/TestProject2/output/c9d54a4158f7f5a8.deps.json delete mode 100644 Test/TestProject2/output/d541ade6afb689a5.deps.json rename Test/TestProject2/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/TestProject2/temp/9474791561654346.pyi delete mode 100644 Test/TestProject2/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/TestProject2/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/TestProject2/temp/f3560b99de458aec.pyi create mode 100644 Test/TestProject3/output/0019c939aae7f9f1.deps.json rename Test/TestProject3/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename .transpyc_cache/bf9813f6e3c9d351.pyi => Test/TestProject3/temp/285a822aa26bfbda.pyi (100%) create mode 100644 Test/TestProject3/temp/9474791561654346.pyi delete mode 100644 Test/TestProject3/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/TestProject3/temp/bf9813f6e3c9d351.pyi delete mode 100644 Test/TestProject3/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/TestProject3/temp/f3560b99de458aec.pyi rename Test/TypeCastTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/TypeCastTest/temp/9474791561654346.pyi delete mode 100644 Test/TypeCastTest/temp/ab6e54ba9a669f76.pyi rename Test/VRandomTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) rename Test/VariadicTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/VariadicTest/temp/9474791561654346.pyi delete mode 100644 Test/VariadicTest/temp/ab6e54ba9a669f76.pyi create mode 100644 Test/WebTest/temp/9474791561654346.pyi delete mode 100644 Test/WebTest/temp/ab6e54ba9a669f76.pyi delete mode 100644 Test/WebTest/temp/ee084e9fc6ee413a.pyi create mode 100644 Test/WebTest/temp/f3560b99de458aec.pyi create mode 100644 Test/ZlibTest/output/0f8134f67bdaba8f.deps.json rename Test/ZlibTest/temp/{dd3002730623424b.pyi => 14d33679f7fadf1f.pyi} (100%) create mode 100644 Test/ZlibTest/temp/9474791561654346.pyi delete mode 100644 Test/ZlibTest/temp/ab6e54ba9a669f76.pyi rename TransPyV/Test/temp/{dd3002730623424b.deps.txt => 14d33679f7fadf1f.deps.txt} (100%) rename TransPyV/Test/temp/{bf9813f6e3c9d351.deps.txt => 285a822aa26bfbda.deps.txt} (100%) rename TransPyV/Test/temp/{ee084e9fc6ee413a.deps.txt => f3560b99de458aec.deps.txt} (100%) create mode 100644 debug_dict_full.txt create mode 100644 debug_dict_output.txt create mode 100644 full_log.txt create mode 100644 full_log2.txt create mode 100644 includes/hello.py create mode 100644 regression_output.txt create mode 100644 test_inherited_decls.py delete mode 100644 thistest/output/0035c95a18d4f8e8.deps.json delete mode 100644 thistest/output/067c78e9f121dce3.deps.json delete mode 100644 thistest/output/06f53cc594b4ac6c.deps.json create mode 100644 thistest/output/6166aecc7fa7ad65.deps.json delete mode 100644 thistest/output/6446627d4f07a1b5.deps.json delete mode 100644 thistest/output/72e2d5ccb7cedcf1.deps.json delete mode 100644 thistest/output/7e529fe7a078cfef.deps.json create mode 100644 thistest/output/8c37156d7b67c1f5.deps.json delete mode 100644 thistest/output/bbdf3bbd4c3bc28c.deps.json delete mode 100644 thistest/output/c1371d3dc6b676c2.deps.json delete mode 100644 thistest/output/f6b51804a0ba8ff0.deps.json delete mode 100644 thistest/temp/153805db5704f3e0.pyi delete mode 100644 thistest/temp/203a3999d5300163.pyi create mode 100644 thistest/temp/271ea3decb810db2.pyi delete mode 100644 thistest/temp/28d30831dd445f0f.pyi delete mode 100644 thistest/temp/2db2d238d218d3d8.pyi delete mode 100644 thistest/temp/2df45af226a48b4b.pyi create mode 100644 thistest/temp/3624cfde3c5cb6cb.pyi create mode 100644 thistest/temp/6166aecc7fa7ad65.pyi delete mode 100644 thistest/temp/77dcdc6020d63dc5.pyi delete mode 100644 thistest/temp/81d55b73067644b3.doc.json delete mode 100644 thistest/temp/81d55b73067644b3.pyi delete mode 100644 thistest/temp/86df096a4b57c422.pyi delete mode 100644 thistest/temp/87f45d9188e9d92f.pyi rename .transpyc_cache/067f811511854c88.doc.json => thistest/temp/8c37156d7b67c1f5.doc.json (100%) rename thistest/temp/{c1371d3dc6b676c2.pyi => 8c37156d7b67c1f5.pyi} (55%) create mode 100644 thistest/temp/90c53dd6db8d41cf.pyi create mode 100644 thistest/temp/9474791561654346.pyi delete mode 100644 thistest/temp/9664af47f66007d8.pyi delete mode 100644 thistest/temp/98028bc8b755b5f0.pyi delete mode 100644 thistest/temp/9db454840b9dbfe8.pyi delete mode 100644 thistest/temp/a642413df3ed705a.pyi delete mode 100644 thistest/temp/bbc118f202878cbe.pyi delete mode 100644 thistest/temp/bc52093344ff9400.pyi delete mode 100644 thistest/temp/c1371d3dc6b676c2.doc.json delete mode 100644 thistest/temp/c38e082ec6d38c8e.pyi create mode 100644 thistest/temp/c9f4be41ca1cc2b4.pyi delete mode 100644 thistest/temp/e907dcfbc2e1b32b.pyi create mode 100644 thistest/temp/f3560b99de458aec.pyi delete mode 100644 thistest/temp/f69ce03954b469e7.pyi delete mode 100644 thistest/temp/f6d5ab5251ee8b21.pyi delete mode 100644 thistest/temp/f71cf01f35e2325a.doc.json delete mode 100644 thistest/temp/f71cf01f35e2325a.pyi diff --git a/.transpyc_cache/0019c939aae7f9f1.pyi b/.transpyc_cache/0019c939aae7f9f1.pyi deleted file mode 100644 index 7c47ef2..0000000 --- a/.transpyc_cache/0019c939aae7f9f1.pyi +++ /dev/null @@ -1,14 +0,0 @@ -""" -Auto-generated Python stub file from mpooltest.py -Module: mpooltest -""" - - -import t, c -from t import CInt, CPtr, CChar -import viperlib -import viperio -import stdlib -import memhub - -def mpool_main() -> CInt: pass diff --git a/.transpyc_cache/001c1416e7a7dc50.doc.json b/.transpyc_cache/001c1416e7a7dc50.doc.json deleted file mode 100644 index 28f2ad8..0000000 --- a/.transpyc_cache/001c1416e7a7dc50.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_register_cexport_from_funcdef": "预注册 CExport/State 函数到全局表(仅注册,不生成 IR)", "translate_children": "遍历 tree.children 并翻译每个子节点\n\n Args:\n trans: 翻译器(含所有共享状态)\n tree: AST 模块节点\n\n Returns:\n t.CInt: 新增的变量数\n ", "handle_module_level_var": "处理模块级变量声明,创建全局变量", "create_wrapper_main": "创建包装 main 函数并翻译所有顶层语句\n\n Args:\n trans: 翻译器(含所有共享状态)\n tree: AST 模块节点\n i32_ty: i32 LLVMType\n\n Returns:\n t.CInt: 新增的变量数\n "} \ No newline at end of file diff --git a/.transpyc_cache/001c1416e7a7dc50.pyi b/.transpyc_cache/001c1416e7a7dc50.pyi deleted file mode 100644 index 3901124..0000000 --- a/.transpyc_cache/001c1416e7a7dc50.pyi +++ /dev/null @@ -1,31 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesMain.py -Module: lib.core.Handles.HandlesMain -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesBody as HandlesBody -import lib.core.Handles.HandlesFunctions as HandlesFunctions -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesClassDef as HandlesClassDef -import lib.core.Handles.HandlesAnnAssign as HandlesAnnAssign - -def _register_cexport_from_funcdef(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_children(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr) -> int: pass - -def handle_module_level_var(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def create_wrapper_main(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr, i32_ty: llvmlite.LLVMType | t.CPtr) -> int: pass diff --git a/.transpyc_cache/0029db369f740dd9.doc.json b/.transpyc_cache/0029db369f740dd9.doc.json deleted file mode 100644 index 28f2ad8..0000000 --- a/.transpyc_cache/0029db369f740dd9.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_register_cexport_from_funcdef": "预注册 CExport/State 函数到全局表(仅注册,不生成 IR)", "translate_children": "遍历 tree.children 并翻译每个子节点\n\n Args:\n trans: 翻译器(含所有共享状态)\n tree: AST 模块节点\n\n Returns:\n t.CInt: 新增的变量数\n ", "handle_module_level_var": "处理模块级变量声明,创建全局变量", "create_wrapper_main": "创建包装 main 函数并翻译所有顶层语句\n\n Args:\n trans: 翻译器(含所有共享状态)\n tree: AST 模块节点\n i32_ty: i32 LLVMType\n\n Returns:\n t.CInt: 新增的变量数\n "} \ No newline at end of file diff --git a/.transpyc_cache/0029db369f740dd9.pyi b/.transpyc_cache/0029db369f740dd9.pyi deleted file mode 100644 index 2294a70..0000000 --- a/.transpyc_cache/0029db369f740dd9.pyi +++ /dev/null @@ -1,30 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesMain.py -Module: lib.core.Handles.HandlesMain -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesBody as HandlesBody -import lib.core.Handles.HandlesFunctions as HandlesFunctions -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -def _register_cexport_from_funcdef(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_children(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr) -> int: pass - -def handle_module_level_var(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def create_wrapper_main(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr, i32_ty: llvmlite.LLVMType | t.CPtr) -> int: pass diff --git a/.transpyc_cache/02885f6f134079c2.doc.json b/.transpyc_cache/02885f6f134079c2.doc.json deleted file mode 100644 index 1a7c43a..0000000 --- a/.transpyc_cache/02885f6f134079c2.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"VarEntry": "变量表条目", "Scope": "作用域节点", "SymbolTable": "嵌套作用域符号表", "init_vars": "分配并清零变量表数组", "find_var": "在变量表中按名称查找", "find_var_entry": "在变量表中按名称查找,返回 VarEntry 或 None", "lookup_var_entry": "从当前作用域逐级向上查找变量,返回 VarEntry 或 None", "set_var_annot_class_name": "设置变量的原始类型注解类名,返回 0=成功 / 1=失败", "add_var": "添加变量到变量表", "get_or_create_var": "查找或创建变量 alloca", "_create_scope": "创建并初始化作用域节点", "init_symbol_table": "创建并初始化符号表,包含模块级根作用域", "enter_scope": "进入新作用域,返回新创建的作用域", "exit_scope": "退出当前作用域,恢复到父作用域", "define_var": "在当前作用域定义变量,返回 0 成功", "define_module_var": "在模块作用域定义变量,返回 0 成功", "lookup_var": "从当前作用域逐级向上查找变量,返回 alloca 或 None", "lookup_current": "仅在当前作用域查找变量", "lookup_module_var": "在模块作用域查找变量", "get_or_create_sym": "查找或创建变量 alloca(在当前作用域)"} \ No newline at end of file diff --git a/.transpyc_cache/02885f6f134079c2.pyi b/.transpyc_cache/02885f6f134079c2.pyi deleted file mode 100644 index fb5e055..0000000 --- a/.transpyc_cache/02885f6f134079c2.pyi +++ /dev/null @@ -1,68 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesVar.py -Module: lib.core.Handles.HandlesVar -""" - - -import t, c -from stdint import * -import llvmlite -import memhub -import string - -SCOPE_MODULE: t.CDefine = 0 -SCOPE_FUNCTION: t.CDefine = 1 -SCOPE_BLOCK: t.CDefine = 2 -MAX_VARS: t.CDefine = 256 - -@t.NoVTable -class VarEntry: - Name: t.CChar | t.CPtr - Alloca: llvmlite.Value | t.CPtr - Used: t.CInt - AnnotClassName: t.CChar | t.CPtr -@t.NoVTable -class Scope: - Parent: Scope | t.CPtr - Vars: VarEntry | t.CPtr - VarCount: t.CInt - Kind: t.CInt -@t.NoVTable -class SymbolTable: - Pool: memhub.MemBuddy | t.CPtr - Root: Scope | t.CPtr - Current: Scope | t.CPtr - -def init_vars(pool: memhub.MemBuddy | t.CPtr) -> VarEntry | t.CPtr: pass - -def find_var(vars_ptr: VarEntry | t.CPtr, var_count: int, name: str) -> llvmlite.Value | t.CPtr: pass - -def find_var_entry(vars_ptr: VarEntry | t.CPtr, var_count: int, name: str) -> VarEntry | t.CPtr: pass - -def lookup_var_entry(symtab: SymbolTable | t.CPtr, name: str) -> VarEntry | t.CPtr: pass - -def set_var_annot_class_name(symtab: SymbolTable | t.CPtr, name: str, class_name: str) -> int: pass - -def add_var(vars_ptr: VarEntry | t.CPtr, var_count: int, name: str, alloca: llvmlite.Value | t.CPtr) -> int: pass - -def get_or_create_var(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, vars_ptr: VarEntry | t.CPtr, var_count: int, name: str, ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _create_scope(pool: memhub.MemBuddy | t.CPtr, parent: Scope | t.CPtr, kind: int) -> Scope | t.CPtr: pass - -def init_symbol_table(pool: memhub.MemBuddy | t.CPtr) -> SymbolTable | t.CPtr: pass - -def enter_scope(symtab: SymbolTable | t.CPtr, kind: int) -> Scope | t.CPtr: pass - -def exit_scope(symtab: SymbolTable | t.CPtr) -> t.CInt: pass - -def define_var(symtab: SymbolTable | t.CPtr, name: str, alloca: llvmlite.Value | t.CPtr) -> int: pass - -def define_module_var(symtab: SymbolTable | t.CPtr, name: str, alloca: llvmlite.Value | t.CPtr) -> int: pass - -def lookup_var(symtab: SymbolTable | t.CPtr, name: str) -> llvmlite.Value | t.CPtr: pass - -def lookup_current(symtab: SymbolTable | t.CPtr, name: str) -> llvmlite.Value | t.CPtr: pass - -def lookup_module_var(symtab: SymbolTable | t.CPtr, name: str) -> llvmlite.Value | t.CPtr: pass - -def get_or_create_sym(symtab: SymbolTable | t.CPtr, pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, name: str, ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/02d833b3cf571c5b.pyi b/.transpyc_cache/02d833b3cf571c5b.pyi deleted file mode 100644 index 33275d4..0000000 --- a/.transpyc_cache/02d833b3cf571c5b.pyi +++ /dev/null @@ -1,18 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import w32.win32console -import t, c -from t import CInt, CExport -import stdio -import stdlib -import string -import memhub -import hashtable -import testcheck - -def main() -> CInt | CExport: pass diff --git a/.transpyc_cache/03b24bc1d9327958.pyi b/.transpyc_cache/03b24bc1d9327958.pyi deleted file mode 100644 index 8757634..0000000 --- a/.transpyc_cache/03b24bc1d9327958.pyi +++ /dev/null @@ -1,21 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -import t -import stdio -import string -import __zlib.pyzlib as pyzlib -import __zlib.zdeflate as zdeflate -import __zlib.zinflate as zinflate -import __zlib.zchecksum as zchecksum -import __zlib.zdef as zdef -import __zlib.zhuff as zhuff -import __zlib.test_pyzlib as tpz -import w32.win32memory -import c -import testcheck - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/03eeb0bea44f6637.doc.json b/.transpyc_cache/03eeb0bea44f6637.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/03eeb0bea44f6637.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/03eeb0bea44f6637.pyi b/.transpyc_cache/03eeb0bea44f6637.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/03eeb0bea44f6637.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/04673ecc3aec489e.doc.json b/.transpyc_cache/04673ecc3aec489e.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/04673ecc3aec489e.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/04673ecc3aec489e.pyi b/.transpyc_cache/04673ecc3aec489e.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/04673ecc3aec489e.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/05c11f22675c60cb.pyi b/.transpyc_cache/05c11f22675c60cb.pyi deleted file mode 100644 index 3520489..0000000 --- a/.transpyc_cache/05c11f22675c60cb.pyi +++ /dev/null @@ -1,50 +0,0 @@ -""" -Auto-generated Python stub file from llvmlite.__values.py -Module: llvmlite.__values -""" - - -import t, c -from stdint import * -import string -import viperlib -import memhub -from linkedlist import GSListNode -from .__types import LLVMType, TypePrint - -class Value(GSListNode[Value]): - Ty: LLVMType | t.CPtr - Name: t.CChar | t.CPtr - IsConst: t.CInt - IntVal: t.CInt64T - FloatVal: t.CDouble - -VALUE_SIZE: t.CDefine = 48 - -def new_value(pool: memhub.MemBuddy | t.CPtr) -> Value | t.CPtr: pass - -def ConstInt(pool: memhub.MemBuddy | t.CPtr, ty: LLVMType | t.CPtr, val: t.CInt64T, name: t.CChar | t.CPtr) -> Value | t.CPtr: pass - -def ConstNull(pool: memhub.MemBuddy | t.CPtr, ty: LLVMType | t.CPtr, name: t.CChar | t.CPtr) -> Value | t.CPtr: pass - -def ConstZero(pool: memhub.MemBuddy | t.CPtr, ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def ConstFloat(pool: memhub.MemBuddy | t.CPtr, ty: LLVMType | t.CPtr, val: t.CDouble) -> Value | t.CPtr: pass - -def SSAValue(pool: memhub.MemBuddy | t.CPtr, ty: LLVMType | t.CPtr, name: t.CChar | t.CPtr) -> Value | t.CPtr: pass - -def ValuePrint(buf: t.CChar | t.CPtr, size: t.CSizeT, val: Value | t.CPtr, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - -def value_get_ty(val: Value | t.CPtr) -> LLVMType | t.CPtr: pass - -def value_get_next(val: Value | t.CPtr) -> Value | t.CPtr: pass - -def value_set_ty(val: Value | t.CPtr, ty: LLVMType | t.CPtr) -> t.CInt: pass - -def value_set_next(val: Value | t.CPtr, nxt: Value | t.CPtr) -> t.CInt: pass - -def value_set_name(val: Value | t.CPtr, name: t.CChar | t.CPtr) -> t.CInt: pass - -def value_set_isconst(val: Value | t.CPtr, is_const: t.CInt) -> t.CInt: pass - -def _append_str(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass diff --git a/.transpyc_cache/05db996fc87ebdaa.doc.json b/.transpyc_cache/05db996fc87ebdaa.doc.json deleted file mode 100644 index 67e7a8b..0000000 --- a/.transpyc_cache/05db996fc87ebdaa.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_DiagAppend": "追加诊断信息到 diag.txt(追加模式,不依赖 printf 缓冲)", "TranslateFileGetTrans": "翻译文件,返回 Translator 对象(调用者负责 dump_ir),None 失败", "ensure_dir": "递归创建目录(类似 mkdir -p),目录已存在视为成功\n\n Args:\n path: 目录路径(支持 / 或 \\ 分隔符)\n\n Returns:\n 0 成功(包括目录已存在),非 0 失败\n ", "write_ir_to_file": "将 IR 缓冲区写入 .ll 文件\n\n Args:\n ir_buf: IR 文本缓冲区\n ir_len: IR 文本长度\n output_dir: 输出目录(temp 或 output)\n module_name: 模块名(如 \"main\")\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_ll_to_obj": "调用 llc 将 .ll 编译为 .obj\n\n Args:\n ir_path: .ll 文件路径\n output_dir: 输出目录\n module_name: 模块名(用于生成 .obj 文件名)\n cc_cmd: 编译器命令(如 \"llc\")\n cc_flags: 编译器参数(如 \"-filetype=obj -relocation-model=pic\")\n\n Returns:\n 0 成功,非 0 失败\n ", "collect_obj_files": "扫描 includes_binary_dir 目录,收集所有 .obj 文件路径到 out_buf\n\n Args:\n includes_binary_dir: includes.binary 目录路径\n out_buf: 输出缓冲区(用于存放空格分隔的 .obj 文件路径)\n out_size: 输出缓冲区大小\n\n Returns:\n 写入的字节数(不含 null 终止符),0 表示无文件或错误\n ", "link_obj_to_exe": "调用 clang++ 链接 .obj 为 .exe\n\n Args:\n output_dir: 输出目录(包含 .obj 文件)\n module_name: 模块名\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件名(如 \"test.exe\")\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_module_to_obj": "编译 IR 到 .obj(不链接)\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名(SHA1)\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n\n Returns:\n 0 成功,非 0 失败\n ", "link_objs_to_exe": "链接多个 .obj 文件为 .exe\n\n Args:\n obj_paths: 空格分隔的 .obj 文件完整路径字符串\n obj_paths_len: obj_paths 长度\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件完整路径\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "run_pipeline": "执行完整编译管线\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n linker_cmd: 链接器命令\n linker_flags: 链接器参数\n linker_output: 输出文件名\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n BuildResult 对象\n "} \ No newline at end of file diff --git a/.transpyc_cache/05db996fc87ebdaa.pyi b/.transpyc_cache/05db996fc87ebdaa.pyi deleted file mode 100644 index 9d8b33e..0000000 --- a/.transpyc_cache/05db996fc87ebdaa.pyi +++ /dev/null @@ -1,52 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.BuildPipeline.py -Module: lib.core.BuildPipeline -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import subprocess -import viperlib -import ast -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesType as HandlesType - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 - -def _DiagAppend(msg: bytes) -> t.CInt: pass - -def TranslateFileGetTrans(mb: memhub.MemBuddy | t.CPtr, file_path: str, sha1_val: str) -> HandlesTranslator.Translator | t.CPtr: pass - - -class BuildResult: - Success: t.CInt - OutputPath: str - ErrorMsg: str - def __new__(self: BuildResult) -> t.CPtr: pass - def __init__(self: BuildResult) -> t.CInt: pass - -def ensure_dir(path: str) -> int: pass - -def write_ir_to_file(ir_buf: bytes, ir_len: t.CSizeT, output_dir: str, module_name: str) -> int: pass - -def compile_ll_to_obj(ir_path: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def collect_obj_files(includes_binary_dir: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass - -def link_obj_to_exe(output_dir: str, module_name: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def compile_module_to_obj(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def link_objs_to_exe(obj_paths: str, obj_paths_len: t.CSizeT, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def run_pipeline(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> BuildResult | t.CPtr: pass diff --git a/.transpyc_cache/067f811511854c88.pyi b/.transpyc_cache/067f811511854c88.pyi deleted file mode 100644 index cef2575..0000000 --- a/.transpyc_cache/067f811511854c88.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - -import c - - -import t -import stdio -import testcheck - -def add(a: t.CInt, b: t.CInt) -> t.CInt: pass - -def sub(a: t.CInt, b: t.CInt) -> t.CInt: pass - -def multi_args(a: t.CInt, b: t.CInt, c: t.CInt, d: t.CInt) -> t.CInt: pass - -def factorial(n: t.CInt) -> t.CInt: pass - -def fib(n: t.CInt) -> t.CInt: pass - -def add_via_ptr(p: t.CInt | t.CPtr, val: t.CInt) -> t.CInt: pass - -def make_u64() -> t.CUInt64T: pass - -def is_even(n: t.CInt) -> t.CBool: pass - -def test_basic_call() -> t.CInt: pass - -def test_multi_args() -> t.CInt: pass - -def test_recursion() -> t.CInt: pass - -def test_fibonacci() -> t.CInt: pass - -def test_ptr_param() -> t.CInt: pass - -def test_u64_return() -> t.CInt: pass - -def test_bool_return() -> t.CInt: pass - -def test_nested_call() -> t.CInt: pass - - -import w32.win32memory - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/07a8c82a8ca2be90.doc.json b/.transpyc_cache/07a8c82a8ca2be90.doc.json deleted file mode 100644 index 1f30b90..0000000 --- a/.transpyc_cache/07a8c82a8ca2be90.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_binop_to_dunder": "将 BinOp 运算符映射到 dunder 方法名,无映射时返回 None", "_cmpop_to_dunder": "将 Compare 运算符映射到 dunder 方法名,无映射时返回 None", "try_operator_overload": "尝试运算符重载:lhs 是结构体指针时调用 dunder 方法,否则返回 None", "translate_binop": "翻译二元运算(自动类型提升)"} \ No newline at end of file diff --git a/.transpyc_cache/07a8c82a8ca2be90.pyi b/.transpyc_cache/07a8c82a8ca2be90.pyi deleted file mode 100644 index 1481115..0000000 --- a/.transpyc_cache/07a8c82a8ca2be90.pyi +++ /dev/null @@ -1,24 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprOps.py -Module: lib.core.Handles.HandlesExprOps -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import viperlib -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesTranslator as HT - -def _binop_to_dunder(op: int) -> str: pass - -def _cmpop_to_dunder(op: int) -> str: pass - -def try_operator_overload(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, lhs: llvmlite.Value | t.CPtr, rhs: llvmlite.Value | t.CPtr, op: int, trans: HT.Translator | t.CPtr, is_compare: int) -> llvmlite.Value | t.CPtr: pass - -def translate_binop(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/07f7da85af876124.doc.json b/.transpyc_cache/07f7da85af876124.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/07f7da85af876124.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/07f7da85af876124.pyi b/.transpyc_cache/07f7da85af876124.pyi deleted file mode 100644 index 7abdba5..0000000 --- a/.transpyc_cache/07f7da85af876124.pyi +++ /dev/null @@ -1,10 +0,0 @@ -""" -Auto-generated Python stub file from ptr_test.py -Module: ptr_test -""" - - -import stdio -import t, c - -def ptr_test() -> int: pass diff --git a/.transpyc_cache/0853acdbdfc9b27c.doc.json b/.transpyc_cache/0853acdbdfc9b27c.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/0853acdbdfc9b27c.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/0853acdbdfc9b27c.pyi b/.transpyc_cache/0853acdbdfc9b27c.pyi deleted file mode 100644 index 821be2f..0000000 --- a/.transpyc_cache/0853acdbdfc9b27c.pyi +++ /dev/null @@ -1,22 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import t, c -from t import CInt, CExport -from stdio import printf -import memhub -import stdlib -import sys -import string -import ast -import w32.win32console - -ARENA_SIZE: t.CDefine = 1048576 -POOL_SIZE: t.CDefine = 524288 -DUMP_SIZE: t.CDefine = 262144 - -def main() -> CInt | CExport: pass diff --git a/.transpyc_cache/08ea5281873244fd.doc.json b/.transpyc_cache/08ea5281873244fd.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/08ea5281873244fd.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/08ea5281873244fd.pyi b/.transpyc_cache/08ea5281873244fd.pyi deleted file mode 100644 index 0c46010..0000000 --- a/.transpyc_cache/08ea5281873244fd.pyi +++ /dev/null @@ -1,19 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -import t, c -from stdint import * -import stdio -import stdlib -import string -import memhub -import argparse -import testcheck - -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr - -@t.CExport -def main() -> int: pass diff --git a/.transpyc_cache/08f96e9e0bc0501b.doc.json b/.transpyc_cache/08f96e9e0bc0501b.doc.json deleted file mode 100644 index 92253b4..0000000 --- a/.transpyc_cache/08f96e9e0bc0501b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"add_imported_module": "记录已导入的模块名,返回新的 imported_modules 字符串指针", "is_module_imported": "检查模块是否已导入(词边界精确匹配,避免子串误匹配)", "add_from_import": "添加 from-import 映射 \"name:module\",返回新的 from_imports 字符串", "lookup_from_import": "查找 from-import 名称,返回模块名或 None\n\n 支持 star import: 如果 from_imports 中有 \"*:module\" 条目,\n 且未找到精确名称匹配,且 allow_star_fallback != 0,则返回 star import 的模块名。\n ", "ImportsHandle": "导入语句处理器:继承 Mixin 获得 Trans 回指针", "ImportsHandle.HandleImport": "处理 import 语句,返回 0", "ImportsHandle.HandleImportFromModule": "处理 from X import Y 的模块部分,更新 trans._imported_modules", "ImportsHandle.HandleImportFromNames": "处理 from X import Y 的名称部分,更新 trans._from_imports"} \ No newline at end of file diff --git a/.transpyc_cache/08f96e9e0bc0501b.pyi b/.transpyc_cache/08f96e9e0bc0501b.pyi deleted file mode 100644 index 2bf7399..0000000 --- a/.transpyc_cache/08f96e9e0bc0501b.pyi +++ /dev/null @@ -1,34 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesImports.py -Module: lib.core.Handles.HandlesImports -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import viperlib -import stdio -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesStruct as HandlesStruct - -def add_imported_module(pool: memhub.MemBuddy | t.CPtr, imported_modules: str, name: str) -> str: pass - -def is_module_imported(imported_modules: str, name: str) -> int: pass - -def add_from_import(pool: memhub.MemBuddy | t.CPtr, from_imports: str, local_name: str, module_name: str) -> str: pass - -def lookup_from_import(from_imports: str, name: str, allow_star_fallback: int) -> str: pass - - -@t.NoVTable -class ImportsHandle(HandlesBase.Mixin): - def __init__(self: ImportsHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleImport(self: ImportsHandle, node: ast.AST | t.CPtr) -> int: pass - def HandleImportFromModule(self: ImportsHandle, node: ast.AST | t.CPtr) -> int: pass - def HandleImportFromNames(self: ImportsHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewImportsHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ImportsHandle | t.CPtr: pass diff --git a/.transpyc_cache/0900c165e9bcb8f1.doc.json b/.transpyc_cache/0900c165e9bcb8f1.doc.json deleted file mode 100644 index 215ef80..0000000 --- a/.transpyc_cache/0900c165e9bcb8f1.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_get_external_func_param_ty": "获取外部函数第 param_idx 个参数的期望类型,None 表示用字面量原类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/0900c165e9bcb8f1.pyi b/.transpyc_cache/0900c165e9bcb8f1.pyi deleted file mode 100644 index 5214419..0000000 --- a/.transpyc_cache/0900c165e9bcb8f1.pyi +++ /dev/null @@ -1,173 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _get_external_func_param_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str, param_idx: int) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/0b82fcb0aa3212c5.doc.json b/.transpyc_cache/0b82fcb0aa3212c5.doc.json deleted file mode 100644 index 56e8c7e..0000000 --- a/.transpyc_cache/0b82fcb0aa3212c5.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"RunPhase1": "Phase1: 扫描 includes 目录,按需翻译并生成 stub"} \ No newline at end of file diff --git a/.transpyc_cache/0b82fcb0aa3212c5.pyi b/.transpyc_cache/0b82fcb0aa3212c5.pyi deleted file mode 100644 index d866b3e..0000000 --- a/.transpyc_cache/0b82fcb0aa3212c5.pyi +++ /dev/null @@ -1,31 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Phase1.py -Module: lib.core.Phase1 -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import viperlib -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import ast -import llvmlite -import lib.core.VLogger as VLogger -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.IncludesScanner as IncludesScanner -import lib.core.StubMerger as StubMerger -import lib.Projectrans.Config as Config - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 - -def RunPhase1(mb: memhub.MemBuddy | t.CPtr, includes_dir: str, temp_dir: str, log: VLogger.Logger | t.CPtr) -> int: pass diff --git a/.transpyc_cache/0c212981c180e7fb.pyi b/.transpyc_cache/0c212981c180e7fb.pyi deleted file mode 100644 index f432b06..0000000 --- a/.transpyc_cache/0c212981c180e7fb.pyi +++ /dev/null @@ -1,67 +0,0 @@ -""" -Auto-generated Python stub file from ast.lexer.py -Module: ast.lexer -""" - - -import t, c -from stdint import * -import memhub -import string -from .tokens import Token, TokenType, TokOp, _init_tables, _kw_lookup, _op_head, OpEntry, new_token, token_set_str, token_set_str_literal - -LEXER_MAX_INDENT: t.CDefine = 256 - -class Lexer: - src: str - pos: t.CSizeT - len: t.CSizeT - lineno: t.CInt - col: t.CInt - pool: memhub.MemManager | t.CPtr - indent_stack: t.CInt | t.CPtr - indent_top: t.CInt - paren_depth: t.CInt - tokens_head: Token | t.CPtr - tokens_tail: Token | t.CPtr - at_line_start: t.CInt - error_count: t.CInt - def __new__(self: Lexer, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - -def new_lexer(pool: memhub.MemManager | t.CPtr) -> Lexer | t.CPtr: pass - -def _lexer_init(lx: Lexer | t.CPtr, src: str, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - -def _peek(lx: Lexer | t.CPtr, offset: t.CSizeT) -> t.CChar: pass - -def _peek_cur(lx: Lexer | t.CPtr) -> t.CChar: pass - -def _advance(lx: Lexer | t.CPtr) -> t.CChar: pass - -def _is_alpha(ch: t.CChar) -> t.CInt: pass - -def _is_digit(ch: t.CChar) -> t.CInt: pass - -def _is_alnum(ch: t.CChar) -> t.CInt: pass - -def _is_hex(ch: t.CChar) -> t.CInt: pass - -def _is_space(ch: t.CChar) -> t.CInt: pass - -def _emit(lx: Lexer | t.CPtr, tok: Token | t.CPtr) -> t.CInt: pass - -def _make_op_token(lx: Lexer | t.CPtr, op_id: t.CInt, length: t.CInt, lineno: t.CInt, col: t.CInt) -> Token | t.CPtr: pass - -def _handle_indent(lx: Lexer | t.CPtr) -> t.CInt: pass - -def _read_name(lx: Lexer | t.CPtr) -> t.CInt: pass - -def _read_number(lx: Lexer | t.CPtr) -> t.CInt: pass - -def _emit_number(lx: Lexer | t.CPtr, start: t.CSizeT, start_lineno: t.CInt, start_col: t.CInt, is_float: t.CInt, is_complex: t.CInt, is_hex: t.CInt) -> t.CInt: pass - -def _read_string(lx: Lexer | t.CPtr) -> t.CInt: pass - -def _read_operator(lx: Lexer | t.CPtr) -> t.CInt: pass - -def tokenize(lx: Lexer | t.CPtr) -> Token | t.CPtr: pass diff --git a/.transpyc_cache/0c56128647a0b845.doc.json b/.transpyc_cache/0c56128647a0b845.doc.json deleted file mode 100644 index 47b3516..0000000 --- a/.transpyc_cache/0c56128647a0b845.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"register_cdefine_constant": "注册 CDefine 编译期常量到全局表", "lookup_cdefine_constant": "查找 CDefine 编译期常量,返回值或 -1(未找到)", "clear_cdefine_constants": "清空 CDefine 常量表(模块切换时调用)", "set_generic_context": "设置泛型特化上下文(进入泛型类方法体翻译时调用)", "clear_generic_context": "清除泛型特化上下文(离开泛型类方法体翻译时调用)", "resolve_generic_type_name": "如果 name 是泛型类型参数,返回对应的具体类型名;否则返回 name 本身\n\n 用于表达式中的 T 替换(如 T.__sizeof__() → int.__sizeof__())\n ", "_get_type_name_from_annotation": "从类型注解节点提取类型名(支持 Name/Attribute/BinOp)", "_parse_type_string": "将类型名字符串解析为 AST 节点", "set_current_file": "设置当前编译的文件名(供报错使用)", "_read_source_line": "从源文件读取第 lineno 行内容", "fatal_error": "以 Python 风格报错并退出(带源代码行)", "fatal_type_error": "以 Python 风格报错并退出(fatal_error 的别名)", "map_t_type": "将 t.CXxx / c.CXxx 类型名映射到 LLVMType\n\n 注意: t.CChar | t.CPtr = i8* = str = bytes\n ", "_is_t_attr": "检测节点是否是 t.attr_name 形式", "extract_class_name_from_annotation": "从类型注解 AST 中提取类名,返回 None=无法提取", "resolve_annotation_type": "解析类型注解节点为 LLVMType\n\n Args:\n pool: 内存分配器\n node: 类型注解 AST 节点(Name 或 Attribute)\n imported_modules: 已导入模块名字符串(空格分隔)\n from_imports: from-import 映射字符串(\"name:module name:module\" 格式)\n ", "has_decorator_marker": "检测类型注解中是否包含指定的装饰器标记", "is_pass_body": "检测函数体是否为 pass(空体或仅含 pass 语句)", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "infer_expr_type": "推断表达式的 LLVM 类型\n\n param_types 格式: \"name:bits,name:bits,...\"\n ", "infer_return_type": "扫描函数体中的 return 语句,推断返回类型", "build_param_types_str": "构建参数类型编码字符串 \"name:bits,name:bits,...\" ", "_strappend": "将 src 追加到 dst 末尾"} \ No newline at end of file diff --git a/.transpyc_cache/0c56128647a0b845.pyi b/.transpyc_cache/0c56128647a0b845.pyi deleted file mode 100644 index b7e0303..0000000 --- a/.transpyc_cache/0c56128647a0b845.pyi +++ /dev/null @@ -1,74 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesType.py -Module: lib.core.Handles.HandlesType -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import sys -import stdlib -import viperlib -import w32.fileio as fileio -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesStruct as HandlesStruct - -_g_current_file: t.CExtern | str -_g_generic_tp_names: t.CExtern | list[str] | t.CPtr -_g_generic_type_args: t.CExtern | list[str] | t.CPtr -_g_cdefine_names: t.CExtern | list[str] | t.CPtr -_g_cdefine_values: t.CExtern | list[str] | t.CPtr - -def register_cdefine_constant(pool: memhub.MemBuddy | t.CPtr, name: str, value: int) -> None: pass - -def lookup_cdefine_constant(name: str) -> int: pass - -def clear_cdefine_constants() -> None: pass - -def set_generic_context(tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> t.CInt: pass - -def clear_generic_context() -> t.CInt: pass - -def resolve_generic_type_name(name: str) -> str: pass - -def _get_type_name_from_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _parse_type_string(pool: memhub.MemBuddy | t.CPtr, type_str: str, ctx: t.CInt) -> ast.AST | t.CPtr: pass - -def set_current_file(file_path: str) -> t.CInt: pass - - -_SRC_BUF_SIZE: t.CDefine = 262144 - -def _read_source_line(file_path: str, lineno: int) -> str: pass - -def fatal_error(node: ast.AST | t.CPtr, msg: str) -> t.CInt: pass - -def fatal_type_error(node: ast.AST | t.CPtr, msg: str) -> t.CInt: pass - -def map_t_type(pool: memhub.MemBuddy | t.CPtr, type_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_t_attr(node: ast.AST | t.CPtr, attr_name: str, imported_modules: str) -> int: pass - -def extract_class_name_from_annotation(node: ast.AST | t.CPtr, imported_modules: str) -> str: pass - -def resolve_annotation_type(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def has_decorator_marker(node: ast.AST | t.CPtr, marker_name: str) -> int: pass - -def is_pass_body(body: list[ast.AST | t.CPtr] | t.CPtr) -> int: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def infer_expr_type(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, param_types: str) -> llvmlite.LLVMType | t.CPtr: pass - -def infer_return_type(pool: memhub.MemBuddy | t.CPtr, body: list[ast.AST | t.CPtr] | t.CPtr, param_types: str) -> llvmlite.LLVMType | t.CPtr: pass - -def build_param_types_str(pool: memhub.MemBuddy | t.CPtr, args_node: ast.AST | t.CPtr) -> str: pass - -def _strappend(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass diff --git a/.transpyc_cache/0df65b8ed15664b0.pyi b/.transpyc_cache/0df65b8ed15664b0.pyi deleted file mode 100644 index e33dc69..0000000 --- a/.transpyc_cache/0df65b8ed15664b0.pyi +++ /dev/null @@ -1,30 +0,0 @@ -""" -Auto-generated Python stub file from hashlib.__sha1.py -Module: hashlib.__sha1 -""" - - -import string -import t, c - -SHA1_BLOCK_LEN: t.CDefine = 64 -SHA1_DIGEST_LEN: t.CDefine = 20 - -def sha1_rotl(x: t.CUInt32T, n: t.CInt) -> t.CUInt32T: pass - -def sha1_f1(b: t.CUInt32T, c: t.CUInt32T, d: t.CUInt32T) -> t.CUInt32T: pass - -def sha1_f2(b: t.CUInt32T, c: t.CUInt32T, d: t.CUInt32T) -> t.CUInt32T: pass - -def sha1_f3(b: t.CUInt32T, c: t.CUInt32T, d: t.CUInt32T) -> t.CUInt32T: pass - - -@t.Object -class sha1: - state: t.CArray[t.CUInt32T, 5] - count: t.CUInt64T - buf: t.CArray[t.CUInt8T, SHA1_BLOCK_LEN] - def __init__(self: sha1) -> t.CInt: pass - def transform(self: sha1, block: t.CUInt8T | t.CPtr) -> t.CInt: pass - def update(self: sha1, s: str) -> t.CInt: pass - def final(self: sha1, out: t.CArray[t.CUInt8T, SHA1_DIGEST_LEN]) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/0e1189314c937ef1.doc.json b/.transpyc_cache/0e1189314c937ef1.doc.json deleted file mode 100644 index 45712e2..0000000 --- a/.transpyc_cache/0e1189314c937ef1.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"AnnAssignHandle": "AnnAssign 语句处理器:继承 Mixin 获得 Trans 回指针", "AnnAssignHandle._is_cdefine_annotation": "检测注解是否为 t.CDefine,返回 1 表示是,0 表示否", "AnnAssignHandle._extract_cdefine_int_value": "从值节点提取整数常量(仅支持 Constant INT)", "AnnAssignHandle.PreScan": "预扫描 AnnAssign,提前创建 alloca 到 entry block 顶部", "AnnAssignHandle.Handle": "翻译 AnnAssign(target=Name, annotation=..., value=expr)"} \ No newline at end of file diff --git a/.transpyc_cache/0e1189314c937ef1.pyi b/.transpyc_cache/0e1189314c937ef1.pyi deleted file mode 100644 index 350baa1..0000000 --- a/.transpyc_cache/0e1189314c937ef1.pyi +++ /dev/null @@ -1,30 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesAnnAssign.py -Module: lib.core.Handles.HandlesAnnAssign -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesClassDef as HandlesClassDef -import lib.core.Handles.HandlesExprCall as HandlesExprCall - -@t.NoVTable -class AnnAssignHandle(HandlesBase.Mixin): - def __init__(self: AnnAssignHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def _is_cdefine_annotation(self: AnnAssignHandle, annot: ast.AST | t.CPtr) -> int: pass - def _extract_cdefine_int_value(self: AnnAssignHandle, val_node: ast.AST | t.CPtr) -> int: pass - def PreScan(self: AnnAssignHandle, node: ast.AST | t.CPtr) -> int: pass - def Handle(self: AnnAssignHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewAnnAssignHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> AnnAssignHandle | t.CPtr: pass diff --git a/.transpyc_cache/0eccc2393466d940.doc.json b/.transpyc_cache/0eccc2393466d940.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/0eccc2393466d940.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/0eccc2393466d940.pyi b/.transpyc_cache/0eccc2393466d940.pyi deleted file mode 100644 index b4f6066..0000000 --- a/.transpyc_cache/0eccc2393466d940.pyi +++ /dev/null @@ -1,18 +0,0 @@ -""" -Auto-generated Python stub file from augassign_test.py -Module: augassign_test -""" - - -import stdio -import t, c - -g_count: t.CExtern | int - -def test_local() -> int: pass - -def test_global_aug() -> int: pass - -def test_bitops() -> int: pass - -def augassign_test() -> int: pass diff --git a/.transpyc_cache/0f8134f67bdaba8f.doc.json b/.transpyc_cache/0f8134f67bdaba8f.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/0f8134f67bdaba8f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/0f8134f67bdaba8f.pyi b/.transpyc_cache/0f8134f67bdaba8f.pyi deleted file mode 100644 index 3f2901b..0000000 --- a/.transpyc_cache/0f8134f67bdaba8f.pyi +++ /dev/null @@ -1,122 +0,0 @@ -""" -Auto-generated Python stub file from __zlib.pyzlib.py -Module: __zlib.pyzlib -""" - - -from stdint import * -import zdeflate -import zinflate -import zchecksum -import zdef -import zhuff -import stdlib -import string -import t, c - -Z_NO_COMPRESSION: t.CDefine = 0 -Z_BEST_SPEED: t.CDefine = 1 -Z_BEST_COMPRESSION: t.CDefine = 9 -Z_DEFAULT_COMPRESSION: t.CDefine = (-1) -DEFLATED: t.CDefine = 8 -Z_NO_FLUSH: t.CDefine = 0 -Z_PARTIAL_FLUSH: t.CDefine = 1 -Z_SYNC_FLUSH: t.CDefine = 2 -Z_FULL_FLUSH: t.CDefine = 3 -Z_FINISH: t.CDefine = 4 -Z_BLOCK: t.CDefine = 5 -Z_TREES: t.CDefine = 6 -Z_DEFAULT_STRATEGY: t.CDefine = 0 -Z_FILTERED: t.CDefine = 1 -Z_HUFFMAN_ONLY: t.CDefine = 2 -Z_RLE: t.CDefine = 3 -Z_FIXED: t.CDefine = 4 -Z_OK: t.CDefine = 0 -Z_STREAM_END: t.CDefine = 1 -Z_NEED_DICT: t.CDefine = 2 -Z_ERRNO: t.CDefine = (-1) -Z_STREAM_ERROR: t.CDefine = (-2) -Z_DATA_ERROR: t.CDefine = (-3) -Z_MEM_ERROR: t.CDefine = (-4) -Z_BUF_ERROR: t.CDefine = (-5) -Z_VERSION_ERROR: t.CDefine = (-6) -MAX_WBITS: t.CDefine = 15 -DEF_BUF_SIZE: t.CDefine = 16384 -DEF_MEM_LEVEL: t.CDefine = 8 -ZLIB_VERSION: t.CDefine = "1.3.2" -pyzlib_error_msg: t.CExtern | t.CArray[t.CChar, 512] -pyzlib_error_code_val: t.CExtern | t.CInt - -@t.Object -class Compress: - stream: VOIDPTR - is_initialized: t.CInt - is_finished: t.CInt - level: t.CInt - method: t.CInt - wbits: t.CInt - memLevel: t.CInt - strategy: t.CInt - zdict: BYTEPTR - zdict_len: t.CSizeT - last_pos: t.CSizeT - input_buf: BYTEPTR - input_buf_len: t.CSizeT - input_buf_cap: t.CSizeT - header_written: t.CInt - def compress(self: Compress, data: BYTEPTR, data_len: t.CSizeT, out_len: t.CSizeT | t.CPtr) -> BYTEPTR: pass - def flush(self: Compress, mode: t.CInt, out_len: t.CSizeT | t.CPtr) -> BYTEPTR: pass - def copy(self: Compress) -> Compress | t.CPtr: pass - def delete(self: Compress) -> t.CInt: pass - def __del__(self: Compress) -> t.CInt: pass -@t.Object -class Decompress: - stream: VOIDPTR - is_initialized: t.CInt - eof: t.CInt - wbits: t.CInt - zdict: BYTEPTR - zdict_len: t.CSizeT - _unused_data: BYTEPTR - _unused_data_len: t.CSizeT - _unused_data_cap: t.CSizeT - _unconsumed_tail: BYTEPTR - _unconsumed_tail_len: t.CSizeT - _unconsumed_tail_cap: t.CSizeT - input_buf: BYTEPTR - input_buf_len: t.CSizeT - input_buf_cap: t.CSizeT - def decompress(self: Decompress, data: BYTEPTR, data_len: t.CSizeT, max_length: t.CSizeT, out_len: t.CSizeT | t.CPtr) -> BYTEPTR: pass - def flush(self: Decompress, length: t.CSizeT, out_len: t.CSizeT | t.CPtr) -> BYTEPTR: pass - def copy(self: Decompress) -> Decompress | t.CPtr: pass - def delete(self: Decompress) -> t.CInt: pass - def unused_data(self: Decompress, length: t.CSizeT | t.CPtr) -> BYTEPTR: pass - def unconsumed_tail(self: Decompress, length: t.CSizeT | t.CPtr) -> BYTEPTR: pass - -def set_error(code: int, msg: str) -> t.CInt: pass - -def clone_bytes(src: BYTEPTR, length: t.CSizeT) -> BYTEPTR: pass - -def append_bytes(buf: BYTE | t.CPtr[t.CPtr], length: t.CSizeT | t.CPtr, cap: t.CSizeT | t.CPtr, data: BYTEPTR, data_len: t.CSizeT) -> t.CInt: pass - -def shrink_to_fit(buf: BYTEPTR, length: t.CSizeT) -> BYTEPTR: pass - -def runtime_version() -> str: pass - -def get_error() -> str: pass - -def get_error_code() -> t.CInt: pass - -def clear_error() -> t.CInt: pass - -def compress(data: BYTEPTR, data_len: t.CSizeT, level: t.CInt, wbits: t.CInt, out_len: t.CSizeT | t.CPtr) -> BYTEPTR: pass - -def decompress(data: BYTEPTR, data_len: t.CSizeT, wbits: t.CInt, bufsize: t.CSizeT, out_len: t.CSizeT | t.CPtr) -> BYTEPTR: pass - -def compressobj(level: t.CInt, method: t.CInt, wbits: t.CInt, memLevel: t.CInt, strategy: t.CInt, zdict: BYTEPTR, zdict_len: t.CSizeT) -> Compress | t.CPtr: pass - -def decompressobj(wbits: t.CInt, zdict: BYTEPTR, zdict_len: t.CSizeT) -> Decompress | t.CPtr: pass - -def zlib_adler32(data: BYTEPTR, length: t.CSizeT, value: t.CUnsignedLong) -> t.CUnsignedLong: pass - -def zlib_crc32(data: BYTEPTR, length: t.CSizeT, value: t.CUnsignedLong) -> t.CUnsignedLong: pass diff --git a/.transpyc_cache/0fef3cb77da3dae3.doc.json b/.transpyc_cache/0fef3cb77da3dae3.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/0fef3cb77da3dae3.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/0fef3cb77da3dae3.pyi b/.transpyc_cache/0fef3cb77da3dae3.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/0fef3cb77da3dae3.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/10ac4af023af7962.doc.json b/.transpyc_cache/10ac4af023af7962.doc.json deleted file mode 100644 index 45fcbeb..0000000 --- a/.transpyc_cache/10ac4af023af7962.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_generic_context": "设置泛型特化上下文(进入泛型类方法体翻译时调用)", "clear_generic_context": "清除泛型特化上下文(离开泛型类方法体翻译时调用)", "resolve_generic_type_name": "如果 name 是泛型类型参数,返回对应的具体类型名;否则返回 name 本身\n\n 用于表达式中的 T 替换(如 T.__sizeof__() → int.__sizeof__())\n ", "_get_type_name_from_annotation": "从类型注解节点提取类型名(支持 Name/Attribute/BinOp)", "_parse_type_string": "将类型名字符串解析为 AST 节点", "set_current_file": "设置当前编译的文件名(供报错使用)", "_read_source_line": "从源文件读取第 lineno 行内容", "fatal_error": "以 Python 风格报错并退出(带源代码行)", "fatal_type_error": "以 Python 风格报错并退出(fatal_error 的别名)", "map_t_type": "将 t.CXxx / c.CXxx 类型名映射到 LLVMType\n\n 注意: t.CChar | t.CPtr = i8* = str = bytes\n ", "_is_t_attr": "检测节点是否是 t.attr_name 形式", "extract_class_name_from_annotation": "从类型注解 AST 中提取类名,返回 None=无法提取", "resolve_annotation_type": "解析类型注解节点为 LLVMType\n\n Args:\n pool: 内存分配器\n node: 类型注解 AST 节点(Name 或 Attribute)\n imported_modules: 已导入模块名字符串(空格分隔)\n from_imports: from-import 映射字符串(\"name:module name:module\" 格式)\n ", "has_decorator_marker": "检测类型注解中是否包含指定的装饰器标记", "is_pass_body": "检测函数体是否为 pass(空体或仅含 pass 语句)", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "infer_expr_type": "推断表达式的 LLVM 类型\n\n param_types 格式: \"name:bits,name:bits,...\"\n ", "infer_return_type": "扫描函数体中的 return 语句,推断返回类型", "build_param_types_str": "构建参数类型编码字符串 \"name:bits,name:bits,...\" ", "_strappend": "将 src 追加到 dst 末尾"} \ No newline at end of file diff --git a/.transpyc_cache/10ac4af023af7962.pyi b/.transpyc_cache/10ac4af023af7962.pyi deleted file mode 100644 index d6de8a3..0000000 --- a/.transpyc_cache/10ac4af023af7962.pyi +++ /dev/null @@ -1,66 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesType.py -Module: lib.core.Handles.HandlesType -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import sys -import stdlib -import viperlib -import w32.fileio as fileio -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesStruct as HandlesStruct - -_g_current_file: t.CExtern | str -_g_generic_tp_names: t.CExtern | list[str] | t.CPtr -_g_generic_type_args: t.CExtern | list[str] | t.CPtr - -def set_generic_context(tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> t.CInt: pass - -def clear_generic_context() -> t.CInt: pass - -def resolve_generic_type_name(name: str) -> str: pass - -def _get_type_name_from_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _parse_type_string(pool: memhub.MemBuddy | t.CPtr, type_str: str, ctx: t.CInt) -> ast.AST | t.CPtr: pass - -def set_current_file(file_path: str) -> t.CInt: pass - - -_SRC_BUF_SIZE: t.CDefine = 262144 - -def _read_source_line(file_path: str, lineno: int) -> str: pass - -def fatal_error(node: ast.AST | t.CPtr, msg: str) -> t.CInt: pass - -def fatal_type_error(node: ast.AST | t.CPtr, msg: str) -> t.CInt: pass - -def map_t_type(pool: memhub.MemBuddy | t.CPtr, type_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_t_attr(node: ast.AST | t.CPtr, attr_name: str, imported_modules: str) -> int: pass - -def extract_class_name_from_annotation(node: ast.AST | t.CPtr, imported_modules: str) -> str: pass - -def resolve_annotation_type(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def has_decorator_marker(node: ast.AST | t.CPtr, marker_name: str) -> int: pass - -def is_pass_body(body: list[ast.AST | t.CPtr] | t.CPtr) -> int: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def infer_expr_type(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, param_types: str) -> llvmlite.LLVMType | t.CPtr: pass - -def infer_return_type(pool: memhub.MemBuddy | t.CPtr, body: list[ast.AST | t.CPtr] | t.CPtr, param_types: str) -> llvmlite.LLVMType | t.CPtr: pass - -def build_param_types_str(pool: memhub.MemBuddy | t.CPtr, args_node: ast.AST | t.CPtr) -> str: pass - -def _strappend(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass diff --git a/.transpyc_cache/117b4962d332b4c5.doc.json b/.transpyc_cache/117b4962d332b4c5.doc.json deleted file mode 100644 index 95e17f3..0000000 --- a/.transpyc_cache/117b4962d332b4c5.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/117b4962d332b4c5.pyi b/.transpyc_cache/117b4962d332b4c5.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/117b4962d332b4c5.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/1193c9cd16698da8.doc.json b/.transpyc_cache/1193c9cd16698da8.doc.json deleted file mode 100644 index c3a1e25..0000000 --- a/.transpyc_cache/1193c9cd16698da8.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"SrcFileEntry": "源文件条目", "RunMultiFileProject": "多文件项目编译\n\n Returns: 0 成功,非 0 失败\n "} \ No newline at end of file diff --git a/.transpyc_cache/1193c9cd16698da8.pyi b/.transpyc_cache/1193c9cd16698da8.pyi deleted file mode 100644 index ad12e1f..0000000 --- a/.transpyc_cache/1193c9cd16698da8.pyi +++ /dev/null @@ -1,39 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Phase2.py -Module: lib.core.Phase2 -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import viperlib -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import sys -import ast -import llvmlite -import subprocess -import argparse -import lib.core.VLogger as VLogger -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.BuildPipeline as BuildPipeline -import lib.core.StubMerger as StubMerger -import lib.Projectrans.Utils as Utils -import lib.Projectrans.Config as Config - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 -MAX_SRC_FILES: t.CDefine = 32 - -@t.NoVTable -class SrcFileEntry: - Path: str - Sha1: str - -def RunMultiFileProject(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, output_dir: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str, includes_dir: str, do_phase1: int, do_phase2: int, log: VLogger.Logger | t.CPtr, args: argparse.ParsedArgs | t.CPtr) -> int: pass diff --git a/.transpyc_cache/13110effbb0bb06c.pyi b/.transpyc_cache/13110effbb0bb06c.pyi deleted file mode 100644 index 3584bd2..0000000 --- a/.transpyc_cache/13110effbb0bb06c.pyi +++ /dev/null @@ -1,35 +0,0 @@ -""" -Auto-generated Python stub file from os.path.py -Module: os.path -""" - - -import t, c -from stdint import * -import string -import memhub -import platmacro - -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr - -def sep() -> t.CChar: pass - -def _is_sep(ch: t.CChar) -> bool: pass - -def _dup_str(s: str) -> str: pass - -def _substr(s: str, start: t.CSizeT, end: t.CSizeT) -> str: pass - -def isabs(path: str) -> bool: pass - -def join(path1: str, path2: str) -> str: pass - -def basename(path: str) -> str: pass - -def dirname(path: str) -> str: pass - -def splitext_name(path: str) -> str: pass - -def splitext_ext(path: str) -> str: pass - -def normpath(path: str) -> str: pass diff --git a/.transpyc_cache/13d9449413372bde.pyi b/.transpyc_cache/13d9449413372bde.pyi deleted file mode 100644 index c10ea89..0000000 --- a/.transpyc_cache/13d9449413372bde.pyi +++ /dev/null @@ -1,93 +0,0 @@ -""" -Auto-generated Python stub file from llvmlite.__function.py -Module: llvmlite.__function -""" - - -import t, c -from stdint import * -import string -import viperlib -import memhub -import stdio -from linkedlist import GSListNode, GSList -from .__types import LLVMType, ParamNode, TypePrint - -class Line(GSListNode[Line]): - Buf: t.CChar | t.CPtr - Len: t.CSizeT -class BasicBlock(GSListNode[BasicBlock]): - Name: t.CChar | t.CPtr - Lines: GSList[Line] | t.CPtr - IsTerminated: t.CInt -class Param(GSListNode[Param]): - Ty: LLVMType | t.CPtr - Name: t.CChar | t.CPtr - Attrs: t.CChar | t.CPtr -class Function(GSListNode[Function]): - Name: t.CChar | t.CPtr - RetTy: LLVMType | t.CPtr - Params: GSList[Param] | t.CPtr - Blocks: GSList[BasicBlock] | t.CPtr - IsDeclared: t.CInt - IsVarArg: t.CInt - Attrs: t.CChar | t.CPtr - -LINE_SIZE: t.CDefine = 24 - -def new_line(pool: memhub.MemBuddy | t.CPtr, text: t.CChar | t.CPtr) -> Line | t.CPtr: pass - -def _new_gslist(pool: memhub.MemBuddy | t.CPtr, list_size: t.CSizeT) -> t.CPtr: pass - - -BLOCK_SIZE: t.CDefine = 32 - -def new_basic_block(pool: memhub.MemBuddy | t.CPtr, name: t.CChar | t.CPtr) -> BasicBlock | t.CPtr: pass - - -PARAM_SIZE: t.CDefine = 32 - -def new_param(pool: memhub.MemBuddy | t.CPtr, ty: LLVMType | t.CPtr, name: t.CChar | t.CPtr) -> Param | t.CPtr: pass - - -FUNC_SIZE: t.CDefine = 56 - -def new_function(pool: memhub.MemBuddy | t.CPtr, name: t.CChar | t.CPtr, ret_ty: LLVMType | t.CPtr) -> Function | t.CPtr: pass - -def function_add_param(func: Function | t.CPtr, param: Param | t.CPtr) -> t.CInt: pass - -def function_add_block(func: Function | t.CPtr, block: BasicBlock | t.CPtr) -> t.CInt: pass - -def function_move_block_to_end(func: Function | t.CPtr, block: BasicBlock | t.CPtr) -> t.CInt: pass - -def block_append_line(block: BasicBlock | t.CPtr, line: Line | t.CPtr) -> t.CInt: pass - -def block_append_text(pool: memhub.MemBuddy | t.CPtr, block: BasicBlock | t.CPtr, text: t.CChar | t.CPtr) -> t.CInt: pass - -def function_set_attrs(func: Function | t.CPtr, attrs: t.CChar | t.CPtr) -> t.CInt: pass - -def param_set_attrs(param: Param | t.CPtr, attrs: t.CChar | t.CPtr) -> t.CInt: pass - -def _ll_name_needs_quote(name: str) -> t.CInt: pass - -def FunctionPrint(buf: t.CChar | t.CPtr, size: t.CSizeT, func: Function | t.CPtr, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - -def _append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def function_get_name(func: Function | t.CPtr) -> t.CChar | t.CPtr: pass - -def function_get_ret_ty(func: Function | t.CPtr) -> LLVMType | t.CPtr: pass - -def function_get_params(func: Function | t.CPtr) -> GSList[Param] | t.CPtr: pass - -def function_get_param_head(func: Function | t.CPtr) -> Param | t.CPtr: pass - -def function_get_next(func: Function | t.CPtr) -> Function | t.CPtr: pass - -def function_is_declared(func: Function | t.CPtr) -> t.CInt: pass - -def param_get_name(param: Param | t.CPtr) -> t.CChar | t.CPtr: pass - -def param_get_ty(param: Param | t.CPtr) -> LLVMType | t.CPtr: pass - -def param_get_next(param: Param | t.CPtr) -> Param | t.CPtr: pass diff --git a/.transpyc_cache/1446e90e8296beae.doc.json b/.transpyc_cache/1446e90e8296beae.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/1446e90e8296beae.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/1446e90e8296beae.pyi b/.transpyc_cache/1446e90e8296beae.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/1446e90e8296beae.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/146a976893eef52b.doc.json b/.transpyc_cache/146a976893eef52b.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/146a976893eef52b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/146a976893eef52b.pyi b/.transpyc_cache/146a976893eef52b.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/146a976893eef52b.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/14a9b576ab5d21c9.doc.json b/.transpyc_cache/14a9b576ab5d21c9.doc.json deleted file mode 100644 index 97ecb08..0000000 --- a/.transpyc_cache/14a9b576ab5d21c9.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"local_func": "Local function docstring.", "LocalClass": "Local class docstring.", "LocalClass.local_method": "Local method docstring.", "_check_doc_adaptive": "自适应检查 docstring:非空时验证匹配,空时视为优化剥离", "_check_doc_null": "检查 docstring 为 null(无 docstring 的符号)"} \ No newline at end of file diff --git a/.transpyc_cache/14a9b576ab5d21c9.pyi b/.transpyc_cache/14a9b576ab5d21c9.pyi deleted file mode 100644 index c16365f..0000000 --- a/.transpyc_cache/14a9b576ab5d21c9.pyi +++ /dev/null @@ -1,32 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -import t -import stdio -import string -import c -import testcheck -import remote - -def local_func() -> t.CInt: pass - -def no_doc_func() -> t.CInt: pass - - -@t.Object -class LocalClass: - value: t.CInt - def local_method(self: LocalClass) -> t.CInt: pass - -def _check_doc_adaptive(name: str, doc: str, expected: str) -> t.CInt: pass - -def _check_doc_null(name: str, doc: str) -> t.CInt: pass - -def test_local_doc() -> t.CInt: pass - -def test_cross_module_doc() -> t.CInt: pass - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/dd3002730623424b.pyi b/.transpyc_cache/14d33679f7fadf1f.pyi similarity index 100% rename from .transpyc_cache/dd3002730623424b.pyi rename to .transpyc_cache/14d33679f7fadf1f.pyi diff --git a/.transpyc_cache/16e1f65b154831e8.doc.json b/.transpyc_cache/16e1f65b154831e8.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/16e1f65b154831e8.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/16e1f65b154831e8.pyi b/.transpyc_cache/16e1f65b154831e8.pyi deleted file mode 100644 index 3167de1..0000000 --- a/.transpyc_cache/16e1f65b154831e8.pyi +++ /dev/null @@ -1,64 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - -import c - - -import t -import stdio -import testcheck - -def add[T](a: T, b: T) -> T: pass - -def test_generic_add() -> t.CInt: pass - -def combine[T1, T2](a: T1, b: T2) -> T1: pass - -def test_generic_combine() -> t.CInt: pass - -def max_val[T](a: T, b: T) -> T: pass - -def test_generic_max() -> t.CInt: pass - - -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_generic_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_generic_pair() -> t.CInt: pass - -def test_fixed_array() -> t.CInt: pass - -def test_char_array() -> t.CInt: pass - -def identity[T](x: T) -> T: pass - -def test_generic_identity() -> t.CInt: pass - -def double_val[T](x: T) -> T: pass - -def test_generic_nested() -> 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_generic_counter() -> t.CInt: pass - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/17c0dfbcebfa3a0e.doc.json b/.transpyc_cache/17c0dfbcebfa3a0e.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/17c0dfbcebfa3a0e.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/17c0dfbcebfa3a0e.pyi b/.transpyc_cache/17c0dfbcebfa3a0e.pyi deleted file mode 100644 index fd38559..0000000 --- a/.transpyc_cache/17c0dfbcebfa3a0e.pyi +++ /dev/null @@ -1,71 +0,0 @@ -""" -Auto-generated Python stub file from attr_test.py -Module: attr_test -""" - - -import t, c -from stdint import * -import stdio -import string - -@c.Attribute(t.attr.always_inline()) -def AlwaysInlineFunc(x: t.CInt) -> t.CInt: pass - -@c.Attribute(t.attr.noinline()) -def NoInlineFunc(x: t.CInt) -> t.CInt: pass - -@c.Attribute(t.attr.noreturn()) -def NoReturnFunc() -> t.CInt: pass - -def NormalFunc(x: t.CInt) -> t.CInt: pass - -@c.Attribute(t.attr.always_inline(), t.attr.pure()) -def MultiAttrFunc(x: t.CInt) -> t.CInt: pass - -@c.Attribute(t.attr.packed) -def PackedAttrFunc(x: t.CInt) -> t.CInt: pass - -def test_always_inline() -> t.CInt: pass - -def test_noinline() -> t.CInt: pass - -def test_noreturn() -> t.CInt: pass - -def test_normal() -> t.CInt: pass - -def test_multi_attr() -> t.CInt: pass - -def test_packed_attr() -> t.CInt: pass - -@c.Attribute(t.attr.llvm.nounwind) -def NoUnwindFunc(x: t.CInt) -> t.CInt: pass - -@c.Attribute(t.attr.llvm.noredzone) -def NoRedZoneFunc(x: t.CInt) -> t.CInt: pass - -@c.Attribute(t.attr.llvm.willreturn) -def WillReturnFunc(x: t.CInt) -> t.CInt: pass - -@c.Attribute(t.attr.llvm.mustprogress) -def MustProgressFunc(x: t.CInt) -> t.CInt: pass - -@c.Attribute(t.attr.const()) -def ConstFunc(x: t.CInt) -> t.CInt: pass - -@c.Attribute(t.attr.always_inline(), t.attr.llvm.nounwind, t.attr.llvm.noredzone) -def TripleAttrFunc(x: t.CInt) -> t.CInt: pass - -def test_nounwind() -> t.CInt: pass - -def test_noredzone() -> t.CInt: pass - -def test_willreturn() -> t.CInt: pass - -def test_mustprogress() -> t.CInt: pass - -def test_const_attr() -> t.CInt: pass - -def test_triple_attr() -> t.CInt: pass - -def attr_test() -> t.CInt: pass diff --git a/.transpyc_cache/19b6605d568c8584.doc.json b/.transpyc_cache/19b6605d568c8584.doc.json deleted file mode 100644 index 95e17f3..0000000 --- a/.transpyc_cache/19b6605d568c8584.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/19b6605d568c8584.pyi b/.transpyc_cache/19b6605d568c8584.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/19b6605d568c8584.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/19f8024d10c828e8.pyi b/.transpyc_cache/19f8024d10c828e8.pyi deleted file mode 100644 index a25a2e4..0000000 --- a/.transpyc_cache/19f8024d10c828e8.pyi +++ /dev/null @@ -1,35 +0,0 @@ -""" -Auto-generated Python stub file from hashlib.__md5.py -Module: hashlib.__md5 -""" - - -import string -import t, c - -MD5_BLOCK_LEN: t.CDefine = 64 # 分组块大小 -MD5_DIGEST_LEN: t.CDefine = 16 # 摘要输出长度 - -def md5_F(x: t.CUInt32T, y: t.CUInt32T, z: t.CUInt32T) -> t.CUInt32T: pass - -def md5_G(x: t.CUInt32T, y: t.CUInt32T, z: t.CUInt32T) -> t.CUInt32T: pass - -def md5_H(x: t.CUInt32T, y: t.CUInt32T, z: t.CUInt32T) -> t.CUInt32T: pass - -def md5_I(x: t.CUInt32T, y: t.CUInt32T, z: t.CUInt32T) -> t.CUInt32T: pass - -def md5_rotl(x: t.CUInt32T, n: t.CInt) -> t.CUInt32T: pass - - -md5_T: t.CExtern | t.CArray[t.CUInt32T, 64] -md5_S: t.CExtern | t.CArray[t.CInt, 64] - -@t.Object -class md5: - state: t.CArray[t.CUInt32T, 4] - count: t.CUInt64T - buf: t.CArray[t.CUInt8T, MD5_BLOCK_LEN] - def __init__(self: md5) -> t.CInt: pass - def transform(self: md5, block: t.CUInt8T | t.CPtr) -> t.CInt: pass - def update(self: md5, s: str) -> t.CInt: pass - def final(self: md5, out: t.CArray[t.CUInt8T, MD5_DIGEST_LEN]) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/1a3af346a22d2cb6.doc.json b/.transpyc_cache/1a3af346a22d2cb6.doc.json deleted file mode 100644 index f6225ef..0000000 --- a/.transpyc_cache/1a3af346a22d2cb6.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"translate_stmt": "翻译单条语句,返回新增的变量数", "translate_global": "翻译 global 语句:记录 global 变量名", "translate_nonlocal": "翻译 nonlocal 语句:记录 nonlocal 变量名", "translate_expr_stmt": "翻译表达式语句(printf 调用等)", "pre_scan_allocas": "预扫描语句中的 AnnAssign,提前创建 alloca\n\n 返回新增的变量数\n ", "translate_break": "翻译 break 语句:跳转到循环 end 块", "translate_continue": "翻译 continue 语句:跳转到循环 cond/incr 块", "get_stmt_kind_name": "获取语句类型名"} \ No newline at end of file diff --git a/.transpyc_cache/1a3af346a22d2cb6.pyi b/.transpyc_cache/1a3af346a22d2cb6.pyi deleted file mode 100644 index 1eacb6d..0000000 --- a/.transpyc_cache/1a3af346a22d2cb6.pyi +++ /dev/null @@ -1,34 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesBody.py -Module: lib.core.Handles.HandlesBody -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesFunctions as HandlesFunctions -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -def translate_stmt(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_global(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_nonlocal(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_expr_stmt(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def pre_scan_allocas(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_break(trans: HT.Translator | t.CPtr) -> int: pass - -def translate_continue(trans: HT.Translator | t.CPtr) -> int: pass - -def get_stmt_kind_name(node: ast.AST | t.CPtr) -> str: pass diff --git a/.transpyc_cache/1b58766d38d05de3.doc.json b/.transpyc_cache/1b58766d38d05de3.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/1b58766d38d05de3.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/1b58766d38d05de3.pyi b/.transpyc_cache/1b58766d38d05de3.pyi deleted file mode 100644 index 11fb572..0000000 --- a/.transpyc_cache/1b58766d38d05de3.pyi +++ /dev/null @@ -1,35 +0,0 @@ -""" -Auto-generated Python stub file from enumtest.py -Module: enumtest -""" - - -import t, c -from t import CInt, CPtr, CChar, CInt32T, CExport -import viperlib -import stdlib - -class Color(t.CEnum): - Red = 0 - Green = 1 - Blue = 2 -class Option(t.REnum): - class Some: - value: CInt - Empty = 1 -class Result(t.REnum): - class Ok: - value: CInt - class Err: - msg: t.CChar | CPtr -class GeoShape(t.REnum): - class GCircle: - radius: CInt - class GRect: - w: CInt - h: CInt - class GPoint: - x: CInt - y: CInt - -def enum_main() -> CInt: pass diff --git a/.transpyc_cache/1b9ab264a942c56b.doc.json b/.transpyc_cache/1b9ab264a942c56b.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/1b9ab264a942c56b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/1b9ab264a942c56b.pyi b/.transpyc_cache/1b9ab264a942c56b.pyi deleted file mode 100644 index e5dacdd..0000000 --- a/.transpyc_cache/1b9ab264a942c56b.pyi +++ /dev/null @@ -1,27 +0,0 @@ -""" -Auto-generated Python stub file from oop_test.py -Module: oop_test -""" - - -import stdio -import t, c - -class Point: - x: t.CInt - y: t.CInt - def MoveTo(self: Point, nx: t.CInt, ny: t.CInt) -> t.CInt: pass - def GetX(self: Point) -> t.CInt: pass - def GetY(self: Point) -> t.CInt: pass -class Counter: - count: t.CInt = 0 - step: t.CInt = 1 - def Increment(self: Counter) -> t.CInt: pass - def Reset(self: Counter) -> t.CInt: pass -class Rect: - width: t.CInt - height: t.CInt - def __init__(self: Rect, w: t.CInt, h: t.CInt) -> t.CInt: pass - def Area(self: Rect) -> t.CInt: pass - -def oop_test() -> int: pass diff --git a/.transpyc_cache/1c46d554b3a3f9f3.pyi b/.transpyc_cache/1c46d554b3a3f9f3.pyi deleted file mode 100644 index 46fe651..0000000 --- a/.transpyc_cache/1c46d554b3a3f9f3.pyi +++ /dev/null @@ -1,125 +0,0 @@ -""" -Auto-generated Python stub file from zlib.pyzlib.py -Module: zlib.pyzlib -""" - - -from stdint import * -import zlib.zdeflate as zdeflate -import zlib.zinflate as zinflate -import zlib.zchecksum as zchecksum -import zlib.zdef as zdef -import zlib.zhuff as zhuff -import stdlib -import string -import memhub -import t, c - -Z_NO_COMPRESSION: t.CDefine = 0 -Z_BEST_SPEED: t.CDefine = 1 -Z_BEST_COMPRESSION: t.CDefine = 9 -Z_DEFAULT_COMPRESSION: t.CDefine = (-1) -DEFLATED: t.CDefine = 8 -Z_NO_FLUSH: t.CDefine = 0 -Z_PARTIAL_FLUSH: t.CDefine = 1 -Z_SYNC_FLUSH: t.CDefine = 2 -Z_FULL_FLUSH: t.CDefine = 3 -Z_FINISH: t.CDefine = 4 -Z_BLOCK: t.CDefine = 5 -Z_TREES: t.CDefine = 6 -Z_DEFAULT_STRATEGY: t.CDefine = 0 -Z_FILTERED: t.CDefine = 1 -Z_HUFFMAN_ONLY: t.CDefine = 2 -Z_RLE: t.CDefine = 3 -Z_FIXED: t.CDefine = 4 -Z_OK: t.CDefine = 0 -Z_STREAM_END: t.CDefine = 1 -Z_NEED_DICT: t.CDefine = 2 -Z_ERRNO: t.CDefine = (-1) -Z_STREAM_ERROR: t.CDefine = (-2) -Z_DATA_ERROR: t.CDefine = (-3) -Z_MEM_ERROR: t.CDefine = (-4) -Z_BUF_ERROR: t.CDefine = (-5) -Z_VERSION_ERROR: t.CDefine = (-6) -MAX_WBITS: t.CDefine = 15 -DEF_BUF_SIZE: t.CDefine = 16384 -DEF_MEM_LEVEL: t.CDefine = 8 -ZLIB_VERSION: t.CDefine = "1.3.2" -pyzlib_error_msg: t.CExtern | t.CArray[t.CChar, 512] -pyzlib_error_code_val: t.CExtern | t.CInt - -@t.Object -class Compress: - pool: memhub.MemManager | t.CPtr - stream: VOIDPTR - is_initialized: t.CInt - is_finished: t.CInt - level: t.CInt - method: t.CInt - wbits: t.CInt - memLevel: t.CInt - strategy: t.CInt - zdict: BYTEPTR - zdict_len: t.CSizeT - last_pos: t.CSizeT - input_buf: BYTEPTR - input_buf_len: t.CSizeT - input_buf_cap: t.CSizeT - header_written: t.CInt - def compress(self: Compress, data: BYTEPTR, data_len: t.CSizeT, out_len: t.CSizeT | t.CPtr) -> BYTEPTR: pass - def flush(self: Compress, mode: t.CInt, out_len: t.CSizeT | t.CPtr) -> BYTEPTR: pass - def copy(self: Compress) -> Compress | t.CPtr: pass - def delete(self: Compress) -> t.CInt: pass - def __del__(self: Compress) -> t.CInt: pass -@t.Object -class Decompress: - pool: memhub.MemManager | t.CPtr - stream: VOIDPTR - is_initialized: t.CInt - eof: t.CInt - wbits: t.CInt - zdict: BYTEPTR - zdict_len: t.CSizeT - _unused_data: BYTEPTR - _unused_data_len: t.CSizeT - _unused_data_cap: t.CSizeT - _unconsumed_tail: BYTEPTR - _unconsumed_tail_len: t.CSizeT - _unconsumed_tail_cap: t.CSizeT - input_buf: BYTEPTR - input_buf_len: t.CSizeT - input_buf_cap: t.CSizeT - def decompress(self: Decompress, data: BYTEPTR, data_len: t.CSizeT, max_length: t.CSizeT, out_len: t.CSizeT | t.CPtr) -> BYTEPTR: pass - def flush(self: Decompress, length: t.CSizeT, out_len: t.CSizeT | t.CPtr) -> BYTEPTR: pass - def copy(self: Decompress) -> Decompress | t.CPtr: pass - def delete(self: Decompress) -> t.CInt: pass - def unused_data(self: Decompress, length: t.CSizeT | t.CPtr) -> BYTEPTR: pass - def unconsumed_tail(self: Decompress, length: t.CSizeT | t.CPtr) -> BYTEPTR: pass - -def set_error(code: int, msg: str) -> t.CInt: pass - -def clone_bytes(pool: memhub.MemManager | t.CPtr, src: BYTEPTR, length: t.CSizeT) -> BYTEPTR: pass - -def append_bytes(pool: memhub.MemManager | t.CPtr, buf: BYTE | t.CPtr[t.CPtr], length: t.CSizeT | t.CPtr, cap: t.CSizeT | t.CPtr, data: BYTEPTR, data_len: t.CSizeT) -> t.CInt: pass - -def shrink_to_fit(pool: memhub.MemManager | t.CPtr, buf: BYTEPTR, length: t.CSizeT) -> BYTEPTR: pass - -def runtime_version() -> str: pass - -def get_error() -> str: pass - -def get_error_code() -> t.CInt: pass - -def clear_error() -> t.CInt: pass - -def compress(pool: memhub.MemManager | t.CPtr, data: BYTEPTR, data_len: t.CSizeT, level: t.CInt, wbits: t.CInt, out_len: t.CSizeT | t.CPtr) -> BYTEPTR: pass - -def decompress(pool: memhub.MemManager | t.CPtr, data: BYTEPTR, data_len: t.CSizeT, wbits: t.CInt, bufsize: t.CSizeT, out_len: t.CSizeT | t.CPtr) -> BYTEPTR: pass - -def compressobj(pool: memhub.MemManager | t.CPtr, level: t.CInt, method: t.CInt, wbits: t.CInt, memLevel: t.CInt, strategy: t.CInt, zdict: BYTEPTR, zdict_len: t.CSizeT) -> Compress | t.CPtr: pass - -def decompressobj(pool: memhub.MemManager | t.CPtr, wbits: t.CInt, zdict: BYTEPTR, zdict_len: t.CSizeT) -> Decompress | t.CPtr: pass - -def zlib_adler32(data: BYTEPTR, length: t.CSizeT, value: t.CUnsignedLong) -> t.CUnsignedLong: pass - -def zlib_crc32(data: BYTEPTR, length: t.CSizeT, value: t.CUnsignedLong) -> t.CUnsignedLong: pass diff --git a/.transpyc_cache/1c8a1eceb26a43f4.doc.json b/.transpyc_cache/1c8a1eceb26a43f4.doc.json deleted file mode 100644 index 9c0ba29..0000000 --- a/.transpyc_cache/1c8a1eceb26a43f4.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"AnnAssignHandle": "AnnAssign 语句处理器:继承 Mixin 获得 Trans 回指针", "AnnAssignHandle.PreScan": "预扫描 AnnAssign,提前创建 alloca 到 entry block 顶部", "AnnAssignHandle.Handle": "翻译 AnnAssign(target=Name, annotation=..., value=expr)"} \ No newline at end of file diff --git a/.transpyc_cache/1c8a1eceb26a43f4.pyi b/.transpyc_cache/1c8a1eceb26a43f4.pyi deleted file mode 100644 index beb4d8d..0000000 --- a/.transpyc_cache/1c8a1eceb26a43f4.pyi +++ /dev/null @@ -1,26 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesAnnAssign.py -Module: lib.core.Handles.HandlesAnnAssign -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal - -@t.NoVTable -class AnnAssignHandle(HandlesBase.Mixin): - def __init__(self: AnnAssignHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def PreScan(self: AnnAssignHandle, node: ast.AST | t.CPtr) -> int: pass - def Handle(self: AnnAssignHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewAnnAssignHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> AnnAssignHandle | t.CPtr: pass diff --git a/.transpyc_cache/1df40188ee73ee05.doc.json b/.transpyc_cache/1df40188ee73ee05.doc.json deleted file mode 100644 index 4dba15e..0000000 --- a/.transpyc_cache/1df40188ee73ee05.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"ReturnHandle": "Return 语句处理器:继承 Mixin 获得 Trans 回指针", "ReturnHandle.Handle": "翻译 Return 语句"} \ No newline at end of file diff --git a/.transpyc_cache/1df40188ee73ee05.pyi b/.transpyc_cache/1df40188ee73ee05.pyi deleted file mode 100644 index abcbbff..0000000 --- a/.transpyc_cache/1df40188ee73ee05.pyi +++ /dev/null @@ -1,23 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesReturn.py -Module: lib.core.Handles.HandlesReturn -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar - -@t.NoVTable -class ReturnHandle(HandlesBase.Mixin): - def __init__(self: ReturnHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: ReturnHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewReturnHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ReturnHandle | t.CPtr: pass diff --git a/.transpyc_cache/1e19f516dc857768.doc.json b/.transpyc_cache/1e19f516dc857768.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/1e19f516dc857768.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/1e19f516dc857768.pyi b/.transpyc_cache/1e19f516dc857768.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/1e19f516dc857768.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/1eb1c9fc7e85d9f8.doc.json b/.transpyc_cache/1eb1c9fc7e85d9f8.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/1eb1c9fc7e85d9f8.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/1eb1c9fc7e85d9f8.pyi b/.transpyc_cache/1eb1c9fc7e85d9f8.pyi deleted file mode 100644 index 8139e3c..0000000 --- a/.transpyc_cache/1eb1c9fc7e85d9f8.pyi +++ /dev/null @@ -1,10 +0,0 @@ -""" -Auto-generated Python stub file from for_test.py -Module: for_test -""" - - -import stdio -import t, c - -def for_test() -> int: pass diff --git a/.transpyc_cache/1ed8ca4986cb0d65.doc.json b/.transpyc_cache/1ed8ca4986cb0d65.doc.json deleted file mode 100644 index aee5ad5..0000000 --- a/.transpyc_cache/1ed8ca4986cb0d65.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"get_func_name": "从函数节点提取函数名", "escape_llvm_string": "将字符串转换为 LLVM IR 字符串字面量 c\"...\\00\" ", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "get_llvm_float_bits": "获取 LLVM 浮点类型的位宽,非浮点类型返回 0", "is_ptr_type": "检查 ty 是否是 Ptr 类型,返回 1=是, 0=否", "_deref_if_ptr_ptr": "如果 obj_ptr 是 Ptr(Ptr(...)),load 解引用获取内层指针", "coerce_to_type": "将 val 强制转换为 target_ty\n\n 整数: sext(扩展)/ trunc(截断)\n 浮点: fpext(扩展)/ fptrunc(截断)\n int→float: sitofp\n float→int: fptosi\n ", "create_global_string": "创建全局字符串常量并返回 i8* bitcast", "translate_constant": "翻译常量(int/str/bool)", "translate_value": "翻译值表达式为 LLVM Value", "translate_compare": "翻译比较表达式,返回 i1 结果", "translate_unaryop": "翻译一元运算(-x, +x, not x, ~x)", "translate_boolop": "翻译布尔运算(and/or)的短路求值,返回 i1", "translate_name_value": "翻译变量引用(Name 节点)→ load", "ExprHandle": "表达式处理器:继承 Mixin 获得 Trans 回指针", "ExprHandle.HandleValue": "翻译值表达式,从 self.Trans 获取共享状态", "list_getitem_inline": "内联生成 list __getitem__ 逻辑,返回元素地址 (i8*)", "_list_elem_type_from_name": "从 list 类型名提取元素 LLVM 类型", "list_setitem_inline": "内联生成 list __setitem__ 逻辑,返回 0", "is_list_subscript": "检查 Subscript 节点是否是 list[T] 类型,返回 list 对象指针或 None", "translate_subscript": "翻译下标表达式,返回加载的元素值", "translate_attribute": "翻译属性访问,返回加载的字段值", "get_subscript_ptr": "获取下标表达式的元素指针(用于赋值 lhs)", "get_attribute_ptr": "获取属性访问的字段指针(用于赋值 lhs)"} \ No newline at end of file diff --git a/.transpyc_cache/1ed8ca4986cb0d65.pyi b/.transpyc_cache/1ed8ca4986cb0d65.pyi deleted file mode 100644 index ad13f52..0000000 --- a/.transpyc_cache/1ed8ca4986cb0d65.pyi +++ /dev/null @@ -1,77 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExpr.py -Module: lib.core.Handles.HandlesExpr -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import llvmlite -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprOps as HandlesExprOps -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -def get_func_name(func_node: ast.AST | t.CPtr) -> str: pass - -def escape_llvm_string(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_llvm_float_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def is_ptr_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _deref_if_ptr_ptr(builder: llvmlite.IRBuilder | t.CPtr, obj_ptr: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def coerce_to_type(builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def create_global_string(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, str_val: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_constant(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_compare(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_unaryop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_boolop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_name_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -@t.NoVTable -class ExprHandle(HandlesBase.Mixin): - def __init__(self: ExprHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleValue(self: ExprHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def NewExprHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprHandle | t.CPtr: pass - -def list_getitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _list_elem_type_from_name(pool: memhub.MemBuddy | t.CPtr, struct_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def list_setitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr, rhs_val: llvmlite.Value | t.CPtr) -> int: pass - -def is_list_subscript(node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_subscript(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_attribute(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -import stdio - -def get_subscript_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_attribute_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/1ff2c5eb32359e40.doc.json b/.transpyc_cache/1ff2c5eb32359e40.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/1ff2c5eb32359e40.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/1ff2c5eb32359e40.pyi b/.transpyc_cache/1ff2c5eb32359e40.pyi deleted file mode 100644 index dde14fd..0000000 --- a/.transpyc_cache/1ff2c5eb32359e40.pyi +++ /dev/null @@ -1,16 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import w32.win32console -import t, c -from t import CInt, CExport -import stdlib -import stdio -import memhub -import testcheck - -def main() -> CInt | CExport: pass diff --git a/.transpyc_cache/2020b02f319dd87d.doc.json b/.transpyc_cache/2020b02f319dd87d.doc.json deleted file mode 100644 index 28f2ad8..0000000 --- a/.transpyc_cache/2020b02f319dd87d.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_register_cexport_from_funcdef": "预注册 CExport/State 函数到全局表(仅注册,不生成 IR)", "translate_children": "遍历 tree.children 并翻译每个子节点\n\n Args:\n trans: 翻译器(含所有共享状态)\n tree: AST 模块节点\n\n Returns:\n t.CInt: 新增的变量数\n ", "handle_module_level_var": "处理模块级变量声明,创建全局变量", "create_wrapper_main": "创建包装 main 函数并翻译所有顶层语句\n\n Args:\n trans: 翻译器(含所有共享状态)\n tree: AST 模块节点\n i32_ty: i32 LLVMType\n\n Returns:\n t.CInt: 新增的变量数\n "} \ No newline at end of file diff --git a/.transpyc_cache/2020b02f319dd87d.pyi b/.transpyc_cache/2020b02f319dd87d.pyi deleted file mode 100644 index 2294a70..0000000 --- a/.transpyc_cache/2020b02f319dd87d.pyi +++ /dev/null @@ -1,30 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesMain.py -Module: lib.core.Handles.HandlesMain -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesBody as HandlesBody -import lib.core.Handles.HandlesFunctions as HandlesFunctions -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -def _register_cexport_from_funcdef(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_children(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr) -> int: pass - -def handle_module_level_var(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def create_wrapper_main(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr, i32_ty: llvmlite.LLVMType | t.CPtr) -> int: pass diff --git a/.transpyc_cache/20cd49775c100a38.pyi b/.transpyc_cache/20cd49775c100a38.pyi deleted file mode 100644 index df04de7..0000000 --- a/.transpyc_cache/20cd49775c100a38.pyi +++ /dev/null @@ -1,22 +0,0 @@ -""" -Auto-generated Python stub file from json.__writer.py -Module: json.__writer -""" - - -import t, c -from stdint import * -import memhub -import string -from stdio import snprintf -from . import JsonValue, JSON_NULL, JSON_BOOL, JSON_INT, JSON_FLOAT, JSON_STRING, JSON_ARRAY, JSON_OBJECT - -def _write_char(buf: t.CChar | t.CPtr, pos: t.CSizeT, ch: t.CChar) -> t.CSizeT: pass - -def _write_str(buf: t.CChar | t.CPtr, pos: t.CSizeT, s: t.CChar | t.CPtr) -> t.CSizeT: pass - -def _write_string_escaped(buf: t.CChar | t.CPtr, pos: t.CSizeT, s: t.CChar | t.CPtr) -> t.CSizeT: pass - -def _write_value(buf: t.CChar | t.CPtr, pos: t.CSizeT, val: JsonValue | t.CPtr, pool: memhub.MemManager | t.CPtr) -> t.CSizeT: pass - -def write(pool: memhub.MemManager | t.CPtr, val: JsonValue | t.CPtr, pretty: bool) -> t.CChar | t.CPtr: pass diff --git a/.transpyc_cache/212fb1de4f9d6e5c.doc.json b/.transpyc_cache/212fb1de4f9d6e5c.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/212fb1de4f9d6e5c.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/212fb1de4f9d6e5c.pyi b/.transpyc_cache/212fb1de4f9d6e5c.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/212fb1de4f9d6e5c.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/213348433fb01cc6.pyi b/.transpyc_cache/213348433fb01cc6.pyi deleted file mode 100644 index 6e4edce..0000000 --- a/.transpyc_cache/213348433fb01cc6.pyi +++ /dev/null @@ -1,67 +0,0 @@ -""" -Auto-generated Python stub file from zlib.zdef.py -Module: zlib.zdef -""" - - -from stdint import * -import stddef -import string -import stdlib -import memhub -import t, c - -ZDEFLATE_WINDOW_BITS: t.CDefine = 15 -ZDEFLATE_WINDOW_SIZE: t.CDefine = (1 << ZDEFLATE_WINDOW_BITS) -ZDEFLATE_WINDOW_MASK: t.CDefine = (ZDEFLATE_WINDOW_SIZE - 1) -ZDEFLATE_MIN_MATCH: t.CDefine = 3 -ZDEFLATE_MAX_MATCH: t.CDefine = 258 -ZDEFLATE_HASH_BITS: t.CDefine = 15 -ZDEFLATE_HASH_SIZE: t.CDefine = (1 << ZDEFLATE_HASH_BITS) -ZDEFLATE_HASH_MASK: t.CDefine = (ZDEFLATE_HASH_SIZE - 1) -ZDEFLATE_MAX_CODES: t.CDefine = 288 -ZDEFLATE_MAX_DIST_CODES: t.CDefine = 32 -ZDEFLATE_MAX_BITS: t.CDefine = 15 -ZDEFLATE_MAX_CODELEN_CODES: t.CDefine = 19 -ZDEFLATE_LIT_COUNT: t.CDefine = 286 -ZDEFLATE_DIST_COUNT: t.CDefine = 30 -ZDEFLATE_LEN_SYMBOLS_BASE: t.CDefine = 257 -ZDEFLATE_END_OF_BLOCK: t.CDefine = 256 -zdeflate_len_extra_bits: t.CExtern | t.CArray[t.CInt, 29] -zdeflate_len_base: t.CExtern | t.CArray[t.CInt, 29] -zdeflate_dist_extra_bits: t.CExtern | t.CArray[t.CInt, 30] -zdeflate_dist_base: t.CExtern | t.CArray[t.CInt, 30] -zdeflate_codelen_order: t.CExtern | t.CArray[int, 19] - -@t.Object -class zbit_writer: - pool: memhub.MemManager | t.CPtr - buf: BYTE | t.CPtr - cap: t.CSizeT - byte_pos: t.CSizeT - bit_pos: t.CInt - def __init__(self: zbit_writer, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - def ensure(self: zbit_writer, need: t.CSizeT) -> t.CInt: pass - def write_bits(self: zbit_writer, value: UINT, nbits: t.CInt) -> t.CInt: pass - def write_bits_rev(self: zbit_writer, code: UINT, nbits: t.CInt) -> t.CInt: pass - def stored_block(self: zbit_writer, data: UINT8PTR, length: t.CSizeT, final: t.CInt) -> t.CInt: pass - def write_zlib_header(self: zbit_writer, wbits: t.CInt, level: t.CInt) -> t.CInt: pass - def write_gzip_header(self: zbit_writer) -> t.CInt: pass - def align(self: zbit_writer) -> t.CInt: pass - def total(self: zbit_writer) -> t.CSizeT: pass - def free(self: zbit_writer) -> t.CInt: pass - def __del__(self: zbit_writer) -> t.CInt: pass -@t.Object -class zbit_reader: - buf: BYTE | t.CPtr - length: t.CSizeT - byte_pos: t.CSizeT - bit_pos: t.CInt - def init(self: zbit_reader, buf: BYTE | t.CPtr, length: t.CSizeT) -> t.CInt: pass - def read_bits(self: zbit_reader, nbits: t.CInt, out: UINTPTR) -> t.CInt: pass - def read_bits_rev(self: zbit_reader, nbits: t.CInt, out: UINTPTR) -> t.CInt: pass - def align(self: zbit_reader) -> t.CInt: pass - -def zdef_alloc(pool: memhub.MemManager | t.CPtr, n: t.CSizeT) -> VOIDPTR: pass - -def zdef_free(pool: memhub.MemManager | t.CPtr, p: VOIDPTR) -> t.CInt: pass diff --git a/.transpyc_cache/21a7fcfc665f75ef.pyi b/.transpyc_cache/21a7fcfc665f75ef.pyi deleted file mode 100644 index 6f344a3..0000000 --- a/.transpyc_cache/21a7fcfc665f75ef.pyi +++ /dev/null @@ -1,87 +0,0 @@ -""" -Auto-generated Python stub file from llvmlite.__module.py -Module: llvmlite.__module -""" - - -import t, c -from stdint import * -import string -import stdio -import viperlib -import memhub -from linkedlist import GSList, GSListNode -from .__types import LLVMType, TypePrint, Array, PrintStructDefinition, get_struct_name, Struct -from .__function import Function, FunctionPrint, _ll_name_needs_quote, Param - -@t.NoVTable -class GlobalVariable(GSListNode[GlobalVariable]): - Name: t.CChar | t.CPtr - Ty: LLVMType | t.CPtr - Initializer: t.CVoid | t.CPtr - IsConstant: t.CInt - Linkage: t.CChar | t.CPtr - Section: t.CChar | t.CPtr - UnnamedAddr: t.CInt -@t.NoVTable -class NamedTypeNode(GSListNode[NamedTypeNode]): - Ty: LLVMType | t.CPtr -@t.NoVTable -class LLVMModule: - Name: t.CChar | t.CPtr - FuncHead: Function | t.CPtr - FuncTail: Function | t.CPtr - FuncCount: t.CSizeT - GlobalHead: GlobalVariable | t.CPtr - GlobalTail: GlobalVariable | t.CPtr - GlobalCount: t.CSizeT - TargetTriple: t.CChar | t.CPtr - DataLayout: t.CChar | t.CPtr - NamedTypeHead: NamedTypeNode | t.CPtr - NamedTypeTail: NamedTypeNode | t.CPtr - NamedTypeCount: t.CSizeT - -def new_module(pool: memhub.MemBuddy | t.CPtr, name: t.CChar | t.CPtr) -> LLVMModule | t.CPtr: pass - - -GV_SIZE: t.CDefine = 64 -NAMED_TYPE_NODE_SIZE: t.CDefine = 16 - -def new_global_variable(pool: memhub.MemBuddy | t.CPtr, name: t.CChar | t.CPtr, ty: LLVMType | t.CPtr) -> GlobalVariable | t.CPtr: pass - -def module_add_function(mod: LLVMModule | t.CPtr, func: Function | t.CPtr) -> t.CInt: pass - -def module_add_global(mod: LLVMModule | t.CPtr, gv: GlobalVariable | t.CPtr) -> t.CInt: pass - -def module_set_target(mod: LLVMModule | t.CPtr, triple: t.CChar | t.CPtr) -> t.CInt: pass - -def module_set_datalayout(mod: LLVMModule | t.CPtr, layout: t.CChar | t.CPtr) -> t.CInt: pass - -def module_add_named_type(mod: LLVMModule | t.CPtr, pool: memhub.MemBuddy | t.CPtr, ty: LLVMType | t.CPtr) -> t.CInt: pass - -def _is_type_defined_in_module(mod: LLVMModule | t.CPtr, name: t.CChar | t.CPtr) -> int: pass - -def _scan_type_for_cross_module_refs(pool: memhub.MemBuddy | t.CPtr, mod: LLVMModule | t.CPtr, ty: LLVMType | t.CPtr) -> t.CInt: pass - -def module_ensure_opaque_for_type(mod: LLVMModule | t.CPtr, pool: memhub.MemBuddy | t.CPtr, ty: LLVMType | t.CPtr) -> t.CInt: pass - -def global_set_constant(gv: GlobalVariable | t.CPtr, is_const: t.CInt) -> t.CInt: pass - -def global_set_linkage(gv: GlobalVariable | t.CPtr, linkage: t.CChar | t.CPtr) -> t.CInt: pass - -def global_set_unnamed_addr(gv: GlobalVariable | t.CPtr, level: t.CInt) -> t.CInt: pass - -def global_set_section(gv: GlobalVariable | t.CPtr, section: t.CChar | t.CPtr) -> t.CInt: pass - - -OUTPUT_FULL: t.CDefine = 0 # 完整 IR(stub + text) -OUTPUT_STUB: t.CDefine = 1 # 仅声明(header + 类型定义 + declare + external global) -OUTPUT_TEXT: t.CDefine = 2 # 仅代码(define + global 带初值) - -def LLVMModulePrint(buf: t.CChar | t.CPtr, size: t.CSizeT, mod: LLVMModule | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mode: t.CInt) -> t.CInt: pass - -def _print_global(buf: t.CChar | t.CPtr, size: t.CSizeT, gv: GlobalVariable | t.CPtr, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - -def _print_global_stub(buf: t.CChar | t.CPtr, size: t.CSizeT, gv: GlobalVariable | t.CPtr, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - -def _append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass diff --git a/.transpyc_cache/21fffba3315e81b4.doc.json b/.transpyc_cache/21fffba3315e81b4.doc.json deleted file mode 100644 index f6553a0..0000000 --- a/.transpyc_cache/21fffba3315e81b4.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"Logger.banner": "输出分节标题(青色高亮)。", "Logger.compile_error": "格式化编译错误输出(红底白字标题 + 位置 + 错误信息)。", "Logger.compile_warning": "格式化编译警告输出(黄底黑字标题 + 位置 + 警告信息)。", "get_logger": "获取全局 logger 实例。若不存在则通过 _mbuddy 分配并初始化。", "set_logger": "设置全局 logger 实例。"} \ No newline at end of file diff --git a/.transpyc_cache/21fffba3315e81b4.pyi b/.transpyc_cache/21fffba3315e81b4.pyi deleted file mode 100644 index 04be3c9..0000000 --- a/.transpyc_cache/21fffba3315e81b4.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.VLogger.py -Module: lib.core.VLogger -""" - - -import t, c -from stdint import * -import stdio -import memhub -import w32.win32console as w32cmd -import w32.win32file as w32file -import w32.win32base as w32base - -class LogLevel(t.CEnum): - DEBUG = 0 - INFO = 1 - WARNING = 2 - ERROR = 3 - SUCCESS = 4 - -FOREGROUND_BLUE: t.CDefine = 0x0001 -FOREGROUND_GREEN: t.CDefine = 0x0002 -FOREGROUND_RED: t.CDefine = 0x0004 -FOREGROUND_INTENSITY: t.CDefine = 0x0008 -FOREGROUND_WHITE: t.CDefine = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE -FOREGROUND_CYAN: t.CDefine = FOREGROUND_BLUE | FOREGROUND_GREEN -FOREGROUND_YELLOW: t.CDefine = FOREGROUND_RED | FOREGROUND_GREEN -FOREGROUND_MAGENTA: t.CDefine = FOREGROUND_RED | FOREGROUND_BLUE -BACKGROUND_RED: t.CDefine = 0x0040 -BACKGROUND_GREEN: t.CDefine = 0x0020 -BACKGROUND_BLUE: t.CDefine = 0x0010 -BACKGROUND_INTENSITY: t.CDefine = 0x0080 -BACKGROUND_WHITE: t.CDefine = BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE - -class Logger: - _level: int - _console_handle: w32base.HANDLE - _use_color: int - __mbuddy__: memhub.MemManager | t.CPtr - def __init__(self: Logger, level: int) -> t.CInt: pass - def _set_color(self: Logger, attr: WORD) -> int: pass - def _reset_color(self: Logger) -> int: pass - def _log(self: Logger, level: int, prefix: str, msg: str, color: WORD, category: str) -> int: pass - def debug(self: Logger, msg: str, category: str) -> int: pass - def info(self: Logger, msg: str, category: str) -> int: pass - def warning(self: Logger, msg: str, category: str) -> int: pass - def error(self: Logger, msg: str, category: str) -> int: pass - def success(self: Logger, msg: str, category: str) -> int: pass - def set_level(self: Logger, level: int) -> int: pass - def banner(self: Logger, msg: str) -> int: pass - def compile_error(self: Logger, msg: str, file: str, line: int) -> int: pass - def compile_warning(self: Logger, msg: str, file: str, line: int) -> int: pass - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -_g_logger: t.CExtern | Logger | t.CPtr - -def get_logger() -> Logger | t.CPtr: pass - -def set_logger(logger: Logger | t.CPtr) -> int: pass diff --git a/.transpyc_cache/22650858c377c847.doc.json b/.transpyc_cache/22650858c377c847.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/22650858c377c847.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/22650858c377c847.pyi b/.transpyc_cache/22650858c377c847.pyi deleted file mode 100644 index 24552b0..0000000 --- a/.transpyc_cache/22650858c377c847.pyi +++ /dev/null @@ -1,64 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - -import c - - -import t -import stdio -import string -import testcheck -import linkedlist -import viperlib -import stdlib - -class Node(linkedlist.LinkedNode): - value: t.CInt - -def test_append() -> t.CInt: pass - -def test_prev_link() -> t.CInt: pass - -def test_last_child() -> t.CInt: pass - -def test_remove() -> t.CInt: pass - -def test_remove_child() -> t.CInt: pass - -def test_insert_ops() -> t.CInt: pass - -def test_index_access() -> t.CInt: pass - -def test_sibling_traverse() -> t.CInt: pass - -def test_unlink() -> t.CInt: pass - - -class SNode(linkedlist.SListNode): - value: t.CInt - -def test_slist() -> t.CInt: pass - -def test_sprintf_vararg() -> t.CInt: pass - - -@t.NoVTable -class GSListNode[T]: - Next: T | t.CPtr -@t.NoVTable -class GSList[T]: - Head: T | t.CPtr - Tail: T | t.CPtr - Count: t.CSizeT - def __init__(self: GSList) -> t.CInt: pass - def append(self: GSList, node: T) -> t.CInt: pass - def count(self: GSList) -> t.CSizeT: pass - def at(self: GSList, index: t.CSizeT) -> T | t.CPtr: pass -class GNode(GSListNode[GNode]): - Value: t.CInt - -def test_generic_slist() -> t.CInt: pass - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/240a9a4157959a9f.pyi b/.transpyc_cache/240a9a4157959a9f.pyi deleted file mode 100644 index c230800..0000000 --- a/.transpyc_cache/240a9a4157959a9f.pyi +++ /dev/null @@ -1,38 +0,0 @@ -""" -Auto-generated Python stub file from json.__parser.py -Module: json.__parser -""" - - -import t, c -from stdint import * -import memhub -import string -from . import JsonValue, JSON_NULL, JSON_BOOL, JSON_INT, JSON_FLOAT, JSON_STRING, JSON_ARRAY, JSON_OBJECT, null, bool_val, int_val, float_val, string_val, array, object - -class ParseState: - src: t.CChar | t.CPtr - pos: t.CSizeT - len: t.CSizeT - pool: memhub.MemManager | t.CPtr - def __init__(self: ParseState, src: t.CChar | t.CPtr, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - -def _peek(s: ParseState | t.CPtr) -> t.CChar: pass - -def _advance(s: ParseState | t.CPtr) -> t.CChar: pass - -def _skip_whitespace(s: ParseState | t.CPtr) -> t.CInt: pass - -def _expect(s: ParseState | t.CPtr, ch: t.CChar) -> bool: pass - -def _parse_string(s: ParseState | t.CPtr) -> t.CChar | t.CPtr: pass - -def _parse_number(s: ParseState | t.CPtr) -> JsonValue | t.CPtr: pass - -def _parse_value(s: ParseState | t.CPtr) -> JsonValue | t.CPtr: pass - -def _parse_array(s: ParseState | t.CPtr) -> JsonValue | t.CPtr: pass - -def _parse_object(s: ParseState | t.CPtr) -> JsonValue | t.CPtr: pass - -def parse(pool: memhub.MemManager | t.CPtr, src: t.CChar | t.CPtr) -> JsonValue | t.CPtr: pass diff --git a/.transpyc_cache/249b0b9083e25ad2.doc.json b/.transpyc_cache/249b0b9083e25ad2.doc.json deleted file mode 100644 index 56e8c7e..0000000 --- a/.transpyc_cache/249b0b9083e25ad2.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"RunPhase1": "Phase1: 扫描 includes 目录,按需翻译并生成 stub"} \ No newline at end of file diff --git a/.transpyc_cache/249b0b9083e25ad2.pyi b/.transpyc_cache/249b0b9083e25ad2.pyi deleted file mode 100644 index d866b3e..0000000 --- a/.transpyc_cache/249b0b9083e25ad2.pyi +++ /dev/null @@ -1,31 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Phase1.py -Module: lib.core.Phase1 -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import viperlib -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import ast -import llvmlite -import lib.core.VLogger as VLogger -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.IncludesScanner as IncludesScanner -import lib.core.StubMerger as StubMerger -import lib.Projectrans.Config as Config - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 - -def RunPhase1(mb: memhub.MemBuddy | t.CPtr, includes_dir: str, temp_dir: str, log: VLogger.Logger | t.CPtr) -> int: pass diff --git a/.transpyc_cache/24b9e251de12bd96.doc.json b/.transpyc_cache/24b9e251de12bd96.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/24b9e251de12bd96.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/24b9e251de12bd96.pyi b/.transpyc_cache/24b9e251de12bd96.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/24b9e251de12bd96.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/24e26a8de1173993.doc.json b/.transpyc_cache/24e26a8de1173993.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/24e26a8de1173993.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/24e26a8de1173993.pyi b/.transpyc_cache/24e26a8de1173993.pyi deleted file mode 100644 index 0053550..0000000 --- a/.transpyc_cache/24e26a8de1173993.pyi +++ /dev/null @@ -1,39 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - -import c - - -import t -import stdio -import string -import testcheck - -class Point(t.Struct): - x: t.CInt - y: t.CInt -class Rect(t.Struct): - origin: Point - size: Point -class Node(t.Struct): - value: t.CInt - next: t.CPtr | t.CVoid - -def test_struct_basic() -> t.CInt: pass - -def test_struct_nested() -> t.CInt: pass - -def test_struct_pointer() -> t.CInt: pass - -def test_struct_param() -> t.CInt: pass - -def point_sum(p: Point) -> t.CInt: pass - -def test_struct_array() -> t.CInt: pass - - -import w32.win32memory - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/257e074b935c33b4.pyi b/.transpyc_cache/257e074b935c33b4.pyi deleted file mode 100644 index 34d2feb..0000000 --- a/.transpyc_cache/257e074b935c33b4.pyi +++ /dev/null @@ -1,45 +0,0 @@ -""" -Auto-generated Python stub file from binascii.py -Module: binascii -""" - - -import t, c - -HEX_CHARS: t.CExtern | t.CArray[t.CChar, None] -HEX_VALS: t.CExtern | t.CArray[t.CInt, 256] -B64_CHARS: t.CExtern | t.CArray[t.CChar, None] -B64_VALS: t.CExtern | t.CArray[t.CInt, 256] -HQX_CHARS: t.CExtern | t.CArray[t.CChar, 64] -HQX_VALS: t.CExtern | t.CArray[t.CInt, 256] -UU_CHARS: t.CExtern | t.CArray[t.CChar, None] -CRC32_TABLE: t.CExtern | t.CArray[t.CUnsignedInt, 256] -CRC_HQX_TABLE: t.CExtern | t.CArray[t.CUnsignedShort, 256] - -def init_binascii() -> t.CInt: pass - -def crc32(data: str, length: t.CInt, crc: t.CUnsignedInt) -> t.CUnsignedInt: pass - -def crc_hqx(data: str, length: t.CInt, crc: t.CUnsignedShort) -> t.CUnsignedShort: pass - -def hexlify(data: str, length: t.CInt) -> str: pass - -def b2a_hex(data: str, length: t.CInt) -> str: pass - -def a2b_hex(hexstr: str, length: t.CInt) -> str: pass - -def unhexlify(data: str, length: t.CInt) -> t.CInt: pass - -def b2a_base64(data: str, length: t.CInt) -> str: pass - -def a2b_base64(data: str, length: t.CInt) -> str: pass - -def b2a_uu(data: str, length: t.CInt) -> str: pass - -def a2b_uu(data: str) -> str: pass - -def b2a_hqx(data: str, length: t.CInt, crc: t.CUnsignedShort) -> tuple[str, t.CUnsignedShort]: pass - -def a2b_hqx(data: str, crc: t.CUnsignedShort) -> tuple[str, t.CUnsignedShort]: pass - -def adler32(data: str, length: t.CInt, adler: t.CUnsignedInt) -> t.CUnsignedInt: pass diff --git a/.transpyc_cache/25c18686adb93279.doc.json b/.transpyc_cache/25c18686adb93279.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/25c18686adb93279.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/25c18686adb93279.pyi b/.transpyc_cache/25c18686adb93279.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/25c18686adb93279.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/2769dee537308b00.doc.json b/.transpyc_cache/2769dee537308b00.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/2769dee537308b00.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/2769dee537308b00.pyi b/.transpyc_cache/2769dee537308b00.pyi deleted file mode 100644 index 2d8296e..0000000 --- a/.transpyc_cache/2769dee537308b00.pyi +++ /dev/null @@ -1,22 +0,0 @@ -""" -Auto-generated Python stub file from vtable_test.py -Module: vtable_test -""" - - -import stdio -import t, c - -@t.CVTable -class Animal: - name: t.CInt - def __init__(self: Animal, n: t.CInt) -> t.CInt: pass - def GetName(self: Animal) -> t.CInt: pass - def Speak(self: Animal) -> t.CInt: pass -@t.CVTable -class Shape: - sides: t.CInt - def SetSides(self: Shape, n: t.CInt) -> t.CInt: pass - def GetSides(self: Shape) -> t.CInt: pass - -def vtable_test() -> int: pass diff --git a/.transpyc_cache/27b003cb178b709a.doc.json b/.transpyc_cache/27b003cb178b709a.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/27b003cb178b709a.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/27b003cb178b709a.pyi b/.transpyc_cache/27b003cb178b709a.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/27b003cb178b709a.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/2998b8f78d7022bf.doc.json b/.transpyc_cache/2998b8f78d7022bf.doc.json deleted file mode 100644 index d24160b..0000000 --- a/.transpyc_cache/2998b8f78d7022bf.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"Translator": "翻译器:管理编译状态,委托 Handles 模块执行翻译", "Translator._init_state": "初始化变量表、函数表和子 Handle", "Translator.translate": "将 AST 翻译为 LLVM IR", "Translator._translate_wrapper_main": "委托 HandlesMain.create_wrapper_main() 创建包装 main(trans 单参)", "Translator._translate_module_level": "委托 HandlesMain.translate_children() 翻译模块级语句(trans 单参)", "Translator.dump_ir": "将 LLVM IR 输出到缓冲区\n\n mode: 0=完整, 1=stub(仅声明), 2=text(仅代码)\n ", "add_global_name": "添加一个 global 变量名", "is_global_name": "检查 name 是否在当前函数的 global 集合中", "add_nonlocal_name": "添加一个 nonlocal 变量名", "is_nonlocal_name": "检查 name 是否在当前函数的 nonlocal 集合中", "get_nonlocal_index": "获取 nonlocal 变量在 env 中的索引(0-based),找不到返回 -1", "clear_scope_names": "清空当前函数的 global/nonlocal 名称集合(进入新函数时调用)"} \ No newline at end of file diff --git a/.transpyc_cache/2998b8f78d7022bf.pyi b/.transpyc_cache/2998b8f78d7022bf.pyi deleted file mode 100644 index 865ebf6..0000000 --- a/.transpyc_cache/2998b8f78d7022bf.pyi +++ /dev/null @@ -1,90 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesTranslator.py -Module: lib.core.Handles.HandlesTranslator -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesMain as HandlesMain -import lib.core.Handles.HandlesAssign as HandlesAssign -import lib.core.Handles.HandlesReturn as HandlesReturn -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesAnnAssign as HandlesAnnAssign -import lib.core.Handles.HandlesAugAssign as HandlesAugAssign -import lib.core.Handles.HandlesIf as HandlesIf -import lib.core.Handles.HandlesWhile as HandlesWhile -import lib.core.Handles.HandlesFor as HandlesFor -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesFunctions as HandlesFunctions -import lib.Projectrans.Config as Config - -MAX_VARS: t.CDefine = 256 -MAX_FUNCS: t.CDefine = 256 -MAX_GLOBAL_NAMES: t.CDefine = 32 - -@t.NoVTable -class Translator: - Module: llvmlite.LLVMModule | t.CPtr - Pool: memhub.MemBuddy | t.CPtr - _funcs: HandlesExprCall.FuncEntry | t.CPtr - _func_count: t.CInt - _imported_modules: str - _from_imports: str - _cur_func: llvmlite.Function | t.CPtr - _cur_builder: llvmlite.IRBuilder | t.CPtr - _break_bb: llvmlite.BasicBlock | t.CPtr - _continue_bb: llvmlite.BasicBlock | t.CPtr - _label_counter: t.CInt - _global_names: str - _global_name_count: t.CInt - _nonlocal_names: str - _nonlocal_name_count: t.CInt - _cur_func_name: str - ModuleSha1: str - CurrentPackage: str - _closure_env_offsets: t.CInt - _closure_env_count: t.CInt - GenericTypeParamNames: list[str] | t.CPtr - GenericTypeArgs: list[str] | t.CPtr - _declare_only: t.CInt - AssignH: HandlesAssign.AssignHandle | t.CPtr - ReturnH: HandlesReturn.ReturnHandle | t.CPtr - ImportsH: HandlesImports.ImportsHandle | t.CPtr - AnnAssignH: HandlesAnnAssign.AnnAssignHandle | t.CPtr - AugAssignH: HandlesAugAssign.AugAssignHandle | t.CPtr - IfH: HandlesIf.IfHandle | t.CPtr - WhileH: HandlesWhile.WhileHandle | t.CPtr - ForH: HandlesFor.ForHandle | t.CPtr - ExprH: HandlesExpr.ExprHandle | t.CPtr - ExprCallH: HandlesExprCall.ExprCallHandle | t.CPtr - SymTab: HandlesVar.SymbolTable | t.CPtr - def __init__(self: Translator) -> t.CInt: pass - def _init_state(self: Translator, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - def translate(self: Translator, tree: ast.AST | t.CPtr) -> int: pass - def _translate_wrapper_main(self: Translator, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, tree: ast.AST | t.CPtr, i32_ty: llvmlite.LLVMType | t.CPtr) -> t.CInt: pass - def _translate_module_level(self: Translator, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, tree: ast.AST | t.CPtr) -> t.CInt: pass - def dump_ir(self: Translator, buf: bytes, size: t.CSizeT, mode: int) -> t.CInt: pass - -def add_global_name(trans: HT.Translator | t.CPtr, name: str) -> t.CInt: pass - -def is_global_name(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def add_nonlocal_name(trans: HT.Translator | t.CPtr, name: str) -> t.CInt: pass - -def is_nonlocal_name(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def get_nonlocal_index(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def clear_scope_names(trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr \ No newline at end of file diff --git a/.transpyc_cache/2ae1bee155fb09d3.doc.json b/.transpyc_cache/2ae1bee155fb09d3.doc.json deleted file mode 100644 index ca04595..0000000 --- a/.transpyc_cache/2ae1bee155fb09d3.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"reset_visible_structs": "重置可见性状态(每个文件翻译前调用)\n\n pool: 内存分配器(严格模式下创建 HashTable)\n strict: 1=严格模式(用户文件),0=宽松模式(includes 文件)\n ", "add_visible_struct": "添加可见结构体名(类定义时和 from-import 时调用)", "is_struct_visible": "检查结构体是否可见,返回 1=可见 / 0=不可见", "init_struct_table": "初始化结构体注册表,返回 1 成功", "_get_struct_entry": "获取第 i 个结构体条目", "_get_field_entry": "获取结构体中第 i 个字段条目", "register_struct": "注册结构体类型,返回 StructEntry 指针\n\n 用类型指针去重(is 比较),不用类名去重。\n 这样跨模块同名类可以共存,各自有独立的字段定义。\n sha1 参数在注册时直接设置 ModuleSha1(避免 set_struct_sha1 找错 entry)。\n ", "set_struct_sha1": "设置结构体所属模块的 SHA1,返回 1=成功 / 0=失败", "get_struct_sha1": "获取结构体所属模块的 SHA1,返回 None=无 SHA1", "add_field": "向结构体添加字段,返回字段索引(-1 失败)\n\n default_val: 字段默认值 AST 节点(可选,None=无默认值)\n annot_class_name: 原始类型注解的类名(可选,用于联合类型字段的方法调用解析)\n ", "find_struct": "按类名查找结构体,返回 StructEntry 或 None", "find_struct_by_module": "按类名 + SHA1 查找结构体,返回 StructEntry 或 None\n\n SHA1 非 None 时:精确匹配 name+sha1,未找到返回 None(不回退,避免跨模块同名找错)\n SHA1 为 None 时:回退到 find_struct(name) 按类名查找第一个\n ", "find_struct_by_type": "按类型指针查找结构体(is 比较),返回 StructEntry 或 None", "lookup_field": "按结构体类型和字段名查找字段信息\n\n 两遍查找策略(跨模块同名类冲突的根本修复):\n 第一遍: 类型指针 is 身份比较(最高优先级,类型唯一确定 entry)\n 第二遍: 名称回退(is 未匹配时,按类名/strstr 匹配,字段未找到时 continue)\n ", "lookup_field_by_class": "按类名和字段名查找字段信息\n\n 优先用 SHA1 匹配(跨模块同名类区分),无 SHA1 时按类名查找第一个\n ", "get_struct_type": "按类名获取结构体的 LLVM 类型", "get_field_by_index": "按类名和字段索引获取字段信息", "struct_has_defaults": "检查结构体是否有任何带默认值的字段,返回 1=有 / 0=无", "_is_struct_type": "检查 ty 是否是 Struct 类型(独立函数,规避嵌套 match 编译器 BUG)", "get_struct_type_from_value": "从 Value 的类型推断结构体类型", "mark_as_union": "标记已注册的结构体为联合体,返回 1=成功 / 0=失败", "is_union_by_name": "按类名检查是否为联合体,返回 1=是 / 0=否", "is_union_by_type": "按类型指针检查是否为联合体,返回 1=是 / 0=否\n\n 先尝试类型指针 == 比较,失败时回退到名称匹配\n ", "mark_as_oop": "标记已注册的结构体为 OOP,返回 1=成功 / 0=失败", "is_oop_by_name": "按类名检查是否为 OOP 结构体,返回 1=是 / 0=否", "mark_has_init": "标记结构体拥有 __init__ 方法,返回 1=成功 / 0=失败", "has_init_by_name": "按类名检查是否有 __init__ 方法,返回 1=有 / 0=无", "mark_has_new": "标记结构体拥有 __new__ 方法,返回 1=成功 / 0=失败", "has_new_by_name": "按类名检查是否有 __new__ 方法,返回 1=有 / 0=无", "get_class_name_by_type": "按类型指针查找类名,返回类名字符串或 None", "_extract_struct_name": "从 LLVMType 提取 Struct 变体的 Name 字段,返回 None 非 Struct", "mark_has_vtable": "标记结构体拥有虚表,返回 1=成功 / 0=失败", "has_vtable_by_name": "按类名检查是否有虚表,返回 1=有 / 0=无", "mark_novtable": "标记结构体为 NoVTable,返回 1=成功 / 0=失败", "is_novtable_by_name": "按类名检查是否为 NoVTable,返回 1=是 / 0=否", "set_parent_name": "设置结构体的父类名,返回 1=成功 / 0=失败", "get_parent_name": "获取结构体的父类名,返回 None=无父类", "set_vtable_methods": "设置虚表方法名数组,返回 1=成功 / 0=失败", "get_vtable_method_index": "获取方法在虚表中的索引,返回 -1=未找到", "get_vtable_method_count": "获取虚表方法数量", "get_vtable_method_name": "获取虚表中第 idx 个方法名,返回 None=越界", "get_field_count": "获取结构体字段数量,返回 -1=未找到", "get_field_name_ptr": "获取 FieldEntry 的字段名,返回 None=未设置", "get_field_type_ptr": "获取 FieldEntry 的字段类型,返回 None=未设置", "get_field_default_ptr": "获取 FieldEntry 的默认值 AST 节点,返回 None=无默认值", "get_field_annot_class_name": "获取 FieldEntry 的原始类型注解类名,返回 None=未设置"} \ No newline at end of file diff --git a/.transpyc_cache/2ae1bee155fb09d3.pyi b/.transpyc_cache/2ae1bee155fb09d3.pyi deleted file mode 100644 index 24ef0f1..0000000 --- a/.transpyc_cache/2ae1bee155fb09d3.pyi +++ /dev/null @@ -1,139 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesStruct.py -Module: lib.core.Handles.HandlesStruct -""" - - -import t, c -from stdint import * -import memhub -import string -import llvmlite -import stdio -import ast -import hashtable - -STRUCT_MAX: t.CDefine = 512 -FIELD_MAX: t.CDefine = 32 -FIELD_NAME_MAX: t.CDefine = 64 - -@t.NoVTable -class FieldEntry: - Name: t.CChar | t.CPtr - Index: int - Ty: llvmlite.LLVMType | t.CPtr - DefaultVal: ast.AST | t.CPtr - AnnotClassName: str -@t.NoVTable -class StructEntry: - Name: t.CChar | t.CPtr - Ty: llvmlite.LLVMType | t.CPtr - FieldCount: int - Fields: FieldEntry | t.CPtr - IsUnion: int - IsOOP: int - HasInit: int - HasNew: int - HasVTable: int - IsNoVTable: int - ParentName: t.CChar | t.CPtr - VTableMethodCount: int - VTableMethods: t.CChar | t.CPtr - ModuleSha1: t.CChar | t.CPtr - -_struct_table: t.CExtern | StructEntry | t.CPtr -_struct_count: t.CExtern | int -_visible_structs: t.CExtern | hashtable.HashTable | t.CPtr -_strict_visibility: t.CExtern | int - -def reset_visible_structs(pool: memhub.MemBuddy | t.CPtr, strict: int) -> t.CInt: pass - -def add_visible_struct(pool: memhub.MemBuddy | t.CPtr, name: str) -> t.CInt: pass - -def is_struct_visible(name: str) -> int: pass - -def init_struct_table(pool: memhub.MemBuddy | t.CPtr) -> int: pass - -def _get_struct_entry(i: int) -> StructEntry | t.CPtr: pass - -def _get_field_entry(struct_entry: StructEntry | t.CPtr, i: int) -> FieldEntry | t.CPtr: pass - -def register_struct(pool: memhub.MemBuddy | t.CPtr, name: str, struct_ty: llvmlite.LLVMType | t.CPtr, sha1: str) -> StructEntry | t.CPtr: pass - -def set_struct_sha1(pool: memhub.MemBuddy | t.CPtr, class_name: str, sha1: str) -> int: pass - -def get_struct_sha1(class_name: str) -> str: pass - -def add_field(pool: memhub.MemBuddy | t.CPtr, struct_entry: StructEntry | t.CPtr, field_name: str, field_ty: llvmlite.LLVMType | t.CPtr, default_val: ast.AST | t.CPtr, annot_class_name: str) -> int: pass - -def find_struct(name: str) -> StructEntry | t.CPtr: pass - -def find_struct_by_module(name: str, sha1: str) -> StructEntry | t.CPtr: pass - -def find_struct_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> StructEntry | t.CPtr: pass - -def lookup_field(struct_ty: llvmlite.LLVMType | t.CPtr, field_name: str) -> FieldEntry | t.CPtr: pass - -def lookup_field_by_class(class_name: str, field_name: str, sha1: str) -> FieldEntry | t.CPtr: pass - -def get_struct_type(class_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def get_field_by_index(class_name: str, idx: int) -> FieldEntry | t.CPtr: pass - -def struct_has_defaults(class_name: str) -> int: pass - -def _is_struct_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_struct_type_from_value(val: llvmlite.Value | t.CPtr) -> llvmlite.LLVMType | t.CPtr: pass - -def mark_as_union(name: str) -> int: pass - -def is_union_by_name(name: str) -> int: pass - -def is_union_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def mark_as_oop(name: str) -> int: pass - -def is_oop_by_name(name: str) -> int: pass - -def mark_has_init(name: str) -> int: pass - -def has_init_by_name(name: str) -> int: pass - -def mark_has_new(name: str) -> int: pass - -def has_new_by_name(name: str) -> int: pass - -def get_class_name_by_type(pool: memhub.MemBuddy | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr) -> str: pass - -def _extract_struct_name(ty: llvmlite.LLVMType | t.CPtr) -> str: pass - -def mark_has_vtable(name: str) -> int: pass - -def has_vtable_by_name(name: str) -> int: pass - -def mark_novtable(name: str) -> int: pass - -def is_novtable_by_name(name: str) -> int: pass - -def set_parent_name(name: str, parent_name: str) -> int: pass - -def get_parent_name(name: str) -> str: pass - -def set_vtable_methods(name: str, methods: t.CChar | t.CPtr, count: int) -> int: pass - -def get_vtable_method_index(name: str, method_name: str) -> int: pass - -def get_vtable_method_count(name: str) -> int: pass - -def get_vtable_method_name(name: str, idx: int) -> str: pass - -def get_field_count(name: str) -> int: pass - -def get_field_name_ptr(fe: FieldEntry | t.CPtr) -> str: pass - -def get_field_type_ptr(fe: FieldEntry | t.CPtr) -> llvmlite.LLVMType | t.CPtr: pass - -def get_field_default_ptr(fe: FieldEntry | t.CPtr) -> ast.AST | t.CPtr: pass - -def get_field_annot_class_name(fe: FieldEntry | t.CPtr) -> str: pass diff --git a/.transpyc_cache/2c8ff1a30ee46867.doc.json b/.transpyc_cache/2c8ff1a30ee46867.doc.json deleted file mode 100644 index dda4745..0000000 --- a/.transpyc_cache/2c8ff1a30ee46867.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"get_func_name": "从函数节点提取函数名", "escape_llvm_string": "将字符串转换为 LLVM IR 字符串字面量 c\"...\\00\" ", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "get_llvm_float_bits": "获取 LLVM 浮点类型的位宽,非浮点类型返回 0", "is_ptr_type": "检查 ty 是否是 Ptr 类型,返回 1=是, 0=否", "_deref_if_ptr_ptr": "如果 obj_ptr 是 Ptr(Ptr(...)),load 解引用获取内层指针", "coerce_to_type": "将 val 强制转换为 target_ty\n\n 整数: sext(扩展)/ trunc(截断)\n 浮点: fpext(扩展)/ fptrunc(截断)\n int→float: sitofp\n float→int: fptosi\n ", "create_global_string": "创建全局字符串常量并返回 i8* bitcast", "translate_constant": "翻译常量(int/str/bool)", "_infer_elem_type_from_value": "从 LLVM Value 的类型推断 list 元素类型名", "_find_pool_var": "查找上下文中的 pool 变量,返回 alloca 或 None", "translate_list_literal": "翻译 list 字面量 [a, b, c] → list[T](pool) + append 序列", "translate_value": "翻译值表达式为 LLVM Value", "translate_compare": "翻译比较表达式,返回 i1 结果", "translate_unaryop": "翻译一元运算(-x, +x, not x, ~x)", "translate_boolop": "翻译布尔运算(and/or)的短路求值,返回 i1", "translate_name_value": "翻译变量引用(Name 节点)→ load", "ExprHandle": "表达式处理器:继承 Mixin 获得 Trans 回指针", "ExprHandle.HandleValue": "翻译值表达式,从 self.Trans 获取共享状态", "list_getitem_inline": "内联生成 list __getitem__ 逻辑,返回元素地址 (i8*)", "_list_elem_type_from_name": "从 list 类型名提取元素 LLVM 类型", "list_setitem_inline": "内联生成 list __setitem__ 逻辑,返回 0", "is_list_subscript": "检查 Subscript 节点是否是 list[T] 类型,返回 list 对象指针或 None", "translate_subscript": "翻译下标表达式,返回加载的元素值", "translate_attribute": "翻译属性访问,返回加载的字段值", "get_subscript_ptr": "获取下标表达式的元素指针(用于赋值 lhs)", "get_attribute_ptr": "获取属性访问的字段指针(用于赋值 lhs)"} \ No newline at end of file diff --git a/.transpyc_cache/2c8ff1a30ee46867.pyi b/.transpyc_cache/2c8ff1a30ee46867.pyi deleted file mode 100644 index c495a8e..0000000 --- a/.transpyc_cache/2c8ff1a30ee46867.pyi +++ /dev/null @@ -1,84 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExpr.py -Module: lib.core.Handles.HandlesExpr -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import llvmlite -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprOps as HandlesExprOps -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -def get_func_name(func_node: ast.AST | t.CPtr) -> str: pass - -def escape_llvm_string(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_llvm_float_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def is_ptr_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _deref_if_ptr_ptr(builder: llvmlite.IRBuilder | t.CPtr, obj_ptr: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def coerce_to_type(builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def create_global_string(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, str_val: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_constant(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_elem_type_from_value(pool: memhub.MemBuddy | t.CPtr, value: llvmlite.Value | t.CPtr) -> str: pass - -def _find_pool_var(trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_list_literal(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, elem_type_name: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_compare(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_unaryop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_boolop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_name_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -@t.NoVTable -class ExprHandle(HandlesBase.Mixin): - def __init__(self: ExprHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleValue(self: ExprHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def NewExprHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprHandle | t.CPtr: pass - -def list_getitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _list_elem_type_from_name(pool: memhub.MemBuddy | t.CPtr, struct_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def list_setitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr, rhs_val: llvmlite.Value | t.CPtr) -> int: pass - -def is_list_subscript(node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_subscript(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_attribute(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -import stdio - -def get_subscript_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_attribute_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/2d39c6c7d3557b3e.pyi b/.transpyc_cache/2d39c6c7d3557b3e.pyi deleted file mode 100644 index fc259bd..0000000 --- a/.transpyc_cache/2d39c6c7d3557b3e.pyi +++ /dev/null @@ -1,63 +0,0 @@ -""" -Auto-generated Python stub file from linkedlist.py -Module: linkedlist -""" - - -import t, c -from stdint import * - -@t.NoVTable -class LinkedNode: - next: 'LinkedNode' | t.CPtr - prev: 'LinkedNode' | t.CPtr - child: 'LinkedNode' | t.CPtr - last_child: 'LinkedNode' | t.CPtr - parent: 'LinkedNode' | t.CPtr - child_count: t.CSizeT - def append(self: LinkedNode, node: 'LinkedNode' | t.CPtr) -> t.CInt: pass - def prepend(self: LinkedNode, node: 'LinkedNode' | t.CPtr) -> t.CInt: pass - def insert_before(self: LinkedNode, node: 'LinkedNode' | t.CPtr, new_node: 'LinkedNode' | t.CPtr) -> t.CInt: pass - def insert_after(self: LinkedNode, node: 'LinkedNode' | t.CPtr, new_node: 'LinkedNode' | t.CPtr) -> t.CInt: pass - def remove_child(self: LinkedNode, node: 'LinkedNode' | t.CPtr) -> t.CInt: pass - def detach(self: LinkedNode) -> t.CInt: pass - def unlink(self: LinkedNode) -> t.CInt: pass - def has_children(self: LinkedNode) -> t.CInt: pass - def child_at(self: LinkedNode, index: t.CSizeT) -> 'LinkedNode' | t.CPtr: pass - def count_children(self: LinkedNode) -> t.CSizeT: pass - def first_sibling(self: LinkedNode) -> 'LinkedNode' | t.CPtr: pass - def last_sibling(self: LinkedNode) -> 'LinkedNode' | t.CPtr: pass -@t.NoVTable -class SListNode: - Next: 'SListNode' | t.CPtr - def append(self: SListNode, node: 'SListNode' | t.CPtr) -> 'SListNode' | t.CPtr: pass - def append_after(self: SListNode, node: 'SListNode' | t.CPtr) -> 'SListNode' | t.CPtr: pass - def count(self: SListNode) -> t.CSizeT: pass - def at(self: SListNode, index: t.CSizeT) -> 'SListNode' | t.CPtr: pass - def remove(self: SListNode, node: 'SListNode' | t.CPtr) -> 'SListNode' | t.CPtr: pass -@t.NoVTable -class GSListNode[T]: - Next: T | t.CPtr -@t.NoVTable -class GSList[T]: - Head: T | t.CPtr - Tail: T | t.CPtr - Count: t.CSizeT - def __init__(self: GSList) -> t.CInt: pass - def append(self: GSList, node: T) -> t.CInt: pass - def count(self: GSList) -> t.CSizeT: pass - def at(self: GSList, index: t.CSizeT) -> T | t.CPtr: pass -@t.NoVTable -class GTreeNode[T]: - Next: T | t.CPtr - Prev: T | t.CPtr - Child: T | t.CPtr - LastChild: T | t.CPtr - Parent: T | t.CPtr - Count: t.CSizeT - def append(self: GTreeNode, node: T | t.CPtr) -> t.CInt: pass - def prepend(self: GTreeNode, node: T | t.CPtr) -> t.CInt: pass - def detach(self: GTreeNode) -> t.CInt: pass - def has_children(self: GTreeNode) -> t.CInt: pass - def child_at(self: GTreeNode, index: t.CSizeT) -> T | t.CPtr: pass - def count_children(self: GTreeNode) -> t.CSizeT: pass \ No newline at end of file diff --git a/.transpyc_cache/2da636c61863c815.pyi b/.transpyc_cache/2da636c61863c815.pyi deleted file mode 100644 index 7c91519..0000000 --- a/.transpyc_cache/2da636c61863c815.pyi +++ /dev/null @@ -1,33 +0,0 @@ -""" -Auto-generated Python stub file from subprocess.py -Module: subprocess -""" - - -import t, c -from stdint import * -import platmacro -import memhub -import string -import w32.win32base -import w32.win32file -import w32.win32process -import w32.win32sync -import posix - -OUTPUT_BUF_SIZE: t.CDefine = 65536 -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr - -class CompletedProcess: - args: str - returncode: int - stdout: str - stderr: str - def __new__(self: CompletedProcess, args: str, returncode: int, stdout: str, stderr: str) -> t.CPtr: pass - def __init__(self: CompletedProcess, args: str, returncode: int, stdout: str, stderr: str) -> t.CInt: pass - -def run(args: str, capture_output: bool, text: bool) -> CompletedProcess | t.CPtr: pass - -def _run_win32(args: str, capture_output: bool, text: bool) -> CompletedProcess | t.CPtr: pass - -def _run_posix(args: str, capture_output: bool, text: bool) -> CompletedProcess | t.CPtr: pass diff --git a/.transpyc_cache/2ed380190e9df89e.doc.json b/.transpyc_cache/2ed380190e9df89e.doc.json deleted file mode 100644 index 2259eff..0000000 --- a/.transpyc_cache/2ed380190e9df89e.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"is_cdefine_annotation": "检测注解是否为 t.CDefine,返回 1 表示是,0 表示否", "extract_cdefine_int_value": "从值节点提取整数常量(仅支持 Constant INT)", "AnnAssignHandle": "AnnAssign 语句处理器:继承 Mixin 获得 Trans 回指针", "AnnAssignHandle.PreScan": "预扫描 AnnAssign,提前创建 alloca 到 entry block 顶部", "AnnAssignHandle.Handle": "翻译 AnnAssign(target=Name, annotation=..., value=expr)"} \ No newline at end of file diff --git a/.transpyc_cache/2ed380190e9df89e.pyi b/.transpyc_cache/2ed380190e9df89e.pyi deleted file mode 100644 index 6d50c9b..0000000 --- a/.transpyc_cache/2ed380190e9df89e.pyi +++ /dev/null @@ -1,33 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesAnnAssign.py -Module: lib.core.Handles.HandlesAnnAssign -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesClassDef as HandlesClassDef -import lib.core.Handles.HandlesExprCall as HandlesExprCall - -def is_cdefine_annotation(annot: ast.AST | t.CPtr) -> int: pass - -def extract_cdefine_int_value(val_node: ast.AST | t.CPtr) -> int: pass - - -@t.NoVTable -class AnnAssignHandle(HandlesBase.Mixin): - def __init__(self: AnnAssignHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def PreScan(self: AnnAssignHandle, node: ast.AST | t.CPtr) -> int: pass - def Handle(self: AnnAssignHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewAnnAssignHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> AnnAssignHandle | t.CPtr: pass diff --git a/.transpyc_cache/2fcb6780db4d937f.doc.json b/.transpyc_cache/2fcb6780db4d937f.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/2fcb6780db4d937f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/2fcb6780db4d937f.pyi b/.transpyc_cache/2fcb6780db4d937f.pyi deleted file mode 100644 index 06ba45f..0000000 --- a/.transpyc_cache/2fcb6780db4d937f.pyi +++ /dev/null @@ -1,53 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import vipersimd -import numpy -from stdio import printf -import stdlib -from stdlib import calloc -import t, c -import memhub -import testcheck - -arena: t.CExtern | t.CUInt8T | t.CPtr -pool: t.CExtern | memhub.MemPool | t.CPtr - -def clock() -> t.CLong | t.CExtern: pass - - -CLOCK_PER_SEC: t.CDefine = 1000 - -def test_avx2_add_sub_mul_div() -> t.CInt: pass - -def test_avx2_neg_abs_sqrt() -> t.CInt: pass - -def test_avx2_min_max() -> t.CInt: pass - -def test_avx2_scalar_ops() -> t.CInt: pass - -def test_avx2_hsum_dot() -> t.CInt: pass - -def test_avx2_fma() -> t.CInt: pass - -def test_batch_array_ops() -> t.CInt: pass - -def test_llvmir_scalar() -> t.CInt: pass - - -N_ELEM: t.CDefine = 40000 -N_ITER: t.CDefine = 50000 - -def scalar_add_array(a: t.CPtr, b: t.CPtr, out: t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def scalar_mul_array(a: t.CPtr, b: t.CPtr, out: t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def scalar_sqrt_array(a: t.CPtr, out: t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def benchmark_simd_vs_scalar() -> t.CInt: pass - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/30a88f26e7679645.doc.json b/.transpyc_cache/30a88f26e7679645.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/30a88f26e7679645.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/30a88f26e7679645.pyi b/.transpyc_cache/30a88f26e7679645.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/30a88f26e7679645.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/33a854a5c4f67d74.doc.json b/.transpyc_cache/33a854a5c4f67d74.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/33a854a5c4f67d74.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/33a854a5c4f67d74.pyi b/.transpyc_cache/33a854a5c4f67d74.pyi deleted file mode 100644 index fdbb374..0000000 --- a/.transpyc_cache/33a854a5c4f67d74.pyi +++ /dev/null @@ -1,38 +0,0 @@ -""" -Auto-generated Python stub file from struct_test.py -Module: struct_test -""" - - -import stdio -import t, c - -class Point: - x: t.CInt - y: t.CInt -class Box: - width: t.CInt - height: t.CInt - depth: t.CInt -class Size: - w: t.CInt = 100 - h: t.CInt = 200 -class State(t.CEnum): - Idle: t.State - Run: t.State - Stop: t.State -class Color(t.CEnum): - Red: t.State = 10 - Green: t.State - Blue: t.State = 20 - Yellow: t.State -class MixedType(t.CEnum): - Small: t.CInt8T - Big: t.CInt64T - Medium: t.CInt16T -class DataUnion(t.CUnion): - i: t.CInt - f: t.CFloat - l: t.CInt64T - -def struct_test() -> int: pass diff --git a/.transpyc_cache/34548789d646f432.pyi b/.transpyc_cache/34548789d646f432.pyi deleted file mode 100644 index e046b0c..0000000 --- a/.transpyc_cache/34548789d646f432.pyi +++ /dev/null @@ -1,26 +0,0 @@ -""" -Auto-generated Python stub file from ast.__init__.py -Module: ast.__init__ -""" - - -import t, c -from stdint import * -import memhub -import string -from .tokens import Token, TokenType, Keyword, TokOp, _init_tables -from .base import AST, ASTKind, ASTCtx, OpKind, ASTFlag, CONST_INT, CONST_FLOAT, CONST_STR, CONST_BOOL, CONST_NONE, FLAG_IS_ASYNC, FLAG_SIMPLE, FLAG_HAS_STAR, _init_ast, _copy_str, _set_pos, _inherit_pos, _set_parent_list, _binop_from_op, _augop_from_op, _cmpop_from_op, _emit, _emit_str, _emit_int, _dump_list, dump -from .stmts import Module, Expression, Interactive, FunctionType, FunctionDef, ClassDef, Return, Delete, Assign, AugAssign, AnnAssign, For, While, If, With, Raise, Try, Assert, Global, Nonlocal, Pass, Break, Continue, Expr, Import, ImportFrom, Match -from .exprs import BoolOp, BinOp, UnaryOp, Lambda, IfExp, Dict, Set, ListComp, SetComp, DictComp, GeneratorExp, Await, Yield, YieldFrom, FormattedValue, JoinedStr, Constant, NamedExpr, Attribute, Subscript, Starred, Name, List, Tuple, Slice, Call, Compare, OpNode -from .astaux import ExceptHandler, Arguments, Arg, Keyword, Alias, WithItem, Comprehension -from .match import MatchCase, MatchValue, MatchSingleton, MatchSequence, MatchMapping, MatchClass, MatchStar, MatchAs, MatchOr -from .visitor import ASTVisitor -from .lexer import Lexer, _lexer_init, tokenize, new_lexer -from .parser import Parser, _parser_init, parse_tokens, new_parser -from .parser import _parse_test - -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr - -def parse(src: str, pool: memhub.MemManager | t.CPtr) -> AST | t.CPtr: pass - -def parse_expression(src: str, pool: memhub.MemManager | t.CPtr) -> AST | t.CPtr: pass diff --git a/.transpyc_cache/352a68eefae37a7c.doc.json b/.transpyc_cache/352a68eefae37a7c.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/352a68eefae37a7c.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/352a68eefae37a7c.pyi b/.transpyc_cache/352a68eefae37a7c.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/352a68eefae37a7c.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/39178dc5ba692b92.doc.json b/.transpyc_cache/39178dc5ba692b92.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/39178dc5ba692b92.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/39178dc5ba692b92.pyi b/.transpyc_cache/39178dc5ba692b92.pyi deleted file mode 100644 index 6b53248..0000000 --- a/.transpyc_cache/39178dc5ba692b92.pyi +++ /dev/null @@ -1,31 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - -import c - - -import t -import stdio -import string -import testcheck - -def test_strlen() -> t.CInt: pass - -def test_strcpy() -> t.CInt: pass - -def test_strcat() -> t.CInt: pass - -def test_strcmp() -> t.CInt: pass - -def test_strncpy() -> t.CInt: pass - -def test_char_access() -> t.CInt: pass - -def test_snprintf() -> t.CInt: pass - - -import w32.win32memory - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/3a56c52de621df8f.doc.json b/.transpyc_cache/3a56c52de621df8f.doc.json deleted file mode 100644 index 47b20d9..0000000 --- a/.transpyc_cache/3a56c52de621df8f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_get_external_func_param_ty": "获取外部函数第 param_idx 个参数的期望类型,None 表示用字面量原类型\n\n 对 Win32 API 函数的所有非指针参数返回 i64,匹配 declare 中\n ULONG/SIZE_T 被统一翻译为 i64 的情况。\n ", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/3a56c52de621df8f.pyi b/.transpyc_cache/3a56c52de621df8f.pyi deleted file mode 100644 index 5214419..0000000 --- a/.transpyc_cache/3a56c52de621df8f.pyi +++ /dev/null @@ -1,173 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _get_external_func_param_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str, param_idx: int) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/3a769816ec956305.doc.json b/.transpyc_cache/3a769816ec956305.doc.json deleted file mode 100644 index 86441ed..0000000 --- a/.transpyc_cache/3a769816ec956305.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名\n\n 特殊处理 __init__.py:includes/ast/__init__.py → ast(而非 ast.__init__)\n ", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/3a769816ec956305.pyi b/.transpyc_cache/3a769816ec956305.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/3a769816ec956305.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/3ab9ec935db9efeb.doc.json b/.transpyc_cache/3ab9ec935db9efeb.doc.json deleted file mode 100644 index d24160b..0000000 --- a/.transpyc_cache/3ab9ec935db9efeb.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"Translator": "翻译器:管理编译状态,委托 Handles 模块执行翻译", "Translator._init_state": "初始化变量表、函数表和子 Handle", "Translator.translate": "将 AST 翻译为 LLVM IR", "Translator._translate_wrapper_main": "委托 HandlesMain.create_wrapper_main() 创建包装 main(trans 单参)", "Translator._translate_module_level": "委托 HandlesMain.translate_children() 翻译模块级语句(trans 单参)", "Translator.dump_ir": "将 LLVM IR 输出到缓冲区\n\n mode: 0=完整, 1=stub(仅声明), 2=text(仅代码)\n ", "add_global_name": "添加一个 global 变量名", "is_global_name": "检查 name 是否在当前函数的 global 集合中", "add_nonlocal_name": "添加一个 nonlocal 变量名", "is_nonlocal_name": "检查 name 是否在当前函数的 nonlocal 集合中", "get_nonlocal_index": "获取 nonlocal 变量在 env 中的索引(0-based),找不到返回 -1", "clear_scope_names": "清空当前函数的 global/nonlocal 名称集合(进入新函数时调用)"} \ No newline at end of file diff --git a/.transpyc_cache/3ab9ec935db9efeb.pyi b/.transpyc_cache/3ab9ec935db9efeb.pyi deleted file mode 100644 index 0e885bf..0000000 --- a/.transpyc_cache/3ab9ec935db9efeb.pyi +++ /dev/null @@ -1,89 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesTranslator.py -Module: lib.core.Handles.HandlesTranslator -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesMain as HandlesMain -import lib.core.Handles.HandlesAssign as HandlesAssign -import lib.core.Handles.HandlesReturn as HandlesReturn -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesAnnAssign as HandlesAnnAssign -import lib.core.Handles.HandlesAugAssign as HandlesAugAssign -import lib.core.Handles.HandlesIf as HandlesIf -import lib.core.Handles.HandlesWhile as HandlesWhile -import lib.core.Handles.HandlesFor as HandlesFor -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesFunctions as HandlesFunctions -import lib.Projectrans.Config as Config - -MAX_VARS: t.CDefine = 256 -MAX_FUNCS: t.CDefine = 256 -MAX_GLOBAL_NAMES: t.CDefine = 32 - -@t.NoVTable -class Translator: - Module: llvmlite.LLVMModule | t.CPtr - Pool: memhub.MemBuddy | t.CPtr - _funcs: HandlesExprCall.FuncEntry | t.CPtr - _func_count: t.CInt - _imported_modules: str - _from_imports: str - _cur_func: llvmlite.Function | t.CPtr - _cur_builder: llvmlite.IRBuilder | t.CPtr - _break_bb: llvmlite.BasicBlock | t.CPtr - _continue_bb: llvmlite.BasicBlock | t.CPtr - _label_counter: t.CInt - _global_names: str - _global_name_count: t.CInt - _nonlocal_names: str - _nonlocal_name_count: t.CInt - _cur_func_name: str - ModuleSha1: str - _closure_env_offsets: t.CInt - _closure_env_count: t.CInt - GenericTypeParamNames: list[str] | t.CPtr - GenericTypeArgs: list[str] | t.CPtr - _declare_only: t.CInt - AssignH: HandlesAssign.AssignHandle | t.CPtr - ReturnH: HandlesReturn.ReturnHandle | t.CPtr - ImportsH: HandlesImports.ImportsHandle | t.CPtr - AnnAssignH: HandlesAnnAssign.AnnAssignHandle | t.CPtr - AugAssignH: HandlesAugAssign.AugAssignHandle | t.CPtr - IfH: HandlesIf.IfHandle | t.CPtr - WhileH: HandlesWhile.WhileHandle | t.CPtr - ForH: HandlesFor.ForHandle | t.CPtr - ExprH: HandlesExpr.ExprHandle | t.CPtr - ExprCallH: HandlesExprCall.ExprCallHandle | t.CPtr - SymTab: HandlesVar.SymbolTable | t.CPtr - def __init__(self: Translator) -> t.CInt: pass - def _init_state(self: Translator, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - def translate(self: Translator, tree: ast.AST | t.CPtr) -> int: pass - def _translate_wrapper_main(self: Translator, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, tree: ast.AST | t.CPtr, i32_ty: llvmlite.LLVMType | t.CPtr) -> t.CInt: pass - def _translate_module_level(self: Translator, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, tree: ast.AST | t.CPtr) -> t.CInt: pass - def dump_ir(self: Translator, buf: bytes, size: t.CSizeT, mode: int) -> t.CInt: pass - -def add_global_name(trans: HT.Translator | t.CPtr, name: str) -> t.CInt: pass - -def is_global_name(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def add_nonlocal_name(trans: HT.Translator | t.CPtr, name: str) -> t.CInt: pass - -def is_nonlocal_name(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def get_nonlocal_index(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def clear_scope_names(trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr \ No newline at end of file diff --git a/.transpyc_cache/3b76f342dcafa255.doc.json b/.transpyc_cache/3b76f342dcafa255.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/3b76f342dcafa255.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/3b76f342dcafa255.pyi b/.transpyc_cache/3b76f342dcafa255.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/3b76f342dcafa255.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/3c15289dd3f27ff8.doc.json b/.transpyc_cache/3c15289dd3f27ff8.doc.json deleted file mode 100644 index dda4745..0000000 --- a/.transpyc_cache/3c15289dd3f27ff8.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"get_func_name": "从函数节点提取函数名", "escape_llvm_string": "将字符串转换为 LLVM IR 字符串字面量 c\"...\\00\" ", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "get_llvm_float_bits": "获取 LLVM 浮点类型的位宽,非浮点类型返回 0", "is_ptr_type": "检查 ty 是否是 Ptr 类型,返回 1=是, 0=否", "_deref_if_ptr_ptr": "如果 obj_ptr 是 Ptr(Ptr(...)),load 解引用获取内层指针", "coerce_to_type": "将 val 强制转换为 target_ty\n\n 整数: sext(扩展)/ trunc(截断)\n 浮点: fpext(扩展)/ fptrunc(截断)\n int→float: sitofp\n float→int: fptosi\n ", "create_global_string": "创建全局字符串常量并返回 i8* bitcast", "translate_constant": "翻译常量(int/str/bool)", "_infer_elem_type_from_value": "从 LLVM Value 的类型推断 list 元素类型名", "_find_pool_var": "查找上下文中的 pool 变量,返回 alloca 或 None", "translate_list_literal": "翻译 list 字面量 [a, b, c] → list[T](pool) + append 序列", "translate_value": "翻译值表达式为 LLVM Value", "translate_compare": "翻译比较表达式,返回 i1 结果", "translate_unaryop": "翻译一元运算(-x, +x, not x, ~x)", "translate_boolop": "翻译布尔运算(and/or)的短路求值,返回 i1", "translate_name_value": "翻译变量引用(Name 节点)→ load", "ExprHandle": "表达式处理器:继承 Mixin 获得 Trans 回指针", "ExprHandle.HandleValue": "翻译值表达式,从 self.Trans 获取共享状态", "list_getitem_inline": "内联生成 list __getitem__ 逻辑,返回元素地址 (i8*)", "_list_elem_type_from_name": "从 list 类型名提取元素 LLVM 类型", "list_setitem_inline": "内联生成 list __setitem__ 逻辑,返回 0", "is_list_subscript": "检查 Subscript 节点是否是 list[T] 类型,返回 list 对象指针或 None", "translate_subscript": "翻译下标表达式,返回加载的元素值", "translate_attribute": "翻译属性访问,返回加载的字段值", "get_subscript_ptr": "获取下标表达式的元素指针(用于赋值 lhs)", "get_attribute_ptr": "获取属性访问的字段指针(用于赋值 lhs)"} \ No newline at end of file diff --git a/.transpyc_cache/3c15289dd3f27ff8.pyi b/.transpyc_cache/3c15289dd3f27ff8.pyi deleted file mode 100644 index c495a8e..0000000 --- a/.transpyc_cache/3c15289dd3f27ff8.pyi +++ /dev/null @@ -1,84 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExpr.py -Module: lib.core.Handles.HandlesExpr -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import llvmlite -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprOps as HandlesExprOps -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -def get_func_name(func_node: ast.AST | t.CPtr) -> str: pass - -def escape_llvm_string(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_llvm_float_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def is_ptr_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _deref_if_ptr_ptr(builder: llvmlite.IRBuilder | t.CPtr, obj_ptr: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def coerce_to_type(builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def create_global_string(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, str_val: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_constant(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_elem_type_from_value(pool: memhub.MemBuddy | t.CPtr, value: llvmlite.Value | t.CPtr) -> str: pass - -def _find_pool_var(trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_list_literal(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, elem_type_name: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_compare(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_unaryop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_boolop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_name_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -@t.NoVTable -class ExprHandle(HandlesBase.Mixin): - def __init__(self: ExprHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleValue(self: ExprHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def NewExprHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprHandle | t.CPtr: pass - -def list_getitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _list_elem_type_from_name(pool: memhub.MemBuddy | t.CPtr, struct_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def list_setitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr, rhs_val: llvmlite.Value | t.CPtr) -> int: pass - -def is_list_subscript(node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_subscript(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_attribute(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -import stdio - -def get_subscript_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_attribute_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/3c2fbc9e35ad3bf2.doc.json b/.transpyc_cache/3c2fbc9e35ad3bf2.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/3c2fbc9e35ad3bf2.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/3c2fbc9e35ad3bf2.pyi b/.transpyc_cache/3c2fbc9e35ad3bf2.pyi deleted file mode 100644 index c77b79f..0000000 --- a/.transpyc_cache/3c2fbc9e35ad3bf2.pyi +++ /dev/null @@ -1,22 +0,0 @@ -""" -Auto-generated Python stub file from func_test.py -Module: func_test -""" - - -import stdio -import t, c - -def add(a: int, b: int) -> int: pass - -def mul(a: int, b: int) -> int: pass - -def square(x: int) -> int: pass - -def factorial(n: int) -> int: pass - -def greet(greeting: str, name: str, times: int) -> int: pass - -def sub(a: int, b: int) -> int: pass - -def func_test() -> int: pass diff --git a/.transpyc_cache/3cd87018ba1e76bc.doc.json b/.transpyc_cache/3cd87018ba1e76bc.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/3cd87018ba1e76bc.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/3cd87018ba1e76bc.pyi b/.transpyc_cache/3cd87018ba1e76bc.pyi deleted file mode 100644 index 669f365..0000000 --- a/.transpyc_cache/3cd87018ba1e76bc.pyi +++ /dev/null @@ -1,108 +0,0 @@ -""" -Auto-generated Python stub file from test_numpy.py -Module: test_numpy -""" - - -from stdint import * -import numpy -from stdio import printf -from stdlib import calloc, free -import string -import vipermath -import memhub -import t, c - -EPS: t.CExtern | t.CDouble -EPS_LOOSE: t.CExtern | t.CDouble -SIMD_BLOCK: t.CExtern | t.CSizeT -arena: t.CExtern | t.CUInt8T | t.CPtr -pool: t.CExtern | memhub.MemPool | t.CPtr -test_passed: t.CExtern | t.CInt -test_failed: t.CExtern | t.CInt - -def check(name: str, condition: t.CInt, detail: str) -> t.CInt: pass - -def approx_eq(a: t.CDouble, b: t.CDouble) -> t.CInt: pass - -def approx_loose(a: t.CDouble, b: t.CDouble) -> t.CInt: pass - -def section_header(title: str) -> t.CInt: pass - -def section_footer() -> t.CInt: pass - -def vec4(p: memhub.MemPool | t.CPtr, v0: t.CDouble, v1: t.CDouble, v2: t.CDouble, v3: t.CDouble) -> numpy.ndarray | t.CPtr: pass - -def vec3(p: memhub.MemPool | t.CPtr, v0: t.CDouble, v1: t.CDouble, v2: t.CDouble) -> numpy.ndarray | t.CPtr: pass - -def vec2(p: memhub.MemPool | t.CPtr, v0: t.CDouble, v1: t.CDouble) -> numpy.ndarray | t.CPtr: pass - -def test_zeros_ones() -> t.CInt: pass - -def test_arange_linspace() -> t.CInt: pass - -def test_eye_diag() -> t.CInt: pass - -def test_sum_mean_min_max() -> t.CInt: pass - -def test_fill_copy() -> t.CInt: pass - -def test_add_sub_mul_div() -> t.CInt: pass - -def test_neg() -> t.CInt: pass - -def test_len() -> t.CInt: pass - -def test_scalar_ops() -> t.CInt: pass - -def test_math_funcs() -> t.CInt: pass - -def test_matmul() -> t.CInt: pass - -def test_dot() -> t.CInt: pass - -def test_transpose() -> t.CInt: pass - -def test_var_std_norm() -> t.CInt: pass - -def test_clip_concatenate() -> t.CInt: pass - -def test_sort_reverse() -> t.CInt: pass - -def test_print_arr() -> t.CInt: pass - -def test_floordiv_mod() -> t.CInt: pass - -def test_additional_math() -> t.CInt: pass - -def test_trig_hyperbolic() -> t.CInt: pass - -def test_degrees_radians() -> t.CInt: pass - -def test_cumsum_diff() -> t.CInt: pass - -def test_max_min_where() -> t.CInt: pass - -def test_flatten_trace() -> t.CInt: pass - -def test_outer() -> t.CInt: pass - -def test_bool_comparison() -> t.CInt: pass - -def test_linalg() -> t.CInt: pass - -def test_additional_creation() -> t.CInt: pass - -def test_interp() -> t.CInt: pass - -def test_numpy_edge() -> t.CInt: pass - -def bench_numpy_perf() -> t.CInt: pass - -def test_numpy_correct() -> t.CInt: pass - -def test_numpy_edge_main() -> t.CInt: pass - -def bench_numpy_main() -> t.CInt: pass - -def test_numpy_main() -> t.CInt: pass diff --git a/.transpyc_cache/3d3edda4a4e6c08b.doc.json b/.transpyc_cache/3d3edda4a4e6c08b.doc.json deleted file mode 100644 index 8c2a0a2..0000000 --- a/.transpyc_cache/3d3edda4a4e6c08b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"AssignHandle": "Assign 语句处理器:继承 Mixin 获得 Trans 回指针 + 共享方法"} \ No newline at end of file diff --git a/.transpyc_cache/3d3edda4a4e6c08b.pyi b/.transpyc_cache/3d3edda4a4e6c08b.pyi deleted file mode 100644 index ec65969..0000000 --- a/.transpyc_cache/3d3edda4a4e6c08b.pyi +++ /dev/null @@ -1,30 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesAssign.py -Module: lib.core.Handles.HandlesAssign -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct - -@t.NoVTable -class AssignHandle(HandlesBase.Mixin): - _CurrentClass: str - def __init__(self: AssignHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: AssignHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewAssignHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> AssignHandle | t.CPtr: pass diff --git a/.transpyc_cache/3e914ffe8cc3c120.doc.json b/.transpyc_cache/3e914ffe8cc3c120.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/3e914ffe8cc3c120.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/3f7c5e78d8652535.pyi b/.transpyc_cache/3f7c5e78d8652535.pyi deleted file mode 100644 index abe01c2..0000000 --- a/.transpyc_cache/3f7c5e78d8652535.pyi +++ /dev/null @@ -1,128 +0,0 @@ -""" -Auto-generated Python stub file from vipermath.py -Module: vipermath -""" - - -import t, c - -U_M_PI: t.CDefine = 3.14159265358979323846 -U_M_E: t.CDefine = 2.71828182845904523536 -U_M_PI_2: t.CDefine = 1.57079632679489661923 -U_M_PI_4: t.CDefine = 0.78539816339744830962 -U_M_1_PI: t.CDefine = 0.31830988618379067154 -U_M_2_PI: t.CDefine = 0.63661977236758134308 -U_M_LN2: t.CDefine = 0.69314718055994530942 -U_M_LN10: t.CDefine = 2.30258509299404568402 -U_M_2_SQRT_PI: t.CDefine = 1.77245385090551602730 - -def radians(degrees: t.CDouble) -> t.CDouble: pass - -def degrees(radians: t.CDouble) -> t.CDouble: pass - -def sin(x: t.CDouble) -> t.CDouble: pass - -def cos(x: t.CDouble) -> t.CDouble: pass - -def tan(x: t.CDouble) -> t.CDouble: pass - -def asin(x: t.CDouble) -> t.CDouble: pass - -def acos(x: t.CDouble) -> t.CDouble: pass - -def _atan_core(x: t.CDouble) -> t.CDouble: pass - -def atan(x: t.CDouble) -> t.CDouble: pass - -def atan2(y: t.CDouble, x: t.CDouble) -> t.CDouble: pass - -def sinh(x: t.CDouble) -> t.CDouble: pass - -def cosh(x: t.CDouble) -> t.CDouble: pass - -def tanh(x: t.CDouble) -> t.CDouble: pass - -def exp(x: t.CDouble) -> t.CDouble: pass - -def log(x: t.CDouble) -> t.CDouble: pass - -def sqrt(x: t.CDouble) -> t.CDouble: pass - -def abs(x: t.CInt) -> t.CInt: pass - -def fabs(x: t.CDouble) -> t.CDouble: pass - -def labs(x: t.CLong) -> t.CLong: pass - -def factorial(n: t.CInt) -> t.CDouble: pass - -def combination(n: t.CInt, k: t.CInt) -> t.CDouble: pass - -def permutation(n: t.CInt, k: t.CInt) -> t.CDouble: pass - -def pow(x: t.CDouble, y: t.CDouble) -> t.CDouble: pass - -def powf(x: t.CDouble, y: t.CDouble) -> t.CDouble: pass - -def cbrt(x: t.CDouble) -> t.CDouble: pass - -def hypot(x: t.CDouble, y: t.CDouble) -> t.CDouble: pass - -def floor(x: t.CDouble) -> t.CDouble: pass - -def ceil(x: t.CDouble) -> t.CDouble: pass - -def round(x: t.CDouble) -> t.CDouble: pass - -def trunc(x: t.CDouble) -> t.CDouble: pass - -def fmod(x: t.CDouble, y: t.CDouble) -> t.CDouble: pass - -def fmodf(x: float, y: float) -> float: pass - -def modf(x: t.CDouble, iptr: t.CDouble | t.CPtr) -> t.CDouble: pass - -def log10(x: t.CDouble) -> t.CDouble: pass - -def log2(x: t.CDouble) -> t.CDouble: pass - -def exp2(x: t.CDouble) -> t.CDouble: pass - -def expm1(x: t.CDouble) -> t.CDouble: pass - -def log1p(x: t.CDouble) -> t.CDouble: pass - -def asinh(x: t.CDouble) -> t.CDouble: pass - -def acosh(x: t.CDouble) -> t.CDouble: pass - -def atanh(x: t.CDouble) -> t.CDouble: pass - -def gamma(x: t.CDouble) -> t.CDouble: pass - -def erf(x: t.CDouble) -> t.CDouble: pass - -def erfc(x: t.CDouble) -> t.CDouble: pass - -def sqrtf(x: t.CFloat) -> t.CFloat: pass - -def sinf(x: t.CFloat) -> t.CFloat: pass - -def cosf(x: t.CFloat) -> t.CFloat: pass - -def tanf(x: t.CFloat) -> t.CFloat: pass - -def fabsf(x: t.CFloat) -> t.CFloat: pass - -def floorf(x: t.CFloat) -> t.CFloat: pass - -def ceilf(x: t.CFloat) -> t.CFloat: pass - - -class _U(t.CUnion): - d: t.CDouble - u: t.CUInt64T - -def isnan(x: t.CDouble) -> t.CStatic | t.CInt: pass - -def isinf(x: t.CDouble) -> t.CStatic | t.CInt: pass diff --git a/.transpyc_cache/4020cac9bab5e9f1.doc.json b/.transpyc_cache/4020cac9bab5e9f1.doc.json deleted file mode 100644 index 006cdc0..0000000 --- a/.transpyc_cache/4020cac9bab5e9f1.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"extract_func_attrs": "从 decorator_list 提取 c.Attribute 属性,返回 LLVM IR 属性字符串", "_get_attr_name_from_node": "从 AST 节点提取属性名\n\n 支持:\n - Call(func=Attribute(...)): t.attr.always_inline() -> \"always_inline\"\n - Attribute: t.attr.packed -> \"packed\"\n - Attribute(t.attr.llvm.xxx): t.attr.llvm.nounwind -> \"nounwind\"\n ", "_append_llvm_attr": "将属性名映射到 LLVM 属性名并追加到缓冲区\n\n 返回 1 表示已追加,0 表示不支持该属性\n ", "_append_str": "将字符串追加到 buf 末尾(用 strlen+strcpy 模拟 strcat)", "_mangle_name": "为任意名称添加 SHA1 前缀(不做 main/export 检查)", "_mangle_name_with_sha1": "用指定 SHA1 为名称添加前缀(不做 main/export 检查)", "_mangle_func_name": "为函数名添加 SHA1 前缀(检查 main/export)", "forward_declare_functions": "预扫描所有顶层 FunctionDef,创建前向声明", "translate_function_def": "翻译函数定义,返回新增的变量数(通常为 0,函数定义不增加当前作用域变量)", "translate_nested_function_def": "翻译嵌套函数定义:提升为顶层函数 + 创建闭包", "create_function": "创建 LLVM 函数并添加参数"} \ No newline at end of file diff --git a/.transpyc_cache/4020cac9bab5e9f1.pyi b/.transpyc_cache/4020cac9bab5e9f1.pyi deleted file mode 100644 index 2b7f43b..0000000 --- a/.transpyc_cache/4020cac9bab5e9f1.pyi +++ /dev/null @@ -1,45 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesFunctions.py -Module: lib.core.Handles.HandlesFunctions -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import viperlib -import stdio -import stdlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesBody as HandlesBody -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesImports as HandlesImports - -def extract_func_attrs(pool: memhub.MemBuddy | t.CPtr, decorator_list: list[ast.AST | t.CPtr] | t.CPtr, imported_modules: str) -> t.CChar | t.CPtr: pass - -def _get_attr_name_from_node(node: ast.AST | t.CPtr) -> str: pass - -def _append_llvm_attr(attrs_buf: t.CChar | t.CPtr, attr_name: str) -> int: pass - -def _append_str(buf: t.CChar | t.CPtr, s: str) -> None: pass - -def _mangle_name(trans: HT.Translator | t.CPtr, name: str) -> str: pass - -def _mangle_name_with_sha1(sha1: str, name: str) -> str: pass - -def _mangle_func_name(trans: HT.Translator | t.CPtr, name: str, has_export: int) -> str: pass - -def forward_declare_functions(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr) -> int: pass - -def translate_function_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_nested_function_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def create_function(pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, name: str, args_node: ast.AST | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Function | t.CPtr: pass diff --git a/.transpyc_cache/4031ec3fbcff0767.doc.json b/.transpyc_cache/4031ec3fbcff0767.doc.json deleted file mode 100644 index 8c2a0a2..0000000 --- a/.transpyc_cache/4031ec3fbcff0767.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"AssignHandle": "Assign 语句处理器:继承 Mixin 获得 Trans 回指针 + 共享方法"} \ No newline at end of file diff --git a/.transpyc_cache/4031ec3fbcff0767.pyi b/.transpyc_cache/4031ec3fbcff0767.pyi deleted file mode 100644 index 1e1b4bd..0000000 --- a/.transpyc_cache/4031ec3fbcff0767.pyi +++ /dev/null @@ -1,29 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesAssign.py -Module: lib.core.Handles.HandlesAssign -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType - -@t.NoVTable -class AssignHandle(HandlesBase.Mixin): - _CurrentClass: str - def __init__(self: AssignHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: AssignHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewAssignHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> AssignHandle | t.CPtr: pass diff --git a/.transpyc_cache/4175f14c5fbef360.doc.json b/.transpyc_cache/4175f14c5fbef360.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/4175f14c5fbef360.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/4175f14c5fbef360.pyi b/.transpyc_cache/4175f14c5fbef360.pyi deleted file mode 100644 index 209a287..0000000 --- a/.transpyc_cache/4175f14c5fbef360.pyi +++ /dev/null @@ -1,17 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -import t, c -from t import CInt, CExport, CPtr -from stdio import printf -import memhub -import stdlib -import string -from ast import AST, ASTKind, Module, FunctionDef, Assign, If, For, While, With, Return, Expr, Name, Constant, BinOp, UnaryOp, Call, Compare, Import, ImportFrom, Expression, CONST_INT, CONST_STR, CONST_BOOL, CONST_NONE, OpKind, ASTCtx, FLAG_IS_ASYNC, parse, parse_expression, dump - -ARENA_SIZE: t.CExtern | CInt - -def main() -> CInt | CExport: pass diff --git a/.transpyc_cache/42ced27d9e76aef5.pyi b/.transpyc_cache/42ced27d9e76aef5.pyi deleted file mode 100644 index f1d44b9..0000000 --- a/.transpyc_cache/42ced27d9e76aef5.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from ctraits.py -Module: ctraits -""" - -import c - - -import t - -def isptr(x: t.CType) -> bool: pass diff --git a/.transpyc_cache/4337fb260448bbe2.pyi b/.transpyc_cache/4337fb260448bbe2.pyi deleted file mode 100644 index 7ed88bd..0000000 --- a/.transpyc_cache/4337fb260448bbe2.pyi +++ /dev/null @@ -1,73 +0,0 @@ -""" -Auto-generated Python stub file from ast.astaux.py -Module: ast.astaux -""" - - -import t, c -from stdint import * -import memhub -import string -from .base import AST, ASTKind, _init_ast, _copy_str, _set_parent_list, _emit, _emit_str, _emit_int, _dump_list - -class ExceptHandler(AST): - type: AST | t.CPtr - name: str - def __new__(self: ExceptHandler, pool: memhub.MemManager | t.CPtr, type: AST | t.CPtr, name: str) -> t.CInt: pass - def __init__(self: ExceptHandler, pool: memhub.MemManager | t.CPtr, type: AST | t.CPtr, name: str) -> t.CInt: pass - def kind(self: ExceptHandler) -> t.CInt: pass - def type_name(self: ExceptHandler) -> str: pass - def dump(self: ExceptHandler, buf: bytes, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Arguments(AST): - args: list[AST | t.CPtr] | t.CPtr - vararg: AST | t.CPtr - kwarg: AST | t.CPtr - defaults: list[AST | t.CPtr] | t.CPtr - kw_defaults: list[AST | t.CPtr] | t.CPtr - def __new__(self: Arguments, pool: memhub.MemManager | t.CPtr, args: list[AST | t.CPtr] | t.CPtr, vararg: AST | t.CPtr, kwarg: AST | t.CPtr, defaults: list[AST | t.CPtr] | t.CPtr, kw_defaults: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: Arguments, pool: memhub.MemManager | t.CPtr, args: list[AST | t.CPtr] | t.CPtr, vararg: AST | t.CPtr, kwarg: AST | t.CPtr, defaults: list[AST | t.CPtr] | t.CPtr, kw_defaults: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: Arguments) -> t.CInt: pass - def type_name(self: Arguments) -> str: pass - def dump(self: Arguments, buf: bytes, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Arg(AST): - arg: str - annotation: AST | t.CPtr - def __new__(self: Arg, pool: memhub.MemManager | t.CPtr, arg: str, annotation: AST | t.CPtr) -> t.CInt: pass - def __init__(self: Arg, pool: memhub.MemManager | t.CPtr, arg: str, annotation: AST | t.CPtr) -> t.CInt: pass - def kind(self: Arg) -> t.CInt: pass - def type_name(self: Arg) -> str: pass - def dump(self: Arg, buf: bytes, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Keyword(AST): - arg: str - value: AST | t.CPtr - def __new__(self: Keyword, pool: memhub.MemManager | t.CPtr, arg: str, value: AST | t.CPtr) -> t.CInt: pass - def __init__(self: Keyword, pool: memhub.MemManager | t.CPtr, arg: str, value: AST | t.CPtr) -> t.CInt: pass - def kind(self: Keyword) -> t.CInt: pass - def type_name(self: Keyword) -> str: pass - def dump(self: Keyword, buf: bytes, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Alias(AST): - name: str - asname: str - def __new__(self: Alias, pool: memhub.MemManager | t.CPtr, name: str, asname: str) -> t.CInt: pass - def __init__(self: Alias, pool: memhub.MemManager | t.CPtr, name: str, asname: str) -> t.CInt: pass - def kind(self: Alias) -> t.CInt: pass - def type_name(self: Alias) -> str: pass - def dump(self: Alias, buf: bytes, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class WithItem(AST): - context_expr: AST | t.CPtr - optional_vars: AST | t.CPtr - def __new__(self: WithItem, pool: memhub.MemManager | t.CPtr, context_expr: AST | t.CPtr, optional_vars: AST | t.CPtr) -> t.CInt: pass - def __init__(self: WithItem, pool: memhub.MemManager | t.CPtr, context_expr: AST | t.CPtr, optional_vars: AST | t.CPtr) -> t.CInt: pass - def kind(self: WithItem) -> t.CInt: pass - def type_name(self: WithItem) -> str: pass - def dump(self: WithItem, buf: bytes, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Comprehension(AST): - target: AST | t.CPtr - iter: AST | t.CPtr - ifs: list[AST | t.CPtr] | t.CPtr - is_async: t.CInt - def __new__(self: Comprehension, pool: memhub.MemManager | t.CPtr, target: AST | t.CPtr, iter: AST | t.CPtr, ifs: list[AST | t.CPtr] | t.CPtr, is_async: t.CInt) -> t.CInt: pass - def __init__(self: Comprehension, pool: memhub.MemManager | t.CPtr, target: AST | t.CPtr, iter: AST | t.CPtr, ifs: list[AST | t.CPtr] | t.CPtr, is_async: t.CInt) -> t.CInt: pass - def kind(self: Comprehension) -> t.CInt: pass - def type_name(self: Comprehension) -> str: pass - def dump(self: Comprehension, buf: bytes, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass \ No newline at end of file diff --git a/.transpyc_cache/43b4b8f6ce3ed278.doc.json b/.transpyc_cache/43b4b8f6ce3ed278.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/43b4b8f6ce3ed278.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/43b4b8f6ce3ed278.pyi b/.transpyc_cache/43b4b8f6ce3ed278.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/43b4b8f6ce3ed278.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/440f18f9dce85a95.doc.json b/.transpyc_cache/440f18f9dce85a95.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/440f18f9dce85a95.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/440f18f9dce85a95.pyi b/.transpyc_cache/440f18f9dce85a95.pyi deleted file mode 100644 index 0b2c4a4..0000000 --- a/.transpyc_cache/440f18f9dce85a95.pyi +++ /dev/null @@ -1,52 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - -import c - - -import t -import stdio -import testcheck - -def test_nonlocal_conditional() -> t.CInt: pass - -def test_nonlocal_multi_var() -> t.CInt: pass - - -g_counter: t.CExtern | t.CInt - -def inc_global() -> t.CInt: pass - -def add_global(n: t.CInt) -> t.CInt: pass - -def test_global_cross_functions() -> t.CInt: pass - -def test_nested_ref_capture() -> t.CInt: pass - -def test_lambda_capture_then_modify() -> t.CInt: pass - -def test_nonlocal_loop_accumulate() -> t.CInt: pass - -def test_deep_nested_vars() -> t.CInt: pass - - -g_state: t.CExtern | t.CInt - -def test_global_nonlocal_same_func() -> t.CInt: pass - -def test_lambda_default_and_capture() -> t.CInt: pass - -def test_nested_accumulate() -> t.CInt: pass - -def test_nonlocal_while() -> t.CInt: pass - - -class Point: - x: t.CInt - y: t.CInt - -def test_nested_modify_struct() -> t.CInt: pass - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/451745df21e598af.pyi b/.transpyc_cache/451745df21e598af.pyi deleted file mode 100644 index b3bfb92..0000000 --- a/.transpyc_cache/451745df21e598af.pyi +++ /dev/null @@ -1,52 +0,0 @@ -""" -Auto-generated Python stub file from zlib.zinflate.py -Module: zlib.zinflate -""" - - -from stdint import * -import zlib.zchecksum as zchecksum -import zlib.zdef as zdef -import zlib.zhuff as zhuff -import string -import memhub -import t, c - -@t.Object -class zinflate_stream: - pool: memhub.MemManager | t.CPtr - reader: zdef.zbit_reader - window: BYTEPTR - window_pos: t.CInt - window_size: t.CInt - wbits: t.CInt - is_finished: t.CInt - is_initialized: t.CInt - header_parsed: t.CInt - is_gzip: t.CInt - adler: t.CUInt32T - crc: t.CUInt32T - output: BYTEPTR - output_len: t.CSizeT - output_cap: t.CSizeT - input_data: t.CConst | BYTEPTR - input_len: t.CSizeT - input_pos: t.CSizeT - max_length: t.CSizeT - def __init__(self: zinflate_stream) -> t.CInt: pass - def output_byte(self: zinflate_stream, byte: BYTE) -> t.CInt: pass - def parse_header(self: zinflate_stream) -> t.CInt: pass - def read_bits_from_input(self: zinflate_stream, nbits: t.CInt, out: UINTPTR) -> t.CInt: pass - def read_huffman(self: zinflate_stream, dt: zhuff.zhuff_decode_tree | t.CPtr) -> t.CInt: pass - def inflate_block_stored(self: zinflate_stream) -> t.CInt: pass - def inflate_block_fixed(self: zinflate_stream) -> t.CInt: pass - def inflate_block_dynamic(self: zinflate_stream) -> t.CInt: pass - def inflate_stream(self: zinflate_stream) -> t.CInt: pass - def decompress(self: zinflate_stream, data: UINT8PTR, length: t.CSizeT, max_length: t.CSizeT, out: t.CUInt8T | t.CPtr[t.CPtr], out_len: t.CSizeT | t.CPtr) -> t.CInt: pass - def set_dictionary(self: zinflate_stream, dict: UINT8PTR, length: t.CSizeT) -> t.CInt: pass - def copy(self: zinflate_stream) -> zinflate_stream | t.CPtr: pass - def destroy(self: zinflate_stream) -> t.CInt: pass - -def zinflate_one_shot(pool: memhub.MemManager | t.CPtr, data: UINT8PTR, length: t.CSizeT, wbits: t.CInt, bufsize: t.CSizeT, out_len: t.CSizeT | t.CPtr) -> t.CUInt8T | t.CPtr: pass - -def zinflate_create(pool: memhub.MemManager | t.CPtr, wbits: t.CInt) -> zinflate_stream | t.CPtr: pass diff --git a/.transpyc_cache/45242e16a6829016.doc.json b/.transpyc_cache/45242e16a6829016.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/45242e16a6829016.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/45242e16a6829016.pyi b/.transpyc_cache/45242e16a6829016.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/45242e16a6829016.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/47767b5026a8ee15.pyi b/.transpyc_cache/47767b5026a8ee15.pyi deleted file mode 100644 index 7890f3d..0000000 --- a/.transpyc_cache/47767b5026a8ee15.pyi +++ /dev/null @@ -1,241 +0,0 @@ -""" -Auto-generated Python stub file from ast.exprs.py -Module: ast.exprs -""" - - -import t, c -from stdint import * -import memhub -import string -from .base import AST, ASTKind, ASTCtx, OpKind, _init_ast, _copy_str, _set_parent_list, _emit, _emit_str, _emit_int, _dump_list, _dump_op_list, _op_name, CONST_INT, CONST_FLOAT, CONST_STR, CONST_BOOL, CONST_NONE - -class Name(AST): - id: str - ctx: t.CInt - def __new__(self: Name, pool: memhub.MemManager | t.CPtr, id: str, ctx: t.CInt) -> t.CInt: pass - def __init__(self: Name, pool: memhub.MemManager | t.CPtr, id: str, ctx: t.CInt) -> t.CInt: pass - def kind(self: Name) -> t.CInt: pass - def type_name(self: Name) -> str: pass - def dump(self: Name, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Constant(AST): - int_val: t.CInt64T - float_val: t.CDouble - str_val: str - const_kind: t.CInt - def __new__(self: Constant, pool: memhub.MemManager | t.CPtr, const_kind: t.CInt, int_val: t.CInt64T, float_val: t.CDouble, str_val: str, lineno: t.CInt, col: t.CInt) -> t.CInt: pass - def __init__(self: Constant, pool: memhub.MemManager | t.CPtr, const_kind: t.CInt, int_val: t.CInt64T, float_val: t.CDouble, str_val: str, lineno: t.CInt, col: t.CInt) -> t.CInt: pass - def kind(self: Constant) -> t.CInt: pass - def type_name(self: Constant) -> str: pass - def dump(self: Constant, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class BinOp(AST): - left: AST | t.CPtr - op: t.CInt - right: AST | t.CPtr - def __new__(self: BinOp, pool: memhub.MemManager | t.CPtr, left: AST | t.CPtr, op: t.CInt, right: AST | t.CPtr) -> t.CInt: pass - def __init__(self: BinOp, pool: memhub.MemManager | t.CPtr, left: AST | t.CPtr, op: t.CInt, right: AST | t.CPtr) -> t.CInt: pass - def kind(self: BinOp) -> t.CInt: pass - def type_name(self: BinOp) -> str: pass - def dump(self: BinOp, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class UnaryOp(AST): - op: t.CInt - operand: AST | t.CPtr - def __new__(self: UnaryOp, pool: memhub.MemManager | t.CPtr, op: t.CInt, operand: AST | t.CPtr) -> t.CInt: pass - def __init__(self: UnaryOp, pool: memhub.MemManager | t.CPtr, op: t.CInt, operand: AST | t.CPtr) -> t.CInt: pass - def kind(self: UnaryOp) -> t.CInt: pass - def type_name(self: UnaryOp) -> str: pass - def dump(self: UnaryOp, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Compare(AST): - left: AST | t.CPtr - ops: t.CPtr - comparators: list[AST | t.CPtr] | t.CPtr - def __new__(self: Compare, pool: memhub.MemManager | t.CPtr, left: AST | t.CPtr, ops: t.CPtr, comparators: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: Compare, pool: memhub.MemManager | t.CPtr, left: AST | t.CPtr, ops: t.CPtr, comparators: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: Compare) -> t.CInt: pass - def type_name(self: Compare) -> str: pass - def dump(self: Compare, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Call(AST): - func: AST | t.CPtr - args: list[AST | t.CPtr] | t.CPtr - keywords: list[AST | t.CPtr] | t.CPtr - def __new__(self: Call, pool: memhub.MemManager | t.CPtr, func: AST | t.CPtr, args: list[AST | t.CPtr] | t.CPtr, keywords: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: Call, pool: memhub.MemManager | t.CPtr, func: AST | t.CPtr, args: list[AST | t.CPtr] | t.CPtr, keywords: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: Call) -> t.CInt: pass - def type_name(self: Call) -> str: pass - def dump(self: Call, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class BoolOp(AST): - op: t.CInt - values: list[AST | t.CPtr] | t.CPtr - def __new__(self: BoolOp, pool: memhub.MemManager | t.CPtr, op: t.CInt, values: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: BoolOp, pool: memhub.MemManager | t.CPtr, op: t.CInt, values: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: BoolOp) -> t.CInt: pass - def type_name(self: BoolOp) -> str: pass - def dump(self: BoolOp, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Lambda(AST): - args: AST | t.CPtr - body: AST | t.CPtr - def __new__(self: Lambda, pool: memhub.MemManager | t.CPtr, args: AST | t.CPtr, body: AST | t.CPtr) -> t.CInt: pass - def __init__(self: Lambda, pool: memhub.MemManager | t.CPtr, args: AST | t.CPtr, body: AST | t.CPtr) -> t.CInt: pass - def kind(self: Lambda) -> t.CInt: pass - def type_name(self: Lambda) -> str: pass - def dump(self: Lambda, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class IfExp(AST): - test: AST | t.CPtr - body: AST | t.CPtr - orelse: AST | t.CPtr - def __new__(self: IfExp, pool: memhub.MemManager | t.CPtr, test: AST | t.CPtr, body: AST | t.CPtr, orelse: AST | t.CPtr) -> t.CInt: pass - def __init__(self: IfExp, pool: memhub.MemManager | t.CPtr, test: AST | t.CPtr, body: AST | t.CPtr, orelse: AST | t.CPtr) -> t.CInt: pass - def kind(self: IfExp) -> t.CInt: pass - def type_name(self: IfExp) -> str: pass - def dump(self: IfExp, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Dict(AST): - keys: list[AST | t.CPtr] | t.CPtr - values: list[AST | t.CPtr] | t.CPtr - def __new__(self: Dict, pool: memhub.MemManager | t.CPtr, keys: list[AST | t.CPtr] | t.CPtr, values: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: Dict, pool: memhub.MemManager | t.CPtr, keys: list[AST | t.CPtr] | t.CPtr, values: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: Dict) -> t.CInt: pass - def type_name(self: Dict) -> str: pass - def dump(self: Dict, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Set(AST): - elts: list[AST | t.CPtr] | t.CPtr - def __new__(self: Set, pool: memhub.MemManager | t.CPtr, elts: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: Set, pool: memhub.MemManager | t.CPtr, elts: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: Set) -> t.CInt: pass - def type_name(self: Set) -> str: pass - def dump(self: Set, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class ListComp(AST): - elt: AST | t.CPtr - generators: list[AST | t.CPtr] | t.CPtr - def __new__(self: ListComp, pool: memhub.MemManager | t.CPtr, elt: AST | t.CPtr, generators: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: ListComp, pool: memhub.MemManager | t.CPtr, elt: AST | t.CPtr, generators: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: ListComp) -> t.CInt: pass - def type_name(self: ListComp) -> str: pass - def dump(self: ListComp, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class SetComp(AST): - elt: AST | t.CPtr - generators: list[AST | t.CPtr] | t.CPtr - def __new__(self: SetComp, pool: memhub.MemManager | t.CPtr, elt: AST | t.CPtr, generators: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: SetComp, pool: memhub.MemManager | t.CPtr, elt: AST | t.CPtr, generators: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: SetComp) -> t.CInt: pass - def type_name(self: SetComp) -> str: pass - def dump(self: SetComp, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class DictComp(AST): - key: AST | t.CPtr - value: AST | t.CPtr - generators: list[AST | t.CPtr] | t.CPtr - def __new__(self: DictComp, pool: memhub.MemManager | t.CPtr, key: AST | t.CPtr, value: AST | t.CPtr, generators: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: DictComp, pool: memhub.MemManager | t.CPtr, key: AST | t.CPtr, value: AST | t.CPtr, generators: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: DictComp) -> t.CInt: pass - def type_name(self: DictComp) -> str: pass - def dump(self: DictComp, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class GeneratorExp(AST): - elt: AST | t.CPtr - generators: list[AST | t.CPtr] | t.CPtr - def __new__(self: GeneratorExp, pool: memhub.MemManager | t.CPtr, elt: AST | t.CPtr, generators: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: GeneratorExp, pool: memhub.MemManager | t.CPtr, elt: AST | t.CPtr, generators: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: GeneratorExp) -> t.CInt: pass - def type_name(self: GeneratorExp) -> str: pass - def dump(self: GeneratorExp, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Await(AST): - value: AST | t.CPtr - def __new__(self: Await, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def __init__(self: Await, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def kind(self: Await) -> t.CInt: pass - def type_name(self: Await) -> str: pass - def dump(self: Await, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Yield(AST): - value: AST | t.CPtr - def __new__(self: Yield, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def __init__(self: Yield, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def kind(self: Yield) -> t.CInt: pass - def type_name(self: Yield) -> str: pass - def dump(self: Yield, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class YieldFrom(AST): - value: AST | t.CPtr - def __new__(self: YieldFrom, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def __init__(self: YieldFrom, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def kind(self: YieldFrom) -> t.CInt: pass - def type_name(self: YieldFrom) -> str: pass - def dump(self: YieldFrom, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class FormattedValue(AST): - value: AST | t.CPtr - conversion: t.CInt - format_spec: AST | t.CPtr - def __new__(self: FormattedValue, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr, conversion: t.CInt, format_spec: AST | t.CPtr) -> t.CInt: pass - def __init__(self: FormattedValue, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr, conversion: t.CInt, format_spec: AST | t.CPtr) -> t.CInt: pass - def kind(self: FormattedValue) -> t.CInt: pass - def type_name(self: FormattedValue) -> str: pass - def dump(self: FormattedValue, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class JoinedStr(AST): - values: list[AST | t.CPtr] | t.CPtr - def __new__(self: JoinedStr, pool: memhub.MemManager | t.CPtr, values: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: JoinedStr, pool: memhub.MemManager | t.CPtr, values: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: JoinedStr) -> t.CInt: pass - def type_name(self: JoinedStr) -> str: pass - def dump(self: JoinedStr, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Attribute(AST): - value: AST | t.CPtr - attr: str - ctx: t.CInt - def __new__(self: Attribute, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr, attr: str, ctx: t.CInt) -> t.CInt: pass - def __init__(self: Attribute, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr, attr: str, ctx: t.CInt) -> t.CInt: pass - def kind(self: Attribute) -> t.CInt: pass - def type_name(self: Attribute) -> str: pass - def dump(self: Attribute, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Subscript(AST): - value: AST | t.CPtr - slice: AST | t.CPtr - ctx: t.CInt - def __new__(self: Subscript, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr, slice: AST | t.CPtr, ctx: t.CInt) -> t.CInt: pass - def __init__(self: Subscript, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr, slice: AST | t.CPtr, ctx: t.CInt) -> t.CInt: pass - def kind(self: Subscript) -> t.CInt: pass - def type_name(self: Subscript) -> str: pass - def dump(self: Subscript, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Starred(AST): - value: AST | t.CPtr - ctx: t.CInt - def __new__(self: Starred, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr, ctx: t.CInt) -> t.CInt: pass - def __init__(self: Starred, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr, ctx: t.CInt) -> t.CInt: pass - def kind(self: Starred) -> t.CInt: pass - def type_name(self: Starred) -> str: pass - def dump(self: Starred, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class List(AST): - elts: list[AST | t.CPtr] | t.CPtr - ctx: t.CInt - def __new__(self: List, pool: memhub.MemManager | t.CPtr, elts: list[AST | t.CPtr] | t.CPtr, ctx: t.CInt) -> t.CInt: pass - def __init__(self: List, pool: memhub.MemManager | t.CPtr, elts: list[AST | t.CPtr] | t.CPtr, ctx: t.CInt) -> t.CInt: pass - def kind(self: List) -> t.CInt: pass - def type_name(self: List) -> str: pass - def dump(self: List, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Tuple(AST): - elts: list[AST | t.CPtr] | t.CPtr - ctx: t.CInt - def __new__(self: Tuple, pool: memhub.MemManager | t.CPtr, elts: list[AST | t.CPtr] | t.CPtr, ctx: t.CInt) -> t.CInt: pass - def __init__(self: Tuple, pool: memhub.MemManager | t.CPtr, elts: list[AST | t.CPtr] | t.CPtr, ctx: t.CInt) -> t.CInt: pass - def kind(self: Tuple) -> t.CInt: pass - def type_name(self: Tuple) -> str: pass - def dump(self: Tuple, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Slice(AST): - lower: AST | t.CPtr - upper: AST | t.CPtr - step: AST | t.CPtr - def __new__(self: Slice, pool: memhub.MemManager | t.CPtr, lower: AST | t.CPtr, upper: AST | t.CPtr, step: AST | t.CPtr) -> t.CInt: pass - def __init__(self: Slice, pool: memhub.MemManager | t.CPtr, lower: AST | t.CPtr, upper: AST | t.CPtr, step: AST | t.CPtr) -> t.CInt: pass - def kind(self: Slice) -> t.CInt: pass - def type_name(self: Slice) -> str: pass - def dump(self: Slice, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class NamedExpr(AST): - target: AST | t.CPtr - value: AST | t.CPtr - def __new__(self: NamedExpr, pool: memhub.MemManager | t.CPtr, target: AST | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def __init__(self: NamedExpr, pool: memhub.MemManager | t.CPtr, target: AST | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def kind(self: NamedExpr) -> t.CInt: pass - def type_name(self: NamedExpr) -> str: pass - def dump(self: NamedExpr, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class OpNode(AST): - op: t.CInt - def __new__(self: OpNode, pool: memhub.MemManager | t.CPtr, op: t.CInt) -> t.CInt: pass - def __init__(self: OpNode, pool: memhub.MemManager | t.CPtr, op: t.CInt) -> t.CInt: pass - def kind(self: OpNode) -> t.CInt: pass - def type_name(self: OpNode) -> str: pass - def dump(self: OpNode, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass \ No newline at end of file diff --git a/.transpyc_cache/48dd999d59d8c008.doc.json b/.transpyc_cache/48dd999d59d8c008.doc.json deleted file mode 100644 index efa98af..0000000 --- a/.transpyc_cache/48dd999d59d8c008.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"get_func_name": "从函数节点提取函数名", "escape_llvm_string": "将字符串转换为 LLVM IR 字符串字面量 c\"...\\00\" ", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "get_llvm_float_bits": "获取 LLVM 浮点类型的位宽,非浮点类型返回 0", "is_ptr_type": "检查 ty 是否是 Ptr 类型,返回 1=是, 0=否", "_deref_if_ptr_ptr": "如果 obj_ptr 是 Ptr(Ptr(...)),load 解引用获取内层指针", "coerce_to_type": "将 val 强制转换为 target_ty\n\n 整数: sext(扩展)/ trunc(截断)\n 浮点: fpext(扩展)/ fptrunc(截断)\n int→float: sitofp\n float→int: fptosi\n ", "create_global_string": "创建全局字符串常量并返回 i8* bitcast", "translate_constant": "翻译常量(int/str/bool)", "translate_value": "翻译值表达式为 LLVM Value", "translate_compare": "翻译比较表达式,返回 i1 结果", "translate_unaryop": "翻译一元运算(-x, +x, not x, ~x)", "translate_boolop": "翻译布尔运算(and/or)的短路求值,返回 i1", "translate_name_value": "翻译变量引用(Name 节点)→ load", "ExprHandle": "表达式处理器:继承 Mixin 获得 Trans 回指针", "ExprHandle.HandleValue": "翻译值表达式,从 self.Trans 获取共享状态", "list_getitem_inline": "内联生成 list __getitem__ 逻辑,返回元素值", "list_setitem_inline": "内联生成 list __setitem__ 逻辑,返回 0", "is_list_subscript": "检查 Subscript 节点是否是 list[T] 类型,返回 list 对象指针或 None", "translate_subscript": "翻译下标表达式,返回加载的元素值", "translate_attribute": "翻译属性访问,返回加载的字段值", "get_subscript_ptr": "获取下标表达式的元素指针(用于赋值 lhs)", "get_attribute_ptr": "获取属性访问的字段指针(用于赋值 lhs)"} \ No newline at end of file diff --git a/.transpyc_cache/48dd999d59d8c008.pyi b/.transpyc_cache/48dd999d59d8c008.pyi deleted file mode 100644 index 4727f86..0000000 --- a/.transpyc_cache/48dd999d59d8c008.pyi +++ /dev/null @@ -1,75 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExpr.py -Module: lib.core.Handles.HandlesExpr -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import llvmlite -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprOps as HandlesExprOps -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -def get_func_name(func_node: ast.AST | t.CPtr) -> str: pass - -def escape_llvm_string(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_llvm_float_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def is_ptr_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _deref_if_ptr_ptr(builder: llvmlite.IRBuilder | t.CPtr, obj_ptr: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def coerce_to_type(builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def create_global_string(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, str_val: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_constant(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_compare(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_unaryop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_boolop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_name_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -@t.NoVTable -class ExprHandle(HandlesBase.Mixin): - def __init__(self: ExprHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleValue(self: ExprHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def NewExprHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprHandle | t.CPtr: pass - -def list_getitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def list_setitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr, rhs_val: llvmlite.Value | t.CPtr) -> int: pass - -def is_list_subscript(node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_subscript(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_attribute(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -import stdio - -def get_subscript_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_attribute_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/48fa8cc758d3826b.doc.json b/.transpyc_cache/48fa8cc758d3826b.doc.json deleted file mode 100644 index ac292ab..0000000 --- a/.transpyc_cache/48fa8cc758d3826b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"ForHandle": "for 循环语句处理器:继承 Mixin 获得 Trans 回指针", "ForHandle.Handle": "翻译 for i in range(...) 循环语句", "ForHandle._handle_ptr_iter": "指针迭代: for x in ptr: 直到解引用为空"} \ No newline at end of file diff --git a/.transpyc_cache/48fa8cc758d3826b.pyi b/.transpyc_cache/48fa8cc758d3826b.pyi deleted file mode 100644 index 08527b9..0000000 --- a/.transpyc_cache/48fa8cc758d3826b.pyi +++ /dev/null @@ -1,28 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesFor.py -Module: lib.core.Handles.HandlesFor -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesBody as HandlesBody -import lib.core.Handles.HandlesType as HandlesType - -@t.NoVTable -class ForHandle(HandlesBase.Mixin): - def __init__(self: ForHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: ForHandle, node: ast.AST | t.CPtr) -> int: pass - def _handle_ptr_iter(self: ForHandle, for_node: ast.For | t.CPtr, var_name: str) -> int: pass - -def NewForHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ForHandle | t.CPtr: pass diff --git a/.transpyc_cache/494eeec1e4c2f2ec.doc.json b/.transpyc_cache/494eeec1e4c2f2ec.doc.json deleted file mode 100644 index 95e17f3..0000000 --- a/.transpyc_cache/494eeec1e4c2f2ec.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/494eeec1e4c2f2ec.pyi b/.transpyc_cache/494eeec1e4c2f2ec.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/494eeec1e4c2f2ec.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/49cae05490a513cb.doc.json b/.transpyc_cache/49cae05490a513cb.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/49cae05490a513cb.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/49cae05490a513cb.pyi b/.transpyc_cache/49cae05490a513cb.pyi deleted file mode 100644 index e1af96b..0000000 --- a/.transpyc_cache/49cae05490a513cb.pyi +++ /dev/null @@ -1,19 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - -import t -import c - - -import stdio -import stdint -import zc.config as config -import zc.test as test -import zc.logic_test as logic -import zc.class_test as class_test -import testcheck -import test_numpy - -def main() -> stdint.INT: pass diff --git a/.transpyc_cache/49cf633017627a4a.doc.json b/.transpyc_cache/49cf633017627a4a.doc.json deleted file mode 100644 index 3e3ec7a..0000000 --- a/.transpyc_cache/49cf633017627a4a.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"Load_project_config": "加载工程配置文件(project.vpj)\n\n Args:\n path: 配置文件路径\n\n Returns:\n 0 表示成功,非 0 表示失败\n ", "_join_flags_array": "将 JSON 字符串数组拼接成空格分隔的字符串\n\n 用于 linker.flags 和 compiler.flags 数组。\n 用 while + 索引遍历,避免 list 迭代器 bug。\n\n Args:\n flags_val: JsonValue,应为字符串数组\n\n Returns:\n 空格分隔的字符串,或 None 如果 flags_val 为 None 或非数组或空数组\n ", "_join_path": "将相对路径与 project_dir 拼接为绝对路径\n\n - ./App + Test → Test/App\n - ./temp + Test → Test/temp\n - ../includes + Test → Test/../includes(OS 解析为 includes)\n - 绝对路径保持不变\n - None 返回 None\n ", "resolve_paths": "解析并规范化工程路径(src/temp/output/includes)\n\n 将 project.vpj 中的相对路径(以 ./ 开头)转换为基于 project_dir 的路径。\n\n Args:\n project_dir: 工程根目录(project.vpj 所在目录)\n\n Returns:\n 0 表示成功,非 0 表示失败\n ", "get_includes_binary_dir": "获取 includes.binary 目录路径(includes 目录 + .binary 后缀)\n\n includes 目录如 ../includes,则 includes.binary 为 ../includes.binary\n ", "print_config": "打印当前配置(调试用)"} \ No newline at end of file diff --git a/.transpyc_cache/49cf633017627a4a.pyi b/.transpyc_cache/49cf633017627a4a.pyi deleted file mode 100644 index 0ff98b1..0000000 --- a/.transpyc_cache/49cf633017627a4a.pyi +++ /dev/null @@ -1,44 +0,0 @@ -""" -Auto-generated Python stub file from lib.Projectrans.Config.py -Module: lib.Projectrans.Config -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import viperlib -from json.__parser import parse as json_parse -from json import JsonValue, JSON_OBJECT, JSON_INT -import w32.fileio as fileio - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SourceDir: t.CExtern | str -TempDir: t.CExtern | str -OutputDir: t.CExtern | str -ProjectName: t.CExtern | str -ProjectVersion: t.CExtern | str -CompilerCmd: t.CExtern | str -CompilerFlags: t.CExtern | str -LinkerCmd: t.CExtern | str -LinkerFlags: t.CExtern | str -LinkerOutput: t.CExtern | str -TargetTriple: t.CExtern | str -TargetDataLayout: t.CExtern | str -SliceLevel: t.CExtern | t.CInt -StrictMode: t.CExtern | t.CInt -IncludesDir: t.CExtern | str - -def Load_project_config(path: str) -> int: pass - -def _join_flags_array(flags_val: JsonValue | t.CPtr) -> str: pass - -def _join_path(rel: str, project_dir: str) -> str: pass - -def resolve_paths(project_dir: str) -> int: pass - -def get_includes_binary_dir() -> str: pass - -def print_config() -> t.CInt: pass diff --git a/.transpyc_cache/4b639fa48e802b3b.doc.json b/.transpyc_cache/4b639fa48e802b3b.doc.json deleted file mode 100644 index ac292ab..0000000 --- a/.transpyc_cache/4b639fa48e802b3b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"ForHandle": "for 循环语句处理器:继承 Mixin 获得 Trans 回指针", "ForHandle.Handle": "翻译 for i in range(...) 循环语句", "ForHandle._handle_ptr_iter": "指针迭代: for x in ptr: 直到解引用为空"} \ No newline at end of file diff --git a/.transpyc_cache/4b639fa48e802b3b.pyi b/.transpyc_cache/4b639fa48e802b3b.pyi deleted file mode 100644 index 7a22de4..0000000 --- a/.transpyc_cache/4b639fa48e802b3b.pyi +++ /dev/null @@ -1,29 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesFor.py -Module: lib.core.Handles.HandlesFor -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesBody as HandlesBody -import lib.core.Handles.HandlesType as HandlesType - -@t.NoVTable -class ForHandle(HandlesBase.Mixin): - def __init__(self: ForHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: ForHandle, node: ast.AST | t.CPtr) -> int: pass - def _handle_ptr_iter(self: ForHandle, for_node: ast.For | t.CPtr, var_name: str) -> int: pass - -def NewForHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ForHandle | t.CPtr: pass diff --git a/.transpyc_cache/4ca69b583c572f13.doc.json b/.transpyc_cache/4ca69b583c572f13.doc.json deleted file mode 100644 index 1a7c43a..0000000 --- a/.transpyc_cache/4ca69b583c572f13.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"VarEntry": "变量表条目", "Scope": "作用域节点", "SymbolTable": "嵌套作用域符号表", "init_vars": "分配并清零变量表数组", "find_var": "在变量表中按名称查找", "find_var_entry": "在变量表中按名称查找,返回 VarEntry 或 None", "lookup_var_entry": "从当前作用域逐级向上查找变量,返回 VarEntry 或 None", "set_var_annot_class_name": "设置变量的原始类型注解类名,返回 0=成功 / 1=失败", "add_var": "添加变量到变量表", "get_or_create_var": "查找或创建变量 alloca", "_create_scope": "创建并初始化作用域节点", "init_symbol_table": "创建并初始化符号表,包含模块级根作用域", "enter_scope": "进入新作用域,返回新创建的作用域", "exit_scope": "退出当前作用域,恢复到父作用域", "define_var": "在当前作用域定义变量,返回 0 成功", "define_module_var": "在模块作用域定义变量,返回 0 成功", "lookup_var": "从当前作用域逐级向上查找变量,返回 alloca 或 None", "lookup_current": "仅在当前作用域查找变量", "lookup_module_var": "在模块作用域查找变量", "get_or_create_sym": "查找或创建变量 alloca(在当前作用域)"} \ No newline at end of file diff --git a/.transpyc_cache/4ca69b583c572f13.pyi b/.transpyc_cache/4ca69b583c572f13.pyi deleted file mode 100644 index 266df75..0000000 --- a/.transpyc_cache/4ca69b583c572f13.pyi +++ /dev/null @@ -1,68 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesVar.py -Module: lib.core.Handles.HandlesVar -""" - - -import t, c -from stdint import * -import llvmlite -import memhub -import string - -SCOPE_MODULE: t.CDefine = 0 -SCOPE_FUNCTION: t.CDefine = 1 -SCOPE_BLOCK: t.CDefine = 2 -MAX_VARS: t.CDefine = 256 - -@t.NoVTable -class VarEntry: - Name: str - Alloca: llvmlite.Value | t.CPtr - Used: t.CInt - AnnotClassName: str -@t.NoVTable -class Scope: - Parent: Scope | t.CPtr - Vars: VarEntry | t.CPtr - VarCount: t.CInt - Kind: t.CInt -@t.NoVTable -class SymbolTable: - Pool: memhub.MemBuddy | t.CPtr - Root: Scope | t.CPtr - Current: Scope | t.CPtr - -def init_vars(pool: memhub.MemBuddy | t.CPtr) -> VarEntry | t.CPtr: pass - -def find_var(vars_ptr: VarEntry | t.CPtr, var_count: int, name: str) -> llvmlite.Value | t.CPtr: pass - -def find_var_entry(vars_ptr: VarEntry | t.CPtr, var_count: int, name: str) -> VarEntry | t.CPtr: pass - -def lookup_var_entry(symtab: SymbolTable | t.CPtr, name: str) -> VarEntry | t.CPtr: pass - -def set_var_annot_class_name(symtab: SymbolTable | t.CPtr, name: str, class_name: str) -> int: pass - -def add_var(vars_ptr: VarEntry | t.CPtr, var_count: int, name: str, alloca: llvmlite.Value | t.CPtr) -> int: pass - -def get_or_create_var(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, vars_ptr: VarEntry | t.CPtr, var_count: int, name: str, ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _create_scope(pool: memhub.MemBuddy | t.CPtr, parent: Scope | t.CPtr, kind: int) -> Scope | t.CPtr: pass - -def init_symbol_table(pool: memhub.MemBuddy | t.CPtr) -> SymbolTable | t.CPtr: pass - -def enter_scope(symtab: SymbolTable | t.CPtr, kind: int) -> Scope | t.CPtr: pass - -def exit_scope(symtab: SymbolTable | t.CPtr) -> t.CInt: pass - -def define_var(symtab: SymbolTable | t.CPtr, name: str, alloca: llvmlite.Value | t.CPtr) -> int: pass - -def define_module_var(symtab: SymbolTable | t.CPtr, name: str, alloca: llvmlite.Value | t.CPtr) -> int: pass - -def lookup_var(symtab: SymbolTable | t.CPtr, name: str) -> llvmlite.Value | t.CPtr: pass - -def lookup_current(symtab: SymbolTable | t.CPtr, name: str) -> llvmlite.Value | t.CPtr: pass - -def lookup_module_var(symtab: SymbolTable | t.CPtr, name: str) -> llvmlite.Value | t.CPtr: pass - -def get_or_create_sym(symtab: SymbolTable | t.CPtr, pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, name: str, ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/4dd6b3f1427d1cc5.pyi b/.transpyc_cache/4dd6b3f1427d1cc5.pyi deleted file mode 100644 index dd15aa2..0000000 --- a/.transpyc_cache/4dd6b3f1427d1cc5.pyi +++ /dev/null @@ -1,82 +0,0 @@ -""" -Auto-generated Python stub file from ast.match.py -Module: ast.match -""" - - -import t, c -from stdint import * -import memhub -import string -from .base import AST, ASTKind, _init_ast, _copy_str, _set_parent_list, _emit, _emit_str, _emit_int, _dump_list - -class MatchCase(AST): - pattern: AST | t.CPtr - guard: AST | t.CPtr - def __new__(self: MatchCase, pool: memhub.MemManager | t.CPtr, pattern: AST | t.CPtr, guard: AST | t.CPtr) -> t.CInt: pass - def __init__(self: MatchCase, pool: memhub.MemManager | t.CPtr, pattern: AST | t.CPtr, guard: AST | t.CPtr) -> t.CInt: pass - def kind(self: MatchCase) -> t.CInt: pass - def type_name(self: MatchCase) -> str: pass - def dump(self: MatchCase, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class MatchValue(AST): - value: AST | t.CPtr - def __new__(self: MatchValue, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def __init__(self: MatchValue, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def kind(self: MatchValue) -> t.CInt: pass - def type_name(self: MatchValue) -> str: pass - def dump(self: MatchValue, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class MatchSingleton(AST): - value: AST | t.CPtr - def __new__(self: MatchSingleton, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def __init__(self: MatchSingleton, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def kind(self: MatchSingleton) -> t.CInt: pass - def type_name(self: MatchSingleton) -> str: pass - def dump(self: MatchSingleton, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class MatchSequence(AST): - patterns: list[AST | t.CPtr] | t.CPtr - def __new__(self: MatchSequence, pool: memhub.MemManager | t.CPtr, patterns: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: MatchSequence, pool: memhub.MemManager | t.CPtr, patterns: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: MatchSequence) -> t.CInt: pass - def type_name(self: MatchSequence) -> str: pass - def dump(self: MatchSequence, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class MatchMapping(AST): - keys: list[AST | t.CPtr] | t.CPtr - patterns: list[AST | t.CPtr] | t.CPtr - rest: str - def __new__(self: MatchMapping, pool: memhub.MemManager | t.CPtr, keys: list[AST | t.CPtr] | t.CPtr, patterns: list[AST | t.CPtr] | t.CPtr, rest: str) -> t.CInt: pass - def __init__(self: MatchMapping, pool: memhub.MemManager | t.CPtr, keys: list[AST | t.CPtr] | t.CPtr, patterns: list[AST | t.CPtr] | t.CPtr, rest: str) -> t.CInt: pass - def kind(self: MatchMapping) -> t.CInt: pass - def type_name(self: MatchMapping) -> str: pass - def dump(self: MatchMapping, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class MatchClass(AST): - cls: AST | t.CPtr - patterns: list[AST | t.CPtr] | t.CPtr - kwd_attrs: list[AST | t.CPtr] | t.CPtr - kwd_patterns: list[AST | t.CPtr] | t.CPtr - def __new__(self: MatchClass, pool: memhub.MemManager | t.CPtr, cls: AST | t.CPtr, patterns: list[AST | t.CPtr] | t.CPtr, kwd_attrs: list[AST | t.CPtr] | t.CPtr, kwd_patterns: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: MatchClass, pool: memhub.MemManager | t.CPtr, cls: AST | t.CPtr, patterns: list[AST | t.CPtr] | t.CPtr, kwd_attrs: list[AST | t.CPtr] | t.CPtr, kwd_patterns: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: MatchClass) -> t.CInt: pass - def type_name(self: MatchClass) -> str: pass - def dump(self: MatchClass, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class MatchStar(AST): - name: str - def __new__(self: MatchStar, pool: memhub.MemManager | t.CPtr, name: str) -> t.CInt: pass - def __init__(self: MatchStar, pool: memhub.MemManager | t.CPtr, name: str) -> t.CInt: pass - def kind(self: MatchStar) -> t.CInt: pass - def type_name(self: MatchStar) -> str: pass - def dump(self: MatchStar, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class MatchAs(AST): - pattern: AST | t.CPtr - name: str - def __new__(self: MatchAs, pool: memhub.MemManager | t.CPtr, pattern: AST | t.CPtr, name: str) -> t.CInt: pass - def __init__(self: MatchAs, pool: memhub.MemManager | t.CPtr, pattern: AST | t.CPtr, name: str) -> t.CInt: pass - def kind(self: MatchAs) -> t.CInt: pass - def type_name(self: MatchAs) -> str: pass - def dump(self: MatchAs, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class MatchOr(AST): - patterns: list[AST | t.CPtr] | t.CPtr - def __new__(self: MatchOr, pool: memhub.MemManager | t.CPtr, patterns: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: MatchOr, pool: memhub.MemManager | t.CPtr, patterns: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: MatchOr) -> t.CInt: pass - def type_name(self: MatchOr) -> str: pass - def dump(self: MatchOr, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass \ No newline at end of file diff --git a/.transpyc_cache/4ebd3745aa9cf570.doc.json b/.transpyc_cache/4ebd3745aa9cf570.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/4ebd3745aa9cf570.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/4ed910ba727b5e92.doc.json b/.transpyc_cache/4ed910ba727b5e92.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/4ed910ba727b5e92.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/4ed910ba727b5e92.pyi b/.transpyc_cache/4ed910ba727b5e92.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/4ed910ba727b5e92.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/4ee832f9cf4db211.doc.json b/.transpyc_cache/4ee832f9cf4db211.doc.json deleted file mode 100644 index dda4745..0000000 --- a/.transpyc_cache/4ee832f9cf4db211.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"get_func_name": "从函数节点提取函数名", "escape_llvm_string": "将字符串转换为 LLVM IR 字符串字面量 c\"...\\00\" ", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "get_llvm_float_bits": "获取 LLVM 浮点类型的位宽,非浮点类型返回 0", "is_ptr_type": "检查 ty 是否是 Ptr 类型,返回 1=是, 0=否", "_deref_if_ptr_ptr": "如果 obj_ptr 是 Ptr(Ptr(...)),load 解引用获取内层指针", "coerce_to_type": "将 val 强制转换为 target_ty\n\n 整数: sext(扩展)/ trunc(截断)\n 浮点: fpext(扩展)/ fptrunc(截断)\n int→float: sitofp\n float→int: fptosi\n ", "create_global_string": "创建全局字符串常量并返回 i8* bitcast", "translate_constant": "翻译常量(int/str/bool)", "_infer_elem_type_from_value": "从 LLVM Value 的类型推断 list 元素类型名", "_find_pool_var": "查找上下文中的 pool 变量,返回 alloca 或 None", "translate_list_literal": "翻译 list 字面量 [a, b, c] → list[T](pool) + append 序列", "translate_value": "翻译值表达式为 LLVM Value", "translate_compare": "翻译比较表达式,返回 i1 结果", "translate_unaryop": "翻译一元运算(-x, +x, not x, ~x)", "translate_boolop": "翻译布尔运算(and/or)的短路求值,返回 i1", "translate_name_value": "翻译变量引用(Name 节点)→ load", "ExprHandle": "表达式处理器:继承 Mixin 获得 Trans 回指针", "ExprHandle.HandleValue": "翻译值表达式,从 self.Trans 获取共享状态", "list_getitem_inline": "内联生成 list __getitem__ 逻辑,返回元素地址 (i8*)", "_list_elem_type_from_name": "从 list 类型名提取元素 LLVM 类型", "list_setitem_inline": "内联生成 list __setitem__ 逻辑,返回 0", "is_list_subscript": "检查 Subscript 节点是否是 list[T] 类型,返回 list 对象指针或 None", "translate_subscript": "翻译下标表达式,返回加载的元素值", "translate_attribute": "翻译属性访问,返回加载的字段值", "get_subscript_ptr": "获取下标表达式的元素指针(用于赋值 lhs)", "get_attribute_ptr": "获取属性访问的字段指针(用于赋值 lhs)"} \ No newline at end of file diff --git a/.transpyc_cache/4ee832f9cf4db211.pyi b/.transpyc_cache/4ee832f9cf4db211.pyi deleted file mode 100644 index 60fab85..0000000 --- a/.transpyc_cache/4ee832f9cf4db211.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExpr.py -Module: lib.core.Handles.HandlesExpr -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import llvmlite -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprOps as HandlesExprOps -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -def get_func_name(func_node: ast.AST | t.CPtr) -> str: pass - -def escape_llvm_string(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_llvm_float_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def is_ptr_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _deref_if_ptr_ptr(builder: llvmlite.IRBuilder | t.CPtr, obj_ptr: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def coerce_to_type(builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def create_global_string(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, str_val: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_constant(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_elem_type_from_value(pool: memhub.MemBuddy | t.CPtr, value: llvmlite.Value | t.CPtr) -> str: pass - -def _find_pool_var(trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_list_literal(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, elem_type_name: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_compare(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_unaryop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_boolop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_name_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -@t.NoVTable -class ExprHandle(HandlesBase.Mixin): - def __init__(self: ExprHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleValue(self: ExprHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def NewExprHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprHandle | t.CPtr: pass - -def list_getitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _list_elem_type_from_name(pool: memhub.MemBuddy | t.CPtr, struct_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def list_setitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr, rhs_val: llvmlite.Value | t.CPtr) -> int: pass - -def is_list_subscript(node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_subscript(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_attribute(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_subscript_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_attribute_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/4f90956b289db68b.doc.json b/.transpyc_cache/4f90956b289db68b.doc.json deleted file mode 100644 index 724daa6..0000000 --- a/.transpyc_cache/4f90956b289db68b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到\n\n allow_star_fallback: 传 0 禁用 star import 回退(用于明确模块名/函数名查找)\n ", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_get_external_func_param_ty": "获取外部函数第 param_idx 个参数的期望类型,None 表示用字面量原类型\n\n 对 Win32 API 函数的所有非指针参数返回 i64,匹配 declare 中\n ULONG/SIZE_T 被统一翻译为 i64 的情况。\n ", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/4f90956b289db68b.pyi b/.transpyc_cache/4f90956b289db68b.pyi deleted file mode 100644 index 065139b..0000000 --- a/.transpyc_cache/4f90956b289db68b.pyi +++ /dev/null @@ -1,173 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str, allow_star_fallback: int) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _get_external_func_param_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str, param_idx: int) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/4fb8940ff5ab1022.doc.json b/.transpyc_cache/4fb8940ff5ab1022.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/4fb8940ff5ab1022.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/4fb8940ff5ab1022.pyi b/.transpyc_cache/4fb8940ff5ab1022.pyi deleted file mode 100644 index 1f24963..0000000 --- a/.transpyc_cache/4fb8940ff5ab1022.pyi +++ /dev/null @@ -1,34 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import w32.win32console -import t, c -import testcheck - -def add_inline(a: t.CInt, b: t.CInt) -> t.CDefine: - return a + b - -def mul_inline(a: t.CInt, b: t.CInt) -> t.CDefine: - return a * b - - -class AppError(Exception): - pass -class DiskError(AppError): - pass -class NetworkError(AppError): - pass -class TimeoutError(NetworkError): - pass - -def raise_disk() -> t.CInt: pass - -def raise_network() -> t.CInt: pass - -def raise_timeout() -> t.CInt: pass - -def main() -> t.CInt | t.CExport: pass diff --git a/.transpyc_cache/51f0144d6e8188d9.doc.json b/.transpyc_cache/51f0144d6e8188d9.doc.json deleted file mode 100644 index a63fb44..0000000 --- a/.transpyc_cache/51f0144d6e8188d9.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"WhileHandle": "while 循环语句处理器:继承 Mixin 获得 Trans 回指针", "WhileHandle.Handle": "翻译 while 循环语句"} \ No newline at end of file diff --git a/.transpyc_cache/51f0144d6e8188d9.pyi b/.transpyc_cache/51f0144d6e8188d9.pyi deleted file mode 100644 index eb71aad..0000000 --- a/.transpyc_cache/51f0144d6e8188d9.pyi +++ /dev/null @@ -1,25 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesWhile.py -Module: lib.core.Handles.HandlesWhile -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesBody as HandlesBody - -@t.NoVTable -class WhileHandle(HandlesBase.Mixin): - def __init__(self: WhileHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: WhileHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewWhileHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> WhileHandle | t.CPtr: pass diff --git a/.transpyc_cache/52e6b51da061882f.doc.json b/.transpyc_cache/52e6b51da061882f.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/52e6b51da061882f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/52e6b51da061882f.pyi b/.transpyc_cache/52e6b51da061882f.pyi deleted file mode 100644 index edc39b5..0000000 --- a/.transpyc_cache/52e6b51da061882f.pyi +++ /dev/null @@ -1,43 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - -import c - - -import t -import stdio -import testcheck - -g_val: t.CExtern | t.CInt - -def outer_modify_global() -> t.CInt: pass - -def test_global_in_nested() -> t.CInt: pass - -def test_nonlocal_multi_level() -> t.CInt: pass - - -g_mixed: t.CExtern | t.CInt - -def test_global_nonlocal_mixed() -> t.CInt: pass - -def test_lambda_multi_capture() -> t.CInt: pass - -def test_lambda_arg_capture() -> t.CInt: pass - -def test_nested_return() -> t.CInt: pass - -def test_nonlocal_loop() -> t.CInt: pass - - -g_arr: t.CExtern | t.CArray[t.CInt, 4] - -def test_global_array() -> t.CInt: pass - -def test_nested_conditional() -> t.CInt: pass - -def test_lambda_chain() -> t.CInt: pass - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/54014f6c53e9640b.doc.json b/.transpyc_cache/54014f6c53e9640b.doc.json deleted file mode 100644 index ca04595..0000000 --- a/.transpyc_cache/54014f6c53e9640b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"reset_visible_structs": "重置可见性状态(每个文件翻译前调用)\n\n pool: 内存分配器(严格模式下创建 HashTable)\n strict: 1=严格模式(用户文件),0=宽松模式(includes 文件)\n ", "add_visible_struct": "添加可见结构体名(类定义时和 from-import 时调用)", "is_struct_visible": "检查结构体是否可见,返回 1=可见 / 0=不可见", "init_struct_table": "初始化结构体注册表,返回 1 成功", "_get_struct_entry": "获取第 i 个结构体条目", "_get_field_entry": "获取结构体中第 i 个字段条目", "register_struct": "注册结构体类型,返回 StructEntry 指针\n\n 用类型指针去重(is 比较),不用类名去重。\n 这样跨模块同名类可以共存,各自有独立的字段定义。\n sha1 参数在注册时直接设置 ModuleSha1(避免 set_struct_sha1 找错 entry)。\n ", "set_struct_sha1": "设置结构体所属模块的 SHA1,返回 1=成功 / 0=失败", "get_struct_sha1": "获取结构体所属模块的 SHA1,返回 None=无 SHA1", "add_field": "向结构体添加字段,返回字段索引(-1 失败)\n\n default_val: 字段默认值 AST 节点(可选,None=无默认值)\n annot_class_name: 原始类型注解的类名(可选,用于联合类型字段的方法调用解析)\n ", "find_struct": "按类名查找结构体,返回 StructEntry 或 None", "find_struct_by_module": "按类名 + SHA1 查找结构体,返回 StructEntry 或 None\n\n SHA1 非 None 时:精确匹配 name+sha1,未找到返回 None(不回退,避免跨模块同名找错)\n SHA1 为 None 时:回退到 find_struct(name) 按类名查找第一个\n ", "find_struct_by_type": "按类型指针查找结构体(is 比较),返回 StructEntry 或 None", "lookup_field": "按结构体类型和字段名查找字段信息\n\n 两遍查找策略(跨模块同名类冲突的根本修复):\n 第一遍: 类型指针 is 身份比较(最高优先级,类型唯一确定 entry)\n 第二遍: 名称回退(is 未匹配时,按类名/strstr 匹配,字段未找到时 continue)\n ", "lookup_field_by_class": "按类名和字段名查找字段信息\n\n 优先用 SHA1 匹配(跨模块同名类区分),无 SHA1 时按类名查找第一个\n ", "get_struct_type": "按类名获取结构体的 LLVM 类型", "get_field_by_index": "按类名和字段索引获取字段信息", "struct_has_defaults": "检查结构体是否有任何带默认值的字段,返回 1=有 / 0=无", "_is_struct_type": "检查 ty 是否是 Struct 类型(独立函数,规避嵌套 match 编译器 BUG)", "get_struct_type_from_value": "从 Value 的类型推断结构体类型", "mark_as_union": "标记已注册的结构体为联合体,返回 1=成功 / 0=失败", "is_union_by_name": "按类名检查是否为联合体,返回 1=是 / 0=否", "is_union_by_type": "按类型指针检查是否为联合体,返回 1=是 / 0=否\n\n 先尝试类型指针 == 比较,失败时回退到名称匹配\n ", "mark_as_oop": "标记已注册的结构体为 OOP,返回 1=成功 / 0=失败", "is_oop_by_name": "按类名检查是否为 OOP 结构体,返回 1=是 / 0=否", "mark_has_init": "标记结构体拥有 __init__ 方法,返回 1=成功 / 0=失败", "has_init_by_name": "按类名检查是否有 __init__ 方法,返回 1=有 / 0=无", "mark_has_new": "标记结构体拥有 __new__ 方法,返回 1=成功 / 0=失败", "has_new_by_name": "按类名检查是否有 __new__ 方法,返回 1=有 / 0=无", "get_class_name_by_type": "按类型指针查找类名,返回类名字符串或 None", "_extract_struct_name": "从 LLVMType 提取 Struct 变体的 Name 字段,返回 None 非 Struct", "mark_has_vtable": "标记结构体拥有虚表,返回 1=成功 / 0=失败", "has_vtable_by_name": "按类名检查是否有虚表,返回 1=有 / 0=无", "mark_novtable": "标记结构体为 NoVTable,返回 1=成功 / 0=失败", "is_novtable_by_name": "按类名检查是否为 NoVTable,返回 1=是 / 0=否", "set_parent_name": "设置结构体的父类名,返回 1=成功 / 0=失败", "get_parent_name": "获取结构体的父类名,返回 None=无父类", "set_vtable_methods": "设置虚表方法名数组,返回 1=成功 / 0=失败", "get_vtable_method_index": "获取方法在虚表中的索引,返回 -1=未找到", "get_vtable_method_count": "获取虚表方法数量", "get_vtable_method_name": "获取虚表中第 idx 个方法名,返回 None=越界", "get_field_count": "获取结构体字段数量,返回 -1=未找到", "get_field_name_ptr": "获取 FieldEntry 的字段名,返回 None=未设置", "get_field_type_ptr": "获取 FieldEntry 的字段类型,返回 None=未设置", "get_field_default_ptr": "获取 FieldEntry 的默认值 AST 节点,返回 None=无默认值", "get_field_annot_class_name": "获取 FieldEntry 的原始类型注解类名,返回 None=未设置"} \ No newline at end of file diff --git a/.transpyc_cache/54014f6c53e9640b.pyi b/.transpyc_cache/54014f6c53e9640b.pyi deleted file mode 100644 index 9662312..0000000 --- a/.transpyc_cache/54014f6c53e9640b.pyi +++ /dev/null @@ -1,139 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesStruct.py -Module: lib.core.Handles.HandlesStruct -""" - - -import t, c -from stdint import * -import memhub -import string -import llvmlite -import stdio -import ast -import hashtable - -STRUCT_MAX: t.CDefine = 512 -FIELD_MAX: t.CDefine = 32 -FIELD_NAME_MAX: t.CDefine = 64 - -@t.NoVTable -class FieldEntry: - Name: t.CChar | t.CPtr - Index: int - Ty: llvmlite.LLVMType | t.CPtr - DefaultVal: ast.AST | t.CPtr - AnnotClassName: t.CChar | t.CPtr -@t.NoVTable -class StructEntry: - Name: t.CChar | t.CPtr - Ty: llvmlite.LLVMType | t.CPtr - FieldCount: int - Fields: FieldEntry | t.CPtr - IsUnion: int - IsOOP: int - HasInit: int - HasNew: int - HasVTable: int - IsNoVTable: int - ParentName: t.CChar | t.CPtr - VTableMethodCount: int - VTableMethods: t.CChar | t.CPtr - ModuleSha1: t.CChar | t.CPtr - -_struct_table: t.CExtern | StructEntry | t.CPtr -_struct_count: t.CExtern | int -_visible_structs: t.CExtern | hashtable.HashTable | t.CPtr -_strict_visibility: t.CExtern | int - -def reset_visible_structs(pool: memhub.MemBuddy | t.CPtr, strict: int) -> t.CInt: pass - -def add_visible_struct(pool: memhub.MemBuddy | t.CPtr, name: str) -> t.CInt: pass - -def is_struct_visible(name: str) -> int: pass - -def init_struct_table(pool: memhub.MemBuddy | t.CPtr) -> int: pass - -def _get_struct_entry(i: int) -> StructEntry | t.CPtr: pass - -def _get_field_entry(struct_entry: StructEntry | t.CPtr, i: int) -> FieldEntry | t.CPtr: pass - -def register_struct(pool: memhub.MemBuddy | t.CPtr, name: str, struct_ty: llvmlite.LLVMType | t.CPtr, sha1: str) -> StructEntry | t.CPtr: pass - -def set_struct_sha1(pool: memhub.MemBuddy | t.CPtr, class_name: str, sha1: str) -> int: pass - -def get_struct_sha1(class_name: str) -> str: pass - -def add_field(pool: memhub.MemBuddy | t.CPtr, struct_entry: StructEntry | t.CPtr, field_name: str, field_ty: llvmlite.LLVMType | t.CPtr, default_val: ast.AST | t.CPtr, annot_class_name: t.CChar | t.CPtr) -> int: pass - -def find_struct(name: str) -> StructEntry | t.CPtr: pass - -def find_struct_by_module(name: str, sha1: str) -> StructEntry | t.CPtr: pass - -def find_struct_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> StructEntry | t.CPtr: pass - -def lookup_field(struct_ty: llvmlite.LLVMType | t.CPtr, field_name: str) -> FieldEntry | t.CPtr: pass - -def lookup_field_by_class(class_name: str, field_name: str, sha1: str) -> FieldEntry | t.CPtr: pass - -def get_struct_type(class_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def get_field_by_index(class_name: str, idx: int) -> FieldEntry | t.CPtr: pass - -def struct_has_defaults(class_name: str) -> int: pass - -def _is_struct_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_struct_type_from_value(val: llvmlite.Value | t.CPtr) -> llvmlite.LLVMType | t.CPtr: pass - -def mark_as_union(name: str) -> int: pass - -def is_union_by_name(name: str) -> int: pass - -def is_union_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def mark_as_oop(name: str) -> int: pass - -def is_oop_by_name(name: str) -> int: pass - -def mark_has_init(name: str) -> int: pass - -def has_init_by_name(name: str) -> int: pass - -def mark_has_new(name: str) -> int: pass - -def has_new_by_name(name: str) -> int: pass - -def get_class_name_by_type(pool: memhub.MemBuddy | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr) -> str: pass - -def _extract_struct_name(ty: llvmlite.LLVMType | t.CPtr) -> str: pass - -def mark_has_vtable(name: str) -> int: pass - -def has_vtable_by_name(name: str) -> int: pass - -def mark_novtable(name: str) -> int: pass - -def is_novtable_by_name(name: str) -> int: pass - -def set_parent_name(name: str, parent_name: str) -> int: pass - -def get_parent_name(name: str) -> str: pass - -def set_vtable_methods(name: str, methods: t.CChar | t.CPtr, count: int) -> int: pass - -def get_vtable_method_index(name: str, method_name: str) -> int: pass - -def get_vtable_method_count(name: str) -> int: pass - -def get_vtable_method_name(name: str, idx: int) -> str: pass - -def get_field_count(name: str) -> int: pass - -def get_field_name_ptr(fe: FieldEntry | t.CPtr) -> str: pass - -def get_field_type_ptr(fe: FieldEntry | t.CPtr) -> llvmlite.LLVMType | t.CPtr: pass - -def get_field_default_ptr(fe: FieldEntry | t.CPtr) -> ast.AST | t.CPtr: pass - -def get_field_annot_class_name(fe: FieldEntry | t.CPtr) -> str: pass diff --git a/.transpyc_cache/541a090dde0cc1ba.doc.json b/.transpyc_cache/541a090dde0cc1ba.doc.json deleted file mode 100644 index 42f2fd1..0000000 --- a/.transpyc_cache/541a090dde0cc1ba.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"AugAssignHandle": "增强赋值处理器 (+=, -=, *=, etc.):继承 Mixin 获得 Trans 回指针", "AugAssignHandle.Handle": "翻译增强赋值语句 (x += 1, y -= 2, etc.)", "_apply_aug_op": "应用增强赋值的二元运算(指针算术 + 整数运算)"} \ No newline at end of file diff --git a/.transpyc_cache/541a090dde0cc1ba.pyi b/.transpyc_cache/541a090dde0cc1ba.pyi deleted file mode 100644 index ee3342d..0000000 --- a/.transpyc_cache/541a090dde0cc1ba.pyi +++ /dev/null @@ -1,27 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesAugAssign.py -Module: lib.core.Handles.HandlesAugAssign -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import stdio -import string -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal - -@t.NoVTable -class AugAssignHandle(HandlesBase.Mixin): - def __init__(self: AugAssignHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: AugAssignHandle, node: ast.AST | t.CPtr) -> int: pass - -def _apply_aug_op(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, op: int, lhs: llvmlite.Value | t.CPtr, rhs: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def NewAugAssignHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> AugAssignHandle | t.CPtr: pass diff --git a/.transpyc_cache/541a1ed9b8be53c8.doc.json b/.transpyc_cache/541a1ed9b8be53c8.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/541a1ed9b8be53c8.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/541a1ed9b8be53c8.pyi b/.transpyc_cache/541a1ed9b8be53c8.pyi deleted file mode 100644 index a98f466..0000000 --- a/.transpyc_cache/541a1ed9b8be53c8.pyi +++ /dev/null @@ -1,16 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import w32.win32console -import config -import hashlib -import binascii -import zlib.pyzlib as zp -import t, c -import testcheck - -def main() -> t.CInt | t.CExport: pass diff --git a/.transpyc_cache/542aabc6fb546c35.doc.json b/.transpyc_cache/542aabc6fb546c35.doc.json deleted file mode 100644 index 67e7a8b..0000000 --- a/.transpyc_cache/542aabc6fb546c35.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_DiagAppend": "追加诊断信息到 diag.txt(追加模式,不依赖 printf 缓冲)", "TranslateFileGetTrans": "翻译文件,返回 Translator 对象(调用者负责 dump_ir),None 失败", "ensure_dir": "递归创建目录(类似 mkdir -p),目录已存在视为成功\n\n Args:\n path: 目录路径(支持 / 或 \\ 分隔符)\n\n Returns:\n 0 成功(包括目录已存在),非 0 失败\n ", "write_ir_to_file": "将 IR 缓冲区写入 .ll 文件\n\n Args:\n ir_buf: IR 文本缓冲区\n ir_len: IR 文本长度\n output_dir: 输出目录(temp 或 output)\n module_name: 模块名(如 \"main\")\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_ll_to_obj": "调用 llc 将 .ll 编译为 .obj\n\n Args:\n ir_path: .ll 文件路径\n output_dir: 输出目录\n module_name: 模块名(用于生成 .obj 文件名)\n cc_cmd: 编译器命令(如 \"llc\")\n cc_flags: 编译器参数(如 \"-filetype=obj -relocation-model=pic\")\n\n Returns:\n 0 成功,非 0 失败\n ", "collect_obj_files": "扫描 includes_binary_dir 目录,收集所有 .obj 文件路径到 out_buf\n\n Args:\n includes_binary_dir: includes.binary 目录路径\n out_buf: 输出缓冲区(用于存放空格分隔的 .obj 文件路径)\n out_size: 输出缓冲区大小\n\n Returns:\n 写入的字节数(不含 null 终止符),0 表示无文件或错误\n ", "link_obj_to_exe": "调用 clang++ 链接 .obj 为 .exe\n\n Args:\n output_dir: 输出目录(包含 .obj 文件)\n module_name: 模块名\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件名(如 \"test.exe\")\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_module_to_obj": "编译 IR 到 .obj(不链接)\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名(SHA1)\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n\n Returns:\n 0 成功,非 0 失败\n ", "link_objs_to_exe": "链接多个 .obj 文件为 .exe\n\n Args:\n obj_paths: 空格分隔的 .obj 文件完整路径字符串\n obj_paths_len: obj_paths 长度\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件完整路径\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "run_pipeline": "执行完整编译管线\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n linker_cmd: 链接器命令\n linker_flags: 链接器参数\n linker_output: 输出文件名\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n BuildResult 对象\n "} \ No newline at end of file diff --git a/.transpyc_cache/542aabc6fb546c35.pyi b/.transpyc_cache/542aabc6fb546c35.pyi deleted file mode 100644 index 9d8b33e..0000000 --- a/.transpyc_cache/542aabc6fb546c35.pyi +++ /dev/null @@ -1,52 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.BuildPipeline.py -Module: lib.core.BuildPipeline -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import subprocess -import viperlib -import ast -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesType as HandlesType - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 - -def _DiagAppend(msg: bytes) -> t.CInt: pass - -def TranslateFileGetTrans(mb: memhub.MemBuddy | t.CPtr, file_path: str, sha1_val: str) -> HandlesTranslator.Translator | t.CPtr: pass - - -class BuildResult: - Success: t.CInt - OutputPath: str - ErrorMsg: str - def __new__(self: BuildResult) -> t.CPtr: pass - def __init__(self: BuildResult) -> t.CInt: pass - -def ensure_dir(path: str) -> int: pass - -def write_ir_to_file(ir_buf: bytes, ir_len: t.CSizeT, output_dir: str, module_name: str) -> int: pass - -def compile_ll_to_obj(ir_path: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def collect_obj_files(includes_binary_dir: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass - -def link_obj_to_exe(output_dir: str, module_name: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def compile_module_to_obj(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def link_objs_to_exe(obj_paths: str, obj_paths_len: t.CSizeT, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def run_pipeline(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> BuildResult | t.CPtr: pass diff --git a/.transpyc_cache/55cbbb5dec4fef2c.doc.json b/.transpyc_cache/55cbbb5dec4fef2c.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/55cbbb5dec4fef2c.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/55cbbb5dec4fef2c.pyi b/.transpyc_cache/55cbbb5dec4fef2c.pyi deleted file mode 100644 index 49538f9..0000000 --- a/.transpyc_cache/55cbbb5dec4fef2c.pyi +++ /dev/null @@ -1,10 +0,0 @@ -""" -Auto-generated Python stub file from type_bit_test.py -Module: type_bit_test -""" - - -import stdio -import t, c - -def type_bit_test() -> int: pass diff --git a/.transpyc_cache/570919ef3f7c03ad.doc.json b/.transpyc_cache/570919ef3f7c03ad.doc.json deleted file mode 100644 index 95e17f3..0000000 --- a/.transpyc_cache/570919ef3f7c03ad.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/570919ef3f7c03ad.pyi b/.transpyc_cache/570919ef3f7c03ad.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/570919ef3f7c03ad.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/57288496f7c2d1ad.pyi b/.transpyc_cache/57288496f7c2d1ad.pyi deleted file mode 100644 index 0624d9a..0000000 --- a/.transpyc_cache/57288496f7c2d1ad.pyi +++ /dev/null @@ -1,71 +0,0 @@ -""" -Auto-generated Python stub file from json.__init__.py -Module: json.__init__ -""" - - -import t, c -from stdint import * -import memhub -import string -import viperio - -JSON_NULL: t.CDefine = 0 -JSON_BOOL: t.CDefine = 1 -JSON_INT: t.CDefine = 2 -JSON_FLOAT: t.CDefine = 3 -JSON_STRING: t.CDefine = 4 -JSON_ARRAY: t.CDefine = 5 -JSON_OBJECT: t.CDefine = 6 - -class JsonValue: - vtype: t.CInt - bool_val: t.CInt - int_val: t.CInt64T - float_val: t.CDouble - str_val: t.CChar | t.CPtr - next: 'JsonValue' | t.CPtr - key: t.CChar | t.CPtr - child: 'JsonValue' | t.CPtr - child_count: t.CSizeT - def __new__(self: JsonValue, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - def type(self: JsonValue) -> t.CInt: pass - def is_null(self: JsonValue) -> bool: pass - def is_bool(self: JsonValue) -> bool: pass - def is_int(self: JsonValue) -> bool: pass - def is_float(self: JsonValue) -> bool: pass - def is_string(self: JsonValue) -> bool: pass - def is_array(self: JsonValue) -> bool: pass - def is_object(self: JsonValue) -> bool: pass - def as_bool(self: JsonValue) -> bool: pass - def as_int(self: JsonValue) -> t.CInt64T: pass - def as_float(self: JsonValue) -> t.CDouble: pass - def as_string(self: JsonValue) -> t.CChar | t.CPtr: pass - def __len__(self: JsonValue) -> t.CSizeT: pass - def __getitem__(self: JsonValue, key: t.CChar | t.CPtr) -> 'JsonValue' | t.CPtr: pass - def __setitem__(self: JsonValue, key: t.CChar | t.CPtr, val: 'JsonValue' | t.CPtr) -> t.CInt: pass - def get_item(self: JsonValue, index: t.CSizeT) -> 'JsonValue' | t.CPtr: pass - def _pool_alloc(self: JsonValue, size: t.CSizeT) -> t.CChar | t.CPtr: pass - def _append_child(self: JsonValue, child: 'JsonValue' | t.CPtr) -> t.CInt: pass - -def null(pool: memhub.MemManager | t.CPtr) -> JsonValue | t.CPtr: pass - -def bool_val(pool: memhub.MemManager | t.CPtr, val: bool) -> JsonValue | t.CPtr: pass - -def int_val(pool: memhub.MemManager | t.CPtr, val: t.CInt64T) -> JsonValue | t.CPtr: pass - -def float_val(pool: memhub.MemManager | t.CPtr, val: t.CDouble) -> JsonValue | t.CPtr: pass - -def string_val(pool: memhub.MemManager | t.CPtr, val: t.CChar | t.CPtr) -> JsonValue | t.CPtr: pass - -def array(pool: memhub.MemManager | t.CPtr) -> JsonValue | t.CPtr: pass - -def object(pool: memhub.MemManager | t.CPtr) -> JsonValue | t.CPtr: pass - -def array_append(pool: memhub.MemManager | t.CPtr, arr: JsonValue | t.CPtr, item: JsonValue | t.CPtr) -> t.CInt: pass - -def object_set(pool: memhub.MemManager | t.CPtr, obj: JsonValue | t.CPtr, key: t.CChar | t.CPtr, val: JsonValue | t.CPtr) -> t.CInt: pass - - -from .__parser import parse -from .__writer import write \ No newline at end of file diff --git a/.transpyc_cache/58f94f7fed04c816.doc.json b/.transpyc_cache/58f94f7fed04c816.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/58f94f7fed04c816.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/58f94f7fed04c816.pyi b/.transpyc_cache/58f94f7fed04c816.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/58f94f7fed04c816.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/594332d751ff7756.doc.json b/.transpyc_cache/594332d751ff7756.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/594332d751ff7756.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/594332d751ff7756.pyi b/.transpyc_cache/594332d751ff7756.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/594332d751ff7756.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/5974af27e1cdb182.doc.json b/.transpyc_cache/5974af27e1cdb182.doc.json deleted file mode 100644 index 28f2ad8..0000000 --- a/.transpyc_cache/5974af27e1cdb182.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_register_cexport_from_funcdef": "预注册 CExport/State 函数到全局表(仅注册,不生成 IR)", "translate_children": "遍历 tree.children 并翻译每个子节点\n\n Args:\n trans: 翻译器(含所有共享状态)\n tree: AST 模块节点\n\n Returns:\n t.CInt: 新增的变量数\n ", "handle_module_level_var": "处理模块级变量声明,创建全局变量", "create_wrapper_main": "创建包装 main 函数并翻译所有顶层语句\n\n Args:\n trans: 翻译器(含所有共享状态)\n tree: AST 模块节点\n i32_ty: i32 LLVMType\n\n Returns:\n t.CInt: 新增的变量数\n "} \ No newline at end of file diff --git a/.transpyc_cache/5974af27e1cdb182.pyi b/.transpyc_cache/5974af27e1cdb182.pyi deleted file mode 100644 index 3901124..0000000 --- a/.transpyc_cache/5974af27e1cdb182.pyi +++ /dev/null @@ -1,31 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesMain.py -Module: lib.core.Handles.HandlesMain -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesBody as HandlesBody -import lib.core.Handles.HandlesFunctions as HandlesFunctions -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesClassDef as HandlesClassDef -import lib.core.Handles.HandlesAnnAssign as HandlesAnnAssign - -def _register_cexport_from_funcdef(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_children(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr) -> int: pass - -def handle_module_level_var(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def create_wrapper_main(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr, i32_ty: llvmlite.LLVMType | t.CPtr) -> int: pass diff --git a/.transpyc_cache/59e00d50660b941e.doc.json b/.transpyc_cache/59e00d50660b941e.doc.json deleted file mode 100644 index e833e14..0000000 --- a/.transpyc_cache/59e00d50660b941e.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"os_exists": "检查文件/目录是否存在(跨平台)", "os_remove": "删除文件(跨平台)。成功返回 0,失败返回 -1。", "os_isdir": "检查路径是否为目录(跨平台)", "os_getsize": "返回文件大小(字节,跨平台)。失败返回 -1。"} \ No newline at end of file diff --git a/.transpyc_cache/59e00d50660b941e.pyi b/.transpyc_cache/59e00d50660b941e.pyi deleted file mode 100644 index 5236edb..0000000 --- a/.transpyc_cache/59e00d50660b941e.pyi +++ /dev/null @@ -1,19 +0,0 @@ -""" -Auto-generated Python stub file from os_backend.py -Module: os_backend -""" - - -import t, c -from stdint import * -import platmacro -import os._win32 -import os._posix - -def os_exists(path: str) -> bool: pass - -def os_remove(path: str) -> int: pass - -def os_isdir(path: str) -> bool: pass - -def os_getsize(path: str) -> t.CInt64T: pass diff --git a/.transpyc_cache/59f7d653d72cce3a.doc.json b/.transpyc_cache/59f7d653d72cce3a.doc.json deleted file mode 100644 index 7996d5c..0000000 --- a/.transpyc_cache/59f7d653d72cce3a.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"get_func_name": "从函数节点提取函数名", "escape_llvm_string": "将字符串转换为 LLVM IR 字符串字面量 c\"...\\00\" ", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "get_llvm_float_bits": "获取 LLVM 浮点类型的位宽,非浮点类型返回 0", "is_ptr_type": "检查 ty 是否是 Ptr 类型,返回 1=是, 0=否", "_deref_if_ptr_ptr": "如果 obj_ptr 是 Ptr(Ptr(...)),load 解引用获取内层指针", "coerce_to_type": "将 val 强制转换为 target_ty\n\n 整数: sext(扩展)/ trunc(截断)\n 浮点: fpext(扩展)/ fptrunc(截断)\n int→float: sitofp\n float→int: fptosi\n ", "create_global_string": "创建全局字符串常量并返回 i8* bitcast", "translate_constant": "翻译常量(int/str/bool)", "translate_value": "翻译值表达式为 LLVM Value", "translate_compare": "翻译比较表达式,返回 i1 结果", "translate_unaryop": "翻译一元运算(-x, +x, not x, ~x)", "translate_boolop": "翻译布尔运算(and/or)的短路求值,返回 i1", "translate_name_value": "翻译变量引用(Name 节点)→ load", "ExprHandle": "表达式处理器:继承 Mixin 获得 Trans 回指针", "ExprHandle.HandleValue": "翻译值表达式,从 self.Trans 获取共享状态", "translate_subscript": "翻译下标表达式,返回加载的元素值", "translate_attribute": "翻译属性访问,返回加载的字段值", "get_subscript_ptr": "获取下标表达式的元素指针(用于赋值 lhs)", "get_attribute_ptr": "获取属性访问的字段指针(用于赋值 lhs)"} \ No newline at end of file diff --git a/.transpyc_cache/59f7d653d72cce3a.pyi b/.transpyc_cache/59f7d653d72cce3a.pyi deleted file mode 100644 index 9aa684e..0000000 --- a/.transpyc_cache/59f7d653d72cce3a.pyi +++ /dev/null @@ -1,69 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExpr.py -Module: lib.core.Handles.HandlesExpr -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import llvmlite -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprOps as HandlesExprOps -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -def get_func_name(func_node: ast.AST | t.CPtr) -> str: pass - -def escape_llvm_string(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_llvm_float_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def is_ptr_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _deref_if_ptr_ptr(builder: llvmlite.IRBuilder | t.CPtr, obj_ptr: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def coerce_to_type(builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def create_global_string(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, str_val: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_constant(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_compare(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_unaryop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_boolop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_name_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -@t.NoVTable -class ExprHandle(HandlesBase.Mixin): - def __init__(self: ExprHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleValue(self: ExprHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def NewExprHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprHandle | t.CPtr: pass - -def translate_subscript(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_attribute(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -import stdio - -def get_subscript_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_attribute_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/5b12e242d96b322f.doc.json b/.transpyc_cache/5b12e242d96b322f.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/5b12e242d96b322f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/5b12e242d96b322f.pyi b/.transpyc_cache/5b12e242d96b322f.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/5b12e242d96b322f.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/5dab8cb390496d22.pyi b/.transpyc_cache/5dab8cb390496d22.pyi deleted file mode 100644 index 7056767..0000000 --- a/.transpyc_cache/5dab8cb390496d22.pyi +++ /dev/null @@ -1,182 +0,0 @@ -""" -Auto-generated Python stub file from ast.base.py -Module: ast.base -""" - - -import t, c -from stdint import * -import memhub -import string -import viperlib -from .tokens import TokOp - -class ASTKind(t.CEnum): - Module: t.State - FunctionDef: t.State - ClassDef: t.State - Assign: t.State - If: t.State - For: t.State - While: t.State - Return: t.State - Expr: t.State - Name: t.State - Constant: t.State - BinOp: t.State - UnaryOp: t.State - Call: t.State - Compare: t.State - Expression: t.State - Interactive: t.State - FunctionType: t.State - Delete: t.State - AugAssign: t.State - AnnAssign: t.State - With: t.State - Raise: t.State - Try: t.State - Assert: t.State - Global: t.State - Nonlocal: t.State - Pass: t.State - Break: t.State - Continue: t.State - Import: t.State - ImportFrom: t.State - Match: t.State - BoolOp: t.State - Lambda: t.State - IfExp: t.State - Dict: t.State - Set: t.State - ListComp: t.State - SetComp: t.State - DictComp: t.State - GeneratorExp: t.State - Await: t.State - Yield: t.State - YieldFrom: t.State - FormattedValue: t.State - JoinedStr: t.State - Attribute: t.State - Subscript: t.State - Starred: t.State - List: t.State - Tuple: t.State - Slice: t.State - NamedExpr: t.State - ExceptHandler: t.State - Arguments: t.State - Arg: t.State - Keyword: t.State - Alias: t.State - WithItem: t.State - Comprehension: t.State - OpNode: t.State - MatchCase: t.State - MatchValue: t.State - MatchSingleton: t.State - MatchSequence: t.State - MatchMapping: t.State - MatchClass: t.State - MatchStar: t.State - MatchAs: t.State - MatchOr: t.State -class ASTCtx(t.CEnum): - Load: t.State - Store: t.State - Del: t.State -class OpKind(t.CEnum): - Add: t.State - Sub: t.State - Mult: t.State - MatMult: t.State - Div: t.State - Mod: t.State - Pow: t.State - LShift: t.State - RShift: t.State - BitOr: t.State - BitXor: t.State - BitAnd: t.State - FloorDiv: t.State - And: t.State - Or: t.State - Eq: t.State - Ne: t.State - Lt: t.State - Le: t.State - Gt: t.State - Ge: t.State - Is: t.State - IsNot: t.State - In: t.State - NotIn: t.State - Not: t.State - UAdd: t.State - USub: t.State - Invert: t.State - NoneOp: t.State - -CONST_INT: t.CDefine = 1 -CONST_FLOAT: t.CDefine = 2 -CONST_STR: t.CDefine = 3 -CONST_BOOL: t.CDefine = 4 -CONST_NONE: t.CDefine = 5 -FLAG_IS_ASYNC: t.CDefine = 1 -FLAG_SIMPLE: t.CDefine = 2 -FLAG_HAS_STAR: t.CDefine = 4 - -class ASTFlag(t.CEnum): - IsAsync: t.State - Simple: t.State - HasStar: t.State - -def _copy_str(pool: memhub.MemManager | t.CPtr, src: str) -> str: pass - -def _set_pos(node: AST | t.CPtr, lineno: t.CInt, col_offset: t.CInt, end_lineno: t.CInt, end_col_offset: t.CInt) -> t.CInt: pass - -def _inherit_pos(node: AST | t.CPtr, ref: AST | t.CPtr) -> t.CInt: pass - -def _init_ast(node: AST | t.CPtr, pool: memhub.MemManager | t.CPtr, lineno: t.CInt, col: t.CInt) -> t.CInt: pass - -def _set_parent_list(lst: list[AST | t.CPtr] | t.CPtr, parent: AST | t.CPtr) -> t.CInt: pass - -def _append_child(lst: list[AST | t.CPtr] | t.CPtr, node: AST | t.CPtr, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - -def _binop_from_op(op_id: t.CInt) -> t.CInt: pass - -def _augop_from_op(op_id: t.CInt) -> t.CInt: pass - -def _cmpop_from_op(op_id: t.CInt) -> t.CInt: pass - -def _emit(buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT, text: str) -> t.CSizeT: pass - -def _emit_str(buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT, text: str) -> t.CSizeT: pass - -def _emit_int(buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT, val: t.CInt64T) -> t.CSizeT: pass - -def _op_name(op: t.CInt) -> str: pass - -def _dump_list(lst: list[AST | t.CPtr] | t.CPtr, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass - -def _dump_op_list(lst: t.CPtr, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass - - -@t.CVTable -class AST: - parent: AST | t.CPtr - pool: memhub.MemManager | t.CPtr - lineno: t.CInt - col_offset: t.CInt - end_lineno: t.CInt - end_col_offset: t.CInt - children: list[AST | t.CPtr] | t.CPtr - def kind(self: AST) -> t.CInt: pass - def type_name(self: AST) -> str: pass - def dump(self: AST, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass - def accept(self: AST, visitor: t.CPtr) -> t.CInt: pass - def append(self: AST, node: AST | t.CPtr) -> t.CInt: pass - -def dump(node: AST | t.CPtr, buf: t.CChar | t.CPtr, size: t.CSizeT) -> t.CInt: pass diff --git a/.transpyc_cache/5e3d33857a0e37f6.doc.json b/.transpyc_cache/5e3d33857a0e37f6.doc.json deleted file mode 100644 index 6b37383..0000000 --- a/.transpyc_cache/5e3d33857a0e37f6.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/5e3d33857a0e37f6.pyi b/.transpyc_cache/5e3d33857a0e37f6.pyi deleted file mode 100644 index e470478..0000000 --- a/.transpyc_cache/5e3d33857a0e37f6.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, args_head: llvmlite.Value | t.CPtr, arg_count: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/5e430ae5bf7af3a2.doc.json b/.transpyc_cache/5e430ae5bf7af3a2.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/5e430ae5bf7af3a2.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/5e430ae5bf7af3a2.pyi b/.transpyc_cache/5e430ae5bf7af3a2.pyi deleted file mode 100644 index bbe03a4..0000000 --- a/.transpyc_cache/5e430ae5bf7af3a2.pyi +++ /dev/null @@ -1,13 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import w32.win32console -import t, c -from t import CInt, CExport -import mbuddytest - -def main() -> CInt | CExport: pass diff --git a/.transpyc_cache/5faaecd48491dce0.doc.json b/.transpyc_cache/5faaecd48491dce0.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/5faaecd48491dce0.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/5faaecd48491dce0.pyi b/.transpyc_cache/5faaecd48491dce0.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/5faaecd48491dce0.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/5fc006555963c808.doc.json b/.transpyc_cache/5fc006555963c808.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/5fc006555963c808.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/5fc006555963c808.pyi b/.transpyc_cache/5fc006555963c808.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/5fc006555963c808.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/605efc3aeda6b7a7.doc.json b/.transpyc_cache/605efc3aeda6b7a7.doc.json deleted file mode 100644 index 86441ed..0000000 --- a/.transpyc_cache/605efc3aeda6b7a7.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名\n\n 特殊处理 __init__.py:includes/ast/__init__.py → ast(而非 ast.__init__)\n ", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/605efc3aeda6b7a7.pyi b/.transpyc_cache/605efc3aeda6b7a7.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/605efc3aeda6b7a7.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/62cc01c2bb770ca3.pyi b/.transpyc_cache/62cc01c2bb770ca3.pyi deleted file mode 100644 index 17b1307..0000000 --- a/.transpyc_cache/62cc01c2bb770ca3.pyi +++ /dev/null @@ -1,77 +0,0 @@ -""" -Auto-generated Python stub file from vrandom.py -Module: vrandom -""" - - -import t, c -import vipermath - -RDRAND_RETRY_LIMIT: t.CDefine = 10 -RDSEED_RETRY_LIMIT: t.CDefine = 100 - -def rdrand16() -> t.CUInt16T: pass - -def rdrand32() -> t.CUInt32T: pass - -def rdrand64() -> t.CUInt64T: pass - -def rdseed16() -> t.CUInt16T: pass - -def rdseed32() -> t.CUInt32T: pass - -def rdseed64() -> t.CUInt64T: pass - -def rdrand16_step(p: t.CUInt16T | t.CPtr) -> t.CInt: pass - -def rdrand32_step(p: t.CUInt32T | t.CPtr) -> t.CInt: pass - -def rdrand64_step(p: t.CUInt64T | t.CPtr) -> t.CInt: pass - -def rdseed16_step(p: t.CUInt16T | t.CPtr) -> t.CInt: pass - -def rdseed32_step(p: t.CUInt32T | t.CPtr) -> t.CInt: pass - -def rdseed64_step(p: t.CUInt64T | t.CPtr) -> t.CInt: pass - -def random_u16() -> t.CUInt16T: pass - -def random_u32() -> t.CUInt32T: pass - -def random_u64() -> t.CUInt64T: pass - -def seed_u16() -> t.CUInt16T: pass - -def seed_u32() -> t.CUInt32T: pass - -def seed_u64() -> t.CUInt64T: pass - -def randint(a: t.CInt, b: t.CInt) -> t.CInt: pass - -def randrange(start: t.CInt, stop: t.CInt, step: t.CInt) -> t.CInt: pass - -def getrandbits(k: t.CInt) -> t.CUInt64T: pass - -def random() -> t.CDouble: pass - -def uniform(a: t.CDouble, b: t.CDouble) -> t.CDouble: pass - -def triangular(low: t.CDouble, high: t.CDouble, mode: t.CDouble) -> t.CDouble: pass - -def betavariate(alpha: t.CDouble, beta: t.CDouble) -> t.CDouble: pass - -def expovariate(lambd: t.CDouble) -> t.CDouble: pass - -def gammavariate(alpha: t.CDouble, beta: t.CDouble) -> t.CDouble: pass - -def gauss(mu: t.CDouble, sigma: t.CDouble) -> t.CDouble: pass - -def normalvariate(mu: t.CDouble, sigma: t.CDouble) -> t.CDouble: pass - -def lognormvariate(mu: t.CDouble, sigma: t.CDouble) -> t.CDouble: pass - -def vonmisesvariate(mu: t.CDouble, kappa: t.CDouble) -> t.CDouble: pass - -def paretovariate(alpha: t.CDouble) -> t.CDouble: pass - -def weibullvariate(alpha: t.CDouble, beta: t.CDouble) -> t.CDouble: pass diff --git a/.transpyc_cache/64ac83614c9bdbc6.doc.json b/.transpyc_cache/64ac83614c9bdbc6.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/64ac83614c9bdbc6.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/64ac83614c9bdbc6.pyi b/.transpyc_cache/64ac83614c9bdbc6.pyi deleted file mode 100644 index 60711e1..0000000 --- a/.transpyc_cache/64ac83614c9bdbc6.pyi +++ /dev/null @@ -1,85 +0,0 @@ -""" -Auto-generated Python stub file from definetest.py -Module: definetest -""" - - -import t, c -from t import CInt, CInt32T, CUInt32T, CUInt64T, CFloat64T, CPtr, CChar, CDefine, CUInt16T -import viperlib -import stdlib -import platmacro - -MAX_SIZE: t.CDefine = 1024 -MIN_VAL: t.CDefine = 0 -MAX_VAL: t.CDefine = 100 -MASK_BYTE: t.CDefine = 0xFF -SHIFT_BITS: t.CDefine = 8 -PI_INT: t.CDefine = 3 -ENABLED: t.CDefine = 1 -DISABLED: t.CDefine = 0 -PAGE_SIZE: t.CDefine = 4096 -BUFFER_LEN: t.CDefine = 256 -CODE_SEG: t.CDefine | t.CUInt16T = 0x08 -DATA_SEG: t.CDefine | t.CUInt16T = 0x10 -STACK_SEG: t.CDefine | t.CUInt16T = 0x20 - -def MAKE_FLAG(bit: CInt32T) -> t.CDefine: - return 1 << bit - -def CLAMP(x: CInt32T, lo: CInt32T, hi: CInt32T) -> t.CDefine: - if x < lo: - return lo - if x > hi: - return hi - return x - -def test_basic_define() -> CInt: pass - -def test_define_arithmetic() -> CInt: pass - -def test_define_conditional() -> CInt: pass - -def test_define_loop() -> CInt: pass - -def test_typed_define() -> CInt: pass - -def test_define_function() -> CInt: pass - -def test_define_clamp() -> CInt: pass - -def test_define_string() -> CInt: pass - -def test_define_combined() -> CInt: pass - -def test_cif_basic() -> CInt: pass - -def test_cif_elif_else() -> CInt: pass - -def test_cifdef_cifndef() -> CInt: pass - -def test_cif_platform() -> CInt: pass - -def test_cif_nested() -> CInt: pass - -def test_cif_expr() -> CInt: pass - -def test_platmacro_platform() -> CInt: pass - -def test_platmacro_sizes() -> CInt: pass - -def test_platmacro_endian() -> CInt: pass - -def test_platmacro_features() -> CInt: pass - -def test_platmacro_align() -> CInt: pass - -def test_cifdef_cross_module() -> CInt: pass - -def test_cifdef_guard() -> CInt: pass - -def test_cifdef_undefined() -> CInt: pass - -def test_cifdef_complex() -> CInt: pass - -def define_main() -> CInt: pass diff --git a/.transpyc_cache/6503c97dde0c79c4.pyi b/.transpyc_cache/6503c97dde0c79c4.pyi deleted file mode 100644 index d332326..0000000 --- a/.transpyc_cache/6503c97dde0c79c4.pyi +++ /dev/null @@ -1,189 +0,0 @@ -""" -Auto-generated Python stub file from posix.py -Module: posix -""" - - -import t, c -from stdint import * - -DIR: t.CTypedef = t.CVoid | t.CPtr -mode_t: t.CTypedef = t.CUInt32T -pid_t: t.CTypedef = t.CInt32T -off_t: t.CTypedef = t.CInt64T -dev_t: t.CTypedef = t.CUInt64T -ino_t: t.CTypedef = t.CUInt64T -nlink_t: t.CTypedef = t.CUInt64T -uid_t: t.CTypedef = t.CUInt32T -gid_t: t.CTypedef = t.CUInt32T -blksize_t: t.CTypedef = t.CInt64T -blkcnt_t: t.CTypedef = t.CInt64T -time_t: t.CTypedef = t.CInt64T -O_RDONLY: t.CDefine = 0 -O_WRONLY: t.CDefine = 1 -O_RDWR: t.CDefine = 2 -O_CREAT: t.CDefine = 0o100 -O_EXCL: t.CDefine = 0o200 -O_TRUNC: t.CDefine = 0o1000 -O_APPEND: t.CDefine = 0o2000 -O_NONBLOCK: t.CDefine = 0o4000 -O_CLOEXEC: t.CDefine = 0o2000000 -F_OK: t.CDefine = 0 # 文件存在 -R_OK: t.CDefine = 4 # 可读 -W_OK: t.CDefine = 2 # 可写 -X_OK: t.CDefine = 1 # 可执行 -S_IFMT: t.CDefine = 0o170000 # 类型掩码 -S_IFSOCK: t.CDefine = 0o140000 # 套接字 -S_IFLNK: t.CDefine = 0o120000 # 符号链接 -S_IFREG: t.CDefine = 0o100000 # 普通文件 -S_IFBLK: t.CDefine = 0o060000 # 块设备 -S_IFDIR: t.CDefine = 0o040000 # 目录 -S_IFCHR: t.CDefine = 0o020000 # 字符设备 -S_IFIFO: t.CDefine = 0o010000 # FIFO/管道 -S_ISUID: t.CDefine = 0o4000 # set-user-ID -S_ISGID: t.CDefine = 0o2000 # set-group-ID -S_ISVTX: t.CDefine = 0o1000 # sticky 位 -S_IRWXU: t.CDefine = 0o700 # 用户读写执行 -S_IRUSR: t.CDefine = 0o400 # 用户读 -S_IWUSR: t.CDefine = 0o200 # 用户写 -S_IXUSR: t.CDefine = 0o100 # 用户执行 -S_IRWXG: t.CDefine = 0o070 # 组读写执行 -S_IRGRP: t.CDefine = 0o040 # 组读 -S_IWGRP: t.CDefine = 0o020 # 组写 -S_IXGRP: t.CDefine = 0o010 # 组执行 -S_IRWXO: t.CDefine = 0o007 # 其他读写执行 -S_IROTH: t.CDefine = 0o004 # 其他读 -S_IWOTH: t.CDefine = 0o002 # 其他写 -S_IXOTH: t.CDefine = 0o001 # 其他执行 -SEEK_SET: t.CDefine = 0 -SEEK_CUR: t.CDefine = 1 -SEEK_END: t.CDefine = 2 -PATH_MAX: t.CDefine = 4096 -NAME_MAX: t.CDefine = 255 -_SC_NPROCESSORS_ONLN: t.CDefine = 84 -_SC_PAGESIZE: t.CDefine = 30 -_SC_CLK_TCK: t.CDefine = 2 -DT_UNKNOWN: t.CDefine = 0 -DT_FIFO: t.CDefine = 1 -DT_CHR: t.CDefine = 2 -DT_DIR: t.CDefine = 4 -DT_BLK: t.CDefine = 6 -DT_REG: t.CDefine = 8 -DT_LNK: t.CDefine = 10 -DT_SOCK: t.CDefine = 12 -DT_WHT: t.CDefine = 14 -WNOHANG: t.CDefine = 1 -WUNTRACED: t.CDefine = 2 -WCONTINUED: t.CDefine = 8 - -class Stat: - st_dev: dev_t - st_ino: ino_t - st_nlink: nlink_t - st_mode: mode_t - st_uid: uid_t - st_gid: gid_t - __pad0: INT - st_rdev: dev_t - st_size: off_t - st_blksize: blksize_t - st_blocks: blkcnt_t - st_atim_sec: time_t - st_atim_nsec: LONGLONG - st_mtim_sec: time_t - st_mtim_nsec: LONGLONG - st_ctim_sec: time_t - st_ctim_nsec: LONGLONG - __unused0: LONGLONG - __unused1: LONGLONG - __unused2: LONGLONG -class Dirent: - d_ino: ino_t - d_off: off_t - d_reclen: USHORT - d_type: BYTE - d_name: CHARPTR - -def open(path: t.CConst | str, oflag: INT, *args) -> INT | t.State: pass - -def close(fd: INT) -> INT | t.State: pass - -def read(fd: INT, buf: bytes, count: t.CSizeT) -> ssize_t | t.State: pass - -def write(fd: INT, buf: t.CConst | bytes, count: t.CSizeT) -> ssize_t | t.State: pass - -def lseek(fd: INT, offset: off_t, whence: INT) -> off_t | t.State: pass - -def unlink(path: t.CConst | str) -> INT | t.State: pass - -def access(path: t.CConst | str, amode: INT) -> INT | t.State: pass - -def realpath(path: t.CConst | str, resolved: CHARPTR) -> CHARPTR | t.State: pass - -def rename(oldpath: t.CConst | str, newpath: t.CConst | str) -> INT | t.State: pass - -def chmod(path: t.CConst | str, mode: mode_t) -> INT | t.State: pass - -def stat(path: t.CConst | str, buf: Stat | t.CPtr) -> INT | t.State: pass - -def fstat(fd: INT, buf: Stat | t.CPtr) -> INT | t.State: pass - -def opendir(name: t.CConst | str) -> DIR | t.CPtr | t.State: pass - -def readdir(dirp: DIR | t.CPtr) -> Dirent | t.CPtr | t.State: pass - -def closedir(dirp: DIR | t.CPtr) -> INT | t.State: pass - -def mkdir(path: t.CConst | str, mode: mode_t) -> INT | t.State: pass - -def rmdir(path: t.CConst | str) -> INT | t.State: pass - -def getcwd(buf: CHARPTR, size: t.CSizeT) -> CHARPTR | t.State: pass - -def chdir(path: t.CConst | str) -> INT | t.State: pass - -def fork() -> pid_t | t.State: pass - -def execvp(file: t.CConst | str, argv: CHARPTR | t.CPtr) -> INT | t.State: pass - -def execv(path: t.CConst | str, argv: CHARPTR | t.CPtr) -> INT | t.State: pass - -def waitpid(pid: pid_t, status: INT | t.CPtr, options: INT) -> pid_t | t.State: pass - -def pipe(fds: INT | t.CPtr) -> INT | t.State: pass - -def dup2(oldfd: INT, newfd: INT) -> INT | t.State: pass - -def _exit(status: INT) -> t.CVoid | t.State: pass - -def getpid() -> pid_t | t.State: pass - -def getenv(name: t.CConst | str) -> CHARPTR | t.State: pass - -def setenv(name: t.CConst | str, value: t.CConst | str, overwrite: INT) -> INT | t.State: pass - -def sysconf(name: INT) -> LONG | t.State: pass - -def isatty(fd: INT) -> INT | t.State: pass - -def S_ISREG(mode: mode_t) -> bool: pass - -def S_ISDIR(mode: mode_t) -> bool: pass - -def S_ISLNK(mode: mode_t) -> bool: pass - -def S_ISCHR(mode: mode_t) -> bool: pass - -def S_ISBLK(mode: mode_t) -> bool: pass - -def S_ISFIFO(mode: mode_t) -> bool: pass - -def S_ISSOCK(mode: mode_t) -> bool: pass - -def WIFEXITED(status: INT) -> bool: pass - -def WEXITSTATUS(status: INT) -> INT: pass - -def WIFSIGNALED(status: INT) -> bool: pass - -def WTERMSIG(status: INT) -> INT: pass diff --git a/.transpyc_cache/6521d5529dba8eba.doc.json b/.transpyc_cache/6521d5529dba8eba.doc.json deleted file mode 100644 index 4dba15e..0000000 --- a/.transpyc_cache/6521d5529dba8eba.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"ReturnHandle": "Return 语句处理器:继承 Mixin 获得 Trans 回指针", "ReturnHandle.Handle": "翻译 Return 语句"} \ No newline at end of file diff --git a/.transpyc_cache/6521d5529dba8eba.pyi b/.transpyc_cache/6521d5529dba8eba.pyi deleted file mode 100644 index abcbbff..0000000 --- a/.transpyc_cache/6521d5529dba8eba.pyi +++ /dev/null @@ -1,23 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesReturn.py -Module: lib.core.Handles.HandlesReturn -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar - -@t.NoVTable -class ReturnHandle(HandlesBase.Mixin): - def __init__(self: ReturnHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: ReturnHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewReturnHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ReturnHandle | t.CPtr: pass diff --git a/.transpyc_cache/657e182b27c2a022.pyi b/.transpyc_cache/657e182b27c2a022.pyi deleted file mode 100644 index 0a2057d..0000000 --- a/.transpyc_cache/657e182b27c2a022.pyi +++ /dev/null @@ -1,226 +0,0 @@ -""" -Auto-generated Python stub file from ast.stmts.py -Module: ast.stmts -""" - - -import t, c -from stdint import * -import memhub -import string -from .base import AST, ASTKind, ASTCtx, OpKind, _init_ast, _copy_str, _set_parent_list, _emit, _emit_str, _emit_int, _dump_list, FLAG_IS_ASYNC - -@t.CVTable -class Module(AST): - def __new__(self: Module, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - def __init__(self: Module, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - def kind(self: Module) -> t.CInt: pass - def type_name(self: Module) -> str: pass - def dump(self: Module, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Assign(AST): - targets: list[AST | t.CPtr] | t.CPtr - value: AST | t.CPtr - def __new__(self: Assign, pool: memhub.MemManager | t.CPtr, targets: list[AST | t.CPtr] | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def __init__(self: Assign, pool: memhub.MemManager | t.CPtr, targets: list[AST | t.CPtr] | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def kind(self: Assign) -> t.CInt: pass - def type_name(self: Assign) -> str: pass - def dump(self: Assign, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class If(AST): - test: AST | t.CPtr - orelse: list[AST | t.CPtr] | t.CPtr - def __new__(self: If, pool: memhub.MemManager | t.CPtr, test: AST | t.CPtr, orelse: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: If, pool: memhub.MemManager | t.CPtr, test: AST | t.CPtr, orelse: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: If) -> t.CInt: pass - def type_name(self: If) -> str: pass - def dump(self: If, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class For(AST): - target: AST | t.CPtr - iter: AST | t.CPtr - orelse: list[AST | t.CPtr] | t.CPtr - flags: t.CInt - def __new__(self: For, pool: memhub.MemManager | t.CPtr, target: AST | t.CPtr, iter: AST | t.CPtr, orelse: list[AST | t.CPtr] | t.CPtr, is_async: t.CInt) -> t.CInt: pass - def __init__(self: For, pool: memhub.MemManager | t.CPtr, target: AST | t.CPtr, iter: AST | t.CPtr, orelse: list[AST | t.CPtr] | t.CPtr, is_async: t.CInt) -> t.CInt: pass - def kind(self: For) -> t.CInt: pass - def type_name(self: For) -> str: pass - def dump(self: For, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class While(AST): - test: AST | t.CPtr - orelse: list[AST | t.CPtr] | t.CPtr - def __new__(self: While, pool: memhub.MemManager | t.CPtr, test: AST | t.CPtr, orelse: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: While, pool: memhub.MemManager | t.CPtr, test: AST | t.CPtr, orelse: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: While) -> t.CInt: pass - def type_name(self: While) -> str: pass - def dump(self: While, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Return(AST): - value: AST | t.CPtr - def __new__(self: Return, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def __init__(self: Return, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def kind(self: Return) -> t.CInt: pass - def type_name(self: Return) -> str: pass - def dump(self: Return, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Expr(AST): - value: AST | t.CPtr - def __new__(self: Expr, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def __init__(self: Expr, pool: memhub.MemManager | t.CPtr, value: AST | t.CPtr) -> t.CInt: pass - def kind(self: Expr) -> t.CInt: pass - def type_name(self: Expr) -> str: pass - def dump(self: Expr, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class FunctionDef(AST): - name: str - args: AST | t.CPtr - decorator_list: list[AST | t.CPtr] | t.CPtr - returns: AST | t.CPtr - flags: t.CInt - def __new__(self: FunctionDef, pool: memhub.MemManager | t.CPtr, name: str, args: AST | t.CPtr, decorator_list: list[AST | t.CPtr] | t.CPtr, returns: AST | t.CPtr, is_async: t.CInt) -> t.CInt: pass - def __init__(self: FunctionDef, pool: memhub.MemManager | t.CPtr, name: str, args: AST | t.CPtr, decorator_list: list[AST | t.CPtr] | t.CPtr, returns: AST | t.CPtr, is_async: t.CInt) -> t.CInt: pass - def kind(self: FunctionDef) -> t.CInt: pass - def type_name(self: FunctionDef) -> str: pass - def dump(self: FunctionDef, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Expression(AST): - body: AST | t.CPtr - def __new__(self: Expression, pool: memhub.MemManager | t.CPtr, body: AST | t.CPtr) -> t.CInt: pass - def __init__(self: Expression, pool: memhub.MemManager | t.CPtr, body: AST | t.CPtr) -> t.CInt: pass - def kind(self: Expression) -> t.CInt: pass - def type_name(self: Expression) -> str: pass - def dump(self: Expression, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Interactive(AST): - body: AST | t.CPtr - def __new__(self: Interactive, pool: memhub.MemManager | t.CPtr, body: AST | t.CPtr) -> t.CInt: pass - def __init__(self: Interactive, pool: memhub.MemManager | t.CPtr, body: AST | t.CPtr) -> t.CInt: pass - def kind(self: Interactive) -> t.CInt: pass - def type_name(self: Interactive) -> str: pass - def dump(self: Interactive, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class FunctionType(AST): - argtypes: list[AST | t.CPtr] | t.CPtr - returns: AST | t.CPtr - def __new__(self: FunctionType, pool: memhub.MemManager | t.CPtr, argtypes: list[AST | t.CPtr] | t.CPtr, returns: AST | t.CPtr) -> t.CInt: pass - def __init__(self: FunctionType, pool: memhub.MemManager | t.CPtr, argtypes: list[AST | t.CPtr] | t.CPtr, returns: AST | t.CPtr) -> t.CInt: pass - def kind(self: FunctionType) -> t.CInt: pass - def type_name(self: FunctionType) -> str: pass - def dump(self: FunctionType, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class ClassDef(AST): - name: str - bases: list[AST | t.CPtr] | t.CPtr - keywords: list[AST | t.CPtr] | t.CPtr - decorator_list: list[AST | t.CPtr] | t.CPtr - type_params: list[str] | t.CPtr - def __new__(self: ClassDef, pool: memhub.MemManager | t.CPtr, name: str, bases: list[AST | t.CPtr] | t.CPtr, keywords: list[AST | t.CPtr] | t.CPtr, decorator_list: list[AST | t.CPtr] | t.CPtr, type_params: list[str] | t.CPtr) -> t.CInt: pass - def __init__(self: ClassDef, pool: memhub.MemManager | t.CPtr, name: str, bases: list[AST | t.CPtr] | t.CPtr, keywords: list[AST | t.CPtr] | t.CPtr, decorator_list: list[AST | t.CPtr] | t.CPtr, type_params: list[str] | t.CPtr) -> t.CInt: pass - def kind(self: ClassDef) -> t.CInt: pass - def type_name(self: ClassDef) -> str: pass - def dump(self: ClassDef, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Delete(AST): - targets: list[AST | t.CPtr] | t.CPtr - def __new__(self: Delete, pool: memhub.MemManager | t.CPtr, targets: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: Delete, pool: memhub.MemManager | t.CPtr, targets: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: Delete) -> t.CInt: pass - def type_name(self: Delete) -> str: pass - def dump(self: Delete, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class AugAssign(AST): - target: AST | t.CPtr - op: t.CInt - value: AST | t.CPtr - def __new__(self: AugAssign, pool: memhub.MemManager | t.CPtr, target: AST | t.CPtr, op: t.CInt, value: AST | t.CPtr) -> t.CInt: pass - def __init__(self: AugAssign, pool: memhub.MemManager | t.CPtr, target: AST | t.CPtr, op: t.CInt, value: AST | t.CPtr) -> t.CInt: pass - def kind(self: AugAssign) -> t.CInt: pass - def type_name(self: AugAssign) -> str: pass - def dump(self: AugAssign, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class AnnAssign(AST): - target: AST | t.CPtr - annotation: AST | t.CPtr - value: AST | t.CPtr - simple: t.CInt - def __new__(self: AnnAssign, pool: memhub.MemManager | t.CPtr, target: AST | t.CPtr, annotation: AST | t.CPtr, value: AST | t.CPtr, simple: t.CInt) -> t.CInt: pass - def __init__(self: AnnAssign, pool: memhub.MemManager | t.CPtr, target: AST | t.CPtr, annotation: AST | t.CPtr, value: AST | t.CPtr, simple: t.CInt) -> t.CInt: pass - def kind(self: AnnAssign) -> t.CInt: pass - def type_name(self: AnnAssign) -> str: pass - def dump(self: AnnAssign, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class With(AST): - items: list[AST | t.CPtr] | t.CPtr - flags: t.CInt - def __new__(self: With, pool: memhub.MemManager | t.CPtr, items: list[AST | t.CPtr] | t.CPtr, is_async: t.CInt) -> t.CInt: pass - def __init__(self: With, pool: memhub.MemManager | t.CPtr, items: list[AST | t.CPtr] | t.CPtr, is_async: t.CInt) -> t.CInt: pass - def kind(self: With) -> t.CInt: pass - def type_name(self: With) -> str: pass - def dump(self: With, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Raise(AST): - exc: AST | t.CPtr - cause: AST | t.CPtr - def __new__(self: Raise, pool: memhub.MemManager | t.CPtr, exc: AST | t.CPtr, cause: AST | t.CPtr) -> t.CInt: pass - def __init__(self: Raise, pool: memhub.MemManager | t.CPtr, exc: AST | t.CPtr, cause: AST | t.CPtr) -> t.CInt: pass - def kind(self: Raise) -> t.CInt: pass - def type_name(self: Raise) -> str: pass - def dump(self: Raise, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Try(AST): - handlers: list[AST | t.CPtr] | t.CPtr - orelse: list[AST | t.CPtr] | t.CPtr - finalbody: list[AST | t.CPtr] | t.CPtr - def __new__(self: Try, pool: memhub.MemManager | t.CPtr, handlers: list[AST | t.CPtr] | t.CPtr, orelse: list[AST | t.CPtr] | t.CPtr, finalbody: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: Try, pool: memhub.MemManager | t.CPtr, handlers: list[AST | t.CPtr] | t.CPtr, orelse: list[AST | t.CPtr] | t.CPtr, finalbody: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: Try) -> t.CInt: pass - def type_name(self: Try) -> str: pass - def dump(self: Try, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Assert(AST): - test: AST | t.CPtr - msg: AST | t.CPtr - def __new__(self: Assert, pool: memhub.MemManager | t.CPtr, test: AST | t.CPtr, msg: AST | t.CPtr) -> t.CInt: pass - def __init__(self: Assert, pool: memhub.MemManager | t.CPtr, test: AST | t.CPtr, msg: AST | t.CPtr) -> t.CInt: pass - def kind(self: Assert) -> t.CInt: pass - def type_name(self: Assert) -> str: pass - def dump(self: Assert, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Global(AST): - names: list[AST | t.CPtr] | t.CPtr - def __new__(self: Global, pool: memhub.MemManager | t.CPtr, names: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: Global, pool: memhub.MemManager | t.CPtr, names: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: Global) -> t.CInt: pass - def type_name(self: Global) -> str: pass - def dump(self: Global, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Nonlocal(AST): - names: list[AST | t.CPtr] | t.CPtr - def __new__(self: Nonlocal, pool: memhub.MemManager | t.CPtr, names: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: Nonlocal, pool: memhub.MemManager | t.CPtr, names: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: Nonlocal) -> t.CInt: pass - def type_name(self: Nonlocal) -> str: pass - def dump(self: Nonlocal, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Pass(AST): - def __new__(self: Pass, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - def __init__(self: Pass, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - def kind(self: Pass) -> t.CInt: pass - def type_name(self: Pass) -> str: pass - def dump(self: Pass, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Break(AST): - def __new__(self: Break, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - def __init__(self: Break, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - def kind(self: Break) -> t.CInt: pass - def type_name(self: Break) -> str: pass - def dump(self: Break, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Continue(AST): - def __new__(self: Continue, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - def __init__(self: Continue, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - def kind(self: Continue) -> t.CInt: pass - def type_name(self: Continue) -> str: pass - def dump(self: Continue, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Import(AST): - names: list[AST | t.CPtr] | t.CPtr - def __new__(self: Import, pool: memhub.MemManager | t.CPtr, names: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: Import, pool: memhub.MemManager | t.CPtr, names: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: Import) -> t.CInt: pass - def type_name(self: Import) -> str: pass - def dump(self: Import, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class ImportFrom(AST): - module: str - names: list[AST | t.CPtr] | t.CPtr - level: t.CInt - def __new__(self: ImportFrom, pool: memhub.MemManager | t.CPtr, module: str, names: list[AST | t.CPtr] | t.CPtr, level: t.CInt) -> t.CInt: pass - def __init__(self: ImportFrom, pool: memhub.MemManager | t.CPtr, module: str, names: list[AST | t.CPtr] | t.CPtr, level: t.CInt) -> t.CInt: pass - def kind(self: ImportFrom) -> t.CInt: pass - def type_name(self: ImportFrom) -> str: pass - def dump(self: ImportFrom, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass -class Match(AST): - subject: AST | t.CPtr - cases: list[AST | t.CPtr] | t.CPtr - def __new__(self: Match, pool: memhub.MemManager | t.CPtr, subject: AST | t.CPtr, cases: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def __init__(self: Match, pool: memhub.MemManager | t.CPtr, subject: AST | t.CPtr, cases: list[AST | t.CPtr] | t.CPtr) -> t.CInt: pass - def kind(self: Match) -> t.CInt: pass - def type_name(self: Match) -> str: pass - def dump(self: Match, buf: t.CChar | t.CPtr, size: t.CSizeT, pos: t.CSizeT) -> t.CSizeT: pass \ No newline at end of file diff --git a/.transpyc_cache/65c212dc0785f1aa.doc.json b/.transpyc_cache/65c212dc0785f1aa.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/65c212dc0785f1aa.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/65c212dc0785f1aa.pyi b/.transpyc_cache/65c212dc0785f1aa.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/65c212dc0785f1aa.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/663db7700139418e.doc.json b/.transpyc_cache/663db7700139418e.doc.json deleted file mode 100644 index e7fc1ec..0000000 --- a/.transpyc_cache/663db7700139418e.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"TranslateFileGetTrans": "翻译文件,返回 Translator 对象(调用者负责 dump_ir),None 失败", "ensure_dir": "递归创建目录(类似 mkdir -p),目录已存在视为成功\n\n Args:\n path: 目录路径(支持 / 或 \\ 分隔符)\n\n Returns:\n 0 成功(包括目录已存在),非 0 失败\n ", "write_ir_to_file": "将 IR 缓冲区写入 .ll 文件\n\n Args:\n ir_buf: IR 文本缓冲区\n ir_len: IR 文本长度\n output_dir: 输出目录(temp 或 output)\n module_name: 模块名(如 \"main\")\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_ll_to_obj": "调用 llc 将 .ll 编译为 .obj\n\n Args:\n ir_path: .ll 文件路径\n output_dir: 输出目录\n module_name: 模块名(用于生成 .obj 文件名)\n cc_cmd: 编译器命令(如 \"llc\")\n cc_flags: 编译器参数(如 \"-filetype=obj -relocation-model=pic\")\n\n Returns:\n 0 成功,非 0 失败\n ", "collect_obj_files": "扫描 includes_binary_dir 目录,收集所有 .obj 文件路径到 out_buf\n\n Args:\n includes_binary_dir: includes.binary 目录路径\n out_buf: 输出缓冲区(用于存放空格分隔的 .obj 文件路径)\n out_size: 输出缓冲区大小\n\n Returns:\n 写入的字节数(不含 null 终止符),0 表示无文件或错误\n ", "link_obj_to_exe": "调用 clang++ 链接 .obj 为 .exe\n\n Args:\n output_dir: 输出目录(包含 .obj 文件)\n module_name: 模块名\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件名(如 \"test.exe\")\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_module_to_obj": "编译 IR 到 .obj(不链接)\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名(SHA1)\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n\n Returns:\n 0 成功,非 0 失败\n ", "link_objs_to_exe": "链接多个 .obj 文件为 .exe\n\n Args:\n obj_paths: 空格分隔的 .obj 文件完整路径字符串\n obj_paths_len: obj_paths 长度\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件完整路径\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "run_pipeline": "执行完整编译管线\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n linker_cmd: 链接器命令\n linker_flags: 链接器参数\n linker_output: 输出文件名\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n BuildResult 对象\n "} \ No newline at end of file diff --git a/.transpyc_cache/663db7700139418e.pyi b/.transpyc_cache/663db7700139418e.pyi deleted file mode 100644 index 3a8c9c7..0000000 --- a/.transpyc_cache/663db7700139418e.pyi +++ /dev/null @@ -1,50 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.BuildPipeline.py -Module: lib.core.BuildPipeline -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import subprocess -import viperlib -import ast -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesType as HandlesType - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 - -def TranslateFileGetTrans(mb: memhub.MemBuddy | t.CPtr, file_path: str, sha1_val: str) -> HandlesTranslator.Translator | t.CPtr: pass - - -class BuildResult: - Success: t.CInt - OutputPath: str - ErrorMsg: str - def __new__(self: BuildResult) -> t.CPtr: pass - def __init__(self: BuildResult) -> t.CInt: pass - -def ensure_dir(path: str) -> int: pass - -def write_ir_to_file(ir_buf: bytes, ir_len: t.CSizeT, output_dir: str, module_name: str) -> int: pass - -def compile_ll_to_obj(ir_path: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def collect_obj_files(includes_binary_dir: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass - -def link_obj_to_exe(output_dir: str, module_name: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def compile_module_to_obj(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def link_objs_to_exe(obj_paths: str, obj_paths_len: t.CSizeT, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def run_pipeline(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> BuildResult | t.CPtr: pass diff --git a/.transpyc_cache/66de93aaeebc0601.doc.json b/.transpyc_cache/66de93aaeebc0601.doc.json deleted file mode 100644 index 046af31..0000000 --- a/.transpyc_cache/66de93aaeebc0601.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"IfHandle": "if/elif/else 语句处理器:继承 Mixin 获得 Trans 回指针", "IfHandle.Handle": "翻译 if/elif/else 语句"} \ No newline at end of file diff --git a/.transpyc_cache/66de93aaeebc0601.pyi b/.transpyc_cache/66de93aaeebc0601.pyi deleted file mode 100644 index 2981cf3..0000000 --- a/.transpyc_cache/66de93aaeebc0601.pyi +++ /dev/null @@ -1,25 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesIf.py -Module: lib.core.Handles.HandlesIf -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesBody as HandlesBody - -@t.NoVTable -class IfHandle(HandlesBase.Mixin): - def __init__(self: IfHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: IfHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewIfHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> IfHandle | t.CPtr: pass diff --git a/.transpyc_cache/6712b7f4f0f0e65d.doc.json b/.transpyc_cache/6712b7f4f0f0e65d.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/6712b7f4f0f0e65d.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/6712b7f4f0f0e65d.pyi b/.transpyc_cache/6712b7f4f0f0e65d.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/6712b7f4f0f0e65d.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/67e6e5ea72c0e13c.doc.json b/.transpyc_cache/67e6e5ea72c0e13c.doc.json deleted file mode 100644 index 6b37383..0000000 --- a/.transpyc_cache/67e6e5ea72c0e13c.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/67e6e5ea72c0e13c.pyi b/.transpyc_cache/67e6e5ea72c0e13c.pyi deleted file mode 100644 index e470478..0000000 --- a/.transpyc_cache/67e6e5ea72c0e13c.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, args_head: llvmlite.Value | t.CPtr, arg_count: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/68ee8e1ac0994b13.doc.json b/.transpyc_cache/68ee8e1ac0994b13.doc.json deleted file mode 100644 index ca04595..0000000 --- a/.transpyc_cache/68ee8e1ac0994b13.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"reset_visible_structs": "重置可见性状态(每个文件翻译前调用)\n\n pool: 内存分配器(严格模式下创建 HashTable)\n strict: 1=严格模式(用户文件),0=宽松模式(includes 文件)\n ", "add_visible_struct": "添加可见结构体名(类定义时和 from-import 时调用)", "is_struct_visible": "检查结构体是否可见,返回 1=可见 / 0=不可见", "init_struct_table": "初始化结构体注册表,返回 1 成功", "_get_struct_entry": "获取第 i 个结构体条目", "_get_field_entry": "获取结构体中第 i 个字段条目", "register_struct": "注册结构体类型,返回 StructEntry 指针\n\n 用类型指针去重(is 比较),不用类名去重。\n 这样跨模块同名类可以共存,各自有独立的字段定义。\n sha1 参数在注册时直接设置 ModuleSha1(避免 set_struct_sha1 找错 entry)。\n ", "set_struct_sha1": "设置结构体所属模块的 SHA1,返回 1=成功 / 0=失败", "get_struct_sha1": "获取结构体所属模块的 SHA1,返回 None=无 SHA1", "add_field": "向结构体添加字段,返回字段索引(-1 失败)\n\n default_val: 字段默认值 AST 节点(可选,None=无默认值)\n annot_class_name: 原始类型注解的类名(可选,用于联合类型字段的方法调用解析)\n ", "find_struct": "按类名查找结构体,返回 StructEntry 或 None", "find_struct_by_module": "按类名 + SHA1 查找结构体,返回 StructEntry 或 None\n\n SHA1 非 None 时:精确匹配 name+sha1,未找到返回 None(不回退,避免跨模块同名找错)\n SHA1 为 None 时:回退到 find_struct(name) 按类名查找第一个\n ", "find_struct_by_type": "按类型指针查找结构体(is 比较),返回 StructEntry 或 None", "lookup_field": "按结构体类型和字段名查找字段信息\n\n 两遍查找策略(跨模块同名类冲突的根本修复):\n 第一遍: 类型指针 is 身份比较(最高优先级,类型唯一确定 entry)\n 第二遍: 名称回退(is 未匹配时,按类名/strstr 匹配,字段未找到时 continue)\n ", "lookup_field_by_class": "按类名和字段名查找字段信息\n\n 优先用 SHA1 匹配(跨模块同名类区分),无 SHA1 时按类名查找第一个\n ", "get_struct_type": "按类名获取结构体的 LLVM 类型", "get_field_by_index": "按类名和字段索引获取字段信息", "struct_has_defaults": "检查结构体是否有任何带默认值的字段,返回 1=有 / 0=无", "_is_struct_type": "检查 ty 是否是 Struct 类型(独立函数,规避嵌套 match 编译器 BUG)", "get_struct_type_from_value": "从 Value 的类型推断结构体类型", "mark_as_union": "标记已注册的结构体为联合体,返回 1=成功 / 0=失败", "is_union_by_name": "按类名检查是否为联合体,返回 1=是 / 0=否", "is_union_by_type": "按类型指针检查是否为联合体,返回 1=是 / 0=否\n\n 先尝试类型指针 == 比较,失败时回退到名称匹配\n ", "mark_as_oop": "标记已注册的结构体为 OOP,返回 1=成功 / 0=失败", "is_oop_by_name": "按类名检查是否为 OOP 结构体,返回 1=是 / 0=否", "mark_has_init": "标记结构体拥有 __init__ 方法,返回 1=成功 / 0=失败", "has_init_by_name": "按类名检查是否有 __init__ 方法,返回 1=有 / 0=无", "mark_has_new": "标记结构体拥有 __new__ 方法,返回 1=成功 / 0=失败", "has_new_by_name": "按类名检查是否有 __new__ 方法,返回 1=有 / 0=无", "get_class_name_by_type": "按类型指针查找类名,返回类名字符串或 None", "_extract_struct_name": "从 LLVMType 提取 Struct 变体的 Name 字段,返回 None 非 Struct", "mark_has_vtable": "标记结构体拥有虚表,返回 1=成功 / 0=失败", "has_vtable_by_name": "按类名检查是否有虚表,返回 1=有 / 0=无", "mark_novtable": "标记结构体为 NoVTable,返回 1=成功 / 0=失败", "is_novtable_by_name": "按类名检查是否为 NoVTable,返回 1=是 / 0=否", "set_parent_name": "设置结构体的父类名,返回 1=成功 / 0=失败", "get_parent_name": "获取结构体的父类名,返回 None=无父类", "set_vtable_methods": "设置虚表方法名数组,返回 1=成功 / 0=失败", "get_vtable_method_index": "获取方法在虚表中的索引,返回 -1=未找到", "get_vtable_method_count": "获取虚表方法数量", "get_vtable_method_name": "获取虚表中第 idx 个方法名,返回 None=越界", "get_field_count": "获取结构体字段数量,返回 -1=未找到", "get_field_name_ptr": "获取 FieldEntry 的字段名,返回 None=未设置", "get_field_type_ptr": "获取 FieldEntry 的字段类型,返回 None=未设置", "get_field_default_ptr": "获取 FieldEntry 的默认值 AST 节点,返回 None=无默认值", "get_field_annot_class_name": "获取 FieldEntry 的原始类型注解类名,返回 None=未设置"} \ No newline at end of file diff --git a/.transpyc_cache/68ee8e1ac0994b13.pyi b/.transpyc_cache/68ee8e1ac0994b13.pyi deleted file mode 100644 index 24ef0f1..0000000 --- a/.transpyc_cache/68ee8e1ac0994b13.pyi +++ /dev/null @@ -1,139 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesStruct.py -Module: lib.core.Handles.HandlesStruct -""" - - -import t, c -from stdint import * -import memhub -import string -import llvmlite -import stdio -import ast -import hashtable - -STRUCT_MAX: t.CDefine = 512 -FIELD_MAX: t.CDefine = 32 -FIELD_NAME_MAX: t.CDefine = 64 - -@t.NoVTable -class FieldEntry: - Name: t.CChar | t.CPtr - Index: int - Ty: llvmlite.LLVMType | t.CPtr - DefaultVal: ast.AST | t.CPtr - AnnotClassName: str -@t.NoVTable -class StructEntry: - Name: t.CChar | t.CPtr - Ty: llvmlite.LLVMType | t.CPtr - FieldCount: int - Fields: FieldEntry | t.CPtr - IsUnion: int - IsOOP: int - HasInit: int - HasNew: int - HasVTable: int - IsNoVTable: int - ParentName: t.CChar | t.CPtr - VTableMethodCount: int - VTableMethods: t.CChar | t.CPtr - ModuleSha1: t.CChar | t.CPtr - -_struct_table: t.CExtern | StructEntry | t.CPtr -_struct_count: t.CExtern | int -_visible_structs: t.CExtern | hashtable.HashTable | t.CPtr -_strict_visibility: t.CExtern | int - -def reset_visible_structs(pool: memhub.MemBuddy | t.CPtr, strict: int) -> t.CInt: pass - -def add_visible_struct(pool: memhub.MemBuddy | t.CPtr, name: str) -> t.CInt: pass - -def is_struct_visible(name: str) -> int: pass - -def init_struct_table(pool: memhub.MemBuddy | t.CPtr) -> int: pass - -def _get_struct_entry(i: int) -> StructEntry | t.CPtr: pass - -def _get_field_entry(struct_entry: StructEntry | t.CPtr, i: int) -> FieldEntry | t.CPtr: pass - -def register_struct(pool: memhub.MemBuddy | t.CPtr, name: str, struct_ty: llvmlite.LLVMType | t.CPtr, sha1: str) -> StructEntry | t.CPtr: pass - -def set_struct_sha1(pool: memhub.MemBuddy | t.CPtr, class_name: str, sha1: str) -> int: pass - -def get_struct_sha1(class_name: str) -> str: pass - -def add_field(pool: memhub.MemBuddy | t.CPtr, struct_entry: StructEntry | t.CPtr, field_name: str, field_ty: llvmlite.LLVMType | t.CPtr, default_val: ast.AST | t.CPtr, annot_class_name: str) -> int: pass - -def find_struct(name: str) -> StructEntry | t.CPtr: pass - -def find_struct_by_module(name: str, sha1: str) -> StructEntry | t.CPtr: pass - -def find_struct_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> StructEntry | t.CPtr: pass - -def lookup_field(struct_ty: llvmlite.LLVMType | t.CPtr, field_name: str) -> FieldEntry | t.CPtr: pass - -def lookup_field_by_class(class_name: str, field_name: str, sha1: str) -> FieldEntry | t.CPtr: pass - -def get_struct_type(class_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def get_field_by_index(class_name: str, idx: int) -> FieldEntry | t.CPtr: pass - -def struct_has_defaults(class_name: str) -> int: pass - -def _is_struct_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_struct_type_from_value(val: llvmlite.Value | t.CPtr) -> llvmlite.LLVMType | t.CPtr: pass - -def mark_as_union(name: str) -> int: pass - -def is_union_by_name(name: str) -> int: pass - -def is_union_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def mark_as_oop(name: str) -> int: pass - -def is_oop_by_name(name: str) -> int: pass - -def mark_has_init(name: str) -> int: pass - -def has_init_by_name(name: str) -> int: pass - -def mark_has_new(name: str) -> int: pass - -def has_new_by_name(name: str) -> int: pass - -def get_class_name_by_type(pool: memhub.MemBuddy | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr) -> str: pass - -def _extract_struct_name(ty: llvmlite.LLVMType | t.CPtr) -> str: pass - -def mark_has_vtable(name: str) -> int: pass - -def has_vtable_by_name(name: str) -> int: pass - -def mark_novtable(name: str) -> int: pass - -def is_novtable_by_name(name: str) -> int: pass - -def set_parent_name(name: str, parent_name: str) -> int: pass - -def get_parent_name(name: str) -> str: pass - -def set_vtable_methods(name: str, methods: t.CChar | t.CPtr, count: int) -> int: pass - -def get_vtable_method_index(name: str, method_name: str) -> int: pass - -def get_vtable_method_count(name: str) -> int: pass - -def get_vtable_method_name(name: str, idx: int) -> str: pass - -def get_field_count(name: str) -> int: pass - -def get_field_name_ptr(fe: FieldEntry | t.CPtr) -> str: pass - -def get_field_type_ptr(fe: FieldEntry | t.CPtr) -> llvmlite.LLVMType | t.CPtr: pass - -def get_field_default_ptr(fe: FieldEntry | t.CPtr) -> ast.AST | t.CPtr: pass - -def get_field_annot_class_name(fe: FieldEntry | t.CPtr) -> str: pass diff --git a/.transpyc_cache/6961b76a167891e5.doc.json b/.transpyc_cache/6961b76a167891e5.doc.json deleted file mode 100644 index d24160b..0000000 --- a/.transpyc_cache/6961b76a167891e5.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"Translator": "翻译器:管理编译状态,委托 Handles 模块执行翻译", "Translator._init_state": "初始化变量表、函数表和子 Handle", "Translator.translate": "将 AST 翻译为 LLVM IR", "Translator._translate_wrapper_main": "委托 HandlesMain.create_wrapper_main() 创建包装 main(trans 单参)", "Translator._translate_module_level": "委托 HandlesMain.translate_children() 翻译模块级语句(trans 单参)", "Translator.dump_ir": "将 LLVM IR 输出到缓冲区\n\n mode: 0=完整, 1=stub(仅声明), 2=text(仅代码)\n ", "add_global_name": "添加一个 global 变量名", "is_global_name": "检查 name 是否在当前函数的 global 集合中", "add_nonlocal_name": "添加一个 nonlocal 变量名", "is_nonlocal_name": "检查 name 是否在当前函数的 nonlocal 集合中", "get_nonlocal_index": "获取 nonlocal 变量在 env 中的索引(0-based),找不到返回 -1", "clear_scope_names": "清空当前函数的 global/nonlocal 名称集合(进入新函数时调用)"} \ No newline at end of file diff --git a/.transpyc_cache/6961b76a167891e5.pyi b/.transpyc_cache/6961b76a167891e5.pyi deleted file mode 100644 index 89de3bc..0000000 --- a/.transpyc_cache/6961b76a167891e5.pyi +++ /dev/null @@ -1,88 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesTranslator.py -Module: lib.core.Handles.HandlesTranslator -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesMain as HandlesMain -import lib.core.Handles.HandlesAssign as HandlesAssign -import lib.core.Handles.HandlesReturn as HandlesReturn -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesAnnAssign as HandlesAnnAssign -import lib.core.Handles.HandlesAugAssign as HandlesAugAssign -import lib.core.Handles.HandlesIf as HandlesIf -import lib.core.Handles.HandlesWhile as HandlesWhile -import lib.core.Handles.HandlesFor as HandlesFor -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.Projectrans.Config as Config - -MAX_VARS: t.CDefine = 256 -MAX_FUNCS: t.CDefine = 256 -MAX_GLOBAL_NAMES: t.CDefine = 32 - -@t.NoVTable -class Translator: - Module: llvmlite.LLVMModule | t.CPtr - Pool: memhub.MemBuddy | t.CPtr - _funcs: HandlesExprCall.FuncEntry | t.CPtr - _func_count: t.CInt - _imported_modules: str - _from_imports: str - _cur_func: llvmlite.Function | t.CPtr - _cur_builder: llvmlite.IRBuilder | t.CPtr - _break_bb: llvmlite.BasicBlock | t.CPtr - _continue_bb: llvmlite.BasicBlock | t.CPtr - _label_counter: t.CInt - _global_names: str - _global_name_count: t.CInt - _nonlocal_names: str - _nonlocal_name_count: t.CInt - _cur_func_name: str - ModuleSha1: str - _closure_env_offsets: t.CInt - _closure_env_count: t.CInt - GenericTypeParamNames: list[str] | t.CPtr - GenericTypeArgs: list[str] | t.CPtr - _declare_only: t.CInt - AssignH: HandlesAssign.AssignHandle | t.CPtr - ReturnH: HandlesReturn.ReturnHandle | t.CPtr - ImportsH: HandlesImports.ImportsHandle | t.CPtr - AnnAssignH: HandlesAnnAssign.AnnAssignHandle | t.CPtr - AugAssignH: HandlesAugAssign.AugAssignHandle | t.CPtr - IfH: HandlesIf.IfHandle | t.CPtr - WhileH: HandlesWhile.WhileHandle | t.CPtr - ForH: HandlesFor.ForHandle | t.CPtr - ExprH: HandlesExpr.ExprHandle | t.CPtr - ExprCallH: HandlesExprCall.ExprCallHandle | t.CPtr - SymTab: HandlesVar.SymbolTable | t.CPtr - def __init__(self: Translator) -> t.CInt: pass - def _init_state(self: Translator, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - def translate(self: Translator, tree: ast.AST | t.CPtr) -> int: pass - def _translate_wrapper_main(self: Translator, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, tree: ast.AST | t.CPtr, i32_ty: llvmlite.LLVMType | t.CPtr) -> t.CInt: pass - def _translate_module_level(self: Translator, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, tree: ast.AST | t.CPtr) -> t.CInt: pass - def dump_ir(self: Translator, buf: bytes, size: t.CSizeT, mode: int) -> t.CInt: pass - -def add_global_name(trans: HT.Translator | t.CPtr, name: str) -> t.CInt: pass - -def is_global_name(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def add_nonlocal_name(trans: HT.Translator | t.CPtr, name: str) -> t.CInt: pass - -def is_nonlocal_name(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def get_nonlocal_index(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def clear_scope_names(trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr \ No newline at end of file diff --git a/.transpyc_cache/69b86cf4726da53f.doc.json b/.transpyc_cache/69b86cf4726da53f.doc.json deleted file mode 100644 index 9c0ba29..0000000 --- a/.transpyc_cache/69b86cf4726da53f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"AnnAssignHandle": "AnnAssign 语句处理器:继承 Mixin 获得 Trans 回指针", "AnnAssignHandle.PreScan": "预扫描 AnnAssign,提前创建 alloca 到 entry block 顶部", "AnnAssignHandle.Handle": "翻译 AnnAssign(target=Name, annotation=..., value=expr)"} \ No newline at end of file diff --git a/.transpyc_cache/69b86cf4726da53f.pyi b/.transpyc_cache/69b86cf4726da53f.pyi deleted file mode 100644 index ef1d109..0000000 --- a/.transpyc_cache/69b86cf4726da53f.pyi +++ /dev/null @@ -1,28 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesAnnAssign.py -Module: lib.core.Handles.HandlesAnnAssign -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesClassDef as HandlesClassDef -import lib.core.Handles.HandlesExprCall as HandlesExprCall - -@t.NoVTable -class AnnAssignHandle(HandlesBase.Mixin): - def __init__(self: AnnAssignHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def PreScan(self: AnnAssignHandle, node: ast.AST | t.CPtr) -> int: pass - def Handle(self: AnnAssignHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewAnnAssignHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> AnnAssignHandle | t.CPtr: pass diff --git a/.transpyc_cache/6a1088ddb47c1d62.doc.json b/.transpyc_cache/6a1088ddb47c1d62.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/6a1088ddb47c1d62.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/6a1088ddb47c1d62.pyi b/.transpyc_cache/6a1088ddb47c1d62.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/6a1088ddb47c1d62.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/6ab1c6b14ca3ded8.doc.json b/.transpyc_cache/6ab1c6b14ca3ded8.doc.json deleted file mode 100644 index e7fc1ec..0000000 --- a/.transpyc_cache/6ab1c6b14ca3ded8.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"TranslateFileGetTrans": "翻译文件,返回 Translator 对象(调用者负责 dump_ir),None 失败", "ensure_dir": "递归创建目录(类似 mkdir -p),目录已存在视为成功\n\n Args:\n path: 目录路径(支持 / 或 \\ 分隔符)\n\n Returns:\n 0 成功(包括目录已存在),非 0 失败\n ", "write_ir_to_file": "将 IR 缓冲区写入 .ll 文件\n\n Args:\n ir_buf: IR 文本缓冲区\n ir_len: IR 文本长度\n output_dir: 输出目录(temp 或 output)\n module_name: 模块名(如 \"main\")\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_ll_to_obj": "调用 llc 将 .ll 编译为 .obj\n\n Args:\n ir_path: .ll 文件路径\n output_dir: 输出目录\n module_name: 模块名(用于生成 .obj 文件名)\n cc_cmd: 编译器命令(如 \"llc\")\n cc_flags: 编译器参数(如 \"-filetype=obj -relocation-model=pic\")\n\n Returns:\n 0 成功,非 0 失败\n ", "collect_obj_files": "扫描 includes_binary_dir 目录,收集所有 .obj 文件路径到 out_buf\n\n Args:\n includes_binary_dir: includes.binary 目录路径\n out_buf: 输出缓冲区(用于存放空格分隔的 .obj 文件路径)\n out_size: 输出缓冲区大小\n\n Returns:\n 写入的字节数(不含 null 终止符),0 表示无文件或错误\n ", "link_obj_to_exe": "调用 clang++ 链接 .obj 为 .exe\n\n Args:\n output_dir: 输出目录(包含 .obj 文件)\n module_name: 模块名\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件名(如 \"test.exe\")\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_module_to_obj": "编译 IR 到 .obj(不链接)\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名(SHA1)\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n\n Returns:\n 0 成功,非 0 失败\n ", "link_objs_to_exe": "链接多个 .obj 文件为 .exe\n\n Args:\n obj_paths: 空格分隔的 .obj 文件完整路径字符串\n obj_paths_len: obj_paths 长度\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件完整路径\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "run_pipeline": "执行完整编译管线\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n linker_cmd: 链接器命令\n linker_flags: 链接器参数\n linker_output: 输出文件名\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n BuildResult 对象\n "} \ No newline at end of file diff --git a/.transpyc_cache/6ab1c6b14ca3ded8.pyi b/.transpyc_cache/6ab1c6b14ca3ded8.pyi deleted file mode 100644 index 3a8c9c7..0000000 --- a/.transpyc_cache/6ab1c6b14ca3ded8.pyi +++ /dev/null @@ -1,50 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.BuildPipeline.py -Module: lib.core.BuildPipeline -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import subprocess -import viperlib -import ast -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesType as HandlesType - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 - -def TranslateFileGetTrans(mb: memhub.MemBuddy | t.CPtr, file_path: str, sha1_val: str) -> HandlesTranslator.Translator | t.CPtr: pass - - -class BuildResult: - Success: t.CInt - OutputPath: str - ErrorMsg: str - def __new__(self: BuildResult) -> t.CPtr: pass - def __init__(self: BuildResult) -> t.CInt: pass - -def ensure_dir(path: str) -> int: pass - -def write_ir_to_file(ir_buf: bytes, ir_len: t.CSizeT, output_dir: str, module_name: str) -> int: pass - -def compile_ll_to_obj(ir_path: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def collect_obj_files(includes_binary_dir: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass - -def link_obj_to_exe(output_dir: str, module_name: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def compile_module_to_obj(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def link_objs_to_exe(obj_paths: str, obj_paths_len: t.CSizeT, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def run_pipeline(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> BuildResult | t.CPtr: pass diff --git a/.transpyc_cache/6b8853854d6ef556.doc.json b/.transpyc_cache/6b8853854d6ef556.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/6b8853854d6ef556.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/6b8853854d6ef556.pyi b/.transpyc_cache/6b8853854d6ef556.pyi deleted file mode 100644 index 66d8d02..0000000 --- a/.transpyc_cache/6b8853854d6ef556.pyi +++ /dev/null @@ -1,23 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - -import c - - -import t -import stdio -import string -import testcheck - -def test_for_in_string() -> t.CInt: pass - -def test_for_in_char_ptr() -> t.CInt: pass - -def test_strcpy_for_in() -> t.CInt: pass - - -import w32.win32memory - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/6ba73c618fc5471e.doc.json b/.transpyc_cache/6ba73c618fc5471e.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/6ba73c618fc5471e.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/6ba73c618fc5471e.pyi b/.transpyc_cache/6ba73c618fc5471e.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/6ba73c618fc5471e.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/6deb1a24b47f47fc.doc.json b/.transpyc_cache/6deb1a24b47f47fc.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/6deb1a24b47f47fc.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/6deb1a24b47f47fc.pyi b/.transpyc_cache/6deb1a24b47f47fc.pyi deleted file mode 100644 index 1c16d75..0000000 --- a/.transpyc_cache/6deb1a24b47f47fc.pyi +++ /dev/null @@ -1,36 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -import t -import c -import stdio -import stdlib -import string -import memhub -import testcheck -import _fakeduck - -def test_for_in_range() -> t.CInt: pass - -def test_for_in_str() -> t.CInt: pass - -def test_for_in_list() -> t.CInt: pass - -def test_zip_list_list() -> t.CInt: pass - -def test_zip_range_list() -> t.CInt: pass - -def test_zip_str_str() -> t.CInt: pass - -def test_zip_range_len_list() -> t.CInt: pass - -def test_enumerate_list() -> t.CInt: pass - -def test_enumerate_str() -> t.CInt: pass - -def test_enumerate_range() -> t.CInt: pass - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/6f43cc10b998bf0b.doc.json b/.transpyc_cache/6f43cc10b998bf0b.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/6f43cc10b998bf0b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/6f43cc10b998bf0b.pyi b/.transpyc_cache/6f43cc10b998bf0b.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/6f43cc10b998bf0b.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/6f5e876273093314.doc.json b/.transpyc_cache/6f5e876273093314.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/6f5e876273093314.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/6f5e876273093314.pyi b/.transpyc_cache/6f5e876273093314.pyi deleted file mode 100644 index 94c6e0f..0000000 --- a/.transpyc_cache/6f5e876273093314.pyi +++ /dev/null @@ -1,10 +0,0 @@ -""" -Auto-generated Python stub file from deref_min_test.py -Module: deref_min_test -""" - - -import stdio -import t, c - -def deref_min_test() -> int: pass diff --git a/.transpyc_cache/6ff26590374ae6fc.pyi b/.transpyc_cache/6ff26590374ae6fc.pyi deleted file mode 100644 index 1b1bba1..0000000 --- a/.transpyc_cache/6ff26590374ae6fc.pyi +++ /dev/null @@ -1,39 +0,0 @@ -""" -Auto-generated Python stub file from hashlib.__sha512.py -Module: hashlib.__sha512 -""" - - -import t, c - -SHA512_BLOCK_LEN: t.CDefine = 128 -SHA512_DIGEST_LEN: t.CDefine = 64 - -def sha512_ror(x: t.CUInt64T, n: int) -> t.CUInt64T: pass - -def sha512_shr(x: t.CUInt64T, n: int) -> t.CUInt64T: pass - -def sha512_Ch(x: t.CUInt64T, y: t.CUInt64T, z: t.CUInt64T) -> t.CUInt64T: pass - -def sha512_Maj(x: t.CUInt64T, y: t.CUInt64T, z: t.CUInt64T) -> t.CUInt64T: pass - -def sha512_BigSigma0(x: t.CUInt64T) -> t.CUInt64T: pass - -def sha512_BigSigma1(x: t.CUInt64T) -> t.CUInt64T: pass - -def sha512_Sigma0(x: t.CUInt64T) -> t.CUInt64T: pass - -def sha512_Sigma1(x: t.CUInt64T) -> t.CUInt64T: pass - - -sha512_K: t.CExtern | t.CArray[t.CUInt64T, 80] - -@t.Object -class sha512: - state: t.CArray[t.CUInt64T, 8] - count: t.CArray[t.CUInt64T, 2] - buf: t.CArray[t.CUInt8T, SHA512_BLOCK_LEN] - def __init__(self: sha512) -> t.CInt: pass - def transform(self: sha512, block: t.CArray[t.CUInt8T, SHA512_BLOCK_LEN]) -> t.CInt: pass - def update(self: sha512, s: str) -> t.CInt: pass - def final(self: sha512, out: t.CArray[t.CUInt8T, SHA512_DIGEST_LEN]) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/717c696d67fecfc6.doc.json b/.transpyc_cache/717c696d67fecfc6.doc.json deleted file mode 100644 index 95e17f3..0000000 --- a/.transpyc_cache/717c696d67fecfc6.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/717c696d67fecfc6.pyi b/.transpyc_cache/717c696d67fecfc6.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/717c696d67fecfc6.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/71b5771c2400c31a.doc.json b/.transpyc_cache/71b5771c2400c31a.doc.json deleted file mode 100644 index dda4745..0000000 --- a/.transpyc_cache/71b5771c2400c31a.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"get_func_name": "从函数节点提取函数名", "escape_llvm_string": "将字符串转换为 LLVM IR 字符串字面量 c\"...\\00\" ", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "get_llvm_float_bits": "获取 LLVM 浮点类型的位宽,非浮点类型返回 0", "is_ptr_type": "检查 ty 是否是 Ptr 类型,返回 1=是, 0=否", "_deref_if_ptr_ptr": "如果 obj_ptr 是 Ptr(Ptr(...)),load 解引用获取内层指针", "coerce_to_type": "将 val 强制转换为 target_ty\n\n 整数: sext(扩展)/ trunc(截断)\n 浮点: fpext(扩展)/ fptrunc(截断)\n int→float: sitofp\n float→int: fptosi\n ", "create_global_string": "创建全局字符串常量并返回 i8* bitcast", "translate_constant": "翻译常量(int/str/bool)", "_infer_elem_type_from_value": "从 LLVM Value 的类型推断 list 元素类型名", "_find_pool_var": "查找上下文中的 pool 变量,返回 alloca 或 None", "translate_list_literal": "翻译 list 字面量 [a, b, c] → list[T](pool) + append 序列", "translate_value": "翻译值表达式为 LLVM Value", "translate_compare": "翻译比较表达式,返回 i1 结果", "translate_unaryop": "翻译一元运算(-x, +x, not x, ~x)", "translate_boolop": "翻译布尔运算(and/or)的短路求值,返回 i1", "translate_name_value": "翻译变量引用(Name 节点)→ load", "ExprHandle": "表达式处理器:继承 Mixin 获得 Trans 回指针", "ExprHandle.HandleValue": "翻译值表达式,从 self.Trans 获取共享状态", "list_getitem_inline": "内联生成 list __getitem__ 逻辑,返回元素地址 (i8*)", "_list_elem_type_from_name": "从 list 类型名提取元素 LLVM 类型", "list_setitem_inline": "内联生成 list __setitem__ 逻辑,返回 0", "is_list_subscript": "检查 Subscript 节点是否是 list[T] 类型,返回 list 对象指针或 None", "translate_subscript": "翻译下标表达式,返回加载的元素值", "translate_attribute": "翻译属性访问,返回加载的字段值", "get_subscript_ptr": "获取下标表达式的元素指针(用于赋值 lhs)", "get_attribute_ptr": "获取属性访问的字段指针(用于赋值 lhs)"} \ No newline at end of file diff --git a/.transpyc_cache/71b5771c2400c31a.pyi b/.transpyc_cache/71b5771c2400c31a.pyi deleted file mode 100644 index 60fab85..0000000 --- a/.transpyc_cache/71b5771c2400c31a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExpr.py -Module: lib.core.Handles.HandlesExpr -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import llvmlite -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprOps as HandlesExprOps -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -def get_func_name(func_node: ast.AST | t.CPtr) -> str: pass - -def escape_llvm_string(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_llvm_float_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def is_ptr_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _deref_if_ptr_ptr(builder: llvmlite.IRBuilder | t.CPtr, obj_ptr: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def coerce_to_type(builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def create_global_string(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, str_val: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_constant(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_elem_type_from_value(pool: memhub.MemBuddy | t.CPtr, value: llvmlite.Value | t.CPtr) -> str: pass - -def _find_pool_var(trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_list_literal(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, elem_type_name: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_compare(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_unaryop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_boolop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_name_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -@t.NoVTable -class ExprHandle(HandlesBase.Mixin): - def __init__(self: ExprHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleValue(self: ExprHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def NewExprHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprHandle | t.CPtr: pass - -def list_getitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _list_elem_type_from_name(pool: memhub.MemBuddy | t.CPtr, struct_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def list_setitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr, rhs_val: llvmlite.Value | t.CPtr) -> int: pass - -def is_list_subscript(node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_subscript(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_attribute(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_subscript_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_attribute_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/71d73729480f2fd2.doc.json b/.transpyc_cache/71d73729480f2fd2.doc.json deleted file mode 100644 index 046af31..0000000 --- a/.transpyc_cache/71d73729480f2fd2.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"IfHandle": "if/elif/else 语句处理器:继承 Mixin 获得 Trans 回指针", "IfHandle.Handle": "翻译 if/elif/else 语句"} \ No newline at end of file diff --git a/.transpyc_cache/71d73729480f2fd2.pyi b/.transpyc_cache/71d73729480f2fd2.pyi deleted file mode 100644 index fd54f7e..0000000 --- a/.transpyc_cache/71d73729480f2fd2.pyi +++ /dev/null @@ -1,26 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesIf.py -Module: lib.core.Handles.HandlesIf -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesBody as HandlesBody - -@t.NoVTable -class IfHandle(HandlesBase.Mixin): - def __init__(self: IfHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: IfHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewIfHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> IfHandle | t.CPtr: pass diff --git a/.transpyc_cache/71e0a3ffcb3ebfad.pyi b/.transpyc_cache/71e0a3ffcb3ebfad.pyi deleted file mode 100644 index 574b20e..0000000 --- a/.transpyc_cache/71e0a3ffcb3ebfad.pyi +++ /dev/null @@ -1,20 +0,0 @@ -""" -Auto-generated Python stub file from stdarg.py -Module: stdarg -""" - -import c - - -import t - -def va_start(args: t.CPtr, last_arg: t.CPtr) -> t.State: pass - -def va_arg(args: t.CPtr, type: t.CPtr) -> t.CPtr | t.State: pass - -def va_end(args: t.CPtr) -> t.State | t.State: pass - - -va_list: t.CTypedef = t.CUnsignedChar | t.CPtr - -def arg(type: t.CType) -> t.State: pass diff --git a/.transpyc_cache/7259cdb36d66dc67.doc.json b/.transpyc_cache/7259cdb36d66dc67.doc.json deleted file mode 100644 index c3a1e25..0000000 --- a/.transpyc_cache/7259cdb36d66dc67.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"SrcFileEntry": "源文件条目", "RunMultiFileProject": "多文件项目编译\n\n Returns: 0 成功,非 0 失败\n "} \ No newline at end of file diff --git a/.transpyc_cache/7259cdb36d66dc67.pyi b/.transpyc_cache/7259cdb36d66dc67.pyi deleted file mode 100644 index ad12e1f..0000000 --- a/.transpyc_cache/7259cdb36d66dc67.pyi +++ /dev/null @@ -1,39 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Phase2.py -Module: lib.core.Phase2 -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import viperlib -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import sys -import ast -import llvmlite -import subprocess -import argparse -import lib.core.VLogger as VLogger -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.BuildPipeline as BuildPipeline -import lib.core.StubMerger as StubMerger -import lib.Projectrans.Utils as Utils -import lib.Projectrans.Config as Config - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 -MAX_SRC_FILES: t.CDefine = 32 - -@t.NoVTable -class SrcFileEntry: - Path: str - Sha1: str - -def RunMultiFileProject(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, output_dir: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str, includes_dir: str, do_phase1: int, do_phase2: int, log: VLogger.Logger | t.CPtr, args: argparse.ParsedArgs | t.CPtr) -> int: pass diff --git a/.transpyc_cache/73a5dbb3cd24b3bf.doc.json b/.transpyc_cache/73a5dbb3cd24b3bf.doc.json deleted file mode 100644 index 8c2a0a2..0000000 --- a/.transpyc_cache/73a5dbb3cd24b3bf.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"AssignHandle": "Assign 语句处理器:继承 Mixin 获得 Trans 回指针 + 共享方法"} \ No newline at end of file diff --git a/.transpyc_cache/73a5dbb3cd24b3bf.pyi b/.transpyc_cache/73a5dbb3cd24b3bf.pyi deleted file mode 100644 index 1e1b4bd..0000000 --- a/.transpyc_cache/73a5dbb3cd24b3bf.pyi +++ /dev/null @@ -1,29 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesAssign.py -Module: lib.core.Handles.HandlesAssign -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType - -@t.NoVTable -class AssignHandle(HandlesBase.Mixin): - _CurrentClass: str - def __init__(self: AssignHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: AssignHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewAssignHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> AssignHandle | t.CPtr: pass diff --git a/.transpyc_cache/73fcdc4dd1618580.pyi b/.transpyc_cache/73fcdc4dd1618580.pyi deleted file mode 100644 index d94a709..0000000 --- a/.transpyc_cache/73fcdc4dd1618580.pyi +++ /dev/null @@ -1,29 +0,0 @@ -""" -Auto-generated Python stub file from hashlib.__sha1.py -Module: hashlib.__sha1 -""" - - -import t, c - -SHA1_BLOCK_LEN: t.CDefine = 64 -SHA1_DIGEST_LEN: t.CDefine = 20 - -def sha1_rotl(x: t.CUInt32T, n: t.CInt) -> t.CUInt32T: pass - -def sha1_f1(b: t.CUInt32T, c: t.CUInt32T, d: t.CUInt32T) -> t.CUInt32T: pass - -def sha1_f2(b: t.CUInt32T, c: t.CUInt32T, d: t.CUInt32T) -> t.CUInt32T: pass - -def sha1_f3(b: t.CUInt32T, c: t.CUInt32T, d: t.CUInt32T) -> t.CUInt32T: pass - - -@t.Object -class sha1: - state: t.CArray[t.CUInt32T, 5] - count: t.CUInt64T - buf: t.CArray[t.CUInt8T, SHA1_BLOCK_LEN] - def __init__(self: sha1) -> t.CInt: pass - def transform(self: sha1, block: t.CUInt8T | t.CPtr) -> t.CInt: pass - def update(self: sha1, s: str) -> t.CInt: pass - def final(self: sha1, out: t.CArray[t.CUInt8T, SHA1_DIGEST_LEN]) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/744224bb5e87b5ef.doc.json b/.transpyc_cache/744224bb5e87b5ef.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/744224bb5e87b5ef.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/744224bb5e87b5ef.pyi b/.transpyc_cache/744224bb5e87b5ef.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/744224bb5e87b5ef.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/74ca31446cac2107.doc.json b/.transpyc_cache/74ca31446cac2107.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/74ca31446cac2107.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/74ca31446cac2107.pyi b/.transpyc_cache/74ca31446cac2107.pyi deleted file mode 100644 index 5aca605..0000000 --- a/.transpyc_cache/74ca31446cac2107.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from string_min_test.py -Module: string_min_test -""" - - -import stdio -import t, c -import string - -def string_min_test() -> int: pass diff --git a/.transpyc_cache/75583f20a922ab2e.doc.json b/.transpyc_cache/75583f20a922ab2e.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/75583f20a922ab2e.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/75583f20a922ab2e.pyi b/.transpyc_cache/75583f20a922ab2e.pyi deleted file mode 100644 index 10da71f..0000000 --- a/.transpyc_cache/75583f20a922ab2e.pyi +++ /dev/null @@ -1,38 +0,0 @@ -""" -Auto-generated Python stub file from zc.test.py -Module: zc.test -""" - - -import config -import t, c - -def AboutSizeTWhileTest(length: t.CSizeT) -> t.CInt: pass - -def MathBasicTest(x: t.CInt, y: t.CInt) -> t.CInt: pass - -def MathAdvancedTest(value: t.CInt) -> t.CInt: pass - -def WhileWithElifElseTest(start: t.CInt, end: t.CInt) -> t.CInt: pass - -def NestedWhileWithMacrosTest(outer_limit: t.CInt, inner_limit: t.CInt) -> t.CInt: pass - -def ComplexConditionTest(a: t.CInt, b: t.CInt, c_val: t.CInt) -> t.CInt: pass - -def RetryLoopTest(retry_count: t.CInt) -> t.CInt: pass - -def BitwiseOperationsTest(value: t.CInt) -> t.CInt: pass - -def CompoundAssignmentMathTest(a: t.CInt, b: t.CInt) -> t.CInt: pass - -def PowerAndModuloTest(base: t.CInt, exponent: t.CInt) -> t.CInt: pass - -def MixedArithmeticTest(x: t.CInt, y: t.CInt, z: t.CInt) -> t.CInt: pass - -def MathWithWhileLoopTest(start: t.CInt, count: t.CInt) -> t.CInt: pass - -def ComplexNestedMathTest(a: t.CInt, b: t.CInt) -> t.CInt: pass - -def ConditionalMathChainTest(value: t.CInt) -> t.CInt: pass - -def BitManipulationMathTest(value: t.CInt) -> t.CInt: pass diff --git a/.transpyc_cache/75dc9247529e6e0e.doc.json b/.transpyc_cache/75dc9247529e6e0e.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/75dc9247529e6e0e.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/75dc9247529e6e0e.pyi b/.transpyc_cache/75dc9247529e6e0e.pyi deleted file mode 100644 index 7f94c53..0000000 --- a/.transpyc_cache/75dc9247529e6e0e.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from deco_test.py -Module: deco_test -""" - - -import stdio -import t, c -import string - -MAX_VALUE: t.CDefine = 256 -PI_APPROX: t.CDefine = 314 - -def ExportedAdd(a: t.CInt, b: t.CInt) -> t.CInt | t.CExport: pass - -def InlineSquare(x: t.CInt) -> t.CInt | t.CInline: pass - -def NormalSub(a: t.CInt, b: t.CInt) -> t.CInt: pass - -def ExportedInlineCube(x: t.CInt) -> t.CInt | t.CExport | t.CInline: pass - -def ExportedFindChar(s: str, ch: t.CInt) -> str | t.CExport: pass - -def test_cdefine() -> t.CInt: pass - -def test_cexport() -> t.CInt: pass - -def test_cinline() -> t.CInt: pass - -def test_deco_normal() -> t.CInt: pass - -def test_export_inline() -> t.CInt: pass - -def test_export_ptr() -> t.CInt: pass - -def ExternalDecl(x: t.CInt) -> t.CInt | t.CExtern | t.CExport: pass - -def StateDecl(x: t.CInt) -> t.CInt | t.State: pass - -def StateVoidDecl() -> t.State: pass - -def test_extern_decl() -> t.CInt: pass - -def test_state_decl() -> t.CInt: pass - -def test_state_void_decl() -> t.CInt: pass - -def deco_test() -> int: pass diff --git a/.transpyc_cache/766d8e14db1ff917.doc.json b/.transpyc_cache/766d8e14db1ff917.doc.json deleted file mode 100644 index f67a6e1..0000000 --- a/.transpyc_cache/766d8e14db1ff917.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/766d8e14db1ff917.pyi b/.transpyc_cache/766d8e14db1ff917.pyi deleted file mode 100644 index 477ab88..0000000 --- a/.transpyc_cache/766d8e14db1ff917.pyi +++ /dev/null @@ -1,169 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/76dd6c275aa72b3b.pyi b/.transpyc_cache/76dd6c275aa72b3b.pyi deleted file mode 100644 index cd52873..0000000 --- a/.transpyc_cache/76dd6c275aa72b3b.pyi +++ /dev/null @@ -1,41 +0,0 @@ -""" -Auto-generated Python stub file from os.__init__.py -Module: os.__init__ -""" - - -import t, c -from stdint import * -import platmacro -import memhub -import os.path -import os._win32 -import os._posix - -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr - -def exists(path: str) -> bool: pass - -def isdir(path: str) -> bool: pass - -def isfile(path: str) -> bool: pass - -def getsize(path: str) -> t.CInt64T: pass - -def getcwd() -> str: pass - -def chdir(path: str) -> int: pass - -def mkdir(path: str) -> int: pass - -def remove(path: str) -> int: pass - -def rmdir(path: str) -> int: pass - -def rename(old_path: str, new_path: str) -> int: pass - -def chmod(path: str, mode: int) -> int: pass - -def listdir(path: str, out_names: str, max_count: ULONG) -> ULONG: pass - -def system(cmd: str) -> int: pass diff --git a/.transpyc_cache/78418cf2ee722f0f.doc.json b/.transpyc_cache/78418cf2ee722f0f.doc.json deleted file mode 100644 index 04e9521..0000000 --- a/.transpyc_cache/78418cf2ee722f0f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"test_cdefine_values": "测试 CDefine 常量值是否正确", "test_bitops_width": "测试位运算是否保持正确类型宽度"} \ No newline at end of file diff --git a/.transpyc_cache/78418cf2ee722f0f.pyi b/.transpyc_cache/78418cf2ee722f0f.pyi deleted file mode 100644 index 0e4d365..0000000 --- a/.transpyc_cache/78418cf2ee722f0f.pyi +++ /dev/null @@ -1,50 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import t, c -import stdio -import string -import w32.win32console -import w32.win32memory -import testcheck - -def test_zext_u8_u32() -> t.CInt: pass - -def test_sext_i8_i32() -> t.CInt: pass - -def test_zext_u32_u64() -> t.CInt: pass - -def test_sext_i32_i64() -> t.CInt: pass - -def test_trunc_u64_u32() -> t.CInt: pass - -def test_mixed_signed_unsigned() -> t.CInt: pass - - -VAL_32BIT: t.CDefine = 0x80000000 -VAL_NEG: t.CDefine = -1 -VAL_BIG: t.CDefine = 0xFFFFFFFF - -def test_cdefine_values() -> t.CInt: pass - -def test_bitops_width() -> t.CInt: pass - -def test_unsigned_divmod() -> t.CInt: pass - -def test_signed_divmod_neg() -> t.CInt: pass - -def test_comparison_types() -> t.CInt: pass - -def test_ptr_int_cast() -> t.CInt: pass - -def test_u64_mul() -> t.CInt: pass - -def test_bool_ops() -> t.CInt: pass - -def test_ternary() -> t.CInt: pass - -def main() -> t.CInt | t.CExport: pass diff --git a/.transpyc_cache/784dde8a8697b7ab.doc.json b/.transpyc_cache/784dde8a8697b7ab.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/784dde8a8697b7ab.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/784dde8a8697b7ab.pyi b/.transpyc_cache/784dde8a8697b7ab.pyi deleted file mode 100644 index 193ea96..0000000 --- a/.transpyc_cache/784dde8a8697b7ab.pyi +++ /dev/null @@ -1,54 +0,0 @@ -""" -Auto-generated Python stub file from __zlib.zdeflate.py -Module: __zlib.zdeflate -""" - - -from stdint import * -import zchecksum -import zhuff -import zdef -import string -import t, c - -@t.Object -class zdeflate_stream: - writer: zdef.zbit_writer - window: BYTE | t.CPtr - window_pos: t.CInt - window_size: t.CInt - hash_head: t.CInt | t.CPtr - hash_prev: t.CInt | t.CPtr - level: t.CInt - strategy: t.CInt - wbits: t.CInt - is_finished: t.CInt - adler: t.CUInt32T - def find_match(self: zdeflate_stream, data: BYTE | t.CPtr, data_len: t.CSizeT, pos: t.CSizeT, best_dist: t.CInt | t.CPtr) -> t.CInt: pass - def update_hash(self: zdeflate_stream, data: BYTE | t.CPtr, pos: t.CSizeT) -> t.CInt: pass - def write_fixed_block(self: zdeflate_stream, data: UINT8PTR, length: t.CSizeT, final: t.CInt) -> t.CInt: pass - def encode_block_data(self: zdeflate_stream, data: UINT8PTR, length: t.CSizeT, lit_tree: zhuff.zhuff_tree | t.CPtr, dist_tree: zhuff.zhuff_tree | t.CPtr) -> t.CInt: pass - def write_dynamic_block(self: zdeflate_stream, data: UINT8PTR, length: t.CSizeT, final: t.CInt) -> t.CInt: pass - def compress_block(self: zdeflate_stream, data: UINT8PTR, length: t.CSizeT, final: t.CInt) -> t.CInt: pass - def write_stored_block(self: zdeflate_stream, data: UINT8PTR, length: t.CSizeT, final: t.CInt) -> t.CInt: pass - def compress(self: zdeflate_stream, data: UINT8PTR, length: t.CSizeT, out: t.CUInt8T | t.CPtr[t.CPtr], out_len: t.CSizeT | t.CPtr) -> t.CInt: pass - def flush(self: zdeflate_stream, mode: t.CInt, out: t.CUInt8T | t.CPtr[t.CPtr], out_len: t.CSizeT | t.CPtr) -> t.CInt: pass - def set_dictionary(self: zdeflate_stream, dict: UINT8PTR, length: t.CSizeT) -> t.CInt: pass - def copy(self: zdeflate_stream) -> zdeflate_stream | t.CPtr: pass - def destroy(self: zdeflate_stream) -> t.CInt: pass - -def zdeflate_count_freqs(lit_freqs: INTPTR, dist_freqs: INTPTR, s: zdeflate_stream | t.CPtr, data: UINT8PTR, length: t.CSizeT) -> t.CInt: pass - -def zdeflate_hash(p: BYTE | t.CPtr) -> t.CUnsignedInt: pass - -def zdeflate_len_to_symbol(length: t.CInt) -> t.CInt: pass - -def zdeflate_dist_to_symbol(dist: t.CInt) -> t.CInt: pass - -def zdeflate_count_cl_freqs(all_lengths: INTPTR, total: t.CInt, cl_freqs: INTPTR) -> t.CInt: pass - -def zdeflate_write_cl_encoded(all_lengths: INTPTR, total: t.CInt, w: zdef.zbit_writer | t.CPtr, cl_tree: zhuff.zhuff_tree | t.CPtr) -> t.CInt: pass - -def zdeflate_create(level: t.CInt, wbits: t.CInt, mem_level: t.CInt, strategy: t.CInt) -> zdeflate_stream | t.CPtr: pass - -def zdeflate_one_shot(data: UINT8PTR, length: t.CSizeT, level: t.CInt, wbits: t.CInt, out_len: t.CSizeT | t.CPtr) -> t.CUInt8T | t.CPtr: pass diff --git a/.transpyc_cache/78943d0dbc89a29a.doc.json b/.transpyc_cache/78943d0dbc89a29a.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/78943d0dbc89a29a.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/78943d0dbc89a29a.pyi b/.transpyc_cache/78943d0dbc89a29a.pyi deleted file mode 100644 index ce1d065..0000000 --- a/.transpyc_cache/78943d0dbc89a29a.pyi +++ /dev/null @@ -1,16 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import w32.win32console -import t, c -from t import CInt, CExport -import stdio -import stdlib -import string -import testcheck - -def main() -> CInt | CExport: pass diff --git a/.transpyc_cache/78bbe886bbe5ca8f.doc.json b/.transpyc_cache/78bbe886bbe5ca8f.doc.json deleted file mode 100644 index ffc63a6..0000000 --- a/.transpyc_cache/78bbe886bbe5ca8f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"add_imported_module": "记录已导入的模块名,返回新的 imported_modules 字符串指针", "is_module_imported": "检查模块是否已导入(词边界精确匹配,避免子串误匹配)", "add_from_import": "添加 from-import 映射 \"name:module\",返回新的 from_imports 字符串", "lookup_from_import": "查找 from-import 名称,返回模块名或 None\n\n 支持 star import: 如果 from_imports 中有 \"*:module\" 条目,\n 且未找到精确名称匹配,且 allow_star_fallback != 0,则返回 star import 的模块名。\n ", "_resolve_relative_module": "解析相对导入为完整模块名", "compute_package_from_relpath": "从相对路径计算包名(目录部分,分隔符替换为 .)", "ImportsHandle": "导入语句处理器:继承 Mixin 获得 Trans 回指针", "ImportsHandle.HandleImport": "处理 import 语句,返回 0", "ImportsHandle.HandleImportFromModule": "处理 from X import Y 的模块部分,更新 trans._imported_modules", "ImportsHandle.HandleImportFromNames": "处理 from X import Y 的名称部分,更新 trans._from_imports"} \ No newline at end of file diff --git a/.transpyc_cache/78bbe886bbe5ca8f.pyi b/.transpyc_cache/78bbe886bbe5ca8f.pyi deleted file mode 100644 index 868248b..0000000 --- a/.transpyc_cache/78bbe886bbe5ca8f.pyi +++ /dev/null @@ -1,38 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesImports.py -Module: lib.core.Handles.HandlesImports -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import viperlib -import stdio -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesStruct as HandlesStruct - -def add_imported_module(pool: memhub.MemBuddy | t.CPtr, imported_modules: str, name: str) -> str: pass - -def is_module_imported(imported_modules: str, name: str) -> int: pass - -def add_from_import(pool: memhub.MemBuddy | t.CPtr, from_imports: str, local_name: str, module_name: str) -> str: pass - -def lookup_from_import(from_imports: str, name: str, allow_star_fallback: int) -> str: pass - -def _resolve_relative_module(pool: memhub.MemBuddy | t.CPtr, current_package: str, level: t.CInt, module: str) -> str: pass - -def compute_package_from_relpath(pool: memhub.MemBuddy | t.CPtr, rel_path: str) -> str: pass - - -@t.NoVTable -class ImportsHandle(HandlesBase.Mixin): - def __init__(self: ImportsHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleImport(self: ImportsHandle, node: ast.AST | t.CPtr) -> int: pass - def HandleImportFromModule(self: ImportsHandle, node: ast.AST | t.CPtr) -> int: pass - def HandleImportFromNames(self: ImportsHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewImportsHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ImportsHandle | t.CPtr: pass diff --git a/.transpyc_cache/79ce76014465c04f.doc.json b/.transpyc_cache/79ce76014465c04f.doc.json deleted file mode 100644 index 6723531..0000000 --- a/.transpyc_cache/79ce76014465c04f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"reset_visible_structs": "重置可见性状态(每个文件翻译前调用)\n\n pool: 内存分配器(严格模式下创建 HashTable)\n strict: 1=严格模式(用户文件),0=宽松模式(includes 文件)\n ", "add_visible_struct": "添加可见结构体名(类定义时和 from-import 时调用)", "is_struct_visible": "检查结构体是否可见,返回 1=可见 / 0=不可见", "init_struct_table": "初始化结构体注册表,返回 1 成功", "_get_struct_entry": "获取第 i 个结构体条目", "_get_field_entry": "获取结构体中第 i 个字段条目", "register_struct": "注册结构体类型,返回 StructEntry 指针\n\n 用类型指针去重(is 比较),不用类名去重。\n 这样跨模块同名类可以共存,各自有独立的字段定义。\n sha1 参数在注册时直接设置 ModuleSha1(避免 set_struct_sha1 找错 entry)。\n ", "set_struct_sha1": "设置结构体所属模块的 SHA1,返回 1=成功 / 0=失败", "get_struct_sha1": "获取结构体所属模块的 SHA1,返回 None=无 SHA1", "add_field": "向结构体添加字段,返回字段索引(-1 失败)\n\n default_val: 字段默认值 AST 节点(可选,None=无默认值)\n ", "find_struct": "按类名查找结构体,返回 StructEntry 或 None", "find_struct_by_module": "按类名 + SHA1 查找结构体,返回 StructEntry 或 None\n\n SHA1 非 None 时:精确匹配 name+sha1,未找到返回 None(不回退,避免跨模块同名找错)\n SHA1 为 None 时:回退到 find_struct(name) 按类名查找第一个\n ", "find_struct_by_type": "按类型指针查找结构体(is 比较),返回 StructEntry 或 None", "lookup_field": "按结构体类型和字段名查找字段信息\n\n 两遍查找策略(跨模块同名类冲突的根本修复):\n 第一遍: 类型指针 is 身份比较(最高优先级,类型唯一确定 entry)\n 第二遍: 名称回退(is 未匹配时,按类名/strstr 匹配,字段未找到时 continue)\n ", "lookup_field_by_class": "按类名和字段名查找字段信息\n\n 优先用 SHA1 匹配(跨模块同名类区分),无 SHA1 时按类名查找第一个\n ", "get_struct_type": "按类名获取结构体的 LLVM 类型", "get_field_by_index": "按类名和字段索引获取字段信息", "struct_has_defaults": "检查结构体是否有任何带默认值的字段,返回 1=有 / 0=无", "_is_struct_type": "检查 ty 是否是 Struct 类型(独立函数,规避嵌套 match 编译器 BUG)", "get_struct_type_from_value": "从 Value 的类型推断结构体类型", "mark_as_union": "标记已注册的结构体为联合体,返回 1=成功 / 0=失败", "is_union_by_name": "按类名检查是否为联合体,返回 1=是 / 0=否", "is_union_by_type": "按类型指针检查是否为联合体,返回 1=是 / 0=否\n\n 先尝试类型指针 == 比较,失败时回退到名称匹配\n ", "mark_as_oop": "标记已注册的结构体为 OOP,返回 1=成功 / 0=失败", "is_oop_by_name": "按类名检查是否为 OOP 结构体,返回 1=是 / 0=否", "mark_has_init": "标记结构体拥有 __init__ 方法,返回 1=成功 / 0=失败", "has_init_by_name": "按类名检查是否有 __init__ 方法,返回 1=有 / 0=无", "mark_has_new": "标记结构体拥有 __new__ 方法,返回 1=成功 / 0=失败", "has_new_by_name": "按类名检查是否有 __new__ 方法,返回 1=有 / 0=无", "get_class_name_by_type": "按类型指针查找类名,返回类名字符串或 None", "_extract_struct_name": "从 LLVMType 提取 Struct 变体的 Name 字段,返回 None 非 Struct", "mark_has_vtable": "标记结构体拥有虚表,返回 1=成功 / 0=失败", "has_vtable_by_name": "按类名检查是否有虚表,返回 1=有 / 0=无", "mark_novtable": "标记结构体为 NoVTable,返回 1=成功 / 0=失败", "is_novtable_by_name": "按类名检查是否为 NoVTable,返回 1=是 / 0=否", "set_parent_name": "设置结构体的父类名,返回 1=成功 / 0=失败", "get_parent_name": "获取结构体的父类名,返回 None=无父类", "set_vtable_methods": "设置虚表方法名数组,返回 1=成功 / 0=失败", "get_vtable_method_index": "获取方法在虚表中的索引,返回 -1=未找到", "get_vtable_method_count": "获取虚表方法数量", "get_vtable_method_name": "获取虚表中第 idx 个方法名,返回 None=越界", "get_field_count": "获取结构体字段数量,返回 -1=未找到", "get_field_name_ptr": "获取 FieldEntry 的字段名,返回 None=未设置", "get_field_type_ptr": "获取 FieldEntry 的字段类型,返回 None=未设置", "get_field_default_ptr": "获取 FieldEntry 的默认值 AST 节点,返回 None=无默认值"} \ No newline at end of file diff --git a/.transpyc_cache/79ce76014465c04f.pyi b/.transpyc_cache/79ce76014465c04f.pyi deleted file mode 100644 index b854517..0000000 --- a/.transpyc_cache/79ce76014465c04f.pyi +++ /dev/null @@ -1,136 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesStruct.py -Module: lib.core.Handles.HandlesStruct -""" - - -import t, c -from stdint import * -import memhub -import string -import llvmlite -import stdio -import ast -import hashtable - -STRUCT_MAX: t.CDefine = 512 -FIELD_MAX: t.CDefine = 32 -FIELD_NAME_MAX: t.CDefine = 64 - -@t.NoVTable -class FieldEntry: - Name: t.CChar | t.CPtr - Index: int - Ty: llvmlite.LLVMType | t.CPtr - DefaultVal: ast.AST | t.CPtr -@t.NoVTable -class StructEntry: - Name: t.CChar | t.CPtr - Ty: llvmlite.LLVMType | t.CPtr - FieldCount: int - Fields: FieldEntry | t.CPtr - IsUnion: int - IsOOP: int - HasInit: int - HasNew: int - HasVTable: int - IsNoVTable: int - ParentName: t.CChar | t.CPtr - VTableMethodCount: int - VTableMethods: t.CChar | t.CPtr - ModuleSha1: t.CChar | t.CPtr - -_struct_table: t.CExtern | StructEntry | t.CPtr -_struct_count: t.CExtern | int -_visible_structs: t.CExtern | hashtable.HashTable | t.CPtr -_strict_visibility: t.CExtern | int - -def reset_visible_structs(pool: memhub.MemBuddy | t.CPtr, strict: int) -> t.CInt: pass - -def add_visible_struct(pool: memhub.MemBuddy | t.CPtr, name: str) -> t.CInt: pass - -def is_struct_visible(name: str) -> int: pass - -def init_struct_table(pool: memhub.MemBuddy | t.CPtr) -> int: pass - -def _get_struct_entry(i: int) -> StructEntry | t.CPtr: pass - -def _get_field_entry(struct_entry: StructEntry | t.CPtr, i: int) -> FieldEntry | t.CPtr: pass - -def register_struct(pool: memhub.MemBuddy | t.CPtr, name: str, struct_ty: llvmlite.LLVMType | t.CPtr, sha1: str) -> StructEntry | t.CPtr: pass - -def set_struct_sha1(pool: memhub.MemBuddy | t.CPtr, class_name: str, sha1: str) -> int: pass - -def get_struct_sha1(class_name: str) -> str: pass - -def add_field(pool: memhub.MemBuddy | t.CPtr, struct_entry: StructEntry | t.CPtr, field_name: str, field_ty: llvmlite.LLVMType | t.CPtr, default_val: ast.AST | t.CPtr) -> int: pass - -def find_struct(name: str) -> StructEntry | t.CPtr: pass - -def find_struct_by_module(name: str, sha1: str) -> StructEntry | t.CPtr: pass - -def find_struct_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> StructEntry | t.CPtr: pass - -def lookup_field(struct_ty: llvmlite.LLVMType | t.CPtr, field_name: str) -> FieldEntry | t.CPtr: pass - -def lookup_field_by_class(class_name: str, field_name: str, sha1: str) -> FieldEntry | t.CPtr: pass - -def get_struct_type(class_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def get_field_by_index(class_name: str, idx: int) -> FieldEntry | t.CPtr: pass - -def struct_has_defaults(class_name: str) -> int: pass - -def _is_struct_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_struct_type_from_value(val: llvmlite.Value | t.CPtr) -> llvmlite.LLVMType | t.CPtr: pass - -def mark_as_union(name: str) -> int: pass - -def is_union_by_name(name: str) -> int: pass - -def is_union_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def mark_as_oop(name: str) -> int: pass - -def is_oop_by_name(name: str) -> int: pass - -def mark_has_init(name: str) -> int: pass - -def has_init_by_name(name: str) -> int: pass - -def mark_has_new(name: str) -> int: pass - -def has_new_by_name(name: str) -> int: pass - -def get_class_name_by_type(pool: memhub.MemBuddy | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr) -> str: pass - -def _extract_struct_name(ty: llvmlite.LLVMType | t.CPtr) -> str: pass - -def mark_has_vtable(name: str) -> int: pass - -def has_vtable_by_name(name: str) -> int: pass - -def mark_novtable(name: str) -> int: pass - -def is_novtable_by_name(name: str) -> int: pass - -def set_parent_name(name: str, parent_name: str) -> int: pass - -def get_parent_name(name: str) -> str: pass - -def set_vtable_methods(name: str, methods: t.CChar | t.CPtr, count: int) -> int: pass - -def get_vtable_method_index(name: str, method_name: str) -> int: pass - -def get_vtable_method_count(name: str) -> int: pass - -def get_vtable_method_name(name: str, idx: int) -> str: pass - -def get_field_count(name: str) -> int: pass - -def get_field_name_ptr(fe: FieldEntry | t.CPtr) -> str: pass - -def get_field_type_ptr(fe: FieldEntry | t.CPtr) -> llvmlite.LLVMType | t.CPtr: pass - -def get_field_default_ptr(fe: FieldEntry | t.CPtr) -> ast.AST | t.CPtr: pass diff --git a/.transpyc_cache/79ef7477acd14bd7.doc.json b/.transpyc_cache/79ef7477acd14bd7.doc.json deleted file mode 100644 index 7996d5c..0000000 --- a/.transpyc_cache/79ef7477acd14bd7.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"get_func_name": "从函数节点提取函数名", "escape_llvm_string": "将字符串转换为 LLVM IR 字符串字面量 c\"...\\00\" ", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "get_llvm_float_bits": "获取 LLVM 浮点类型的位宽,非浮点类型返回 0", "is_ptr_type": "检查 ty 是否是 Ptr 类型,返回 1=是, 0=否", "_deref_if_ptr_ptr": "如果 obj_ptr 是 Ptr(Ptr(...)),load 解引用获取内层指针", "coerce_to_type": "将 val 强制转换为 target_ty\n\n 整数: sext(扩展)/ trunc(截断)\n 浮点: fpext(扩展)/ fptrunc(截断)\n int→float: sitofp\n float→int: fptosi\n ", "create_global_string": "创建全局字符串常量并返回 i8* bitcast", "translate_constant": "翻译常量(int/str/bool)", "translate_value": "翻译值表达式为 LLVM Value", "translate_compare": "翻译比较表达式,返回 i1 结果", "translate_unaryop": "翻译一元运算(-x, +x, not x, ~x)", "translate_boolop": "翻译布尔运算(and/or)的短路求值,返回 i1", "translate_name_value": "翻译变量引用(Name 节点)→ load", "ExprHandle": "表达式处理器:继承 Mixin 获得 Trans 回指针", "ExprHandle.HandleValue": "翻译值表达式,从 self.Trans 获取共享状态", "translate_subscript": "翻译下标表达式,返回加载的元素值", "translate_attribute": "翻译属性访问,返回加载的字段值", "get_subscript_ptr": "获取下标表达式的元素指针(用于赋值 lhs)", "get_attribute_ptr": "获取属性访问的字段指针(用于赋值 lhs)"} \ No newline at end of file diff --git a/.transpyc_cache/79ef7477acd14bd7.pyi b/.transpyc_cache/79ef7477acd14bd7.pyi deleted file mode 100644 index 9aa684e..0000000 --- a/.transpyc_cache/79ef7477acd14bd7.pyi +++ /dev/null @@ -1,69 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExpr.py -Module: lib.core.Handles.HandlesExpr -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import llvmlite -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprOps as HandlesExprOps -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -def get_func_name(func_node: ast.AST | t.CPtr) -> str: pass - -def escape_llvm_string(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_llvm_float_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def is_ptr_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _deref_if_ptr_ptr(builder: llvmlite.IRBuilder | t.CPtr, obj_ptr: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def coerce_to_type(builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def create_global_string(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, str_val: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_constant(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_compare(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_unaryop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_boolop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_name_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -@t.NoVTable -class ExprHandle(HandlesBase.Mixin): - def __init__(self: ExprHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleValue(self: ExprHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def NewExprHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprHandle | t.CPtr: pass - -def translate_subscript(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_attribute(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -import stdio - -def get_subscript_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_attribute_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/7b6b920fefb08181.doc.json b/.transpyc_cache/7b6b920fefb08181.doc.json deleted file mode 100644 index 8c2a0a2..0000000 --- a/.transpyc_cache/7b6b920fefb08181.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"AssignHandle": "Assign 语句处理器:继承 Mixin 获得 Trans 回指针 + 共享方法"} \ No newline at end of file diff --git a/.transpyc_cache/7b6b920fefb08181.pyi b/.transpyc_cache/7b6b920fefb08181.pyi deleted file mode 100644 index a5ea74e..0000000 --- a/.transpyc_cache/7b6b920fefb08181.pyi +++ /dev/null @@ -1,28 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesAssign.py -Module: lib.core.Handles.HandlesAssign -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType - -@t.NoVTable -class AssignHandle(HandlesBase.Mixin): - _CurrentClass: str - def __init__(self: AssignHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: AssignHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewAssignHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> AssignHandle | t.CPtr: pass diff --git a/.transpyc_cache/7bb99cc1646d2ae2.doc.json b/.transpyc_cache/7bb99cc1646d2ae2.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/7bb99cc1646d2ae2.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/7bb99cc1646d2ae2.pyi b/.transpyc_cache/7bb99cc1646d2ae2.pyi deleted file mode 100644 index a0accc6..0000000 --- a/.transpyc_cache/7bb99cc1646d2ae2.pyi +++ /dev/null @@ -1,44 +0,0 @@ -""" -Auto-generated Python stub file from test_main.py -Module: test_main -""" - - -import stdio -import t, c -import testcheck -from stdint import * -from asm_test import asm_test -from attr_test import attr_test -from augassign_test import augassign_test -from closure_test import closure_test -from deco_test import deco_test -from deref_min_test import deref_min_test -from deref_test import deref_test -from eq_test import eq_test -from float_test import float_test -from flow_test import flow_test -from for_test import for_test -from func_test import func_test -from llvmir_test import llvmir_test -from oop_test import oop_test -from ptr_only_test import ptr_only_test -from ptr_test import ptr_test -from simple_test import simple_test -from string_min_test import string_min_test -from string_test import string_test -from struct_test import struct_test -from type_bit_test import type_bit_test -from vtable_test import vtable_test -from inherit_test import inherit_test -from func_vtable_test import func_vtable_test -from virtual_dispatch_test import virtual_dispatch_test -from new_test import new_test -from namespace_test import namespace_test -from testcheck_test import testcheck_test -from opovl_test import opovl_test -from generic_test import generic_test - -def check_heap(name: str) -> int: pass - -def main() -> int: pass diff --git a/.transpyc_cache/7c5d5ec59c5fb0a8.doc.json b/.transpyc_cache/7c5d5ec59c5fb0a8.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/7c5d5ec59c5fb0a8.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/7c5d5ec59c5fb0a8.pyi b/.transpyc_cache/7c5d5ec59c5fb0a8.pyi deleted file mode 100644 index 3c94870..0000000 --- a/.transpyc_cache/7c5d5ec59c5fb0a8.pyi +++ /dev/null @@ -1,765 +0,0 @@ -""" -Auto-generated Python stub file from cpython.py -Module: cpython -""" - - -import t, c - -class PyObject: - ob_refcnt: t.CLong - ob_type: t.CPtr - -def Py_INCREF(op: PyObject | t.CPtr) -> t.CVoid | t.State: pass - -def Py_DECREF(op: PyObject | t.CPtr) -> t.CVoid | t.State: pass - -def Py_XINCREF(op: PyObject | t.CPtr) -> t.CVoid | t.State: pass - -def Py_XDECREF(op: PyObject | t.CPtr) -> t.CVoid | t.State: pass - -def Py_DecRef(op: PyObject | t.CPtr) -> t.CVoid | t.State: pass - -def Py_Initialize() -> t.CVoid | t.State: pass - -def Py_Finalize() -> t.CVoid | t.State: pass - -def Py_InitializeEx(initsigs: t.CInt) -> t.CVoid | t.State: pass - -def Py_FinalizeEx() -> t.CInt | t.State: pass - -def Py_IsInitialized() -> t.CInt | t.State: pass - - -class PySTATUS: - func: t.CConst | str - err_msg: t.CConst | str - exitcode: t.CInt -class PyPreConfig: - _config_version: t.CInt - _config_init: t.CInt - parse_argv: t.CInt - isolated: t.CInt - use_environment: t.CInt - utf8_mode: t.CInt - coerce_c_locale: t.CInt - C_locale_warnings: t.CInt - allocator: t.CInt - dev_mode: t.CInt -class PyWideStringList: - length: t.CSizeT - items: t.CPtr -class PyConfig: - _config_version: t.CInt - _config_init: t.CInt - isolated: t.CInt - use_environment: t.CInt - dev_mode: t.CInt - install_signal_handlers: t.CInt - use_hash_seed: t.CInt - hash_seed: t.CUnsignedLong - faulthandler: t.CInt - tracemalloc: t.CInt - import_time: t.CInt - show_ref_count: t.CInt - dump_refs: t.CInt - dump_refs_file: t.CConst | str - malloc_stats: t.CInt - filesystem_errors: t.CInt - pycache_prefix: t.CConst | str - parse_argv: t.CInt - argv: PyWideStringList - program_name: t.CConst | str - xoptions: PyWideStringList - warnoptions: PyWideStringList - site_import: t.CInt - bytes_warning: t.CInt - warn_default_encoding: t.CInt - inspect: t.CInt - interactive: t.CInt - optimization_level: t.CInt - parser_debug: t.CInt - verbose: t.CInt - quiet: t.CInt - home: t.CConst | str - pythonpath_env: t.CConst | str - module_search_paths: PyWideStringList - module_search_paths_set: t.CInt - executable: t.CConst | str - base_executable: t.CConst | str - prefix: t.CConst | str - base_prefix: t.CConst | str - exec_prefix: t.CConst | str - base_exec_prefix: t.CConst | str - platlibdir: t.CConst | str - stdio_filename: t.CConst | str - -def PyConfig_InitPythonConfig(config: PyConfig | t.CPtr) -> t.CVoid | t.State: pass - -def PyConfig_InitIsolatedConfig(config: PyConfig | t.CPtr) -> t.CVoid | t.State: pass - -def PyConfig_Clear(config: PyConfig | t.CPtr) -> t.CVoid | t.State: pass - -def PyConfig_Read(config: PyConfig | t.CPtr) -> PySTATUS | t.State: pass - -def Py_InitializeFromConfig(config: PyConfig | t.CPtr) -> PySTATUS | t.State: pass - -def Py_DecodeLocale(s: t.CConst | str) -> str | t.State: pass - -def PyStatus_Exception(status: PySTATUS) -> t.CInt | t.State: pass - -def PyLong_FromLong(v: t.CLong) -> PyObject | t.CPtr | t.State: pass - -def PyLong_FromUnsignedLong(v: t.CUnsignedLong) -> PyObject | t.CPtr | t.State: pass - -def PyLong_FromLongLong(v: t.CLong) -> PyObject | t.CPtr | t.State: pass - -def PyLong_FromUnsignedLongLong(v: t.CUnsignedLong) -> PyObject | t.CPtr | t.State: pass - -def PyLong_FromSsize_t(v: t.CPtrDiffT) -> PyObject | t.CPtr | t.State: pass - -def PyLong_FromSize_t(v: t.CSizeT) -> PyObject | t.CPtr | t.State: pass - -def PyLong_FromDouble(v: t.CDouble) -> PyObject | t.CPtr | t.State: pass - -def PyLong_AsLong(obj: PyObject | t.CPtr) -> t.CLong | t.State: pass - -def PyLong_AsUnsignedLong(obj: PyObject | t.CPtr) -> t.CUnsignedLong | t.State: pass - -def PyLong_AsLongLong(obj: PyObject | t.CPtr) -> t.CLong | t.State: pass - -def PyLong_AsUnsignedLongLong(obj: PyObject | t.CPtr) -> t.CUnsignedLong | t.State: pass - -def PyLong_AsDouble(obj: PyObject | t.CPtr) -> t.CDouble | t.State: pass - -def PyLong_AsSsize_t(obj: PyObject | t.CPtr) -> t.CPtrDiffT | t.State: pass - -def PyLong_AsSize_t(obj: PyObject | t.CPtr) -> t.CSizeT | t.State: pass - -def PyFloat_FromDouble(v: t.CDouble) -> PyObject | t.CPtr | t.State: pass - -def PyFloat_AsDouble(obj: PyObject | t.CPtr) -> t.CDouble | t.State: pass - -def PyFloat_FromString(s: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyUnicode_FromString(u: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def PyUnicode_FromStringAndSize(u: t.CConst | str, size: t.CSizeT) -> PyObject | t.CPtr | t.State: pass - -def PyUnicode_FromFormat(fmt: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def PyUnicode_AsUTF8(obj: PyObject | t.CPtr) -> str | t.State: pass - -def PyUnicode_AsUTF8AndSize(obj: PyObject | t.CPtr, size: t.CPtrDiffT | t.CPtr) -> str | t.State: pass - -def PyUnicode_AsWideChar(obj: PyObject | t.CPtr, wbuf: t.CPtr, bufsize: t.CSizeT) -> t.CSizeT | t.State: pass - -def PyUnicode_GetLength(obj: PyObject | t.CPtr) -> t.CPtrDiffT | t.State: pass - -def PyUnicode_ReadChar(obj: PyObject | t.CPtr, idx: t.CSizeT) -> t.CUInt32T | t.State: pass - -def PyUnicode_WriteChar(obj: PyObject | t.CPtr, idx: t.CSizeT, ch: t.CUInt32T) -> t.CInt | t.State: pass - -def PyUnicode_Compare(l: PyObject | t.CPtr, r: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyUnicode_Concat(l: PyObject | t.CPtr, r: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyUnicode_Contains(container: PyObject | t.CPtr, element: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyUnicode_Format(fmt: PyObject | t.CPtr, args: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyUnicode_InternInPlace(s: PyObject | t.CPtr | t.CPtr) -> t.CVoid | t.State: pass - -def PyUnicode_InternFromString(u: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def PyBytes_FromString(v: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def PyBytes_FromStringAndSize(v: t.CConst | str, size: t.CSizeT) -> PyObject | t.CPtr | t.State: pass - -def PyBytes_AsString(obj: PyObject | t.CPtr) -> str | t.State: pass - -def PyBytes_Size(obj: PyObject | t.CPtr) -> t.CSizeT | t.State: pass - -def PyBytes_FromObject(o: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyBytes_FromFormat(fmt: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def PyBool_FromLong(v: t.CLong) -> PyObject | t.CPtr | t.State: pass - - -Py_True: t.CExtern | PyObject | t.CPtr | t.State -Py_False: t.CExtern | PyObject | t.CPtr | t.State -Py_None: t.CExtern | PyObject | t.CPtr | t.State - -def PyList_New(len: t.CSizeT) -> PyObject | t.CPtr | t.State: pass - -def PyList_Size(lst: PyObject | t.CPtr) -> t.CSizeT | t.State: pass - -def PyList_GetItem(lst: PyObject | t.CPtr, idx: t.CSizeT) -> PyObject | t.CPtr | t.State: pass - -def PyList_SetItem(lst: PyObject | t.CPtr, idx: t.CSizeT, item: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyList_Insert(lst: PyObject | t.CPtr, idx: t.CSizeT, item: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyList_Append(lst: PyObject | t.CPtr, item: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyList_GetSlice(lst: PyObject | t.CPtr, lo: t.CSizeT, hi: t.CSizeT) -> PyObject | t.CPtr | t.State: pass - -def PyList_SetSlice(lst: PyObject | t.CPtr, lo: t.CSizeT, hi: t.CSizeT, items: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyList_Sort(lst: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyList_Reverse(lst: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyList_AsTuple(lst: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyTuple_New(len: t.CSizeT) -> PyObject | t.CPtr | t.State: pass - -def PyTuple_Size(tup: PyObject | t.CPtr) -> t.CSizeT | t.State: pass - -def PyTuple_GetItem(tup: PyObject | t.CPtr, idx: t.CSizeT) -> PyObject | t.CPtr | t.State: pass - -def PyTuple_SetItem(tup: PyObject | t.CPtr, idx: t.CSizeT, item: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyTuple_GetSlice(tup: PyObject | t.CPtr, lo: t.CSizeT, hi: t.CSizeT) -> PyObject | t.CPtr | t.State: pass - -def PyTuple_Pack(n: t.CSizeT) -> PyObject | t.CPtr | t.State: pass - -def PyDict_New() -> PyObject | t.CPtr | t.State: pass - -def PyDict_GetItem(d: PyObject | t.CPtr, key: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyDict_GetItemString(d: PyObject | t.CPtr, key: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def PyDict_SetItem(d: PyObject | t.CPtr, key: PyObject | t.CPtr, val: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyDict_SetItemString(d: PyObject | t.CPtr, key: t.CConst | str, val: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyDict_DelItem(d: PyObject | t.CPtr, key: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyDict_DelItemString(d: PyObject | t.CPtr, key: t.CConst | str) -> t.CInt | t.State: pass - -def PyDict_Size(d: PyObject | t.CPtr) -> t.CSizeT | t.State: pass - -def PyDict_Keys(d: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyDict_Values(d: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyDict_Items(d: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyDict_Copy(d: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyDict_Clear(d: PyObject | t.CPtr) -> t.CVoid | t.State: pass - -def PyDict_Contains(d: PyObject | t.CPtr, key: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyDict_Next(d: PyObject | t.CPtr, pos: t.CPtrDiffT | t.CPtr, key: PyObject | t.CPtr | t.CPtr, val: PyObject | t.CPtr | t.CPtr) -> t.CInt | t.State: pass - -def PyDict_Merge(d: PyObject | t.CPtr, other: PyObject | t.CPtr, override: t.CInt) -> t.CInt | t.State: pass - -def PyDict_Update(d: PyObject | t.CPtr, other: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyObject_Str(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyObject_Repr(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyObject_Type(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyObject_IsInstance(obj: PyObject | t.CPtr, cls: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyObject_IsSubclass(obj: PyObject | t.CPtr, cls: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyObject_HasAttr(obj: PyObject | t.CPtr, name: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyObject_HasAttrString(obj: PyObject | t.CPtr, name: t.CConst | str) -> t.CInt | t.State: pass - -def PyObject_GetAttr(obj: PyObject | t.CPtr, name: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyObject_GetAttrString(obj: PyObject | t.CPtr, name: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def PyObject_SetAttr(obj: PyObject | t.CPtr, name: PyObject | t.CPtr, val: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyObject_SetAttrString(obj: PyObject | t.CPtr, name: t.CConst | str, val: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyObject_DelAttr(obj: PyObject | t.CPtr, name: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyObject_DelAttrString(obj: PyObject | t.CPtr, name: t.CConst | str) -> t.CInt | t.State: pass - -def PyObject_Call(callable: PyObject | t.CPtr, args: PyObject | t.CPtr, kwargs: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyObject_CallObject(callable: PyObject | t.CPtr, args: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyObject_CallNoArgs(callable: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyObject_CallOneArg(callable: PyObject | t.CPtr, arg: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyObject_IsTrue(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyObject_Not(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyObject_RichCompare(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr, opid: t.CInt) -> PyObject | t.CPtr | t.State: pass - -def PyObject_RichCompareBool(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr, opid: t.CInt) -> t.CInt | t.State: pass - -def PyObject_Hash(obj: PyObject | t.CPtr) -> t.CLong | t.State: pass - -def PyObject_Length(obj: PyObject | t.CPtr) -> t.CSizeT | t.State: pass - -def PyObject_GetItem(obj: PyObject | t.CPtr, key: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyObject_SetItem(obj: PyObject | t.CPtr, key: PyObject | t.CPtr, val: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyObject_DelItem(obj: PyObject | t.CPtr, key: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyObject_Dir(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyObject_GetIter(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyIter_Next(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - - -Py_LT: t.CExtern | t.CInt | t.State -Py_LE: t.CExtern | t.CInt | t.State -Py_EQ: t.CExtern | t.CInt | t.State -Py_NE: t.CExtern | t.CInt | t.State -Py_GT: t.CExtern | t.CInt | t.State -Py_GE: t.CExtern | t.CInt | t.State - -def PyImport_ImportModule(name: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def PyImport_Import(name: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyImport_ImportModuleLevelObject(name: PyObject | t.CPtr, globs: PyObject | t.CPtr, locs: PyObject | t.CPtr, fromlist: PyObject | t.CPtr, level: t.CInt) -> PyObject | t.CPtr | t.State: pass - -def PyImport_ReloadModule(mod: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyImport_AddModule(name: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def PyImport_GetModuleDict() -> PyObject | t.CPtr | t.State: pass - -def PyImport_ImportModuleEx(name: t.CConst | str, globs: PyObject | t.CPtr, locs: PyObject | t.CPtr, fromlist: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - - -class PyMethodDef: - ml_name: t.CConst | str - ml_meth: t.CPtr - ml_flags: t.CInt - ml_doc: t.CConst | str -class PyModuleDef_Base: - ob_base: PyObject - m_init: t.CPtr - m_index: t.CSizeT - m_copy: PyObject | t.CPtr -class PyModuleDef: - m_base: PyModuleDef_Base - m_name: t.CConst | str - m_doc: t.CConst | str - m_size: t.CPtrDiffT - m_methods: PyMethodDef | t.CPtr - m_slots: t.CPtr - m_traverse: t.CPtr - m_clear: t.CPtr - m_free: t.CPtr - -def PyModule_Create(mod: PyModuleDef | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyModule_Create2(mod: PyModuleDef | t.CPtr, ver: t.CInt) -> PyObject | t.CPtr | t.State: pass - -def PyModule_GetName(mod: PyObject | t.CPtr) -> str | t.State: pass - -def PyModule_GetDict(mod: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyModule_GetFilenameObject(mod: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyModule_AddObject(mod: PyObject | t.CPtr, name: t.CConst | str, val: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyModule_AddObjectRef(mod: PyObject | t.CPtr, name: t.CConst | str, val: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyModule_AddIntConstant(mod: PyObject | t.CPtr, name: t.CConst | str, val: t.CLong) -> t.CInt | t.State: pass - -def PyModule_AddStringConstant(mod: PyObject | t.CPtr, name: t.CConst | str, val: t.CConst | str) -> t.CInt | t.State: pass - -def PyGILState_Ensure() -> t.CInt | t.State: pass - -def PyGILState_Release(state: t.CInt) -> t.CVoid | t.State: pass - -def PyEval_SaveThread() -> t.CPtr | t.State: pass - -def PyEval_RestoreThread(tstate: t.CPtr) -> t.CVoid | t.State: pass - -def PyEval_AcquireThread(tstate: t.CPtr) -> t.CVoid | t.State: pass - -def PyEval_ReleaseThread(tstate: t.CPtr) -> t.CVoid | t.State: pass - -def PyEval_AcquireLock() -> t.CVoid | t.State: pass - -def PyEval_ReleaseLock() -> t.CVoid | t.State: pass - -def PyEval_ThreadsInitialized() -> t.CInt | t.State: pass - -def PyEval_InitThreads() -> t.CVoid | t.State: pass - -def PyErr_Occurred() -> PyObject | t.CPtr | t.State: pass - -def PyErr_Clear() -> t.CVoid | t.State: pass - -def PyErr_Fetch(tp: PyObject | t.CPtr | t.CPtr, val: PyObject | t.CPtr | t.CPtr, tb: PyObject | t.CPtr | t.CPtr) -> t.CVoid | t.State: pass - -def PyErr_Restore(tp: PyObject | t.CPtr, val: PyObject | t.CPtr, tb: PyObject | t.CPtr) -> t.CVoid | t.State: pass - -def PyErr_NormalizeException(tp: PyObject | t.CPtr | t.CPtr, val: PyObject | t.CPtr | t.CPtr, tb: PyObject | t.CPtr | t.CPtr) -> t.CVoid | t.State: pass - -def PyErr_SetString(tp: PyObject | t.CPtr, msg: t.CConst | str) -> t.CVoid | t.State: pass - -def PyErr_SetObject(tp: PyObject | t.CPtr, val: PyObject | t.CPtr) -> t.CVoid | t.State: pass - -def PyErr_BadArgument() -> t.CPtr | t.State: pass - -def PyErr_NoMemory() -> t.CPtr | t.State: pass - -def PyErr_Print() -> t.CVoid | t.State: pass - -def PyErr_ExceptionMatches(exc: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyErr_GivenExceptionMatches(given: PyObject | t.CPtr, exc: PyObject | t.CPtr) -> t.CInt | t.State: pass - - -PyExc_BaseException: t.CExtern | PyObject | t.CPtr | t.State -PyExc_Exception: t.CExtern | PyObject | t.CPtr | t.State -PyExc_TypeError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_ValueError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_RuntimeError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_KeyError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_IndexError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_AttributeError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_ImportError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_OSError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_IOError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_ZeroDivisionError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_OverflowError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_MemoryError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_NameError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_StopIteration: t.CExtern | PyObject | t.CPtr | t.State -PyExc_NotImplementedError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_SyntaxError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_FileNotFoundError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_PermissionError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_IsADirectoryError: t.CExtern | PyObject | t.CPtr | t.State -PyExc_NotADirectoryError: t.CExtern | PyObject | t.CPtr | t.State - -def Py_BuildValue(fmt: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def Py_VaBuildValue(fmt: t.CConst | str, va: t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyLong_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyFloat_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyUnicode_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyBytes_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyList_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyTuple_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyDict_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyBool_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyNone_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyMem_Malloc(size: t.CSizeT) -> t.CPtr | t.State: pass - -def PyMem_Realloc(ptr: t.CPtr, size: t.CSizeT) -> t.CPtr | t.State: pass - -def PyMem_Free(ptr: t.CPtr) -> t.CVoid | t.State: pass - -def PyMem_Calloc(nelem: t.CSizeT, elsize: t.CSizeT) -> t.CPtr | t.State: pass - -def PyObject_Malloc(size: t.CSizeT) -> t.CPtr | t.State: pass - -def PyObject_Realloc(ptr: t.CPtr, size: t.CSizeT) -> t.CPtr | t.State: pass - -def PyObject_Free(ptr: t.CPtr) -> t.CVoid | t.State: pass - -def PyObject_Calloc(nelem: t.CSizeT, elsize: t.CSizeT) -> t.CPtr | t.State: pass - -def PyObject_Init(obj: PyObject | t.CPtr, tp: t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyObject_InitVar(obj: PyObject | t.CPtr, tp: t.CPtr, size: t.CSizeT) -> PyObject | t.CPtr | t.State: pass - -def PyFile_FromString(filename: t.CConst | str, mode: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def PyFile_AsFile(file: PyObject | t.CPtr) -> t.CPtr | t.State: pass - -def PyFile_WriteObject(obj: PyObject | t.CPtr, file: PyObject | t.CPtr, flags: t.CInt) -> t.CInt | t.State: pass - -def PyFile_WriteString(s: t.CConst | str, file: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def Py_CompileString(s: t.CConst | str, filename: t.CConst | str, start: t.CInt) -> PyObject | t.CPtr | t.State: pass - -def PyEval_EvalCode(code: PyObject | t.CPtr, globs: PyObject | t.CPtr, locs: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyEval_EvalCodeEx(code: PyObject | t.CPtr, globs: PyObject | t.CPtr, locs: PyObject | t.CPtr, args: PyObject | t.CPtr | t.CPtr, argc: t.CInt, kws: PyObject | t.CPtr | t.CPtr, kwc: t.CInt, defs: PyObject | t.CPtr | t.CPtr, defc: t.CInt, kwdefs: PyObject | t.CPtr, closure: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyEval_EvalFrame(frame: t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyEval_CallObject(callable: PyObject | t.CPtr, args: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyEval_CallFunction(callable: PyObject | t.CPtr, fmt: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def PyEval_CallMethod(obj: PyObject | t.CPtr, method: t.CConst | str, fmt: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def PyRun_SimpleString(cmd: t.CConst | str) -> t.CInt | t.State: pass - -def PyRun_SimpleFile(fp: t.CPtr, filename: t.CConst | str) -> t.CInt | t.State: pass - -def PyRun_AnyFile(fp: t.CPtr, filename: t.CConst | str) -> t.CInt | t.State: pass - -def PyRun_String(s: t.CConst | str, start: t.CInt, globs: PyObject | t.CPtr, locs: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyRun_File(fp: t.CPtr, filename: t.CConst | str, start: t.CInt, globs: PyObject | t.CPtr, locs: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - - -Py_single_input: t.CExtern | t.CInt | t.State -Py_file_input: t.CExtern | t.CInt | t.State -Py_eval_input: t.CExtern | t.CInt | t.State - -def PyCapsule_New(ptr: t.CPtr, name: t.CConst | str, dtor: t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyCapsule_GetPointer(cap: PyObject | t.CPtr, name: t.CConst | str) -> t.CPtr | t.State: pass - -def PyCapsule_GetName(cap: PyObject | t.CPtr) -> str | t.State: pass - -def PyCapsule_IsValid(cap: PyObject | t.CPtr, name: t.CConst | str) -> t.CInt | t.State: pass - -def PyCapsule_SetPointer(cap: PyObject | t.CPtr, ptr: t.CPtr) -> t.CInt | t.State: pass - -def PyCapsule_SetName(cap: PyObject | t.CPtr, name: t.CConst | str) -> t.CInt | t.State: pass - -def PyCapsule_SetDestructor(cap: PyObject | t.CPtr, dtor: t.CPtr) -> t.CInt | t.State: pass - -def PySequence_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PySequence_Size(obj: PyObject | t.CPtr) -> t.CSizeT | t.State: pass - -def PySequence_Length(obj: PyObject | t.CPtr) -> t.CSizeT | t.State: pass - -def PySequence_Concat(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PySequence_Repeat(obj: PyObject | t.CPtr, count: t.CSizeT) -> PyObject | t.CPtr | t.State: pass - -def PySequence_GetItem(obj: PyObject | t.CPtr, idx: t.CSizeT) -> PyObject | t.CPtr | t.State: pass - -def PySequence_SetItem(obj: PyObject | t.CPtr, idx: t.CSizeT, val: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PySequence_DelItem(obj: PyObject | t.CPtr, idx: t.CSizeT) -> t.CInt | t.State: pass - -def PySequence_GetSlice(obj: PyObject | t.CPtr, start: t.CSizeT, end: t.CSizeT) -> PyObject | t.CPtr | t.State: pass - -def PySequence_SetSlice(obj: PyObject | t.CPtr, start: t.CSizeT, end: t.CSizeT, val: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PySequence_DelSlice(obj: PyObject | t.CPtr, start: t.CSizeT, end: t.CSizeT) -> t.CInt | t.State: pass - -def PySequence_Contains(obj: PyObject | t.CPtr, val: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PySequence_Index(obj: PyObject | t.CPtr, val: PyObject | t.CPtr) -> t.CSizeT | t.State: pass - -def PySequence_Count(obj: PyObject | t.CPtr, val: PyObject | t.CPtr) -> t.CSizeT | t.State: pass - -def PySequence_List(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PySequence_Tuple(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyMapping_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyMapping_Size(obj: PyObject | t.CPtr) -> t.CSizeT | t.State: pass - -def PyMapping_Length(obj: PyObject | t.CPtr) -> t.CSizeT | t.State: pass - -def PyMapping_HasKey(obj: PyObject | t.CPtr, key: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyMapping_HasKeyString(obj: PyObject | t.CPtr, key: t.CConst | str) -> t.CInt | t.State: pass - -def PyMapping_GetItemString(obj: PyObject | t.CPtr, key: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def PyMapping_SetItemString(obj: PyObject | t.CPtr, key: t.CConst | str, val: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyMapping_Keys(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyMapping_Values(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyMapping_Items(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Add(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Subtract(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Multiply(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_MatrixMultiply(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_FloorDivide(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_TrueDivide(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Modulo(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Power(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr, o3: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Negative(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Positive(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Absolute(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Invert(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Lshift(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Rshift(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_And(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Xor(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Or(o1: PyObject | t.CPtr, o2: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Index(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Long(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Float(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyNumber_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyWeakref_NewRef(obj: PyObject | t.CPtr, cb: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyWeakref_GetObject(ref: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyWeakref_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - - -class PyGetSetDef: - name: t.CConst | str - get: t.CPtr - set: t.CPtr - doc: t.CConst | str - closure: t.CPtr -class PyMemberDef: - name: t.CConst | str - type: t.CInt - offset: t.CPtrDiffT - flags: t.CInt - doc: t.CConst | str - -def PySys_GetObject(name: t.CConst | str) -> PyObject | t.CPtr | t.State: pass - -def PySys_SetObject(name: t.CConst | str, val: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PySys_ResetWarnOptions() -> t.CVoid | t.State: pass - -def PySys_AddWarnOption(s: PyObject | t.CPtr) -> t.CVoid | t.State: pass - -def PySYS_AddXOption(s: PyObject | t.CPtr) -> t.CVoid | t.State: pass - -def PySys_WriteStdout(fmt: t.CConst | str) -> t.CVoid | t.State: pass - -def PySys_WriteStderr(fmt: t.CConst | str) -> t.CVoid | t.State: pass - -def PySys_FormatStdout(fmt: t.CConst | str) -> t.CVoid | t.State: pass - -def PySys_FormatStderr(fmt: t.CConst | str) -> t.CVoid | t.State: pass - -def PyMemoryView_FromObject(obj: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyMemoryView_GetContiguous(obj: PyObject | t.CPtr, btype: t.CInt, order: t.CChar) -> PyObject | t.CPtr | t.State: pass - -def PyMemoryView_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PySet_New(iterable: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PySet_Add(s: PyObject | t.CPtr, key: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PySet_Discard(s: PyObject | t.CPtr, key: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PySet_Contains(s: PyObject | t.CPtr, key: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PySet_Size(s: PyObject | t.CPtr) -> t.CSizeT | t.State: pass - -def PySet_Clear(s: PyObject | t.CPtr) -> t.CVoid | t.State: pass - -def PySet_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PyFrozenSet_New(iterable: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PyFrozenSet_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - -def PySlice_New(start: PyObject | t.CPtr, stop: PyObject | t.CPtr, step: PyObject | t.CPtr) -> PyObject | t.CPtr | t.State: pass - -def PySlice_GetIndicesEx(sl: PyObject | t.CPtr, length: t.CSizeT, start: t.CSizeT | t.CPtr, stop: t.CSizeT | t.CPtr, step: t.CSizeT | t.CPtr, slicelen: t.CSizeT | t.CPtr) -> t.CInt | t.State: pass - -def PySlice_Unpack(sl: PyObject | t.CPtr, start: t.CPtrDiffT | t.CPtr, stop: t.CPtrDiffT | t.CPtr, step: t.CPtrDiffT | t.CPtr) -> t.CVoid | t.State: pass - -def PySlice_AdjustIndices(length: t.CSizeT, start: t.CPtrDiffT | t.CPtr, stop: t.CPtrDiffT | t.CPtr, step: t.CPtrDiffT) -> t.CSizeT | t.State: pass - -def PySlice_Check(obj: PyObject | t.CPtr) -> t.CInt | t.State: pass - - -class PyLongObj: - ptr: PyObject | t.CPtr - def __new__(self: PyLongObj) -> 'PyLongObj' | t.CPtr: pass - @staticmethod - def from_long(val: t.CLong) -> 'PyLongObj' | t.CPtr: pass - def __add__(self: PyLongObj, other: PyLongObj | t.CPtr) -> 'PyLongObj' | t.CPtr: pass - def __sub__(self: PyLongObj, other: PyLongObj | t.CPtr) -> 'PyLongObj' | t.CPtr: pass - def __mul__(self: PyLongObj, other: PyLongObj | t.CPtr) -> 'PyLongObj' | t.CPtr: pass - def __neg__(self: PyLongObj) -> 'PyLongObj' | t.CPtr: pass - def to_long(self: PyLongObj) -> t.CLong: pass - def __str__(self: PyLongObj) -> PyObject | t.CPtr: pass - def dec_ref(self: PyLongObj) -> t.CInt: pass -class PyFloatObj: - ptr: PyObject | t.CPtr - def __new__(self: PyFloatObj) -> 'PyFloatObj' | t.CPtr: pass - @staticmethod - def from_double(val: t.CDouble) -> 'PyFloatObj' | t.CPtr: pass - def __add__(self: PyFloatObj, other: PyFloatObj | t.CPtr) -> 'PyFloatObj' | t.CPtr: pass - def __sub__(self: PyFloatObj, other: PyFloatObj | t.CPtr) -> 'PyFloatObj' | t.CPtr: pass - def __mul__(self: PyFloatObj, other: PyFloatObj | t.CPtr) -> 'PyFloatObj' | t.CPtr: pass - def __truediv__(self: PyFloatObj, other: PyFloatObj | t.CPtr) -> 'PyFloatObj' | t.CPtr: pass - def __neg__(self: PyFloatObj) -> 'PyFloatObj' | t.CPtr: pass - def to_double(self: PyFloatObj) -> t.CDouble: pass - def __str__(self: PyFloatObj) -> PyObject | t.CPtr: pass - def dec_ref(self: PyFloatObj) -> t.CInt: pass -class PyUnicodeObj: - ptr: PyObject | t.CPtr - def __new__(self: PyUnicodeObj) -> 'PyUnicodeObj' | t.CPtr: pass - @staticmethod - def from_string(s: t.CChar | t.CPtr) -> 'PyUnicodeObj' | t.CPtr: pass - def __add__(self: PyUnicodeObj, other: PyUnicodeObj | t.CPtr) -> 'PyUnicodeObj' | t.CPtr: pass - def __len__(self: PyUnicodeObj) -> t.CPtrDiffT: pass - def as_utf8(self: PyUnicodeObj) -> t.CChar | t.CPtr: pass - def __str__(self: PyUnicodeObj) -> PyObject | t.CPtr: pass - def dec_ref(self: PyUnicodeObj) -> t.CInt: pass -class PyListObj: - ptr: PyObject | t.CPtr - def __new__(self: PyListObj) -> 'PyListObj' | t.CPtr: pass - @staticmethod - def new() -> 'PyListObj' | t.CPtr: pass - def __getitem__(self: PyListObj, idx: t.CSizeT) -> PyObject | t.CPtr: pass - def __setitem__(self: PyListObj, idx: t.CSizeT, val: PyObject | t.CPtr) -> t.CInt: pass - def __len__(self: PyListObj) -> t.CSizeT: pass - def append(self: PyListObj, item: PyObject | t.CPtr) -> t.CInt: pass - def dec_ref(self: PyListObj) -> t.CInt: pass -class PyDictObj: - ptr: PyObject | t.CPtr - def __new__(self: PyDictObj) -> 'PyDictObj' | t.CPtr: pass - @staticmethod - def new() -> 'PyDictObj' | t.CPtr: pass - def __getitem__(self: PyDictObj, key: PyObject | t.CPtr) -> PyObject | t.CPtr: pass - def __setitem__(self: PyDictObj, key: PyObject | t.CPtr, val: PyObject | t.CPtr) -> t.CInt: pass - def __len__(self: PyDictObj) -> t.CSizeT: pass - def get_string(self: PyDictObj, key: t.CChar | t.CPtr) -> PyObject | t.CPtr: pass - def set_string(self: PyDictObj, key: t.CChar | t.CPtr, val: PyObject | t.CPtr) -> t.CInt: pass - def dec_ref(self: PyDictObj) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/7e260c14d2712119.doc.json b/.transpyc_cache/7e260c14d2712119.doc.json deleted file mode 100644 index c90d338..0000000 --- a/.transpyc_cache/7e260c14d2712119.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"SrcFileEntry": "源文件条目", "_ScanDirForPyFiles": "递归扫描目录,收集 .py 文件到 entries,返回新的 file_count", "RunMultiFileProject": "多文件项目编译\n\n Returns: 0 成功,非 0 失败\n "} \ No newline at end of file diff --git a/.transpyc_cache/7e260c14d2712119.pyi b/.transpyc_cache/7e260c14d2712119.pyi deleted file mode 100644 index 2398e44..0000000 --- a/.transpyc_cache/7e260c14d2712119.pyi +++ /dev/null @@ -1,42 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Phase2.py -Module: lib.core.Phase2 -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import viperlib -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import sys -import ast -import llvmlite -import subprocess -import argparse -import lib.core.VLogger as VLogger -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.BuildPipeline as BuildPipeline -import lib.core.StubMerger as StubMerger -import lib.Projectrans.Utils as Utils -import lib.Projectrans.Config as Config - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 -MAX_SRC_FILES: t.CDefine = 64 - -@t.NoVTable -class SrcFileEntry: - Path: str - Sha1: str - -def _ScanDirForPyFiles(mb: memhub.MemBuddy | t.CPtr, dir_path: str, entries: SrcFileEntry | t.CPtr, entry_size: t.CSizeT, file_count: int, max_files: int) -> int: pass - -def RunMultiFileProject(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, output_dir: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str, includes_dir: str, do_phase1: int, do_phase2: int, log: VLogger.Logger | t.CPtr, args: argparse.ParsedArgs | t.CPtr) -> int: pass diff --git a/.transpyc_cache/7eb1251b89cc1b7d.doc.json b/.transpyc_cache/7eb1251b89cc1b7d.doc.json deleted file mode 100644 index e7fc1ec..0000000 --- a/.transpyc_cache/7eb1251b89cc1b7d.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"TranslateFileGetTrans": "翻译文件,返回 Translator 对象(调用者负责 dump_ir),None 失败", "ensure_dir": "递归创建目录(类似 mkdir -p),目录已存在视为成功\n\n Args:\n path: 目录路径(支持 / 或 \\ 分隔符)\n\n Returns:\n 0 成功(包括目录已存在),非 0 失败\n ", "write_ir_to_file": "将 IR 缓冲区写入 .ll 文件\n\n Args:\n ir_buf: IR 文本缓冲区\n ir_len: IR 文本长度\n output_dir: 输出目录(temp 或 output)\n module_name: 模块名(如 \"main\")\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_ll_to_obj": "调用 llc 将 .ll 编译为 .obj\n\n Args:\n ir_path: .ll 文件路径\n output_dir: 输出目录\n module_name: 模块名(用于生成 .obj 文件名)\n cc_cmd: 编译器命令(如 \"llc\")\n cc_flags: 编译器参数(如 \"-filetype=obj -relocation-model=pic\")\n\n Returns:\n 0 成功,非 0 失败\n ", "collect_obj_files": "扫描 includes_binary_dir 目录,收集所有 .obj 文件路径到 out_buf\n\n Args:\n includes_binary_dir: includes.binary 目录路径\n out_buf: 输出缓冲区(用于存放空格分隔的 .obj 文件路径)\n out_size: 输出缓冲区大小\n\n Returns:\n 写入的字节数(不含 null 终止符),0 表示无文件或错误\n ", "link_obj_to_exe": "调用 clang++ 链接 .obj 为 .exe\n\n Args:\n output_dir: 输出目录(包含 .obj 文件)\n module_name: 模块名\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件名(如 \"test.exe\")\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_module_to_obj": "编译 IR 到 .obj(不链接)\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名(SHA1)\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n\n Returns:\n 0 成功,非 0 失败\n ", "link_objs_to_exe": "链接多个 .obj 文件为 .exe\n\n Args:\n obj_paths: 空格分隔的 .obj 文件完整路径字符串\n obj_paths_len: obj_paths 长度\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件完整路径\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "run_pipeline": "执行完整编译管线\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n linker_cmd: 链接器命令\n linker_flags: 链接器参数\n linker_output: 输出文件名\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n BuildResult 对象\n "} \ No newline at end of file diff --git a/.transpyc_cache/7eb1251b89cc1b7d.pyi b/.transpyc_cache/7eb1251b89cc1b7d.pyi deleted file mode 100644 index 3a8c9c7..0000000 --- a/.transpyc_cache/7eb1251b89cc1b7d.pyi +++ /dev/null @@ -1,50 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.BuildPipeline.py -Module: lib.core.BuildPipeline -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import subprocess -import viperlib -import ast -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesType as HandlesType - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 - -def TranslateFileGetTrans(mb: memhub.MemBuddy | t.CPtr, file_path: str, sha1_val: str) -> HandlesTranslator.Translator | t.CPtr: pass - - -class BuildResult: - Success: t.CInt - OutputPath: str - ErrorMsg: str - def __new__(self: BuildResult) -> t.CPtr: pass - def __init__(self: BuildResult) -> t.CInt: pass - -def ensure_dir(path: str) -> int: pass - -def write_ir_to_file(ir_buf: bytes, ir_len: t.CSizeT, output_dir: str, module_name: str) -> int: pass - -def compile_ll_to_obj(ir_path: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def collect_obj_files(includes_binary_dir: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass - -def link_obj_to_exe(output_dir: str, module_name: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def compile_module_to_obj(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def link_objs_to_exe(obj_paths: str, obj_paths_len: t.CSizeT, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def run_pipeline(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> BuildResult | t.CPtr: pass diff --git a/.transpyc_cache/7fa5782c9657b2ba.doc.json b/.transpyc_cache/7fa5782c9657b2ba.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/7fa5782c9657b2ba.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/7fa5782c9657b2ba.pyi b/.transpyc_cache/7fa5782c9657b2ba.pyi deleted file mode 100644 index 9dc1839..0000000 --- a/.transpyc_cache/7fa5782c9657b2ba.pyi +++ /dev/null @@ -1,14 +0,0 @@ -""" -Auto-generated Python stub file from generic_test.py -Module: generic_test -""" - - -import stdio -import stdlib -import t, c -import testcheck -import memhub -import _list - -def generic_test() -> int: pass diff --git a/.transpyc_cache/7fff0dc7524a3a93.doc.json b/.transpyc_cache/7fff0dc7524a3a93.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/7fff0dc7524a3a93.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/7fff0dc7524a3a93.pyi b/.transpyc_cache/7fff0dc7524a3a93.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/7fff0dc7524a3a93.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/80241c7d6f357bd1.doc.json b/.transpyc_cache/80241c7d6f357bd1.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/80241c7d6f357bd1.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/80241c7d6f357bd1.pyi b/.transpyc_cache/80241c7d6f357bd1.pyi deleted file mode 100644 index 25cba70..0000000 --- a/.transpyc_cache/80241c7d6f357bd1.pyi +++ /dev/null @@ -1,10 +0,0 @@ -""" -Auto-generated Python stub file from asm_test.py -Module: asm_test -""" - - -import stdio -import t, c - -def asm_test() -> int: pass diff --git a/.transpyc_cache/8046d45456d0b153.doc.json b/.transpyc_cache/8046d45456d0b153.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/8046d45456d0b153.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/8046d45456d0b153.pyi b/.transpyc_cache/8046d45456d0b153.pyi deleted file mode 100644 index a6ccaab..0000000 --- a/.transpyc_cache/8046d45456d0b153.pyi +++ /dev/null @@ -1,18 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -import t, c -from stdint import * -import stdio -import stdlib -import socket -import memhub -import requests - -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr - -@t.CExport -def main() -> int: pass diff --git a/.transpyc_cache/814e6b31adfc6256.doc.json b/.transpyc_cache/814e6b31adfc6256.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/814e6b31adfc6256.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/814e6b31adfc6256.pyi b/.transpyc_cache/814e6b31adfc6256.pyi deleted file mode 100644 index 0a0bccf..0000000 --- a/.transpyc_cache/814e6b31adfc6256.pyi +++ /dev/null @@ -1,69 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - -import c - - -import t -from stdio import printf -import testcheck - -def log(ctx: t.CVoid | t.CPtr, func_name: str, phase: t.CInt, args_ptr: t.CVoid | t.CPtr, ret_ptr: t.CVoid | t.CPtr, decor_args_ptr: t.CVoid | t.CPtr) -> t.CInt | t.CExport: pass - -def trace(ctx: t.CVoid | t.CPtr, func_name: str, phase: t.CInt, args_ptr: t.CVoid | t.CPtr, ret_ptr: t.CVoid | t.CPtr, decor_args_ptr: t.CVoid | t.CPtr) -> t.CInt | t.CExport: pass - - -_timing_tmp: t.CExtern | t.CInt - -def timing(ctx: t.CVoid | t.CPtr, func_name: str, phase: t.CInt, args_ptr: t.CVoid | t.CPtr, ret_ptr: t.CVoid | t.CPtr, decor_args_ptr: t.CVoid | t.CPtr) -> t.CInt | t.CExport: pass - -def repeat(ctx: t.CVoid | t.CPtr, func_name: str, phase: t.CInt, args_ptr: t.CVoid | t.CPtr, ret_ptr: t.CVoid | t.CPtr, decor_args_ptr: t.CVoid | t.CPtr) -> t.CInt | t.CExport: pass - - -_skip_count: t.CExtern | t.CInt - -def skip(ctx: t.CVoid | t.CPtr, func_name: str, phase: t.CInt, args_ptr: t.CVoid | t.CPtr, ret_ptr: t.CVoid | t.CPtr, decor_args_ptr: t.CVoid | t.CPtr) -> t.CInt | t.CExport: pass - - -_call_count: t.CExtern | t.CInt - -def count_calls(ctx: t.CVoid | t.CPtr, func_name: str, phase: t.CInt, args_ptr: t.CVoid | t.CPtr, ret_ptr: t.CVoid | t.CPtr, decor_args_ptr: t.CVoid | t.CPtr) -> t.CInt | t.CExport: pass - -@log -def add(a: t.CInt, b: t.CInt) -> t.CInt | t.CExport: pass - -@log -@trace -def multiply(a: t.CInt, b: t.CInt) -> t.CInt | t.CExport: pass - -@log -def greet(name: str) -> t.CVoid | t.CExport: pass - -@log -def get_value() -> t.CInt | t.CExport: pass - -@timing -def compute(x: t.CInt) -> t.CInt | t.CExport: pass - -@repeat(3) -def echo(msg: str) -> t.CVoid | t.CExport: pass - -@timing -@log -def power(base: t.CInt, exp: t.CInt) -> t.CInt | t.CExport: pass - -@skip -def dangerous() -> t.CInt | t.CExport: pass - -@repeat(3) -def accumulate(x: t.CInt) -> t.CInt | t.CExport: pass - -@count_calls -def factorial(n: t.CInt) -> t.CInt | t.CExport: pass - -@log -def fib(n: t.CInt) -> t.CInt | t.CExport: pass - -def main() -> t.CInt | t.CExport: pass diff --git a/.transpyc_cache/81eb28ba912467a6.doc.json b/.transpyc_cache/81eb28ba912467a6.doc.json deleted file mode 100644 index f6225ef..0000000 --- a/.transpyc_cache/81eb28ba912467a6.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"translate_stmt": "翻译单条语句,返回新增的变量数", "translate_global": "翻译 global 语句:记录 global 变量名", "translate_nonlocal": "翻译 nonlocal 语句:记录 nonlocal 变量名", "translate_expr_stmt": "翻译表达式语句(printf 调用等)", "pre_scan_allocas": "预扫描语句中的 AnnAssign,提前创建 alloca\n\n 返回新增的变量数\n ", "translate_break": "翻译 break 语句:跳转到循环 end 块", "translate_continue": "翻译 continue 语句:跳转到循环 cond/incr 块", "get_stmt_kind_name": "获取语句类型名"} \ No newline at end of file diff --git a/.transpyc_cache/81eb28ba912467a6.pyi b/.transpyc_cache/81eb28ba912467a6.pyi deleted file mode 100644 index aa52e34..0000000 --- a/.transpyc_cache/81eb28ba912467a6.pyi +++ /dev/null @@ -1,35 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesBody.py -Module: lib.core.Handles.HandlesBody -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesFunctions as HandlesFunctions -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -def translate_stmt(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_global(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_nonlocal(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_expr_stmt(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def pre_scan_allocas(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_break(trans: HT.Translator | t.CPtr) -> int: pass - -def translate_continue(trans: HT.Translator | t.CPtr) -> int: pass - -def get_stmt_kind_name(node: ast.AST | t.CPtr) -> str: pass diff --git a/.transpyc_cache/83ba314b4637eec9.doc.json b/.transpyc_cache/83ba314b4637eec9.doc.json deleted file mode 100644 index 656d90d..0000000 --- a/.transpyc_cache/83ba314b4637eec9.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"TypeRegistry.Register": "注册一个 TypeInfo。ti.Name 字段必须已设置。\n\n Returns:\n 1 表示成功,0 表示失败(ti 为 None 或 Name 为 None)\n ", "TypeRegistry.Lookup": "按名称查找 TypeInfo。\n\n Returns:\n 找到返回 TypeInfo*,找不到返回 None\n ", "TypeRegistry.Has": "检查类型是否已注册。", "Mixin": "所有 Handle 的非多态基类:持有 Translator 回指针 + 共享委托方法", "Mixin.InitMixin": "初始化 Mixin 字段(子类 __init__ 中调用)"} \ No newline at end of file diff --git a/.transpyc_cache/83ba314b4637eec9.pyi b/.transpyc_cache/83ba314b4637eec9.pyi deleted file mode 100644 index 1d05ab4..0000000 --- a/.transpyc_cache/83ba314b4637eec9.pyi +++ /dev/null @@ -1,54 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesBase.py -Module: lib.core.Handles.HandlesBase -""" - - -import t, c -from stdint import * -import string -import viperlib -import memhub -import hashtable -import lib.core.Handles.HandlesTranslator as HT - -class TypeKind(t.CEnum): - Basic: t.State - Pointer: t.State - Struct: t.State - Union: t.State - Enum: t.State - Typedef: t.State - Function: t.State - Array: t.State - Void: t.State -@t.NoVTable -class TypeInfo: - Kind: int - Name: str - Size: int - Align: int - IsSigned: int - PtrCount: int - IsConst: int - IsVolatile: int -class TypeRegistry: - _ht: hashtable.HashTable | t.CPtr - __mbuddy__: memhub.MemManager | t.CPtr - def Register(self: TypeRegistry, ti: TypeInfo | t.CPtr) -> int: pass - def Lookup(self: TypeRegistry, name: str) -> TypeInfo | t.CPtr: pass - def Has(self: TypeRegistry, name: str) -> int: pass - -def NewTypeInfo(pool: memhub.MemManager | t.CPtr) -> TypeInfo | t.CPtr: pass - -def NewTypeRegistry(pool: memhub.MemManager | t.CPtr) -> TypeRegistry | t.CPtr: pass - -def TypeToLLVM(buf: t.CChar | t.CPtr, buf_size: t.CSizeT, ti: TypeInfo | t.CPtr) -> int: pass - - -@t.NoVTable -class Mixin: - Trans: HT.Translator | t.CPtr - def InitMixin(self: Mixin, trans: HT.Translator | t.CPtr) -> int: pass - -_mbuddy: t.CExtern | t.CVoid | t.CPtr \ No newline at end of file diff --git a/.transpyc_cache/862591435f13ef30.doc.json b/.transpyc_cache/862591435f13ef30.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/862591435f13ef30.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/862591435f13ef30.pyi b/.transpyc_cache/862591435f13ef30.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/862591435f13ef30.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/8639fbe371566e75.doc.json b/.transpyc_cache/8639fbe371566e75.doc.json deleted file mode 100644 index 8c2a0a2..0000000 --- a/.transpyc_cache/8639fbe371566e75.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"AssignHandle": "Assign 语句处理器:继承 Mixin 获得 Trans 回指针 + 共享方法"} \ No newline at end of file diff --git a/.transpyc_cache/8639fbe371566e75.pyi b/.transpyc_cache/8639fbe371566e75.pyi deleted file mode 100644 index 1e1b4bd..0000000 --- a/.transpyc_cache/8639fbe371566e75.pyi +++ /dev/null @@ -1,29 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesAssign.py -Module: lib.core.Handles.HandlesAssign -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType - -@t.NoVTable -class AssignHandle(HandlesBase.Mixin): - _CurrentClass: str - def __init__(self: AssignHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: AssignHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewAssignHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> AssignHandle | t.CPtr: pass diff --git a/.transpyc_cache/8642175afa282a4f.doc.json b/.transpyc_cache/8642175afa282a4f.doc.json deleted file mode 100644 index 95e17f3..0000000 --- a/.transpyc_cache/8642175afa282a4f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/8642175afa282a4f.pyi b/.transpyc_cache/8642175afa282a4f.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/8642175afa282a4f.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/86e203c56ae4de20.doc.json b/.transpyc_cache/86e203c56ae4de20.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/86e203c56ae4de20.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/86e203c56ae4de20.pyi b/.transpyc_cache/86e203c56ae4de20.pyi deleted file mode 100644 index ba09b5a..0000000 --- a/.transpyc_cache/86e203c56ae4de20.pyi +++ /dev/null @@ -1,27 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - -import c - - -import t -import stdio -import testcheck - -def test_for_loop() -> t.CInt: pass - -def test_while_loop() -> t.CInt: pass - -def test_nested_loop() -> t.CInt: pass - -def test_break() -> t.CInt: pass - -def test_continue() -> t.CInt: pass - -def test_range_step() -> t.CInt: pass - -def test_loop_u64() -> t.CInt: pass - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/888ea5bd6ab516ae.doc.json b/.transpyc_cache/888ea5bd6ab516ae.doc.json deleted file mode 100644 index c189e56..0000000 --- a/.transpyc_cache/888ea5bd6ab516ae.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"compute_sha1": "计算字符串的 SHA1,返回前 16 个十六进制字符(用于文件命名)", "CleanDir": "删除目录中所有文件(非递归),返回删除的文件数,-1 表示错误"} \ No newline at end of file diff --git a/.transpyc_cache/888ea5bd6ab516ae.pyi b/.transpyc_cache/888ea5bd6ab516ae.pyi deleted file mode 100644 index e4ed12e..0000000 --- a/.transpyc_cache/888ea5bd6ab516ae.pyi +++ /dev/null @@ -1,21 +0,0 @@ -""" -Auto-generated Python stub file from lib.Projectrans.Utils.py -Module: lib.Projectrans.Utils -""" - - -import t, c -from stdint import * -import memhub -import string -import stdlib -import viperlib -import hashlib -import w32.win32file -import w32.win32base - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr - -def compute_sha1(pool: memhub.MemBuddy | t.CPtr, content: str) -> str: pass - -def CleanDir(dir_path: str) -> int: pass diff --git a/.transpyc_cache/895376eafe64af68.doc.json b/.transpyc_cache/895376eafe64af68.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/895376eafe64af68.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/895376eafe64af68.pyi b/.transpyc_cache/895376eafe64af68.pyi deleted file mode 100644 index e2b929c..0000000 --- a/.transpyc_cache/895376eafe64af68.pyi +++ /dev/null @@ -1,12 +0,0 @@ -""" -Auto-generated Python stub file from simple_test.py -Module: simple_test -""" - -import t -import c - - -import stdio - -def simple_test() -> int: pass diff --git a/.transpyc_cache/8959998ad305c7b1.doc.json b/.transpyc_cache/8959998ad305c7b1.doc.json deleted file mode 100644 index 6b37383..0000000 --- a/.transpyc_cache/8959998ad305c7b1.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/8959998ad305c7b1.pyi b/.transpyc_cache/8959998ad305c7b1.pyi deleted file mode 100644 index e470478..0000000 --- a/.transpyc_cache/8959998ad305c7b1.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, args_head: llvmlite.Value | t.CPtr, arg_count: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/8a97754e9e3c2b9a.doc.json b/.transpyc_cache/8a97754e9e3c2b9a.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/8a97754e9e3c2b9a.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/8a97754e9e3c2b9a.pyi b/.transpyc_cache/8a97754e9e3c2b9a.pyi deleted file mode 100644 index c3e417c..0000000 --- a/.transpyc_cache/8a97754e9e3c2b9a.pyi +++ /dev/null @@ -1,30 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -import t, c -from stdint import * -from stdio import printf -import memhub -import json -import string -import w32.win32memory as win32mem -import testcheck - -def test_construct(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_build_structures(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_parse(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_write(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_nested(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_mpool_reuse() -> t.CInt: pass - -def test_escape(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def main() -> t.CInt | t.CExport: pass diff --git a/.transpyc_cache/8e0d8fdba991b3b4.doc.json b/.transpyc_cache/8e0d8fdba991b3b4.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/8e0d8fdba991b3b4.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/8e0d8fdba991b3b4.pyi b/.transpyc_cache/8e0d8fdba991b3b4.pyi deleted file mode 100644 index 1aebea2..0000000 --- a/.transpyc_cache/8e0d8fdba991b3b4.pyi +++ /dev/null @@ -1,25 +0,0 @@ -""" -Auto-generated Python stub file from config.py -Module: config -""" - - -import stdint -import t, c - -A: t.CExtern | t.CChar | t.CPtr - -class BIT_TEST(t.Object): - a: t.CInt | t.Bit(1) - b: t.CInt | t.Bit(1) - c: t.CInt | t.Bit(1) - d: t.CInt | t.Bit(5) -class OOP_TEST(t.Object): - a: t.CInt - def __init__(self: OOP_TEST) -> t.CInt: pass - def __call__(self: OOP_TEST) -> stdint.UINT: pass -class ENUM_TEST(t.CEnum): - A: t.State = 0 - B: t.State - C: t.State - Len: t.State \ No newline at end of file diff --git a/.transpyc_cache/8ebed83a7817fa0c.pyi b/.transpyc_cache/8ebed83a7817fa0c.pyi deleted file mode 100644 index 6375e88..0000000 --- a/.transpyc_cache/8ebed83a7817fa0c.pyi +++ /dev/null @@ -1,15 +0,0 @@ -""" -Auto-generated Python stub file from zlib.zchecksum.py -Module: zlib.zchecksum -""" - - -from stdint import * -import t, c - -def zchecksum_adler32(data: UINT8PTR, length: t.CSizeT, init: UINT32) -> t.CUInt32T: pass - - -crc32_table: t.CExtern | t.CArray[t.CUInt32T, 256] - -def zchecksum_crc32(data: UINT8PTR, length: t.CSizeT, init: t.CUInt32T) -> t.CUInt32T: pass diff --git a/.transpyc_cache/8f12094c840be06a.doc.json b/.transpyc_cache/8f12094c840be06a.doc.json deleted file mode 100644 index 0487965..0000000 --- a/.transpyc_cache/8f12094c840be06a.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"InitLib": "初始化 lib 包的全局 _mbuddy 指针,并级联注入到所有子模块。\n\n Args:\n mb: memhub.MemManager 实例指针(MemBuddy 等子类通过多态传入)\n\n Returns:\n 0 表示成功,非 0 表示失败\n "} \ No newline at end of file diff --git a/.transpyc_cache/8f12094c840be06a.pyi b/.transpyc_cache/8f12094c840be06a.pyi deleted file mode 100644 index ac07294..0000000 --- a/.transpyc_cache/8f12094c840be06a.pyi +++ /dev/null @@ -1,14 +0,0 @@ -""" -Auto-generated Python stub file from lib.__init__.py -Module: lib.__init__ -""" - - -import t, c -from stdint import * -import memhub -import lib.core.VLogger as VLogger - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr - -def InitLib(mb: memhub.MemManager | t.CPtr) -> int: pass diff --git a/.transpyc_cache/90921d009fdd674c.pyi b/.transpyc_cache/90921d009fdd674c.pyi deleted file mode 100644 index 86d9bcf..0000000 --- a/.transpyc_cache/90921d009fdd674c.pyi +++ /dev/null @@ -1,56 +0,0 @@ -""" -Auto-generated Python stub file from zlib.zdeflate.py -Module: zlib.zdeflate -""" - - -from stdint import * -import zlib.zchecksum as zchecksum -import zlib.zhuff as zhuff -import zlib.zdef as zdef -import string -import memhub -import t, c - -@t.Object -class zdeflate_stream: - pool: memhub.MemManager | t.CPtr - writer: zdef.zbit_writer - window: BYTE | t.CPtr - window_pos: t.CInt - window_size: t.CInt - hash_head: t.CInt | t.CPtr - hash_prev: t.CInt | t.CPtr - level: t.CInt - strategy: t.CInt - wbits: t.CInt - is_finished: t.CInt - adler: t.CUInt32T - def find_match(self: zdeflate_stream, data: BYTE | t.CPtr, data_len: t.CSizeT, pos: t.CSizeT, best_dist: t.CInt | t.CPtr) -> t.CInt: pass - def update_hash(self: zdeflate_stream, data: BYTE | t.CPtr, pos: t.CSizeT) -> t.CInt: pass - def write_fixed_block(self: zdeflate_stream, data: UINT8PTR, length: t.CSizeT, final: t.CInt) -> t.CInt: pass - def encode_block_data(self: zdeflate_stream, data: UINT8PTR, length: t.CSizeT, lit_tree: zhuff.zhuff_tree | t.CPtr, dist_tree: zhuff.zhuff_tree | t.CPtr) -> t.CInt: pass - def write_dynamic_block(self: zdeflate_stream, data: UINT8PTR, length: t.CSizeT, final: t.CInt) -> t.CInt: pass - def compress_block(self: zdeflate_stream, data: UINT8PTR, length: t.CSizeT, final: t.CInt) -> t.CInt: pass - def write_stored_block(self: zdeflate_stream, data: UINT8PTR, length: t.CSizeT, final: t.CInt) -> t.CInt: pass - def compress(self: zdeflate_stream, data: UINT8PTR, length: t.CSizeT, out: t.CUInt8T | t.CPtr[t.CPtr], out_len: t.CSizeT | t.CPtr) -> t.CInt: pass - def flush(self: zdeflate_stream, mode: t.CInt, out: t.CUInt8T | t.CPtr[t.CPtr], out_len: t.CSizeT | t.CPtr) -> t.CInt: pass - def set_dictionary(self: zdeflate_stream, dict: UINT8PTR, length: t.CSizeT) -> t.CInt: pass - def copy(self: zdeflate_stream) -> zdeflate_stream | t.CPtr: pass - def destroy(self: zdeflate_stream) -> t.CInt: pass - -def zdeflate_count_freqs(lit_freqs: INTPTR, dist_freqs: INTPTR, s: zdeflate_stream | t.CPtr, data: UINT8PTR, length: t.CSizeT) -> t.CInt: pass - -def zdeflate_hash(p: BYTE | t.CPtr) -> t.CUnsignedInt: pass - -def zdeflate_len_to_symbol(length: t.CInt) -> t.CInt: pass - -def zdeflate_dist_to_symbol(dist: t.CInt) -> t.CInt: pass - -def zdeflate_count_cl_freqs(all_lengths: INTPTR, total: t.CInt, cl_freqs: INTPTR) -> t.CInt: pass - -def zdeflate_write_cl_encoded(all_lengths: INTPTR, total: t.CInt, w: zdef.zbit_writer | t.CPtr, cl_tree: zhuff.zhuff_tree | t.CPtr) -> t.CInt: pass - -def zdeflate_create(pool: memhub.MemManager | t.CPtr, level: t.CInt, wbits: t.CInt, mem_level: t.CInt, strategy: t.CInt) -> zdeflate_stream | t.CPtr: pass - -def zdeflate_one_shot(pool: memhub.MemManager | t.CPtr, data: UINT8PTR, length: t.CSizeT, level: t.CInt, wbits: t.CInt, out_len: t.CSizeT | t.CPtr) -> t.CUInt8T | t.CPtr: pass diff --git a/.transpyc_cache/90d4bbcb87a33305.doc.json b/.transpyc_cache/90d4bbcb87a33305.doc.json deleted file mode 100644 index 6b37383..0000000 --- a/.transpyc_cache/90d4bbcb87a33305.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/90d4bbcb87a33305.pyi b/.transpyc_cache/90d4bbcb87a33305.pyi deleted file mode 100644 index e470478..0000000 --- a/.transpyc_cache/90d4bbcb87a33305.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, args_head: llvmlite.Value | t.CPtr, arg_count: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/9172f37e8d46721b.doc.json b/.transpyc_cache/9172f37e8d46721b.doc.json deleted file mode 100644 index 47b20d9..0000000 --- a/.transpyc_cache/9172f37e8d46721b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_get_external_func_param_ty": "获取外部函数第 param_idx 个参数的期望类型,None 表示用字面量原类型\n\n 对 Win32 API 函数的所有非指针参数返回 i64,匹配 declare 中\n ULONG/SIZE_T 被统一翻译为 i64 的情况。\n ", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/9172f37e8d46721b.pyi b/.transpyc_cache/9172f37e8d46721b.pyi deleted file mode 100644 index 5214419..0000000 --- a/.transpyc_cache/9172f37e8d46721b.pyi +++ /dev/null @@ -1,173 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _get_external_func_param_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str, param_idx: int) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/91a2bd55f6b00ffc.doc.json b/.transpyc_cache/91a2bd55f6b00ffc.doc.json deleted file mode 100644 index c3a1e25..0000000 --- a/.transpyc_cache/91a2bd55f6b00ffc.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"SrcFileEntry": "源文件条目", "RunMultiFileProject": "多文件项目编译\n\n Returns: 0 成功,非 0 失败\n "} \ No newline at end of file diff --git a/.transpyc_cache/91a2bd55f6b00ffc.pyi b/.transpyc_cache/91a2bd55f6b00ffc.pyi deleted file mode 100644 index ad12e1f..0000000 --- a/.transpyc_cache/91a2bd55f6b00ffc.pyi +++ /dev/null @@ -1,39 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Phase2.py -Module: lib.core.Phase2 -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import viperlib -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import sys -import ast -import llvmlite -import subprocess -import argparse -import lib.core.VLogger as VLogger -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.BuildPipeline as BuildPipeline -import lib.core.StubMerger as StubMerger -import lib.Projectrans.Utils as Utils -import lib.Projectrans.Config as Config - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 -MAX_SRC_FILES: t.CDefine = 32 - -@t.NoVTable -class SrcFileEntry: - Path: str - Sha1: str - -def RunMultiFileProject(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, output_dir: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str, includes_dir: str, do_phase1: int, do_phase2: int, log: VLogger.Logger | t.CPtr, args: argparse.ParsedArgs | t.CPtr) -> int: pass diff --git a/.transpyc_cache/924ed8cd4ea5c4c2.doc.json b/.transpyc_cache/924ed8cd4ea5c4c2.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/924ed8cd4ea5c4c2.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/924ed8cd4ea5c4c2.pyi b/.transpyc_cache/924ed8cd4ea5c4c2.pyi deleted file mode 100644 index 16c5c7a..0000000 --- a/.transpyc_cache/924ed8cd4ea5c4c2.pyi +++ /dev/null @@ -1,38 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -import t -import stdio -import string -import c -import testcheck - -def test_string_ptr_iter() -> t.CInt: pass - -def test_string_ascii_sum() -> t.CInt: pass - -def test_manual_strcpy() -> t.CInt: pass - -def test_ptr_offset_compare() -> t.CInt: pass - -def test_manual_strlen() -> t.CInt: pass - -def test_reverse_string_ptr() -> t.CInt: pass - -def test_double_pointer() -> t.CInt: pass - -def test_ptr_arithmetic() -> t.CInt: pass - -def test_manual_strcmp() -> t.CInt: pass - - -class Vec2: - x: t.CInt - y: t.CInt - -def test_struct_ptr_access() -> t.CInt: pass - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/93427ff78e455f30.doc.json b/.transpyc_cache/93427ff78e455f30.doc.json deleted file mode 100644 index a63fb44..0000000 --- a/.transpyc_cache/93427ff78e455f30.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"WhileHandle": "while 循环语句处理器:继承 Mixin 获得 Trans 回指针", "WhileHandle.Handle": "翻译 while 循环语句"} \ No newline at end of file diff --git a/.transpyc_cache/93427ff78e455f30.pyi b/.transpyc_cache/93427ff78e455f30.pyi deleted file mode 100644 index 0a1cc1e..0000000 --- a/.transpyc_cache/93427ff78e455f30.pyi +++ /dev/null @@ -1,26 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesWhile.py -Module: lib.core.Handles.HandlesWhile -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesBody as HandlesBody - -@t.NoVTable -class WhileHandle(HandlesBase.Mixin): - def __init__(self: WhileHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: WhileHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewWhileHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> WhileHandle | t.CPtr: pass diff --git a/.transpyc_cache/93816021912fb156.doc.json b/.transpyc_cache/93816021912fb156.doc.json deleted file mode 100644 index 42f2fd1..0000000 --- a/.transpyc_cache/93816021912fb156.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"AugAssignHandle": "增强赋值处理器 (+=, -=, *=, etc.):继承 Mixin 获得 Trans 回指针", "AugAssignHandle.Handle": "翻译增强赋值语句 (x += 1, y -= 2, etc.)", "_apply_aug_op": "应用增强赋值的二元运算(指针算术 + 整数运算)"} \ No newline at end of file diff --git a/.transpyc_cache/93816021912fb156.pyi b/.transpyc_cache/93816021912fb156.pyi deleted file mode 100644 index ee3342d..0000000 --- a/.transpyc_cache/93816021912fb156.pyi +++ /dev/null @@ -1,27 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesAugAssign.py -Module: lib.core.Handles.HandlesAugAssign -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import stdio -import string -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal - -@t.NoVTable -class AugAssignHandle(HandlesBase.Mixin): - def __init__(self: AugAssignHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: AugAssignHandle, node: ast.AST | t.CPtr) -> int: pass - -def _apply_aug_op(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, op: int, lhs: llvmlite.Value | t.CPtr, rhs: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def NewAugAssignHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> AugAssignHandle | t.CPtr: pass diff --git a/.transpyc_cache/93964ed348985612.doc.json b/.transpyc_cache/93964ed348985612.doc.json deleted file mode 100644 index dda4745..0000000 --- a/.transpyc_cache/93964ed348985612.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"get_func_name": "从函数节点提取函数名", "escape_llvm_string": "将字符串转换为 LLVM IR 字符串字面量 c\"...\\00\" ", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "get_llvm_float_bits": "获取 LLVM 浮点类型的位宽,非浮点类型返回 0", "is_ptr_type": "检查 ty 是否是 Ptr 类型,返回 1=是, 0=否", "_deref_if_ptr_ptr": "如果 obj_ptr 是 Ptr(Ptr(...)),load 解引用获取内层指针", "coerce_to_type": "将 val 强制转换为 target_ty\n\n 整数: sext(扩展)/ trunc(截断)\n 浮点: fpext(扩展)/ fptrunc(截断)\n int→float: sitofp\n float→int: fptosi\n ", "create_global_string": "创建全局字符串常量并返回 i8* bitcast", "translate_constant": "翻译常量(int/str/bool)", "_infer_elem_type_from_value": "从 LLVM Value 的类型推断 list 元素类型名", "_find_pool_var": "查找上下文中的 pool 变量,返回 alloca 或 None", "translate_list_literal": "翻译 list 字面量 [a, b, c] → list[T](pool) + append 序列", "translate_value": "翻译值表达式为 LLVM Value", "translate_compare": "翻译比较表达式,返回 i1 结果", "translate_unaryop": "翻译一元运算(-x, +x, not x, ~x)", "translate_boolop": "翻译布尔运算(and/or)的短路求值,返回 i1", "translate_name_value": "翻译变量引用(Name 节点)→ load", "ExprHandle": "表达式处理器:继承 Mixin 获得 Trans 回指针", "ExprHandle.HandleValue": "翻译值表达式,从 self.Trans 获取共享状态", "list_getitem_inline": "内联生成 list __getitem__ 逻辑,返回元素地址 (i8*)", "_list_elem_type_from_name": "从 list 类型名提取元素 LLVM 类型", "list_setitem_inline": "内联生成 list __setitem__ 逻辑,返回 0", "is_list_subscript": "检查 Subscript 节点是否是 list[T] 类型,返回 list 对象指针或 None", "translate_subscript": "翻译下标表达式,返回加载的元素值", "translate_attribute": "翻译属性访问,返回加载的字段值", "get_subscript_ptr": "获取下标表达式的元素指针(用于赋值 lhs)", "get_attribute_ptr": "获取属性访问的字段指针(用于赋值 lhs)"} \ No newline at end of file diff --git a/.transpyc_cache/93964ed348985612.pyi b/.transpyc_cache/93964ed348985612.pyi deleted file mode 100644 index 60fab85..0000000 --- a/.transpyc_cache/93964ed348985612.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExpr.py -Module: lib.core.Handles.HandlesExpr -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import llvmlite -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprOps as HandlesExprOps -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -def get_func_name(func_node: ast.AST | t.CPtr) -> str: pass - -def escape_llvm_string(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_llvm_float_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def is_ptr_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _deref_if_ptr_ptr(builder: llvmlite.IRBuilder | t.CPtr, obj_ptr: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def coerce_to_type(builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def create_global_string(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, str_val: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_constant(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_elem_type_from_value(pool: memhub.MemBuddy | t.CPtr, value: llvmlite.Value | t.CPtr) -> str: pass - -def _find_pool_var(trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_list_literal(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, elem_type_name: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_compare(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_unaryop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_boolop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_name_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -@t.NoVTable -class ExprHandle(HandlesBase.Mixin): - def __init__(self: ExprHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleValue(self: ExprHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def NewExprHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprHandle | t.CPtr: pass - -def list_getitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _list_elem_type_from_name(pool: memhub.MemBuddy | t.CPtr, struct_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def list_setitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr, rhs_val: llvmlite.Value | t.CPtr) -> int: pass - -def is_list_subscript(node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_subscript(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_attribute(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_subscript_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_attribute_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/93c1d18e35d188d6.pyi b/.transpyc_cache/93c1d18e35d188d6.pyi deleted file mode 100644 index a8cd09e..0000000 --- a/.transpyc_cache/93c1d18e35d188d6.pyi +++ /dev/null @@ -1,53 +0,0 @@ -""" -Auto-generated Python stub file from platmacro.py -Module: platmacro -""" - - -import t, c - -IS_WINDOWS: t.CDefine = 1 -IS_WIN64: t.CDefine = 1 -IS_X86_64: t.CDefine = 1 -IS_LP64: t.CDefine = 1 -IS_LITTLE_ENDIAN: t.CDefine = 1 -IS_LINUX: t.CDefine = 0 -IS_MACOS: t.CDefine = 0 -IS_ARM64: t.CDefine = 0 -IS_BIG_ENDIAN: t.CDefine = 0 -IS_ILP32: t.CDefine = 0 -PTR_SIZE: t.CDefine = t.CSizeT().Size -INT_SIZE: t.CDefine = 4 -LONG_SIZE: t.CDefine = t.CLong().Size -WORD_SIZE: t.CDefine = t.CSizeT().Size -CACHE_LINE_SIZE: t.CDefine = 64 -PAGE_SIZE: t.CDefine = 4096 -STACK_ALIGN: t.CDefine = 16 -MAX_PATH_LEN: t.CDefine = 260 -PLATFORM_NAME: t.CDefine = 1 -ARCH_NAME: t.CDefine = 1 -WINVER: t.CDefine = 0x0A00 -_WIN32_WINNT: t.CDefine = 0x0A00 -NTDDI_VERSION: t.CDefine = 0x0A000006 -HAS_SSE2: t.CDefine = 1 -HAS_AVX: t.CDefine = 1 -HAS_AVX2: t.CDefine = 1 -HAS_FMA: t.CDefine = 1 -HAS_NEON: t.CDefine = 0 -ALIGNOF_INT: t.CDefine = 4 -ALIGNOF_LONG: t.CDefine = t.CLong().Size // 8 -ALIGNOF_PTR: t.CDefine = t.CSizeT().Size // 8 -ALIGNOF_DOUBLE: t.CDefine = 8 -ALIGNOF_LONG_DOUBLE: t.CDefine = 16 -SIZEOF_SHORT: t.CDefine = 2 -SIZEOF_INT: t.CDefine = 4 -SIZEOF_LONG: t.CDefine = t.CLong().Size // 8 -SIZEOF_LONG_LONG: t.CDefine = 8 -SIZEOF_FLOAT: t.CDefine = 4 -SIZEOF_DOUBLE: t.CDefine = 8 -SIZEOF_LONG_DOUBLE: t.CDefine = 16 -SIZEOF_POINTER: t.CDefine = t.CSizeT().Size // 8 -SIZEOF_SIZE_T: t.CDefine = t.CSizeT().Size // 8 -SIZEOF_PTRDIFF_T: t.CDefine = t.CPtrDiffT().Size // 8 -BYTE_ORDER_LE: t.CDefine = 1 -BYTE_ORDER_BE: t.CDefine = 0 \ No newline at end of file diff --git a/Test/AstTest/temp/ab6e54ba9a669f76.pyi b/.transpyc_cache/9474791561654346.pyi similarity index 83% rename from Test/AstTest/temp/ab6e54ba9a669f76.pyi rename to .transpyc_cache/9474791561654346.pyi index 4fc3440..1f82b1e 100644 --- a/Test/AstTest/temp/ab6e54ba9a669f76.pyi +++ b/.transpyc_cache/9474791561654346.pyi @@ -46,3 +46,14 @@ def atoll(src: str) -> t.CInt64T: pass def atof(src: str) -> t.CDouble: pass def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/.transpyc_cache/950028de389b7a7b.doc.json b/.transpyc_cache/950028de389b7a7b.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/950028de389b7a7b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/950028de389b7a7b.pyi b/.transpyc_cache/950028de389b7a7b.pyi deleted file mode 100644 index b7bdb15..0000000 --- a/.transpyc_cache/950028de389b7a7b.pyi +++ /dev/null @@ -1,41 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import argparse -import w32.win32console as w32cmd -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import sys -import ast -import lib -import lib.core.VLogger as VLogger -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.BuildPipeline as BuildPipeline -import lib.core.IncludesScanner as IncludesScanner -import lib.core.StubMerger as StubMerger -import lib.core.Phase1 as Phase1 -import lib.core.Phase2 as Phase2 -import lib.Projectrans.Config as Config -import lib.Projectrans.Utils as Utils -import llvmlite -import subprocess -import viperlib -import hashlib - -POOL_SIZE: t.CDefine = 1073741824 -CODE_PAGE: t.CDefine = 65001 -SRC_BUF_SIZE: t.CDefine = 1048576 - -def main() -> int: pass diff --git a/.transpyc_cache/953883473b8184c1.doc.json b/.transpyc_cache/953883473b8184c1.doc.json deleted file mode 100644 index 5d5c7e9..0000000 --- a/.transpyc_cache/953883473b8184c1.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"extract_func_attrs": "从 decorator_list 提取 c.Attribute 属性,返回 LLVM IR 属性字符串", "_get_attr_name_from_node": "从 AST 节点提取属性名\n\n 支持:\n - Call(func=Attribute(...)): t.attr.always_inline() -> \"always_inline\"\n - Attribute: t.attr.packed -> \"packed\"\n - Attribute(t.attr.llvm.xxx): t.attr.llvm.nounwind -> \"nounwind\"\n ", "_append_llvm_attr": "将属性名映射到 LLVM 属性名并追加到缓冲区\n\n 返回 1 表示已追加,0 表示不支持该属性\n ", "_append_str": "将字符串追加到 buf 末尾(用 strlen+strcpy 模拟 strcat)", "_mangle_name": "为任意名称添加 SHA1 前缀(不做 main/export 检查)", "_mangle_name_with_sha1": "用指定 SHA1 为名称添加前缀(不做 main/export 检查)", "_mangle_func_name": "为函数名添加 SHA1 前缀(检查 main/export)", "translate_function_def": "翻译函数定义,返回新增的变量数(通常为 0,函数定义不增加当前作用域变量)", "translate_nested_function_def": "翻译嵌套函数定义:提升为顶层函数 + 创建闭包", "create_function": "创建 LLVM 函数并添加参数"} \ No newline at end of file diff --git a/.transpyc_cache/953883473b8184c1.pyi b/.transpyc_cache/953883473b8184c1.pyi deleted file mode 100644 index d7a865c..0000000 --- a/.transpyc_cache/953883473b8184c1.pyi +++ /dev/null @@ -1,43 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesFunctions.py -Module: lib.core.Handles.HandlesFunctions -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import viperlib -import stdio -import stdlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesBody as HandlesBody -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesImports as HandlesImports - -def extract_func_attrs(pool: memhub.MemBuddy | t.CPtr, decorator_list: list[ast.AST | t.CPtr] | t.CPtr, imported_modules: str) -> t.CChar | t.CPtr: pass - -def _get_attr_name_from_node(node: ast.AST | t.CPtr) -> str: pass - -def _append_llvm_attr(attrs_buf: t.CChar | t.CPtr, attr_name: str) -> int: pass - -def _append_str(buf: t.CChar | t.CPtr, s: str) -> None: pass - -def _mangle_name(trans: HT.Translator | t.CPtr, name: str) -> str: pass - -def _mangle_name_with_sha1(sha1: str, name: str) -> str: pass - -def _mangle_func_name(trans: HT.Translator | t.CPtr, name: str, has_export: int) -> str: pass - -def translate_function_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_nested_function_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def create_function(pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, name: str, args_node: ast.AST | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Function | t.CPtr: pass diff --git a/.transpyc_cache/95394ca8da0f655a.pyi b/.transpyc_cache/95394ca8da0f655a.pyi deleted file mode 100644 index 27fd0e2..0000000 --- a/.transpyc_cache/95394ca8da0f655a.pyi +++ /dev/null @@ -1,70 +0,0 @@ -""" -Auto-generated Python stub file from llvmlite.__init__.py -Module: llvmlite.__init__ -""" - - -import t, c -from stdint import * -import memhub -import string -import viperlib -from .__types import LLVMType, ParamNode, LLVMTypeCore, Int1, Int8, Int16, Int32, Int64, Ptr, Func, Void, Array, Struct, Half, Float, Double, FP128, Label, new_param_node, param_list_append, paramnode_get_ty, paramnode_get_next, paramnode_set_ty, paramnode_set_next, TypePrint, PrintStructDefinition, get_struct_name -from .__values import Value, new_value, ConstInt, ConstNull, ConstZero, ConstFloat, SSAValue, ValuePrint, value_get_ty, value_get_next, value_set_ty, value_set_next, value_set_name, value_set_isconst -from .__function import Line, BasicBlock, Param, Function, new_line, new_basic_block, new_param, new_function, function_add_param, function_add_block, block_append_line, block_append_text, function_set_attrs, param_set_attrs, function_get_name, function_get_ret_ty, function_get_params, function_get_param_head, function_get_next, function_is_declared, param_get_name, param_get_ty, param_get_next, FunctionPrint -from .__module import LLVMModule, GlobalVariable, NamedTypeNode, new_module, new_global_variable, module_add_function, module_add_global, module_add_named_type, module_set_target, module_set_datalayout, global_set_constant, global_set_linkage, global_set_unnamed_addr, global_set_section, LLVMModulePrint, OUTPUT_FULL, OUTPUT_STUB, OUTPUT_TEXT, module_ensure_opaque_for_type -from .__builder import IRBuilder, new_builder, position_at_end, build_alloca, build_load, build_store, build_add, build_sub, build_mul, build_sdiv, build_udiv, build_srem, build_urem, build_and, build_or, build_xor, build_shl, build_lshr, build_ashr, build_fadd, build_fsub, build_fmul, build_fdiv, build_frem, build_fneg, build_icmp, build_fcmp, build_br, build_cond_br, build_ret, build_ret_void, build_call, build_call_indirect, build_bitcast, build_sext, build_trunc, build_zext, build_ptrtoint, build_inttoptr, build_fpext, build_fptrunc, build_fp2si, build_si2fp, build_fp2ui, build_ui2fp, build_gep, build_gep_array, build_gep_struct, build_phi, build_switch, build_select, build_unreachable, build_atomicrmw, build_cmpxchg, build_inline_asm, PhiIncoming, new_phi_incoming, SwitchCase, new_switch_case, ICMP_EQ, ICMP_NE, ICMP_SGT, ICMP_SGE, ICMP_SLT, ICMP_SLE, ICMP_UGT, ICMP_UGE, ICMP_ULT, ICMP_ULE, FCMP_FALSE, FCMP_OEQ, FCMP_OGT, FCMP_OGE, FCMP_OLT, FCMP_OLE, FCMP_ONE, FCMP_ORD, FCMP_UNO, FCMP_UEQ, FCMP_UGT, FCMP_UGE, FCMP_ULT, FCMP_ULE, FCMP_UNE, FCMP_TRUE, ATOMIC_XCHG, ATOMIC_ADD, ATOMIC_SUB, ATOMIC_AND, ATOMIC_NAND, ATOMIC_OR, ATOMIC_XOR, ATOMIC_MAX, ATOMIC_MIN, ATOMIC_UMAX, ATOMIC_UMIN, ATOMIC_ORDER_NOTATOMIC, ATOMIC_ORDER_UNORDERED, ATOMIC_ORDER_MONOTONIC, ATOMIC_ORDER_ACQUIRE, ATOMIC_ORDER_RELEASE, ATOMIC_ORDER_ACQ_REL, ATOMIC_ORDER_SEQ_CST -from .__verify import VerifyResult, NameEntry, verify_function, verify_module, VERIFY_OK, VERIFY_ERR_NO_TERMINATOR, VERIFY_ERR_DUPLICATE_DEF, VERIFY_ERR_UNDEFINED_USE, VERIFY_ERR_PHI_NOT_FIRST, _new_verify_result - -def _str_dup(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def create_block(pool: memhub.MemBuddy | t.CPtr, func: Function | t.CPtr, name: t.CChar | t.CPtr) -> BasicBlock | t.CPtr: pass - -def const_int(pool: memhub.MemBuddy | t.CPtr, bits: t.CInt, val: t.CInt64T) -> Value | t.CPtr: pass - -def const_int32(pool: memhub.MemBuddy | t.CPtr, val: t.CInt64T) -> Value | t.CPtr: pass - -def const_int64(pool: memhub.MemBuddy | t.CPtr, val: t.CInt64T) -> Value | t.CPtr: pass - -def create_function(pool: memhub.MemBuddy | t.CPtr, mod: LLVMModule | t.CPtr, name: t.CChar | t.CPtr, ret_ty: LLVMType | t.CPtr) -> Function | t.CPtr: pass - -def add_param(pool: memhub.MemBuddy | t.CPtr, func: Function | t.CPtr, ty: LLVMType | t.CPtr, name: t.CChar | t.CPtr) -> Param | t.CPtr: pass - -def create_declare(pool: memhub.MemBuddy | t.CPtr, mod: LLVMModule | t.CPtr, name: t.CChar | t.CPtr, ret_ty: LLVMType | t.CPtr) -> Function | t.CPtr: pass - -def create_global_string(pool: memhub.MemBuddy | t.CPtr, mod: LLVMModule | t.CPtr, name: t.CChar | t.CPtr, text: t.CChar | t.CPtr) -> GlobalVariable | t.CPtr: pass - -def create_global_int(pool: memhub.MemBuddy | t.CPtr, mod: LLVMModule | t.CPtr, name: t.CChar | t.CPtr, bits: t.CInt, val: t.CInt64T) -> GlobalVariable | t.CPtr: pass - - -@t.NoVTable -class LLVMModuleCore: - Pool: memhub.MemBuddy | t.CPtr - def __init__(self: LLVMModuleCore, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - def NewModule(self: LLVMModuleCore, name: t.CChar | t.CPtr) -> LLVMModule | t.CPtr: pass - def CreateFunction(self: LLVMModuleCore, mod: LLVMModule | t.CPtr, name: t.CChar | t.CPtr, ret_ty: LLVMType | t.CPtr) -> Function | t.CPtr: pass - def CreateDeclare(self: LLVMModuleCore, mod: LLVMModule | t.CPtr, name: t.CChar | t.CPtr, ret_ty: LLVMType | t.CPtr) -> Function | t.CPtr: pass - def AddParam(self: LLVMModuleCore, func: Function | t.CPtr, ty: LLVMType | t.CPtr, name: t.CChar | t.CPtr) -> Param | t.CPtr: pass - def FunctionSetAttrs(self: LLVMModuleCore, func: Function | t.CPtr, attrs: t.CChar | t.CPtr) -> t.CInt: pass - def ParamSetAttrs(self: LLVMModuleCore, param: Param | t.CPtr, attrs: t.CChar | t.CPtr) -> t.CInt: pass - def CreateBlock(self: LLVMModuleCore, func: Function | t.CPtr, name: t.CChar | t.CPtr) -> BasicBlock | t.CPtr: pass - def NewBuilder(self: LLVMModuleCore, func: Function | t.CPtr) -> IRBuilder | t.CPtr: pass - def NewGlobal(self: LLVMModuleCore, mod: LLVMModule | t.CPtr, name: t.CChar | t.CPtr, ty: LLVMType | t.CPtr) -> GlobalVariable | t.CPtr: pass - def CreateGlobalString(self: LLVMModuleCore, mod: LLVMModule | t.CPtr, name: t.CChar | t.CPtr, text: t.CChar | t.CPtr) -> GlobalVariable | t.CPtr: pass - def CreateGlobalInt(self: LLVMModuleCore, mod: LLVMModule | t.CPtr, name: t.CChar | t.CPtr, bits: t.CInt, val: t.CInt64T) -> GlobalVariable | t.CPtr: pass - def GlobalSetConstant(self: LLVMModuleCore, gv: GlobalVariable | t.CPtr, is_const: t.CInt) -> t.CInt: pass - def GlobalSetLinkage(self: LLVMModuleCore, gv: GlobalVariable | t.CPtr, linkage: t.CChar | t.CPtr) -> t.CInt: pass - def GlobalSetUnnamedAddr(self: LLVMModuleCore, gv: GlobalVariable | t.CPtr, level: t.CInt) -> t.CInt: pass - def GlobalSetSection(self: LLVMModuleCore, gv: GlobalVariable | t.CPtr, section: t.CChar | t.CPtr) -> t.CInt: pass - def ConstInt(self: LLVMModuleCore, bits: t.CInt, val: t.CInt64T) -> Value | t.CPtr: pass - def ConstInt32(self: LLVMModuleCore, val: t.CInt64T) -> Value | t.CPtr: pass - def ConstInt64(self: LLVMModuleCore, val: t.CInt64T) -> Value | t.CPtr: pass - def ConstFloat(self: LLVMModuleCore, ty: LLVMType | t.CPtr, val: t.CDouble) -> Value | t.CPtr: pass - def SSAValue(self: LLVMModuleCore, ty: LLVMType | t.CPtr, name: t.CChar | t.CPtr) -> Value | t.CPtr: pass - def ConstNull(self: LLVMModuleCore, ty: LLVMType | t.CPtr, name: t.CChar | t.CPtr) -> Value | t.CPtr: pass - def PrintValue(self: LLVMModuleCore, buf: t.CChar | t.CPtr, size: t.CSizeT, val: Value | t.CPtr) -> t.CInt: pass - def PrintFunction(self: LLVMModuleCore, buf: t.CChar | t.CPtr, size: t.CSizeT, func: Function | t.CPtr) -> t.CInt: pass - def PrintModule(self: LLVMModuleCore, buf: t.CChar | t.CPtr, size: t.CSizeT, mod: LLVMModule | t.CPtr) -> t.CInt: pass - def NewVerifyResult(self: LLVMModuleCore, buf_size: t.CSizeT) -> VerifyResult | t.CPtr: pass - def VerifyFunction(self: LLVMModuleCore, func: Function | t.CPtr, result: VerifyResult | t.CPtr) -> t.CInt: pass - def VerifyModule(self: LLVMModuleCore, mod: LLVMModule | t.CPtr, result: VerifyResult | t.CPtr) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/96368aa26ab1b560.doc.json b/.transpyc_cache/96368aa26ab1b560.doc.json deleted file mode 100644 index 525feb5..0000000 --- a/.transpyc_cache/96368aa26ab1b560.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/96368aa26ab1b560.pyi b/.transpyc_cache/96368aa26ab1b560.pyi deleted file mode 100644 index 8513bb5..0000000 --- a/.transpyc_cache/96368aa26ab1b560.pyi +++ /dev/null @@ -1,56 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/96837bcc64032444.pyi b/.transpyc_cache/96837bcc64032444.pyi deleted file mode 100644 index 46e78bd..0000000 --- a/.transpyc_cache/96837bcc64032444.pyi +++ /dev/null @@ -1,13 +0,0 @@ -""" -Auto-generated Python stub file from hashlib.__init__.py -Module: hashlib.__init__ -""" - -import t -import c - - -from .__md5 import md5, MD5_DIGEST_LEN -from .__sha1 import sha1, SHA1_DIGEST_LEN -from .__sha256 import sha256, SHA256_DIGEST_LEN -from .__sha512 import sha512, SHA512_DIGEST_LEN \ No newline at end of file diff --git a/.transpyc_cache/969c589035910845.doc.json b/.transpyc_cache/969c589035910845.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/969c589035910845.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/969c589035910845.pyi b/.transpyc_cache/969c589035910845.pyi deleted file mode 100644 index ae928ab..0000000 --- a/.transpyc_cache/969c589035910845.pyi +++ /dev/null @@ -1,10 +0,0 @@ -""" -Auto-generated Python stub file from flow_test.py -Module: flow_test -""" - - -import stdio -import t, c - -def flow_test() -> int: pass diff --git a/.transpyc_cache/97043f0d52da437f.doc.json b/.transpyc_cache/97043f0d52da437f.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/97043f0d52da437f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/97043f0d52da437f.pyi b/.transpyc_cache/97043f0d52da437f.pyi deleted file mode 100644 index f132db1..0000000 --- a/.transpyc_cache/97043f0d52da437f.pyi +++ /dev/null @@ -1,26 +0,0 @@ -""" -Auto-generated Python stub file from inherit_test.py -Module: inherit_test -""" - - -import stdio -import t, c - -@t.CVTable -class Animal: - name: t.CInt - def __init__(self: Animal, n: t.CInt) -> t.CInt: pass - def GetName(self: Animal) -> t.CInt: pass - def Speak(self: Animal) -> t.CInt: pass -class Dog(Animal): - breed: t.CInt - def __init__(self: Dog, n: t.CInt, b: t.CInt) -> t.CInt: pass - def Speak(self: Dog) -> t.CInt: pass - def GetBreed(self: Dog) -> t.CInt: pass -class Cat(Animal): - color: t.CInt - def __init__(self: Cat, n: t.CInt, col: t.CInt) -> t.CInt: pass - def GetColor(self: Cat) -> t.CInt: pass - -def inherit_test() -> int: pass diff --git a/.transpyc_cache/982690df9fb41dde.doc.json b/.transpyc_cache/982690df9fb41dde.doc.json deleted file mode 100644 index f6225ef..0000000 --- a/.transpyc_cache/982690df9fb41dde.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"translate_stmt": "翻译单条语句,返回新增的变量数", "translate_global": "翻译 global 语句:记录 global 变量名", "translate_nonlocal": "翻译 nonlocal 语句:记录 nonlocal 变量名", "translate_expr_stmt": "翻译表达式语句(printf 调用等)", "pre_scan_allocas": "预扫描语句中的 AnnAssign,提前创建 alloca\n\n 返回新增的变量数\n ", "translate_break": "翻译 break 语句:跳转到循环 end 块", "translate_continue": "翻译 continue 语句:跳转到循环 cond/incr 块", "get_stmt_kind_name": "获取语句类型名"} \ No newline at end of file diff --git a/.transpyc_cache/982690df9fb41dde.pyi b/.transpyc_cache/982690df9fb41dde.pyi deleted file mode 100644 index aa52e34..0000000 --- a/.transpyc_cache/982690df9fb41dde.pyi +++ /dev/null @@ -1,35 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesBody.py -Module: lib.core.Handles.HandlesBody -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesFunctions as HandlesFunctions -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -def translate_stmt(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_global(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_nonlocal(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_expr_stmt(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def pre_scan_allocas(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_break(trans: HT.Translator | t.CPtr) -> int: pass - -def translate_continue(trans: HT.Translator | t.CPtr) -> int: pass - -def get_stmt_kind_name(node: ast.AST | t.CPtr) -> str: pass diff --git a/.transpyc_cache/9852dff1297b8322.doc.json b/.transpyc_cache/9852dff1297b8322.doc.json deleted file mode 100644 index f67a6e1..0000000 --- a/.transpyc_cache/9852dff1297b8322.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/9852dff1297b8322.pyi b/.transpyc_cache/9852dff1297b8322.pyi deleted file mode 100644 index 477ab88..0000000 --- a/.transpyc_cache/9852dff1297b8322.pyi +++ /dev/null @@ -1,169 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/98826042e4664018.doc.json b/.transpyc_cache/98826042e4664018.doc.json deleted file mode 100644 index 525feb5..0000000 --- a/.transpyc_cache/98826042e4664018.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/98826042e4664018.pyi b/.transpyc_cache/98826042e4664018.pyi deleted file mode 100644 index 8513bb5..0000000 --- a/.transpyc_cache/98826042e4664018.pyi +++ /dev/null @@ -1,56 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/9928c0bfda57ff30.doc.json b/.transpyc_cache/9928c0bfda57ff30.doc.json deleted file mode 100644 index f8bc59e..0000000 --- a/.transpyc_cache/9928c0bfda57ff30.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"add_imported_module": "记录已导入的模块名,返回新的 imported_modules 字符串指针", "is_module_imported": "检查模块是否已导入(词边界精确匹配,避免子串误匹配)", "add_from_import": "添加 from-import 映射 \"name:module\",返回新的 from_imports 字符串", "lookup_from_import": "查找 from-import 名称,返回模块名或 None\n\n 支持 star import: 如果 from_imports 中有 \"*:module\" 条目,\n 且未找到精确名称匹配,则返回 star import 的模块名。\n ", "ImportsHandle": "导入语句处理器:继承 Mixin 获得 Trans 回指针", "ImportsHandle.HandleImport": "处理 import 语句,返回 0", "ImportsHandle.HandleImportFromModule": "处理 from X import Y 的模块部分,更新 trans._imported_modules", "ImportsHandle.HandleImportFromNames": "处理 from X import Y 的名称部分,更新 trans._from_imports"} \ No newline at end of file diff --git a/.transpyc_cache/9928c0bfda57ff30.pyi b/.transpyc_cache/9928c0bfda57ff30.pyi deleted file mode 100644 index 7abd965..0000000 --- a/.transpyc_cache/9928c0bfda57ff30.pyi +++ /dev/null @@ -1,34 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesImports.py -Module: lib.core.Handles.HandlesImports -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import viperlib -import stdio -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesStruct as HandlesStruct - -def add_imported_module(pool: memhub.MemBuddy | t.CPtr, imported_modules: str, name: str) -> str: pass - -def is_module_imported(imported_modules: str, name: str) -> int: pass - -def add_from_import(pool: memhub.MemBuddy | t.CPtr, from_imports: str, local_name: str, module_name: str) -> str: pass - -def lookup_from_import(from_imports: str, name: str) -> str: pass - - -@t.NoVTable -class ImportsHandle(HandlesBase.Mixin): - def __init__(self: ImportsHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleImport(self: ImportsHandle, node: ast.AST | t.CPtr) -> int: pass - def HandleImportFromModule(self: ImportsHandle, node: ast.AST | t.CPtr) -> int: pass - def HandleImportFromNames(self: ImportsHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewImportsHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ImportsHandle | t.CPtr: pass diff --git a/.transpyc_cache/9b52a4613d3ad296.doc.json b/.transpyc_cache/9b52a4613d3ad296.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/9b52a4613d3ad296.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/9b52a4613d3ad296.pyi b/.transpyc_cache/9b52a4613d3ad296.pyi deleted file mode 100644 index b7bdb15..0000000 --- a/.transpyc_cache/9b52a4613d3ad296.pyi +++ /dev/null @@ -1,41 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import argparse -import w32.win32console as w32cmd -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import sys -import ast -import lib -import lib.core.VLogger as VLogger -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.BuildPipeline as BuildPipeline -import lib.core.IncludesScanner as IncludesScanner -import lib.core.StubMerger as StubMerger -import lib.core.Phase1 as Phase1 -import lib.core.Phase2 as Phase2 -import lib.Projectrans.Config as Config -import lib.Projectrans.Utils as Utils -import llvmlite -import subprocess -import viperlib -import hashlib - -POOL_SIZE: t.CDefine = 1073741824 -CODE_PAGE: t.CDefine = 65001 -SRC_BUF_SIZE: t.CDefine = 1048576 - -def main() -> int: pass diff --git a/.transpyc_cache/9b7d2adaae94f021.doc.json b/.transpyc_cache/9b7d2adaae94f021.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/9b7d2adaae94f021.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/9b7d2adaae94f021.pyi b/.transpyc_cache/9b7d2adaae94f021.pyi deleted file mode 100644 index 3552322..0000000 --- a/.transpyc_cache/9b7d2adaae94f021.pyi +++ /dev/null @@ -1,65 +0,0 @@ -""" -Auto-generated Python stub file from __zlib.zdef.py -Module: __zlib.zdef -""" - - -from stdint import * -import stddef -import string -import stdlib -import t, c - -ZDEFLATE_WINDOW_BITS: t.CDefine = 15 -ZDEFLATE_WINDOW_SIZE: t.CDefine = (1 << ZDEFLATE_WINDOW_BITS) -ZDEFLATE_WINDOW_MASK: t.CDefine = (ZDEFLATE_WINDOW_SIZE - 1) -ZDEFLATE_MIN_MATCH: t.CDefine = 3 -ZDEFLATE_MAX_MATCH: t.CDefine = 258 -ZDEFLATE_HASH_BITS: t.CDefine = 15 -ZDEFLATE_HASH_SIZE: t.CDefine = (1 << ZDEFLATE_HASH_BITS) -ZDEFLATE_HASH_MASK: t.CDefine = (ZDEFLATE_HASH_SIZE - 1) -ZDEFLATE_MAX_CODES: t.CDefine = 288 -ZDEFLATE_MAX_DIST_CODES: t.CDefine = 32 -ZDEFLATE_MAX_BITS: t.CDefine = 15 -ZDEFLATE_MAX_CODELEN_CODES: t.CDefine = 19 -ZDEFLATE_LIT_COUNT: t.CDefine = 286 -ZDEFLATE_DIST_COUNT: t.CDefine = 30 -ZDEFLATE_LEN_SYMBOLS_BASE: t.CDefine = 257 -ZDEFLATE_END_OF_BLOCK: t.CDefine = 256 -zdeflate_len_extra_bits: t.CExtern | t.CArray[t.CInt, 29] -zdeflate_len_base: t.CExtern | t.CArray[t.CInt, 29] -zdeflate_dist_extra_bits: t.CExtern | t.CArray[t.CInt, 30] -zdeflate_dist_base: t.CExtern | t.CArray[t.CInt, 30] -zdeflate_codelen_order: t.CExtern | t.CArray[int, 19] - -@t.Object -class zbit_writer: - buf: BYTE | t.CPtr - cap: t.CSizeT - byte_pos: t.CSizeT - bit_pos: t.CInt - def __init__(self: zbit_writer) -> t.CInt: pass - def ensure(self: zbit_writer, need: t.CSizeT) -> t.CInt: pass - def write_bits(self: zbit_writer, value: UINT, nbits: t.CInt) -> t.CInt: pass - def write_bits_rev(self: zbit_writer, code: UINT, nbits: t.CInt) -> t.CInt: pass - def stored_block(self: zbit_writer, data: UINT8PTR, length: t.CSizeT, final: t.CInt) -> t.CInt: pass - def write_zlib_header(self: zbit_writer, wbits: t.CInt, level: t.CInt) -> t.CInt: pass - def write_gzip_header(self: zbit_writer) -> t.CInt: pass - def align(self: zbit_writer) -> t.CInt: pass - def total(self: zbit_writer) -> t.CSizeT: pass - def free(self: zbit_writer) -> t.CInt: pass - def __del__(self: zbit_writer) -> t.CInt: pass -@t.Object -class zbit_reader: - buf: BYTE | t.CPtr - length: t.CSizeT - byte_pos: t.CSizeT - bit_pos: t.CInt - def init(self: zbit_reader, buf: BYTE | t.CPtr, length: t.CSizeT) -> t.CInt: pass - def read_bits(self: zbit_reader, nbits: t.CInt, out: UINTPTR) -> t.CInt: pass - def read_bits_rev(self: zbit_reader, nbits: t.CInt, out: UINTPTR) -> t.CInt: pass - def align(self: zbit_reader) -> t.CInt: pass - -def zdef_alloc(n: t.CSizeT) -> VOIDPTR: pass - -def zdef_free(p: VOIDPTR) -> t.CInt: pass diff --git a/.transpyc_cache/9ba128b762cf2b4d.doc.json b/.transpyc_cache/9ba128b762cf2b4d.doc.json deleted file mode 100644 index ca04595..0000000 --- a/.transpyc_cache/9ba128b762cf2b4d.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"reset_visible_structs": "重置可见性状态(每个文件翻译前调用)\n\n pool: 内存分配器(严格模式下创建 HashTable)\n strict: 1=严格模式(用户文件),0=宽松模式(includes 文件)\n ", "add_visible_struct": "添加可见结构体名(类定义时和 from-import 时调用)", "is_struct_visible": "检查结构体是否可见,返回 1=可见 / 0=不可见", "init_struct_table": "初始化结构体注册表,返回 1 成功", "_get_struct_entry": "获取第 i 个结构体条目", "_get_field_entry": "获取结构体中第 i 个字段条目", "register_struct": "注册结构体类型,返回 StructEntry 指针\n\n 用类型指针去重(is 比较),不用类名去重。\n 这样跨模块同名类可以共存,各自有独立的字段定义。\n sha1 参数在注册时直接设置 ModuleSha1(避免 set_struct_sha1 找错 entry)。\n ", "set_struct_sha1": "设置结构体所属模块的 SHA1,返回 1=成功 / 0=失败", "get_struct_sha1": "获取结构体所属模块的 SHA1,返回 None=无 SHA1", "add_field": "向结构体添加字段,返回字段索引(-1 失败)\n\n default_val: 字段默认值 AST 节点(可选,None=无默认值)\n annot_class_name: 原始类型注解的类名(可选,用于联合类型字段的方法调用解析)\n ", "find_struct": "按类名查找结构体,返回 StructEntry 或 None", "find_struct_by_module": "按类名 + SHA1 查找结构体,返回 StructEntry 或 None\n\n SHA1 非 None 时:精确匹配 name+sha1,未找到返回 None(不回退,避免跨模块同名找错)\n SHA1 为 None 时:回退到 find_struct(name) 按类名查找第一个\n ", "find_struct_by_type": "按类型指针查找结构体(is 比较),返回 StructEntry 或 None", "lookup_field": "按结构体类型和字段名查找字段信息\n\n 两遍查找策略(跨模块同名类冲突的根本修复):\n 第一遍: 类型指针 is 身份比较(最高优先级,类型唯一确定 entry)\n 第二遍: 名称回退(is 未匹配时,按类名/strstr 匹配,字段未找到时 continue)\n ", "lookup_field_by_class": "按类名和字段名查找字段信息\n\n 优先用 SHA1 匹配(跨模块同名类区分),无 SHA1 时按类名查找第一个\n ", "get_struct_type": "按类名获取结构体的 LLVM 类型", "get_field_by_index": "按类名和字段索引获取字段信息", "struct_has_defaults": "检查结构体是否有任何带默认值的字段,返回 1=有 / 0=无", "_is_struct_type": "检查 ty 是否是 Struct 类型(独立函数,规避嵌套 match 编译器 BUG)", "get_struct_type_from_value": "从 Value 的类型推断结构体类型", "mark_as_union": "标记已注册的结构体为联合体,返回 1=成功 / 0=失败", "is_union_by_name": "按类名检查是否为联合体,返回 1=是 / 0=否", "is_union_by_type": "按类型指针检查是否为联合体,返回 1=是 / 0=否\n\n 先尝试类型指针 == 比较,失败时回退到名称匹配\n ", "mark_as_oop": "标记已注册的结构体为 OOP,返回 1=成功 / 0=失败", "is_oop_by_name": "按类名检查是否为 OOP 结构体,返回 1=是 / 0=否", "mark_has_init": "标记结构体拥有 __init__ 方法,返回 1=成功 / 0=失败", "has_init_by_name": "按类名检查是否有 __init__ 方法,返回 1=有 / 0=无", "mark_has_new": "标记结构体拥有 __new__ 方法,返回 1=成功 / 0=失败", "has_new_by_name": "按类名检查是否有 __new__ 方法,返回 1=有 / 0=无", "get_class_name_by_type": "按类型指针查找类名,返回类名字符串或 None", "_extract_struct_name": "从 LLVMType 提取 Struct 变体的 Name 字段,返回 None 非 Struct", "mark_has_vtable": "标记结构体拥有虚表,返回 1=成功 / 0=失败", "has_vtable_by_name": "按类名检查是否有虚表,返回 1=有 / 0=无", "mark_novtable": "标记结构体为 NoVTable,返回 1=成功 / 0=失败", "is_novtable_by_name": "按类名检查是否为 NoVTable,返回 1=是 / 0=否", "set_parent_name": "设置结构体的父类名,返回 1=成功 / 0=失败", "get_parent_name": "获取结构体的父类名,返回 None=无父类", "set_vtable_methods": "设置虚表方法名数组,返回 1=成功 / 0=失败", "get_vtable_method_index": "获取方法在虚表中的索引,返回 -1=未找到", "get_vtable_method_count": "获取虚表方法数量", "get_vtable_method_name": "获取虚表中第 idx 个方法名,返回 None=越界", "get_field_count": "获取结构体字段数量,返回 -1=未找到", "get_field_name_ptr": "获取 FieldEntry 的字段名,返回 None=未设置", "get_field_type_ptr": "获取 FieldEntry 的字段类型,返回 None=未设置", "get_field_default_ptr": "获取 FieldEntry 的默认值 AST 节点,返回 None=无默认值", "get_field_annot_class_name": "获取 FieldEntry 的原始类型注解类名,返回 None=未设置"} \ No newline at end of file diff --git a/.transpyc_cache/9ba128b762cf2b4d.pyi b/.transpyc_cache/9ba128b762cf2b4d.pyi deleted file mode 100644 index 9662312..0000000 --- a/.transpyc_cache/9ba128b762cf2b4d.pyi +++ /dev/null @@ -1,139 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesStruct.py -Module: lib.core.Handles.HandlesStruct -""" - - -import t, c -from stdint import * -import memhub -import string -import llvmlite -import stdio -import ast -import hashtable - -STRUCT_MAX: t.CDefine = 512 -FIELD_MAX: t.CDefine = 32 -FIELD_NAME_MAX: t.CDefine = 64 - -@t.NoVTable -class FieldEntry: - Name: t.CChar | t.CPtr - Index: int - Ty: llvmlite.LLVMType | t.CPtr - DefaultVal: ast.AST | t.CPtr - AnnotClassName: t.CChar | t.CPtr -@t.NoVTable -class StructEntry: - Name: t.CChar | t.CPtr - Ty: llvmlite.LLVMType | t.CPtr - FieldCount: int - Fields: FieldEntry | t.CPtr - IsUnion: int - IsOOP: int - HasInit: int - HasNew: int - HasVTable: int - IsNoVTable: int - ParentName: t.CChar | t.CPtr - VTableMethodCount: int - VTableMethods: t.CChar | t.CPtr - ModuleSha1: t.CChar | t.CPtr - -_struct_table: t.CExtern | StructEntry | t.CPtr -_struct_count: t.CExtern | int -_visible_structs: t.CExtern | hashtable.HashTable | t.CPtr -_strict_visibility: t.CExtern | int - -def reset_visible_structs(pool: memhub.MemBuddy | t.CPtr, strict: int) -> t.CInt: pass - -def add_visible_struct(pool: memhub.MemBuddy | t.CPtr, name: str) -> t.CInt: pass - -def is_struct_visible(name: str) -> int: pass - -def init_struct_table(pool: memhub.MemBuddy | t.CPtr) -> int: pass - -def _get_struct_entry(i: int) -> StructEntry | t.CPtr: pass - -def _get_field_entry(struct_entry: StructEntry | t.CPtr, i: int) -> FieldEntry | t.CPtr: pass - -def register_struct(pool: memhub.MemBuddy | t.CPtr, name: str, struct_ty: llvmlite.LLVMType | t.CPtr, sha1: str) -> StructEntry | t.CPtr: pass - -def set_struct_sha1(pool: memhub.MemBuddy | t.CPtr, class_name: str, sha1: str) -> int: pass - -def get_struct_sha1(class_name: str) -> str: pass - -def add_field(pool: memhub.MemBuddy | t.CPtr, struct_entry: StructEntry | t.CPtr, field_name: str, field_ty: llvmlite.LLVMType | t.CPtr, default_val: ast.AST | t.CPtr, annot_class_name: t.CChar | t.CPtr) -> int: pass - -def find_struct(name: str) -> StructEntry | t.CPtr: pass - -def find_struct_by_module(name: str, sha1: str) -> StructEntry | t.CPtr: pass - -def find_struct_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> StructEntry | t.CPtr: pass - -def lookup_field(struct_ty: llvmlite.LLVMType | t.CPtr, field_name: str) -> FieldEntry | t.CPtr: pass - -def lookup_field_by_class(class_name: str, field_name: str, sha1: str) -> FieldEntry | t.CPtr: pass - -def get_struct_type(class_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def get_field_by_index(class_name: str, idx: int) -> FieldEntry | t.CPtr: pass - -def struct_has_defaults(class_name: str) -> int: pass - -def _is_struct_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_struct_type_from_value(val: llvmlite.Value | t.CPtr) -> llvmlite.LLVMType | t.CPtr: pass - -def mark_as_union(name: str) -> int: pass - -def is_union_by_name(name: str) -> int: pass - -def is_union_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def mark_as_oop(name: str) -> int: pass - -def is_oop_by_name(name: str) -> int: pass - -def mark_has_init(name: str) -> int: pass - -def has_init_by_name(name: str) -> int: pass - -def mark_has_new(name: str) -> int: pass - -def has_new_by_name(name: str) -> int: pass - -def get_class_name_by_type(pool: memhub.MemBuddy | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr) -> str: pass - -def _extract_struct_name(ty: llvmlite.LLVMType | t.CPtr) -> str: pass - -def mark_has_vtable(name: str) -> int: pass - -def has_vtable_by_name(name: str) -> int: pass - -def mark_novtable(name: str) -> int: pass - -def is_novtable_by_name(name: str) -> int: pass - -def set_parent_name(name: str, parent_name: str) -> int: pass - -def get_parent_name(name: str) -> str: pass - -def set_vtable_methods(name: str, methods: t.CChar | t.CPtr, count: int) -> int: pass - -def get_vtable_method_index(name: str, method_name: str) -> int: pass - -def get_vtable_method_count(name: str) -> int: pass - -def get_vtable_method_name(name: str, idx: int) -> str: pass - -def get_field_count(name: str) -> int: pass - -def get_field_name_ptr(fe: FieldEntry | t.CPtr) -> str: pass - -def get_field_type_ptr(fe: FieldEntry | t.CPtr) -> llvmlite.LLVMType | t.CPtr: pass - -def get_field_default_ptr(fe: FieldEntry | t.CPtr) -> ast.AST | t.CPtr: pass - -def get_field_annot_class_name(fe: FieldEntry | t.CPtr) -> str: pass diff --git a/.transpyc_cache/9d798d964b9d3411.doc.json b/.transpyc_cache/9d798d964b9d3411.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/9d798d964b9d3411.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/9d798d964b9d3411.pyi b/.transpyc_cache/9d798d964b9d3411.pyi deleted file mode 100644 index e7501ef..0000000 --- a/.transpyc_cache/9d798d964b9d3411.pyi +++ /dev/null @@ -1,28 +0,0 @@ -""" -Auto-generated Python stub file from new_test.py -Module: new_test -""" - - -import stdio -import t, c - -class WithNew: - value: t.CInt - def __new__(self: WithNew, v: t.CInt) -> t.CInt: pass - def __init__(self: WithNew, v: t.CInt) -> t.CInt: pass - def GetValue(self: WithNew) -> t.CInt: pass -class WithNewNoArgs: - value: t.CInt - def __new__(self: WithNewNoArgs) -> t.CInt: pass - def __init__(self: WithNewNoArgs, v: t.CInt) -> t.CInt: pass - def GetValue(self: WithNewNoArgs) -> t.CInt: pass -@t.CVTable -class WithNewVTable: - value: t.CInt - def __new__(self: WithNewVTable, v: t.CInt) -> t.CInt: pass - def __init__(self: WithNewVTable, v: t.CInt) -> t.CInt: pass - def GetValue(self: WithNewVTable) -> t.CInt: pass - def Speak(self: WithNewVTable) -> t.CInt: pass - -def new_test() -> int: pass diff --git a/.transpyc_cache/9d8e1c9631c28b1b.doc.json b/.transpyc_cache/9d8e1c9631c28b1b.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/9d8e1c9631c28b1b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/9d8e1c9631c28b1b.pyi b/.transpyc_cache/9d8e1c9631c28b1b.pyi deleted file mode 100644 index e67abb0..0000000 --- a/.transpyc_cache/9d8e1c9631c28b1b.pyi +++ /dev/null @@ -1,16 +0,0 @@ -""" -Auto-generated Python stub file from closure_test.py -Module: closure_test -""" - - -import stdio -import t, c - -g_count: t.CExtern | int - -def test_global() -> int: pass - -def make_counter() -> t.CPtr: pass - -def closure_test() -> int: pass diff --git a/.transpyc_cache/9e38ca4de81ccb6d.doc.json b/.transpyc_cache/9e38ca4de81ccb6d.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/9e38ca4de81ccb6d.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/9e38ca4de81ccb6d.pyi b/.transpyc_cache/9e38ca4de81ccb6d.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/9e38ca4de81ccb6d.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/9f6e387913081f0e.doc.json b/.transpyc_cache/9f6e387913081f0e.doc.json deleted file mode 100644 index d24160b..0000000 --- a/.transpyc_cache/9f6e387913081f0e.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"Translator": "翻译器:管理编译状态,委托 Handles 模块执行翻译", "Translator._init_state": "初始化变量表、函数表和子 Handle", "Translator.translate": "将 AST 翻译为 LLVM IR", "Translator._translate_wrapper_main": "委托 HandlesMain.create_wrapper_main() 创建包装 main(trans 单参)", "Translator._translate_module_level": "委托 HandlesMain.translate_children() 翻译模块级语句(trans 单参)", "Translator.dump_ir": "将 LLVM IR 输出到缓冲区\n\n mode: 0=完整, 1=stub(仅声明), 2=text(仅代码)\n ", "add_global_name": "添加一个 global 变量名", "is_global_name": "检查 name 是否在当前函数的 global 集合中", "add_nonlocal_name": "添加一个 nonlocal 变量名", "is_nonlocal_name": "检查 name 是否在当前函数的 nonlocal 集合中", "get_nonlocal_index": "获取 nonlocal 变量在 env 中的索引(0-based),找不到返回 -1", "clear_scope_names": "清空当前函数的 global/nonlocal 名称集合(进入新函数时调用)"} \ No newline at end of file diff --git a/.transpyc_cache/9f6e387913081f0e.pyi b/.transpyc_cache/9f6e387913081f0e.pyi deleted file mode 100644 index 89de3bc..0000000 --- a/.transpyc_cache/9f6e387913081f0e.pyi +++ /dev/null @@ -1,88 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesTranslator.py -Module: lib.core.Handles.HandlesTranslator -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesMain as HandlesMain -import lib.core.Handles.HandlesAssign as HandlesAssign -import lib.core.Handles.HandlesReturn as HandlesReturn -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesAnnAssign as HandlesAnnAssign -import lib.core.Handles.HandlesAugAssign as HandlesAugAssign -import lib.core.Handles.HandlesIf as HandlesIf -import lib.core.Handles.HandlesWhile as HandlesWhile -import lib.core.Handles.HandlesFor as HandlesFor -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.Projectrans.Config as Config - -MAX_VARS: t.CDefine = 256 -MAX_FUNCS: t.CDefine = 256 -MAX_GLOBAL_NAMES: t.CDefine = 32 - -@t.NoVTable -class Translator: - Module: llvmlite.LLVMModule | t.CPtr - Pool: memhub.MemBuddy | t.CPtr - _funcs: HandlesExprCall.FuncEntry | t.CPtr - _func_count: t.CInt - _imported_modules: str - _from_imports: str - _cur_func: llvmlite.Function | t.CPtr - _cur_builder: llvmlite.IRBuilder | t.CPtr - _break_bb: llvmlite.BasicBlock | t.CPtr - _continue_bb: llvmlite.BasicBlock | t.CPtr - _label_counter: t.CInt - _global_names: str - _global_name_count: t.CInt - _nonlocal_names: str - _nonlocal_name_count: t.CInt - _cur_func_name: str - ModuleSha1: str - _closure_env_offsets: t.CInt - _closure_env_count: t.CInt - GenericTypeParamNames: list[str] | t.CPtr - GenericTypeArgs: list[str] | t.CPtr - _declare_only: t.CInt - AssignH: HandlesAssign.AssignHandle | t.CPtr - ReturnH: HandlesReturn.ReturnHandle | t.CPtr - ImportsH: HandlesImports.ImportsHandle | t.CPtr - AnnAssignH: HandlesAnnAssign.AnnAssignHandle | t.CPtr - AugAssignH: HandlesAugAssign.AugAssignHandle | t.CPtr - IfH: HandlesIf.IfHandle | t.CPtr - WhileH: HandlesWhile.WhileHandle | t.CPtr - ForH: HandlesFor.ForHandle | t.CPtr - ExprH: HandlesExpr.ExprHandle | t.CPtr - ExprCallH: HandlesExprCall.ExprCallHandle | t.CPtr - SymTab: HandlesVar.SymbolTable | t.CPtr - def __init__(self: Translator) -> t.CInt: pass - def _init_state(self: Translator, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - def translate(self: Translator, tree: ast.AST | t.CPtr) -> int: pass - def _translate_wrapper_main(self: Translator, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, tree: ast.AST | t.CPtr, i32_ty: llvmlite.LLVMType | t.CPtr) -> t.CInt: pass - def _translate_module_level(self: Translator, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, tree: ast.AST | t.CPtr) -> t.CInt: pass - def dump_ir(self: Translator, buf: bytes, size: t.CSizeT, mode: int) -> t.CInt: pass - -def add_global_name(trans: HT.Translator | t.CPtr, name: str) -> t.CInt: pass - -def is_global_name(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def add_nonlocal_name(trans: HT.Translator | t.CPtr, name: str) -> t.CInt: pass - -def is_nonlocal_name(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def get_nonlocal_index(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def clear_scope_names(trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr \ No newline at end of file diff --git a/.transpyc_cache/9fdf7e28103d0ff0.doc.json b/.transpyc_cache/9fdf7e28103d0ff0.doc.json deleted file mode 100644 index ca04595..0000000 --- a/.transpyc_cache/9fdf7e28103d0ff0.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"reset_visible_structs": "重置可见性状态(每个文件翻译前调用)\n\n pool: 内存分配器(严格模式下创建 HashTable)\n strict: 1=严格模式(用户文件),0=宽松模式(includes 文件)\n ", "add_visible_struct": "添加可见结构体名(类定义时和 from-import 时调用)", "is_struct_visible": "检查结构体是否可见,返回 1=可见 / 0=不可见", "init_struct_table": "初始化结构体注册表,返回 1 成功", "_get_struct_entry": "获取第 i 个结构体条目", "_get_field_entry": "获取结构体中第 i 个字段条目", "register_struct": "注册结构体类型,返回 StructEntry 指针\n\n 用类型指针去重(is 比较),不用类名去重。\n 这样跨模块同名类可以共存,各自有独立的字段定义。\n sha1 参数在注册时直接设置 ModuleSha1(避免 set_struct_sha1 找错 entry)。\n ", "set_struct_sha1": "设置结构体所属模块的 SHA1,返回 1=成功 / 0=失败", "get_struct_sha1": "获取结构体所属模块的 SHA1,返回 None=无 SHA1", "add_field": "向结构体添加字段,返回字段索引(-1 失败)\n\n default_val: 字段默认值 AST 节点(可选,None=无默认值)\n annot_class_name: 原始类型注解的类名(可选,用于联合类型字段的方法调用解析)\n ", "find_struct": "按类名查找结构体,返回 StructEntry 或 None", "find_struct_by_module": "按类名 + SHA1 查找结构体,返回 StructEntry 或 None\n\n SHA1 非 None 时:精确匹配 name+sha1,未找到返回 None(不回退,避免跨模块同名找错)\n SHA1 为 None 时:回退到 find_struct(name) 按类名查找第一个\n ", "find_struct_by_type": "按类型指针查找结构体(is 比较),返回 StructEntry 或 None", "lookup_field": "按结构体类型和字段名查找字段信息\n\n 两遍查找策略(跨模块同名类冲突的根本修复):\n 第一遍: 类型指针 is 身份比较(最高优先级,类型唯一确定 entry)\n 第二遍: 名称回退(is 未匹配时,按类名/strstr 匹配,字段未找到时 continue)\n ", "lookup_field_by_class": "按类名和字段名查找字段信息\n\n 优先用 SHA1 匹配(跨模块同名类区分),无 SHA1 时按类名查找第一个\n ", "get_struct_type": "按类名获取结构体的 LLVM 类型", "get_field_by_index": "按类名和字段索引获取字段信息", "struct_has_defaults": "检查结构体是否有任何带默认值的字段,返回 1=有 / 0=无", "_is_struct_type": "检查 ty 是否是 Struct 类型(独立函数,规避嵌套 match 编译器 BUG)", "get_struct_type_from_value": "从 Value 的类型推断结构体类型", "mark_as_union": "标记已注册的结构体为联合体,返回 1=成功 / 0=失败", "is_union_by_name": "按类名检查是否为联合体,返回 1=是 / 0=否", "is_union_by_type": "按类型指针检查是否为联合体,返回 1=是 / 0=否\n\n 先尝试类型指针 == 比较,失败时回退到名称匹配\n ", "mark_as_oop": "标记已注册的结构体为 OOP,返回 1=成功 / 0=失败", "is_oop_by_name": "按类名检查是否为 OOP 结构体,返回 1=是 / 0=否", "mark_has_init": "标记结构体拥有 __init__ 方法,返回 1=成功 / 0=失败", "has_init_by_name": "按类名检查是否有 __init__ 方法,返回 1=有 / 0=无", "mark_has_new": "标记结构体拥有 __new__ 方法,返回 1=成功 / 0=失败", "has_new_by_name": "按类名检查是否有 __new__ 方法,返回 1=有 / 0=无", "get_class_name_by_type": "按类型指针查找类名,返回类名字符串或 None", "_extract_struct_name": "从 LLVMType 提取 Struct 变体的 Name 字段,返回 None 非 Struct", "mark_has_vtable": "标记结构体拥有虚表,返回 1=成功 / 0=失败", "has_vtable_by_name": "按类名检查是否有虚表,返回 1=有 / 0=无", "mark_novtable": "标记结构体为 NoVTable,返回 1=成功 / 0=失败", "is_novtable_by_name": "按类名检查是否为 NoVTable,返回 1=是 / 0=否", "set_parent_name": "设置结构体的父类名,返回 1=成功 / 0=失败", "get_parent_name": "获取结构体的父类名,返回 None=无父类", "set_vtable_methods": "设置虚表方法名数组,返回 1=成功 / 0=失败", "get_vtable_method_index": "获取方法在虚表中的索引,返回 -1=未找到", "get_vtable_method_count": "获取虚表方法数量", "get_vtable_method_name": "获取虚表中第 idx 个方法名,返回 None=越界", "get_field_count": "获取结构体字段数量,返回 -1=未找到", "get_field_name_ptr": "获取 FieldEntry 的字段名,返回 None=未设置", "get_field_type_ptr": "获取 FieldEntry 的字段类型,返回 None=未设置", "get_field_default_ptr": "获取 FieldEntry 的默认值 AST 节点,返回 None=无默认值", "get_field_annot_class_name": "获取 FieldEntry 的原始类型注解类名,返回 None=未设置"} \ No newline at end of file diff --git a/.transpyc_cache/9fdf7e28103d0ff0.pyi b/.transpyc_cache/9fdf7e28103d0ff0.pyi deleted file mode 100644 index b529a3b..0000000 --- a/.transpyc_cache/9fdf7e28103d0ff0.pyi +++ /dev/null @@ -1,139 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesStruct.py -Module: lib.core.Handles.HandlesStruct -""" - - -import t, c -from stdint import * -import memhub -import string -import llvmlite -import stdio -import ast -import hashtable - -STRUCT_MAX: t.CDefine = 512 -FIELD_MAX: t.CDefine = 32 -FIELD_NAME_MAX: t.CDefine = 64 - -@t.NoVTable -class FieldEntry: - Name: t.CChar | t.CPtr - Index: int - Ty: llvmlite.LLVMType | t.CPtr - DefaultVal: ast.AST | t.CPtr - AnnotClassName: t.CChar | t.CPtr -@t.NoVTable -class StructEntry: - Name: t.CChar | t.CPtr - Ty: llvmlite.LLVMType | t.CPtr - FieldCount: int - Fields: FieldEntry | t.CPtr - IsUnion: int - IsOOP: int - HasInit: int - HasNew: int - HasVTable: int - IsNoVTable: int - ParentName: t.CChar | t.CPtr - VTableMethodCount: int - VTableMethods: t.CChar | t.CPtr - ModuleSha1: t.CChar | t.CPtr - -_struct_table: t.CExtern | StructEntry | t.CPtr -_struct_count: t.CExtern | int -_visible_structs: t.CExtern | hashtable.HashTable | t.CPtr -_strict_visibility: t.CExtern | int - -def reset_visible_structs(pool: memhub.MemBuddy | t.CPtr, strict: int) -> t.CInt: pass - -def add_visible_struct(pool: memhub.MemBuddy | t.CPtr, name: str) -> t.CInt: pass - -def is_struct_visible(name: str) -> int: pass - -def init_struct_table(pool: memhub.MemBuddy | t.CPtr) -> int: pass - -def _get_struct_entry(i: int) -> StructEntry | t.CPtr: pass - -def _get_field_entry(struct_entry: StructEntry | t.CPtr, i: int) -> FieldEntry | t.CPtr: pass - -def register_struct(pool: memhub.MemBuddy | t.CPtr, name: str, struct_ty: llvmlite.LLVMType | t.CPtr, sha1: str) -> StructEntry | t.CPtr: pass - -def set_struct_sha1(pool: memhub.MemBuddy | t.CPtr, class_name: str, sha1: str) -> int: pass - -def get_struct_sha1(class_name: str) -> str: pass - -def add_field(pool: memhub.MemBuddy | t.CPtr, struct_entry: StructEntry | t.CPtr, field_name: str, field_ty: llvmlite.LLVMType | t.CPtr, default_val: ast.AST | t.CPtr, annot_class_name: str) -> int: pass - -def find_struct(name: str) -> StructEntry | t.CPtr: pass - -def find_struct_by_module(name: str, sha1: str) -> StructEntry | t.CPtr: pass - -def find_struct_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> StructEntry | t.CPtr: pass - -def lookup_field(struct_ty: llvmlite.LLVMType | t.CPtr, field_name: str) -> FieldEntry | t.CPtr: pass - -def lookup_field_by_class(class_name: str, field_name: str, sha1: str) -> FieldEntry | t.CPtr: pass - -def get_struct_type(class_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def get_field_by_index(class_name: str, idx: int) -> FieldEntry | t.CPtr: pass - -def struct_has_defaults(class_name: str) -> int: pass - -def _is_struct_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_struct_type_from_value(val: llvmlite.Value | t.CPtr) -> llvmlite.LLVMType | t.CPtr: pass - -def mark_as_union(name: str) -> int: pass - -def is_union_by_name(name: str) -> int: pass - -def is_union_by_type(struct_ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def mark_as_oop(name: str) -> int: pass - -def is_oop_by_name(name: str) -> int: pass - -def mark_has_init(name: str) -> int: pass - -def has_init_by_name(name: str) -> int: pass - -def mark_has_new(name: str) -> int: pass - -def has_new_by_name(name: str) -> int: pass - -def get_class_name_by_type(pool: memhub.MemBuddy | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr) -> str: pass - -def _extract_struct_name(ty: llvmlite.LLVMType | t.CPtr) -> str: pass - -def mark_has_vtable(name: str) -> int: pass - -def has_vtable_by_name(name: str) -> int: pass - -def mark_novtable(name: str) -> int: pass - -def is_novtable_by_name(name: str) -> int: pass - -def set_parent_name(name: str, parent_name: str) -> int: pass - -def get_parent_name(name: str) -> str: pass - -def set_vtable_methods(name: str, methods: t.CChar | t.CPtr, count: int) -> int: pass - -def get_vtable_method_index(name: str, method_name: str) -> int: pass - -def get_vtable_method_count(name: str) -> int: pass - -def get_vtable_method_name(name: str, idx: int) -> str: pass - -def get_field_count(name: str) -> int: pass - -def get_field_name_ptr(fe: FieldEntry | t.CPtr) -> str: pass - -def get_field_type_ptr(fe: FieldEntry | t.CPtr) -> llvmlite.LLVMType | t.CPtr: pass - -def get_field_default_ptr(fe: FieldEntry | t.CPtr) -> ast.AST | t.CPtr: pass - -def get_field_annot_class_name(fe: FieldEntry | t.CPtr) -> str: pass diff --git a/.transpyc_cache/a03139660029514f.doc.json b/.transpyc_cache/a03139660029514f.doc.json deleted file mode 100644 index 7aab3b8..0000000 --- a/.transpyc_cache/a03139660029514f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_cleanup": "清理可能残留的测试文件/目录"} \ No newline at end of file diff --git a/.transpyc_cache/a03139660029514f.pyi b/.transpyc_cache/a03139660029514f.pyi deleted file mode 100644 index 39bb90d..0000000 --- a/.transpyc_cache/a03139660029514f.pyi +++ /dev/null @@ -1,34 +0,0 @@ -""" -Auto-generated Python stub file from syslibtest_impl.py -Module: syslibtest_impl -""" - - -import t, c -from stdint import * -from t import CInt, CPtr, CUInt8T, CSizeT -import testcheck -import viperlib -import stdlib -import memhub -import platmacro -import os -import os.path -import os_backend -import shutil -import sys -import subprocess -import string -import w32.fileio -import w32.win32base -import w32.win32process - -TEST_DIR: t.CDefine = "__sylibtest_dir__" -TEST_FILE: t.CDefine = "__sylibtest_file.txt" -TEST_COPY: t.CDefine = "__sylibtest_copy.txt" -TEST_TREE: t.CDefine = "__sylibtest_tree__" -TEST_MOVE: t.CDefine = "__sylibtest_moved.txt" - -def _cleanup() -> t.CInt: pass - -def run() -> CInt: pass diff --git a/.transpyc_cache/a0612a85a12439a9.doc.json b/.transpyc_cache/a0612a85a12439a9.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/a0612a85a12439a9.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/a0612a85a12439a9.pyi b/.transpyc_cache/a0612a85a12439a9.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/a0612a85a12439a9.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/a0e0675172e4f01f.doc.json b/.transpyc_cache/a0e0675172e4f01f.doc.json deleted file mode 100644 index 5d5c7e9..0000000 --- a/.transpyc_cache/a0e0675172e4f01f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"extract_func_attrs": "从 decorator_list 提取 c.Attribute 属性,返回 LLVM IR 属性字符串", "_get_attr_name_from_node": "从 AST 节点提取属性名\n\n 支持:\n - Call(func=Attribute(...)): t.attr.always_inline() -> \"always_inline\"\n - Attribute: t.attr.packed -> \"packed\"\n - Attribute(t.attr.llvm.xxx): t.attr.llvm.nounwind -> \"nounwind\"\n ", "_append_llvm_attr": "将属性名映射到 LLVM 属性名并追加到缓冲区\n\n 返回 1 表示已追加,0 表示不支持该属性\n ", "_append_str": "将字符串追加到 buf 末尾(用 strlen+strcpy 模拟 strcat)", "_mangle_name": "为任意名称添加 SHA1 前缀(不做 main/export 检查)", "_mangle_name_with_sha1": "用指定 SHA1 为名称添加前缀(不做 main/export 检查)", "_mangle_func_name": "为函数名添加 SHA1 前缀(检查 main/export)", "translate_function_def": "翻译函数定义,返回新增的变量数(通常为 0,函数定义不增加当前作用域变量)", "translate_nested_function_def": "翻译嵌套函数定义:提升为顶层函数 + 创建闭包", "create_function": "创建 LLVM 函数并添加参数"} \ No newline at end of file diff --git a/.transpyc_cache/a0e0675172e4f01f.pyi b/.transpyc_cache/a0e0675172e4f01f.pyi deleted file mode 100644 index d7a865c..0000000 --- a/.transpyc_cache/a0e0675172e4f01f.pyi +++ /dev/null @@ -1,43 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesFunctions.py -Module: lib.core.Handles.HandlesFunctions -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import viperlib -import stdio -import stdlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesBody as HandlesBody -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesImports as HandlesImports - -def extract_func_attrs(pool: memhub.MemBuddy | t.CPtr, decorator_list: list[ast.AST | t.CPtr] | t.CPtr, imported_modules: str) -> t.CChar | t.CPtr: pass - -def _get_attr_name_from_node(node: ast.AST | t.CPtr) -> str: pass - -def _append_llvm_attr(attrs_buf: t.CChar | t.CPtr, attr_name: str) -> int: pass - -def _append_str(buf: t.CChar | t.CPtr, s: str) -> None: pass - -def _mangle_name(trans: HT.Translator | t.CPtr, name: str) -> str: pass - -def _mangle_name_with_sha1(sha1: str, name: str) -> str: pass - -def _mangle_func_name(trans: HT.Translator | t.CPtr, name: str, has_export: int) -> str: pass - -def translate_function_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_nested_function_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def create_function(pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, name: str, args_node: ast.AST | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Function | t.CPtr: pass diff --git a/.transpyc_cache/a30bd51aa00f0bef.doc.json b/.transpyc_cache/a30bd51aa00f0bef.doc.json deleted file mode 100644 index d24160b..0000000 --- a/.transpyc_cache/a30bd51aa00f0bef.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"Translator": "翻译器:管理编译状态,委托 Handles 模块执行翻译", "Translator._init_state": "初始化变量表、函数表和子 Handle", "Translator.translate": "将 AST 翻译为 LLVM IR", "Translator._translate_wrapper_main": "委托 HandlesMain.create_wrapper_main() 创建包装 main(trans 单参)", "Translator._translate_module_level": "委托 HandlesMain.translate_children() 翻译模块级语句(trans 单参)", "Translator.dump_ir": "将 LLVM IR 输出到缓冲区\n\n mode: 0=完整, 1=stub(仅声明), 2=text(仅代码)\n ", "add_global_name": "添加一个 global 变量名", "is_global_name": "检查 name 是否在当前函数的 global 集合中", "add_nonlocal_name": "添加一个 nonlocal 变量名", "is_nonlocal_name": "检查 name 是否在当前函数的 nonlocal 集合中", "get_nonlocal_index": "获取 nonlocal 变量在 env 中的索引(0-based),找不到返回 -1", "clear_scope_names": "清空当前函数的 global/nonlocal 名称集合(进入新函数时调用)"} \ No newline at end of file diff --git a/.transpyc_cache/a30bd51aa00f0bef.pyi b/.transpyc_cache/a30bd51aa00f0bef.pyi deleted file mode 100644 index 0e885bf..0000000 --- a/.transpyc_cache/a30bd51aa00f0bef.pyi +++ /dev/null @@ -1,89 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesTranslator.py -Module: lib.core.Handles.HandlesTranslator -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesMain as HandlesMain -import lib.core.Handles.HandlesAssign as HandlesAssign -import lib.core.Handles.HandlesReturn as HandlesReturn -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesAnnAssign as HandlesAnnAssign -import lib.core.Handles.HandlesAugAssign as HandlesAugAssign -import lib.core.Handles.HandlesIf as HandlesIf -import lib.core.Handles.HandlesWhile as HandlesWhile -import lib.core.Handles.HandlesFor as HandlesFor -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesFunctions as HandlesFunctions -import lib.Projectrans.Config as Config - -MAX_VARS: t.CDefine = 256 -MAX_FUNCS: t.CDefine = 256 -MAX_GLOBAL_NAMES: t.CDefine = 32 - -@t.NoVTable -class Translator: - Module: llvmlite.LLVMModule | t.CPtr - Pool: memhub.MemBuddy | t.CPtr - _funcs: HandlesExprCall.FuncEntry | t.CPtr - _func_count: t.CInt - _imported_modules: str - _from_imports: str - _cur_func: llvmlite.Function | t.CPtr - _cur_builder: llvmlite.IRBuilder | t.CPtr - _break_bb: llvmlite.BasicBlock | t.CPtr - _continue_bb: llvmlite.BasicBlock | t.CPtr - _label_counter: t.CInt - _global_names: str - _global_name_count: t.CInt - _nonlocal_names: str - _nonlocal_name_count: t.CInt - _cur_func_name: str - ModuleSha1: str - _closure_env_offsets: t.CInt - _closure_env_count: t.CInt - GenericTypeParamNames: list[str] | t.CPtr - GenericTypeArgs: list[str] | t.CPtr - _declare_only: t.CInt - AssignH: HandlesAssign.AssignHandle | t.CPtr - ReturnH: HandlesReturn.ReturnHandle | t.CPtr - ImportsH: HandlesImports.ImportsHandle | t.CPtr - AnnAssignH: HandlesAnnAssign.AnnAssignHandle | t.CPtr - AugAssignH: HandlesAugAssign.AugAssignHandle | t.CPtr - IfH: HandlesIf.IfHandle | t.CPtr - WhileH: HandlesWhile.WhileHandle | t.CPtr - ForH: HandlesFor.ForHandle | t.CPtr - ExprH: HandlesExpr.ExprHandle | t.CPtr - ExprCallH: HandlesExprCall.ExprCallHandle | t.CPtr - SymTab: HandlesVar.SymbolTable | t.CPtr - def __init__(self: Translator) -> t.CInt: pass - def _init_state(self: Translator, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - def translate(self: Translator, tree: ast.AST | t.CPtr) -> int: pass - def _translate_wrapper_main(self: Translator, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, tree: ast.AST | t.CPtr, i32_ty: llvmlite.LLVMType | t.CPtr) -> t.CInt: pass - def _translate_module_level(self: Translator, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, tree: ast.AST | t.CPtr) -> t.CInt: pass - def dump_ir(self: Translator, buf: bytes, size: t.CSizeT, mode: int) -> t.CInt: pass - -def add_global_name(trans: HT.Translator | t.CPtr, name: str) -> t.CInt: pass - -def is_global_name(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def add_nonlocal_name(trans: HT.Translator | t.CPtr, name: str) -> t.CInt: pass - -def is_nonlocal_name(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def get_nonlocal_index(trans: HT.Translator | t.CPtr, name: str) -> int: pass - -def clear_scope_names(trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr \ No newline at end of file diff --git a/.transpyc_cache/a47313ed1481da7d.doc.json b/.transpyc_cache/a47313ed1481da7d.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/a47313ed1481da7d.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/a47313ed1481da7d.pyi b/.transpyc_cache/a47313ed1481da7d.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/a47313ed1481da7d.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/a5407d80d9f015ed.doc.json b/.transpyc_cache/a5407d80d9f015ed.doc.json deleted file mode 100644 index c3a1e25..0000000 --- a/.transpyc_cache/a5407d80d9f015ed.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"SrcFileEntry": "源文件条目", "RunMultiFileProject": "多文件项目编译\n\n Returns: 0 成功,非 0 失败\n "} \ No newline at end of file diff --git a/.transpyc_cache/a5407d80d9f015ed.pyi b/.transpyc_cache/a5407d80d9f015ed.pyi deleted file mode 100644 index ad12e1f..0000000 --- a/.transpyc_cache/a5407d80d9f015ed.pyi +++ /dev/null @@ -1,39 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Phase2.py -Module: lib.core.Phase2 -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import viperlib -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import sys -import ast -import llvmlite -import subprocess -import argparse -import lib.core.VLogger as VLogger -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.BuildPipeline as BuildPipeline -import lib.core.StubMerger as StubMerger -import lib.Projectrans.Utils as Utils -import lib.Projectrans.Config as Config - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 -MAX_SRC_FILES: t.CDefine = 32 - -@t.NoVTable -class SrcFileEntry: - Path: str - Sha1: str - -def RunMultiFileProject(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, output_dir: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str, includes_dir: str, do_phase1: int, do_phase2: int, log: VLogger.Logger | t.CPtr, args: argparse.ParsedArgs | t.CPtr) -> int: pass diff --git a/.transpyc_cache/a68b70f233541a7f.pyi b/.transpyc_cache/a68b70f233541a7f.pyi deleted file mode 100644 index 3cb3a02..0000000 --- a/.transpyc_cache/a68b70f233541a7f.pyi +++ /dev/null @@ -1,44 +0,0 @@ -""" -Auto-generated Python stub file from os._win32.py -Module: os._win32 -""" - - -import t, c -from stdint import * -import w32.win32base -import w32.win32file -import memhub -import stdlib - -MAX_PATH_LEN: t.CDefine = 260 -INVALID_FILE_ATTRIBUTES: t.CDefine = 0xFFFFFFFF -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr - -def _get_attrs(path: str) -> ULONG: pass - -def exists(path: str) -> bool: pass - -def isdir(path: str) -> bool: pass - -def isfile(path: str) -> bool: pass - -def getsize(path: str) -> t.CInt64T: pass - -def getcwd() -> str: pass - -def chdir(path: str) -> int: pass - -def mkdir(path: str) -> int: pass - -def remove(path: str) -> int: pass - -def rmdir(path: str) -> int: pass - -def rename(old_path: str, new_path: str) -> int: pass - -def chmod(path: str, mode: int) -> int: pass - -def listdir(path: str, out_names: str, max_count: ULONG) -> ULONG: pass - -def system(cmd: str) -> int: pass diff --git a/.transpyc_cache/a6972611852b8a4e.doc.json b/.transpyc_cache/a6972611852b8a4e.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/a6972611852b8a4e.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/a6972611852b8a4e.pyi b/.transpyc_cache/a6972611852b8a4e.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/a6972611852b8a4e.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/a6a3e195cd7dd0b4.doc.json b/.transpyc_cache/a6a3e195cd7dd0b4.doc.json deleted file mode 100644 index 56e8c7e..0000000 --- a/.transpyc_cache/a6a3e195cd7dd0b4.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"RunPhase1": "Phase1: 扫描 includes 目录,按需翻译并生成 stub"} \ No newline at end of file diff --git a/.transpyc_cache/a6a3e195cd7dd0b4.pyi b/.transpyc_cache/a6a3e195cd7dd0b4.pyi deleted file mode 100644 index d866b3e..0000000 --- a/.transpyc_cache/a6a3e195cd7dd0b4.pyi +++ /dev/null @@ -1,31 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Phase1.py -Module: lib.core.Phase1 -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import viperlib -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import ast -import llvmlite -import lib.core.VLogger as VLogger -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.IncludesScanner as IncludesScanner -import lib.core.StubMerger as StubMerger -import lib.Projectrans.Config as Config - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 - -def RunPhase1(mb: memhub.MemBuddy | t.CPtr, includes_dir: str, temp_dir: str, log: VLogger.Logger | t.CPtr) -> int: pass diff --git a/.transpyc_cache/a711c9c66fd7c6ca.doc.json b/.transpyc_cache/a711c9c66fd7c6ca.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/a711c9c66fd7c6ca.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/a711c9c66fd7c6ca.pyi b/.transpyc_cache/a711c9c66fd7c6ca.pyi deleted file mode 100644 index 213e2c8..0000000 --- a/.transpyc_cache/a711c9c66fd7c6ca.pyi +++ /dev/null @@ -1,20 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import w32.win32console -import t, c -from t import CInt, CExport -import stdio -import stdlib -import string -import testcheck - -def bump_true(buf: bytes) -> bool: pass - -def bump_false(buf: bytes) -> bool: pass - -def main() -> CInt | CExport: pass diff --git a/.transpyc_cache/a7cf0ce4066332ae.doc.json b/.transpyc_cache/a7cf0ce4066332ae.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/a7cf0ce4066332ae.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/a7cf0ce4066332ae.pyi b/.transpyc_cache/a7cf0ce4066332ae.pyi deleted file mode 100644 index 3042835..0000000 --- a/.transpyc_cache/a7cf0ce4066332ae.pyi +++ /dev/null @@ -1,44 +0,0 @@ -""" -Auto-generated Python stub file from opovl_test.py -Module: opovl_test -""" - - -import stdio -import stdlib -import t, c -import testcheck - -class Counter: - val: t.CInt - def __init__(self: Counter, v: t.CInt) -> t.CInt: pass - def __add__(self: Counter, n: t.CInt) -> t.CInt: pass - def __sub__(self: Counter, n: t.CInt) -> t.CInt: pass - def __mul__(self: Counter, n: t.CInt) -> t.CInt: pass - def __div__(self: Counter, n: t.CInt) -> t.CInt: pass - def __mod__(self: Counter, n: t.CInt) -> t.CInt: pass - def __eq__(self: Counter, n: t.CInt) -> t.CInt: pass - def __ne__(self: Counter, n: t.CInt) -> t.CInt: pass - def __lt__(self: Counter, n: t.CInt) -> t.CInt: pass - def __le__(self: Counter, n: t.CInt) -> t.CInt: pass - def __gt__(self: Counter, n: t.CInt) -> t.CInt: pass - def __ge__(self: Counter, n: t.CInt) -> t.CInt: pass -class BitBox: - flags: t.CInt - def __init__(self: BitBox, v: t.CInt) -> t.CInt: pass - def __and__(self: BitBox, mask: t.CInt) -> t.CInt: pass - def __or__(self: BitBox, mask: t.CInt) -> t.CInt: pass - def __xor__(self: BitBox, mask: t.CInt) -> t.CInt: pass - def __lshift__(self: BitBox, n: t.CInt) -> t.CInt: pass - def __rshift__(self: BitBox, n: t.CInt) -> t.CInt: pass -class Vec2: - x: t.CInt - y: t.CInt - def __new__(self: Vec2, x0: t.CInt, y0: t.CInt) -> t.CInt: pass - def __init__(self: Vec2, x0: t.CInt, y0: t.CInt) -> t.CInt: pass - def __add__(self: Vec2, other: Vec2 | t.CPtr) -> Vec2 | t.CPtr: pass - def __sub__(self: Vec2, other: Vec2 | t.CPtr) -> Vec2 | t.CPtr: pass - def __eq__(self: Vec2, other: Vec2 | t.CPtr) -> t.CInt: pass - def __ne__(self: Vec2, other: Vec2 | t.CPtr) -> t.CInt: pass - -def opovl_test() -> int: pass diff --git a/.transpyc_cache/a9ad5e41081c9377.doc.json b/.transpyc_cache/a9ad5e41081c9377.doc.json deleted file mode 100644 index 47b20d9..0000000 --- a/.transpyc_cache/a9ad5e41081c9377.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_get_external_func_param_ty": "获取外部函数第 param_idx 个参数的期望类型,None 表示用字面量原类型\n\n 对 Win32 API 函数的所有非指针参数返回 i64,匹配 declare 中\n ULONG/SIZE_T 被统一翻译为 i64 的情况。\n ", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/a9ad5e41081c9377.pyi b/.transpyc_cache/a9ad5e41081c9377.pyi deleted file mode 100644 index 5214419..0000000 --- a/.transpyc_cache/a9ad5e41081c9377.pyi +++ /dev/null @@ -1,173 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _get_external_func_param_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str, param_idx: int) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/a9b97a11bf30daa0.doc.json b/.transpyc_cache/a9b97a11bf30daa0.doc.json deleted file mode 100644 index 67e7a8b..0000000 --- a/.transpyc_cache/a9b97a11bf30daa0.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_DiagAppend": "追加诊断信息到 diag.txt(追加模式,不依赖 printf 缓冲)", "TranslateFileGetTrans": "翻译文件,返回 Translator 对象(调用者负责 dump_ir),None 失败", "ensure_dir": "递归创建目录(类似 mkdir -p),目录已存在视为成功\n\n Args:\n path: 目录路径(支持 / 或 \\ 分隔符)\n\n Returns:\n 0 成功(包括目录已存在),非 0 失败\n ", "write_ir_to_file": "将 IR 缓冲区写入 .ll 文件\n\n Args:\n ir_buf: IR 文本缓冲区\n ir_len: IR 文本长度\n output_dir: 输出目录(temp 或 output)\n module_name: 模块名(如 \"main\")\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_ll_to_obj": "调用 llc 将 .ll 编译为 .obj\n\n Args:\n ir_path: .ll 文件路径\n output_dir: 输出目录\n module_name: 模块名(用于生成 .obj 文件名)\n cc_cmd: 编译器命令(如 \"llc\")\n cc_flags: 编译器参数(如 \"-filetype=obj -relocation-model=pic\")\n\n Returns:\n 0 成功,非 0 失败\n ", "collect_obj_files": "扫描 includes_binary_dir 目录,收集所有 .obj 文件路径到 out_buf\n\n Args:\n includes_binary_dir: includes.binary 目录路径\n out_buf: 输出缓冲区(用于存放空格分隔的 .obj 文件路径)\n out_size: 输出缓冲区大小\n\n Returns:\n 写入的字节数(不含 null 终止符),0 表示无文件或错误\n ", "link_obj_to_exe": "调用 clang++ 链接 .obj 为 .exe\n\n Args:\n output_dir: 输出目录(包含 .obj 文件)\n module_name: 模块名\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件名(如 \"test.exe\")\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_module_to_obj": "编译 IR 到 .obj(不链接)\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名(SHA1)\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n\n Returns:\n 0 成功,非 0 失败\n ", "link_objs_to_exe": "链接多个 .obj 文件为 .exe\n\n Args:\n obj_paths: 空格分隔的 .obj 文件完整路径字符串\n obj_paths_len: obj_paths 长度\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件完整路径\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "run_pipeline": "执行完整编译管线\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n linker_cmd: 链接器命令\n linker_flags: 链接器参数\n linker_output: 输出文件名\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n BuildResult 对象\n "} \ No newline at end of file diff --git a/.transpyc_cache/a9b97a11bf30daa0.pyi b/.transpyc_cache/a9b97a11bf30daa0.pyi deleted file mode 100644 index 9d8b33e..0000000 --- a/.transpyc_cache/a9b97a11bf30daa0.pyi +++ /dev/null @@ -1,52 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.BuildPipeline.py -Module: lib.core.BuildPipeline -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import subprocess -import viperlib -import ast -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesType as HandlesType - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 - -def _DiagAppend(msg: bytes) -> t.CInt: pass - -def TranslateFileGetTrans(mb: memhub.MemBuddy | t.CPtr, file_path: str, sha1_val: str) -> HandlesTranslator.Translator | t.CPtr: pass - - -class BuildResult: - Success: t.CInt - OutputPath: str - ErrorMsg: str - def __new__(self: BuildResult) -> t.CPtr: pass - def __init__(self: BuildResult) -> t.CInt: pass - -def ensure_dir(path: str) -> int: pass - -def write_ir_to_file(ir_buf: bytes, ir_len: t.CSizeT, output_dir: str, module_name: str) -> int: pass - -def compile_ll_to_obj(ir_path: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def collect_obj_files(includes_binary_dir: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass - -def link_obj_to_exe(output_dir: str, module_name: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def compile_module_to_obj(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def link_objs_to_exe(obj_paths: str, obj_paths_len: t.CSizeT, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def run_pipeline(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> BuildResult | t.CPtr: pass diff --git a/.transpyc_cache/a9df037d9178888f.doc.json b/.transpyc_cache/a9df037d9178888f.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/a9df037d9178888f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/a9df037d9178888f.pyi b/.transpyc_cache/a9df037d9178888f.pyi deleted file mode 100644 index 4b413d7..0000000 --- a/.transpyc_cache/a9df037d9178888f.pyi +++ /dev/null @@ -1,31 +0,0 @@ -""" -Auto-generated Python stub file from func_vtable_test.py -Module: func_vtable_test -""" - - -import stdio -import t, c - -@t.NoVTable -class NoVTableClass: - val: t.CInt - def __init__(self: NoVTableClass, v: t.CInt) -> t.CInt: pass - @t.CVTable - def VirtualMethod(self: NoVTableClass) -> t.CInt: pass - def NormalMethod(self: NoVTableClass) -> t.CInt: pass -@t.CVTable -class CVTableClass: - val: t.CInt - def __init__(self: CVTableClass, v: t.CInt) -> t.CInt: pass - def KeptMethod(self: CVTableClass) -> t.CInt: pass - @t.NoVTable - def ExcludedMethod(self: CVTableClass) -> t.CInt: pass -class DefaultClass: - val: t.CInt - def __init__(self: DefaultClass, v: t.CInt) -> t.CInt: pass - @t.CVTable - def VirtualMethod(self: DefaultClass) -> t.CInt: pass - def NormalMethod(self: DefaultClass) -> t.CInt: pass - -def func_vtable_test() -> int: pass diff --git a/.transpyc_cache/aba439b7882ad9d6.pyi b/.transpyc_cache/aba439b7882ad9d6.pyi deleted file mode 100644 index 124ce31..0000000 --- a/.transpyc_cache/aba439b7882ad9d6.pyi +++ /dev/null @@ -1,67 +0,0 @@ -""" -Auto-generated Python stub file from argparse.py -Module: argparse -""" - - -import t, c -from stdint import * -import string -import memhub -import stdio -import hashtable - -STRING: t.CDefine = 0 -INT: t.CDefine = 1 -BOOL: t.CDefine = 2 -STORE: t.CDefine = 0 -STORE_TRUE: t.CDefine = 1 -STORE_FALSE: t.CDefine = 2 -COUNT: t.CDefine = 3 -MAX_ARGS: t.CDefine = 32 -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr - -class Argument: - name: str - short_name: str - help_text: str - arg_type: INT - action: INT - default_int: INT - default_str: str - required: bool - is_positional: bool - dest: str -class ParsedArgs: - _ht: hashtable.HashTable | t.CPtr - __mbuddy__: memhub.MemBuddy | t.CPtr - def __new__(self: ParsedArgs, mb: memhub.MemBuddy | t.CPtr) -> t.CPtr: pass - def __init__(self: ParsedArgs, mb: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - def get_str(self: ParsedArgs, name: str) -> str: pass - def get_int(self: ParsedArgs, name: str) -> INT: pass - def get_bool(self: ParsedArgs, name: str) -> INT: pass - def has(self: ParsedArgs, name: str) -> bool: pass - def _set_str(self: ParsedArgs, name: str, val: str) -> t.CInt: pass - def _set_int(self: ParsedArgs, name: str, val: INT) -> t.CInt: pass - def _set_bool(self: ParsedArgs, name: str, val: bool) -> t.CInt: pass -class ArgumentParser: - _prog: str - _description: str - _args: Argument | t.CPtr - _arg_count: INT - __mbuddy__: memhub.MemBuddy | t.CPtr - def __new__(self: ArgumentParser, prog: str, description: str, pool: memhub.MemBuddy | t.CPtr) -> t.CPtr: pass - def __init__(self: ArgumentParser, prog: str, description: str, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - def add_argument(self: ArgumentParser, name: str, short: str, arg_type: INT, default: INT, default_str: str, required: bool, action: INT, help: str) -> t.CInt: pass - def _get_arg(self: ArgumentParser, idx: INT) -> Argument | t.CPtr: pass - def _find_long(self: ArgumentParser, token: str) -> INT: pass - def _find_long_prefix(self: ArgumentParser, token: str) -> INT: pass - def _find_short(self: ArgumentParser, token: str) -> INT: pass - def _find_positional(self: ArgumentParser, pos_idx: INT) -> INT: pass - def _store_value(self: ArgumentParser, args: ParsedArgs | t.CPtr, arg: Argument | t.CPtr, value: str) -> t.CInt: pass - def _apply_action(self: ArgumentParser, args: ParsedArgs | t.CPtr, arg: Argument | t.CPtr) -> t.CInt: pass - def parse_args(self: ArgumentParser, argc: INT, argv: str | t.CPtr) -> ParsedArgs | t.CPtr: pass - def print_help(self: ArgumentParser) -> t.CInt: pass - def print_usage(self: ArgumentParser) -> t.CInt: pass - -def release(args: ParsedArgs | t.CPtr) -> t.CInt: pass diff --git a/.transpyc_cache/abbcbd92436cc16a.pyi b/.transpyc_cache/abbcbd92436cc16a.pyi deleted file mode 100644 index 9a57653..0000000 --- a/.transpyc_cache/abbcbd92436cc16a.pyi +++ /dev/null @@ -1,41 +0,0 @@ -""" -Auto-generated Python stub file from shutil.py -Module: shutil -""" - - -import t, c -from stdint import * -import platmacro -import memhub -import string -import w32.win32base -import w32.win32file -import posix - -COPY_BUF_SIZE: t.CDefine = 65536 -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr - -def copyfile(src: str, dst: str) -> int: pass - -def _copyfile_win32(src: str, dst: str) -> int: pass - -def _copyfile_posix(src: str, dst: str) -> int: pass - -def copy(src: str, dst: str) -> int: pass - -def _copy_win32(src: str, dst: str) -> int: pass - -def _copy_posix(src: str, dst: str) -> int: pass - -def rmtree(path: str) -> int: pass - -def _rmtree_win32(path: str) -> int: pass - -def _rmtree_posix(path: str) -> int: pass - -def move(src: str, dst: str) -> int: pass - -def _move_win32(src: str, dst: str) -> int: pass - -def _move_posix(src: str, dst: str) -> int: pass diff --git a/.transpyc_cache/ac0d686cb2cc783b.doc.json b/.transpyc_cache/ac0d686cb2cc783b.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/ac0d686cb2cc783b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/ac0d686cb2cc783b.pyi b/.transpyc_cache/ac0d686cb2cc783b.pyi deleted file mode 100644 index 7b2670f..0000000 --- a/.transpyc_cache/ac0d686cb2cc783b.pyi +++ /dev/null @@ -1,73 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - -import c - - -import t -import t as tt -import stdio -import testcheck -from t import CEnum as en -from t import CUnion as un -from t import REnum as ren -from t import CStruct as cs -from t import CInt as myint -from t import CChar, CPtr - -class Color(en): - Red = 0 - Green = 1 - Blue = 2 -class Status(tt.CEnum): - Ok = 0 - Error = 1 -class Data(un): - i_val: t.CInt - f_val: t.CFloat -class Opt(ren): - class Some: - val: myint - None_ = 0 -class Parent: - a: t.CInt - def get_a(self: Parent) -> t.CInt: pass -class Child(Parent): - b: t.CInt - def get_sum(self: Child) -> t.CInt: pass -class Base: - x: t.CInt - def base_val(self: Base) -> t.CInt: pass -class Mid(Base): - y: t.CInt - def mid_val(self: Mid) -> t.CInt: pass -class Leaf(Mid): - z: t.CInt - def leaf_val(self: Leaf) -> t.CInt: pass - -val: t.CExtern | myint - -class NetHeader: - magic: t.CInt | t.BigEndian - length: t.CShort | t.BigEndian - normal: t.CInt -class TtPoint(tt.CStruct): - x: t.CInt - y: t.CInt -@tt.Object -class TtObject: - val: t.CInt - def get_val(self: TtObject) -> t.CInt: pass -class CsPoint(cs): - x: t.CInt - y: t.CInt -class TtUnion(tt.CUnion): - a: t.CInt - b: t.CFloat -@tt.Object -class TtEmptyObject: - val: t.CInt - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/aca085940d1ca494.doc.json b/.transpyc_cache/aca085940d1ca494.doc.json deleted file mode 100644 index 47b20d9..0000000 --- a/.transpyc_cache/aca085940d1ca494.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_get_external_func_param_ty": "获取外部函数第 param_idx 个参数的期望类型,None 表示用字面量原类型\n\n 对 Win32 API 函数的所有非指针参数返回 i64,匹配 declare 中\n ULONG/SIZE_T 被统一翻译为 i64 的情况。\n ", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/aca085940d1ca494.pyi b/.transpyc_cache/aca085940d1ca494.pyi deleted file mode 100644 index 5214419..0000000 --- a/.transpyc_cache/aca085940d1ca494.pyi +++ /dev/null @@ -1,173 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _get_external_func_param_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str, param_idx: int) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/ae0cc890f657076d.doc.json b/.transpyc_cache/ae0cc890f657076d.doc.json deleted file mode 100644 index 0d6dd61..0000000 --- a/.transpyc_cache/ae0cc890f657076d.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"get_func_name": "从函数节点提取函数名", "escape_llvm_string": "将字符串转换为 LLVM IR 字符串字面量 c\"...\\00\" ", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "get_llvm_float_bits": "获取 LLVM 浮点类型的位宽,非浮点类型返回 0", "is_ptr_type": "检查 ty 是否是 Ptr 类型,返回 1=是, 0=否", "_deref_if_ptr_ptr": "如果 obj_ptr 是 Ptr(Ptr(...)),load 解引用获取内层指针", "coerce_to_type": "将 val 强制转换为 target_ty\n\n 整数: sext(扩展)/ trunc(截断)\n 浮点: fpext(扩展)/ fptrunc(截断)\n int→float: sitofp\n float→int: fptosi\n ", "create_global_string": "创建全局字符串常量并返回 i8* bitcast", "translate_constant": "翻译常量(int/str/bool)", "_infer_elem_type_from_value": "从 LLVM Value 的类型推断 list 元素类型名", "_find_pool_var": "查找上下文中的 pool 变量,返回 alloca 或 None", "translate_list_literal": "翻译 list 字面量 [a, b, c] → list[T](pool) + append 序列", "translate_value": "翻译值表达式为 LLVM Value", "translate_compare": "翻译比较表达式,返回 i1 结果", "translate_unaryop": "翻译一元运算(-x, +x, not x, ~x)", "translate_boolop": "翻译布尔运算(and/or)的短路求值,返回 i1", "translate_name_value": "翻译变量引用(Name 节点)→ load", "ExprHandle": "表达式处理器:继承 Mixin 获得 Trans 回指针", "ExprHandle.HandleValue": "翻译值表达式,从 self.Trans 获取共享状态", "list_getitem_inline": "内联生成 list __getitem__ 逻辑,返回元素地址 (i8*)", "_list_elem_type_from_name": "从 list 类型名提取元素 LLVM 类型", "list_setitem_inline": "内联生成 list __setitem__ 逻辑,返回 0", "is_list_subscript": "检查 Subscript 节点是否是 list[T] 类型,返回 list 对象指针或 None", "translate_subscript": "翻译下标表达式,返回加载的元素值", "find_global_in_module": "在模块全局变量链表中按名称查找全局变量", "make_global_ref": "创建全局变量引用 (类型为 ty*,名称为 @name)", "_resolve_module_attribute_global": "解析模块属性访问,返回全局变量引用 (用于跨模块 global 访问)", "translate_attribute": "翻译属性访问,返回加载的字段值", "get_subscript_ptr": "获取下标表达式的元素指针(用于赋值 lhs)", "get_attribute_ptr": "获取属性访问的字段指针(用于赋值 lhs)"} \ No newline at end of file diff --git a/.transpyc_cache/ae0cc890f657076d.pyi b/.transpyc_cache/ae0cc890f657076d.pyi deleted file mode 100644 index 2cb20be..0000000 --- a/.transpyc_cache/ae0cc890f657076d.pyi +++ /dev/null @@ -1,88 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExpr.py -Module: lib.core.Handles.HandlesExpr -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import llvmlite -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprOps as HandlesExprOps -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum -import lib.core.Handles.HandlesClassDef as HandlesClassDef -import lib.core.Handles.HandlesImports as HandlesImports - -def get_func_name(func_node: ast.AST | t.CPtr) -> str: pass - -def escape_llvm_string(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_llvm_float_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def is_ptr_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _deref_if_ptr_ptr(builder: llvmlite.IRBuilder | t.CPtr, obj_ptr: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def coerce_to_type(builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def create_global_string(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, str_val: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_constant(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_elem_type_from_value(pool: memhub.MemBuddy | t.CPtr, value: llvmlite.Value | t.CPtr) -> str: pass - -def _find_pool_var(trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_list_literal(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, elem_type_name: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_compare(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_unaryop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_boolop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_name_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -@t.NoVTable -class ExprHandle(HandlesBase.Mixin): - def __init__(self: ExprHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleValue(self: ExprHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def NewExprHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprHandle | t.CPtr: pass - -def list_getitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _list_elem_type_from_name(pool: memhub.MemBuddy | t.CPtr, struct_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def list_setitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr, rhs_val: llvmlite.Value | t.CPtr) -> int: pass - -def is_list_subscript(node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_subscript(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def find_global_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.GlobalVariable | t.CPtr: pass - -def make_global_ref(pool: memhub.MemBuddy | t.CPtr, name: str, ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _resolve_module_attribute_global(pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, trans: HT.Translator | t.CPtr, at: ast.Attribute | t.CPtr, ty_hint: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_attribute(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_subscript_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_attribute_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/ae1e8a6903834d9c.doc.json b/.transpyc_cache/ae1e8a6903834d9c.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/ae1e8a6903834d9c.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/ae1e8a6903834d9c.pyi b/.transpyc_cache/ae1e8a6903834d9c.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/ae1e8a6903834d9c.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/aeb670958072076e.pyi b/.transpyc_cache/aeb670958072076e.pyi deleted file mode 100644 index a953d5c..0000000 --- a/.transpyc_cache/aeb670958072076e.pyi +++ /dev/null @@ -1,33 +0,0 @@ -""" -Auto-generated Python stub file from ast.visitor.py -Module: ast.visitor -""" - - -import t, c -from stdint import * -import memhub -import string -from .base import AST, ASTKind - -@t.CVTable -class ASTVisitor: - pool: memhub.MemManager | t.CPtr - def __new__(self: ASTVisitor, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - def __init__(self: ASTVisitor, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - def visit(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_Module(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_FunctionDef(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_Assign(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_If(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_For(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_While(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_Return(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_Expr(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_Name(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_Constant(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_BinOp(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_UnaryOp(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_Call(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_Compare(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass - def visit_generic(self: ASTVisitor, node: AST | t.CPtr) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/aeb8034bdb2b370b.doc.json b/.transpyc_cache/aeb8034bdb2b370b.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/aeb8034bdb2b370b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/aeb8034bdb2b370b.pyi b/.transpyc_cache/aeb8034bdb2b370b.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/aeb8034bdb2b370b.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/af9484a65085bf4b.doc.json b/.transpyc_cache/af9484a65085bf4b.doc.json deleted file mode 100644 index 2fbc2fa..0000000 --- a/.transpyc_cache/af9484a65085bf4b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"get_env_ptr_var": "获取或创建 _env_ptr 变量(存储闭包 env 指针)", "load_nonlocal_var": "从闭包 env 加载 nonlocal 变量值(env 直接存储 i32 值)", "get_nonlocal_var_ptr": "获取 nonlocal 变量在 env 中的地址(i32*),用于 store 操作"} \ No newline at end of file diff --git a/.transpyc_cache/af9484a65085bf4b.pyi b/.transpyc_cache/af9484a65085bf4b.pyi deleted file mode 100644 index 3d49af5..0000000 --- a/.transpyc_cache/af9484a65085bf4b.pyi +++ /dev/null @@ -1,21 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesNonlocal.py -Module: lib.core.Handles.HandlesNonlocal -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar - -def get_env_ptr_var(trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def load_nonlocal_var(trans: HT.Translator | t.CPtr, name: str) -> llvmlite.Value | t.CPtr: pass - -def get_nonlocal_var_ptr(trans: HT.Translator | t.CPtr, name: str) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/b1122357fee8fd68.doc.json b/.transpyc_cache/b1122357fee8fd68.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/b1122357fee8fd68.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/b1122357fee8fd68.pyi b/.transpyc_cache/b1122357fee8fd68.pyi deleted file mode 100644 index 97850c4..0000000 --- a/.transpyc_cache/b1122357fee8fd68.pyi +++ /dev/null @@ -1,36 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - -import c - - -import t -from stdio import printf -import testcheck - -@t.CStruct -class Point: - x: t.CInt - y: t.CInt -@t.CEnum -class Color: - RED = 1 - GREEN = 2 - BLUE = 3 -@t.CUnion -class Data: - i: t.CInt - f: t.CFloat - -@t.CExport -def test() -> t.CInt: pass - -@t.CStatic -def static_func() -> t.CInt: pass - -@t.CStatic -def mixed_func() -> t.CInt | t.CExport: pass - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/b235d6477436c524.doc.json b/.transpyc_cache/b235d6477436c524.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/b235d6477436c524.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/b235d6477436c524.pyi b/.transpyc_cache/b235d6477436c524.pyi deleted file mode 100644 index fa0bd7d..0000000 --- a/.transpyc_cache/b235d6477436c524.pyi +++ /dev/null @@ -1,131 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import w32.win32console -import t, c -from t import CInt, CPtr, CChar, CInt32T, CUInt64T, CFloat64T, CExport, State -import viperlib -import stdlib -import definetest -import enumtest -import mpooltest -import vectortest -import fileiotest -import testcheck - -def add[T](a: T, b: T) -> T: pass - -def add_u64[T](a: T, b: T, c: CUInt64T) -> T: pass - -def fxi[T1, T2](a: T1, b: T2) -> T1: pass - -def fxi2[T1, T2, T3](a: T1, b: T2, c: T3) -> T1: pass - -def wrap_add[T](a: T, b: T) -> T: pass - -def double_add[T](a: T, b: T) -> T: pass - - -class A[T]: - def __init__(self: A, a: T) -> t.CInt: pass - def get_a(self: A) -> T: pass -class Pair[T1, T2]: - def __init__(self: Pair, first: T1, second: T2) -> t.CInt: pass - def get_first(self: Pair) -> T1: pass - def get_second(self: Pair) -> T2: pass -class Calculator[T]: - def __init__(self: Calculator, init_val: T) -> t.CInt: pass - def compute(self: Calculator, other: T) -> T: pass - def double_compute(self: Calculator, other: T) -> T: pass -class Container[T]: - def __init__(self: Container, v: T) -> t.CInt: pass - def get_value(self: Container) -> T: pass - def get_flag(self: Container) -> CInt32T: pass -@t.CVTable -class Shape: - def __init__(self: Shape, x: CFloat64T, y: CFloat64T) -> t.CInt: pass - def area(self: Shape) -> CFloat64T: pass - def perimeter(self: Shape) -> CFloat64T: pass - def describe(self: Shape) -> CFloat64T: pass -@t.CVTable -class Circle(Shape): - def __init__(self: Circle, x: CFloat64T, y: CFloat64T, r: CFloat64T) -> t.CInt: pass - def area(self: Circle) -> CFloat64T: pass - def perimeter(self: Circle) -> CFloat64T: pass - def scale(self: Circle, factor: CFloat64T) -> 'Circle' | CPtr: pass - def move(self: Circle, dx: CFloat64T, dy: CFloat64T) -> 'Circle' | CPtr: pass -@t.CVTable -class Rect(Shape): - def __init__(self: Rect, x: CFloat64T, y: CFloat64T, w: CFloat64T, h: CFloat64T) -> t.CInt: pass - def area(self: Rect) -> CFloat64T: pass - def perimeter(self: Rect) -> CFloat64T: pass - def scale(self: Rect, factor: CFloat64T) -> 'Rect' | CPtr: pass -class Vec2: - x: CFloat64T - y: CFloat64T - def __new__() -> 'Vec2' | CPtr: pass - def __init__(self: Vec2, x: CFloat64T, y: CFloat64T) -> t.CInt: pass - def __add__(self: Vec2, b: 'Vec2' | CPtr) -> 'Vec2' | CPtr: pass - def __sub__(self: Vec2, b: 'Vec2' | CPtr) -> 'Vec2' | CPtr: pass - def __mul__(self: Vec2, s: CFloat64T) -> 'Vec2' | CPtr: pass - def __neg__(self: Vec2) -> 'Vec2' | CPtr: pass - def dot(self: Vec2, b: 'Vec2' | CPtr) -> CFloat64T: pass - def len_sq(self: Vec2) -> CFloat64T: pass -class Vec3: - x: CFloat64T - y: CFloat64T - z: CFloat64T - def __new__() -> 'Vec3' | CPtr: pass - def __init__(self: Vec3, x: CFloat64T, y: CFloat64T, z: CFloat64T) -> t.CInt: pass - def __add__(self: Vec3, b: 'Vec3' | CPtr) -> 'Vec3' | CPtr: pass - def __sub__(self: Vec3, b: 'Vec3' | CPtr) -> 'Vec3' | CPtr: pass - def __mul__(self: Vec3, s: CFloat64T) -> 'Vec3' | CPtr: pass - def __neg__(self: Vec3) -> 'Vec3' | CPtr: pass - def dot(self: Vec3, b: 'Vec3' | CPtr) -> CFloat64T: pass - def cross(self: Vec3, b: 'Vec3' | CPtr) -> 'Vec3' | CPtr: pass - def len_sq(self: Vec3) -> CFloat64T: pass -@t.CVTable -class Dog: - def __init__(self: Dog, name_val: CInt, bark_power: CInt32T) -> t.CInt: pass - def speak(self: Dog) -> CInt: pass - def bite(self: Dog) -> CInt32T: pass - def take_damage(self: Dog, dmg: CInt32T) -> 'Dog' | CPtr: pass - def is_alive(self: Dog) -> CInt: pass -@t.CVTable -class Cat: - def __init__(self: Cat, name_val: CInt, lives: CInt32T) -> t.CInt: pass - def speak(self: Cat) -> CInt: pass - def scratch(self: Cat) -> CInt32T: pass - def take_damage(self: Cat, dmg: CInt32T) -> 'Cat' | CPtr: pass - def is_alive(self: Cat) -> CInt: pass -class Transform: - px: CFloat64T - py: CFloat64T - pz: CFloat64T - scale_x: CFloat64T - scale_y: CFloat64T - scale_z: CFloat64T - def __new__() -> 'Transform' | CPtr: pass - def __init__(self: Transform, px: CFloat64T, py: CFloat64T, pz: CFloat64T) -> t.CInt: pass - def apply_scale(self: Transform, sx: CFloat64T, sy: CFloat64T, sz: CFloat64T) -> 'Transform' | CPtr: pass - def world_position(self: Transform) -> 'Vec3' | CPtr: pass -@t.CVTable -class Vehicle: - def __init__(self: Vehicle, speed: CInt32T) -> t.CInt: pass - def move(self: Vehicle) -> CInt: pass - def is_running(self: Vehicle) -> CInt: pass -@t.CVTable -class Car(Vehicle): - def __init__(self: Car, speed: CInt32T, doors: CInt32T) -> t.CInt: pass - def honk(self: Car) -> CInt: pass -@t.CVTable -class ElectricCar(Car): - def __init__(self: ElectricCar, speed: CInt32T, doors: CInt32T, battery: CInt32T) -> t.CInt: pass - def charge(self: ElectricCar) -> t.CInt: pass - def move(self: ElectricCar) -> CInt: pass - -def main() -> CInt | CExport: pass diff --git a/.transpyc_cache/b298756207e2da58.doc.json b/.transpyc_cache/b298756207e2da58.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/b298756207e2da58.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/b298756207e2da58.pyi b/.transpyc_cache/b298756207e2da58.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/b298756207e2da58.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/b29b80b6106e4be7.doc.json b/.transpyc_cache/b29b80b6106e4be7.doc.json deleted file mode 100644 index 724daa6..0000000 --- a/.transpyc_cache/b29b80b6106e4be7.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到\n\n allow_star_fallback: 传 0 禁用 star import 回退(用于明确模块名/函数名查找)\n ", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_get_external_func_param_ty": "获取外部函数第 param_idx 个参数的期望类型,None 表示用字面量原类型\n\n 对 Win32 API 函数的所有非指针参数返回 i64,匹配 declare 中\n ULONG/SIZE_T 被统一翻译为 i64 的情况。\n ", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/b29b80b6106e4be7.pyi b/.transpyc_cache/b29b80b6106e4be7.pyi deleted file mode 100644 index 065139b..0000000 --- a/.transpyc_cache/b29b80b6106e4be7.pyi +++ /dev/null @@ -1,173 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str, allow_star_fallback: int) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _get_external_func_param_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str, param_idx: int) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/b3c2b99b6f3be4c7.doc.json b/.transpyc_cache/b3c2b99b6f3be4c7.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/b3c2b99b6f3be4c7.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/b3c2b99b6f3be4c7.pyi b/.transpyc_cache/b3c2b99b6f3be4c7.pyi deleted file mode 100644 index 155b94e..0000000 --- a/.transpyc_cache/b3c2b99b6f3be4c7.pyi +++ /dev/null @@ -1,17 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import w32.win32console -import t, c -from t import CInt, CExport -import stdio -import stdlib -import string -import memhub -import testcheck - -def main() -> CInt | CExport: pass diff --git a/.transpyc_cache/b3fd73f7abbd88a8.doc.json b/.transpyc_cache/b3fd73f7abbd88a8.doc.json deleted file mode 100644 index 86441ed..0000000 --- a/.transpyc_cache/b3fd73f7abbd88a8.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名\n\n 特殊处理 __init__.py:includes/ast/__init__.py → ast(而非 ast.__init__)\n ", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/b3fd73f7abbd88a8.pyi b/.transpyc_cache/b3fd73f7abbd88a8.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/b3fd73f7abbd88a8.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/b436212dcff1be29.doc.json b/.transpyc_cache/b436212dcff1be29.doc.json deleted file mode 100644 index c6f42ec..0000000 --- a/.transpyc_cache/b436212dcff1be29.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"test_global_write": "测试:缺少 global 声明时,赋值是否修改模块级变量", "test_global_write_no_decl": "测试:没有 global 声明时,赋值是否创建局部变量", "test_global_ptr_no_decl": "测试:没有 global 声明时,指针赋值是否创建局部变量", "test_pointer_arithmetic": "测试指针算术:偏移计算是否正确", "test_array_decay": "测试 list[t.CChar, N] 传递给 t.CConst | str 参数", "test_pointer_cast": "测试指针与整数之间的类型转换", "test_pointer_offset": "测试指针偏移:CUInt8T* + N 应该偏移 N 字节,CUInt32T* + N 应该偏移 N*4 字节", "test_struct_pointer": "测试结构体指针的成员访问", "test_memcpy_pointers": "测试 memcpy 在指针之间的数据复制", "test_pointer_param": "测试指针作为函数参数传递"} \ No newline at end of file diff --git a/.transpyc_cache/b436212dcff1be29.pyi b/.transpyc_cache/b436212dcff1be29.pyi deleted file mode 100644 index ab57c0d..0000000 --- a/.transpyc_cache/b436212dcff1be29.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import t, c -import stdio -import string -import w32.win32console -import w32.win32memory -import testcheck - -_g_val: t.CExtern | t.CInt -_g_ptr: t.CExtern | t.CUInt32T | t.CPtr - -def test_global_write() -> t.CInt: pass - -def test_global_write_no_decl() -> t.CInt: pass - -def test_global_ptr() -> t.CInt: pass - -def test_global_ptr_no_decl() -> t.CInt: pass - -def test_pointer_arithmetic() -> t.CInt: pass - -def test_array_decay() -> t.CInt: pass - -def test_pointer_cast() -> t.CInt: pass - -def test_pointer_offset() -> t.CInt: pass - - -class TestStruct: - a: t.CInt - b: t.CInt - c: t.CUInt64T - -def test_struct_pointer() -> t.CInt: pass - -def test_memcpy_pointers() -> t.CInt: pass - -def fill_array(arr: t.CUInt32T | t.CPtr, count: t.CInt, val: t.CUInt32T) -> t.CInt: pass - -def test_pointer_param() -> t.CInt: pass - -def main() -> t.CInt | t.CExport: pass diff --git a/.transpyc_cache/b547ac4f380bddb6.pyi b/.transpyc_cache/b547ac4f380bddb6.pyi deleted file mode 100644 index e960341..0000000 --- a/.transpyc_cache/b547ac4f380bddb6.pyi +++ /dev/null @@ -1,166 +0,0 @@ -""" -Auto-generated Python stub file from ast.tokens.py -Module: ast.tokens -""" - - -import t, c -from stdint import * -import memhub -import string - -class TokenType(t.CEnum): - EndMarker: t.State - NewLine: t.State - Indent: t.State - Dedent: t.State - Name: t.State - Number: t.State - String: t.State - FStringStart: t.State - FStringMiddle: t.State - FStringEnd: t.State - Op: t.State - Nl: t.State - Comment: t.State - Encoding: t.State -class Keyword(t.CEnum): - NotKeyword: t.State - False_: t.State - None_: t.State - True_: t.State - And: t.State - As: t.State - Assert: t.State - Async: t.State - Await: t.State - Break: t.State - Class: t.State - Continue: t.State - Def: t.State - Del: t.State - Elif: t.State - Else: t.State - Except: t.State - Finally: t.State - For: t.State - From: t.State - Global: t.State - If: t.State - Import: t.State - In: t.State - Is: t.State - Lambda: t.State - Nonlocal: t.State - Not: t.State - Or: t.State - Pass: t.State - Raise: t.State - Return: t.State - Try: t.State - While: t.State - With: t.State - Yield: t.State - Match: t.State - Case: t.State - Type: t.State -class TokOp(t.CEnum): - LPar: t.State - RPar: t.State - Lsqb: t.State - Rsqb: t.State - LBrace: t.State - RBrace: t.State - Comma: t.State - Colon: t.State - Dot: t.State - Semi: t.State - At: t.State - Equal: t.State - RArrow: t.State - PlusEq: t.State - MinusEq: t.State - StarEq: t.State - SlashEq: t.State - DSlashEq: t.State - PercentEq: t.State - AtEq: t.State - AmpEq: t.State - VBarEq: t.State - CaretEq: t.State - GtGtEq: t.State - LtLtEq: t.State - StarEqEq: t.State - DSlash: t.State - StarStar: t.State - LtLt: t.State - GtGt: t.State - LessEq: t.State - GreaterEq: t.State - EqEq: t.State - ExclaimEq: t.State - Less: t.State - Greater: t.State - Plus: t.State - Minus: t.State - Star: t.State - Slash: t.State - Percent: t.State - Amp: t.State - VBar: t.State - Caret: t.State - Tilde: t.State - ColonEq: t.State - Ellipsis: t.State - Bang: t.State -class Token: - type: t.CInt - op_subtype: t.CInt - kw_subtype: t.CInt - str_val: str - int_val: t.CInt64T - float_val: t.CDouble - is_float: t.CInt - is_complex: t.CInt - lineno: t.CInt - col_offset: t.CInt - end_lineno: t.CInt - end_col_offset: t.CInt - next: Token | t.CPtr - def __new__(self: Token, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass -class KwEntry: - name: str - kw_id: t.CInt - next: KwEntry | t.CPtr - def __new__(self: KwEntry, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - -_kw_head: t.CExtern | KwEntry | t.CPtr -_kw_pool: t.CExtern | memhub.MemManager | t.CPtr - -def _kw_intern(pool: memhub.MemManager | t.CPtr, name: str, kw_id: t.CInt) -> t.CInt: pass - -def _kw_lookup(name: str) -> t.CInt: pass - -def _init_keywords(pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - - -class OpEntry: - name: str - op_id: t.CInt - length: t.CInt - next: OpEntry | t.CPtr - def __new__(self: OpEntry, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - -_op_head: t.CExtern | OpEntry | t.CPtr - -def _op_intern(pool: memhub.MemManager | t.CPtr, name: str, op_id: t.CInt) -> t.CInt: pass - -def _init_operators(pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - -def _init_tables(pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - -def new_token(pool: memhub.MemManager | t.CPtr, ttype: t.CInt, lineno: t.CInt, col_offset: t.CInt) -> Token | t.CPtr: pass - -def token_set_str(pool: memhub.MemManager | t.CPtr, tok: Token | t.CPtr, src: str, start: t.CSizeT, length: t.CSizeT) -> t.CInt: pass - -def token_set_str_literal(pool: memhub.MemManager | t.CPtr, tok: Token | t.CPtr, text: str) -> t.CInt: pass diff --git a/.transpyc_cache/b558d8d8f01f4825.pyi b/.transpyc_cache/b558d8d8f01f4825.pyi deleted file mode 100644 index a326df6..0000000 --- a/.transpyc_cache/b558d8d8f01f4825.pyi +++ /dev/null @@ -1,39 +0,0 @@ -""" -Auto-generated Python stub file from requests.py -Module: requests -""" - - -import t, c -from stdint import * -import string -import socket -import memhub -import stdio - -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr -_socket_ready: t.CExtern | bool -HTTP_PORT: t.CDefine = 80 -HTTP_BUFSIZ: t.CDefine = 4096 - -class Response: - status_code: INT - text: str - body_len: INT - _raw_buf: str - -def _EnsureSocketInit() -> INT: pass - -def _AllocResponse() -> Response | t.CPtr: pass - -def _ParseUrl(url: str, host_buf: str, host_size: INT, path_buf: str, path_size: INT, port: INT | t.CPtr) -> INT: pass - -def _ParseStatusLine(resp_text: str, out_code: INT | t.CPtr) -> INT: pass - -def _FindBodyStart(resp_text: str, resp_len: INT) -> INT: pass - -def get(url: str) -> Response | t.CPtr: pass - -def post(url: str, data: str, content_type: str) -> Response | t.CPtr: pass - -def release(resp: Response | t.CPtr) -> t.CInt: pass diff --git a/.transpyc_cache/b5a965302cded36b.pyi b/.transpyc_cache/b5a965302cded36b.pyi deleted file mode 100644 index bfdb955..0000000 --- a/.transpyc_cache/b5a965302cded36b.pyi +++ /dev/null @@ -1,44 +0,0 @@ -""" -Auto-generated Python stub file from sys.py -Module: sys -""" - - -import t, c -from stdint import * -import platmacro -import memhub -import string -import stdio -import w32.win32base -import w32.win32process -import posix - -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr - -def fgets(buf: t.CChar | t.CPtr, size: t.CInt, stream: t.CVoid | t.CPtr) -> t.CChar | t.CPtr | t.CExtern | t.CExport: pass - -def fflush(stream: t.CVoid | t.CPtr) -> t.CInt | t.CExtern | t.CExport: pass - -def exit(status: INT) -> VOID | t.CExtern | t.CExport: pass - - -maxsize: t.CDefine = 9223372036854775807 - -def platform() -> str: pass - -def get_pid() -> int: pass - - -_argc: t.CExtern | INT -_argv: t.CExtern | str | t.CPtr - -def _init_argv() -> t.CInt: pass - -def _init_argv_win32() -> t.CInt: pass - -def _init_argv_posix() -> t.CInt: pass - -def argc() -> int: pass - -def argv(index: int) -> str: pass diff --git a/.transpyc_cache/b5d05dbd7fee36ef.doc.json b/.transpyc_cache/b5d05dbd7fee36ef.doc.json deleted file mode 100644 index 86441ed..0000000 --- a/.transpyc_cache/b5d05dbd7fee36ef.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名\n\n 特殊处理 __init__.py:includes/ast/__init__.py → ast(而非 ast.__init__)\n ", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/b5d05dbd7fee36ef.pyi b/.transpyc_cache/b5d05dbd7fee36ef.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/b5d05dbd7fee36ef.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/b69cdee68f223fef.doc.json b/.transpyc_cache/b69cdee68f223fef.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/b69cdee68f223fef.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/b777c587cc21465a.doc.json b/.transpyc_cache/b777c587cc21465a.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/b777c587cc21465a.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/b777c587cc21465a.pyi b/.transpyc_cache/b777c587cc21465a.pyi deleted file mode 100644 index e70167d..0000000 --- a/.transpyc_cache/b777c587cc21465a.pyi +++ /dev/null @@ -1,16 +0,0 @@ -""" -Auto-generated Python stub file from vectortest.py -Module: vectortest -""" - - -import t, c -from t import CInt, CPtr, CChar, CFloat64T -import viperlib -import stdlib -import vector -import memhub - -POOL_SIZE: t.CDefine = 4096 - -def vector_main() -> CInt: pass diff --git a/.transpyc_cache/b7eeff93aa63e70f.doc.json b/.transpyc_cache/b7eeff93aa63e70f.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/b7eeff93aa63e70f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/b7eeff93aa63e70f.pyi b/.transpyc_cache/b7eeff93aa63e70f.pyi deleted file mode 100644 index 807845f..0000000 --- a/.transpyc_cache/b7eeff93aa63e70f.pyi +++ /dev/null @@ -1,25 +0,0 @@ -""" -Auto-generated Python stub file from namespace_defs.py -Module: namespace_defs -""" - - -import stdio -import t, c - -@t.CVTable -class Widget: - id: t.CInt - def __init__(self: Widget, i: t.CInt) -> t.CInt: pass - def GetId(self: Widget) -> t.CInt: pass - def Render(self: Widget) -> t.CInt: pass -class Gadget(Widget): - extra: t.CInt - def __init__(self: Gadget, i: t.CInt, e: t.CInt) -> t.CInt: pass - def Render(self: Gadget) -> t.CInt: pass - def GetExtra(self: Gadget) -> t.CInt: pass -class PlainStruct: - x: t.CInt - y: t.CInt - def __init__(self: PlainStruct, ax: t.CInt, ay: t.CInt) -> t.CInt: pass - def Sum(self: PlainStruct) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/b8c66c8ff44eb874.pyi b/.transpyc_cache/b8c66c8ff44eb874.pyi deleted file mode 100644 index 85bdb8f..0000000 --- a/.transpyc_cache/b8c66c8ff44eb874.pyi +++ /dev/null @@ -1,46 +0,0 @@ -""" -Auto-generated Python stub file from hashtable.py -Module: hashtable -""" - - -import t, c -import string -import memhub -from stdint import * - -_HT_EMPTY: t.CDefine = 0 -_HT_TOMBSTONE: t.CDefine = 1 -_HT_INIT_CAP: t.CDefine = 16 -_HT_SLOT_SIZE: t.CDefine = 24 -_FNV_OFFSET: t.CExtern | t.CUInt64T -_FNV_PRIME: t.CExtern | t.CUInt64T - -def _fnv1a_hash(key: str) -> t.CUInt64T: pass - - -class HashTable: - __slots__: t.CVoid | t.CPtr - __count__: t.CSizeT = 0 - __capacity__: t.CSizeT = 16 - __tombstones__: t.CSizeT = 0 - __mbuddy__: memhub.MemBuddy | t.CPtr - __iter_index__: t.CSizeT = 0 - def __new__(self: HashTable, mb: memhub.MemBuddy | t.CPtr) -> t.CPtr: pass - def __init__(self: HashTable, mb: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - def _slot_hash(self: HashTable, idx: t.CSizeT) -> t.CUInt64T: pass - def _slot_key(self: HashTable, idx: t.CSizeT) -> str: pass - def _slot_value(self: HashTable, idx: t.CSizeT) -> t.CPtr: pass - def _set_slot(self: HashTable, idx: t.CSizeT, h: t.CUInt64T, key: str, val: t.CPtr) -> t.CInt: pass - def _find_slot(self: HashTable, key: str, h: t.CUInt64T) -> t.CSizeT: pass - def _resize(self: HashTable, new_cap: t.CSizeT) -> t.CInt: pass - def __setitem__(self: HashTable, key: str, val: t.CNeedPtr) -> t.CInt: pass - def __getitem__(self: HashTable, key: str) -> t.CPtr: pass - def __contains__(self: HashTable, key: str) -> t.CInt: pass - def __delitem__(self: HashTable, key: str) -> t.CInt: pass - def __len__(self: HashTable) -> t.CSizeT: pass - def __iter__(self: HashTable) -> HashTable | t.CPtr: pass - def __next__(self: HashTable) -> str: pass - def get(self: HashTable, key: str, default: t.CPtr) -> t.CPtr: pass - def set_int(self: HashTable, key: str, val: int) -> t.CInt: pass - def set_str(self: HashTable, key: str, val: str) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/b8cbe044a10adcca.doc.json b/.transpyc_cache/b8cbe044a10adcca.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/b8cbe044a10adcca.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/b8cbe044a10adcca.pyi b/.transpyc_cache/b8cbe044a10adcca.pyi deleted file mode 100644 index 7809327..0000000 --- a/.transpyc_cache/b8cbe044a10adcca.pyi +++ /dev/null @@ -1,23 +0,0 @@ -""" -Auto-generated Python stub file from eq_test.py -Module: eq_test -""" - - -import stdio -import t, c -import string - -def test_int_eq() -> t.CInt: pass - -def test_int_cmp() -> t.CInt: pass - -def test_ptr_is_none() -> t.CInt: pass - -def test_ptr_assign_none() -> t.CInt: pass - -def test_ptr_eq_none() -> t.CInt: pass - -def test_bool_logic() -> t.CInt: pass - -def eq_test() -> int: pass diff --git a/.transpyc_cache/bc52b7a79738d25a.doc.json b/.transpyc_cache/bc52b7a79738d25a.doc.json deleted file mode 100644 index 6b37383..0000000 --- a/.transpyc_cache/bc52b7a79738d25a.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/bc52b7a79738d25a.pyi b/.transpyc_cache/bc52b7a79738d25a.pyi deleted file mode 100644 index e470478..0000000 --- a/.transpyc_cache/bc52b7a79738d25a.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, args_head: llvmlite.Value | t.CPtr, arg_count: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/bd82e3ca81546c76.doc.json b/.transpyc_cache/bd82e3ca81546c76.doc.json deleted file mode 100644 index 0858afd..0000000 --- a/.transpyc_cache/bd82e3ca81546c76.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"FileEntry": "扫描到的文件条目", "ScanResult": "扫描结果集合", "create_scan_result": "创建扫描结果容器,预分配 MAX_FILES 个槽位", "add_file_entry": "添加文件条目到扫描结果,返回 0 成功", "compute_file_sha1": "读取文件内容并计算 SHA1 前16字符(CRLF→LF 后计算,与 Projectrans.py 一致)", "scan_directory_recursive": "递归扫描目录,收集 .py 文件", "scan_includes": "扫描 includes 目录,返回所有 .py 文件的扫描结果", "find_entry_by_module": "按模块名查找文件条目"} \ No newline at end of file diff --git a/.transpyc_cache/bd82e3ca81546c76.pyi b/.transpyc_cache/bd82e3ca81546c76.pyi deleted file mode 100644 index ba0eee6..0000000 --- a/.transpyc_cache/bd82e3ca81546c76.pyi +++ /dev/null @@ -1,45 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.IncludesScanner.py -Module: lib.core.IncludesScanner -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import hashlib -import viperlib - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_PATH_LEN: t.CDefine = 512 -MAX_FILES: t.CDefine = 256 - -@t.NoVTable -class FileEntry: - Path: str - Sha1: str - RelPath: str - ModuleName: str -@t.NoVTable -class ScanResult: - Entries: FileEntry | t.CPtr - Count: t.CInt - Capacity: t.CInt - -def create_scan_result(pool: memhub.MemBuddy | t.CPtr) -> ScanResult | t.CPtr: pass - -def add_file_entry(result: ScanResult | t.CPtr, pool: memhub.MemBuddy | t.CPtr, abs_path: str, rel_path: str, sha1: str) -> int: pass - -def compute_file_sha1(pool: memhub.MemBuddy | t.CPtr, file_path: str) -> str: pass - -def scan_directory_recursive(pool: memhub.MemBuddy | t.CPtr, root_dir: str, rel_prefix: str, result: ScanResult | t.CPtr) -> int: pass - -def scan_includes(pool: memhub.MemBuddy | t.CPtr, includes_dir: str) -> ScanResult | t.CPtr: pass - -def find_entry_by_module(result: ScanResult | t.CPtr, module_name: str) -> FileEntry | t.CPtr: pass diff --git a/.transpyc_cache/bdfc8bd243b7e5b7.doc.json b/.transpyc_cache/bdfc8bd243b7e5b7.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/bdfc8bd243b7e5b7.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/bdfc8bd243b7e5b7.pyi b/.transpyc_cache/bdfc8bd243b7e5b7.pyi deleted file mode 100644 index bd232f2..0000000 --- a/.transpyc_cache/bdfc8bd243b7e5b7.pyi +++ /dev/null @@ -1,87 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -import t -import stdio -import c -import testcheck - -def square[T](x: T) -> T: pass - -def test_generic_square_types() -> t.CInt: pass - -def clamp[T](val: T, lo: T, hi: T) -> T: pass - -def test_generic_clamp() -> t.CInt: pass - - -class Stack[T]: - data: t.CArray[t.CInt, 16] - top: t.CInt - def __init__(self: Stack) -> t.CInt: pass - def push(self: Stack, val: T) -> t.CInt: pass - def pop(self: Stack) -> T: pass - def is_empty(self: Stack) -> t.CInt: pass - def size_of(self: Stack) -> t.CSizeT: pass - def type_size(self: Stack) -> t.CSizeT: pass - -def test_generic_stack() -> t.CInt: pass - - -class IntPair: - a: t.CInt - b: t.CInt - -def generic_swap[T](p: IntPair | t.CPtr) -> t.CInt: pass - -def test_generic_swap() -> t.CInt: pass - - -class Range[T]: - start: T - end_val: T - step: T - def __init__(self: Range, s: T, e: T, st: T) -> t.CInt: pass - def sum_all(self: Range) -> T: pass - -def test_generic_range() -> t.CInt: pass - -def array_sum(arr: t.CArray[t.CInt, 8], n: t.CInt) -> t.CInt: pass - -def test_generic_array_sum() -> t.CInt: pass - -def max_of_three[T](a: T, b: T, c_val: T) -> T: pass - -def test_generic_max_three() -> t.CInt: pass - - -class Container[T]: - values: t.CArray[t.CInt, 8] - size: t.CInt - def __init__(self: Container) -> t.CInt: pass - def add(self: Container, v: T) -> t.CInt: pass - def get(self: Container, idx: t.CInt) -> T: pass - def contains(self: Container, v: T) -> t.CInt: pass - def total(self: Container) -> T: pass - -def test_generic_container() -> t.CInt: pass - -def factorial[T](n: T) -> T: pass - -def test_generic_factorial() -> t.CInt: pass - - -class Accumulator[T]: - total: T - def __init__(self: Accumulator, start: T) -> t.CInt: pass - def add_val(self: Accumulator, v: T) -> t.CInt: pass - def get_result(self: Accumulator) -> T: pass - -def test_generic_accumulator() -> t.CInt: pass - -def test_generic_sizeof_bug() -> t.CInt: pass - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/bf38ca6c448d2d33.doc.json b/.transpyc_cache/bf38ca6c448d2d33.doc.json deleted file mode 100644 index 86441ed..0000000 --- a/.transpyc_cache/bf38ca6c448d2d33.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名\n\n 特殊处理 __init__.py:includes/ast/__init__.py → ast(而非 ast.__init__)\n ", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/bf38ca6c448d2d33.pyi b/.transpyc_cache/bf38ca6c448d2d33.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/bf38ca6c448d2d33.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/c01b27dbcd683245.doc.json b/.transpyc_cache/c01b27dbcd683245.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/c01b27dbcd683245.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/c01b27dbcd683245.pyi b/.transpyc_cache/c01b27dbcd683245.pyi deleted file mode 100644 index fdb53f8..0000000 --- a/.transpyc_cache/c01b27dbcd683245.pyi +++ /dev/null @@ -1,30 +0,0 @@ -""" -Auto-generated Python stub file from fileiotest.py -Module: fileiotest -""" - - -import t, c -from t import CInt, CInt32T, CUInt32T, CPtr, CChar, CExport -from stdint import * -import stdlib -import viperlib -import w32.win32base -import w32.win32file -import w32.win32console -import w32.fileio -from w32.fileio import File, FileW, MODE, FRESULT, SEEK_SET, SEEK_CUR, SEEK_END - -BUF_SIZE: t.CDefine = 4096 - -def fileio_main() -> t.CInt: pass - -def fileio_with_test() -> t.CInt: pass - -def fileio_handle_test() -> t.CInt: pass - -def fileio_rw_test() -> t.CInt: pass - -def fileio_wide_test() -> t.CInt: pass - -def fileio_chinese_test() -> t.CInt: pass diff --git a/.transpyc_cache/c1416dfae155d6e2.doc.json b/.transpyc_cache/c1416dfae155d6e2.doc.json deleted file mode 100644 index 4cc35ca..0000000 --- a/.transpyc_cache/c1416dfae155d6e2.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"test_snprintf_u8": "测试 CUInt8T 值通过 t.CUnsignedInt() 传递给 %u", "test_snprintf_u16": "测试 CUInt16T 值通过 t.CUnsignedInt() 传递给 %u", "test_snprintf_u64": "测试 CUInt64T 值传递给 %lu", "test_snprintf_d_neg": "测试 %d 格式化负整数", "test_snprintf_mixed": "模拟 desktop.py 的时间格式化", "test_printf_variadic": "测试 printf 直接输出 variadic 参数", "test_snprintf_multi_lu": "测试多个 %lu 连续(模拟 perf 日志格式)", "test_snprintf_u8_edge": "测试 CUInt8T 边界值"} \ No newline at end of file diff --git a/.transpyc_cache/c1416dfae155d6e2.pyi b/.transpyc_cache/c1416dfae155d6e2.pyi deleted file mode 100644 index 636e8b0..0000000 --- a/.transpyc_cache/c1416dfae155d6e2.pyi +++ /dev/null @@ -1,39 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import t, c -import stdio -import testcheck -import string -import viperlib -import w32.win32console - -def test_snprintf_u8() -> t.CInt: pass - -def test_snprintf_u16() -> t.CInt: pass - -def test_snprintf_u64() -> t.CInt: pass - -def test_snprintf_d_neg() -> t.CInt: pass - -def test_snprintf_d_pos() -> t.CInt: pass - -def test_snprintf_x() -> t.CInt: pass - -def test_snprintf_mixed() -> t.CInt: pass - -def test_printf_variadic() -> t.CInt: pass - -def test_snprintf_multi_lu() -> t.CInt: pass - -def test_snprintf_zero() -> t.CInt: pass - -def test_snprintf_large() -> t.CInt: pass - -def test_snprintf_u8_edge() -> t.CInt: pass - -def main() -> t.CInt | t.CExport: pass diff --git a/.transpyc_cache/c24f25b14b4bbd0a.pyi b/.transpyc_cache/c24f25b14b4bbd0a.pyi deleted file mode 100644 index a7c0c1f..0000000 --- a/.transpyc_cache/c24f25b14b4bbd0a.pyi +++ /dev/null @@ -1,91 +0,0 @@ -""" -Auto-generated Python stub file from vipersimd.py -Module: vipersimd -""" - - -import t, c - -def simd_add4d(a: t.CPtr, b: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_sub4d(a: t.CPtr, b: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_mul4d(a: t.CPtr, b: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_div4d(a: t.CPtr, b: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_sqrt4d(a: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_neg4d(a: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_abs4d(a: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_max4d(a: t.CPtr, b: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_min4d(a: t.CPtr, b: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_mul_scalar4d(a: t.CPtr, scalar: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_add_scalar4d(a: t.CPtr, scalar: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_hsum4d(a: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_dot4d(a: t.CPtr, b: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_fma4d(a: t.CPtr, b: t.CPtr, c_val: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_add4f(a: t.CPtr, b: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_sub4f(a: t.CPtr, b: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_mul4f(a: t.CPtr, b: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_div4f(a: t.CPtr, b: t.CPtr, out: t.CPtr) -> t.CVoid: pass - -def simd_add_array(a: t.CPtr, b: t.CPtr, out: t.CPtr, n: t.CSizeT) -> t.CVoid: pass - -def simd_sub_array(a: t.CPtr, b: t.CPtr, out: t.CPtr, n: t.CSizeT) -> t.CVoid: pass - -def simd_mul_array(a: t.CPtr, b: t.CPtr, out: t.CPtr, n: t.CSizeT) -> t.CVoid: pass - -def simd_div_array(a: t.CPtr, b: t.CPtr, out: t.CPtr, n: t.CSizeT) -> t.CVoid: pass - -def simd_sqrt_array(a: t.CPtr, out: t.CPtr, n: t.CSizeT) -> t.CVoid: pass - -def simd_abs_array(a: t.CPtr, out: t.CPtr, n: t.CSizeT) -> t.CVoid: pass - -def simd_neg_array(a: t.CPtr, out: t.CPtr, n: t.CSizeT) -> t.CVoid: pass - -def simd_dot_array(a: t.CPtr, b: t.CPtr, n: t.CSizeT, out: t.CPtr) -> t.CVoid: pass - -def simd_sqrt(x: t.CDouble) -> t.CDouble: pass - -def simd_fabs(x: t.CDouble) -> t.CDouble: pass - -def simd_floor(x: t.CDouble) -> t.CDouble: pass - -def simd_ceil(x: t.CDouble) -> t.CDouble: pass - -def simd_round(x: t.CDouble) -> t.CDouble: pass - -def simd_trunc(x: t.CDouble) -> t.CDouble: pass - -def simd_fma(a: t.CDouble, b: t.CDouble, c_val: t.CDouble) -> t.CDouble: pass - -def simd_copysign(mag: t.CDouble, sign: t.CDouble) -> t.CDouble: pass - -def simd_neg(x: t.CDouble) -> t.CDouble: pass - -def simd_minnum(a: t.CDouble, b: t.CDouble) -> t.CDouble: pass - -def simd_maxnum(a: t.CDouble, b: t.CDouble) -> t.CDouble: pass - -def simd_exp(x: t.CDouble) -> t.CDouble: pass - -def simd_log(x: t.CDouble) -> t.CDouble: pass - -def simd_sin(x: t.CDouble) -> t.CDouble: pass - -def simd_cos(x: t.CDouble) -> t.CDouble: pass - -def simd_pow(x: t.CDouble, y: t.CDouble) -> t.CDouble: pass diff --git a/.transpyc_cache/c2ed034f4bfaad51.doc.json b/.transpyc_cache/c2ed034f4bfaad51.doc.json deleted file mode 100644 index f8bc59e..0000000 --- a/.transpyc_cache/c2ed034f4bfaad51.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"add_imported_module": "记录已导入的模块名,返回新的 imported_modules 字符串指针", "is_module_imported": "检查模块是否已导入(词边界精确匹配,避免子串误匹配)", "add_from_import": "添加 from-import 映射 \"name:module\",返回新的 from_imports 字符串", "lookup_from_import": "查找 from-import 名称,返回模块名或 None\n\n 支持 star import: 如果 from_imports 中有 \"*:module\" 条目,\n 且未找到精确名称匹配,则返回 star import 的模块名。\n ", "ImportsHandle": "导入语句处理器:继承 Mixin 获得 Trans 回指针", "ImportsHandle.HandleImport": "处理 import 语句,返回 0", "ImportsHandle.HandleImportFromModule": "处理 from X import Y 的模块部分,更新 trans._imported_modules", "ImportsHandle.HandleImportFromNames": "处理 from X import Y 的名称部分,更新 trans._from_imports"} \ No newline at end of file diff --git a/.transpyc_cache/c2ed034f4bfaad51.pyi b/.transpyc_cache/c2ed034f4bfaad51.pyi deleted file mode 100644 index 7abd965..0000000 --- a/.transpyc_cache/c2ed034f4bfaad51.pyi +++ /dev/null @@ -1,34 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesImports.py -Module: lib.core.Handles.HandlesImports -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import viperlib -import stdio -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesStruct as HandlesStruct - -def add_imported_module(pool: memhub.MemBuddy | t.CPtr, imported_modules: str, name: str) -> str: pass - -def is_module_imported(imported_modules: str, name: str) -> int: pass - -def add_from_import(pool: memhub.MemBuddy | t.CPtr, from_imports: str, local_name: str, module_name: str) -> str: pass - -def lookup_from_import(from_imports: str, name: str) -> str: pass - - -@t.NoVTable -class ImportsHandle(HandlesBase.Mixin): - def __init__(self: ImportsHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleImport(self: ImportsHandle, node: ast.AST | t.CPtr) -> int: pass - def HandleImportFromModule(self: ImportsHandle, node: ast.AST | t.CPtr) -> int: pass - def HandleImportFromNames(self: ImportsHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewImportsHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ImportsHandle | t.CPtr: pass diff --git a/.transpyc_cache/c2f78fe75716e993.doc.json b/.transpyc_cache/c2f78fe75716e993.doc.json deleted file mode 100644 index dda4745..0000000 --- a/.transpyc_cache/c2f78fe75716e993.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"get_func_name": "从函数节点提取函数名", "escape_llvm_string": "将字符串转换为 LLVM IR 字符串字面量 c\"...\\00\" ", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "get_llvm_float_bits": "获取 LLVM 浮点类型的位宽,非浮点类型返回 0", "is_ptr_type": "检查 ty 是否是 Ptr 类型,返回 1=是, 0=否", "_deref_if_ptr_ptr": "如果 obj_ptr 是 Ptr(Ptr(...)),load 解引用获取内层指针", "coerce_to_type": "将 val 强制转换为 target_ty\n\n 整数: sext(扩展)/ trunc(截断)\n 浮点: fpext(扩展)/ fptrunc(截断)\n int→float: sitofp\n float→int: fptosi\n ", "create_global_string": "创建全局字符串常量并返回 i8* bitcast", "translate_constant": "翻译常量(int/str/bool)", "_infer_elem_type_from_value": "从 LLVM Value 的类型推断 list 元素类型名", "_find_pool_var": "查找上下文中的 pool 变量,返回 alloca 或 None", "translate_list_literal": "翻译 list 字面量 [a, b, c] → list[T](pool) + append 序列", "translate_value": "翻译值表达式为 LLVM Value", "translate_compare": "翻译比较表达式,返回 i1 结果", "translate_unaryop": "翻译一元运算(-x, +x, not x, ~x)", "translate_boolop": "翻译布尔运算(and/or)的短路求值,返回 i1", "translate_name_value": "翻译变量引用(Name 节点)→ load", "ExprHandle": "表达式处理器:继承 Mixin 获得 Trans 回指针", "ExprHandle.HandleValue": "翻译值表达式,从 self.Trans 获取共享状态", "list_getitem_inline": "内联生成 list __getitem__ 逻辑,返回元素地址 (i8*)", "_list_elem_type_from_name": "从 list 类型名提取元素 LLVM 类型", "list_setitem_inline": "内联生成 list __setitem__ 逻辑,返回 0", "is_list_subscript": "检查 Subscript 节点是否是 list[T] 类型,返回 list 对象指针或 None", "translate_subscript": "翻译下标表达式,返回加载的元素值", "translate_attribute": "翻译属性访问,返回加载的字段值", "get_subscript_ptr": "获取下标表达式的元素指针(用于赋值 lhs)", "get_attribute_ptr": "获取属性访问的字段指针(用于赋值 lhs)"} \ No newline at end of file diff --git a/.transpyc_cache/c2f78fe75716e993.pyi b/.transpyc_cache/c2f78fe75716e993.pyi deleted file mode 100644 index c495a8e..0000000 --- a/.transpyc_cache/c2f78fe75716e993.pyi +++ /dev/null @@ -1,84 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExpr.py -Module: lib.core.Handles.HandlesExpr -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import llvmlite -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprOps as HandlesExprOps -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -def get_func_name(func_node: ast.AST | t.CPtr) -> str: pass - -def escape_llvm_string(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_llvm_float_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def is_ptr_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _deref_if_ptr_ptr(builder: llvmlite.IRBuilder | t.CPtr, obj_ptr: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def coerce_to_type(builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def create_global_string(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, str_val: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_constant(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_elem_type_from_value(pool: memhub.MemBuddy | t.CPtr, value: llvmlite.Value | t.CPtr) -> str: pass - -def _find_pool_var(trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_list_literal(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, elem_type_name: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_compare(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_unaryop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_boolop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_name_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -@t.NoVTable -class ExprHandle(HandlesBase.Mixin): - def __init__(self: ExprHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleValue(self: ExprHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def NewExprHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprHandle | t.CPtr: pass - -def list_getitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _list_elem_type_from_name(pool: memhub.MemBuddy | t.CPtr, struct_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def list_setitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr, rhs_val: llvmlite.Value | t.CPtr) -> int: pass - -def is_list_subscript(node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_subscript(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_attribute(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -import stdio - -def get_subscript_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_attribute_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/c325121077fc50d9.doc.json b/.transpyc_cache/c325121077fc50d9.doc.json deleted file mode 100644 index 28f2ad8..0000000 --- a/.transpyc_cache/c325121077fc50d9.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_register_cexport_from_funcdef": "预注册 CExport/State 函数到全局表(仅注册,不生成 IR)", "translate_children": "遍历 tree.children 并翻译每个子节点\n\n Args:\n trans: 翻译器(含所有共享状态)\n tree: AST 模块节点\n\n Returns:\n t.CInt: 新增的变量数\n ", "handle_module_level_var": "处理模块级变量声明,创建全局变量", "create_wrapper_main": "创建包装 main 函数并翻译所有顶层语句\n\n Args:\n trans: 翻译器(含所有共享状态)\n tree: AST 模块节点\n i32_ty: i32 LLVMType\n\n Returns:\n t.CInt: 新增的变量数\n "} \ No newline at end of file diff --git a/.transpyc_cache/c325121077fc50d9.pyi b/.transpyc_cache/c325121077fc50d9.pyi deleted file mode 100644 index 2294a70..0000000 --- a/.transpyc_cache/c325121077fc50d9.pyi +++ /dev/null @@ -1,30 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesMain.py -Module: lib.core.Handles.HandlesMain -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesBody as HandlesBody -import lib.core.Handles.HandlesFunctions as HandlesFunctions -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -def _register_cexport_from_funcdef(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_children(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr) -> int: pass - -def handle_module_level_var(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def create_wrapper_main(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr, i32_ty: llvmlite.LLVMType | t.CPtr) -> int: pass diff --git a/.transpyc_cache/c39f3e540adb7b4e.doc.json b/.transpyc_cache/c39f3e540adb7b4e.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/c39f3e540adb7b4e.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/c39f3e540adb7b4e.pyi b/.transpyc_cache/c39f3e540adb7b4e.pyi deleted file mode 100644 index 7862af7..0000000 --- a/.transpyc_cache/c39f3e540adb7b4e.pyi +++ /dev/null @@ -1,41 +0,0 @@ -""" -Auto-generated Python stub file from llvmir_test.py -Module: llvmir_test -""" - - -import t, c -from stdint import * -import stdio - -def test_add() -> t.CInt: pass - -def test_sub() -> t.CInt: pass - -def test_mul() -> t.CInt: pass - -def test_sdiv() -> t.CInt: pass - -def test_and() -> t.CInt: pass - -def test_or() -> t.CInt: pass - -def test_xor() -> t.CInt: pass - -def test_shl() -> t.CInt: pass - -def test_lout() -> t.CInt: pass - -def test_icmp_eq() -> t.CInt: pass - -def test_icmp_ne() -> t.CInt: pass - -def test_icmp_slt() -> t.CInt: pass - -def test_srem() -> t.CInt: pass - -def test_lshr() -> t.CInt: pass - -def test_nested() -> t.CInt: pass - -def llvmir_test() -> t.CInt: pass diff --git a/.transpyc_cache/c3a6aed1f1fb8b1e.pyi b/.transpyc_cache/c3a6aed1f1fb8b1e.pyi deleted file mode 100644 index 68a99b1..0000000 --- a/.transpyc_cache/c3a6aed1f1fb8b1e.pyi +++ /dev/null @@ -1,240 +0,0 @@ -""" -Auto-generated Python stub file from numpy.__init__.py -Module: numpy.__init__ -""" - - -from stdint import * -import stdlib -import string -import vipermath -import stdio -import t, c -import memhub - -MAX_NDIM: t.CDefine = 4 -float64: t.CTypedef = t.CDouble -float32: t.CTypedef = t.CFloat -int64: t.CTypedef = t.CLong -int32: t.CTypedef = t.CInt -uint8: t.CTypedef = t.CUnsignedChar -pi: t.CDefine = 3.14159265358979323846 -e: t.CDefine = 2.71828182845904523536 - -@t.Object -class ndarray[T]: - data: T | t.CPtr - shape: t.CArray[t.CSizeT, MAX_NDIM] - strides: t.CArray[t.CSizeT, MAX_NDIM] - ndim: t.CInt - size: t.CSizeT - owns_data: t.CInt - pool: memhub.MemManager | t.CPtr - def __new__(self: ndarray, pool: memhub.MemManager | t.CPtr, n: t.CSizeT) -> t.CInt: pass - def __add__(self: ndarray, other: ndarray[T] | t.CPtr) -> ndarray[T] | t.CPtr: pass - def __sub__(self: ndarray, other: ndarray[T] | t.CPtr) -> ndarray[T] | t.CPtr: pass - def __mul__(self: ndarray, other: ndarray[T] | t.CPtr) -> ndarray[T] | t.CPtr: pass - def __truediv__(self: ndarray, other: ndarray[T] | t.CPtr) -> ndarray[T] | t.CPtr: pass - def __floordiv__(self: ndarray, other: ndarray[T] | t.CPtr) -> ndarray[T] | t.CPtr: pass - def __mod__(self: ndarray, other: ndarray[T] | t.CPtr) -> ndarray[T] | t.CPtr: pass - def __neg__(self: ndarray) -> ndarray[T] | t.CPtr: pass - def __len__(self: ndarray) -> t.CInt: pass - def at2d(self: ndarray, row: t.CSizeT, col: t.CSizeT) -> T: pass - def set2d(self: ndarray, row: t.CSizeT, col: t.CSizeT, val: T) -> t.CInt: pass - def delete(self: ndarray) -> t.CInt: pass - def fill(self: ndarray, val: T) -> t.CInt: pass - def copy(self: ndarray) -> ndarray[T] | t.CPtr: pass - def reshape(self: ndarray, new_shape: INTPTR, new_ndim: t.CInt) -> ndarray[T] | t.CPtr: pass - def sum(self: ndarray) -> T: pass - def mean(self: ndarray) -> T: pass - def min(self: ndarray) -> T: pass - def max(self: ndarray) -> T: pass - def argmax(self: ndarray) -> t.CInt: pass - def argmin(self: ndarray) -> t.CInt: pass - def dot(self: ndarray, other: ndarray[T] | t.CPtr) -> T: pass - def T(self: ndarray) -> ndarray[T] | t.CPtr: pass - def print_arr(self: ndarray) -> t.CInt: pass - -Float64Array: t.CTypedef = ndarray[t.CDouble] -Float32Array: t.CTypedef = ndarray[t.CFloat] -Int64Array: t.CTypedef = ndarray[t.CLong] -Int32Array: t.CTypedef = ndarray[t.CInt] -Uint8Array: t.CTypedef = ndarray[t.CUnsignedChar] - -def _alloc_ndarray(pool: memhub.MemManager | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def _compute_strides(a: ndarray[t.CDouble] | t.CPtr) -> t.CInt: pass - -def _empty_like(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def array(pool: memhub.MemManager | t.CPtr, data: t.CDouble | t.CPtr, n: t.CSizeT) -> ndarray[t.CDouble] | t.CPtr: pass - -def zeros(pool: memhub.MemManager | t.CPtr, n: t.CSizeT) -> ndarray[t.CDouble] | t.CPtr: pass - -def ones(pool: memhub.MemManager | t.CPtr, n: t.CSizeT) -> ndarray[t.CDouble] | t.CPtr: pass - -def full(pool: memhub.MemManager | t.CPtr, n: t.CSizeT, val: t.CDouble) -> ndarray[t.CDouble] | t.CPtr: pass - -def arange(pool: memhub.MemManager | t.CPtr, start: t.CDouble, stop: t.CDouble, step: t.CDouble) -> ndarray[t.CDouble] | t.CPtr: pass - -def linspace(pool: memhub.MemManager | t.CPtr, start: t.CDouble, stop: t.CDouble, num: t.CSizeT) -> ndarray[t.CDouble] | t.CPtr: pass - -def empty2d(pool: memhub.MemManager | t.CPtr, rows: t.CSizeT, cols: t.CSizeT) -> ndarray[t.CDouble] | t.CPtr: pass - -def zeros2d(pool: memhub.MemManager | t.CPtr, rows: t.CSizeT, cols: t.CSizeT) -> ndarray[t.CDouble] | t.CPtr: pass - -def ones2d(pool: memhub.MemManager | t.CPtr, rows: t.CSizeT, cols: t.CSizeT) -> ndarray[t.CDouble] | t.CPtr: pass - -def eye(pool: memhub.MemManager | t.CPtr, n: t.CSizeT) -> ndarray[t.CDouble] | t.CPtr: pass - -def diag(pool: memhub.MemManager | t.CPtr, vals: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_abs(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_sqrt(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_exp(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_log(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_sin(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_cos(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_tan(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_pow(a: ndarray[t.CDouble] | t.CPtr, p: t.CDouble) -> ndarray[t.CDouble] | t.CPtr: pass - -def add_scalar(a: ndarray[t.CDouble] | t.CPtr, s: t.CDouble) -> ndarray[t.CDouble] | t.CPtr: pass - -def mul_scalar(a: ndarray[t.CDouble] | t.CPtr, s: t.CDouble) -> ndarray[t.CDouble] | t.CPtr: pass - -def sub_scalar(a: ndarray[t.CDouble] | t.CPtr, s: t.CDouble) -> ndarray[t.CDouble] | t.CPtr: pass - -def div_scalar(a: ndarray[t.CDouble] | t.CPtr, s: t.CDouble) -> ndarray[t.CDouble] | t.CPtr: pass - -def matmul(a: ndarray[t.CDouble] | t.CPtr, b: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def dot_product(a: ndarray[t.CDouble] | t.CPtr, b: ndarray[t.CDouble] | t.CPtr) -> t.CDouble: pass - -def np_sum(a: ndarray[t.CDouble] | t.CPtr) -> t.CDouble: pass - -def np_mean(a: ndarray[t.CDouble] | t.CPtr) -> t.CDouble: pass - -def np_min(a: ndarray[t.CDouble] | t.CPtr) -> t.CDouble: pass - -def np_max(a: ndarray[t.CDouble] | t.CPtr) -> t.CDouble: pass - -def np_argmax(a: ndarray[t.CDouble] | t.CPtr) -> t.CInt: pass - -def np_argmin(a: ndarray[t.CDouble] | t.CPtr) -> t.CInt: pass - -def var(a: ndarray[t.CDouble] | t.CPtr) -> t.CDouble: pass - -def std(a: ndarray[t.CDouble] | t.CPtr) -> t.CDouble: pass - -def norm(a: ndarray[t.CDouble] | t.CPtr) -> t.CDouble: pass - -def clip(a: ndarray[t.CDouble] | t.CPtr, lo: t.CDouble, hi: t.CDouble) -> ndarray[t.CDouble] | t.CPtr: pass - -def concatenate(a: ndarray[t.CDouble] | t.CPtr, b: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def sort_arr(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def reverse(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_log10(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_log2(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_floor(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_ceil(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_round(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_sign(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_tanh(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_sinh(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_cosh(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_arcsin(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_arccos(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_arctan(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_arctan2(y: ndarray[t.CDouble] | t.CPtr, x: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_degrees(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_radians(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_isnan(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_isinf(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_maximum(a: ndarray[t.CDouble] | t.CPtr, b: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_minimum(a: ndarray[t.CDouble] | t.CPtr, b: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def cumsum(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def diff(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def flatten(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def trace(a: ndarray[t.CDouble] | t.CPtr) -> t.CDouble: pass - -def outer(a: ndarray[t.CDouble] | t.CPtr, b: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_where(condition: ndarray[t.CDouble] | t.CPtr, x: ndarray[t.CDouble] | t.CPtr, y: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_count_nonzero(a: ndarray[t.CDouble] | t.CPtr) -> t.CInt: pass - -def np_all(a: ndarray[t.CDouble] | t.CPtr) -> t.CInt: pass - -def np_any(a: ndarray[t.CDouble] | t.CPtr) -> t.CInt: pass - -def np_equal(a: ndarray[t.CDouble] | t.CPtr, b: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_not_equal(a: ndarray[t.CDouble] | t.CPtr, b: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_less(a: ndarray[t.CDouble] | t.CPtr, b: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_greater(a: ndarray[t.CDouble] | t.CPtr, b: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_less_equal(a: ndarray[t.CDouble] | t.CPtr, b: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_greater_equal(a: ndarray[t.CDouble] | t.CPtr, b: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def empty(pool: memhub.MemManager | t.CPtr, n: t.CSizeT) -> ndarray[t.CDouble] | t.CPtr: pass - -def full2d(pool: memhub.MemManager | t.CPtr, rows: t.CSizeT, cols: t.CSizeT, val: t.CDouble) -> ndarray[t.CDouble] | t.CPtr: pass - -def zeros_like(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def ones_like(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def arange1(pool: memhub.MemManager | t.CPtr, stop: t.CDouble) -> ndarray[t.CDouble] | t.CPtr: pass - -def linspace2(pool: memhub.MemManager | t.CPtr, start: t.CDouble, stop: t.CDouble) -> ndarray[t.CDouble] | t.CPtr: pass - -def meshgrid(x: ndarray[t.CDouble] | t.CPtr, y: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def det2x2(a: ndarray[t.CDouble] | t.CPtr) -> t.CDouble: pass - -def inv2x2(a: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def cross3(a: ndarray[t.CDouble] | t.CPtr, b: ndarray[t.CDouble] | t.CPtr) -> ndarray[t.CDouble] | t.CPtr: pass - -def np_interp(x: t.CDouble, xp: ndarray[t.CDouble] | t.CPtr, fp: ndarray[t.CDouble] | t.CPtr) -> t.CDouble: pass - -def prod(a: ndarray[t.CDouble] | t.CPtr) -> t.CDouble: pass - -def median(a: ndarray[t.CDouble] | t.CPtr) -> t.CDouble: pass - -def percentile(a: ndarray[t.CDouble] | t.CPtr, q: t.CDouble) -> t.CDouble: pass diff --git a/.transpyc_cache/c3b259b4059f8668.pyi b/.transpyc_cache/c3b259b4059f8668.pyi deleted file mode 100644 index 67ff4ce..0000000 --- a/.transpyc_cache/c3b259b4059f8668.pyi +++ /dev/null @@ -1,23 +0,0 @@ -""" -Auto-generated Python stub file from viperlib.py -Module: viperlib -""" - - -import t, c -import viperio -from stdarg import arg, va_arg - -TEMP_BUF_SIZE: t.CDefine = 68 - -def get_digit_count(num: t.CUnsignedInt, base: t.CInt) -> t.CStatic | t.CInt: pass - -def sprintf(buf: t.CChar | t.CPtr, rule: str, *args) -> t.CVoid | t.CExport: pass - -def vsprintf(buf: t.CChar | t.CPtr, rule: str, *args) -> t.CInt: pass - -def snprintf(buf: t.CChar | t.CPtr, size: t.CSizeT, fmt: str, *args) -> t.CInt | t.CExport: pass - -def _check_special_float(fv: t.CDouble) -> t.CInt: pass - -def vsnprintf(buf: t.CChar | t.CPtr, size: t.CSizeT, fmt: str, ap: t.CChar | t.CPtr) -> t.CInt | t.CExport: pass diff --git a/.transpyc_cache/c4960bf577b21f14.doc.json b/.transpyc_cache/c4960bf577b21f14.doc.json deleted file mode 100644 index c90d338..0000000 --- a/.transpyc_cache/c4960bf577b21f14.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"SrcFileEntry": "源文件条目", "_ScanDirForPyFiles": "递归扫描目录,收集 .py 文件到 entries,返回新的 file_count", "RunMultiFileProject": "多文件项目编译\n\n Returns: 0 成功,非 0 失败\n "} \ No newline at end of file diff --git a/.transpyc_cache/c4960bf577b21f14.pyi b/.transpyc_cache/c4960bf577b21f14.pyi deleted file mode 100644 index 819d958..0000000 --- a/.transpyc_cache/c4960bf577b21f14.pyi +++ /dev/null @@ -1,41 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Phase2.py -Module: lib.core.Phase2 -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import viperlib -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import sys -import ast -import llvmlite -import subprocess -import argparse -import lib.core.VLogger as VLogger -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.BuildPipeline as BuildPipeline -import lib.core.StubMerger as StubMerger -import lib.Projectrans.Utils as Utils -import lib.Projectrans.Config as Config - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 -MAX_SRC_FILES: t.CDefine = 64 - -@t.NoVTable -class SrcFileEntry: - Path: str - Sha1: str - -def _ScanDirForPyFiles(mb: memhub.MemBuddy | t.CPtr, dir_path: str, entries: SrcFileEntry | t.CPtr, entry_size: t.CSizeT, file_count: int, max_files: int) -> int: pass - -def RunMultiFileProject(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, output_dir: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str, includes_dir: str, do_phase1: int, do_phase2: int, log: VLogger.Logger | t.CPtr, args: argparse.ParsedArgs | t.CPtr) -> int: pass diff --git a/.transpyc_cache/c4f2d483ec0f4db5.doc.json b/.transpyc_cache/c4f2d483ec0f4db5.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/c4f2d483ec0f4db5.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/c4f2d483ec0f4db5.pyi b/.transpyc_cache/c4f2d483ec0f4db5.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/c4f2d483ec0f4db5.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/c688cec0f891dd97.doc.json b/.transpyc_cache/c688cec0f891dd97.doc.json deleted file mode 100644 index 86441ed..0000000 --- a/.transpyc_cache/c688cec0f891dd97.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名\n\n 特殊处理 __init__.py:includes/ast/__init__.py → ast(而非 ast.__init__)\n ", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/c688cec0f891dd97.pyi b/.transpyc_cache/c688cec0f891dd97.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/c688cec0f891dd97.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/c70684ccfe48a5a9.doc.json b/.transpyc_cache/c70684ccfe48a5a9.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/c70684ccfe48a5a9.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/c70684ccfe48a5a9.pyi b/.transpyc_cache/c70684ccfe48a5a9.pyi deleted file mode 100644 index f6f33f4..0000000 --- a/.transpyc_cache/c70684ccfe48a5a9.pyi +++ /dev/null @@ -1,24 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import w32.win32console -import t, c -from t import CInt, CExport -import memhub -import stdlib -import sys -import os -import os._win32 -import os._posix -import os.path -import shutil -import subprocess -import syslibtest_impl - -ARENA_SIZE: t.CDefine = 1048576 - -def main() -> CInt | CExport: pass diff --git a/.transpyc_cache/c7b66e67f49c5c06.doc.json b/.transpyc_cache/c7b66e67f49c5c06.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/c7b66e67f49c5c06.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/c7b66e67f49c5c06.pyi b/.transpyc_cache/c7b66e67f49c5c06.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/c7b66e67f49c5c06.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/c7ef33270dce36e3.doc.json b/.transpyc_cache/c7ef33270dce36e3.doc.json deleted file mode 100644 index 28f2ad8..0000000 --- a/.transpyc_cache/c7ef33270dce36e3.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_register_cexport_from_funcdef": "预注册 CExport/State 函数到全局表(仅注册,不生成 IR)", "translate_children": "遍历 tree.children 并翻译每个子节点\n\n Args:\n trans: 翻译器(含所有共享状态)\n tree: AST 模块节点\n\n Returns:\n t.CInt: 新增的变量数\n ", "handle_module_level_var": "处理模块级变量声明,创建全局变量", "create_wrapper_main": "创建包装 main 函数并翻译所有顶层语句\n\n Args:\n trans: 翻译器(含所有共享状态)\n tree: AST 模块节点\n i32_ty: i32 LLVMType\n\n Returns:\n t.CInt: 新增的变量数\n "} \ No newline at end of file diff --git a/.transpyc_cache/c7ef33270dce36e3.pyi b/.transpyc_cache/c7ef33270dce36e3.pyi deleted file mode 100644 index 2294a70..0000000 --- a/.transpyc_cache/c7ef33270dce36e3.pyi +++ /dev/null @@ -1,30 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesMain.py -Module: lib.core.Handles.HandlesMain -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesBody as HandlesBody -import lib.core.Handles.HandlesFunctions as HandlesFunctions -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -def _register_cexport_from_funcdef(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def translate_children(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr) -> int: pass - -def handle_module_level_var(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - -def create_wrapper_main(trans: HT.Translator | t.CPtr, tree: ast.AST | t.CPtr, i32_ty: llvmlite.LLVMType | t.CPtr) -> int: pass diff --git a/.transpyc_cache/c9d54a4158f7f5a8.pyi b/.transpyc_cache/c9d54a4158f7f5a8.pyi deleted file mode 100644 index 3e2d738..0000000 --- a/.transpyc_cache/c9d54a4158f7f5a8.pyi +++ /dev/null @@ -1,34 +0,0 @@ -""" -Auto-generated Python stub file from hashlib.__sha256.py -Module: hashlib.__sha256 -""" - - -import t, c - -SHA256_BLOCK_LEN: t.CDefine = 64 -SHA256_DIGEST_LEN: t.CDefine = 32 -sha256_K: t.CExtern | t.CArray[t.CUInt32T, 64] - -def s0(x: t.CUInt32T) -> t.CUInt32T: pass - -def s1(x: t.CUInt32T) -> t.CUInt32T: pass - -def S0(x: t.CUInt32T) -> t.CUInt32T: pass - -def S1(x: t.CUInt32T) -> t.CUInt32T: pass - -def Ch(x: t.CUInt32T, y: t.CUInt32T, z: t.CUInt32T) -> t.CUInt32T: pass - -def Maj(x: t.CUInt32T, y: t.CUInt32T, z: t.CUInt32T) -> t.CUInt32T: pass - - -@t.Object -class sha256: - state: t.CArray[t.CUInt32T, 8] - count: t.CUInt64T - buf: t.CArray[t.CUInt8T, SHA256_BLOCK_LEN] - def __init__(self: sha256) -> t.CInt: pass - def transform(self: sha256, block: t.CUInt8T | t.CPtr) -> t.CInt: pass - def update(self: sha256, s: str) -> t.CInt: pass - def final(self: sha256, out: t.CArray[t.CUInt8T, SHA256_DIGEST_LEN]) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/cb151b297f4ea56d.doc.json b/.transpyc_cache/cb151b297f4ea56d.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/cb151b297f4ea56d.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/cb151b297f4ea56d.pyi b/.transpyc_cache/cb151b297f4ea56d.pyi deleted file mode 100644 index 125a3b3..0000000 --- a/.transpyc_cache/cb151b297f4ea56d.pyi +++ /dev/null @@ -1,15 +0,0 @@ -""" -Auto-generated Python stub file from __zlib.zchecksum.py -Module: __zlib.zchecksum -""" - - -from stdint import * -import t, c - -def zchecksum_adler32(data: UINT8PTR, length: t.CSizeT, init: UINT32) -> t.CUInt32T: pass - - -crc32_table: t.CExtern | t.CArray[t.CUInt32T, 256] - -def zchecksum_crc32(data: UINT8PTR, length: t.CSizeT, init: t.CUInt32T) -> t.CUInt32T: pass diff --git a/.transpyc_cache/cc3ad7f3bc880326.doc.json b/.transpyc_cache/cc3ad7f3bc880326.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/cc3ad7f3bc880326.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/cc3ad7f3bc880326.pyi b/.transpyc_cache/cc3ad7f3bc880326.pyi deleted file mode 100644 index 47bbff6..0000000 --- a/.transpyc_cache/cc3ad7f3bc880326.pyi +++ /dev/null @@ -1,12 +0,0 @@ -""" -Auto-generated Python stub file from virtual_dispatch_test.py -Module: virtual_dispatch_test -""" - - -import stdio -import t, c -import string -from inherit_test import Animal, Dog - -def virtual_dispatch_test() -> int: pass diff --git a/.transpyc_cache/cc436a125bbaf28c.pyi b/.transpyc_cache/cc436a125bbaf28c.pyi deleted file mode 100644 index a905387..0000000 --- a/.transpyc_cache/cc436a125bbaf28c.pyi +++ /dev/null @@ -1,34 +0,0 @@ -""" -Auto-generated Python stub file from hashlib.__md5.py -Module: hashlib.__md5 -""" - - -import t, c - -MD5_BLOCK_LEN: t.CDefine = 64 # 分组块大小 -MD5_DIGEST_LEN: t.CDefine = 16 # 摘要输出长度 - -def md5_F(x: t.CUInt32T, y: t.CUInt32T, z: t.CUInt32T) -> t.CUInt32T: pass - -def md5_G(x: t.CUInt32T, y: t.CUInt32T, z: t.CUInt32T) -> t.CUInt32T: pass - -def md5_H(x: t.CUInt32T, y: t.CUInt32T, z: t.CUInt32T) -> t.CUInt32T: pass - -def md5_I(x: t.CUInt32T, y: t.CUInt32T, z: t.CUInt32T) -> t.CUInt32T: pass - -def md5_rotl(x: t.CUInt32T, n: t.CInt) -> t.CUInt32T: pass - - -md5_T: t.CExtern | t.CArray[t.CUInt32T, 64] -md5_S: t.CExtern | t.CArray[t.CInt, 64] - -@t.Object -class md5: - state: t.CArray[t.CUInt32T, 4] - count: t.CUInt64T - buf: t.CArray[t.CUInt8T, MD5_BLOCK_LEN] - def __init__(self: md5) -> t.CInt: pass - def transform(self: md5, block: t.CUInt8T | t.CPtr) -> t.CInt: pass - def update(self: md5, s: str) -> t.CInt: pass - def final(self: md5, out: t.CArray[t.CUInt8T, MD5_DIGEST_LEN]) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/cdff0d7b58fc935b.doc.json b/.transpyc_cache/cdff0d7b58fc935b.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/cdff0d7b58fc935b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/cdff0d7b58fc935b.pyi b/.transpyc_cache/cdff0d7b58fc935b.pyi deleted file mode 100644 index 0fb8976..0000000 --- a/.transpyc_cache/cdff0d7b58fc935b.pyi +++ /dev/null @@ -1,14 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import t, c -import ctraits -import stdio -import testcheck - -@t.CExport -def main() -> int: pass diff --git a/.transpyc_cache/cfc83b830141b00e.doc.json b/.transpyc_cache/cfc83b830141b00e.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/cfc83b830141b00e.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/cfc83b830141b00e.pyi b/.transpyc_cache/cfc83b830141b00e.pyi deleted file mode 100644 index 5af877f..0000000 --- a/.transpyc_cache/cfc83b830141b00e.pyi +++ /dev/null @@ -1,27 +0,0 @@ -""" -Auto-generated Python stub file from zc.config.py -Module: zc.config -""" - - -import t, c - -POSMAX: t.CDefine = 100 -MAX_RETRY: t.CDefine = 5 -BUFFER_SIZE: t.CDefine = 256 -PI: t.CDefine = 3.14159 -EULER: t.CDefine = 2.71828 -TRUE: t.CDefine = 1 -FALSE: t.CDefine = 0 -NULL: t.CDefine = 0 -MATH_OFFSET: t.CDefine = 10 -MATH_SCALE: t.CDefine = 2 -THRESHOLD: t.CDefine = 50 -LOOP_LIMIT: t.CDefine = 20 -SHIFT_AMOUNT: t.CDefine = 2 -MASK_VALUE: t.CDefine = 0xFF -BIT_RANGE: t.CDefine = 4 -EXPONENT_BASE: t.CDefine = 3 -MODULO_DIVISOR: t.CDefine = 7 -SCALE_SHIFT: t.CDefine = 4 -HALF_SCALE: t.CDefine = 0.5 \ No newline at end of file diff --git a/.transpyc_cache/d152115b49e50218.pyi b/.transpyc_cache/d152115b49e50218.pyi deleted file mode 100644 index 1e7a152..0000000 --- a/.transpyc_cache/d152115b49e50218.pyi +++ /dev/null @@ -1,42 +0,0 @@ -""" -Auto-generated Python stub file from os._posix.py -Module: os._posix -""" - - -import t, c -from stdint import * -import posix -import memhub -import stdlib - -MAX_PATH_LEN: t.CDefine = 4096 -_mbuddy: t.CExtern | memhub.MemBuddy | t.CPtr - -def _stat(path: str) -> posix.Stat | t.CPtr: pass - -def exists(path: str) -> bool: pass - -def isdir(path: str) -> bool: pass - -def isfile(path: str) -> bool: pass - -def getsize(path: str) -> t.CInt64T: pass - -def getcwd_impl() -> str: pass - -def chdir_impl(path: str) -> int: pass - -def mkdir_impl(path: str) -> int: pass - -def remove(path: str) -> int: pass - -def rmdir_impl(path: str) -> int: pass - -def rename_impl(old_path: str, new_path: str) -> int: pass - -def chmod_impl(path: str, mode: int) -> int: pass - -def listdir(path: str, out_names: str, max_count: ULONG) -> ULONG: pass - -def system_impl(cmd: str) -> int: pass diff --git a/.transpyc_cache/d1599ecbac5b6586.doc.json b/.transpyc_cache/d1599ecbac5b6586.doc.json deleted file mode 100644 index a6b0616..0000000 --- a/.transpyc_cache/d1599ecbac5b6586.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"TranslateFileGetTrans": "翻译文件,返回 Translator 对象(调用者负责 dump_ir),None 失败\n\n current_package: 当前文件所属包名(用于解析相对导入),None 表示顶级模块\n ", "ensure_dir": "递归创建目录(类似 mkdir -p),目录已存在视为成功\n\n Args:\n path: 目录路径(支持 / 或 \\ 分隔符)\n\n Returns:\n 0 成功(包括目录已存在),非 0 失败\n ", "write_ir_to_file": "将 IR 缓冲区写入 .ll 文件\n\n Args:\n ir_buf: IR 文本缓冲区\n ir_len: IR 文本长度\n output_dir: 输出目录(temp 或 output)\n module_name: 模块名(如 \"main\")\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_ll_to_obj": "调用 llc 将 .ll 编译为 .obj\n\n Args:\n ir_path: .ll 文件路径\n output_dir: 输出目录\n module_name: 模块名(用于生成 .obj 文件名)\n cc_cmd: 编译器命令(如 \"llc\")\n cc_flags: 编译器参数(如 \"-filetype=obj -relocation-model=pic\")\n\n Returns:\n 0 成功,非 0 失败\n ", "collect_obj_files": "扫描 includes_binary_dir 目录,收集所有 .obj 文件路径到 out_buf\n\n Args:\n includes_binary_dir: includes.binary 目录路径\n out_buf: 输出缓冲区(用于存放空格分隔的 .obj 文件路径)\n out_size: 输出缓冲区大小\n\n Returns:\n 写入的字节数(不含 null 终止符),0 表示无文件或错误\n ", "link_obj_to_exe": "调用 clang++ 链接 .obj 为 .exe\n\n Args:\n output_dir: 输出目录(包含 .obj 文件)\n module_name: 模块名\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件名(如 \"test.exe\")\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_module_to_obj": "编译 IR 到 .obj(不链接)\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名(SHA1)\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n\n Returns:\n 0 成功,非 0 失败\n ", "link_objs_to_exe": "链接多个 .obj 文件为 .exe\n\n Args:\n obj_paths: 空格分隔的 .obj 文件完整路径字符串\n obj_paths_len: obj_paths 长度\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件完整路径\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "run_pipeline": "执行完整编译管线\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n linker_cmd: 链接器命令\n linker_flags: 链接器参数\n linker_output: 输出文件名\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n BuildResult 对象\n "} \ No newline at end of file diff --git a/.transpyc_cache/d1599ecbac5b6586.pyi b/.transpyc_cache/d1599ecbac5b6586.pyi deleted file mode 100644 index c155594..0000000 --- a/.transpyc_cache/d1599ecbac5b6586.pyi +++ /dev/null @@ -1,51 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.BuildPipeline.py -Module: lib.core.BuildPipeline -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import subprocess -import viperlib -import ast -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesImports as HandlesImports - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 - -def TranslateFileGetTrans(mb: memhub.MemBuddy | t.CPtr, file_path: str, sha1_val: str, current_package: str) -> HandlesTranslator.Translator | t.CPtr: pass - - -class BuildResult: - Success: t.CInt - OutputPath: str - ErrorMsg: str - def __new__(self: BuildResult) -> t.CPtr: pass - def __init__(self: BuildResult) -> t.CInt: pass - -def ensure_dir(path: str) -> int: pass - -def write_ir_to_file(ir_buf: bytes, ir_len: t.CSizeT, output_dir: str, module_name: str) -> int: pass - -def compile_ll_to_obj(ir_path: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def collect_obj_files(includes_binary_dir: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass - -def link_obj_to_exe(output_dir: str, module_name: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def compile_module_to_obj(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def link_objs_to_exe(obj_paths: str, obj_paths_len: t.CSizeT, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def run_pipeline(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> BuildResult | t.CPtr: pass diff --git a/.transpyc_cache/d28c16ea0550c4a4.doc.json b/.transpyc_cache/d28c16ea0550c4a4.doc.json deleted file mode 100644 index dda4745..0000000 --- a/.transpyc_cache/d28c16ea0550c4a4.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"get_func_name": "从函数节点提取函数名", "escape_llvm_string": "将字符串转换为 LLVM IR 字符串字面量 c\"...\\00\" ", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "get_llvm_float_bits": "获取 LLVM 浮点类型的位宽,非浮点类型返回 0", "is_ptr_type": "检查 ty 是否是 Ptr 类型,返回 1=是, 0=否", "_deref_if_ptr_ptr": "如果 obj_ptr 是 Ptr(Ptr(...)),load 解引用获取内层指针", "coerce_to_type": "将 val 强制转换为 target_ty\n\n 整数: sext(扩展)/ trunc(截断)\n 浮点: fpext(扩展)/ fptrunc(截断)\n int→float: sitofp\n float→int: fptosi\n ", "create_global_string": "创建全局字符串常量并返回 i8* bitcast", "translate_constant": "翻译常量(int/str/bool)", "_infer_elem_type_from_value": "从 LLVM Value 的类型推断 list 元素类型名", "_find_pool_var": "查找上下文中的 pool 变量,返回 alloca 或 None", "translate_list_literal": "翻译 list 字面量 [a, b, c] → list[T](pool) + append 序列", "translate_value": "翻译值表达式为 LLVM Value", "translate_compare": "翻译比较表达式,返回 i1 结果", "translate_unaryop": "翻译一元运算(-x, +x, not x, ~x)", "translate_boolop": "翻译布尔运算(and/or)的短路求值,返回 i1", "translate_name_value": "翻译变量引用(Name 节点)→ load", "ExprHandle": "表达式处理器:继承 Mixin 获得 Trans 回指针", "ExprHandle.HandleValue": "翻译值表达式,从 self.Trans 获取共享状态", "list_getitem_inline": "内联生成 list __getitem__ 逻辑,返回元素地址 (i8*)", "_list_elem_type_from_name": "从 list 类型名提取元素 LLVM 类型", "list_setitem_inline": "内联生成 list __setitem__ 逻辑,返回 0", "is_list_subscript": "检查 Subscript 节点是否是 list[T] 类型,返回 list 对象指针或 None", "translate_subscript": "翻译下标表达式,返回加载的元素值", "translate_attribute": "翻译属性访问,返回加载的字段值", "get_subscript_ptr": "获取下标表达式的元素指针(用于赋值 lhs)", "get_attribute_ptr": "获取属性访问的字段指针(用于赋值 lhs)"} \ No newline at end of file diff --git a/.transpyc_cache/d28c16ea0550c4a4.pyi b/.transpyc_cache/d28c16ea0550c4a4.pyi deleted file mode 100644 index 60fab85..0000000 --- a/.transpyc_cache/d28c16ea0550c4a4.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExpr.py -Module: lib.core.Handles.HandlesExpr -""" - - -import t, c -from stdint import * -import ast -import memhub -import string -import llvmlite -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExprOps as HandlesExprOps -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesNonlocal as HandlesNonlocal -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -def get_func_name(func_node: ast.AST | t.CPtr) -> str: pass - -def escape_llvm_string(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def get_llvm_float_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def is_ptr_type(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _deref_if_ptr_ptr(builder: llvmlite.IRBuilder | t.CPtr, obj_ptr: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def coerce_to_type(builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def create_global_string(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, str_val: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_constant(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_elem_type_from_value(pool: memhub.MemBuddy | t.CPtr, value: llvmlite.Value | t.CPtr) -> str: pass - -def _find_pool_var(trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_list_literal(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, elem_type_name: str, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_compare(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_unaryop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_boolop(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_name_value(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -@t.NoVTable -class ExprHandle(HandlesBase.Mixin): - def __init__(self: ExprHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleValue(self: ExprHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def NewExprHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprHandle | t.CPtr: pass - -def list_getitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _list_elem_type_from_name(pool: memhub.MemBuddy | t.CPtr, struct_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def list_setitem_inline(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, lm_obj: llvmlite.Value | t.CPtr, idx_val: llvmlite.Value | t.CPtr, rhs_val: llvmlite.Value | t.CPtr) -> int: pass - -def is_list_subscript(node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_subscript(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_attribute(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_subscript_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def get_attribute_ptr(builder: llvmlite.IRBuilder | t.CPtr, pool: memhub.MemBuddy | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass diff --git a/.transpyc_cache/d33c3f139167d275.doc.json b/.transpyc_cache/d33c3f139167d275.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/d33c3f139167d275.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/d33c3f139167d275.pyi b/.transpyc_cache/d33c3f139167d275.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/d33c3f139167d275.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/d358712e53b4da98.doc.json b/.transpyc_cache/d358712e53b4da98.doc.json deleted file mode 100644 index ac292ab..0000000 --- a/.transpyc_cache/d358712e53b4da98.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"ForHandle": "for 循环语句处理器:继承 Mixin 获得 Trans 回指针", "ForHandle.Handle": "翻译 for i in range(...) 循环语句", "ForHandle._handle_ptr_iter": "指针迭代: for x in ptr: 直到解引用为空"} \ No newline at end of file diff --git a/.transpyc_cache/d358712e53b4da98.pyi b/.transpyc_cache/d358712e53b4da98.pyi deleted file mode 100644 index 08527b9..0000000 --- a/.transpyc_cache/d358712e53b4da98.pyi +++ /dev/null @@ -1,28 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesFor.py -Module: lib.core.Handles.HandlesFor -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesBody as HandlesBody -import lib.core.Handles.HandlesType as HandlesType - -@t.NoVTable -class ForHandle(HandlesBase.Mixin): - def __init__(self: ForHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: ForHandle, node: ast.AST | t.CPtr) -> int: pass - def _handle_ptr_iter(self: ForHandle, for_node: ast.For | t.CPtr, var_name: str) -> int: pass - -def NewForHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ForHandle | t.CPtr: pass diff --git a/.transpyc_cache/d541ade6afb689a5.pyi b/.transpyc_cache/d541ade6afb689a5.pyi deleted file mode 100644 index fd4ddf5..0000000 --- a/.transpyc_cache/d541ade6afb689a5.pyi +++ /dev/null @@ -1,44 +0,0 @@ -""" -Auto-generated Python stub file from zlib.zhuff.py -Module: zlib.zhuff -""" - - -from stdint import * -import zlib.zdef as zdef -import memhub -import t, c - -ZHUFF_MAX_CODES: t.CDefine = 288 -ZHUFF_MAX_BITS: t.CDefine = 15 - -class zhuff_code: - code: UINT - bits: t.CInt -@t.Object -class zhuff_tree: - pool: memhub.MemManager | t.CPtr - codes: t.CArray[zhuff_code, ZHUFF_MAX_CODES] - count: t.CInt - max_bits: t.CInt - def __init__(self: zhuff_tree) -> t.CInt: pass - def build_codes(self: zhuff_tree, freqs: INTPTR, count: t.CInt, max_bits: t.CInt) -> t.CInt: pass - def build_fixed_lit_tree(self: zhuff_tree) -> t.CInt: pass - def build_fixed_dist_tree(self: zhuff_tree) -> t.CInt: pass - def encode_symbol(self: zhuff_tree, symbol: int, writer: zdef.zbit_writer | t.CPtr) -> t.CInt: pass - def build_code_lengths(self: zhuff_tree, lengths: t.CInt | t.CPtr, freqs: t.CInt | t.CPtr, count: t.CInt, max_bits: t.CInt) -> t.CInt: pass - def get_fixed_lit_lengths(self: zhuff_tree, lengths: INTPTR) -> t.CInt: pass - def get_fixed_dist_lengths(self: zhuff_tree, lengths: INTPTR) -> t.CInt: pass - def build_tree_from_lengths(self: zhuff_tree, lengths: INTPTR, count: t.CInt, max_bits: t.CInt) -> t.CInt: pass -class zhuff_decode_node: - children: t.CArray[t.CInt, 2] - symbol: t.CInt -@t.Object -class zhuff_decode_tree: - pool: memhub.MemManager | t.CPtr - nodes: t.CArray[zhuff_decode_node, 2 * ZHUFF_MAX_CODES] - node_count: t.CInt - root: t.CInt - def __init__(self: zhuff_decode_tree) -> t.CInt: pass - def build_decode_tree(self: zhuff_decode_tree, ht: zhuff_tree | t.CPtr) -> t.CInt: pass - def decode_symbol(self: zhuff_decode_tree, reader: zdef.zbit_reader | t.CPtr) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/d63d2c2a2bd9bd2a.pyi b/.transpyc_cache/d63d2c2a2bd9bd2a.pyi deleted file mode 100644 index cc9d917..0000000 --- a/.transpyc_cache/d63d2c2a2bd9bd2a.pyi +++ /dev/null @@ -1,10 +0,0 @@ -""" -Auto-generated Python stub file from zlib.__init__.py -Module: zlib.__init__ -""" - -import t -import c - - -from .pyzlib import * \ No newline at end of file diff --git a/.transpyc_cache/d7662500f1c2c0ff.doc.json b/.transpyc_cache/d7662500f1c2c0ff.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/d7662500f1c2c0ff.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/d7662500f1c2c0ff.pyi b/.transpyc_cache/d7662500f1c2c0ff.pyi deleted file mode 100644 index 03248a5..0000000 --- a/.transpyc_cache/d7662500f1c2c0ff.pyi +++ /dev/null @@ -1,12 +0,0 @@ -""" -Auto-generated Python stub file from testcheck_test.py -Module: testcheck_test -""" - - -import stdio -import t, c -import string -import testcheck - -def testcheck_test() -> int: pass diff --git a/.transpyc_cache/d7e3386b828acb66.pyi b/.transpyc_cache/d7e3386b828acb66.pyi deleted file mode 100644 index aa17fc3..0000000 --- a/.transpyc_cache/d7e3386b828acb66.pyi +++ /dev/null @@ -1,115 +0,0 @@ -""" -Auto-generated Python stub file from socket.py -Module: socket -""" - - -import t, c -from stdint import * -import string -import platmacro -import stdio -import w32.winsock2 - -AF_INET: t.CDefine = 2 -AF_INET6: t.CDefine = 10 -SOCK_STREAM: t.CDefine = 1 -SOCK_DGRAM: t.CDefine = 2 -SOCK_RAW: t.CDefine = 3 -IPPROTO_TCP: t.CDefine = 6 -IPPROTO_UDP: t.CDefine = 17 -SOL_SOCKET: t.CDefine = 1 -SO_RCVTIMEO: t.CDefine = 20 -SO_SNDTIMEO: t.CDefine = 21 -SO_REUSEADDR: t.CDefine = 2 -INADDR_ANY: t.CDefine = 0 -SOCKET_ERROR: t.CDefine = -1 -INVALID_SOCKET: t.CDefine = -1 -SOCKET_DEFAULT_TIMEOUT: t.CDefine = 0 - -class SocketAddr: - family: u16 - port: u16 - addr: u32 - zero: u64 -class HostEnt: - h_name: CHARPTR - h_aliases: CHARPTR - h_addrtype: INT - h_length: INT - h_addr_list: CHARPTR -class timeval: - tv_sec: INT - tv_usec: INT - -def socket(family: INT, type: INT, protocol: INT) -> u64 | t.CExtern | t.CExport: pass - -def connect(fd: u64, addr: SocketAddr | t.CPtr, addrlen: INT) -> INT | t.CExtern | t.CExport: pass - -def send(fd: u64, buf: t.CVoid | t.CPtr, len: INT, flags: INT) -> INT | t.CExtern | t.CExport: pass - -def recv(fd: u64, buf: t.CVoid | t.CPtr, len: INT, flags: INT) -> INT | t.CExtern | t.CExport: pass - -def bind(fd: u64, addr: SocketAddr | t.CPtr, addrlen: INT) -> INT | t.CExtern | t.CExport: pass - -def listen(fd: u64, backlog: INT) -> INT | t.CExtern | t.CExport: pass - -def accept(fd: u64, addr: SocketAddr | t.CPtr, addrlen: INT | t.CPtr) -> u64 | t.CExtern | t.CExport: pass - -def setsockopt(fd: u64, level: INT, optname: INT, optval: t.CVoid | t.CPtr, optlen: INT) -> INT | t.CExtern | t.CExport: pass - -def gethostbyname(name: t.CChar | t.CConst | t.CPtr) -> HostEnt | t.CPtr | t.CExtern | t.CExport: pass - -def ntohs(netshort: u16) -> u16 | t.CExtern | t.CExport: pass - -def htons(hostshort: u16) -> u16 | t.CExtern | t.CExport: pass - -def close(fd: u64) -> INT | t.CExtern | t.CExport: pass - -def _CloseFd(fd: INT) -> INT: pass - -def _MakeAddr(host: str, port: INT) -> SocketAddr: pass - -def _ParseIPv4(ip_str: str, out_addr: u32 | t.CPtr) -> bool: pass - - -class Socket: - fd: INT - family: INT - type: INT - protocol: INT - def __init__(self: Socket, family: INT, type: INT, protocol: INT) -> t.CInt: pass - def connect(self: Socket, host: str, port: INT) -> INT: pass - def send(self: Socket, data: t.CVoid | t.CPtr, length: INT) -> INT: pass - def recv(self: Socket, buf: t.CVoid | t.CPtr, bufsize: INT) -> INT: pass - def sendall(self: Socket, data: t.CVoid | t.CPtr, length: INT) -> INT: pass - def close(self: Socket) -> INT: pass - def bind(self: Socket, host: str, port: INT) -> INT: pass - def listen(self: Socket, backlog: INT) -> INT: pass - def accept(self: Socket, out_client: 'Socket' | t.CPtr) -> INT: pass - def settimeout(self: Socket, timeout_ms: INT) -> INT: pass - def fileno(self: Socket) -> INT: pass - -def SocketInit() -> INT: pass - -def SocketCleanup() -> INT: pass - -def SocketCreate(family: INT, type: INT, protocol: INT, out_sock: Socket | t.CPtr) -> INT: pass - -def SocketConnect(sock: Socket | t.CPtr, host: str, port: INT) -> INT: pass - -def SocketSend(sock: Socket | t.CPtr, data: t.CVoid | t.CPtr, length: INT) -> INT: pass - -def SocketRecv(sock: Socket | t.CPtr, buf: t.CVoid | t.CPtr, bufsize: INT) -> INT: pass - -def SocketClose(sock: Socket | t.CPtr) -> INT: pass - -def SocketBind(sock: Socket | t.CPtr, host: str, port: INT) -> INT: pass - -def SocketListen(sock: Socket | t.CPtr, backlog: INT) -> INT: pass - -def SocketAccept(sock: Socket | t.CPtr, out_client: Socket | t.CPtr) -> INT: pass - -def SocketSetTimeout(sock: Socket | t.CPtr, timeout_ms: INT) -> INT: pass - -def SocketIsValid(sock: Socket | t.CPtr) -> bool: pass diff --git a/.transpyc_cache/d855b3e66d1d6522.doc.json b/.transpyc_cache/d855b3e66d1d6522.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/d855b3e66d1d6522.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/d855b3e66d1d6522.pyi b/.transpyc_cache/d855b3e66d1d6522.pyi deleted file mode 100644 index 09ce9d4..0000000 --- a/.transpyc_cache/d855b3e66d1d6522.pyi +++ /dev/null @@ -1,66 +0,0 @@ -""" -Auto-generated Python stub file from __zlib.test_pyzlib.py -Module: __zlib.test_pyzlib -""" - - -from stdint import * -import pyzlib -import zhuff -import zdef -from stdio import printf -import stdlib -from string import strlen -import string -import t, c - -test_passed: t.CExtern | t.CInt -test_failed: t.CExtern | t.CInt - -def check(name: str, condition: t.CInt, detail: str) -> t.CInt: pass - -def print_hex_test(data: BYTEPTR, length: t.CSizeT, max_show: t.CSizeT) -> t.CInt: pass - -def print_separator() -> t.CInt: pass - -def section_header(title: str) -> t.CInt: pass - -def section_footer() -> t.CInt: pass - -def test_version() -> t.CInt: pass - -def test_compress_decompress() -> t.CInt: pass - -def test_compress_levels() -> t.CInt: pass - -def test_compressobj() -> t.CInt: pass - -def test_decompressobj() -> t.CInt: pass - -def test_decompressobj_max_length() -> t.CInt: pass - -def test_decompressobj_unused_data() -> t.CInt: pass - -def test_compress_copy() -> t.CInt: pass - -def test_decompress_copy() -> t.CInt: pass - -def test_adler32() -> t.CInt: pass - -def test_crc32() -> t.CInt: pass - -def test_empty_compress() -> t.CInt: pass - -def test_gzip_format() -> t.CInt: pass - -def test_raw_deflate() -> t.CInt: pass - -def test_zdict() -> t.CInt: pass - -def test_huffman_tree() -> t.CInt: pass - -def test_error_handling() -> t.CInt: pass - -def test_constants() -> t.CInt: pass - -def main123456() -> t.CInt: pass diff --git a/.transpyc_cache/d9322f0db660edd8.doc.json b/.transpyc_cache/d9322f0db660edd8.doc.json deleted file mode 100644 index 4dba15e..0000000 --- a/.transpyc_cache/d9322f0db660edd8.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"ReturnHandle": "Return 语句处理器:继承 Mixin 获得 Trans 回指针", "ReturnHandle.Handle": "翻译 Return 语句"} \ No newline at end of file diff --git a/.transpyc_cache/d9322f0db660edd8.pyi b/.transpyc_cache/d9322f0db660edd8.pyi deleted file mode 100644 index abcbbff..0000000 --- a/.transpyc_cache/d9322f0db660edd8.pyi +++ /dev/null @@ -1,23 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesReturn.py -Module: lib.core.Handles.HandlesReturn -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar - -@t.NoVTable -class ReturnHandle(HandlesBase.Mixin): - def __init__(self: ReturnHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def Handle(self: ReturnHandle, node: ast.AST | t.CPtr) -> int: pass - -def NewReturnHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ReturnHandle | t.CPtr: pass diff --git a/.transpyc_cache/da80633346bb66e2.doc.json b/.transpyc_cache/da80633346bb66e2.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/da80633346bb66e2.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/da80633346bb66e2.pyi b/.transpyc_cache/da80633346bb66e2.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/da80633346bb66e2.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/db434883fc668c7c.doc.json b/.transpyc_cache/db434883fc668c7c.doc.json deleted file mode 100644 index 45fcbeb..0000000 --- a/.transpyc_cache/db434883fc668c7c.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_generic_context": "设置泛型特化上下文(进入泛型类方法体翻译时调用)", "clear_generic_context": "清除泛型特化上下文(离开泛型类方法体翻译时调用)", "resolve_generic_type_name": "如果 name 是泛型类型参数,返回对应的具体类型名;否则返回 name 本身\n\n 用于表达式中的 T 替换(如 T.__sizeof__() → int.__sizeof__())\n ", "_get_type_name_from_annotation": "从类型注解节点提取类型名(支持 Name/Attribute/BinOp)", "_parse_type_string": "将类型名字符串解析为 AST 节点", "set_current_file": "设置当前编译的文件名(供报错使用)", "_read_source_line": "从源文件读取第 lineno 行内容", "fatal_error": "以 Python 风格报错并退出(带源代码行)", "fatal_type_error": "以 Python 风格报错并退出(fatal_error 的别名)", "map_t_type": "将 t.CXxx / c.CXxx 类型名映射到 LLVMType\n\n 注意: t.CChar | t.CPtr = i8* = str = bytes\n ", "_is_t_attr": "检测节点是否是 t.attr_name 形式", "extract_class_name_from_annotation": "从类型注解 AST 中提取类名,返回 None=无法提取", "resolve_annotation_type": "解析类型注解节点为 LLVMType\n\n Args:\n pool: 内存分配器\n node: 类型注解 AST 节点(Name 或 Attribute)\n imported_modules: 已导入模块名字符串(空格分隔)\n from_imports: from-import 映射字符串(\"name:module name:module\" 格式)\n ", "has_decorator_marker": "检测类型注解中是否包含指定的装饰器标记", "is_pass_body": "检测函数体是否为 pass(空体或仅含 pass 语句)", "get_llvm_type_bits": "获取 LLVM 整数类型的位宽,非整数类型返回 0", "infer_expr_type": "推断表达式的 LLVM 类型\n\n param_types 格式: \"name:bits,name:bits,...\"\n ", "infer_return_type": "扫描函数体中的 return 语句,推断返回类型", "build_param_types_str": "构建参数类型编码字符串 \"name:bits,name:bits,...\" ", "_strappend": "将 src 追加到 dst 末尾"} \ No newline at end of file diff --git a/.transpyc_cache/db434883fc668c7c.pyi b/.transpyc_cache/db434883fc668c7c.pyi deleted file mode 100644 index d6de8a3..0000000 --- a/.transpyc_cache/db434883fc668c7c.pyi +++ /dev/null @@ -1,66 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesType.py -Module: lib.core.Handles.HandlesType -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import sys -import stdlib -import viperlib -import w32.fileio as fileio -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesStruct as HandlesStruct - -_g_current_file: t.CExtern | str -_g_generic_tp_names: t.CExtern | list[str] | t.CPtr -_g_generic_type_args: t.CExtern | list[str] | t.CPtr - -def set_generic_context(tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> t.CInt: pass - -def clear_generic_context() -> t.CInt: pass - -def resolve_generic_type_name(name: str) -> str: pass - -def _get_type_name_from_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _parse_type_string(pool: memhub.MemBuddy | t.CPtr, type_str: str, ctx: t.CInt) -> ast.AST | t.CPtr: pass - -def set_current_file(file_path: str) -> t.CInt: pass - - -_SRC_BUF_SIZE: t.CDefine = 262144 - -def _read_source_line(file_path: str, lineno: int) -> str: pass - -def fatal_error(node: ast.AST | t.CPtr, msg: str) -> t.CInt: pass - -def fatal_type_error(node: ast.AST | t.CPtr, msg: str) -> t.CInt: pass - -def map_t_type(pool: memhub.MemBuddy | t.CPtr, type_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_t_attr(node: ast.AST | t.CPtr, attr_name: str, imported_modules: str) -> int: pass - -def extract_class_name_from_annotation(node: ast.AST | t.CPtr, imported_modules: str) -> str: pass - -def resolve_annotation_type(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def has_decorator_marker(node: ast.AST | t.CPtr, marker_name: str) -> int: pass - -def is_pass_body(body: list[ast.AST | t.CPtr] | t.CPtr) -> int: pass - -def get_llvm_type_bits(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def infer_expr_type(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, param_types: str) -> llvmlite.LLVMType | t.CPtr: pass - -def infer_return_type(pool: memhub.MemBuddy | t.CPtr, body: list[ast.AST | t.CPtr] | t.CPtr, param_types: str) -> llvmlite.LLVMType | t.CPtr: pass - -def build_param_types_str(pool: memhub.MemBuddy | t.CPtr, args_node: ast.AST | t.CPtr) -> str: pass - -def _strappend(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass diff --git a/.transpyc_cache/db4aafce81f39b32.doc.json b/.transpyc_cache/db4aafce81f39b32.doc.json deleted file mode 100644 index c3a1e25..0000000 --- a/.transpyc_cache/db4aafce81f39b32.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"SrcFileEntry": "源文件条目", "RunMultiFileProject": "多文件项目编译\n\n Returns: 0 成功,非 0 失败\n "} \ No newline at end of file diff --git a/.transpyc_cache/db4aafce81f39b32.pyi b/.transpyc_cache/db4aafce81f39b32.pyi deleted file mode 100644 index ad12e1f..0000000 --- a/.transpyc_cache/db4aafce81f39b32.pyi +++ /dev/null @@ -1,39 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Phase2.py -Module: lib.core.Phase2 -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import viperlib -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import sys -import ast -import llvmlite -import subprocess -import argparse -import lib.core.VLogger as VLogger -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.BuildPipeline as BuildPipeline -import lib.core.StubMerger as StubMerger -import lib.Projectrans.Utils as Utils -import lib.Projectrans.Config as Config - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 -MAX_SRC_FILES: t.CDefine = 32 - -@t.NoVTable -class SrcFileEntry: - Path: str - Sha1: str - -def RunMultiFileProject(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, output_dir: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str, includes_dir: str, do_phase1: int, do_phase2: int, log: VLogger.Logger | t.CPtr, args: argparse.ParsedArgs | t.CPtr) -> int: pass diff --git a/.transpyc_cache/db7c4a8f09d02a17.doc.json b/.transpyc_cache/db7c4a8f09d02a17.doc.json deleted file mode 100644 index 56e8c7e..0000000 --- a/.transpyc_cache/db7c4a8f09d02a17.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"RunPhase1": "Phase1: 扫描 includes 目录,按需翻译并生成 stub"} \ No newline at end of file diff --git a/.transpyc_cache/db7c4a8f09d02a17.pyi b/.transpyc_cache/db7c4a8f09d02a17.pyi deleted file mode 100644 index c2761c1..0000000 --- a/.transpyc_cache/db7c4a8f09d02a17.pyi +++ /dev/null @@ -1,32 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Phase1.py -Module: lib.core.Phase1 -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import viperlib -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import ast -import llvmlite -import lib.core.VLogger as VLogger -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.IncludesScanner as IncludesScanner -import lib.core.StubMerger as StubMerger -import lib.Projectrans.Config as Config - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 - -def RunPhase1(mb: memhub.MemBuddy | t.CPtr, includes_dir: str, temp_dir: str, log: VLogger.Logger | t.CPtr) -> int: pass diff --git a/.transpyc_cache/dd19090b337e9bea.doc.json b/.transpyc_cache/dd19090b337e9bea.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/dd19090b337e9bea.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/dd19090b337e9bea.pyi b/.transpyc_cache/dd19090b337e9bea.pyi deleted file mode 100644 index 898995b..0000000 --- a/.transpyc_cache/dd19090b337e9bea.pyi +++ /dev/null @@ -1,41 +0,0 @@ -""" -Auto-generated Python stub file from __zlib.zhuff.py -Module: __zlib.zhuff -""" - - -from stdint import * -import zdef -import t, c - -ZHUFF_MAX_CODES: t.CDefine = 288 -ZHUFF_MAX_BITS: t.CDefine = 15 - -class zhuff_code: - code: UINT - bits: t.CInt -@t.Object -class zhuff_tree: - codes: t.CArray[zhuff_code, ZHUFF_MAX_CODES] - count: t.CInt - max_bits: t.CInt - def __init__(self: zhuff_tree) -> t.CInt: pass - def build_codes(self: zhuff_tree, freqs: INTPTR, count: t.CInt, max_bits: t.CInt) -> t.CInt: pass - def build_fixed_lit_tree(self: zhuff_tree) -> t.CInt: pass - def build_fixed_dist_tree(self: zhuff_tree) -> t.CInt: pass - def encode_symbol(self: zhuff_tree, symbol: int, writer: zdef.zbit_writer | t.CPtr) -> t.CInt: pass - def build_code_lengths(self: zhuff_tree, lengths: t.CInt | t.CPtr, freqs: t.CInt | t.CPtr, count: t.CInt, max_bits: t.CInt) -> t.CInt: pass - def get_fixed_lit_lengths(self: zhuff_tree, lengths: INTPTR) -> t.CInt: pass - def get_fixed_dist_lengths(self: zhuff_tree, lengths: INTPTR) -> t.CInt: pass - def build_tree_from_lengths(self: zhuff_tree, lengths: INTPTR, count: t.CInt, max_bits: t.CInt) -> t.CInt: pass -class zhuff_decode_node: - children: t.CArray[t.CInt, 2] - symbol: t.CInt -@t.Object -class zhuff_decode_tree: - nodes: t.CArray[zhuff_decode_node, 2 * ZHUFF_MAX_CODES] - node_count: t.CInt - root: t.CInt - def __init__(self: zhuff_decode_tree) -> t.CInt: pass - def build_decode_tree(self: zhuff_decode_tree, ht: zhuff_tree | t.CPtr) -> t.CInt: pass - def decode_symbol(self: zhuff_decode_tree, reader: zdef.zbit_reader | t.CPtr) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/df4ee63d3fef30a0.doc.json b/.transpyc_cache/df4ee63d3fef30a0.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/df4ee63d3fef30a0.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/df4ee63d3fef30a0.pyi b/.transpyc_cache/df4ee63d3fef30a0.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/df4ee63d3fef30a0.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/e0009679269c6b63.doc.json b/.transpyc_cache/e0009679269c6b63.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/e0009679269c6b63.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/e0009679269c6b63.pyi b/.transpyc_cache/e0009679269c6b63.pyi deleted file mode 100644 index 1a43833..0000000 --- a/.transpyc_cache/e0009679269c6b63.pyi +++ /dev/null @@ -1,23 +0,0 @@ -""" -Auto-generated Python stub file from string_test.py -Module: string_test -""" - - -import stdio -import t, c -import string - -def test_strlen() -> t.CInt: pass - -def test_strcmp() -> t.CInt: pass - -def test_strncmp() -> t.CInt: pass - -def test_atoi() -> t.CInt: pass - -def test_strchr() -> t.CInt: pass - -def test_strstr() -> t.CInt: pass - -def string_test() -> int: pass diff --git a/.transpyc_cache/e0b84369e50c937c.pyi b/.transpyc_cache/e0b84369e50c937c.pyi deleted file mode 100644 index c10ea89..0000000 --- a/.transpyc_cache/e0b84369e50c937c.pyi +++ /dev/null @@ -1,93 +0,0 @@ -""" -Auto-generated Python stub file from llvmlite.__function.py -Module: llvmlite.__function -""" - - -import t, c -from stdint import * -import string -import viperlib -import memhub -import stdio -from linkedlist import GSListNode, GSList -from .__types import LLVMType, ParamNode, TypePrint - -class Line(GSListNode[Line]): - Buf: t.CChar | t.CPtr - Len: t.CSizeT -class BasicBlock(GSListNode[BasicBlock]): - Name: t.CChar | t.CPtr - Lines: GSList[Line] | t.CPtr - IsTerminated: t.CInt -class Param(GSListNode[Param]): - Ty: LLVMType | t.CPtr - Name: t.CChar | t.CPtr - Attrs: t.CChar | t.CPtr -class Function(GSListNode[Function]): - Name: t.CChar | t.CPtr - RetTy: LLVMType | t.CPtr - Params: GSList[Param] | t.CPtr - Blocks: GSList[BasicBlock] | t.CPtr - IsDeclared: t.CInt - IsVarArg: t.CInt - Attrs: t.CChar | t.CPtr - -LINE_SIZE: t.CDefine = 24 - -def new_line(pool: memhub.MemBuddy | t.CPtr, text: t.CChar | t.CPtr) -> Line | t.CPtr: pass - -def _new_gslist(pool: memhub.MemBuddy | t.CPtr, list_size: t.CSizeT) -> t.CPtr: pass - - -BLOCK_SIZE: t.CDefine = 32 - -def new_basic_block(pool: memhub.MemBuddy | t.CPtr, name: t.CChar | t.CPtr) -> BasicBlock | t.CPtr: pass - - -PARAM_SIZE: t.CDefine = 32 - -def new_param(pool: memhub.MemBuddy | t.CPtr, ty: LLVMType | t.CPtr, name: t.CChar | t.CPtr) -> Param | t.CPtr: pass - - -FUNC_SIZE: t.CDefine = 56 - -def new_function(pool: memhub.MemBuddy | t.CPtr, name: t.CChar | t.CPtr, ret_ty: LLVMType | t.CPtr) -> Function | t.CPtr: pass - -def function_add_param(func: Function | t.CPtr, param: Param | t.CPtr) -> t.CInt: pass - -def function_add_block(func: Function | t.CPtr, block: BasicBlock | t.CPtr) -> t.CInt: pass - -def function_move_block_to_end(func: Function | t.CPtr, block: BasicBlock | t.CPtr) -> t.CInt: pass - -def block_append_line(block: BasicBlock | t.CPtr, line: Line | t.CPtr) -> t.CInt: pass - -def block_append_text(pool: memhub.MemBuddy | t.CPtr, block: BasicBlock | t.CPtr, text: t.CChar | t.CPtr) -> t.CInt: pass - -def function_set_attrs(func: Function | t.CPtr, attrs: t.CChar | t.CPtr) -> t.CInt: pass - -def param_set_attrs(param: Param | t.CPtr, attrs: t.CChar | t.CPtr) -> t.CInt: pass - -def _ll_name_needs_quote(name: str) -> t.CInt: pass - -def FunctionPrint(buf: t.CChar | t.CPtr, size: t.CSizeT, func: Function | t.CPtr, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - -def _append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def function_get_name(func: Function | t.CPtr) -> t.CChar | t.CPtr: pass - -def function_get_ret_ty(func: Function | t.CPtr) -> LLVMType | t.CPtr: pass - -def function_get_params(func: Function | t.CPtr) -> GSList[Param] | t.CPtr: pass - -def function_get_param_head(func: Function | t.CPtr) -> Param | t.CPtr: pass - -def function_get_next(func: Function | t.CPtr) -> Function | t.CPtr: pass - -def function_is_declared(func: Function | t.CPtr) -> t.CInt: pass - -def param_get_name(param: Param | t.CPtr) -> t.CChar | t.CPtr: pass - -def param_get_ty(param: Param | t.CPtr) -> LLVMType | t.CPtr: pass - -def param_get_next(param: Param | t.CPtr) -> Param | t.CPtr: pass diff --git a/.transpyc_cache/e24a7f4a875f4518.doc.json b/.transpyc_cache/e24a7f4a875f4518.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/e24a7f4a875f4518.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/e24a7f4a875f4518.pyi b/.transpyc_cache/e24a7f4a875f4518.pyi deleted file mode 100644 index 2825744..0000000 --- a/.transpyc_cache/e24a7f4a875f4518.pyi +++ /dev/null @@ -1,13 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import t, c -import stdio -import vrandom -import testcheck - -def main() -> t.CInt: pass diff --git a/.transpyc_cache/e272d279f536a678.doc.json b/.transpyc_cache/e272d279f536a678.doc.json deleted file mode 100644 index 95e17f3..0000000 --- a/.transpyc_cache/e272d279f536a678.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/e272d279f536a678.pyi b/.transpyc_cache/e272d279f536a678.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/e272d279f536a678.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/e285a7afdd9d844f.doc.json b/.transpyc_cache/e285a7afdd9d844f.doc.json deleted file mode 100644 index 6b37383..0000000 --- a/.transpyc_cache/e285a7afdd9d844f.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/e285a7afdd9d844f.pyi b/.transpyc_cache/e285a7afdd9d844f.pyi deleted file mode 100644 index e470478..0000000 --- a/.transpyc_cache/e285a7afdd9d844f.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, args_head: llvmlite.Value | t.CPtr, arg_count: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/e306c57855054e23.doc.json b/.transpyc_cache/e306c57855054e23.doc.json deleted file mode 100644 index 6b37383..0000000 --- a/.transpyc_cache/e306c57855054e23.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/e306c57855054e23.pyi b/.transpyc_cache/e306c57855054e23.pyi deleted file mode 100644 index e470478..0000000 --- a/.transpyc_cache/e306c57855054e23.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, args_head: llvmlite.Value | t.CPtr, arg_count: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/e36333e2cadb713a.doc.json b/.transpyc_cache/e36333e2cadb713a.doc.json deleted file mode 100644 index 4a5f0f2..0000000 --- a/.transpyc_cache/e36333e2cadb713a.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"Load_project_config": "加载工程配置文件(project.vpj)\n\n Args:\n path: 配置文件路径\n\n Returns:\n 0 表示成功,非 0 表示失败\n ", "_join_path": "将相对路径与 project_dir 拼接为绝对路径\n\n - ./App + Test → Test/App\n - ./temp + Test → Test/temp\n - ../includes + Test → Test/../includes(OS 解析为 includes)\n - 绝对路径保持不变\n - None 返回 None\n ", "resolve_paths": "解析并规范化工程路径(src/temp/output/includes)\n\n 将 project.vpj 中的相对路径(以 ./ 开头)转换为基于 project_dir 的路径。\n\n Args:\n project_dir: 工程根目录(project.vpj 所在目录)\n\n Returns:\n 0 表示成功,非 0 表示失败\n ", "get_includes_binary_dir": "获取 includes.binary 目录路径(includes 目录 + .binary 后缀)\n\n includes 目录如 ../includes,则 includes.binary 为 ../includes.binary\n ", "print_config": "打印当前配置(调试用)"} \ No newline at end of file diff --git a/.transpyc_cache/e36333e2cadb713a.pyi b/.transpyc_cache/e36333e2cadb713a.pyi deleted file mode 100644 index eaefae9..0000000 --- a/.transpyc_cache/e36333e2cadb713a.pyi +++ /dev/null @@ -1,40 +0,0 @@ -""" -Auto-generated Python stub file from lib.Projectrans.Config.py -Module: lib.Projectrans.Config -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import viperlib -from json.__parser import parse as json_parse -from json import JsonValue, JSON_OBJECT, JSON_INT -import w32.fileio as fileio - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SourceDir: t.CExtern | str -TempDir: t.CExtern | str -OutputDir: t.CExtern | str -ProjectName: t.CExtern | str -ProjectVersion: t.CExtern | str -CompilerCmd: t.CExtern | str -LinkerCmd: t.CExtern | str -LinkerOutput: t.CExtern | str -TargetTriple: t.CExtern | str -TargetDataLayout: t.CExtern | str -SliceLevel: t.CExtern | t.CInt -StrictMode: t.CExtern | t.CInt -IncludesDir: t.CExtern | str - -def Load_project_config(path: str) -> int: pass - -def _join_path(rel: str, project_dir: str) -> str: pass - -def resolve_paths(project_dir: str) -> int: pass - -def get_includes_binary_dir() -> str: pass - -def print_config() -> t.CInt: pass diff --git a/.transpyc_cache/e3834089153af692.doc.json b/.transpyc_cache/e3834089153af692.doc.json deleted file mode 100644 index 47b20d9..0000000 --- a/.transpyc_cache/e3834089153af692.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_get_external_func_param_ty": "获取外部函数第 param_idx 个参数的期望类型,None 表示用字面量原类型\n\n 对 Win32 API 函数的所有非指针参数返回 i64,匹配 declare 中\n ULONG/SIZE_T 被统一翻译为 i64 的情况。\n ", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/e3834089153af692.pyi b/.transpyc_cache/e3834089153af692.pyi deleted file mode 100644 index 5214419..0000000 --- a/.transpyc_cache/e3834089153af692.pyi +++ /dev/null @@ -1,173 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _get_external_func_param_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str, param_idx: int) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/e3ac223bdaf94a0c.doc.json b/.transpyc_cache/e3ac223bdaf94a0c.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/e3ac223bdaf94a0c.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/e3ac223bdaf94a0c.pyi b/.transpyc_cache/e3ac223bdaf94a0c.pyi deleted file mode 100644 index 10d5c52..0000000 --- a/.transpyc_cache/e3ac223bdaf94a0c.pyi +++ /dev/null @@ -1,110 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - -import c - - -import t -from stdint import * -from stdio import printf -from stdlib import malloc -import testcheck - -class Rect: - width: t.CInt - height: t.CInt - def __new__(self: Rect, w: t.CInt, h: t.CInt) -> 'Rect' | t.CPtr: pass - def __init__(self: Rect, w: t.CInt, h: t.CInt) -> t.CInt: pass - @property - def area(self: Rect) -> t.CInt: pass - @property - def is_square(self: Rect) -> bool: pass - -def test_property_getter() -> t.CInt: pass - - -class Temperature: - _celsius: t.CDouble - def __new__(self: Temperature, celsius_val: t.CDouble) -> 'Temperature' | t.CPtr: pass - def __init__(self: Temperature, celsius_val: t.CDouble) -> t.CInt: pass - @property - def celsius(self: Temperature) -> t.CDouble: pass - @celsius.setter - def celsius(self: Temperature, val: t.CDouble) -> t.CInt: pass - @property - def fahrenheit(self: Temperature) -> t.CDouble: pass - -def test_property_setter() -> t.CInt: pass - - -class Counter: - _count: t.CInt - def __new__(self: Counter) -> 'Counter' | t.CPtr: pass - def __init__(self: Counter) -> t.CInt: pass - @property - def value(self: Counter) -> t.CInt: pass - @value.setter - def value(self: Counter, v: t.CInt) -> t.CInt: pass - -def test_property_getter_redef() -> t.CInt: pass - - -class Config: - _value: t.CInt - _deleted: t.CInt - def __new__(self: Config, v: t.CInt) -> 'Config' | t.CPtr: pass - def __init__(self: Config, v: t.CInt) -> t.CInt: pass - @property - def value(self: Config) -> t.CInt: pass - @value.setter - def value(self: Config, v: t.CInt) -> t.CInt: pass - @value.deleter - def value(self: Config) -> t.CInt: pass - def is_deleted(self: Config) -> bool: pass - -def test_property_deleter() -> t.CInt: pass - - -class MathUtils: - @staticmethod - def add(a: t.CInt, b: t.CInt) -> t.CInt: pass - @staticmethod - def max_val(a: t.CInt, b: t.CInt) -> t.CInt: pass - -def test_staticmethod() -> t.CInt: pass - - -class Point: - x: t.CDouble - y: t.CDouble - def __new__(self: Point, x: t.CDouble, y: t.CDouble) -> 'Point' | t.CPtr: pass - def __init__(self: Point, x: t.CDouble, y: t.CDouble) -> t.CInt: pass - @classmethod - def origin(cls: Point) -> Point: pass - @classmethod - def from_int(cls: Point, x: t.CInt, y: t.CInt) -> Point: pass - def dist_sq(self: Point) -> t.CDouble: pass - -def test_classmethod() -> t.CInt: pass - - -class Circle: - _radius: t.CDouble - def __new__(self: Circle, r: t.CDouble) -> 'Circle' | t.CPtr: pass - def __init__(self: Circle, r: t.CDouble) -> t.CInt: pass - @property - def radius(self: Circle) -> t.CDouble: pass - @radius.setter - def radius(self: Circle, val: t.CDouble) -> t.CInt: pass - @property - def area(self: Circle) -> t.CDouble: pass - @staticmethod - def is_unit(r: t.CDouble) -> bool: pass - @classmethod - def unit(cls: Circle) -> Circle: pass - -def test_combined() -> t.CInt: pass - -def main() -> t.CInt | t.CExport: pass diff --git a/.transpyc_cache/e3e7b6de8d7d8b03.pyi b/.transpyc_cache/e3e7b6de8d7d8b03.pyi deleted file mode 100644 index ac69b1b..0000000 --- a/.transpyc_cache/e3e7b6de8d7d8b03.pyi +++ /dev/null @@ -1,53 +0,0 @@ -""" -Auto-generated Python stub file from _dict.py -Module: _dict -""" - - -import t, c -import memhub -import string -import json -from stdint import * - -VARIANT_NONE: t.CDefine = 0 # 无类型/空值 -VARIANT_INT: t.CDefine = 1 # int (i64) -VARIANT_FLOAT: t.CDefine = 2 # float (f32) -VARIANT_DOUBLE: t.CDefine = 3 # double (f64) -VARIANT_STR: t.CDefine = 4 # str (i8*) -VARIANT_DICT: t.CDefine = 5 # dict* -VARIANT_LIST: t.CDefine = 6 # list* -VARIANT_BOOL: t.CDefine = 7 # bool (i1/i32) -VARIANT_PTR: t.CDefine = 8 # 自定义指针类型 -_VARIANT_SIZE: t.CDefine = 16 - -class dict: - __keys__: t.CPtr - __values__: t.CPtr - __count__: t.CSizeT = 0 - __capacity__: t.CSizeT = 8 - __mbuddy__: memhub.MemBuddy | t.CPtr - __iter_index__: t.CSizeT = 0 - def __new__(self: dict, mb: memhub.MemBuddy | t.CPtr) -> t.CPtr: pass - def __init__(self: dict, mb: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - def __len__(self: dict) -> t.CSizeT: pass - def _find(self: dict, key: str) -> t.CSizeT: pass - def __getitem__(self: dict, key: str) -> t.CPtr: pass - def __setitem__(self: dict, key: str, val: t.CNeedPtr) -> t.CInt: pass - def _set_variant_raw(self: dict, key: str, vtype: t.CInt, ptr: t.CPtr) -> t.CInt: pass - def set_int(self: dict, key: str, val: int) -> t.CInt: pass - def set_str(self: dict, key: str, val: str) -> t.CInt: pass - def set_float(self: dict, key: str, val: float) -> t.CInt: pass - def set_double(self: dict, key: str, val: t.CDouble) -> t.CInt: pass - def set_dict(self: dict, key: str, val: dict | t.CPtr) -> t.CInt: pass - def set_list(self: dict, key: str, val: t.CPtr) -> t.CInt: pass - def set_bool(self: dict, key: str, val: t.CInt) -> t.CInt: pass - def get_vtype(self: dict, key: str) -> t.CInt: pass - def get(self: dict, key: str, default: t.CPtr) -> t.CPtr: pass - def contains(self: dict, key: str) -> t.CInt: pass - def __iter__(self: dict) -> dict | t.CPtr: pass - def __next__(self: dict) -> str: pass - def to_json(self: dict, pool: memhub.MemManager | t.CPtr) -> json.JsonValue | t.CPtr: pass - def from_json(self: dict, pool: memhub.MemManager | t.CPtr, root: json.JsonValue | t.CPtr) -> t.CInt: pass - def dumps(self: dict, pool: memhub.MemManager | t.CPtr) -> str: pass - def loads(self: dict, pool: memhub.MemManager | t.CPtr, json_str: str) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/e3f3b9ed2a5030c6.doc.json b/.transpyc_cache/e3f3b9ed2a5030c6.doc.json deleted file mode 100644 index 95e17f3..0000000 --- a/.transpyc_cache/e3f3b9ed2a5030c6.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/e3f3b9ed2a5030c6.pyi b/.transpyc_cache/e3f3b9ed2a5030c6.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/e3f3b9ed2a5030c6.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/e445a2bb299d1b7d.doc.json b/.transpyc_cache/e445a2bb299d1b7d.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/e445a2bb299d1b7d.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/e445a2bb299d1b7d.pyi b/.transpyc_cache/e445a2bb299d1b7d.pyi deleted file mode 100644 index 355f684..0000000 --- a/.transpyc_cache/e445a2bb299d1b7d.pyi +++ /dev/null @@ -1,51 +0,0 @@ -""" -Auto-generated Python stub file from __zlib.zinflate.py -Module: __zlib.zinflate -""" - - -from stdint import * -import zinflate -import zchecksum -import zdef -import zhuff -import string -import t, c - -@t.Object -class zinflate_stream: - reader: zdef.zbit_reader - window: BYTEPTR - window_pos: t.CInt - window_size: t.CInt - wbits: t.CInt - is_finished: t.CInt - is_initialized: t.CInt - header_parsed: t.CInt - is_gzip: t.CInt - adler: t.CUInt32T - crc: t.CUInt32T - output: BYTEPTR - output_len: t.CSizeT - output_cap: t.CSizeT - input_data: t.CConst | BYTEPTR - input_len: t.CSizeT - input_pos: t.CSizeT - max_length: t.CSizeT - def __init__(self: zinflate_stream) -> t.CInt: pass - def output_byte(self: zinflate_stream, byte: BYTE) -> t.CInt: pass - def parse_header(self: zinflate_stream) -> t.CInt: pass - def read_bits_from_input(self: zinflate_stream, nbits: t.CInt, out: UINTPTR) -> t.CInt: pass - def read_huffman(self: zinflate_stream, dt: zhuff.zhuff_decode_tree | t.CPtr) -> t.CInt: pass - def inflate_block_stored(self: zinflate_stream) -> t.CInt: pass - def inflate_block_fixed(self: zinflate_stream) -> t.CInt: pass - def inflate_block_dynamic(self: zinflate_stream) -> t.CInt: pass - def inflate_stream(self: zinflate_stream) -> t.CInt: pass - def decompress(self: zinflate_stream, data: UINT8PTR, length: t.CSizeT, max_length: t.CSizeT, out: t.CUInt8T | t.CPtr[t.CPtr], out_len: t.CSizeT | t.CPtr) -> t.CInt: pass - def set_dictionary(self: zinflate_stream, dict: UINT8PTR, length: t.CSizeT) -> t.CInt: pass - def copy(self: zinflate_stream) -> zinflate_stream | t.CPtr: pass - def destroy(self: zinflate_stream) -> t.CInt: pass - -def zinflate_one_shot(data: UINT8PTR, length: t.CSizeT, wbits: t.CInt, bufsize: t.CSizeT, out_len: t.CSizeT | t.CPtr) -> t.CUInt8T | t.CPtr: pass - -def zinflate_create(wbits: t.CInt) -> zinflate_stream | t.CPtr: pass diff --git a/.transpyc_cache/e4c98f097b75da35.doc.json b/.transpyc_cache/e4c98f097b75da35.doc.json deleted file mode 100644 index 56e8c7e..0000000 --- a/.transpyc_cache/e4c98f097b75da35.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"RunPhase1": "Phase1: 扫描 includes 目录,按需翻译并生成 stub"} \ No newline at end of file diff --git a/.transpyc_cache/e4c98f097b75da35.pyi b/.transpyc_cache/e4c98f097b75da35.pyi deleted file mode 100644 index d866b3e..0000000 --- a/.transpyc_cache/e4c98f097b75da35.pyi +++ /dev/null @@ -1,31 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Phase1.py -Module: lib.core.Phase1 -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import viperlib -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import ast -import llvmlite -import lib.core.VLogger as VLogger -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesExprCall as HandlesExprCall -import lib.core.IncludesScanner as IncludesScanner -import lib.core.StubMerger as StubMerger -import lib.Projectrans.Config as Config - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 - -def RunPhase1(mb: memhub.MemBuddy | t.CPtr, includes_dir: str, temp_dir: str, log: VLogger.Logger | t.CPtr) -> int: pass diff --git a/.transpyc_cache/e5be27ae4fe7ce04.doc.json b/.transpyc_cache/e5be27ae4fe7ce04.doc.json deleted file mode 100644 index 7307589..0000000 --- a/.transpyc_cache/e5be27ae4fe7ce04.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"init_enum_table": "初始化枚举注册表,返回 1 成功", "_get_enum_entry": "获取第 i 个枚举条目", "_get_enum_member": "获取枚举中第 i 个成员条目", "register_enum": "注册枚举类型,返回 EnumEntry 指针", "add_enum_member": "向枚举添加成员,返回成员索引(-1 失败)", "find_enum": "按枚举类名查找,返回 EnumEntry 或 None", "lookup_enum_member": "按枚举类名和成员名查找,返回 EnumMember 或 None", "is_enum_class": "检查类名是否为已注册枚举,返回 1=是 / 0=否", "get_enum_base_type": "按枚举类名获取基准类型"} \ No newline at end of file diff --git a/.transpyc_cache/e5be27ae4fe7ce04.pyi b/.transpyc_cache/e5be27ae4fe7ce04.pyi deleted file mode 100644 index ee312c4..0000000 --- a/.transpyc_cache/e5be27ae4fe7ce04.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesEnum.py -Module: lib.core.Handles.HandlesEnum -""" - - -import t, c -from stdint import * -import memhub -import string -import llvmlite -import stdio - -ENUM_MAX: t.CDefine = 64 -ENUM_MEMBER_MAX: t.CDefine = 64 - -@t.NoVTable -class EnumMember: - Name: t.CChar | t.CPtr - Value: t.CInt64T - Ty: llvmlite.LLVMType | t.CPtr -@t.NoVTable -class EnumEntry: - Name: t.CChar | t.CPtr - BaseTy: llvmlite.LLVMType | t.CPtr - MemberCount: int - Members: EnumMember | t.CPtr - -_enum_table: t.CExtern | EnumEntry | t.CPtr -_enum_count: t.CExtern | int - -def init_enum_table(pool: memhub.MemBuddy | t.CPtr) -> int: pass - -def _get_enum_entry(i: int) -> EnumEntry | t.CPtr: pass - -def _get_enum_member(enum_entry: EnumEntry | t.CPtr, i: int) -> EnumMember | t.CPtr: pass - -def register_enum(pool: memhub.MemBuddy | t.CPtr, name: str, base_ty: llvmlite.LLVMType | t.CPtr) -> EnumEntry | t.CPtr: pass - -def add_enum_member(pool: memhub.MemBuddy | t.CPtr, enum_entry: EnumEntry | t.CPtr, member_name: str, member_val: t.CInt64T, member_ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def find_enum(name: str) -> EnumEntry | t.CPtr: pass - -def lookup_enum_member(enum_name: str, member_name: str) -> EnumMember | t.CPtr: pass - -def is_enum_class(name: str) -> int: pass - -def get_enum_base_type(enum_name: str) -> llvmlite.LLVMType | t.CPtr: pass diff --git a/.transpyc_cache/e5fb16127bce8f68.doc.json b/.transpyc_cache/e5fb16127bce8f68.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/e5fb16127bce8f68.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/e5fb16127bce8f68.pyi b/.transpyc_cache/e5fb16127bce8f68.pyi deleted file mode 100644 index 5677a22..0000000 --- a/.transpyc_cache/e5fb16127bce8f68.pyi +++ /dev/null @@ -1,66 +0,0 @@ -""" -Auto-generated Python stub file from zc.class_test.py -Module: zc.class_test -""" - - -import stdio -import stdint -import t, c - -class SimpleData(t.Object): - x: t.CInt - y: t.CInt -class Point3D(t.Object): - x: t.CFloat - y: t.CFloat - z: t.CFloat -class Student(t.Object): - name: t.CChar | t.CPtr - age: t.CInt - score: t.CInt - def __init__(self: Student, n: t.CChar | t.CPtr, a: t.CInt, s: t.CInt) -> t.CInt: pass - def get_age(self: Student) -> t.CInt: pass - def get_score(self: Student) -> t.CInt: pass -class Counter(t.Object): - value: t.CInt - def __init__(self: Counter, initial: t.CInt) -> t.CInt: pass - def increment(self: Counter) -> t.CInt: pass - def get_value(self: Counter) -> t.CInt: pass -class StackObj(t.Object): - data: t.CInt - next_ptr: t.CVoid | t.CPtr - -def TestBasicDataClass() -> t.CInt: pass - -def TestPoint3DClass() -> t.CInt: pass - -def TestStudentClass() -> t.CInt: pass - -def TestCounterClass() -> t.CInt: pass - -def TestStackAllocation() -> t.CInt: pass - -def TestHeapAllocation() -> t.CInt: pass - -def TestHeapObjectWithInit() -> t.CInt: pass - -def TestMultipleStackObjects() -> t.CInt: pass - -def TestImplicitInitCall() -> t.CInt: pass - -def TestClassWithBitFields() -> t.CInt: pass - -def TestIntArray() -> t.CInt: pass - -def TestFloatArray() -> t.CInt: pass - -def TestCharArray() -> t.CInt: pass - -def TestNestedArray() -> t.CInt: pass - -def TestArrayWithStruct() -> t.CInt: pass - -def TestArrayPointer() -> t.CInt: pass - -def TestDynamicString() -> t.CInt: pass diff --git a/.transpyc_cache/e7183a8c64d4872d.doc.json b/.transpyc_cache/e7183a8c64d4872d.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/e7183a8c64d4872d.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/e7183a8c64d4872d.pyi b/.transpyc_cache/e7183a8c64d4872d.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/e7183a8c64d4872d.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/.transpyc_cache/e74870eba3e6d774.doc.json b/.transpyc_cache/e74870eba3e6d774.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/e74870eba3e6d774.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/e74870eba3e6d774.pyi b/.transpyc_cache/e74870eba3e6d774.pyi deleted file mode 100644 index ec2af45..0000000 --- a/.transpyc_cache/e74870eba3e6d774.pyi +++ /dev/null @@ -1,15 +0,0 @@ -""" -Auto-generated Python stub file from float_test.py -Module: float_test -""" - - -import stdio -import t, c - -class DataUnion(t.CUnion): - i: t.CInt - f: t.CFloat - l: t.CInt64T - -def float_test() -> int: pass diff --git a/.transpyc_cache/e773fbfd4a1e4587.doc.json b/.transpyc_cache/e773fbfd4a1e4587.doc.json deleted file mode 100644 index 95e17f3..0000000 --- a/.transpyc_cache/e773fbfd4a1e4587.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/e773fbfd4a1e4587.pyi b/.transpyc_cache/e773fbfd4a1e4587.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/e773fbfd4a1e4587.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/eb252050d92f8fb9.doc.json b/.transpyc_cache/eb252050d92f8fb9.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/eb252050d92f8fb9.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/eb252050d92f8fb9.pyi b/.transpyc_cache/eb252050d92f8fb9.pyi deleted file mode 100644 index 00b3762..0000000 --- a/.transpyc_cache/eb252050d92f8fb9.pyi +++ /dev/null @@ -1,10 +0,0 @@ -""" -Auto-generated Python stub file from deref_test.py -Module: deref_test -""" - - -import stdio -import t, c - -def deref_test() -> int: pass diff --git a/.transpyc_cache/ed1c124f3cb787c9.doc.json b/.transpyc_cache/ed1c124f3cb787c9.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/ed1c124f3cb787c9.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/ed1c124f3cb787c9.pyi b/.transpyc_cache/ed1c124f3cb787c9.pyi deleted file mode 100644 index 123d4fd..0000000 --- a/.transpyc_cache/ed1c124f3cb787c9.pyi +++ /dev/null @@ -1,10 +0,0 @@ -""" -Auto-generated Python stub file from ptr_only_test.py -Module: ptr_only_test -""" - - -import stdio -import t, c - -def ptr_only_test() -> int: pass diff --git a/.transpyc_cache/ee52c08239684346.pyi b/.transpyc_cache/ee52c08239684346.pyi deleted file mode 100644 index ee09339..0000000 --- a/.transpyc_cache/ee52c08239684346.pyi +++ /dev/null @@ -1,215 +0,0 @@ -""" -Auto-generated Python stub file from ast.parser.py -Module: ast.parser -""" - - -import t, c -from stdint import * -import memhub -import string -from .tokens import Token, TokenType, Keyword, TokOp -from .base import AST, ASTCtx, ASTKind, OpKind, ASTFlag, _set_pos, _binop_from_op, _augop_from_op, _cmpop_from_op, _copy_str, _inherit_pos, _init_ast, CONST_INT, CONST_FLOAT, CONST_STR, CONST_BOOL, CONST_NONE, FLAG_IS_ASYNC -from .exprs import BoolOp, BinOp, UnaryOp, Lambda, IfExp, Dict, Set, ListComp, SetComp, DictComp, GeneratorExp, Await, Yield, YieldFrom, FormattedValue, JoinedStr, Constant, NamedExpr, Attribute, Subscript, Starred, Name, List, Tuple, Slice, Call, Compare, OpNode -from .stmts import Module, Expression, Interactive, FunctionType, FunctionDef, ClassDef, Return, Delete, Assign, AugAssign, AnnAssign, For, While, If, With, Raise, Try, Assert, Global, Nonlocal, Pass, Break, Continue, Expr, Import, ImportFrom, Match -from .astaux import ExceptHandler, Arguments, Arg, Keyword as KwNode, Alias, WithItem, Comprehension -from .match import MatchCase, MatchValue, MatchSingleton, MatchSequence, MatchMapping, MatchClass, MatchStar, MatchAs, MatchOr -from .lexer import Lexer, _lexer_init, tokenize, new_lexer - -class Parser: - tokens: Token | t.CPtr - cur: Token | t.CPtr - pool: memhub.MemManager | t.CPtr - error_count: t.CInt - pending_decorators: list[AST | t.CPtr] | t.CPtr - def __new__(self: Parser, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - -def new_parser(pool: memhub.MemManager | t.CPtr) -> Parser | t.CPtr: pass - -def _parser_init(ps: Parser | t.CPtr, tokens: Token | t.CPtr, pool: memhub.MemManager | t.CPtr) -> t.CInt: pass - -def _advance(ps: Parser | t.CPtr) -> t.CInt: pass - -def _cur_type(ps: Parser | t.CPtr) -> t.CInt: pass - -def _cur_op(ps: Parser | t.CPtr) -> t.CInt: pass - -def _cur_kw(ps: Parser | t.CPtr) -> t.CInt: pass - -def _cur_str(ps: Parser | t.CPtr) -> str: pass - -def _cur_lineno(ps: Parser | t.CPtr) -> t.CInt: pass - -def _cur_col(ps: Parser | t.CPtr) -> t.CInt: pass - -def _skip_nl(ps: Parser | t.CPtr) -> t.CInt: pass - -def _skip_nls_and_newlines(ps: Parser | t.CPtr) -> t.CInt: pass - -def _expect_type(ps: Parser | t.CPtr, ttype: t.CInt) -> t.CInt: pass - -def _expect_op(ps: Parser | t.CPtr, op_id: t.CInt) -> t.CInt: pass - -def _match_op(ps: Parser | t.CPtr, op_id: t.CInt) -> t.CInt: pass - -def _accept_op(ps: Parser | t.CPtr, op_id: t.CInt) -> t.CInt: pass - -def _new_const_int(pool: memhub.MemManager | t.CPtr, val: t.CInt64T, lineno: t.CInt, col: t.CInt) -> AST | t.CPtr: pass - -def _new_const_float(pool: memhub.MemManager | t.CPtr, val: t.CDouble, lineno: t.CInt, col: t.CInt) -> AST | t.CPtr: pass - -def _new_const_str(pool: memhub.MemManager | t.CPtr, val: str, lineno: t.CInt, col: t.CInt) -> AST | t.CPtr: pass - -def _new_const_bool(pool: memhub.MemManager | t.CPtr, val: t.CInt, lineno: t.CInt, col: t.CInt) -> AST | t.CPtr: pass - -def _new_const_none(pool: memhub.MemManager | t.CPtr, lineno: t.CInt, col: t.CInt) -> AST | t.CPtr: pass - -def _set_ctx(node: AST | t.CPtr, ctx: t.CInt) -> t.CInt: pass - -def _fix_store_ctx(node: AST | t.CPtr) -> t.CInt: pass - -def _parse_expr(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_namedexpr(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_test(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_lambda(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_or_test(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_and_test(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_not_test(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_comparison(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _match_comp_op(ps: Parser | t.CPtr) -> t.CInt: pass - -def _advance_comp_op(ps: Parser | t.CPtr) -> t.CInt: pass - -def _parse_bitor(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_bitxor(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_bitand(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_shift(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_arith(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_term(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_factor(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_power(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_atom_expr(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_call(ps: Parser | t.CPtr, func: AST | t.CPtr) -> AST | t.CPtr: pass - -def _parse_subscript(ps: Parser | t.CPtr, value: AST | t.CPtr) -> AST | t.CPtr: pass - -def _parse_slice(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_atom(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_paren(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_list(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_brace(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_sub_expr(ps: Parser | t.CPtr, src: str) -> AST | t.CPtr: pass - -def _parse_fstring(ps: Parser | t.CPtr, content: str, lineno: t.CInt, col: t.CInt) -> AST | t.CPtr: pass - -def _parse_comprehension(ps: Parser | t.CPtr, elt: AST | t.CPtr, vtype: t.CInt, lineno: t.CInt, col: t.CInt) -> AST | t.CPtr: pass - -def _parse_comp_for(ps: Parser | t.CPtr) -> list[AST | t.CPtr] | t.CPtr: pass - -def _parse_target_list(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_target(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_yield(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_varargslist(ps: Parser | t.CPtr, is_lambda: t.CInt) -> AST | t.CPtr: pass - -def _parse_arg_def(ps: Parser | t.CPtr, is_lambda: t.CInt) -> AST | t.CPtr: pass - -def _parse_suite_into_children(ps: Parser | t.CPtr, parent: AST | t.CPtr) -> t.CInt: pass - -def _parse_statement_into(ps: Parser | t.CPtr, parent: AST | t.CPtr) -> t.CInt: pass - -def _parse_simple_stmt_into(ps: Parser | t.CPtr, parent: AST | t.CPtr) -> t.CInt: pass - -def _parse_small_stmt(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _maybe_tuple(ps: Parser | t.CPtr, first: AST | t.CPtr) -> AST | t.CPtr: pass - -def _parse_testlist(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_expr_stmt(ps: Parser | t.CPtr, first: AST | t.CPtr) -> AST | t.CPtr: pass - -def _parse_return(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_raise(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_global(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_nonlocal(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_import(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_from_import(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_alias_list(ps: Parser | t.CPtr) -> list[AST | t.CPtr] | t.CPtr: pass - -def _parse_del(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_assert(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_compound(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_if(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_if_tail(ps: Parser | t.CPtr) -> list[AST | t.CPtr] | t.CPtr: pass - -def _parse_while(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_for(ps: Parser | t.CPtr, is_async: t.CInt) -> AST | t.CPtr: pass - -def _parse_try(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_except_handler(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_with(ps: Parser | t.CPtr, is_async: t.CInt) -> AST | t.CPtr: pass - -def _parse_with_item(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_funcdef(ps: Parser | t.CPtr, is_async: t.CInt) -> AST | t.CPtr: pass - -def _parse_classdef(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_match(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _make_name_ast(pool: memhub.MemManager | t.CPtr, node: Name | t.CPtr) -> AST | t.CPtr: pass - -def _parse_pattern(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_closed_pattern(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_sequence_pattern(ps: Parser | t.CPtr, close_op: t.CInt, lineno: t.CInt, col: t.CInt) -> AST | t.CPtr: pass - -def _parse_mapping_pattern(ps: Parser | t.CPtr, lineno: t.CInt, col: t.CInt) -> AST | t.CPtr: pass - -def _parse_class_pattern(ps: Parser | t.CPtr, cls: AST | t.CPtr, lineno: t.CInt, col: t.CInt) -> AST | t.CPtr: pass - -def _parse_match_case(ps: Parser | t.CPtr) -> AST | t.CPtr: pass - -def _parse_decorators(ps: Parser | t.CPtr) -> list[AST | t.CPtr] | t.CPtr: pass - -def _parse_module_body(ps: Parser | t.CPtr, module_node: AST | t.CPtr) -> t.CInt: pass - -def parse_tokens(pool: memhub.MemManager | t.CPtr, tokens: Token | t.CPtr) -> AST | t.CPtr: pass diff --git a/.transpyc_cache/ef45adce81bf5b2d.doc.json b/.transpyc_cache/ef45adce81bf5b2d.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/ef45adce81bf5b2d.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/ef45adce81bf5b2d.pyi b/.transpyc_cache/ef45adce81bf5b2d.pyi deleted file mode 100644 index 7eeac7e..0000000 --- a/.transpyc_cache/ef45adce81bf5b2d.pyi +++ /dev/null @@ -1,12 +0,0 @@ -""" -Auto-generated Python stub file from namespace_test.py -Module: namespace_test -""" - - -import stdio -import t, c -import namespace_defs -from namespace_defs import Widget, Gadget, PlainStruct - -def namespace_test() -> int: pass diff --git a/.transpyc_cache/f08abd3a207590f0.doc.json b/.transpyc_cache/f08abd3a207590f0.doc.json deleted file mode 100644 index 724daa6..0000000 --- a/.transpyc_cache/f08abd3a207590f0.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到\n\n allow_star_fallback: 传 0 禁用 star import 回退(用于明确模块名/函数名查找)\n ", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_get_external_func_param_ty": "获取外部函数第 param_idx 个参数的期望类型,None 表示用字面量原类型\n\n 对 Win32 API 函数的所有非指针参数返回 i64,匹配 declare 中\n ULONG/SIZE_T 被统一翻译为 i64 的情况。\n ", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/f08abd3a207590f0.pyi b/.transpyc_cache/f08abd3a207590f0.pyi deleted file mode 100644 index 065139b..0000000 --- a/.transpyc_cache/f08abd3a207590f0.pyi +++ /dev/null @@ -1,173 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str, allow_star_fallback: int) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _get_external_func_param_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str, param_idx: int) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/f26cd4c78b4d554c.doc.json b/.transpyc_cache/f26cd4c78b4d554c.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/f26cd4c78b4d554c.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/f26cd4c78b4d554c.pyi b/.transpyc_cache/f26cd4c78b4d554c.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/f26cd4c78b4d554c.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/.transpyc_cache/f26d7266c4f8762b.doc.json b/.transpyc_cache/f26d7266c4f8762b.doc.json deleted file mode 100644 index 7565271..0000000 --- a/.transpyc_cache/f26d7266c4f8762b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"remote_func": "Remote function docstring.", "RemoteClass": "Remote class docstring.", "RemoteClass.remote_method": "Remote method docstring."} \ No newline at end of file diff --git a/.transpyc_cache/f26d7266c4f8762b.pyi b/.transpyc_cache/f26d7266c4f8762b.pyi deleted file mode 100644 index 845daee..0000000 --- a/.transpyc_cache/f26d7266c4f8762b.pyi +++ /dev/null @@ -1,19 +0,0 @@ -""" -Auto-generated Python stub file from remote.py -Module: remote -""" - -import c - - -import t - -def remote_func() -> t.CInt: pass - - -@t.Object -class RemoteClass: - value: t.CInt - def remote_method(self: RemoteClass) -> t.CInt: pass - -def no_doc_func() -> t.CInt: pass diff --git a/.transpyc_cache/f2fc34882dad695a.doc.json b/.transpyc_cache/f2fc34882dad695a.doc.json deleted file mode 100644 index c00e036..0000000 --- a/.transpyc_cache/f2fc34882dad695a.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"set_module_sha1_map": "设置全局模块 SHA1 映射", "_lookup_module_sha1": "查找模块名对应的 SHA1,找不到返回 None", "_lookup_module_sha1_suffix": "后缀匹配查找模块 SHA1,如 mod_suffix=\"__types\" 匹配 \"llvmlite.__types\"\n\n 用于 from .X import Y 的相对导入:impf.module 是 \".X\"(带前导点),\n 去掉前导点后为 \"X\",SHA1 映射表中键是 \"pkg.X\",需要后缀匹配。\n ", "register_cexport_func": "注册 CExport 函数到全局表(sha1+func_name 二元组)", "is_cexport_func": "检查 (sha1, func_name) 是否是 CExport 函数", "_lookup_mod_sha1": "从 from_imports 查找类所属模块的 SHA1,返回 None=未找到", "find_func_in_module": "在模块的函数链表中按名称查找函数\n\n 查找策略:\n 1. 精确匹配(如 \"strlen\" 匹配 @strlen,有 t.CExport 的函数)\n 2. 后缀匹配(如 \"atoi\" 匹配 @\"83210a72e829a086.atoi\",无 t.CExport 的函数)\n\n 使用 llvmlite.function_get_name/next 访问器绕过 stub 类型限制\n (stub 类型字段不足且字段类型可能错误,直接字段访问会被静默跳过)。\n ", "_infer_external_func_ret_ty": "根据函数名推断外部 includes 函数的返回类型", "_emit_llvm_memcpy_intrinsic": "将 memcpy 调用映射到 @llvm.memcpy 内联函数\n\n 直接接收三个 Value 参数,避免通过 Next 链表遍历(共享 alloca 对象的\n Next 字段可能被其他操作污染,导致链表断裂)。\n ", "translate_c_deref": "c.Deref(ptr) → load i8 from ptr", "translate_c_derefas": "c.DerefAs(ptr, val) → store val to ptr(bitcast 后 store)", "translate_c_addr": "c.Addr(var) → 返回变量的 alloca 指针(不 load)", "translate_c_load": "c.Load(a, b) → *a = *b(加载 b 的值,存储到 a)", "AsmOperand": "内联汇编操作数条目", "_asm_append_cstr": "将 C 字符串 src 追加到 dst 末尾", "_asm_escape_for_ir": "转义汇编文本用于 LLVM IR 字符串字面量", "_resolve_register": "将 t.ASM_DESCR.XXX 的属性名映射到约束字符串值", "_resolve_asm_descr": "递归解析约束表达式,返回约束字符串", "_asm_get_operand": "获取操作数数组中第 idx 个元素的指针", "_asm_is_c_call": "检查 Call 节点是否是 c.XXX 调用,返回属性名或 None", "_asm_add_operand": "添加操作数到数组,返回新计数(失败返回原计数)", "translate_c_asm": "翻译 c.Asm 内联汇编,返回结果 Value(无输出时返回 None)", "_llvmir_get_op": "获取第 i 个操作数槽位", "_llvmir_find_op_marker": "查找 %__OP 标记,返回标记开始位置或 None", "_llvmir_parse_op_num": "从 %__OPN__ 标记中解析编号 N", "_llvmir_match_icmp_pred": "将 icmp 预测字符串转为常量", "_llvmir_match_fcmp_pred": "将 fcmp 预测字符串转为常量", "_llvmir_extract_two_ops": "从模板中提取前两个 %__OP 标记的编号\n\n 结果写入 out_nums[0] 和 out_nums[1]\n 返回 1 成功, 0 失败\n ", "_llvmir_resolve_op": "根据操作数编号解析实际 Value", "_llvmir_store_outputs": "将结果存储到所有输出变量", "translate_c_llvmir": "翻译 c.LLVMIR 内联 LLVM IR,返回结果 Value", "_apply_struct_defaults": "应用结构体字段的默认值", "_translate_struct_ctor": "结构体构造函数:按字段顺序 store 参数值,返回结构体值\n\n OOP 结构体:alloca → call __before_init__(ptr) → call __init__(ptr, args) 或 store 参数 → load\n 普通结构体:alloca → zero + defaults → store 参数 → load\n ", "_do_virtual_call": "通过虚表间接调用虚方法,返回 call 结果(void 方法返回 None)", "_call_method_on_ptr": "在结构体指针上调用方法,返回 call 结果(void 方法返回 None)", "_infer_method_ret_ty": "根据方法名推断返回类型(stub 未注入时的回退方案)", "_translate_method_call": "翻译方法调用,返回 call 结果 Value", "_kwarg_name_matches": "检查关键字参数名 kw_arg 是否匹配参数名 param_name(跳过 % 前缀)", "_translate_struct_ctor_kw": "结构体构造函数(关键字参数版本)", "_translate_call_with_kwargs": "带关键字参数的函数调用,按参数顺序构建调用链表\n\n 使用 llvmlite 访问器函数绕过 stub 类型限制:\n found_func.Params/RetTy/Name 和 cur_param.Name/Ty/Next 在 stub\n 类型中字段不足,直接访问会被 TransPyC 静默跳过。\n ", "_translate_t_type_cast": "类型转换:根据参数类型和目标类型选择转换方式", "_extract_type_args_from_slice": "从 Subscript.slice 提取类型实参名列表\n\n list[int] -> [\"int\"]\n dict[str, int] -> [\"str\", \"int\"]\n list[AST | t.CPtr] -> [\"AST|t.CPtr\"]\n ", "translate_call": "翻译函数调用,返回 call 结果 Value", "translate_closure_call": "通过闭包指针间接调用", "translate_printf_call": "翻译 printf 调用(特殊处理格式字符串)", "FuncEntry": "函数表条目", "init_func_table": "分配并清零函数表数组", "find_func_in_table": "在函数表中按名称查找,返回 Function 指针或 None", "add_func_to_table": "添加函数到函数表,返回 0 成功", "_init_global_func_table": "初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)", "_register_global_func": "注册函数到全局表(已存在则跳过),返回 0 成功\n\n 直接操作全局表,不调用 add_func_to_table,避免递归。\n ", "find_func_global": "在全局函数表中按名称查找,返回 Function 指针或 None", "ExprCallHandle": "函数调用处理器:继承 Mixin 获得 Trans 回指针", "ExprCallHandle.HandleCall": "翻译函数调用,从 self.Trans 获取共享状态", "ExprCallHandle.HandlePrintfCall": "翻译 printf 调用,从 self.Trans 获取共享状态"} \ No newline at end of file diff --git a/.transpyc_cache/f2fc34882dad695a.pyi b/.transpyc_cache/f2fc34882dad695a.pyi deleted file mode 100644 index 40c3168..0000000 --- a/.transpyc_cache/f2fc34882dad695a.pyi +++ /dev/null @@ -1,171 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesExprCall.py -Module: lib.core.Handles.HandlesExprCall -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import stdlib -import sys -import viperlib -import lib.core.Handles.HandlesBase as HandlesBase -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesExpr as HandlesExpr -import lib.core.Handles.HandlesVar as HandlesVar -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesClassDef as HandlesClassDef - -_g_sha1_arr: t.CExtern | bytes -_g_mod_arr: t.CExtern | bytes -_g_sha1_count: t.CExtern | int - -def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int: pass - -def _lookup_module_sha1(mod_name: str) -> str: pass - -def _lookup_module_sha1_suffix(mod_suffix: str) -> str: pass - - -_g_cexport_sha1_arr: t.CExtern | bytes -_g_cexport_func_arr: t.CExtern | bytes -_g_cexport_count: t.CExtern | int -_CEXPORT_MAX: t.CDefine = 256 - -def register_cexport_func(sha1: str, func_name: str) -> int: pass - -def is_cexport_func(sha1: str, func_name: str) -> int: pass - -def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr, from_imports: str, class_name: str) -> str: pass - -def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr, name: str) -> llvmlite.Function | t.CPtr: pass - -def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr, func_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, dst_val: llvmlite.Value | t.CPtr, src_val: llvmlite.Value | t.CPtr, num_val: llvmlite.Value | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_deref(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_addr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_c_load(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -ASM_MAX_OPERANDS: t.CDefine = 16 -ASM_TEXT_BUF_SIZE: t.CDefine = 2048 -ASM_CONST_BUF_SIZE: t.CDefine = 512 -ASM_ARGS_BUF_SIZE: t.CDefine = 512 -ASM_LINE_BUF_SIZE: t.CDefine = 4096 - -@t.NoVTable -class AsmOperand: - Value: llvmlite.Value | t.CPtr - Constraint: str - IsOutput: int - -def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr, src: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _resolve_register(attr_name: str) -> str: pass - -def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr) -> str: pass - -def _asm_get_operand(base: AsmOperand | t.CPtr, idx: int) -> AsmOperand | t.CPtr: pass - -def _asm_is_c_call(node: ast.Call | t.CPtr) -> str: pass - -def _asm_add_operand(operands: AsmOperand | t.CPtr, count: int, val: llvmlite.Value | t.CPtr, constraint: str, is_output: int) -> int: pass - -def translate_c_asm(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - - -LLVMIR_MAX_OPS: t.CDefine = 16 -LLVMIR_TEMPLATE_BUF: t.CDefine = 512 - -def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr: pass - -def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr: pass - -def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int: pass - -def _llvmir_match_icmp_pred(pred: str) -> int: pass - -def _llvmir_match_fcmp_pred(pred: str) -> int: pass - -def _llvmir_extract_two_ops(template: t.CChar | t.CPtr, out_nums: int | t.CPtr) -> int: pass - -def _llvmir_resolve_op(op_num: int, all_kinds: int | t.CPtr, all_indices: int | t.CPtr, input_ops: AsmOperand | t.CPtr, output_targets: AsmOperand | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, result: llvmlite.Value | t.CPtr, output_targets: AsmOperand | t.CPtr, output_count: int) -> llvmlite.Value | t.CPtr: pass - -def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, tmp: llvmlite.Value | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - -def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, args_head: llvmlite.Value | t.CPtr, args_count: int, found_func: llvmlite.Function | t.CPtr, ret_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, self_ptr: llvmlite.Value | t.CPtr, extra_args: t.CSizeT | t.CPtr, extra_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr, method_name: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _translate_method_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, class_name: str, method_name: str, obj_ptr: llvmlite.Value | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _kwarg_name_matches(kw_arg: str, param_name: t.CChar | t.CPtr) -> int: pass - -def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, func_name: str, found_func: llvmlite.Function | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT, keywords: list[ast.AST | t.CPtr] | t.CPtr, kw_count: t.CSizeT, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, val: llvmlite.Value | t.CPtr, target_ty: llvmlite.LLVMType | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr, slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr: pass - -def translate_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, node: ast.AST | t.CPtr, funcs_ptr: t.CPtr, func_count: int, trans: HT.Translator | t.CPtr) -> llvmlite.Value | t.CPtr: pass - -def translate_closure_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, closure_alloca: llvmlite.Value | t.CPtr, cargs: list[ast.AST | t.CPtr] | t.CPtr, can: t.CSizeT) -> llvmlite.Value | t.CPtr: pass - -def translate_printf_call(pool: memhub.MemBuddy | t.CPtr, builder: llvmlite.IRBuilder | t.CPtr, mod: llvmlite.LLVMModule | t.CPtr, cl: ast.Call | t.CPtr, trans: HT.Translator | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class FuncEntry: - Name: str - Func: llvmlite.Function | t.CPtr - -def init_func_table(pool: memhub.MemBuddy | t.CPtr, max_count: int) -> FuncEntry | t.CPtr: pass - -def find_func_in_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str) -> llvmlite.Function | t.CPtr: pass - -def add_func_to_table(funcs: FuncEntry | t.CPtr, func_count: int, name: str, func: llvmlite.Function | t.CPtr, max_count: int) -> int: pass - - -GLOBAL_FUNC_MAX: t.CDefine = 8192 -_global_funcs: t.CExtern | FuncEntry | t.CPtr -_global_func_count: t.CExtern | int - -def _init_global_func_table() -> int: pass - -def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int: pass - -def find_func_global(name: str) -> llvmlite.Function | t.CPtr: pass - - -@t.NoVTable -class ExprCallHandle(HandlesBase.Mixin): - def __init__(self: ExprCallHandle, trans: HT.Translator | t.CPtr) -> t.CInt: pass - def HandleCall(self: ExprCallHandle, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: pass - def HandlePrintfCall(self: ExprCallHandle, cl: ast.Call | t.CPtr) -> t.CInt: pass - -def NewExprCallHandle(pool: memhub.MemBuddy | t.CPtr, trans: HT.Translator | t.CPtr) -> ExprCallHandle | t.CPtr: pass diff --git a/Test/ArgparseTest/temp/ee084e9fc6ee413a.pyi b/.transpyc_cache/f3560b99de458aec.pyi similarity index 88% rename from Test/ArgparseTest/temp/ee084e9fc6ee413a.pyi rename to .transpyc_cache/f3560b99de458aec.pyi index 45551ef..84f0bbf 100644 --- a/Test/ArgparseTest/temp/ee084e9fc6ee413a.pyi +++ b/.transpyc_cache/f3560b99de458aec.pyi @@ -34,7 +34,7 @@ class MemManager: def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass def reset(self: MemManager) -> t.CInt: pass def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass def __exit__(self: MemManager) -> t.CInt: pass def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass @@ -78,4 +78,9 @@ class MemBuddy(MemManager): def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/.transpyc_cache/f492cb40d913400b.doc.json b/.transpyc_cache/f492cb40d913400b.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/f492cb40d913400b.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/f492cb40d913400b.pyi b/.transpyc_cache/f492cb40d913400b.pyi deleted file mode 100644 index f8cf5c7..0000000 --- a/.transpyc_cache/f492cb40d913400b.pyi +++ /dev/null @@ -1,15 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import t, c -import stdio -import stdlib -import testcheck -import viperlib - -@t.CExport -def main() -> int: pass diff --git a/.transpyc_cache/f49abd3c81119ada.doc.json b/.transpyc_cache/f49abd3c81119ada.doc.json deleted file mode 100644 index 95e17f3..0000000 --- a/.transpyc_cache/f49abd3c81119ada.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_load_includes_sha1_set": "读取 _sha1_map.txt,将 includes/ 开头的 SHA1 写入 sha1_set\n sha1_set 大小为 MAX_INCLUDES_SHA1 * 17(每个 SHA1 16字符+null)\n 返回找到的 includes SHA1 数量,-1 表示错误", "_is_in_sha1_set": "检查 sha1 是否在集合中", "WriteIncludesSha1Map": "将 includes 扫描结果写入 _sha1_map.txt(供 StubMerger 使用)\n\n 若 filter_set 不为 None 且 filter_count > 0,只写入 filter_set 中的条目。\n ", "_IsFuncDeclaredOrDefined": "检查 out_buf 中是否已有函数的 declare 或 define 行", "_CommentOutDeclareInBuf": "在 out_buf 中搜索 declare 行(包含 func_sig),将其注释掉", "_CommentOutGlobalInBuf": "在 out_buf 中搜索全局变量定义行(以 global_name 开头),将行首改为 ';'", "_CommentOutOpaqueTypeInBuf": "在 out_buf 中搜索 type_name_prefix 对应的 opaque 声明行,将行首改为 ';'\n\n type_name_prefix 格式: '%\"sha1.ClassName\"'(不含 '=' 和后续内容)\n 返回 1=已注释, 0=未找到\n ", "_HasFullTypeDefinition": "检查 out_buf 中是否已有 type_name_prefix 的完整定义", "_LoadAndAppendStub": "加载依赖 stub 并追加(跳过 header,去重)", "_LoadAndAppendTextDeclares": "从依赖 text.ll 提取 declare(define 转 declare),追加到 out_buf", "_PathToModuleName": "将文件路径转换为模块名", "_BuildIncludesSha1Map": "从 _sha1_map.txt 构建 sha1→module_name 映射,返回条目数", "_FindSha1ByModName": "从模块名查找 SHA1(精确匹配)", "_AddSha1ToSet": "将 SHA1 加入集合,返回新 count", "_BuildReachableSha1Set": "构建可达 SHA1 集合(依赖图按需翻译)", "BuildCombinedIR": "组合本地 stub + 依赖 stubs + 本地 text → out_buf(按需加载)"} \ No newline at end of file diff --git a/.transpyc_cache/f49abd3c81119ada.pyi b/.transpyc_cache/f49abd3c81119ada.pyi deleted file mode 100644 index 4466a75..0000000 --- a/.transpyc_cache/f49abd3c81119ada.pyi +++ /dev/null @@ -1,60 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.StubMerger.py -Module: lib.core.StubMerger -""" - - -import t, c -from stdint import * -import memhub -import string -import stdio -import stdlib -import llvmlite -import w32.win32file as win32file -import w32.win32base as win32base -import w32.fileio as fileio -import viperlib -import sys -import ast -import lib.core.IncludesScanner as IncludesScanner -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesImports as HandlesImports -import lib.core.Handles.HandlesTranslator as HandlesTranslator - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -MAX_INCLUDES_SHA1: t.CDefine = 256 -STUB_READ_BUF_SIZE: t.CDefine = 262144 -MAX_INCLUDES: t.CDefine = 256 - -def _load_includes_sha1_set(pool: memhub.MemBuddy | t.CPtr, temp_dir: str, sha1_set: str) -> int: pass - -def _is_in_sha1_set(sha1: str, sha1_set: str, set_count: int) -> int: pass - -def WriteIncludesSha1Map(mb: memhub.MemBuddy | t.CPtr, temp_dir: str, scan_result: IncludesScanner.ScanResult | t.CPtr, filter_set: t.CChar | t.CPtr, filter_count: int) -> int: pass - -def _IsFuncDeclaredOrDefined(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutDeclareInBuf(out_buf: bytes, func_sig: str) -> int: pass - -def _CommentOutGlobalInBuf(out_buf: bytes, global_name: str) -> int: pass - -def _CommentOutOpaqueTypeInBuf(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _HasFullTypeDefinition(out_buf: bytes, type_name_prefix: str) -> int: pass - -def _LoadAndAppendStub(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _LoadAndAppendTextDeclares(temp_dir: str, td_len: t.CSizeT, dep_sha1: str, dep_buf: bytes, out_buf: bytes, out_size: t.CSizeT, out_pos: t.CSizeT) -> t.CSizeT: pass - -def _PathToModuleName(path: str) -> str: pass - -def _BuildIncludesSha1Map(temp_dir: str, td_len: t.CSizeT, sha1_list: t.CChar | t.CPtr, mod_list: t.CChar | t.CPtr) -> int: pass - -def _FindSha1ByModName(sha1_arr: t.CChar | t.CPtr, mod_arr: t.CChar | t.CPtr, count: int, mod_name: str) -> str: pass - -def _AddSha1ToSet(set_buf: t.CChar | t.CPtr, count: int, sha1: str) -> int: pass - -def _BuildReachableSha1Set(mb: memhub.MemBuddy | t.CPtr, source_dir: str, temp_dir: str, reachable_set: t.CChar | t.CPtr) -> int: pass - -def BuildCombinedIR(temp_dir: str, local_sha1: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass diff --git a/.transpyc_cache/f9c68a21786049ce.doc.json b/.transpyc_cache/f9c68a21786049ce.doc.json deleted file mode 100644 index 67e7a8b..0000000 --- a/.transpyc_cache/f9c68a21786049ce.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_DiagAppend": "追加诊断信息到 diag.txt(追加模式,不依赖 printf 缓冲)", "TranslateFileGetTrans": "翻译文件,返回 Translator 对象(调用者负责 dump_ir),None 失败", "ensure_dir": "递归创建目录(类似 mkdir -p),目录已存在视为成功\n\n Args:\n path: 目录路径(支持 / 或 \\ 分隔符)\n\n Returns:\n 0 成功(包括目录已存在),非 0 失败\n ", "write_ir_to_file": "将 IR 缓冲区写入 .ll 文件\n\n Args:\n ir_buf: IR 文本缓冲区\n ir_len: IR 文本长度\n output_dir: 输出目录(temp 或 output)\n module_name: 模块名(如 \"main\")\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_ll_to_obj": "调用 llc 将 .ll 编译为 .obj\n\n Args:\n ir_path: .ll 文件路径\n output_dir: 输出目录\n module_name: 模块名(用于生成 .obj 文件名)\n cc_cmd: 编译器命令(如 \"llc\")\n cc_flags: 编译器参数(如 \"-filetype=obj -relocation-model=pic\")\n\n Returns:\n 0 成功,非 0 失败\n ", "collect_obj_files": "扫描 includes_binary_dir 目录,收集所有 .obj 文件路径到 out_buf\n\n Args:\n includes_binary_dir: includes.binary 目录路径\n out_buf: 输出缓冲区(用于存放空格分隔的 .obj 文件路径)\n out_size: 输出缓冲区大小\n\n Returns:\n 写入的字节数(不含 null 终止符),0 表示无文件或错误\n ", "link_obj_to_exe": "调用 clang++ 链接 .obj 为 .exe\n\n Args:\n output_dir: 输出目录(包含 .obj 文件)\n module_name: 模块名\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件名(如 \"test.exe\")\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "compile_module_to_obj": "编译 IR 到 .obj(不链接)\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名(SHA1)\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n\n Returns:\n 0 成功,非 0 失败\n ", "link_objs_to_exe": "链接多个 .obj 文件为 .exe\n\n Args:\n obj_paths: 空格分隔的 .obj 文件完整路径字符串\n obj_paths_len: obj_paths 长度\n linker_cmd: 链接器命令(如 \"clang++\")\n linker_flags: 链接器参数\n linker_output: 输出文件完整路径\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n 0 成功,非 0 失败\n ", "run_pipeline": "执行完整编译管线\n\n Args:\n ir_buf: LLVM IR 文本缓冲区\n ir_len: IR 文本长度\n temp_dir: 临时目录\n output_dir: 输出目录\n module_name: 模块名\n cc_cmd: 编译器命令\n cc_flags: 编译器参数\n linker_cmd: 链接器命令\n linker_flags: 链接器参数\n linker_output: 输出文件名\n includes_binary_dir: includes.binary 目录路径(链接时附加预编译 .obj)\n\n Returns:\n BuildResult 对象\n "} \ No newline at end of file diff --git a/.transpyc_cache/f9c68a21786049ce.pyi b/.transpyc_cache/f9c68a21786049ce.pyi deleted file mode 100644 index 9d8b33e..0000000 --- a/.transpyc_cache/f9c68a21786049ce.pyi +++ /dev/null @@ -1,52 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.BuildPipeline.py -Module: lib.core.BuildPipeline -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import w32.fileio as fileio -import w32.win32file -import w32.win32base -import subprocess -import viperlib -import ast -import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesType as HandlesType - -_mbuddy: t.CExtern | memhub.MemManager | t.CPtr -SRC_BUF_SIZE: t.CDefine = 1048576 - -def _DiagAppend(msg: bytes) -> t.CInt: pass - -def TranslateFileGetTrans(mb: memhub.MemBuddy | t.CPtr, file_path: str, sha1_val: str) -> HandlesTranslator.Translator | t.CPtr: pass - - -class BuildResult: - Success: t.CInt - OutputPath: str - ErrorMsg: str - def __new__(self: BuildResult) -> t.CPtr: pass - def __init__(self: BuildResult) -> t.CInt: pass - -def ensure_dir(path: str) -> int: pass - -def write_ir_to_file(ir_buf: bytes, ir_len: t.CSizeT, output_dir: str, module_name: str) -> int: pass - -def compile_ll_to_obj(ir_path: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def collect_obj_files(includes_binary_dir: str, out_buf: bytes, out_size: t.CSizeT) -> t.CSizeT: pass - -def link_obj_to_exe(output_dir: str, module_name: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def compile_module_to_obj(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str) -> int: pass - -def link_objs_to_exe(obj_paths: str, obj_paths_len: t.CSizeT, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> int: pass - -def run_pipeline(ir_buf: bytes, ir_len: t.CSizeT, temp_dir: str, output_dir: str, module_name: str, cc_cmd: str, cc_flags: str, linker_cmd: str, linker_flags: str, linker_output: str, includes_binary_dir: str) -> BuildResult | t.CPtr: pass diff --git a/.transpyc_cache/faec3233d98371da.doc.json b/.transpyc_cache/faec3233d98371da.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/faec3233d98371da.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/faec3233d98371da.pyi b/.transpyc_cache/faec3233d98371da.pyi deleted file mode 100644 index 308f5cb..0000000 --- a/.transpyc_cache/faec3233d98371da.pyi +++ /dev/null @@ -1,54 +0,0 @@ -""" -Auto-generated Python stub file from zc.logic_test.py -Module: zc.logic_test -""" - - -import config -import t, c - -def ForRangeBasicTest(stop: t.CInt) -> t.CInt: pass - -def ForRangeWithStartStop(start: t.CInt, stop: t.CInt, step: t.CInt) -> t.CInt: pass - -def NestedForRangeTest(rows: t.CInt, cols: t.CInt) -> t.CInt: pass - -def ForWithIfBreakTest(data_size: t.CInt) -> t.CInt: pass - -def ForWithIfContinueTest(n: t.CInt) -> t.CInt: pass - -def ForWithElifBranchTest(value: t.CInt) -> t.CInt: pass - -def WhileWithIfElifElseTest(iterations: t.CInt) -> t.CInt: pass - -def WhileWithNestedIfTest(limit: t.CInt) -> t.CInt: pass - -def WhileWithMatchCaseTest(value: t.CInt) -> t.CInt: pass - -def WhileWithMatchCaseNoBreakTest(value: t.CInt) -> t.CInt: pass - -def ComplexForWhileMatchTest(outer_limit: t.CInt, inner_limit: t.CInt) -> t.CInt: pass - -def ForWithCaseAndNoBreakTest(n: t.CInt) -> t.CInt: pass - -def WhileWithBreakConditionTest(limit: t.CInt) -> t.CInt: pass - -def NestedWhileWithMultipleBreakPoints(depth: t.CInt, width: t.CInt) -> t.CInt: pass - -def ForWithMatchCaseInLoopTest(iterations: t.CInt) -> t.CInt: pass - -def ComplexLogicWithElifChains(a: t.CInt, b: t.CInt, c_val: t.CInt) -> t.CInt: pass - -def ForRangeWithStepAndCondition(n: t.CInt, step: t.CInt) -> t.CInt: pass - -def MatchCaseWithGuardConditions(value: t.CInt) -> t.CInt: pass - -def WhileWithMultipleMatchCases(iterations: t.CInt) -> t.CInt: pass - -def ForWhileMixWithBreakAndContinue(n: t.CInt) -> t.CInt: pass - -def ComplexCaseMatchingWithRanges(start: t.CInt, end: t.CInt) -> t.CInt: pass - -def WhileWithElifInElifChain(limit: t.CInt) -> t.CInt: pass - -def ForWithCaseNoBreakNested(inner_limit: t.CInt) -> t.CInt: pass diff --git a/.transpyc_cache/fb6cea4f70fade7a.doc.json b/.transpyc_cache/fb6cea4f70fade7a.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/.transpyc_cache/fb6cea4f70fade7a.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/.transpyc_cache/fb6cea4f70fade7a.pyi b/.transpyc_cache/fb6cea4f70fade7a.pyi deleted file mode 100644 index 12b9442..0000000 --- a/.transpyc_cache/fb6cea4f70fade7a.pyi +++ /dev/null @@ -1,29 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -import t, c -from t import CInt, CLong, CDouble, CPtr, CSizeT -from stdio import printf -import cpython -import testcheck - -def test_init_finalize() -> t.CInt: pass - -def test_long_operations() -> t.CInt: pass - -def test_string_operations() -> t.CInt: pass - -def test_list_operations() -> t.CInt: pass - -def test_dict_operations() -> t.CInt: pass - -def test_pyrun_string() -> t.CInt: pass - -def test_import_module() -> t.CInt: pass - -def test_operator_overload() -> t.CInt: pass - -def main() -> CInt | t.CExport: pass diff --git a/.transpyc_cache/ff3ad21889888a9a.doc.json b/.transpyc_cache/ff3ad21889888a9a.doc.json deleted file mode 100644 index a8e6f20..0000000 --- a/.transpyc_cache/ff3ad21889888a9a.doc.json +++ /dev/null @@ -1 +0,0 @@ -{"_is_cenum_base": "检查 base 节点是否为 t.CEnum,返回 1=是 / 0=否", "_is_enum_class": "检查 ClassDef 是否继承自 t.CEnum,返回 1=是 / 0=否", "_is_cunion_base": "检查 base 节点是否为 t.CUnion,返回 1=是 / 0=否", "_is_union_class": "检查 ClassDef 是否继承自 t.CUnion,返回 1=是 / 0=否", "_has_decorator": "检查 decorator_list 中是否有指定装饰器名", "_is_marker_base": "检查基类名是否为标记基类,返回 1=是 / 0=否", "_get_base_name": "从 base AST 节点提取基类名,返回 None=失败", "_get_parent_class": "获取 ClassDef 的真实父类名,返回 None=无真实父类", "_has_any_func_cvtable": "检查类中是否有任何函数标记了 @t.CVTable,返回 1=有 / 0=无", "_should_method_be_virtual": "判断方法是否应该进入虚表,返回 1=包含 / 0=排除", "_detect_vtable_status": "检测类是否应该启用虚表", "_resolve_enum_member_type": "解析枚举成员的类型注解为 LLVM 整数类型", "_is_state_annotation": "检查注解节点是否为 t.State,返回 1=是 / 0=否", "_extract_int_value": "从 AST 节点提取整数值,失败返回 0", "_translate_enum_def": "翻译枚举类定义,返回 0", "_get_type_size": "计算 LLVM 类型的字节大小", "_translate_union_def": "翻译联合体定义,返回 0", "_is_generic_class": "检查 ClassDef 是否有类型参数(泛型类),返回 1=是 / 0=否", "_register_generic_template": "注册泛型类模板(类名 + ClassDef 节点)", "_find_generic_template": "查找泛型类模板,返回 ClassDef 节点或 None", "_mangle_generic_class_name": "生成特化类名: list + [int] -> list[int]\n\n 分配新缓冲区拼接,避免原地 strcat 导致缓冲区溢出\n ", "_clone_annotation": "拷贝类型注解表达式,替换类型参数 T 为具体类型名\n\n tp_names: 类型参数名列表 ['T']\n type_args: 类型实参名列表 ['int']\n ", "_clone_arguments": "拷贝 Arguments 节点,替换 arg annotation 中的 T", "_clone_classdef_for_spec": "拷贝 ClassDef 节点用于泛型特化\n\n - 替换类名为 spec_name\n - 清除 type_params(特化后不是泛型类)\n - 拷贝 children 中的 AnnAssign 和 FunctionDef,替换类型注解中的 T\n - 方法体直接引用原始节点(通过 type_map 上下文处理 T)\n ", "_find_cached_spec": "查找已缓存的特化名,未找到返回 None", "_cache_spec": "缓存特化结果", "_specialize_generic_class": "特化泛型类,返回特化类名\n\n 1. 查找泛型模板\n 2. 生成特化名\n 3. 检查缓存\n 4. 拷贝 ClassDef 节点(替换类型注解中的 T)\n 5. 设置 type_map 上下文(用于方法体中的 T 替换)\n 6. 调用 translate_class_def 翻译特化类\n 7. 返回特化名\n ", "translate_class_def": "翻译 class 定义,返回 0", "_vtable_strcat": "将 src 追加到 dst 末尾", "_vtable_name_needs_quote": "检查 LLVM 标识符是否需要引号(以数字开头或含 '.')", "_format_func_type_str": "从 Function 对象生成函数类型字符串", "_generate_vtable": "生成 VTable 全局变量", "_translate_oop_methods": "扫描 class body 中的方法并翻译,生成 __before_init__", "_translate_method": "翻译单个方法,返回 0", "_generate_before_init": "生成 __before_init__ 函数,返回 0"} \ No newline at end of file diff --git a/.transpyc_cache/ff3ad21889888a9a.pyi b/.transpyc_cache/ff3ad21889888a9a.pyi deleted file mode 100644 index 62b2e80..0000000 --- a/.transpyc_cache/ff3ad21889888a9a.pyi +++ /dev/null @@ -1,104 +0,0 @@ -""" -Auto-generated Python stub file from lib.core.Handles.HandlesClassDef.py -Module: lib.core.Handles.HandlesClassDef -""" - - -import t, c -from stdint import * -import ast -import llvmlite -import memhub -import string -import stdio -import viperlib -import lib.core.Handles.HandlesTranslator as HT -import lib.core.Handles.HandlesType as HandlesType -import lib.core.Handles.HandlesStruct as HandlesStruct -import lib.core.Handles.HandlesEnum as HandlesEnum - -ENUM_MEMBER_MAX_LOCAL: t.CDefine = 64 - -def _is_cenum_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_enum_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _is_cunion_base(base_node: ast.AST | t.CPtr) -> int: pass - -def _is_union_class(cd: ast.ClassDef | t.CPtr) -> int: pass - - -_MARKER_BASES: t.CDefine = 8 - -def _has_decorator(decorator_list: list[ast.AST | t.CPtr] | t.CPtr, deco_name: str) -> int: pass - -def _is_marker_base(base_name: str) -> int: pass - -def _get_base_name(base_node: ast.AST | t.CPtr) -> str: pass - -def _get_parent_class(cd: ast.ClassDef | t.CPtr) -> str: pass - -def _has_any_func_cvtable(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _should_method_be_virtual(cd: ast.ClassDef | t.CPtr, fd: ast.FunctionDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _detect_vtable_status(cd: ast.ClassDef | t.CPtr, trans: HT.Translator | t.CPtr) -> int: pass - -def _resolve_enum_member_type(pool: memhub.MemBuddy | t.CPtr, ann_node: ast.AST | t.CPtr, imported_modules: str, from_imports: str) -> llvmlite.LLVMType | t.CPtr: pass - -def _is_state_annotation(node: ast.AST | t.CPtr) -> int: pass - -def _extract_int_value(node: ast.AST | t.CPtr) -> t.CInt64T: pass - -def _translate_enum_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - -def _get_type_size(ty: llvmlite.LLVMType | t.CPtr) -> int: pass - -def _translate_union_def(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr) -> int: pass - - -_generic_class_names: t.CExtern | list[str] | t.CPtr -_generic_class_nodes: t.CExtern | list[ast.ClassDef | t.CPtr] | t.CPtr - -def _is_generic_class(cd: ast.ClassDef | t.CPtr) -> int: pass - -def _register_generic_template(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr) -> t.CInt: pass - -def _find_generic_template(class_name: str) -> ast.ClassDef | t.CPtr: pass - -def _mangle_generic_class_name(pool: memhub.MemBuddy | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def _clone_annotation(pool: memhub.MemBuddy | t.CPtr, node: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_arguments(pool: memhub.MemBuddy | t.CPtr, args: ast.AST | t.CPtr, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.AST | t.CPtr: pass - -def _clone_classdef_for_spec(pool: memhub.MemBuddy | t.CPtr, cd: ast.ClassDef | t.CPtr, spec_name: str, tp_names: list[str] | t.CPtr, type_args: list[str] | t.CPtr) -> ast.ClassDef | t.CPtr: pass - - -_spec_keys: t.CExtern | list[str] | t.CPtr -_spec_names: t.CExtern | list[str] | t.CPtr - -def _find_cached_spec(spec_key: str) -> str: pass - -def _cache_spec(pool: memhub.MemBuddy | t.CPtr, spec_key: str, spec_name: str) -> t.CInt: pass - -def _specialize_generic_class(trans: HT.Translator | t.CPtr, class_name: str, type_args: list[str] | t.CPtr) -> str: pass - -def translate_class_def(trans: HT.Translator | t.CPtr, node: ast.AST | t.CPtr) -> int: pass - - -VTBL_METHOD_MAX: t.CDefine = 32 - -def _vtable_strcat(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _vtable_name_needs_quote(name: str) -> int: pass - -def _format_func_type_str(pool: memhub.MemBuddy | t.CPtr, buf: t.CChar | t.CPtr, buf_size: t.CSizeT, func: llvmlite.Function | t.CPtr) -> int: pass - -def _generate_vtable(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, class_name: str) -> int: pass - -def _translate_oop_methods(trans: HT.Translator | t.CPtr, cd: ast.ClassDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _translate_method(trans: HT.Translator | t.CPtr, fd: ast.FunctionDef | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass - -def _generate_before_init(trans: HT.Translator | t.CPtr, struct_ty: llvmlite.LLVMType | t.CPtr, class_name: str) -> int: pass diff --git a/Test/ArgparseTest/output/08ea5281873244fd.deps.json b/Test/ArgparseTest/output/08ea5281873244fd.deps.json index f0801e0..bd634ff 100644 --- a/Test/ArgparseTest/output/08ea5281873244fd.deps.json +++ b/Test/ArgparseTest/output/08ea5281873244fd.deps.json @@ -1 +1 @@ -{"atom": "271ea3decb810db2", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "argparse": "aba439b7882ad9d6", "hashtable": "b8c66c8ff44eb874", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "argparse": "aba439b7882ad9d6", "hashtable": "b8c66c8ff44eb874", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ArgparseTest/temp/dd3002730623424b.pyi b/Test/ArgparseTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/ArgparseTest/temp/dd3002730623424b.pyi rename to Test/ArgparseTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/BuddyTest/temp/ab6e54ba9a669f76.pyi b/Test/ArgparseTest/temp/9474791561654346.pyi similarity index 83% rename from Test/BuddyTest/temp/ab6e54ba9a669f76.pyi rename to Test/ArgparseTest/temp/9474791561654346.pyi index 4fc3440..1f82b1e 100644 --- a/Test/BuddyTest/temp/ab6e54ba9a669f76.pyi +++ b/Test/ArgparseTest/temp/9474791561654346.pyi @@ -46,3 +46,14 @@ def atoll(src: str) -> t.CInt64T: pass def atof(src: str) -> t.CDouble: pass def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/ArgparseTest/temp/_phase1_manifest.json b/Test/ArgparseTest/temp/_phase1_manifest.json index eb48d04..fc023e8 100644 --- a/Test/ArgparseTest/temp/_phase1_manifest.json +++ b/Test/ArgparseTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ArgparseTest\\App\\main.py": {"sha1": "08ea5281873244fd", "mtime": 1783074740.4694562, "size": 8086}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\argparse.py": {"sha1": "aba439b7882ad9d6", "mtime": 1783072446.3366802, "size": 16968}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hashtable.py": {"sha1": "b8c66c8ff44eb874", "mtime": 1782826619.490043, "size": 9385}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ArgparseTest\\App\\main.py": {"sha1": "08ea5281873244fd", "mtime": 1783074740.4694562, "size": 8086}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\argparse.py": {"sha1": "aba439b7882ad9d6", "mtime": 1783072446.3366802, "size": 16968}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hashtable.py": {"sha1": "b8c66c8ff44eb874", "mtime": 1782826619.490043, "size": 9385}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/ArgparseTest/temp/_sha1_map.txt b/Test/ArgparseTest/temp/_sha1_map.txt index 0b0b531..3af92f0 100644 --- a/Test/ArgparseTest/temp/_sha1_map.txt +++ b/Test/ArgparseTest/temp/_sha1_map.txt @@ -1,13 +1,13 @@ 08ea5281873244fd:main.py +14d33679f7fadf1f:includes/testcheck.py 271ea3decb810db2:includes/atom.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py aba439b7882ad9d6:includes/argparse.py b8c66c8ff44eb874:includes/hashtable.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py -ee084e9fc6ee413a:includes/memhub.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/.transpyc_cache/ee084e9fc6ee413a.pyi b/Test/ArgparseTest/temp/f3560b99de458aec.pyi similarity index 88% rename from .transpyc_cache/ee084e9fc6ee413a.pyi rename to Test/ArgparseTest/temp/f3560b99de458aec.pyi index 45551ef..84f0bbf 100644 --- a/.transpyc_cache/ee084e9fc6ee413a.pyi +++ b/Test/ArgparseTest/temp/f3560b99de458aec.pyi @@ -34,7 +34,7 @@ class MemManager: def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass def reset(self: MemManager) -> t.CInt: pass def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass def __exit__(self: MemManager) -> t.CInt: pass def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass @@ -78,4 +78,9 @@ class MemBuddy(MemManager): def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/AstTest/output/0853acdbdfc9b27c.deps.json b/Test/AstTest/output/0853acdbdfc9b27c.deps.json index 3e48a90..454c6d2 100644 --- a/Test/AstTest/output/0853acdbdfc9b27c.deps.json +++ b/Test/AstTest/output/0853acdbdfc9b27c.deps.json @@ -1 +1 @@ -{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "ast.lexer": "0c212981c180e7fb", "lexer": "0c212981c180e7fb", "atom": "271ea3decb810db2", "ast.__init__": "34548789d646f432", "__init__": "34548789d646f432", "ast": "34548789d646f432", "ast.astaux": "4337fb260448bbe2", "astaux": "4337fb260448bbe2", "ast.exprs": "47767b5026a8ee15", "exprs": "47767b5026a8ee15", "ast.match": "4dd6b3f1427d1cc5", "match": "4dd6b3f1427d1cc5", "ast.base": "5dab8cb390496d22", "base": "5dab8cb390496d22", "posix": "6503c97dde0c79c4", "ast.stmts": "657e182b27c2a022", "stmts": "657e182b27c2a022", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "ab6e54ba9a669f76", "ast.tokens": "b547ac4f380bddb6", "tokens": "b547ac4f380bddb6", "sys": "b5a965302cded36b", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "memhub": "ee084e9fc6ee413a", "ast.parser": "ee52c08239684346", "parser": "ee52c08239684346", "stdint": "f5522571bcce7bcb", "main.tokens": "b547ac4f380bddb6", "main.base": "5dab8cb390496d22", "main.exprs": "47767b5026a8ee15", "main.stmts": "657e182b27c2a022", "main.astaux": "4337fb260448bbe2", "main.match": "4dd6b3f1427d1cc5", "main.lexer": "0c212981c180e7fb"} \ No newline at end of file +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "ast.lexer": "0c212981c180e7fb", "lexer": "0c212981c180e7fb", "atom": "271ea3decb810db2", "ast.__init__": "34548789d646f432", "__init__": "34548789d646f432", "ast": "34548789d646f432", "ast.astaux": "4337fb260448bbe2", "astaux": "4337fb260448bbe2", "ast.exprs": "47767b5026a8ee15", "exprs": "47767b5026a8ee15", "ast.match": "4dd6b3f1427d1cc5", "match": "4dd6b3f1427d1cc5", "ast.base": "5dab8cb390496d22", "base": "5dab8cb390496d22", "posix": "6503c97dde0c79c4", "ast.stmts": "657e182b27c2a022", "stmts": "657e182b27c2a022", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "9474791561654346", "ast.tokens": "b547ac4f380bddb6", "tokens": "b547ac4f380bddb6", "sys": "b5a965302cded36b", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "ast.parser": "ee52c08239684346", "parser": "ee52c08239684346", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ArgparseTest/temp/ab6e54ba9a669f76.pyi b/Test/AstTest/temp/9474791561654346.pyi similarity index 83% rename from Test/ArgparseTest/temp/ab6e54ba9a669f76.pyi rename to Test/AstTest/temp/9474791561654346.pyi index 4fc3440..1f82b1e 100644 --- a/Test/ArgparseTest/temp/ab6e54ba9a669f76.pyi +++ b/Test/AstTest/temp/9474791561654346.pyi @@ -46,3 +46,14 @@ def atoll(src: str) -> t.CInt64T: pass def atof(src: str) -> t.CDouble: pass def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/AstTest/temp/_phase1_manifest.json b/Test/AstTest/temp/_phase1_manifest.json index 5ea6ddb..167d1f2 100644 --- a/Test/AstTest/temp/_phase1_manifest.json +++ b/Test/AstTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\AstTest\\App\\main.py": {"sha1": "0853acdbdfc9b27c", "mtime": 1782892830.6294758, "size": 2439}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\__init__.py": {"sha1": "34548789d646f432", "mtime": 1784102404.6307266, "size": 3409}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\astaux.py": {"sha1": "4337fb260448bbe2", "mtime": 1784006094.7981195, "size": 11489}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\base.py": {"sha1": "5dab8cb390496d22", "mtime": 1784197698.3282094, "size": 14966}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\exprs.py": {"sha1": "47767b5026a8ee15", "mtime": 1783239758.809719, "size": 40615}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\lexer.py": {"sha1": "0c212981c180e7fb", "mtime": 1783400609.908198, "size": 23535}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\match.py": {"sha1": "4dd6b3f1427d1cc5", "mtime": 1782961799.8492737, "size": 12309}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\parser.py": {"sha1": "ee52c08239684346", "mtime": 1784102405.1933146, "size": 85445}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\stmts.py": {"sha1": "657e182b27c2a022", "mtime": 1783929993.759902, "size": 37926}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\tokens.py": {"sha1": "b547ac4f380bddb6", "mtime": 1783165480.469121, "size": 13722}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\platmacro.py": {"sha1": "93c1d18e35d188d6", "mtime": 1781237231.03366, "size": 1422}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\posix.py": {"sha1": "6503c97dde0c79c4", "mtime": 1783064077.6376991, "size": 10386}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\sys.py": {"sha1": "b5a965302cded36b", "mtime": 1783569641.07535, "size": 5509}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32process.py": {"sha1": "067c78e9f121dce3", "mtime": 1781200703.5409546, "size": 4802}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\AstTest\\App\\main.py": {"sha1": "0853acdbdfc9b27c", "mtime": 1782892830.6294758, "size": 2439}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\__init__.py": {"sha1": "34548789d646f432", "mtime": 1784102404.6307266, "size": 3409}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\astaux.py": {"sha1": "4337fb260448bbe2", "mtime": 1784006094.7981195, "size": 11489}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\base.py": {"sha1": "5dab8cb390496d22", "mtime": 1784197698.3282094, "size": 14966}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\exprs.py": {"sha1": "47767b5026a8ee15", "mtime": 1783239758.809719, "size": 40615}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\lexer.py": {"sha1": "0c212981c180e7fb", "mtime": 1783400609.908198, "size": 23535}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\match.py": {"sha1": "4dd6b3f1427d1cc5", "mtime": 1782961799.8492737, "size": 12309}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\parser.py": {"sha1": "ee52c08239684346", "mtime": 1784102405.1933146, "size": 85445}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\stmts.py": {"sha1": "657e182b27c2a022", "mtime": 1783929993.759902, "size": 37926}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\tokens.py": {"sha1": "b547ac4f380bddb6", "mtime": 1783165480.469121, "size": 13722}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\platmacro.py": {"sha1": "93c1d18e35d188d6", "mtime": 1781237231.03366, "size": 1422}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\posix.py": {"sha1": "6503c97dde0c79c4", "mtime": 1783064077.6376991, "size": 10386}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\sys.py": {"sha1": "b5a965302cded36b", "mtime": 1783569641.07535, "size": 5509}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32process.py": {"sha1": "067c78e9f121dce3", "mtime": 1781200703.5409546, "size": 4802}} \ No newline at end of file diff --git a/Test/AstTest/temp/_sha1_map.txt b/Test/AstTest/temp/_sha1_map.txt index 423f2d9..73d8864 100644 --- a/Test/AstTest/temp/_sha1_map.txt +++ b/Test/AstTest/temp/_sha1_map.txt @@ -14,12 +14,12 @@ 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py 93c1d18e35d188d6:includes/platmacro.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py b547ac4f380bddb6:includes/ast\tokens.py b5a965302cded36b:includes/sys.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c3b259b4059f8668:includes/viperlib.py c9f4be41ca1cc2b4:includes/viperio.py -ee084e9fc6ee413a:includes/memhub.py ee52c08239684346:includes/ast\parser.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/AstTest/temp/ee084e9fc6ee413a.pyi b/Test/AstTest/temp/f3560b99de458aec.pyi similarity index 88% rename from Test/AstTest/temp/ee084e9fc6ee413a.pyi rename to Test/AstTest/temp/f3560b99de458aec.pyi index 45551ef..84f0bbf 100644 --- a/Test/AstTest/temp/ee084e9fc6ee413a.pyi +++ b/Test/AstTest/temp/f3560b99de458aec.pyi @@ -34,7 +34,7 @@ class MemManager: def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass def reset(self: MemManager) -> t.CInt: pass def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass def __exit__(self: MemManager) -> t.CInt: pass def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass @@ -78,4 +78,9 @@ class MemBuddy(MemManager): def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/BuddyTest/App/mbuddytest.py b/Test/BuddyTest/App/mbuddytest.py index 08c2dd0..3cbc1d6 100644 --- a/Test/BuddyTest/App/mbuddytest.py +++ b/Test/BuddyTest/App/mbuddytest.py @@ -71,9 +71,13 @@ def mbuddy_main() -> CInt: # === calloc 测试 (验证清零) === testcheck.section("calloc 清零") arena2: bytes = stdlib.malloc(4096) + viperlib.snprintf(buf, 256, "arena2 = %p", arena2) + testcheck.info(buf) bd2: memhub.MemBuddy | CPtr = memhub.MemBuddy(arena2, 4096) dirty: bytes = bd2.alloc(64) + viperlib.snprintf(buf, 256, "dirty = %p", dirty) + testcheck.info(buf) d_c: CUInt8T | CPtr = CPtr(dirty) i: CInt for i in range(64): @@ -81,6 +85,8 @@ def mbuddy_main() -> CInt: bd2.free(dirty) cl: bytes = bd2.calloc(8, 8) + viperlib.snprintf(buf, 256, "cl = %p (arena2=%p, dirty was=%p)", cl, arena2, dirty) + testcheck.info(buf) if cl != None: cl_c: CUInt8T | CPtr = CPtr(cl) all_zero: CInt = 1 diff --git a/Test/BuddyTest/output/5a3d93d7860d5dc0.deps.json b/Test/BuddyTest/output/5a3d93d7860d5dc0.deps.json new file mode 100644 index 0000000..f4452bd --- /dev/null +++ b/Test/BuddyTest/output/5a3d93d7860d5dc0.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "5e430ae5bf7af3a2", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/BuddyTest/output/5e430ae5bf7af3a2.deps.json b/Test/BuddyTest/output/5e430ae5bf7af3a2.deps.json index e6327bb..cace671 100644 --- a/Test/BuddyTest/output/5e430ae5bf7af3a2.deps.json +++ b/Test/BuddyTest/output/5e430ae5bf7af3a2.deps.json @@ -1 +1 @@ -{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "atom": "271ea3decb810db2", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "mbuddytest": "b69cdee68f223fef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "mbuddytest": "5a3d93d7860d5dc0", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/BuddyTest/temp/dd3002730623424b.pyi b/Test/BuddyTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/BuddyTest/temp/dd3002730623424b.pyi rename to Test/BuddyTest/temp/14d33679f7fadf1f.pyi diff --git a/.transpyc_cache/0019c939aae7f9f1.doc.json b/Test/BuddyTest/temp/5a3d93d7860d5dc0.doc.json similarity index 100% rename from .transpyc_cache/0019c939aae7f9f1.doc.json rename to Test/BuddyTest/temp/5a3d93d7860d5dc0.doc.json diff --git a/.transpyc_cache/b69cdee68f223fef.pyi b/Test/BuddyTest/temp/5a3d93d7860d5dc0.pyi similarity index 100% rename from .transpyc_cache/b69cdee68f223fef.pyi rename to Test/BuddyTest/temp/5a3d93d7860d5dc0.pyi diff --git a/.transpyc_cache/ab6e54ba9a669f76.pyi b/Test/BuddyTest/temp/9474791561654346.pyi similarity index 83% rename from .transpyc_cache/ab6e54ba9a669f76.pyi rename to Test/BuddyTest/temp/9474791561654346.pyi index 4fc3440..1f82b1e 100644 --- a/.transpyc_cache/ab6e54ba9a669f76.pyi +++ b/Test/BuddyTest/temp/9474791561654346.pyi @@ -46,3 +46,14 @@ def atoll(src: str) -> t.CInt64T: pass def atof(src: str) -> t.CDouble: pass def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/BuddyTest/temp/_phase1_manifest.json b/Test/BuddyTest/temp/_phase1_manifest.json index 61f3808..b1687f0 100644 --- a/Test/BuddyTest/temp/_phase1_manifest.json +++ b/Test/BuddyTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\BuddyTest\\App\\main.py": {"sha1": "5e430ae5bf7af3a2", "mtime": 1782224154.785576, "size": 260}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\BuddyTest\\App\\mbuddytest.py": {"sha1": "b69cdee68f223fef", "mtime": 1782827825.044477, "size": 19246}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32process.py": {"sha1": "067c78e9f121dce3", "mtime": 1781200703.5409546, "size": 4802}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32sync.py": {"sha1": "06f53cc594b4ac6c", "mtime": 1782297500.2581685, "size": 4726}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\BuddyTest\\App\\main.py": {"sha1": "5e430ae5bf7af3a2", "mtime": 1782224154.785576, "size": 260}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\BuddyTest\\App\\mbuddytest.py": {"sha1": "5a3d93d7860d5dc0", "mtime": 1784377125.6382487, "size": 19514}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32process.py": {"sha1": "067c78e9f121dce3", "mtime": 1781200703.5409546, "size": 4802}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32sync.py": {"sha1": "06f53cc594b4ac6c", "mtime": 1782297500.2581685, "size": 4726}} \ No newline at end of file diff --git a/Test/BuddyTest/temp/_sha1_map.txt b/Test/BuddyTest/temp/_sha1_map.txt index 1524289..b1968c0 100644 --- a/Test/BuddyTest/temp/_sha1_map.txt +++ b/Test/BuddyTest/temp/_sha1_map.txt @@ -1,16 +1,16 @@ 067c78e9f121dce3:includes/w32\win32process.py 06f53cc594b4ac6c:includes/w32\win32sync.py +14d33679f7fadf1f:includes/testcheck.py 271ea3decb810db2:includes/atom.py +5a3d93d7860d5dc0:mbuddytest.py 5e430ae5bf7af3a2:main.py 6f62fe05c5ea1ceb:includes/stdio.py 71e0a3ffcb3ebfad:includes/stdarg.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py -ab6e54ba9a669f76:includes/string.py -b69cdee68f223fef:mbuddytest.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c3b259b4059f8668:includes/viperlib.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py -ee084e9fc6ee413a:includes/memhub.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/BuddyTest/temp/_shared_sym.json b/Test/BuddyTest/temp/_shared_sym.json index 0700beb49977e63f80bff97bcdd3a1504a4e2418..858933dad5603864c24f4f903185acb9828d3095 100644 GIT binary patch literal 426400 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 literal 897978 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 R-)KJ2Q`hB+sqIGO{|8=jzw!V8 diff --git a/Test/BuddyTest/temp/b69cdee68f223fef.doc.json b/Test/BuddyTest/temp/b69cdee68f223fef.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/Test/BuddyTest/temp/b69cdee68f223fef.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/Test/BuddyTest/temp/b69cdee68f223fef.pyi b/Test/BuddyTest/temp/b69cdee68f223fef.pyi deleted file mode 100644 index 3de0cb1..0000000 --- a/Test/BuddyTest/temp/b69cdee68f223fef.pyi +++ /dev/null @@ -1,21 +0,0 @@ -""" -Auto-generated Python stub file from mbuddytest.py -Module: mbuddytest -""" - - -import t, c -from t import CInt, CPtr, CChar, CUInt8T, CUInt32T, CUInt64T, CSizeT -import viperlib -import viperio -import stdlib -import memhub -import string -import testcheck -import w32.win32process -import w32.win32sync -import w32.win32base - -def _thread_alloc_free(param: t.CVoid | t.CPtr) -> t.CUInt32T: pass - -def mbuddy_main() -> CInt: pass diff --git a/Test/BuddyTest/temp/ee084e9fc6ee413a.pyi b/Test/BuddyTest/temp/f3560b99de458aec.pyi similarity index 88% rename from Test/BuddyTest/temp/ee084e9fc6ee413a.pyi rename to Test/BuddyTest/temp/f3560b99de458aec.pyi index 45551ef..84f0bbf 100644 --- a/Test/BuddyTest/temp/ee084e9fc6ee413a.pyi +++ b/Test/BuddyTest/temp/f3560b99de458aec.pyi @@ -34,7 +34,7 @@ class MemManager: def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass def reset(self: MemManager) -> t.CInt: pass def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass def __exit__(self: MemManager) -> t.CInt: pass def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass @@ -78,4 +78,9 @@ class MemBuddy(MemManager): def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/BuiltinDecoratorTest/output/e3ac223bdaf94a0c.deps.json b/Test/BuiltinDecoratorTest/output/e3ac223bdaf94a0c.deps.json index d39611e..6162c1a 100644 --- a/Test/BuiltinDecoratorTest/output/e3ac223bdaf94a0c.deps.json +++ b/Test/BuiltinDecoratorTest/output/e3ac223bdaf94a0c.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/BuiltinDecoratorTest/temp/dd3002730623424b.pyi b/Test/BuiltinDecoratorTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/BuiltinDecoratorTest/temp/dd3002730623424b.pyi rename to Test/BuiltinDecoratorTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/BuiltinDecoratorTest/temp/_phase1_manifest.json b/Test/BuiltinDecoratorTest/temp/_phase1_manifest.json index be3bd83..16da402 100644 --- a/Test/BuiltinDecoratorTest/temp/_phase1_manifest.json +++ b/Test/BuiltinDecoratorTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\BuiltinDecoratorTest\\App\\main.py": {"sha1": "e3ac223bdaf94a0c", "mtime": 1782110312.4550886, "size": 8488}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\BuiltinDecoratorTest\\App\\main.py": {"sha1": "e3ac223bdaf94a0c", "mtime": 1782110312.4550886, "size": 8488}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/BuiltinDecoratorTest/temp/_sha1_map.txt b/Test/BuiltinDecoratorTest/temp/_sha1_map.txt index b7d9faf..baa82d5 100644 --- a/Test/BuiltinDecoratorTest/temp/_sha1_map.txt +++ b/Test/BuiltinDecoratorTest/temp/_sha1_map.txt @@ -1,7 +1,7 @@ +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py e3ac223bdaf94a0c:main.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/CPythonTest/output/7c5d5ec59c5fb0a8.deps.json b/Test/CPythonTest/output/7c5d5ec59c5fb0a8.deps.json index 3410980..ac61f3a 100644 --- a/Test/CPythonTest/output/7c5d5ec59c5fb0a8.deps.json +++ b/Test/CPythonTest/output/7c5d5ec59c5fb0a8.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb", "main": "fb6cea4f70fade7a"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb", "main": "fb6cea4f70fade7a"} \ No newline at end of file diff --git a/Test/CPythonTest/output/fb6cea4f70fade7a.deps.json b/Test/CPythonTest/output/fb6cea4f70fade7a.deps.json index ace5dc1..77cce3b 100644 --- a/Test/CPythonTest/output/fb6cea4f70fade7a.deps.json +++ b/Test/CPythonTest/output/fb6cea4f70fade7a.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "cpython": "7c5d5ec59c5fb0a8", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "cpython": "7c5d5ec59c5fb0a8", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/CPythonTest/temp/dd3002730623424b.pyi b/Test/CPythonTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/CPythonTest/temp/dd3002730623424b.pyi rename to Test/CPythonTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/CPythonTest/temp/_phase1_manifest.json b/Test/CPythonTest/temp/_phase1_manifest.json index 15aa5ad..d411b38 100644 --- a/Test/CPythonTest/temp/_phase1_manifest.json +++ b/Test/CPythonTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\CPythonTest\\App\\cpython.py": {"sha1": "7c5d5ec59c5fb0a8", "mtime": 1781613876.1585274, "size": 39169}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\CPythonTest\\App\\main.py": {"sha1": "fb6cea4f70fade7a", "mtime": 1782403889.06048, "size": 13919}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\CPythonTest\\App\\cpython.py": {"sha1": "7c5d5ec59c5fb0a8", "mtime": 1781613876.1585274, "size": 39169}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\CPythonTest\\App\\main.py": {"sha1": "fb6cea4f70fade7a", "mtime": 1782403889.06048, "size": 13919}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/CPythonTest/temp/_sha1_map.txt b/Test/CPythonTest/temp/_sha1_map.txt index c8ce35d..8859590 100644 --- a/Test/CPythonTest/temp/_sha1_map.txt +++ b/Test/CPythonTest/temp/_sha1_map.txt @@ -1,7 +1,7 @@ +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 7c5d5ec59c5fb0a8:cpython.py 7e529fe7a078cfef:includes/w32\win32base.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py fb6cea4f70fade7a:main.py diff --git a/Test/CPythonTest/temp/_shared_sym.json b/Test/CPythonTest/temp/_shared_sym.json index bfedc6a17d0670c496695f9b5aa02f4623d825a2..1ac55d9181ecc80cfacec69bbb55b51122ab61a0 100644 GIT binary patch literal 567405 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�n~|Ej-U`>K`y<2#$9 zHyu1|>mHdI&&l*Y0Q`6Tz35#VBx{hILCWzP&sk0FH?&#Bf6+gUUNrWL?v+z5c+tOz zUNq{9UNkb39LpDcG8#PMG3D+TnwxZw*JM;#f)RsE8f3~K8DkvtJ$~Q9*o%zuAm)60+QQg}jS=%b&f7sf(DWJpcvEcp%BHYy$+)?N+3%z!+-|ry{@P`lqFSh^-(hN3O(E|HnM6kA)2WYuH zHrzWcxDO-3U1Po59vyD=nJDP!a=zPw{1HURt1QR^X1{FgSNui`??(~wF0=3sC$O=; z+rs*n_*e&qv9UgEVSNM<>w4?GzC_Baz4A$!-WZFG`ZE^lk0GMAL+4?r{hiFHr?3(K zy@mKuM8vke8j`YV9^C_f-@^NGM7;J=Ar9SmvES~~7TQlBqP6v$(ADVy+DehO5JX%q z%-d-$em{wbc%x;v;;IfVI3v*uZKX8!n_gw%ehd+}J&zMJIbB2#Eibe1{uLr#+duU~ z(|vf?{cs-#`di*a~`-N2GjK)>`3{do0Y4BVxAS^nljWE9apfZVUX>Aq(}V z5m9d_+p*Tc7A@FMAi@Us4CfJZQ_#^+&P^A5TJ~|-<-5~DyR3HCn&a*eES}6hL+DuV zwy-Wo#wwkJoA$8Z>l-bsD-f|lZB23@9vkiJX9~8=n=^Kllpn6?=(x8ek}IJW|7!0V z*5;0>bddE1*YQYE`dL5K0Z#aH^>bJxl!mKH^Fg% zn+yC|bO@Ps;CcyhAGaCJ5%fj5{wtl#?J_QR@3%z}j7RVr|W(fX| zpD6`0sbOnj1)dh5k~VoXG7Mls=BgN0A&Vih40Biv7vhP*^b%5Pl(8LR6fvX>l8zIJ zTg0#yPYZNaFp!gVSw`+WNHox=jy9-(-Fyn9zET13*q@~{^UoAD$;U4ml~7zNQNi@G8x zM8B&9oAe`(!v6C)@)EOb&=hTM-v-;Of^Y&)5pY^5p^JJ!O9nf8=QtA;ntq={6j83C zFu`CZvUs8ZGeJ9pC8-0UUj$j5HkH4u@*n58s>Y+qS9`}7DxNSPz9!q2Y-GQe0(mxUEMdlDRID0-i`9AT5g|K`*vR zvXzimwomu%IoI}S6n+F)zMjI<1{{&9Xd{va+2u-ry*VcPmP z&asq@3`YRN@p3$MK(^d896eglSfiQUlRc0i_q%VCwxz!m*8l5Z+D1n@?k>Suf~~e4 zJAO4m#Xh zj_#Fs0&yY@%V0!CW6mD;xEoIsP`%?}G%&Og*$bwO`D^gB;bhEvwBW&K6Cnm%>-viM z9Ub?T{K5=4|LK3N>vJMq&aFt}wRoz4norwegpkQ-LKX`1g-Go!iQmVQM8!}f0w*w< zQG~Xwaj5Bg_j7wI!oX7mBs|T_dCc9`5WL5)_ndPFK1y2zNL#!fPa5DqENLKx70P3K z{jEh5QuwyX_yasiR9TAzbY;y2s?KP}g+$gOfVFr7o;09WuYLEI=}JNnM-vr(kvIZ~ z~X=Z((8UaaX@V97?d7ue60UECM)6?ktQ}xqFQpMBMgHmovC%k=5luu_;#RGV%fP9Ff3VIMWWJA)_a^~5nnuFy$(>w7* z;xZja^0FSbyKz)f@i%72riMXEbO?^gvb-BlG*ANMSeBTYofh)}^CVsoN+gl+n|i$$ zPa>{0Fr2ebF(yYE#;^?)5+%|CB+?$l(}^oc0iEcgoYR;hS9YaD?uN`wxrgv10)fbZ8C}w%0s;5Iqq%#4@N z;Ryxq{$$E~%t92=GB&_6_R$teBS6B#kw#Qm#<#NU6L`{qBT@%cH4}9oboEAbui(oDLKY<1m@3*Gg)sbXB>x(oe9FsYl`()Z)v&`+L&MZb zL_FI-HG`oo-Dv?n0kmZ z?sL7<{*!p3fEo`=6j923&ZgYIgC_@A&suVba_+Hs!Lx7q+}*tWZVPl0CEeqs=PWr8 z_iZN_STEdqC;tncUZA?PY*&yn9#Nu<*WTV!c)BTvCnI9&1k(nvo$7GXrwwx*QTjAM z`t%2Qs({j=UOB~HIux}tIziPb-c^34cjrTNHaIw;B5qCE1yh>_5X(i(^@AweYemk!E-o6a5@d zGmeGnl`|CTbAVC@$})?6k8v>Y)ZpuCGtE>p65UCR08{WW=tFH*v#1-n`iLV zAV@Q8ZOCR(3lyz-1FU*~iKhuDaW^f*VKGyXB2@@*JNF=T?HGdp;S?qrF~}i6N+(`?RU7OUJSbIzVQA6kMa3%Fd&wiW{#bcoT#T&PVQqJ4T^3*Mpb z7O5mrm`G(rjV+_zaQPC&qv6M+%Mn!qhhA)3a;vEI=!`LGBoXf|Ic|nzC89*u)k-9) z`FYNyScg_43Z-I8;J`x*Y)KTr1_)r+APS{oQEZ{K#G*uU2_Tnsh;pge6)0rqV^_>& za@0MQwRNp0wq4rS8zxh+2Wl>GEdsSiZo$${;$s z%Th}}v=vbjl^V6U%2q5r3#St4fk_X~N7Mrx`L|8PsGK4(H9IZl+3Z9!OB(2cckW8) zC{7I!r@jDDI~%;TLoZtmKOV7{#7*fZvN}vwXFH;DDj5{0Od(8inS~qLv$dlGj!m5@ zZ6!P6Wal=r3(j5dG00wn>^n>L3zq_4>!4bBy+Jk@WTQbg8DujQeQZ%a*X{o|<79sv z{^G?3xdi^~mGJ-7adN#uZZOD=@Q>XD&$!tjw>)Rt^A7Dm6htLb9h7oYI(JEE+x%aw z0g|{Sl0<2u?zrL5E<{OGc5I>+o6ogY@I!lAB9y3e;&ZhZ{LsFZ2qtQT_uM&AK6D+T zL@H^LUO76mHJ8t9y%YXihL6< z-xNob$Lg{P>Pd&8jVNy6dX4kY2%&t?0 zuXFlNGby56Mq-%^Gx*q9at9{mqkQJ~%3(@W`^?Mnj3H_X7DbjxNyhRLYnMG!7&{!% zL=g!uVPp`60lC*IVeATKU0e-1cScJaVjuP7R`r}~iBcdwiHljba>iNMkVlsJ7n9KX zqAs(TWL{KXRMoqBXu4IJV2)O2p@}FF5+D(hM^wh9vR?sf(JyDD99WD1=kp?s;GDVA z5j6tY5IgpOY)AlYl-D*@(T9D9uPL1J+NR-ZCaQ1-kLp=!YmftR67w#X8#;+78OX2J zN@i4=3^8VnR09>)FC`OB=*q1f-)ThEKqjT4nt_}SSDw%ouxz=tW~@z9n>vxXVKO&& zAquAw#ej#h`j&9lPBVAUN77-E&hH^gXVu8e!GXbq4#~D;UrsA99{+2U$&XaPq=Hu< zssKXVvI<~FSQ52BX%ok0gxaZ?4OlBTQqAVQc$cBDC7M5i`uba77$bkUQ#vmi&hAR$!4b6dvV z+X7wKfkXhu5!nmgO<2z&>H>mH(~sEpVo*(;Xi+#3xs4jP@wyhsz%~z&49FpajK)a< zT1Je;$+$rd$H|d6Ickt&kmS4_e)~95va^UNgN?Q|u-pUOb|vewn33<2!e3)V2?(Z@ z=Kn%egX0^h3~WV2zF}?{g+D};!E!JP`FwIXl`7=(94tYr>oV@2*DTh+8?= zn-CQNM{B7fVvv($J8vC4`4mNqHPK=T|NZw%dWx+rl+Qk>s|KUFs*5Ng#S}!m8Br_H zSB}~WJ5R|JKSXM2=>p`B5Y+CP>``NxRD zfkP@(IM8maC0E2mj)=(-y}cz03BO#_3S1f%h(-!wQph_H6+(B`!G;_V({O=9AuBN! z`2}CxL_6y>i<@^Ls=!Wn#ML1wtLA5z0*^=n#2~Uk6oZ^FNX8&pgX9dN1~`E79z+S) z`Hhjh+%gjocJv zL&MSP{kG@yHrrn#>I6Do530GTWQ<6RRavvB)r;H-lRNo5q8`AV^h0AnJrcwmPI`Y4 zQ4rur#&dE?O-qp^=CCBbgeVEH5eH^;Ns9zAhXwIvL_yFXLe?UmF_#a5d<9VtU?9c{ z)0xO)%w<7*4N(waAZYik$YIQ3hw*h>J8@u6r)W3#=UR?8CL^Z&AgPMz2aBJZ>5YwMT<|0lc zZl&D+f+!HkYFib$QH(LC+m}3rsENuouThvmoCJKZdPgeZuLBZ-2I=aSL*F``B)MuT>_U`l6rFJA4{O2f5lREZVfK)_EBRZaxmB-x)=vtgV|t*-U7K1CLW*IjBq zM^p;SM6H5nEL*t#Ji;x-kum}(<5@&y zI981ABebM@RHT#uO8E_aklQ^oOAyrr{wgL;YXzvFiA$$~8KmmOvCBM_?NMZbcoovDLevag zjO=LUprnte(85<@yQGLc6pqSkm_nTk5oH3o7ne-p2+96OmUVP&ySsFzw3Y0Llbzeh zE-266W01WD*>{%g7rKD6bwYHKx#lGE+SZ6-K!cvGGKYj*LoXApk(dm}dPI%5{0m$* z!@<8qRaU&hkd25karqaJ3A2A;k3k|+!emM|BWh%QB?bYF^h%nZFQjxe)Mz!bCcLc4 z7DS~$Za*R2S&(w6s1MUz?!$Bmq9&jov#f~(T+z;y9x=0Kz7;1 z^-FYbP0jk{GDJy0&{3Aepp=`^*>2~JL}4dUxwTWdqD7*JskxLGopKJpfd;p9`&BJc z%BVCgg{qY3U^DNXndc!&1xk?0o(9tF1Gj4sMKwyUMRy;d{F=Of#~WLx$k zs>HqJGmuM5r$by{HzScK-OnVE{VkG6OfBTF6T6W_m?ZKdM2WaJ3F$R}Oh#lD`$5q` zjQ|HVu16Gx+r60g0Y=IQe%}|jU7#Bgl>sJWNSvOA6JXI5aKRQK88kwi2<{XyR5;6QmiYkRnQI+)*O8!_lDQ@as#-1mRta)Q2dM zbrrK=NhCn`5+9*Nod|dpJRd|93Y5k>{>3gYX^B#z_BVuVwafk(o0ll!rLJU zh`MpDY#?A^+lGnKV^x6)wfIfAGZ$d%YOWk`h1ji)2M#Nvf}OA{QfyyX_b9z)a%bg;4Y z(w|Y)e6M^`=5d=(!!pÊgRwNGs1Z!*U0rR$yuDI3hJ&$f(Hs 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
cubPY>#-d z_7xzg>HkU>Cob)v%fjy{Fxj!slT7~N53AR=JDmRV=cgSy&H}eCa&p<-McTx3A(QGc?kP@dJ`ZxpLuT<@oy$?7(BJZvRRsBl$t~ z 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 KRQ9!9kNhu3p@%sD diff --git a/Test/ClosureTest/output/52e6b51da061882f.deps.json b/Test/ClosureTest/output/52e6b51da061882f.deps.json index f02d7ee..2a27f59 100644 --- a/Test/ClosureTest/output/52e6b51da061882f.deps.json +++ b/Test/ClosureTest/output/52e6b51da061882f.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ClosureTest/temp/dd3002730623424b.pyi b/Test/ClosureTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/ClosureTest/temp/dd3002730623424b.pyi rename to Test/ClosureTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/ClosureTest/temp/_phase1_manifest.json b/Test/ClosureTest/temp/_phase1_manifest.json index 53006ec..08588c9 100644 --- a/Test/ClosureTest/temp/_phase1_manifest.json +++ b/Test/ClosureTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ClosureTest\\App\\main.py": {"sha1": "52e6b51da061882f", "mtime": 1782266177.611862, "size": 5497}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ClosureTest\\App\\main.py": {"sha1": "52e6b51da061882f", "mtime": 1782266177.611862, "size": 5497}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/ClosureTest/temp/_sha1_map.txt b/Test/ClosureTest/temp/_sha1_map.txt index bf5f6eb..96dfbac 100644 --- a/Test/ClosureTest/temp/_sha1_map.txt +++ b/Test/ClosureTest/temp/_sha1_map.txt @@ -1,6 +1,6 @@ +14d33679f7fadf1f:includes/testcheck.py 52e6b51da061882f:main.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/ClosureTest2/output/440f18f9dce85a95.deps.json b/Test/ClosureTest2/output/440f18f9dce85a95.deps.json index f02d7ee..2a27f59 100644 --- a/Test/ClosureTest2/output/440f18f9dce85a95.deps.json +++ b/Test/ClosureTest2/output/440f18f9dce85a95.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ClosureTest2/temp/dd3002730623424b.pyi b/Test/ClosureTest2/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/ClosureTest2/temp/dd3002730623424b.pyi rename to Test/ClosureTest2/temp/14d33679f7fadf1f.pyi diff --git a/Test/ClosureTest2/temp/_phase1_manifest.json b/Test/ClosureTest2/temp/_phase1_manifest.json index b1275e7..3bc899e 100644 --- a/Test/ClosureTest2/temp/_phase1_manifest.json +++ b/Test/ClosureTest2/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ClosureTest2\\App\\main.py": {"sha1": "440f18f9dce85a95", "mtime": 1782266179.2717218, "size": 7586}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ClosureTest2\\App\\main.py": {"sha1": "440f18f9dce85a95", "mtime": 1782266179.2717218, "size": 7586}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/ClosureTest2/temp/_sha1_map.txt b/Test/ClosureTest2/temp/_sha1_map.txt index c01f543..1a0a5e9 100644 --- a/Test/ClosureTest2/temp/_sha1_map.txt +++ b/Test/ClosureTest2/temp/_sha1_map.txt @@ -1,6 +1,6 @@ +14d33679f7fadf1f:includes/testcheck.py 440f18f9dce85a95:main.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/DecoratorMarkerTest/output/b1122357fee8fd68.deps.json b/Test/DecoratorMarkerTest/output/b1122357fee8fd68.deps.json index f02d7ee..2a27f59 100644 --- a/Test/DecoratorMarkerTest/output/b1122357fee8fd68.deps.json +++ b/Test/DecoratorMarkerTest/output/b1122357fee8fd68.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/DecoratorMarkerTest/temp/dd3002730623424b.pyi b/Test/DecoratorMarkerTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/DecoratorMarkerTest/temp/dd3002730623424b.pyi rename to Test/DecoratorMarkerTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/DecoratorMarkerTest/temp/_phase1_manifest.json b/Test/DecoratorMarkerTest/temp/_phase1_manifest.json index 4e31ba8..48674f2 100644 --- a/Test/DecoratorMarkerTest/temp/_phase1_manifest.json +++ b/Test/DecoratorMarkerTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\DecoratorMarkerTest\\App\\main.py": {"sha1": "b1122357fee8fd68", "mtime": 1782110269.7636156, "size": 1840}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\DecoratorMarkerTest\\App\\main.py": {"sha1": "b1122357fee8fd68", "mtime": 1782110269.7636156, "size": 1840}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/DecoratorMarkerTest/temp/_sha1_map.txt b/Test/DecoratorMarkerTest/temp/_sha1_map.txt index 235a656..a08ed2e 100644 --- a/Test/DecoratorMarkerTest/temp/_sha1_map.txt +++ b/Test/DecoratorMarkerTest/temp/_sha1_map.txt @@ -1,6 +1,6 @@ +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py b1122357fee8fd68:main.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/DecoratorTest/output/814e6b31adfc6256.deps.json b/Test/DecoratorTest/output/814e6b31adfc6256.deps.json index f02d7ee..2a27f59 100644 --- a/Test/DecoratorTest/output/814e6b31adfc6256.deps.json +++ b/Test/DecoratorTest/output/814e6b31adfc6256.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/DecoratorTest/temp/dd3002730623424b.pyi b/Test/DecoratorTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/DecoratorTest/temp/dd3002730623424b.pyi rename to Test/DecoratorTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/DecoratorTest/temp/_phase1_manifest.json b/Test/DecoratorTest/temp/_phase1_manifest.json index cfc1fbe..963980f 100644 --- a/Test/DecoratorTest/temp/_phase1_manifest.json +++ b/Test/DecoratorTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\DecoratorTest\\App\\main.py": {"sha1": "814e6b31adfc6256", "mtime": 1782110086.8867075, "size": 10275}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\DecoratorTest\\App\\main.py": {"sha1": "814e6b31adfc6256", "mtime": 1782110086.8867075, "size": 10275}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/DecoratorTest/temp/_sha1_map.txt b/Test/DecoratorTest/temp/_sha1_map.txt index 25fd6ed..9afdfce 100644 --- a/Test/DecoratorTest/temp/_sha1_map.txt +++ b/Test/DecoratorTest/temp/_sha1_map.txt @@ -1,6 +1,6 @@ +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py 814e6b31adfc6256:main.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/DictTest/output/b3c2b99b6f3be4c7.deps.json b/Test/DictTest/output/b3c2b99b6f3be4c7.deps.json new file mode 100644 index 0000000..8dbb9c7 --- /dev/null +++ b/Test/DictTest/output/b3c2b99b6f3be4c7.deps.json @@ -0,0 +1 @@ +{"testcheck": "14d33679f7fadf1f", "json.__writer": "20cd49775c100a38", "__writer": "20cd49775c100a38", "json.__parser": "240a9a4157959a9f", "__parser": "240a9a4157959a9f", "atom": "271ea3decb810db2", "json.__init__": "57288496f7c2d1ad", "__init__": "57288496f7c2d1ad", "json": "57288496f7c2d1ad", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_dict": "e3e7b6de8d7d8b03", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/DictTest/temp/dd3002730623424b.pyi b/Test/DictTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/DictTest/temp/dd3002730623424b.pyi rename to Test/DictTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/DictTest/temp/9474791561654346.pyi b/Test/DictTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/DictTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/DictTest/temp/_phase1_manifest.json b/Test/DictTest/temp/_phase1_manifest.json index 97063a5..caf5f35 100644 --- a/Test/DictTest/temp/_phase1_manifest.json +++ b/Test/DictTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\DictTest\\App\\main.py": {"sha1": "b3c2b99b6f3be4c7", "mtime": 1782827868.8446941, "size": 8245}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_dict.py": {"sha1": "e3e7b6de8d7d8b03", "mtime": 1782919714.6072268, "size": 12055}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\json\\__init__.py": {"sha1": "57288496f7c2d1ad", "mtime": 1783239811.8873823, "size": 7653}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\json\\__parser.py": {"sha1": "240a9a4157959a9f", "mtime": 1782826918.100951, "size": 7517}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\json\\__writer.py": {"sha1": "20cd49775c100a38", "mtime": 1782826901.8906734, "size": 3784}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\DictTest\\App\\main.py": {"sha1": "b3c2b99b6f3be4c7", "mtime": 1782827868.8446941, "size": 8245}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_dict.py": {"sha1": "e3e7b6de8d7d8b03", "mtime": 1782919714.6072268, "size": 12055}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\json\\__init__.py": {"sha1": "57288496f7c2d1ad", "mtime": 1783239811.8873823, "size": 7653}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\json\\__parser.py": {"sha1": "240a9a4157959a9f", "mtime": 1782826918.100951, "size": 7517}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\json\\__writer.py": {"sha1": "20cd49775c100a38", "mtime": 1782826901.8906734, "size": 3784}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/DictTest/temp/_sha1_map.txt b/Test/DictTest/temp/_sha1_map.txt index 640f738..8c70a57 100644 --- a/Test/DictTest/temp/_sha1_map.txt +++ b/Test/DictTest/temp/_sha1_map.txt @@ -1,3 +1,4 @@ +14d33679f7fadf1f:includes/testcheck.py 20cd49775c100a38:includes/json\__writer.py 240a9a4157959a9f:includes/json\__parser.py 271ea3decb810db2:includes/atom.py @@ -5,11 +6,10 @@ 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py b3c2b99b6f3be4c7:main.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py e3e7b6de8d7d8b03:includes/_dict.py -ee084e9fc6ee413a:includes/memhub.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/DictTest/temp/ab6e54ba9a669f76.pyi b/Test/DictTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/DictTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/DictTest/temp/ee084e9fc6ee413a.pyi b/Test/DictTest/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/DictTest/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/DictTest/temp/f3560b99de458aec.pyi b/Test/DictTest/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/DictTest/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/DocTest/output/14a9b576ab5d21c9.deps.json b/Test/DocTest/output/14a9b576ab5d21c9.deps.json index 8c41c52..e51640e 100644 --- a/Test/DocTest/output/14a9b576ab5d21c9.deps.json +++ b/Test/DocTest/output/14a9b576ab5d21c9.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "remote": "f26d7266c4f8762b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "remote": "f26d7266c4f8762b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/DocTest/output/f26d7266c4f8762b.deps.json b/Test/DocTest/output/f26d7266c4f8762b.deps.json index bb4c88a..f6647fb 100644 --- a/Test/DocTest/output/f26d7266c4f8762b.deps.json +++ b/Test/DocTest/output/f26d7266c4f8762b.deps.json @@ -1 +1 @@ -{"main": "14a9b576ab5d21c9", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"main": "14a9b576ab5d21c9", "testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/DocTest/temp/dd3002730623424b.pyi b/Test/DocTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/DocTest/temp/dd3002730623424b.pyi rename to Test/DocTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/DocTest/temp/9474791561654346.pyi b/Test/DocTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/DocTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/DocTest/temp/_phase1_manifest.json b/Test/DocTest/temp/_phase1_manifest.json index 4de65ec..bca0a48 100644 --- a/Test/DocTest/temp/_phase1_manifest.json +++ b/Test/DocTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\DocTest\\App\\main.py": {"sha1": "14a9b576ab5d21c9", "mtime": 1782474568.0454285, "size": 2162}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\DocTest\\App\\remote.py": {"sha1": "f26d7266c4f8762b", "mtime": 1782397989.7183921, "size": 271}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\DocTest\\App\\main.py": {"sha1": "14a9b576ab5d21c9", "mtime": 1782474568.0454285, "size": 2162}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\DocTest\\App\\remote.py": {"sha1": "f26d7266c4f8762b", "mtime": 1782397989.7183921, "size": 271}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/DocTest/temp/_sha1_map.txt b/Test/DocTest/temp/_sha1_map.txt index 6779449..c5995f7 100644 --- a/Test/DocTest/temp/_sha1_map.txt +++ b/Test/DocTest/temp/_sha1_map.txt @@ -1,8 +1,8 @@ 14a9b576ab5d21c9:main.py +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f26d7266c4f8762b:remote.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/DocTest/temp/_shared_sym.json b/Test/DocTest/temp/_shared_sym.json index fd3e3b779d65d475445207fd6edd772ce7fa1493..7a82d908218bffdb464caf8dee5994b421bd1bbe 100644 GIT binary patch literal 306737 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 yf-f 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 VP5>0eV7`62rR%BbXl&-U{XZ3xPh0>1 literal 778315 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 diff --git a/Test/DocTest/temp/ab6e54ba9a669f76.pyi b/Test/DocTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/DocTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/EdgeCaseTest/output/ac0d686cb2cc783b.deps.json b/Test/EdgeCaseTest/output/ac0d686cb2cc783b.deps.json index f02d7ee..2a27f59 100644 --- a/Test/EdgeCaseTest/output/ac0d686cb2cc783b.deps.json +++ b/Test/EdgeCaseTest/output/ac0d686cb2cc783b.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/EdgeCaseTest/temp/dd3002730623424b.pyi b/Test/EdgeCaseTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/EdgeCaseTest/temp/dd3002730623424b.pyi rename to Test/EdgeCaseTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/EdgeCaseTest/temp/_phase1_manifest.json b/Test/EdgeCaseTest/temp/_phase1_manifest.json index 6ba8e32..410c9f8 100644 --- a/Test/EdgeCaseTest/temp/_phase1_manifest.json +++ b/Test/EdgeCaseTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\EdgeCaseTest\\App\\main.py": {"sha1": "ac0d686cb2cc783b", "mtime": 1782110086.5178304, "size": 7487}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\EdgeCaseTest\\App\\main.py": {"sha1": "ac0d686cb2cc783b", "mtime": 1782110086.5178304, "size": 7487}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/EdgeCaseTest/temp/_sha1_map.txt b/Test/EdgeCaseTest/temp/_sha1_map.txt index d770431..57a4084 100644 --- a/Test/EdgeCaseTest/temp/_sha1_map.txt +++ b/Test/EdgeCaseTest/temp/_sha1_map.txt @@ -1,6 +1,6 @@ +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py ac0d686cb2cc783b:main.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/EqTest/output/78943d0dbc89a29a.deps.json b/Test/EqTest/output/78943d0dbc89a29a.deps.json index 262dabd..a86f7c5 100644 --- a/Test/EqTest/output/78943d0dbc89a29a.deps.json +++ b/Test/EqTest/output/78943d0dbc89a29a.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/EqTest/temp/dd3002730623424b.pyi b/Test/EqTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/EqTest/temp/dd3002730623424b.pyi rename to Test/EqTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/EqTest/temp/9474791561654346.pyi b/Test/EqTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/EqTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/EqTest/temp/_phase1_manifest.json b/Test/EqTest/temp/_phase1_manifest.json index 0a06c09..accb846 100644 --- a/Test/EqTest/temp/_phase1_manifest.json +++ b/Test/EqTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\EqTest\\App\\main.py": {"sha1": "78943d0dbc89a29a", "mtime": 1782354684.7481763, "size": 2169}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\EqTest\\App\\main.py": {"sha1": "78943d0dbc89a29a", "mtime": 1782354684.7481763, "size": 2169}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/EqTest/temp/_sha1_map.txt b/Test/EqTest/temp/_sha1_map.txt index 7245b3a..e2218db 100644 --- a/Test/EqTest/temp/_sha1_map.txt +++ b/Test/EqTest/temp/_sha1_map.txt @@ -1,8 +1,8 @@ +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 78943d0dbc89a29a:main.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/EqTest/temp/ab6e54ba9a669f76.pyi b/Test/EqTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/EqTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/FakeDuckTest/output/0035c95a18d4f8e8.deps.json b/Test/FakeDuckTest/output/0035c95a18d4f8e8.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/0035c95a18d4f8e8.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/067c78e9f121dce3.deps.json b/Test/FakeDuckTest/output/067c78e9f121dce3.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/067c78e9f121dce3.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/06f53cc594b4ac6c.deps.json b/Test/FakeDuckTest/output/06f53cc594b4ac6c.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/06f53cc594b4ac6c.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/14d33679f7fadf1f.deps.json b/Test/FakeDuckTest/output/14d33679f7fadf1f.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/14d33679f7fadf1f.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/271ea3decb810db2.deps.json b/Test/FakeDuckTest/output/271ea3decb810db2.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/271ea3decb810db2.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/48352329f97d0858.deps.json b/Test/FakeDuckTest/output/48352329f97d0858.deps.json index 11eebcc..94d3978 100644 --- a/Test/FakeDuckTest/output/48352329f97d0858.deps.json +++ b/Test/FakeDuckTest/output/48352329f97d0858.deps.json @@ -1 +1 @@ -{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "atom": "271ea3decb810db2", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "_list": "f2ecbf8ced20575c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/5b2e220c5bae60c9.deps.json b/Test/FakeDuckTest/output/5b2e220c5bae60c9.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/5b2e220c5bae60c9.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/6446627d4f07a1b5.deps.json b/Test/FakeDuckTest/output/6446627d4f07a1b5.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/6446627d4f07a1b5.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/72e2d5ccb7cedcf1.deps.json b/Test/FakeDuckTest/output/72e2d5ccb7cedcf1.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/72e2d5ccb7cedcf1.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/79b337e5ea8951e2.deps.json b/Test/FakeDuckTest/output/79b337e5ea8951e2.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/79b337e5ea8951e2.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/7e529fe7a078cfef.deps.json b/Test/FakeDuckTest/output/7e529fe7a078cfef.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/7e529fe7a078cfef.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/9474791561654346.deps.json b/Test/FakeDuckTest/output/9474791561654346.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/9474791561654346.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/_shared_sym_includes.pickle b/Test/FakeDuckTest/output/_shared_sym_includes.pickle new file mode 100644 index 0000000000000000000000000000000000000000..9e822ec7fccc76d71bd2a0bfe76e3d66c2ad9907 GIT binary patch literal 623853 zcmeFa3wRvYbtVXsct1$+{SqH~SR(bH34jDC$&%G*G{{x~)lheXASF=kMt6a?FB{!R zKLk<e@j*Ksm=XfnIAGub5LWG3<2>m-_F;@NK}*(j52 zG&}2TwBCEGy1J{n>NbGebx%>K=J!cN0U!$hx&J-)oO93PmCiS|b!_XPf9_OHl?U^; zmlw0?SRuZcRx0Iv>D1zxL^h|KiKw5CYM&l3K7G1!`qc{kx4kj#ALrGlu2g=dkgJsM zsr`t{@k}zUivy`pWe$b9sAzvx)uKh#$9g!6!Q7QMNu9a_39gRI>6~C0-uZzKMQAEE8W=)Sp@ZmpP?S%w;NQP?IIvh4zq-C_c2mypu{I zl}V(FNg}>NrQGG8$Y#@ZfpxtUPZ#NL)QP`rNauEH5fK%HHyB@}9)X z?E=bXV%bHkBq)FS$R}6giJPjp29wGX`I#|Y@_kCCsI4shS^er$?Q7&8rZV(bPz9xa z6kE(DZ<7@p(!QWmN7jUs$!2aZXN!6A{X28jpG8ESA^U<*aVV)I((#;<)WkyGH}?aC?nZ2BegbG0wf z?L@vSU&s|z0rZdu`pb}SrK?oTq_P?EaX49+cSuqnnl3*+`NYCpo~-slRLL!;WaU;dzc8uf zZx*sE3(;IWlb^lqU(om5LV~<9Rmh)Nxt*$@8S+yIz0hn4Jy$|u8AZq^qB5E*p(`?) zm(kS{x<)q13*^%a2z;&=zRT2lh4m8aRZ_RE&ON<5G zAB)8c+2vFsR#5VV7&!=Id4=puJ9WPf*i+S&E$>KOe3%?9>f=a-JdTZ$N2R*hc0U7YXuO0jY*_O*6LX1fO7o6;l=Sx1CHqoAA;PsWy% zOoG@o95kpa6jg)h$A#TbLf>F%5YI07KJW#n1~4&++Y7!KQ_Hy{;{ectAFgTmczQK{ zJ0DAD6E|Z^IfZYR8|;Shb9K9c>i)LPuqprH5D)?CDxP>k?Zt1!(Q7aF0$2%A!a zf?;Tw1GX@?i-So>8}LP-VGi2D+#wDoSxve>fk``L3$s%k%t+w5m_HH)hPl%gW|#9Y zkI=}>nVPZXSb)ahRimG&8(Cl2q`ONamLy7HRmTG2j(g3ba5S=je!nh*Kj4r7lw;jU z2Zy|C^k3?M*#CzEK9rl;0N*KJ6CWmbj5P`1d&m=q5TIPIR%xJ-XPrjFRalB>Lx!jLZH&ARfPID`5*TWlf5Y6{U zI=*NxUtxSdYvFtUqIx06)^Xlg>+*mm2QA^+!=x|w7xN@~~!q{0821(mznS<mEFa>T0LW{CAYjg zFrcCLJPkxzN4>-wm?$PmU5PEngqcTAS;)lDT#| zfAF8=pW4EddY#YB+)Z#srhOB!nV=k-m=5_RV6Y?$)gJ7y^I-SsU?+mn8Q*Md;#xEi z0mi$Ffp?}uKvw)70(fF>a`KvM%S#e#?U(nY^UJ%pj@EZI779-W!qBU`8xSsKv$nXG z13rQ^770ENT@gTXhV7SEgsLJ-q&WK1jVv z5Uj3WK4M8M)?M{=bw8Ad-xUjXxC+)8&lz9oq&e=@%x-*5eX9D+c!50K-5%sYT^J5J zlK74)gsLBjU*Qu1phtC77lOl%75y49ZpY#J zT6@R)IAQ_q1t-KnaWDBI-P&RU#|}tlvB3e^Y=gW_rN!?E%3|t~wYy=P&VhJaH!g~XKQv-xqqhLT1{p-|3=+6Co7|6E4vvr3aR zY*%$m!%G9CKzMs7USSm8X@tz8@}vfuMoED{chV@Zm`yuWL+nSigP@((o6`W(I4Ka| z9tv34D(^C3W-arQhMI;;flznOlYp?8W!6%QM#jm3X}7|w8de%A1;W}jDH`n9C7bx~IOT5I zF`lKDeoaG5<6%JS+Ib}u6r-2W*KMi$yBfrUa1gs9mqTGO-UKakMA;m}g8E|(Dh=uZ zt!A$ZRoLO$tD$AF_pda(hvD#c&k0=Hy203Fjo;TWla?enH%&!dpqic2AGu1!>zPf#Jg)N-5mK@4f!!R{Ve3Q_}rv zISKLkSn4^iA-)$5aSvTrVSsy7AAyDTQySX)0MSm-bf*}x{5Z0(*UQbsKg1&P8ye92 z;ed8cPx!!LzNx`{01jpk^@D`5x2eBR$bSNLUam8qXrG_16970~(9MX%?@Y*+lFG!NX)bAMHX zIRXc>o5B>dSJ@GYAJ%Y=0^=04PuULa=QNySz&Hi%QT7e(mo%K`;BfZP-6_n2?WKpz zMP|6^f7IZfhlAUz?owfR`>Ka3E8_GA8sKqQz+C4O`3Ydi0=KaSxye3$NQ3+& zFl2!nS%chUCtuVce*_M47rhG+V=9y8k~CY2<=O@{th8erkXz7Au?n)6NzjpkWjeRd zYiOSaMk~l_uA*hSw>LGkAB97!=E8|HD*LKbW}QgiqXB*f4sf4FW`QSCmCr25uWOKf zz>tNWNEC9D6Y0k^$P;jox2MGDW*ne4qg@!|iyB5h9L60fK{^>w{L-D-vtxgHgf;iQh}u{$Y0tl^a4aP~w50wwqA zvxVGbYH5ja&-_sh?=&3VK4RTY2B)TCf|m9YMP#?Mvl`SHIH=tz60{bTy~Z^5KBnQ6 z;c)g4oFn6+fHDof6%A+z7UFfc8?L;x;MM1pGw}X#^OlxLwM$1OJ7FGzyGV+%{zzga1}TItPcen~wJprH+`! z;GbzYufXB#$%_QaG>!g713C`}v~Q)5OA@nG)S5D(b_}TA+EqBHy+rX6w1SY5sC_U~ zAVxmJz#rD|UW3EiM^74ofcwCg&(V;Po%`n3fG)rR?WI7)nM{i;q!A72bzr38Or|^wX+lH#A|TQwS{@{fy?;Z? zGVIu!*O12GkoKua#nE>gD|-J)4eH0Bp^D@09v0M3Yf$6RP{rB&_p_jWUW2*_2en@# z@TjoOdX9zl%No`M9M-Pbgs3s==uumR^e;7xNjQxC`9hLdhG$6TteBv_I(N}V`Ib#@ zR(othWhV{QF^fv-z(*L>+U3TVOVS|RY7bPA!?(&Tn_n$SfITzySJTW=F(iMIwc6%a zOA=t`%$?P>rl^I{e3}K^@^(oAY@n%&U05GYe4Pc{{Ax)8?4qg5Tx2s%oM8dCyj_w2 zdui%o7uR@^6-=*bHtp4t1lUz`u)4>^HP>WTZIv6|ElGe4HuZPA&}XxTyZUZP0_?b{ z;}+L=6Mu=dzZ>2yNr3$~cU5^#GjWBr;l%$F3%d37k_6a~Q`c?4Z8>X-O?$5-0ruzA z$tJFqBmNd^wHw|oNr25db*2gJ*@@p{LASnMk^ozG>b{Y{4xYG+5e%$3X8Ow|39y0Z zux_l2UHAhm@HX$4B)~qNI`M=yx5N*z;9FlWNq|i~Ytk1B{~`;%&HE(@u(hXtzzOSn ziGwWY=2uG+V4qL@oDtXV6F<*_-SBQn0_^swzuSeTpEcvX`ff=AZ2ze%8KGT3@prS9 z-1>S+0&E4UhX<$$FDx8YW`Vc7U6KGBgX(X0r9Wud@^(oA>=ml-b{ATP)^>aK-I4^@ zJXDvu$R48j?e+Lxd%Gk7_7c_CTwF_0{Ch0q4eypDz{aAw|01xzDE?Cx@Wz)*5@456 z{pA9ijbc_BN6mB7UoJ_29Y^(jt~F{D(|8oK(mLw8oi^{Km4uQ6*nQN5T~vu5E6>A> zoxWX?06USIu#2kvVwW@Unut*@7)N8vBg$-Sze`earW zSuG-~y;_n0yOrwaDtWc2ie*+!S8rQKK+ zXGYwbZUgLSs^eDsu8GMOVHKd&a97_gNq{X*bqkKZThs<;UZFR>T#^8ro*G{+YKyb# z(`vRW6}z^_0o$M&k&D{ota>#Qa&4CbHb&L0HzIXmt*r2GGg4V=)?4lEk_6Z#RX3m1 zjV>${_eU)7*4IlCV9Qj)>%}#=!vE(6&{tnCNr3%R4d}&nU&Q~g0rb_^OA=r+RUN&0 zz6xXh5TmfB=C{;eFG+x%Rcp6=VmJPA7JQrcOA=t4Rpa{wZv78$1b=Ps1NK}s;upC2 zpV)oeQGmab*vizNxLv#VZA2j1YdR>r5kS&{%7z1A>`QtiyRtm(~? z1laer_GVGx8fHw^^kzu{Yy+!rD(G&owcSi#EJ=V(VRc!9_lB+QX7$aI1lS|ChFR2Z zW`@TZZq{J3?qs?sD=KYcc*mPEBJ!!QdtaAo4YoPJvk_6a>R%bmyF0Snj zGjqW5c1Z&4Olx?%xIQ>cE7kILNdjzEYk0f3#yCuC)$(>p0_m=)P9 zc3sO>f4L+9HptcWohyBEYx=JCc1Z&4nX6ltq_?UYt#fOZt>OKW1lUMd-*iIT%i=?{ zF`8W$G3)Ck39zlMzWVgI5!YQ8pJu_gdA}q9Hrds8zQ|s?_z4zz%iARhu;s4)c2_#@ z*0f&j?UDr8g;(Ep?lj}AS$Xx>OA=sbUL$&ORvzubUP%XYtjBmuSs*7L}qy93vf$f_@vBq#a=zp<@jTL=A9LQ5rdqlC~JN|g{Up_?U? zE}`WT%9K#{PNn!-WwE$e?$*{{NM(#{XX2wVa{1cPQhDDRO3Fy70W38I*rfu5!-wD5 ztqwmS-KNU3lTR$n<&|81A*$q-Q?hcam|vJw@;3|Fm4#?7p2^SN_LHyW3ky^6o62M{ zaZ`OLD9bAg<4fbCOUl{viStT)B%v&xS-G96pcx`R`A!ARme6x06qZqhd?G5Nxe~e} zqj?!!Eum}IE9eFC=>_uli)axgN@jtr&xmZX04TA))+9#zQ~f9UAq++(mjlH3|7jR$ z7b+->D>>rDE^%QjcgAx!&Q{7hQWqbtyjF>$2MCoOw4D-)-`mmAar)KDoysY6Rz@SI z(I}zbxe_{GLgQ=bf^@RDhz^h)f3SoOmC)f5I#NPM$&WjR9w~Q43h{zc`E-T#17vhT zCjb6;37sJSMExyf^kfNrq=cR#Kl5qws*je?Gcxk6p^2vYhJ2?JylSd!(35L6zgel- zZ`S7|A+%p^jiKs$mRexMsRl}@k0TX)U{6QKYZXNZLGZoghkKS81AxrPx0w+@mk8C! z(RvC!OLT>5quixBgZA2Y>=0?LGkWtG=cz%C6_O$KT1C|%qir3sK~t9FbfG=^ftb>{ zQY_?KF*d44i5OdBOC2S4=1)^2gEsC5qCwXZHxG0Zqe_ITg`wM^Z4(2bb&StV^Mbbc z2jj&Jg;PK1ywI6YCkDwauAL(KSDWz!J)-u*XS*BJU+Go-m2Fmk#oIcBjt2nZO83%I zx|m0;940y&+NX*0T7%9F0AhmL&N+JqIE1J5<*L0_>m2VG;^xseH5#qH8Z-u{1*7Zl z)w;!lV+M`M88EBw)q2FkVs62?Qjfv2y7yF7boej{nQ%A?fMF;#uP%GWiC`3dT8%zc z4FYp43j6sa0T_0vO2UcY3tnm>iJN?q01Pvzxi>`nI1y~X|JWpoAFe+&h8pmH!zUO( zuUaka%AVo&sqB@+udBE>?JfYik=29WX=f7unaYN$kAT0$CkH^cNtZ**&J*t5O9S<~ zs_d&jkzFyUKIu}~MV{>MSegbI03C#?k<_}IfX7ti`r$dwhaAu#R&TSjT%J+W+q0%C zOK&7w`+)^{(*)9Gx23t&~(5!X+RE;n=i&^MY~D@h&g2tZ{KSuRA#VB^*@8XiBJ zI6sz5jwcr{CeMu|mYmCIXnu*&o!}>xA^23kvlyW_p`@8HfcmGLud%o@w10#ZQpKtfmt1Q}k%t{HaJxFKFlv*i1OC zV%L4nr23?LnK$?(0cao4pcEy6!)5|5o8<6=d~yIh6KM>B%E7^-5&se&YQTd)R{@Tm z2l$(OxB*okEeIg1&2<2_7GmJn?VAcQ?26|TsZ=bTT~%_4c%IMN<3frT_Y>_eNn|8M zi;ncU3+FC8K5~A1Wc>WOv2)|jInvE9C##|>uB?EIF0YC1961P=>4#3_ayJJ%RON|M zD3A&cxcz`XsX?V9B!HlHCsQ|4oY^^iJK@tBMmi`02xA{oZh^!6yatm_gn)vXO%%Xk zep!P_M?V0;99Su45`|*CkjiENx8}dpfYK=sKtTIfQL3QiSKZ7#~{p=fh{tU2q!zC>#;xz}P{cr;CUls8g&)ij<< z?v7xpC^mhY-S6b8H;*){s~+boscf%0yLy>3lH%B2Z@%h1WUpt0Y<4xGGP#PSNT4ZvNdy$Ks&jW(4qB@W=fBh}%M#gv;i187JQXyJSE@nzEMfv@cVw;g~U zW0`(bFKE>+HaCu&Sa#X6?63v2n_hDoP6b7oLpZ15>6*b6j%;Ne@cXy1MZ{XUOto5JvG+S$8!n3b_H?h{%D<1X5clFKQ8Mw9X%CDqTt+{`;SzY=a zPbcZaO&f7H4fH}Ncq@%Yz1SX;3&+|zFFe6KsgtLiR_+P7AqZ*dSzpXy$Hpjo=6AEAw5*hWbTI5dWBH_O^ ziRC?$SpF-YSO7C~3|wi|d99^gj8tkLk_OxN95NoWC&&}WF$7fL*S zl$?i>L_(9TwZ$7bmmC`#zwr3dg{63MX~e<)^35;22VzU{R2p1tmo%}_F+D!|q4<_~ z1F=H35KpTtf!hUmUIR)aw7@{=x&i{dp#i1yg@Ax|Eh;xseAPC7mgrQV*s$)&T}tK9M`(-~MmtK7+bHnrEe z<#nbLzkt@cD}j^*--gzM+IpJ^b>T zbKlzAz2)tG6mFe&D48VJ>8-im?fv_d)PbHRMF}4*p=V^|Yg(Cp3~pU}^2O!lc#g00 zZ+mSw?^~S!TwDKaY%V%=v4wprb9j$*Qnj5CGV>SjqX^jnQ5nsZ&=ncY%jjweUAtaE zFOW|!kiTCf@+GKaV1E|`~}pwp{*Qb9w{`B z^ckh#M$FG71>-LuNq}KMqZHf-2%4l|`~@TlFh*#V0=GxT6*jk#g7ynY5?}yvS6weS z97@Em(rD=B6+d85ZFe1f-s$if{z*RgfPtpLI(#QXPWZR@kOKx^cGi(|Z+ct54F4q` zcEEsyVaK-~n!p41&^zD_L?-Ya@|_&&0MJJ_u)C55i+YDQtikhl6Qh$5OTq324QYc{=RiGY>tB47hA zrO4RRRQ8N3x)cBSF+If#{{;O|9MGOBPy5?e2^fpnFB@n7&rN7PcKRy8??i55(_Zl9 zzL=JP$r6A^wErLxL-iE&xFpDiSjlG7EGeKz%02!_Ay-To=AJ!^{}nY^&dO-yG#Vwm zJy$~KOK7~>3HyMw4IM0@LnU;$gpQQZQF4`X>@L_M8$7{=VlgGHEXVSxmlc*+JhDx8 z#$sfwZZ4L}B$Zp0sXsQZsqpS(g1raDBS2Gd|9 z>I+BbW`pun$OjCQ6nwQ7I5<0gA#vfN^7zuo=twf5j5Qce+Y^iSh)8qQ=bJWHrStPn zvgT^GbS&U7d9kCObMt%c{`5*%$t$^+SdODhAr$;6SUL2iS0^QM{@P5y<)(>K~9rqLp8UCQXm4j=4k=+5C%kut?YFnT=TpTh6oe!1`9MT*tt|>#@K@fIT%Ag#)4l>J3tuc2Jg+CF((xPK-W&s~5tLn>CsBp$s=byV zPQ@p>n@wz>PQ|bor(%`77|^L0NG$43#i+e7@Ea$Z8&X?D5Owd0AqY33^Y|;kz7>iT zlEKVMk#Y0lh78Kxmwoc&bf5ybE&8b(LdC*eB?$aAvJ(M?&_{(3$mOz(c71M;0ayki znM5IQ|Dbj(^d4>9p?%>M0gIOz(*2Ey>? zJ&yk?Ec~u``LJOx{9AVwc-Sxx{v$7g|0@rJ7a82zI~xx91CdCKW}}5?e9>S?299xs z8)IDMUNoD_CX_tm{>v3j2fNwJJt&HDN}N@C^bJd8W+4R2a#HEr=RS#f>PxhUsA52LF7d`UcTCff%J>4Kav~EH>+P6tABW| zVrnXR-uyUj>M?nNezE=oNt-PF2R^QTC}yZVzIPA%Zn;{|alC|1kP?mu$bSzqI&iI_ z2^sm_t!?7ydU3Vkfa1x0Z|DrRhHl!{MVg7ociU7WVrOb(+{i@Jvm;bA{lqpGn>B*7 zTW$_6J`cym;i!^ZPG#zPk;^XB*=QaHrz^a+xm*RvE0H!oO6W$(d47BhjvoV|6(!Tu+20^D^aG`C zb&rkeM)+vWpl+s3IHL;QHjNkIs6thVznIG@nL;as(Hs=p42m`bIIN8%90T@R7{H2% ztfMrVaDYFi*S_Q$; zsh^r44v?vBfo!fbzC!^K49AqANHI^il5Bx2wtb3ijgj_2#5V>o4abK;Qjt|$R@!tR zQ(~qe`jT-RBpEn5?5f2}TVRBJq(eVjn)$E%gT=gUxvs!5WVr6Yv_O$2-b>roT^hUybQ>Z z+DXz9M>e51-rK=W1Y2v?!qMAK#`nN+Vt^)Ov~ojMWrOZ>##{6^YzmIN&4rJ{aiO1b zp#@j7O$EkSSBH*@SKz478%^hZ>2x;1m7vu`2ebp#e1Yokg$KXuxdFYkAp9Qnqd6@fU z+Hh~0=-pt5glVqD{L?;gNB#j8U;)9Jy+JY^#$C7{V!;*Q2kgBZymZ-JxDT@6zT!Nc z50bFzbTl~Q@(Mr1fGp&^IXV%T4$a5zhK+oRiCX}*kNPG;R|0nh?$b=%0ys`a0R`2N zYczNT`e=HX1$2i1L+aS-*yx$nRAy{+MeD?R#@(Uih6@G!%X9*axbgE%p+lQp=J`)} z=%i5S4_H=R_xkUa?!Y*7uTTk`ut>nc&Y<`w$uD1P42plc{={m=h<~B}J?AUtACvV#IHg@8L*E0qlRdj{NzypPr_I|Ew+}lBM#k`V&+Be_8(?BL8>mPZs(A zU-hps<^OH+Jsk1}?D=@Fh5xmp=2lY5Yb$Vo^pUOafaCYkr)r)MzLz|4NC&Xp;r$lr zkW@O5{)hN7pKt(M{oU70I4$I$+jGazbq8npWCPgd?jDP5oa%dre?;9wdgk35^{3Ga z{-^4bzP~=hCnmraZ?+V2tmhm4=X?SH>~Ll^z=(n|3!tTnar__nL;%>`%W8g$X!nJ? z@2?$1WTP04rN(Ywc&PrJ=Z!7a@gDL8j`IqzwbfBuwc~^?K3^9Kv7|26pNKG@RG)OM z^E9870NXkpw@67)pC_E)lLcT)BkS%H)8h!Q@reSkozF=NEo!E)6FbPDa>x#P%d}^H zkxw{)oouXrLj9m>K|0#4IsQXF{D6&IY&`+zI=kTin@<9OO-!sNEn$GR^qeM2wa~13 z7+1@V@zDpkPT9r=9y|fVhF&wQnH^T0NhBelkq3T;PZWSXE35{*$R-w8Ap)t#4-lVt z0NXWK#Z%ie&i8M?uk*aL{B@HczR4#D zz%up2R;#P^x^?^ye7FHiv=7bk34ZWtborrh16Y=7Jwx?7O1FxGAnQ~gw5SOkeKl)Yt33ct z4umXR{SZ?E9;sxt#wBzL5CLrQ(pGEO!GL|M*SbE;WWL+gRiMSM*3gU20oMwyfU9Ax zyP#Te=GF-aSsrUW0juCWQ!i`X096TiqkxtP-y0RRr!A*Ib@kmo1RzUntxiBy2(BFg zz%{qlBcN*kd!Y!|ssZ$pO;1$iS~Y+HzHSR``7&MR4v@W3w`;}kp+a735Wr)Vy-fw+ ziBex{zEz$K)5%mgROq<-B4u+SuSi%hV@qcuob_z3W`rzJY5e~7(Z$e zf=5e^t%C4q4YD=e%qvC7!;O0Z_?okWQGqRQsF}jrCPqn=cg9Ep;Y+Ecl8Y4LiJQPc zNe9>R?Bo**b9p6~Ur^JYW#v{ezc8ufZx*sE3(;IWlb^lqCtu4K7N+7imC0h_rutA& zmRAGF2i&rk*J-q64J4(!mlsR6>VK z=tv12C9B@r`r|M4lKd#i!C}U0C{;q3F{84GX4lYjn;d_+hL%d`MrobK^5yoTYzcXzmb2G$tHBrTJg2Y zA_|~Or(dm5#fYB8f49S74wjm6kRuzAUUWFNy4o+tO04gX-B1d#e2WL5{qoL{CL%=Y zn$W+Ovh}QtMoyzqqW#a6(D@P?m(c}TRW#ciRy5=l4rrN;sRE7_rX5CsR(NM@rI<%C z(ql%ob+|V1y7l4q1mGTIxW)H3Z9fXM`a`jm>`H5kuNivn6@H3XEl(4@^3f7{Mn=A- zb5&>uQlJ&y8CxPoNNY=MTNY-!;#{sni$HDe3wxvBJly^(-_PMs;@i$=r2iMeP1dhQRI>(t^A zuACozd`Y|GgQiaE{V&j8!WBZbB1ji3rws5mPB`GX(_K1>>1&alc8UeK@%=`@GM{=cOJ`!4kBgz?>U4H>GG0)k zsbz+NK+cRGB4>5;GeeO5xCUw@ly@dqsfK7S4_sL1)YuZT5Na?*u0^7O8TM8Yk&dbE zfJZDlplkJ-5@+}b_zj|)npsN2V!WnRSk`y1&X8++mW|{M8T1n+cssN-uPBV-0*`Q^ zlgfc{etCllU8|R~MQZNZF5`(i0f8%x)qt*@Xj|OT_-(ow{5DsK z)e!Pv!y@yrd4m_t-P5!FNK}mGD);#PD4sj{aK#qvf27QnB-&-)7|Rt1wugY77lwA& zKbOg;Ze)~X1Z8st7VQ6`!KNiGK(GhNFrw*rz7WXeSV;sMVzj-Q;l6Id_mY{>te|8y zhiwC0AJ))>Y{##=ynyRzC)dAux%D6!FVfojS4;KEJ5r<_M{VwmEgv>=^=5M?$62n&r`~qYE}(w#lE6<83xfz_DQ`IU49hLtipUa>^NTv2_SxU#CxW#l?q- zuBZ+m;?@;5JsP~tj!8In3=?+DWRt~oRbTkH9NhZhp%S7xw5&~tngoK7v~;+iNMH;WQhj;n*-hr<_(*Lo4Tmd2YC^-O%?Ktxa4L*7*fL>P_;`=(N9HC;QJ zZBaAmAqc7(R4qZWKgfs8Vh`;jgYU?Q0`jBIifC5n3YR6(<_B6JZIoX`izvZrhUQQ- z;tCu;4n9{@a<^xd+)_5T9M2>af3`@A2DvD*LF1yWHu%)WRXAE4ZlneAL%yr1WD<;Y zaA&N}HZk~!@jM(cx*};sVYH^-7zx@Jpd0B@&k@63fMY?A%7Or2|9st$(1}nrHucA* z24_1_g6n$YML23u&or7!+*IudE-Rv0+v@iEbFKf!;MSkshS%1AoRK)a&PmaX0o)mx z-oEi(gk!)i!T^7EnRpZAQY)kI-DowV0Cx{NZ&M%%M}d7o`HF8kI2pU_lP9MGG4e3S zXoRpKRUmViL$vdwW67blD^Z2@^eA5wVe(qrb6tIB3L3t`D2cys!_cAbk zf7f@&9|1rI=6%6vY|2M^uRzyO?t{iUq+$(CJR9&wV`qWY&wd745$b191xg!)gyy2a zIO)U$yHjLly8u13Qw8dqActm11}E@A22|-4=QVDx+6~?as4zuZGvBt}7YlBL~4Z zD;@7)yS!b_!#%9Q4a$+Zsi~kp7?7i}3GyL$vF<%A&@Vd=`rg_+<;8ejIdfO^3^uGd z{&lg9pbweh-z7~=@iy8hPh9)!17_6CTlfj{T+N;Na7HZVhLyfcy0PKUi$%T1ywa}s zT)}=?(khPGN6mQMEWbCmT)_XGSm5`Vf!{@q2k>u-MZV9BTnohsai5sQ_+`fLAW4Ab z`3=8=z+!#;S9C>fni4e1LH`{~6AHUBM1nZZOB*0?+BW6jE`-;{|yS2*- zyz?ws{ms{&0amd$0C%dU9gh&?wS;nfj!zDN1>A?t1Q1frjj!>E0kCqp;cO)PKujGo z{ zD>WPRr&D#C_-{;d_&Yv102V2-<yhp=pPYKdiQwua{6#*&02bmj z2&TS4gqG#tuk#58uma^nX2vuY9ynW%g8yGWc>tDPJk(qsP8VX}lcQXxEMU#SUb946 zu0X(k0=e$4PVorgohjCB0u?gI^ z#dT}Qw$)GBdg#`YkGU+5YAEMN_#^PY;3RO{5BY(9?Jl3$PV>ZK5#>X%8S{-Lnarrg-8QW>0fK% zl{J)s?gt@`plU=v01^|5~1%d}3iPujKLzQ6;yWl9gM<{KBM?zgftx zEJSnhOn&yZpL{J}SeT06R3?jwo9YAUjkvO~xR_iTBmX;>7+Xw?UQC=>xt*%$twc|i zw_UYgFfz{TTTRD#(b-Odru_af=s2(Pwrlnxz~3Ba&lA})@I_8D>yOO%rl(_JQj}*e zVqt0Hbe#1ckmairy>nVwV$3n~#zL2OM6--$MII4ASD1{j_cjN*C$fb?cG-S6dV>Zc z72XklNREU^S3>7YXuLW?>j0^mJXk`9O6YJ29Vwxsq@BVs8Es&)R;k%!Ey0Ek{u;$( zH+;_eAy^$wwlEFtF+?6mqG>VnJbyee%XQ^m1=LH=oKRv#Sgim^AJCE@)b68=I-pM~UNM z-FVdF_#g8){*QVazsO@@Z*p}eek-+HT-KCg6BBeRACE#stUDe4xp0K^SaHGI7;p48 zaGbfNxZ9St9BA)TQG`fnOKO%RNSYb9($YtsFh!o-l*8cE>nJn_8+%prJiv-*} zEB%(Uau@N2v&FpPT&$P>v8<=+->+_qu5@z$_3h@0)KRQ4{6{@A}jf9S_u^kE5(9;*8a#{C*`u*ZcCrQ zS?x_|pB=+}9(sHD8tukrv=n&^;)a?XR!fw@IxE_Im?pWr)$~9IL|(G*Lc`IdkoKj6 z;)B{CMb#3Vd}uO^k90X4qC7z5H>PiXV(%O2DyYpWbVWwmIaEuw^Nr*P+Dw6v`=5UY+@RF%kctxYQTNVNnmbODBD+n)_tyShbnsJaY;zGRH|1rp+Aa0O3n;%sECZ7P+{* zsN_ORRVPYSJ!+j5qmHy~z?9H)B@}L9?4)zS`oTg?c%@&{Fg(nfZfFc+vz;mz15Yiwl;Kw$ipnSz0SkkQ-!N_ zv~>gRZWh{MacF~bBoL0qWB8ViJ` zW3GTczydAc2)?fh`bsbyo%2n{qJi*CP$nN#7d|Lo0%rL^7J30^^3lm)L^Uwwz`Sa4 z`R1Y_(rGw47nXrxA7a54a5n2qpT05?yA%#i#^yue>B;#Z_@Q-}1zNxny=y8I4qOU{ z=H$uP#Pl5W`Fw;0Re&ZNHbA{ZhdKju`6vsk00p+wfHfSL1V(xf3#kBQwa)35=m8yofn3#$O8g;#*j&{v!D2CS9tV}TTKwhkCZ^Z>)Wp9NFEv3kg60*5-n4;b?UEX)E9*#4P- zJf{s`0!H~E7D@rf>cCXUKNoQY=7TJl0*=%Jt7D^QR#Ta=(S+7v`;0#XKYH?%2{Hb| zaWX7pcJo=yYiJ`EgXNg0cgvt{{1_e8AdU)0tP;2@hA!ieiN$@d1$WIFb7yoG9nw?pzJn`b z;oon8Z?Mzc5rBD=A|8HRDDNM(2*AdIb7lOpd4?KR#LD5AMGkk(d@=kfvCyr1pq{^zk?O{Ax@)WsvJYc|dkvDBJonjJ^=!@zC2;kf_1;b;dX~c_x;cL1OwRi(JGj_$?ULTaL-dlOSzvs zaRfpEJ09L=A&o(8iEM$0M^s5w>objn8s`%lV6(sVh32HbGIamL*I7ba_ zrV;f7-S`fd_~ZoGe3vc>{e}PXbfc?#^m)Lb3-a;QE{nF;&sr#zh?+ky9PaJ@) zz19^6p90dw@n22i_CWB#F1K7vN>UTKQ*a&C&umkq+xyN!QJJZw${|F!S*WhAC&8``Q zG_=9LqHc_8Y}jb<{sy1009&_MO^q%N+VogHUE9-;uWN6-%PA`zHPptVyRs7!Qg~EjIjpis!oL+!J8ddtT`s$Y{A0Z9G>dQa?-Ln3_UKkc#{@u zyv~5#jV2I~U0bY|wFdC;T_GUbxL89{2Iy|JiGb|uV%_wHJ{c}-ddNmE)=h7~?#8Bv z?EGTg^ak+on;x867Y_XV3-Ub9b zGzD}Zsk*sQQ}t+chFsxet^)2$XIH`Z?_;h)?n%T~fECtLt^)4OuYx0tUFZck?cv3}N7tUHpa8-QTn zausY(Je?^n$MS%H-*y*pekGnzKmmW%UBH@dhFsxy+y%T+%p}P93rOjAT?M>7Pi86G z#g>IcuHJVSYX%bQ&?QLUw=picedTN`>-t7V$F>goXLHeYd<+zHqr<;_1#*EOa~bPs zD+|2Ib$!ZRta(VRGwx!|Kw`ZPiq)c|P)kZ`lN??K#cI(_dD1!#?4Z5lF4hbr*4II? zS~#pga`>~LSS=h@AkWvgT*eBihu?M=YyKRdZu+XbSTm4V-vPyH(M|dDfb04$C{~MZ z%0Oa$9~7%)T~{H`oT1B*j;v)}S0T@wV=iNbJaZm%7i)eTP&Ym0F4hbr))`Q&7TvTA zshh5YVzua|Wk}t$>@rqJ-E_xYtoaLoy6JUyv1TB#eijsKqi))f$U`cpw?M%*DklOK zQaiovHdsjY^i@~EZqHu?R8Q}?i!}p@^<7Y`7WJegA=T6SpkOWPNl8Mgr=g&mPV5dP z38|irxeXRF{QsD%V7t|77|6wa%2m8wtH8;rGp@qzSp~0|xb8M!wQ2&;z*u%0uv#?% z2>6bxfCtD9UP-5*lgwXt74(kP7+}3R{wyfiMmw@w)zOe=(p#W-8%@dHs*;98{I;uz zy9=bn0ce)$SKY;%P66Y6$5p)jsRF6vOJs`~$cmVEK`}RKt?e&E7L~sbinUQ=ZGRcE zD0S#rH+|o3b?-v1?XkN6FXZ|@<|^Kvms2aTRPq*}0sRyx;6_E&TLlbhZp^rfczYgl z`(6jdYEjL3$gR8VDpsAzkm0&Jpokmy?rwS*y+9hATt5?wWt7!e3{Y*oE&zH7VOHy@ zJw~jl4Dt9O!G0DNtZ8A>N(L0`Td-J%>kAtv4SO<>4T|1|g*sG+dP9Nqg}w@lbAKIY zEJlzL|8E(T!tcQ1HLPnMbY0(t#c5hsf)spR--pF(Sl5;83gFo~BsuTnHaS~&)%R;6 zt;BPHNRPoHHCquhECp#rJmw`*Lvdqp`@Apax&J0OE+U~%@-8|yRB zx0=`80117QxeN<(m%5Uq<6Ei_Pp4j106BXH7U__Rl(u?H#Pg6iUx&r1?M=1I4B%pZ z78azom~KF?5M=oG9d}@o#%(Fc0K>cP zz*Jkd0jk>f-GQk#Y6FBhG!5#0>Y6s5Po&5U3$V5#$J~JlZ67=a3sWIM8dVg?rNumNp6oz5lz7xp?V)Pu{)GAb^faS`z{EaF`Ts7pBo z(mlHai_}PC(x4eMQvW(E)ZKtYyYppqBSnA%41Tlvjlk7z5@%F>f_mLHtmK5^)4*bAss5TdU_ug=b(-g*pe8U z0rgmG%L#2p9D~J4cW5LXUvy)KJ_ZYwE~yF?dWSv*i<9n96({fxoq>f}TTbX5dL0%g zHS{Ow95gq!=(1~Am(sD7Vjcn7Mt5MbQq5akSBe!h`{;F8sP~wlE~PTbSe*QqQ!De$wl6JL}C6hT}lOEo74YF3DUdYB&?0`z^ ztFVv_lul&hX(gY4+`sR@f;~{DbSfWviKOr(fhQ-w3k!H>9Wc29xCuz(_hEq=&fa1M z80wG=>d4mD6x!`M1`Cw>1KMc|?Dsqdi?hC<(2mbjut4jZ6h7uZ0}Hk8<1Ldq8epsG zdTUreCT;(|O1Od&C6ttrQbJ25bfbh&38k78B-B})FT@LZz@sMH8r;QA0;TsGb+rWE zBjXcpq0KAlrC0(fpk~Am!lFGgaV>V)Cr?fXVpBo#zo0x73eWhW!H^6`Xf%c-={%Y) z&rUwEFqcmoyw{5aB_7jl~#O(LN2vfB;9=M@!{V% z-qCUT)e8A1=&X!JPNPxs6V8>;`4Sp0p$pQ<;vzaAb)bVKbf|<5m(Y+hF z37sGxJwX0@P~POItZpuR|sdx+wcng-}lo0eUkjIh-ORZxe^M?C_?^K zR7P_pbVWw`Sg*$)=0TN<_(};%T|Kyr?kB3q7J8hB8!DMo8%Ea_R;nfb9`c4Aw+3on7_z zk&)4MMrdg|mAUEh<5OitFq2end47jz%0iWe$G3=3Yh^wtkBt%|U7n0h`l3Fcy)F_l zLtHi2o+0Mi&&ft}?dR!}T^)osP6qtXnfSM|*^GbBo3Q`AH(_^#yuHcycpHCtAh{YQ zRS3D4n1fQhq3w-=U<^_5h#>kB)Hjsl%%IWUz3c$m8VR8F+6U0eJ4VOPR^lzj(NtTd z15J~^t8pcs2vWlh04svDC*ezz+J;QLpa_!5_K|ZRD3L%~!1KTsu++AI%|Yb01x)S; zcA-7wwt(I+p#57qUXI%qaKmbQ;-(0D+ychG<82QB|B1)(|1}f;8z#cgAx!&Q{7hQWqbtyjD>kN9g0&sQx%=ekA?p z->iP)IrCS}n;*w3_`sfyj@K%Rme*h#@kQTYWlYFqA9SeuV4F2#0^du1a+7~4lYh8@ zoQgFxAtS#`GaFCKj*RAX3YYGk}ku@4Hx zuE9~PH>|{yGz!AymFxVf>YAzoGd?xbUsRPfQ&0H49c(>ALsHC~E^lk77vSjAr)D6v z`D1^Md_YgQ>u~(p8Bq$9J+s*qZ8zhf5^AubYG%_|%}#2jde9>{NHRM=U16CyZS})6 z-C}U`88*`=z&BdW{uHY*X0&c|Z;U+cbBm-Z+iS#9Gn+pSN1TC6n%<$gk`5}JbuAk1 z*rT^Cngkp(h78PbT%R;Ma@tyhPirV}+!!RsO(2sDEpZ#X)re2kLy9+v&9v#jM~545 zbQqpWlRhz&3lqhqB~t#xb&|9xVPC(=$llBM7 zq0*#&tJroyoM*{*xycef7zNX_cIf|~( zflpm*%GPM}fr}5TaD3>SA?;6T;DS#%)D90z;*y%j)HX4kH!*IzKn^}tQ6opAWuZT} z>ES#*z8j7n1G?@A+!CTa)T5@JHq>T|^K7}}3R?uJlQv(3J1(Dq<4d1EyK-BYWzyz~ zaIU=S0$19a#rFYCHT)zTTZXlAjmcC_NfffV+m0G9>n8rRePS-3`1{=BhqFqhO%P*m zX6It6{|JyEVRdRuiwZ=Kq*X&FO)u@*N`p&jl-%P4pVH7dp+`vCq;THn{Q)>q?3^NV zrlwN4yjt1-YG<@7Iyv&gUU!QceAB%`!7GSo~>V@sNmjkK0&moM>^Fa0PS zJ&shX6M`8sFn3v{BTDZy8Oh3B@@P+shV~4m$9k2$dKlFk zUA1#ToR5or7LG^#bLzy~Hj~yFHunL&%l&aUCQ&mtN`?o{#tW$B_-eh`o?0cdehO>5 z#E#1i`kXubXf0Y|I+zGQ^edXCM^T#~Tm<<%96^Sw3WT0TbS6T}N~EEIXZ^9B$*LMN zs%^8rin;j&yYpSsX{O%p6Z58f3~Eu$=z2vZi9ye(&sGlU-`-RWwMoRKhJG53MEi&u z@)vVCB~xfItwi^-8qce0nn_chw2vz;p8Tx4JZVwkm?L^^y9O!3?t;DmNE8zCbw;76 z2T#2>d9!zHIxln!q)iOxV{%`FBL;0zG?Psh)3s4(t+_(x;6JfO z>^z~iHR3#HzT_rn_*98*vo>%>*DMXLPn$H(ljh5Cr0LhnZ)Q`Rjq!A{&}2518CqUj zl_a&#*6)s*@}-^0!sYV(DjZ+-5ldFPj5gd)bG1~|nbV+Vj1Evez|v-o^IGQD;aIb4 zvbd5?CCFq~#}gTh^cmGtU{v+9iJ?q-c&1G==V|sf9L)wV1>`_D=#Pa1zDX{nq;-Cl zITFZ*7%;!TtD~dil@1gkQ>vmenk%6zGMbms)e^c!E}UN=pI#t;H_c61L+KJ)Hjj%f z59wg%!@+0(80}65+Gh#aXPn2nOUD|x8t~77qutd6?Mdg+4(Moo)6>A~I@|>5u=7ZF zO$Da|vB+g#I3Q}zzOk)i8zCi`xY%T@-EIbKX`AzyhYgtB*t&aIShqWmb+-ZQWMDb~ zzH|4oz;-$hw%<>VooFB?2l)JM{yg?yj^voGww9J~VU?j2(x7U2Cf(pnCMXME6p&~X;vSDe?? zjkG44cs3OFfz$c~1M^IW0BwD^f!F@f%xpLii3FhIHYb^=d!1kE#@!s6nwk#E(7X9w zCS(B$tdZRT*&n_(8wFqI`cOw8x^ z6YUMm?+2Tp7NE+sGfQ3SNZ`4-fE*3_rehJm58BIks0nTXrrrUi~@G*a3nez3(B)| z(b#2j5KlvEP`&@W~Y6A z*TVB749p_#fcMux`$MzWV&tAbG!O15jj{j>&{GF$fZgHWg`j+y zc!ki1?Ju+73OH8_M*yx$nRAy{+iInM|nYdOxqhhKS56V+CU>^;Jpl#^$CK=!_$Ry`ywuGK5q3~wR zku|imfu8u~<7O$$2j#I*A^~|aHtCD{_^NgIGeDj(V^4)##15VPBAKz@KPwdbVe`6c zcg_vf#f?e(hQb1^#CJi6k}uN&U%`)QtZ_{R`(S_&?U4#`R3-YDP2u3-UFN ztk!vxZ0}TfHdI3a?;5&Uvdd>>3YL#gHNg%(XB6zN`V$fCp8Atnum|g3Ac8$of3gVn z1o;|=V6VXm_JEnOVI@ww;B&Sitx5I39-~wZPeiIyb#a-bYG`ha71`va4}{#QPM#o+|ja8!_5X-ct3>Se`YS?L`5 z2R@M`;6!rNyz2}iahyQ9Q0@z^|LN-<)lMF3!pMI)>Ijfsi)fNl*GM^l7 zz{#OO!Azx#c|?UUQCwP5a(S*zV=s$kK3SyTWMQv6qPIEgpY6r)BYa}G2`7e==B-iH z7rsIvms%_qlsum|qf6r}1pjLleS`cnK4~o9J<{NFL3C;Su}K>Lo=+NC*Q8OkM_T1Z z%>>>SF}e<&>XUw^^pGbGZ|b}59^vp&r6!z*O~QH1B%HH+!pXx4r$M<+DrrS?np#sQ z5mgMjI=R9phT>fy20n7=dgQiA4Bx{ihE+H*GJ{jG)3uM$HbB;xghw;h!6OqyV>XW{=9wbj3NAoA(WYnN<{MnV;)XQm+MZvmE zh`yPwKM@IqOcDz7N$6GACDbB^iglR~3Eiqc5ea>_NkSjzlMvuI`UY3o(c$#?b9K>} z#y{ep;*$&D8209JX^}v`&63OS@yP{n`gns}oSa3D|5g=?ZuY*%Ckw!-+s$Rc#}VE3 zJve8KC>$YA9B0uFz-iisTM!3FPvfUlQB)0Jv;f&^+?lSECKKB$U9kFjVQM)w0B;SCDJL z{EfO;NEqUeOk#P5Pb`45@z`Q%(cI~nH%9n&s82duy2%p+|98 zX_IIktv``1_u={z*>a=mlP*aQU9F3TY_u2ZPeg1l)}M&j;_8zw zwj_Dt5F6m&ulvlZov_WBsXaBr>L1m`LqzxeCh@$^Cmz6gSL=(XMP~h?NjzURiRYL3 z#PbC>!=OPt#2j~qJ-UPPO;sLxJn&EWG^B&w@?qWUtNs2bc6sCh2< zRg;`P#V4mQAH~>(5NW{T82a--Z)zqpRnkp%o2R9r~aHH~QcMkFaRiQ95!@476xS@Y1nw`SBJF zYp&ME3mtZGx6HU`2tOEryRp+DCtjQ|ADjl{TYmmUqao^rX&4RXnOA0GG{E-Cq>P4h z%o}qv8Z?@hrf7V~MwxqRrpEnE1+e8OY&3_z<>zfY*mU*1Fn!~JrV`ltvpAY>fGt0n zqxlB##GH1IDu@cAAMcPMIfLzRM8rhV9{ z0#yLsnf<}s2_BjRVs|R4H1O115T+D7H6^4W+q|w5y)`q0Nd`|%5NU{kt7O>f^F$i1 zvsKJnf4WFR35AM!YtI^KxYYB`rjj(AX0_=R9-2|o5c{i%z#|h& z8a%xkd^i1l$oVDrngf5v@g7@$n#rSV@Sd7&(x3ypHtA%@L<6oix%?wNI$BCdT|-G3 zDGj3+N{rD9oim|H=*e+IXu3Q*`NYCpo^&8yh$^||l&st;<`*WF{LMmkWg(i2XY#YR z{p4%;!opPirZQPf+*BV5%JRy>*|THk6OW&dk6cWiTe_%RJhO5;RY5ao49VPcD%Q}A z5<(@EDk01g*0wM(5on_7&o7eV7ArRVIr{l1nG!iyLRVxoFQcm^bnSWty+Gu!K>mIa zEuut;O@=kJTtb-=%HF9IU#lz@7t7t03}?1D$ZdQDB>cO1*ZPaN&GALt;vl#2b@t<5 z#NqW9al7M-xWz$k56=SY)7|T@;tmH_u}9OVTO8%~d1!z%t9zYevD5Ko-0CQ|`=FO` z@A}Kw<@hpgag_LL7-{opfBZ?N7_#iYSXtTftU2~`b+AhpS;Jgq@DoWOILO_5S{^E*CXq%tCODduyI|t zKHP4)s=*NOnjT$$O`UY3cN*7ptAib+D=LSgQ=vH-S_j{={<=EpSMM{ft2ZEba?cUv zce5XCSk+VIZWPZXS<}4HBjvuBpANT7Dod45SE><#v-oQ#h>bjQ8jTWH;9LovFQIW6 zU66~5t;GlM+dbsx`ek~RgaYW29(QDHRw({(4( z*}RgpSEuMPT@-SI7)t1Z)Z3~YWIGuUfD#G5Oq0KzK;Qh9vNsXW#ByZRyGQZ&QT(fP zX1iAfkjls6D=SLIs|*;3py z%brF4uRM$V8=gh}7cAuMGmV-5w!t&4GfRvnd!uok+f)1Y!sQ*QvC&Gc6|??W?Zs?= zY|YgTlV|a(bgj=e`YAPcZJUVe+?L&xjR~9MqB+!X`tw*f4Qa7!jI`J;%7oRHs8H@q zjf_96ul`6yU;S!dVEu99WcW^-3~DCBv#K}!92^;XBY}Vviv*yragQ?~l1ReF&G`nx zlho!llrC9Pe>IGxc9V_cAa)`yKMfdD#7~_13+Q0aOw|-~kP#8;x{nzZtufOGyBS2Q`?kbj^K$g|pLn z((a-)MoT1&lFFWOrwqq-NjDQLBB#qnvV;Z=NTD?ma1G6F15_`R(-@Z)IvfaGSz}q+ zEsoc?v|GFs#j>X>&L zFq151U?Kz81gX6otB#Pqz*`=)k<~O$-9H_Q1fa9jfh&d7fqd45_5}95<{j;U`XO~n znayf%{Zb;MT}}7)Rxh+s2ea9%^j61xuwhSoqwq%U$7{3N-av1>Fq|UyhQOxTgQmMt zT&DR*;u6e<4FsoPp)Xs^x#qZE5sKEhv<_z>;!luYy_STCzgK;#rk&yMqp+SVp^uc% zQzWnGX_8y@(Gq$_M!r(BiNb)Xct#$yo|T7xsxFL?3jW#p(`W_%yh$`)!=!{O@D?#(1Nqg(EYd^Th7#T%(@MyuT;S#JGxI}X@hrERqB zauzq1;I^qY+J|NWGokRc*n}?<^v8noR46>-iv~k7FyvFMw${Eds*EPjClZSn5=t_$ zG-7J4eX2Y#5zi~WWHP7Z^Y+ltH}s-Qo3a(DLoKUyx^4x31+=WTywjIXXA|*4Dx0D5 z@U9?s*99?~%NCSG!Cn^LC`~K(hm{+I6Oq)*3{K#`-(D|DZrmTV{lqg4l%1EXEjYeS zUh8PtdDGf(d~y$Yoo!LJC(7>2J?+h~Sni~~XS}QqM0Q^oypqZlit)6nf9-|LTd_KR zPOn)UHPS&foSb3Y$FzJcZNefJO#J>{dCd&q}wU0+vf(YQ@tIJYFenxdK&!Tb(%D5PvIrRAlV<=2{N>8NiJJ*9*_*=d}y1JhQXKWn2Njij{X`PHTqO)v@J=1>7N{y zVXKvfrZ+84eQh|T&g1tP#`Xzh6BFIkUV`2cu{GOS-V9QG0bYGx}p@Q8)Lg@lT}-!0>)WsNL7^n&@A+t z9$_Kvb>4m$RM#|cHQ=9%LYqoQSvUpwF}sa8i9_Rq?h$+s3+zef7xjPztQ#Bl7z^<; zq7l2bap{y(TNU++^N9P^HNG_G3qv!R&N;P1InyCvPNb%vqJdc8sy{GGJBLAA|8(-HEoK2s9#%0w9|(tH#BV2!(|{d- z53#TcFcy!fSc&m8JsqO0;bODXK7SzQg4;v;H`}hT0Mqdl?fSQx%8ZRJE6ds3?K9ds z-wh4&3^KrfO`EQW>tTIQqZ9=%NuD_F6#zTbsIwc4 z)DhFM2LDW5N~HJm7fe$61wJVOwq`lbpqBHkTJRs51oid$lc`Y){$oCw0rn(eZAXDU zO7M0}cc#Aky2um9?gQ+`!PAe21NiL7^$px?vg*rdTMk}?D3&)U5 z*d&=bKFI)fV6bQ+$2v0LTYTUF`wtvxRKv75$ANwX_%kXC^xg7f^(S&xeNKJSb;?ij z2??x!;837hr+mglk z!fSl^rqN{9nmVZ4jhM{G)vxIr>|XN3acBb;86UFKLfrXwjB{zqMqs*#Bt8)Vme<;f zh&ywcA)=KgA}aEU2(Yl!Vjc@BG{ygI6EXcbpO^qkDs2^%^Cgz}e^#ZW@37zElM7%m zp+zoE6&K>atn-C<4)2=e@;7{P0W74mn1~_@>+t?G*C7R1M#hi>w_|DcE35sO@DqG; z04$=is97;ZRXD~c3BdXx1|zsnWqU?^icb!Jr85>eI8;i5f0{tAw#y}o^XJqj{Xlt( zPb`3CBNlH-Kp6@C13obT7EM^#K~r5_$+-tDqOh0~6t)M7DlEqX#qEV63&w(P`JxMp zXG#}*>la~Iw7b5)w|G&8?f&*gk%l_G+Zg_&ORi>bd7)^-cHzBI#9_Peo+;|ETpg-e zs2(Wtum|peq7TcJsJh}_C<3uZ{{ORg9$;=%SHpH&d)<5Qrq~29>+Pny0mk;)cx}^B z)Yj7VuC%Nq7YMx?1O(VX3LVl31V}>ig+PFikPrwhAzuoigfEbU7D_7cpZCs4n$aC; zjl3)J<24WOj%Lm|x6GM4cW(Wt#+H|JQixH!JLeOWd3<9zCyC6??|X8l`{O=oWX~=W zuU)^)x4)c|NQ&pcNA=*Bb5e=XKBFIikNqSQ@A7UJm~`S@;Mt!3v7dxuq+Sni-$f>+ z7!_J;?#9P|l8P~$-%9u{HECs5{<~i1!LBihBmD4&u z+{Bd&BRjqdX?oO>waeGBxQNU(T*7R$GAC7fn$l~Q?tjAiM7Sey!n$xrTeK;>HI+C) zMvZPt#@kO=*Wr&P)@)lM*AmGS4)bpcFHHqE=^x2(Tl)!B^(}QZ!C>9O+CZ&8SRb6< zzAf6B*i#@=NJ& zwM-r{ab3r@a=$iuw_qu43l{oc%j6bQo5RVxibNM5ZCz9`Gcy~hW9sT=ZWmE|=0IfF zUT1Zl);TXSGBQSvjIX^RrVY{cmL3m zcJ*P^!7@3`Fl#M~RjFin>!OmrS&I}Xx_qgYwuflrCpxo>K1d$7`)d*Rgd)?s(3zq5o=WZ#d*ZFcUJ!j@2KuxxpmTw%!CaH7{4x^rN3cekIhK6|;GVNI$v5$-J+x^I+x zcRK@%(wE5@Mp+-a*`dn4AG?Qaj~v<*S#)86ITrur<4IVx|08mpovV=ce(=^r)-^@e zZ;xzfiX7b(Ic9t0SQ+Pjy!hJ*^7o`jAQH3&hUX0t?Y;^Ln;w+OcSg{M(@lj=7oRe{ zAH6;E(aY`+ABnf@TshN)xAcDa_Rxnfdt{W!T}Ih`Ioa~1qz~ZCs1v(GN4LJ_MzYzB zvAng44r=QipH$NLBz6laledgL+8<3G7Vl`5X^XAl)d3~5YkI(8ih4=!(8rRzg#A&< zHe`w>={!gx0ztO&8k#uGTNRgUJ^UyH+eM}=le;Igmm=| z_K)hHy>8U~Zp6MiWpblQ-fpy$1yCuDq>HCo1}pUXRS(sa*@&o2elI<8xxfk* zT}%Y(b&DNeFR6t7LpGo)lUs~)yG3)v-w`gbx=XK5e3VVNY{pe4pO~0wWwBlyy+uVg zF1yv;9g6HtRwlO?=XQ(UqGF}I!|f$<{;P(cuuEH+d}3;@nzrwu6(XBskt>AZa2JQNpndbBHnHG*{!=kmz7cE}7%(rs&k`=2~FJ0zqK4Q_@WlKx)q{!|v zHgM0T5?T+BDUkRTeIw2CNmA-i#0w*>+aqn;BeCs~_-UP~^E+j#Z+d)ojapyxx<#@o zypI!QPH?!42_BbA@RB2zEmbe}hNn(z~en*rp|APU^-&NgdGr zNp<+LPV`}mmai=P!y74-;L7e#aBe@o#I{&){zt#9gQL|-O<@7*HQOUcZI7&N`VeW~ z!Ns*FX1D9mY0r9jnf=?n)V8{+XA?a)FVQ``{UX7OMj2Nc&dZD*Tz6RYO_byrWn5)G9^1CT_sA(qB1TiTI0?lM@Nx+vxA;k zU{rn9m04dXEwjqFlxA+9P^&5?d+a2w6|1^!+NS!U&XY_##DlIJ`f+JFRK`Ul3+K?z z^$a*$YX0KNq1RkF^k!)}RL0d4C%GTEZdyxGjZ0GQXt$BZtckf_(wH?x|FXN>)O7h( zLUpf<%LW$8qMdUgb!aYAB#V~hen}P`=E|bwrDahWm&?n0&U$9?JQXV~AIi8+TwXr( z#Hw-XN|&cxmHSoGsXnKFWge|-O3SY@E|69@zjp57a+c5c=W~xnGiDZ@IGQ-O{qCj4NUl%A%cfC^b3de4$Ot{gN!2 zsefgjx;gTzgcn*FSAv@0e&=`px=`xy((<5;OCaUBNlz?@q*_bMg)*-Fla~uUu@aEF zytG^>>P+Wa4_eM^XJ34i;V!1*WJaPm zho4ABDQ8AGhM%Z-X}MI!j1#qIx-&D^P15btw$)*! zWkwk%Dd%-Fy62|$z&u2?skAI9;{@HjPI-5hboU%Q_36^`ql}YN^IRlTSL(5;s_NUN zWl0$)X6CtwJ4?FVMSfFSew1-iVqWKbu1M{{VgKrb(z2zD6Y}z2+ujqcdTM%}+H))K z^UQmBFZor%d%27g(elR1dFNJ7PD@j3bdKqcSE=PRyYg>CY57;i`B%pGNRQ6OQm2-d zA!VFETB=FKU*B`@+dZp-@Me(EZ8ejEfYg(w@2!>N9wmn8di*w)dwcXjFO4l zBa^mACU1{S*&dlH^ChP@MP_V|%#@>2W>2aQ2Fq7TckU&0VI;aeq6+NekRH$;?{-obKf4k^OEvYQg6WMl`m&Nm+5;w9}37eO$+_FK+Q&}X-J0>61 zW4~o!S$%!jmLsAYBfU8hNDoh(A}`cnN3@-l(+W7n8T%D~{40Cr@n2tFrx=kqrFmOI z>JH6Ge==2IA$7HD-kqyII+c$(`p?Jsg zSWBTw!q~BeONk4m&TN$ueY?BPeD0ufzB+ock}yOn2}i^eNtp!h?QA_(PuRz(Ck%}E zV*a)QYY?ej;#Q{zM|}R)s6P=dR0QrC*)T-1LB5ib+u94c!~fP7fAV|iYx%e3tshiI ze68Ww#$?3%;Z(auE)2E2!Pgp16ey*3jnbiKUj)(Ex@cQ?gTK|=*Lv(lP;I^llAC>r zaL_v*>ei!*Kl$C>Mq)J#EGp|eKRrnDAhnBULeKiUG&Cpu9m!O?x1V+4@0k(QvUSjc z`p)cJamVQL$S}J#cVuKtW(Sn)_eC0bpe!c_Z!Q1_eaXzKRldV>6dS!j*j@wbV2pHKsUO;{^fIlfeGCK zxwEf@+{T5*KD#@#-(1NZAZqrQ!ZoC(NJEp9z&p@mcwuC5Q)EdKi=IZ7Me;WB`tMyq z`M~ly%FtkIT)xyx_ZB_Qv8q$tp}tn?5dPj*N2I&=3Ocxa?l34AkHvO&yXA~8*lQ1E z=MwjB_R$mx=hff}j4>#of^lg1yktN^8nt)!-J*+&!Y*QupWdO@Oz#ItNgpJO%jhv3 z;o#<8kIAm1`~PXhWN8^aCJ^oMGRB_O()*FqjUPFOmCr>6(wH7DF#2N0+rFGHqTbg{ z&s9*4D5GcigTZinfsU5aJi}3o?XrQi_p`U8`pA*xbC4m4aFUPSc=tLcB$W)sxAeY)&gzscQ~&$-CTl96Zw%iUPDW%{ zQea!*5kXzNigdYArFR=E+OD>KMz*o^NcDr$WMG#u`@(KBogkY@8Iv#mzi4dTvHf96 zXg66?K9{J7CF79-qoQ`q73964yK0NNL&;++|G#jA9&12bTSiBSB;&DON07-D|Bd^w zuPdJ;435UaNj*-mq{guweL<8wCu`R(5jK?15k?-pys25XpY&~5wzgR|r7X!EN}usG zv_MK%_3MGX2?s4YOtza`wyw-+99AHWD|#S_m39*A%bdpHh0-|jLu|!ozF|H05FM)h zwRzpzWs6poIhi90C9?;%N*$t;x%BY0Wl!bELaFQtht;WEyQs9)eM>KRMiok9{~mDI z!ng_1e22a~yeX}Oa*rcg3RcYiYFxm@YPYs>y38CxKgt3LRk z`;#f9tZ(g-4eOS#TDH2(PCKqpItPyGnRGTcE&V9c$-bq|>E4-vxvMIAAf3awpUc)a zFI%*9>Dn^i&>%rPQ!lC@wLNiXS2Z8*Yg*mB{P3nlE6ewZf6bhkgGBysJsB^%0|#A$_+*aO~55*M#tcSMp{yO%^F*dRI3+QDW>OkydP&To0d)YN4_AA+Mh0_ zo=fq>{1pE;%$hQ3WN^Ub7ihgw*_3Puw$Hf9GfMsf$ZX zbr~nDWwx8j7IED)drjR|TGGonQERNLtRn-$J2z}iJ>m3z^>pr+Y_Ro={*_tG{WqoM zP8nw>Wj05&9HX12DyjE$F4$e@s?QlE6$)jXl;f@ebjJ)GwVNc`RYck&*3>+GA>$!? zmzFnWoQg8q{rv3gycE?`C}Wy)7i3lc4X$iDwzO<22_Df+*w-2lyRuN`!&@K8x=Ez=#C%AINS6Ysg zaRjZq#iu8R)2eez%Y-tH86D$ti=7@os=ln9AXEAMT50Jo<4{R=`geNVqMv8 ze;G#zPH^4-?jA0v-YG2u$~ZDEuW?}487Alc?ECnSnRCAYcYy(P?$!-G0PABvn$BH8 z)M@^>53O_iwNCQKdz_uyuXl|>ciw6Kc#pu#f0lQJ;dt)*yo-#@GZMWk4Ah(Ks(9}r zqxRg7^e!=kFaJL8D&zU4y8L_B8rMdmw?f#(bsKO!}mw>^M;gM4#pGv83_p^3Byf$)O z!6L92tOpxF7_@*C*bL4C=Y!9HtH2k*mjo&GW`$0sdWcg$2E+Ob zhJ!=FBJcuu5j4r(i)uAUfz9A^;Pc=I;9l@3cntg=JPTe0uYvc#`(U_)uSS6BUM!+tDYAd)9YzLnMp9fzBUjzRGz7HM&KL>0k zqkaee3SI^8f%m}(*>FOQ1T(=bPz4qMwxdvs!CKG^f*=GEAPLy2N}UHj1FiyJ1YZK* z2Hycc20sDMfM0``!7JdO;9p=!rC=zS3Z{X5z`o!ha4={BtAP)E610Pp!CByJa5=aF z+z4(0cYr&={on!cBzOwE2>uA(2Je6h*~C^21QWnSFc-`NjbI^I4vqxJf#bm@&4*me11FwTO09)&-KC+>xVqaA?3b4PZng#X)Rp1bC zC|CoI0-pqa&<;)pXM(f9r@`gm25=+zCb$Fq5Zn(Q2Ty?K!1Le@@FwUpRL~cU0;9of zFb7nF8n6T`13p@yZ1fBvf@!$l|3fjPF;B;^)xC~qmZUEl|cYyoB1K>&U6nGK*5xfoF z0Tsgq1Hl9^5zGbiKqFWPmV+a~ao~8c3ABPwfz!Yx;8JiMxE|aNz6pK^?gvkRC&3Hg zMer7Q8w?mBr~u=^1h6NV3mQNpI07sO$AaU40-M08;8P$CE&%eW`c5ol~A$S}- z0iFjhfWLvaK>v|~0bm>$5B30if_l&Z4hKhoW5BT>3KTd6oC+=mX>bj=7JLKT2JQv- zfnR{f!E@kw@Fw^h=r>BxAB+X#!0uoVPzUP4Vc>9ZG&lxCKoo2Pr+|yV#o!Cz8gMK4 z2KWKE7d!@j0sa7<18;ygL0@?;9ub1V3edx zjTWTT+VNH*t2tEzjs?eov%xvwYvAkP7vOR5Hh2dN6dP&~m;$DP`CvbAC|D#&sXeD! zfdx1f1PPD?=YVs;m7o*c3~m8;fp38a!H>XG;A!w8_#=1=ybUHz5KIOKfrCL9w170Y z1l$4c1iu2$fcL=%V9$wyxnLz&1v)?iTn#=8?g2jle*!OqQIiCt!T#U?5CB1N9ylL- z6?_dm3LXRRfOo;b$$~*(BA5i`fxW;&us=8wtN_P@6F@6y1E+!0!KL6ba1*#0dFz$t=3U>cYXszD7n3>*%Q1IL3Hh=a4iIpDM4bKo{`JNOZJ2>b^8 z7W@^w3f>1FfKlQ>YP2Aw&Yf;KQ$42|z~SHsa5OjuYy=Uo1#AVM2VVd`0QZ9D!1JL0 zG{FF{H`oU>fz==m+QFy6<=_TzBe(xEQ1bDb=yJb@6MQ z`a0-0OVA%Ioh?`ft^wDAUxWVzB5*PI4!9fqFZd1k4|oskyPIG> zI2IfSP6uazo53yM5%6>H8h9Oy-d!*T)Pn|aJU9WI1I`6s0bd1=fnR{P!8>5$9)d~W zAaF1Uf)KbEq`?=!HQ?*uR`7jr4|oLp9Q+pi4*UiD75p3g2Mpa)Fbqru)4<+fA8-IT z5UccYX zszD7{43>bkpc%wK9GnZz16P5o!B@an!9Cyy;OF2`@H_B(@EUj>^w~?$7mNer!Jc3) zXaozvkzfTl4jd0!K^r(7oB^%?SAv_s&EQUO7kB_X2%ZE_ffvAw;BVk9(C-t1{$LCk z3+8~`KsBfVi@_4G7BqtZ2!alf0B3`9z!l(1a1*#0+zIXi4}b^3li(@v0(cSp4ZH>V zNlBvmgE3$%m;-hL)u09}21~$N&#daC&Z%#LcfsF*f4(39J_|kv8ut?{1eb#=z_-A+!P7GZ zzvSqT;3e=5coz(;5)1-+flq+dU=2uu6u1Ul3myOuf|tQ7V8jB!NKgyvz_H*sa5^{x z+zf63KLd||H^JY)glfS=Z~!5CkER07-BTI2T+AI>F807H}8%7I+Z+2s{Oz1}}gY!JFW3piix!FBl0% zff-;X*cZ$P2ZDpZD$oQ@0zME2?cfY>Cb%420d5AjfV;tW!B4@@z;D6tz^mXj@B!#k zCm0RJfZf3Epbpf7<={wgA~*@eK|44LoDHr7o#4yhE8uSMUGNj|Fn9+18vF^o4E_%O z0S3vFpen&cFbT{B^FRY=1c!qoz|r6sun|PS7O)ju04@YqgU^C5gRclu>gZ+GgZC3o zJq+Fh?}POXf(>9!qhL3%9&7;H!9}2ApSz`5W{ z;LG4q@ECX-yaT2lAeaUggC!se6u2B*0e%SX2d{%Sz>EV0Gr>x*3Y-E?1z!PQ1-}B% zfcL=rV2^_YdxE3DT5uXT9oz!G2!0BF23`kmfbjRZUJ8e-vZwTKLQVdr@=45 zAHhrDZSW2laHyaHj05Ar?qCm43+lj9unepN>p=*FK@z0Ex!^p|2|fdE0bc}nfp38a zz=Plk@FaK+JP%$6Z-Do~2VnRj!3Z!7Ob2^|eZWEBV6Ymj0Y30a5C`qx9B?kU8hjRf z9o!1;13v^$fv3Trz{{ZTVnIJJ6-)zlpdPFSYd{nza1J;ZTnnxPcYr&=L*U2Y_uyIZ z4tN&~ULqI*rh;i;UoamW0uBYuU>(>9B47*H3N8Q_f@{Hb;BN3;@DuPbcn16${0Y1a z{to^D1}zm-f{9=fm<#5C2G9r&2SG#xF5U%{tU*i6HEY$z+%t_V&HS&^Wc8)0C)xb8H`*n7zOG; zJvb4Z1kMBJgImEjz*FF9@DK1$Fk^#YCO8Zn4%$ErTnDZPzW|See}I32*+&cJfHmMK za0WONd{tm;B;^XxD;Flt^?PD+raJMUT`0H4EzE-3;qCJ1FwVk!3SW(ae|Rx z2AB!vgZ;q4;1JLRR)dp(55zzmoDR+amx9Z{b>Mn%8@L_Z3+@AtfnR`U!5_eD;C1jm z_yCMJUN92O05idSupc-W90HoaYH$+pff$H`)4>_wQg9i#4qOku0d52LfFFQIz|X-e z;Ll*t34%&68_WR*fCE7@SO+$NR&WM56I=;8!56`oz}?`x;HThc;J4s+;8pM%=zF4| z9~ciNfVp5ESP1q9t3VU*g8*-!6L92tOpywMi2qpz$xGoa4EPE+yuT4?g769zXGp-KZEzc`(V6JFahif=7U9G zF<1{afQ=vmwt-W?W#H4`i{MM(2jE`t6nGlE3H}E9ep1j6j0R)CY%m8b0M%d-SPYH= zYk?mGz{#KkoCVGXmxC+7jo>D52e=d54;}zdfG5H8;05p|_#5c!7xV+8!5A(Z#I>1@rY(Yvr8L?ivH*)GGa7R#ZCpar4I2(Kb`h*23 zuo+wjt_Kf;pMqb5{{=6DSHM5OKS5=SU@({jCWCokFVF}Uf+IExmV-$WJ2e^11@k~X zXaFn0Di8oc&;b(QY;X>^0$d4h0yl#@!Cl}1@Sq^2-apyOj2AfdB502aP6pS3>%mXK z&%nFj?_ib^%mzn*<)9s$46X#7;6Cs}@JH|x7`aI>3LFRy0xe)8_%yg2{15m(cmcc! zhPDcZfhw>7tOpywDd1FaJ-7ip41Nk;1+Rhk!24i$n_vW(4rYLT!F+HKI2fz~P2fau z5@-W4a2hxrTmmiy*MjT7H^6P+2jE`tD0mF~9y|+P1+Rhk!24i$OfUjW2Q$FFU_Lkq z91K>0CU7D+3ABM2I1QW*E&-QSztD(0t>)l z;BasZI2Ob}9Gnj>0M~$P!JXhP@G$r(_#OB?cmuo%`n3!CgK=Oy*b~eJjbI^I308rV zfDgn#9Gni$0GEQxz;)nya2vQC+zajlkAYu+XTcx9Yv6V8KKKBPkf%tE1T(-)Fdys( z4hDySCa@Zu1biR{;^1^}2DlVl2Cf6wgWJIE;9hVacntgkJPZB+UIVWSQtHQ_vL5ac z9dc?UxEQ3tH^6P+N$?c-JNO5fmJmz_i@;*g0yct6!DZk(;BN3dcmWJc3WkG5un>em z7;Fa@fxE$X!As!(!041<3^)iJ3<4ksE&vyTTfsNLZ@_Os(Z&E&yK#w}QvP6W|^2E|{`aFcmBX%fQK?16&2J2Hyww zfd2!30`G#qgMr%wgTMqZ5$p-(f_l&ZmVv{-IP_D91CI~4$cP`fE&P#;7)KC_z`#r{0ck+UIwp#e}R94 zVe;&#;b0Ef4eSpN04u>Na1!u=&0q^SA6x*g0#}1CfiHvafV%}LHQ+q!0sR%Ho&o!v zCa41JfT!*Sb59q{1IL3Cz&YSt@FnnN@Kf+J@D6wvOg%#|4IBmz2T70uH-VeMqu?>{ zF8Di`b*5l8I0~!m<48oDzE??3KoGi;3)7(;0NvC zWN;=p3w#<}4sHN9f^UL5zz@Ow;BoK-cn&-d-T-fcK4%O1f>B^Jm<48oDzE??3KoIY zU=274_&^(oflqit-OTcyDdhktf2Y3KH2%ZMN1b+lCfw#dsV8FS83NQ|g2fKqkKrN^POTjX* z4y*?u5C%z*0_TGBKqvSNxCML>d<%RV{0KY*o(8`Je*`aqx4}DtR4P5vm-HpKwTFF) zZEb;gtDZuj-s+DO*gQe7MUYC5h_4}MWsv{WowZ%iJRxuLY z=xd3#S~C&U9`Y3G#=rEyL^2eOB|FuyfqnXMvvQ?-qk(}Olg+ru5`Tt6M1ws2b{B|4AylV5{Cn|g_ zLDs1z&X6C&?Rg+I)d7iir}`fx25*VRTqj0lrDOrcM7&i5pR5pPpU~e#>Q=d)9>`fzz%TuIpk9^Fg7i=wf+Q&3v8~fOm5WS! zM_i_LBs$f%Ns1MjymP)S(PTs-C|jLNk}ug?j8i>Plcl<0r!%oF7VOj~bit^nrlcz+ zT)l8+r~aKv5A?UT`a(h7R($auefq5EtH;T#=%)wCtfk!mGp&&^qBL|*(e0l+|4~4OWkLUaVJq|`LpDMpr_35XFz#Q49 zPoGLX1V+@qj#ytk_+?d}zIy1(3aOTGwn7hjSus$Lc##MVohv5~)ni>&oT&%8pusSg zRedC6{r5~g#AQ|gzIx2ps#o6Avt7jE<$ZNHH}a>Sp5(HkznoBvY31Yn1LmlL&?Qb*Sz;6WizVtFP`g6PveKdf(ztrS2>f zy{9daKk}!a?jsY^0}j<9JH^EGI)3%l-C?4aA9w)8p0jIXzxYAL;RG`snSfoF1>H z&*|}M`bdvg(?@jJq({{@*3?zkR4;5<*bu5}tZVGlRaloTf$X!!Md=2K`<5@fi+U)9hUYzen? zT7yqc!nz)OqL1|86Mb}zXeoW92cPI8J@`Z)>A@%ZNDn^IM|$vyKGK6v^pPHXqL1|8 z6MduypXeh!_(UJ+!6*7i4?fXHdhm%p(t}U*ksf@aj~Eo49<{J4SXUDY)rSI&q1pvO zNtGTV?ITrsh_pV^L!|Z5FGNe}BgPwxer-c-!@>o1^$Y6jYHMoiJFU^epG04e5!OeH zAV`l21VSw}g4$qBAXwcf1+X4Z;73-EC(uWFJb^ya;|cW9qoS|$kseQ=kMwu~eWb?| z=p#LzKp*Mx1o}viC(uWFJb^ya;|cVU9#5c;^mqb&q{kEJBR!r#AL;P~`bdu_&_{Ya zfj-jX3G|U3PoR(VcmjQ-#}nuyJ)S@x>G1^mNRKDbM|wPgKGNd}^pPG$;=(O9c2 zXQqnsTsDsF{tkbeH9?d2YI;yE9`n)z65-aC z&h&uxc)YbUJviJNZj%bsDdEm=dXhijudP`aXlQJ#_JKzG~r`n0?0I3IT>`V_0 zg%iP!XggWbsZN$F;q;g_{*FXAv`8|>)a%z4kN|cw0`SmLTM4Mr=gTJC4!dGARmRSA z|IPkZF*eySW~iu?m{Oa8700oz@bUss+jKg1H|%;Tsk4dYAXxy?C%0PeuocP3kzU!D zky7WO4gLRbhZnqtWDMm)-gw@SNVw@vq^RMk;XcrNl zAjL|mO+GfXOh>kWQAvWCYnUo3KGC?EDM`=7+PtoJNbKCS@Otwefi zUYa~a_A%^qtyAga`IGo()0OTY4Q=%1+ zPr4!*-xQ8XY^EA%bBL>ZiO=M`)EWYxFl=rsIwMtH53Ea1Jxx^eA6O5OE+1GAo#8%zdwc6PpIwM#a#Q_M!c@N!gwr#O)Vp=m zZ;9Wu{48MXs!p)wKvqMQeNBr_1XG5UN$Jx*r z(k_jENuMruPwdncUcX1l;*e5*@{CH(j3v-@RPr^3T7jez{*5@A9T)R4b&9FK5}EwR z)RgG*F*Q{Nb;x%D4Vfp(J?aQ2+B^LoUkf=Q?QZ^b|6pqrm2ow-jSc?ly81wMT~#2^ zP&=Os>Rsa7KangT!v*zEEfZ;_qU&LY3+g{wCKhk^mf?c>0GWz*f67Y41S3Y)CDreI z;uMVq#FlzTnl$|$p>kPOAUPnON+LQ>%kuD#H!N!rRcRaEQrz&CPBk=R7||{ai}(oJ zFhysP7`Jw+(HX;5DNE`K##qG1AwDP?_igbd zrXV}8J>G7MPBhHg*VJ?*#{}C`zJ#sY=r z4SOCI)GTaQE^cntyO|N?$%bC`s@g-OBiG99NcV52zE%^EsC=Xmmr`j8}SLM#4 z;4d0nq$BJP`C7uUp!5UmOCY1A4S7dYr2|D?y&2X0P_5Id^VHk@Ykb)zytP4GsQKxu&|~sSW^?Io$nS=2cuUJ>&Ny+=`vDx(QnjWPD+d?7#1vHwFu2Y^1~N7 z*{VQhb=6`W;YnVqT3RjB%8~Ha)@aK%cfisTVd!N9)e%}RQ06H4@ro1hoPC|Z=&gdO>gN(HDYh_Hi ze5jE7WCT^n(hIeQI}E?A@N-%`*K{L&MHJLV^ec3QL2@QNA?$Cg^4Izss%vHcp+Lw# z-@2qWX}M^uT^?SM8z{|)ZS6^^MVK0vkcy!(*|6tmpgSY?7gu5mB45JIpp?safZy8#*3Bll`IkU}Ig4KiCqi3NEOnZPkvkl+d)T z`qN{U#A6}-9hAGMP9@mg4DEuV1MIi8-Do-_8Ep$ok?Cto$ekQ-*l|g#GbONadPL5+ zzO2qB4l@m1PqBfqc+x70>{LxO^lS-rK4wSdthmn4Hq;6T4zbi^gn+IASy?&N&~`|v ziwSsKzCCThy0(X*UPO41Kd9So#IZA8WT+b=qjLr`*VGk6YmT8?NOF=P>8OBP+29Bz zb4^{dD^d9^HDHOYJiyB~%RO@xBDWHSnTBOgvHsZ122~-A zZc;(uJ7JumZ%NvBWw2#US9ZTmcvB4de2EIHlAC>QCKwud0z)kecHQ{$#mxQ*PVWXhv z5MQD-E-gYr(N&am(6W6Yd!4h`b`9c)E)2%dmobjhHxH zCI4DcSIHM1#7lwh{EVZd2l1o@{q!VxJgK&{dW%>%A5hnYq7SG`a;Vgo!^vn;Minsb z!G2`!66?G|JUqoq+;J0~e&Y~T|0cdg{l<`%s7aTSSJb>C<{?bPq!#V)Wrs=C_ku3t zl(T6`5A*3ZEtxH!aORg4&UDj(ozkj;@FqAT6O<8|wk_-GT*E|Bamga7jO1sL6&tU6 zmlIY)h>R;|@-G&@Tlv!RZPpr&xxUSev=|~z2e#GKXd+hBfnAaeJjtu>dcJh>WZbVC z>!O-S&|SQ4oT3tTOa>-86YUjtzKknu`=XlOb=WS^{^FYM2Uco)Mvl9L^kaIvej5(Y zxfLR6H$tCbsC!8blJY`6g&l!wyVghxv&1SU?YR9JF|}7$x8E(PV?%RRw(ROMHie|~ zVuP64Z%1O2lN=&_QLXVU@s8GzL?}H~h5*+4!@*!fi@!m>q3Y&4uB#es50q{?Hk{8y zKRtk_S<3#2)uEb&!TMlBsHU#2Ay5;ZZ%D>yD-EYduZ+fIWP6kR%9m05OBm9tZP+qZ z)PY22kaUZ?;$vHwWLU@uszcBl<1m=Hl1Y+nVmHHthmKl|HEGUGgk=&zAlxF|x7obW zhSHV1AMK>iFl@Rt)iTUYas=dceJ{gG7Yf5{EB+QK4cyUFhe?RirEHjVsi+miYoZy9 zWzo7k&#+NkeprW057->`1tU@Ie)hZEase|!E@`zUKSCati$=&pUOvaAyNAyc`(w!T zXg&Y(ASMid#@6(RP+7Ue}A3C|(M~TK!(JF`dUHr?wFpXEEY&xv1xO$d77X zDFdR5yiH~snQdsO(}~zH>y72}C?>s1NSCxa3kwtSE!(!Nt8=@Ih)cXeyI1a3PcYOi z0d+n>kIV&~r#H*c%NJGKvCz+a_{JKlBBRnevvNjEJ<|_d(&{oS477^i+yifw{AS^2 z%c(2Sa@=m$`C@n3C1@5XjwT+vcpZ7Tj<2JI^J>C2bJAOGxP3aW24q((%tzKOuD+o2 z*FNdI$7Z&A2o26y%iO6c#!bwZ7Ol``lXPK{~LXwU+ zWL}T@C0i^GF2M;o%kKA!eq))>UQzKexvSZCiuJlNtAzzcCpoUTUj){h!Yp;WP?%g- zAF65y`y0YFRpFNUnguxr&At$ZuarR&x%28aZsZI@(MxKQA(ibq`ZUcU!?cq7+;l_7 zL&!9o=>y6}+p?WGt-ejH3)prG4NZ118ZobjY?=`*rNGk~)QtC_G@1Z(Qu2W{d z8ZvqpGU{J^VW%r(V)e$DeDzIfsi~{43M^b03fI;(%17pW=3H-#`BE}^?qP|u-m^@y z4K;sywkh5!gEzxc>u8T}sg@>{PW1>{>~AJo*6^i0OszmGgNA6bl**;g8djwqC66YX z!nrPU`(xw@AX0#(YwwU@e z37TVADIlrmWD<+M;`o-)NrtWrwR1ZLxotjdq{@Pd6h~z zQT0CIIMbVdt!R4lg>m3DGOew6;o<4aZZ*~aLW$S#j5!@nE?t&K&G5SG+KeTx24Z7a z#)j9EJiVX^Ev*K-Vv+Yq77pKj9*3b#mNd8e1I4mLt&|lz!XEDfLsyN=#7NuR@qBTJ zt1+2;(I&X-AOQ^+h%g+kkM8KWM@89fUbPsvJOORJ9|(K*lH z6`8Kk??ZVXdpv#_4K+P467CDdBH@-Cq$8on&D*a@;voHmhHGU6)ouihU)ZU_Ami)x zdC!N#OK>dqbk`;0qw~Krbw&(KQk`I^uUV3KX{&j}Y?>=(`5{;``x>d+0j0rGI>`<9 z#T`Y|3<=R5$n8-yXXVv=V#fQx&WgM%o^Jqe(UDdK$tTU&)}-z1+utfy%(r{Kf~p}h zlX8*KHLjdN>-t_rvdB|mq%YAf{f53|+^)i9B9^Yqo(iWuqL-(p8uOy(dA(TlJQW5@ zzo}mq2$GTUnTV<4cP}fi4$ixKc~^?vy*$z3J{eIYBN?J0ACm~OF|lfHW|8a`S4)V< zgxsBT8MCg=Epp#H#AV4MseDUB3Rdzg0d)jHkH`hB)vU8Kiv;Nq8|0J5ZC79(g^Vqt zRuP<|ka3+aR>-&nbMdv`sk(MvB)(2DUflDkS zI#X#>Z=hZz)o#Jcw#3(1(u55D6;2lyb z>JHwxR3!L(S-pNSCC3SPMMb=&)xS~Rk>l&@s%nC=SWhTi6>L}-teqd1ZdX~yjF2Z7 z7c+wj)BRdP(w`+$`utXxaR>7Ksfa5+s=N$qS(QYvVoQhgE=w+0wFjBYCo^4aMKjQx zFrlavumY)QO@zbb<~*e@O_C~Qdf=9bp2{RMXN>q;^6E4qG10gxr2rjv>Ugq9rqk=i z%yN0=mu2JV=Qb5>QFS(UWlFxkRd@JhRpped(zaP<=}Z002sSIP&PRWsbWZu(bnc`F z$y_yUN{`0UM_%FE8tNkSD}oV;sLm99uLs!CHgm%gRF|POfF~uZq%+y;CTb~lr4FYh ztCGDhUU_bbsjJW#gm;Cayu%_#%2ZGzFEZEF=d?IJV~M8+$X`8u)X>QYscX=w)IMq{ zscYqo-y_SjGU^6&D%v(#3fAMHJ}oD`l46Oeo3&0yn;i(bEE7`9cxeIkC8P&Rl{C1; zx+~g&t$LT~O17N(stzL<=^_kEK;4S;0IA*S?q>6$)>qW+Iws+*;oxSbyv~!&PF~QX zaLj1fLh4Q(4gD+U9F~%qU`tGW8=XN6S8k8$6wBO4Ibe}Qe=;Rg@x%+5w9mv6(*rVk z>bp8k?Xr}jgq-f*5=uykV_{Xx;keoZd83&mpG%W@#=ztaW*HwZ0#!1 z%>`(tE-Rz{fzD{(vRES35pI@xd^ovW)+G~V8CqFa*BFxjTB;Vb)HYVv%{Rr=ztJDz zTSTMjT3J6pN)25c%ruqVGU|Oa2m98rXvF#sJ##(XKP3n0%1B>p+K2kS%K@|v#X z^=hBihx)Xh887XLW_Vf4s_%9QYLpdJvo7Og)Q9x~A1rVFcA3#FbI;S2OsCWHily1B zfIWx08jRTyzQbfD&Ej}yn_QAbfv8gq;R1Dvc1EB|>E@9eZY?zem2pO(QUY-w`^icf~;kTq#QL&XeBic`;&}|*)F{|=`)%f^4HcbtgdaTYG`N( z);IWb&0rDMl7ooiN7QCOt0g zZs-@5mEmuC&5JIh;F42woKf(&R4@u2vcoe;$W)!}Y?xsr!!4-h5{YqnX|s%2*Y+?h z6cHYtiCUM@a0{w^oYC;QRxlb~!c&Ym=lVCYemBZaNA8kZKrCh($^`_yoIAhUBj?G=|EW=rUy2(>FYF$04ka zap-4aYk8*~a3Os=#>b1k-n0Oxeo@wzNe^Hiyu2@EvVSrjlm#QD0vwXDF*S|#fyU}a ze=tyAKR=->6P@Zr)Y;zvbv?^<055fGNgMgVFcjsD77GVOz>nr(4o&Bx65|cM1jFN1 z2qm^o$ONZ9m1X^fREyn#Yif4L2Un+RL6fZ(vYG+Tu$qp%SB>Cg5s^^mXZrS$rBLLb ziXzMQ3>j?+QkJl3l~q-}a);$!X~)@w8hbfp)rRO=NNZGH>YkdkWylH(Du(8)Gc8R% z@Y5Bo;mu*GKk@mdTPV^4`G9HoTJGY_mkfoq2cZD?~Nj^cW=}t&)}g7llF{x}bC1?J1^eR#csb?hvasxqQv$ zT9nfRqwOp?VOJuhQH1q1%)EAJsSB~=5lLf+3(uT7Nu-re5S9_A`q6S!!7jnnEF;q1 zawF{1uIDU0vyir1Y^bfAd)U&`3TZlIGHSUet+1LyMkejVLehG#?+;~%vji|pj*PUr zn*7M5(|xvJI^AN!GMS`jX{$3aIK5CpEnl>RGAY%?gDw>cr_>=c+z!uKE~L%J&r2$! z>MR%vtGcA5$vbJUBa+KvYpoE|cOA0o7V=|s))%rytP67rWt3q;Z(|XQOW^i%Y`#aR zPl<&3DnVw_>N;64n_N;utk`D0Zq4*LuB+P|fi01*g_sPMlOnEANEs1z2YR;eERjzf zyAj>}1X~}P33-U6j40$(wzm3~GbZ+%kpgFc)>n=~t6=0Z@6+#M%Fc%7%v`eX$w}u^ zRVZJyg1X0HVl8h?UR&CPZZzE}m%WNTD{Hlax(^ffQ=-dkZayYtQGx<~V~ME;9Dy(9 z?VAnUkqd?5uNBlon6U2;vlsLP96JTAa;@hm4?l0`19x1q=NP!*x|vE%glz zE!C{xkR4)aKa*o*41lbkFaDalsGdf9H&eTi=m2*o@pwa1Usu1z?1)@|j#?RQ^>i5-=OPdIWLeLy%3ssc z5|p`_ffj#gepX(+Km-QLZ$xn;y_zepdZ{yd=^>~7FQa8W!}gk-p7Od%{EEoyC1NE@ zuq`WJ8n(6JzaThbjIPb~Z)r<1BQAeq5NqKt=|+4NVKxboc_U<~ML&%l>SQC-L@eJzPF%5t ziR1|D2hwkmA7fe3OlqJ1BD!pGLV$Xy!8dgZCm8ZAmcoBfU?&uJ3=3*Wh1y#8UKgM` zdRkVohl)gxA6~birKQyxWM)Yywj>d842XFC)+F=W>@g4nE|MHKFK0&7{)wK|Nrtw( z$@HjL^(xoL8`t$v3JLu+dfF8GoX{f_Y@-j_3`{yZn7XWnNL2!gc^>{B-uWN>>a_6Vj4`E8imk7`5NiIw98KN3MZxm8iN}9v`DfD zf`sJl*FvQDs8ZvROn5UghaIs={Fp58jFfaYi@8oU z6{%n4tEjPs^pYJh9n^I6-p@o(#wZa%`BU9#>zc8YVIW#{CaQZ*v@)CrAl)y>w~eVG zF$_i|lDna?(xIVtFC0HhWlvN(94hI7v2a*cDJ&F_&W(9!UG3Bwkk}MuJrvK#CEDdy z?TyYowhrU7q$jU`ETt#X8~0c8Kx(X=YCcMTaw*vZ93~ggVF|?rXt9rv%T?8Wa@s3~ zWH=sPgWCQD)J%sJHLIDZ4!wZZvmJK45jk1FR+e6FK=M4NjxnDs2y$H%rlskKiXs*3GQNspvUv+m!9^j3N0-y71C`Y`|ya0EG6Ktm*&#?1&#GJ z!NvvB|CGP{lz!O`=?EuN;^++iP_M}*fa-mL=r56_D4A6gT4U{dm(^EGC9-Lm1(s*O z3k8|Ln5W>VE7{|0^$UC%dEto3WDmo3B}*+QDl#oO&vI89{X0_39k*%>GIiSDE_o34 zN!yXUhUDSaJzBERhhZ2!wTeK8_~h8pqNtFeq^ zWGmZS{Ye>T(I)az?ai0WUR5U|t+(N^M-fQ3S)N&mp^uB|lgJLSYRpoF;(JII5X%>L zTvtIfM&-_AZvb76dBGS`swH1LllR57?F^5Kwt8MFs1i#vuO$95$ZHca3?PwQWe&eo zjf{Bdl&Ur)x5$o_R$JkO1+}4?n)-%?EwYG7sAWOR{6KhPRGcl2+~>1$lMK0pwDwy2 zO(FRMEt&4$me?q@hp~oqTn2z85PVJxs-zrCBn`P1e^d&v%}Dm2rVC*@HRP*N8bde9 zs;RQuRV6a|Pzor+fW0T@RxIqTEffqZ8f%djiqnv6(vsAU~QIR&0B7OYleefY~Ik+A}Wp9p|%yrscDA1 zDO2Iw*b&$3>RWx!6AT?oKwVBC!!l9TO4hmQhK7gGI73LDZ^?MONVit97-B1ONnJ&F zQw=pk#I#I(!eyDf%h=YHjn5agofGL#)l(i)D{IVJ#PQ=V>YjMtO zh?(rRPOF;!?1Iu8wEaYxJ z2zpU+9t6Fnxq3!VMH{v_)smA{U)KpSjClx6Fog25XfR54(r?G?6hk9l!nA4k?r-H& zSsQeo@HXg_7!ahcoV{z~jTq?b>N`ZQQpZNut@Up+OY;QG*h=k<2jqFa6LoBzC%j`@ zT*A@c|9QSXh7*PSlQWD|c}bbc5j)lr#OelY+n(S$H@%Q)r=ppwZkN^>Yx(Mr$Y?Vr z#MdD(k{U)Rx>07{WX8kK(_apXiP16~K(+y`u3H$Wt*Tqt(pX>LI6q%OJxoB847p63 zih7IsRpsW)Zwe)=2|~_GtCgXcl~g~sl8_&RY-5Z1JEq53L+Pc_EF5GF6R^ z(>KeDeGel5PkHq?feqfAHJ*!Srr}4{PvM(yieWIPq@Kpgpbmd1>X$x6d8f*LZ5w5@ z07F(M)wDFowzmy3(yhL(x~`^fenw9HTGZ743gr2DM*esSXAG&|5=Q@oRC&aH->qVK zoMD-(>RBxqj1v*{2W{4rI#w$brM@cO!X*^+fdz(ZEY z;4jDyks18{n0TUIW6icc)v)f6QmWbzE0r=M3`<|vZRE1*dohv>1t@aE zxvT~tIUsSeZcHwC8})THNL%#>in@aJ}>g#G0vV&V> zOR{)}JmRE|rYL`UigDj^LTW5pLxb@)>HhTVia*aZis`=eh)pw;ow90zR&Nh?w54Py zC*KVjbv02gdFeZa)fDvm%UTv%57$xe2;^JY2p1tW9eEjgxy70w>QFGVMN6q!qLGpo z&0wJTZPeG*ZrHDgY-^8OHA6=Lru$oBYEP{rC2Cy1+AaS#r7Z!qmrg-2EZ;*}|1;yR zud98u}S+)e!ep)&y?FcNTVf(8Y4@*E*>v*(eCciimYQ{!OsXA?+VHr;%Jb??UilxI6P>1LcwvO$3l+V7UT?@>9hpY5!pC93LsOOI7<<gy`1V@wh45H@3M38+@22kOV) zAwJRYep^DtwRK7Whq!6o5>OplI+}<%>m{bNC7@Eav@83(q!CbCksgwWw#m-Bp-`>W z$Nz<8Qb@lCtbM+w24#$TbzNXVZJ;&~2vzy#I~3HZITMLg;KP})6x8WC6K$#14`;$s zP-o>#grb{2oC!-oor{T~I%#;K(}tA~)4cP+7FHMJq7VyjG}Q}aqa~{@%4v(&?Xb2b zt1iiDxB0g^wY$ELmV)}U!$dUpAx&rnbtNW7>l~EZ;!8+3r@zBtN&2nzsZQIm=6GkQ zOIKZ$Gb%1>8dX<|KyiaEJ@t7ETK74UNVPfQXIm+7pKW1vE&A3o6NK^Qk%$9)p1}O#Yyqo2ncNB%Tmbxz&IVq%y*qZ5W zE2pF$$eEJT^23|TDXE8YrsP@7H>Dq7K8@^>pg`1en(ATf4bEm+uG%!kJ5}V6tmv21 za(^Zk(6YW2A4AJ3c=EnQ3KbFhi$y(=3(fsiQXn+z)8y$~XnEf!1wykwQl81_<$b9X z(6c{ReuG}6&PgfS@`|xr>a8ttX_8L`?r1weM?yVB^PJ;Sm`p( z$f(zHI`YZVr4BOc&76+ZzPr>xM!lWWky?0{I>@NM=X5;U4GP=|-FWaXt=SRkkmaxz z)Jtfx)auSb}P#L%XJW2emVT zYK%j>zIF$-GlFWot!?Gf4rn_C)g*^@CPMO2TR7cT_S)&5>d?+as7vjPpqhd95WFzn z=1WxJRei!CUC1XbX=1al zL%NVpTGGU%3Tf#dkhM>wdpxhSoaC8N2&x+N2BRncZ?vYAS6G9A838B@=2+G ztypTR9y>#&4+m3$sI}nIL@5qrP`sh%6jKMHIS{qD9@#R{5Vx%GXhTObu`M z%iuf5&Ct2&_bA2Pf-0<&vn3o2q*`5h;$;*zxY7af`wHrfts3J zU%r%&){ugc>msZ-;JjiF?$}GZ)%DnTNwi@oUrV(~fT}@|wLHO4vYvhwCvL-R3(j-X z4Gj;W0V=L5Ge|d7l>8jR!?0U#%HY;Zs(RB-|(+PZ>od&OKdl(jq2%C2ssmt*W$U8)Jj&AzWe=grhLAZlX`6%-P7k-WGoypABa9h_x|ft!GGsWHbI-v{0<6>O zrlJXO3RUPeeR=0u`C)AwIl+jRC8oZF;UQKeS*lmIHQ>xtL*5XXW{7z1?P-NS%FYIH z2pMJ0zNG5wgfrVPQb5ovH1TrVm@BpR*0Y%)b5iQ|qCw^h%4{?7bp7TPPw((sz0lgp z^nQe=;cnKtv1T$1U3C|MkGGPSZ`iuHXMxP{mNuOTIbGGA%foGXko#PLN5C!QZCDRA z+t+P4cdm%xoX}vxk=7^YUPz9e9j6${&&jKM$-NOe_wvuqH1s^hm_Y3d#Z$8NwfpI? z{l#>7hk|;L@JD71+jgwevkFJRB`2Rxj1-ggGQ9lNEP1lx>S02+3Y@%?1qz%zDIGHN z)jveYT3kKq4%uyKWm0$?TAtN>VI>K_DXRREl4%+gT1qEnZQrJ>%-h3Py~AWWyoAf9Kdx@lLmCp9dT56OmbUD)5aux>%PdVWSk^}j?S zG~BmNRPs*FFqFKcDpInKuO78!eVR@%v@8KtNkBtL^?c`h=L#{Hh#or$E>m?@bKqnij zSs69ax>p35chcitc}P`ARZzd!?Xb*yWeKQhxr}t4F*8Ib-zic_YFcD9Tygn=Day*I z*|`+uoh*=|JgGs^M4tbduAUK5dlJ|%9cA~q=|-M=2uVYPD2&lL>HDWp?nb-vl2;T4p> z6%n<+Gbrb|fH zDI`JVJ-}WWXg`h1ok2Oz6%5KLWR?up^k#Js!0>3B#W^G11*igaHzVf zuAxr$?aQ=0#Ca(Wqe7f_Zn~l4AvD<#GFv0`jKL0Frx|XW$TUf;Bco;*HoT;~l3+J0 zjMN`}wvzK)!6Z0^CK|!pJHD!V><-m-U8klQ8m7!RLq^x4XJfKbi|2lunV2VF2Iy?b zP#@69I7;i7=Vu!cDIjRZSiaFZ)twl(Vx0S3AjUZXuNceKOw-CgoiWZoUogh`f->-4 z_x4(qA2a@X&nbnAS@F;PE)f5mzyu@L?5TI(Bj!VN7CO&NHRKHuGtAs~#(3N!`*7Hw zDEegKhr=o5WjphcG1Y0?b+Vvsm(=7yeRWu-(^m)lEj3lO)s8+9^(hLEQ5)!li&1`L zo@;%6wxL)+P|8+cEUp*P&b%=U)r^QbmHRm|W66DbmZ9b?H&E29zF9lGiH4#rq0S_@ z5e_rD{YsymX()M$(JPW^Q?i3IvotHC&LhBVmgb!=oTYh!gXMR&Daj6XiV@$Okh+Lq zM>`UbX&BNM<`}AlB*|K-{pQ}to>_~8x-36yb7zZYZB7iwv74)kIgS=lodoA}9LMRR zj^mIcKpyN|@+KKMlMzv$%MVa%TBnN!=#V2oyK$;m3awV9>+%D1oGu!mLyr4r?K@_N z=Xw8-P&en_zueiP_b)4^e!DllpXn)ef$DH|byct~;1AbV1sBe@3X){2jFQCXu+eHF>+`&i2}3~7mmTSGo;Wm&5Ye5R?*8UnumSKOBX+gV)cu}DHl zfW!_4!(%aivOoxgK*(%D$SfBL3^I5L^>X!eh2GE8d-7Whc*Y543}(4tY(K`!cx>a? z9=zl6j7MN>Co|UVeIc_+t}$Daft9#~5xl80c%;2~lJo0^lDq@VEi4zEA&d)Ayj0Cg$UU zzJph|&4WA4p6@==ohmg^86T+(~CiZt6 z8v71{v3M4Z@rGV!9GCRK5xO@KuG2&A2%ESXzpSH+ofd_QH!=gtxW4++ddj?al3-J` zdARCVb+oZV;>Ita$v7(if?JRDkXH19z#15t6P2s2 z?A;vOCY9V>xt-x}>Fith{KC3>xOV>?)xTrXmhYj&h}p(n`B3N4hw0;#rm$=eeQAT` z`|la(_-#{D+h)yCT4`UI6CI{@*)IM}msE6*p$+BkvR&p=AIFZ*Jpvrd@1@(T4s6f< z*3OHM?yjO&&FPb%`*6C9sj2BXdnMJ9x11gw zz3ZT-VA*76A5F|RiFC_s^;gWr(YqI_|4#p~jh5X>8Bl3s$*KODYFn$S|3QDK`|5AF zxSF~=hUS{^=NxI)P z)bBF-JQ2Nhy=?p4Y*hMablQ9mPPlU8F1m{|!S8h~w2lrsU#2@J&^BeVJ9HJD-ZGnU zhJEGpBGQzx>O`tkL|%BbftCAloFyi&%S-)^>VK1PX>ywjw!4VYi$KfCmKG`+T23LPLG4kA7^<^~Qd$R$ zuRY&gVb_>jU)5jG?`}nnumt{+exU~c$^QAz<_|sS@8Impi6`f>+xSB*Rt~==SR!f@ zNXFPu(U44Qp!!>asQ#x%`FC87P#ThzU83tpPR zW}K@vj53_Pg$8!^N@YZ)oxRms!ewTzfJM?FuzFeVHg8rLiXiK&w5+K(q^t!YxDbRx z%UbY4)`GVz>p}x7YpIN=jAbogkhOH$kF1w(H{Tgm6MM53HWiJqkC%zvZ1xGZ)pqR) zwi9Ib{T)AG63)ItgHw%q^b<_Lz_j2cFspS|zmKlt^TP;{S^X_`LCp(&)+o>`Zu1A| zyw$8zPuf<` zVV=&~lAb)CVRXB?s~&nd=&-x`p@+xzcJ{UD1xRD=mp}BdgpRF^c@Sj#XaYw$JTDy zLwqob1tlm>(|w*rY<`Hk3qc~X7-TPjz?pcE{z;?NjN@xH$5hlDZ;3fBGyum_jvQjL z`Y4r{erW?1rIV0F0Rf94$gnJK)htp`v$!K>vCzQSnQ_A%4hg=VdjJNgk>Kzu3BE`cT}6nySB^xF86bFkHL=hJX+o7 zYyO{S_yU{CkcO8Vb#v$^^n&#qjrH6>NCE;mO2-7!sXk0} z@2WmxnR&qe88g5ALsK9$N;53m@yNlz`_g0A9bJ6o$&o3FN=DxL<cS2IRUQZ<|8mU}u+}m=cRRqV}?!z2@ zp_SjeHVW)Ge(jY`(mMrFW&I{2=TKYS0BT@isA#BR5B=C_b6i6@b~>J2RnpSzsFMF| zG-NoR{gM^jr`nMc+-F+9RBEH1sTKoZJ6>^*d79VpMLL0mD2>n7sLwZ+VVb@WXZH64 zK&%&`fdHGTy+m|3>Vc%9)(QWO9oNtiD>Ue-_M{Eeo^%qbJploWA;{Ng&Ox((gZ^24 z)0fTkXr||H(sPB1GFPlG>@6F@zd{4{t-eE)kfHej{b^S}vW5IC5+rBYp_X20F>`by zwU|Xgt<0ifRsS|{eS+u6_Y1=ksNN=WBqUPx<5B?J&uiWgNq zLF*`Spv19&0~NH>4%8F14pia+W&EdGAwR^!R5bEqAF_!X^F`tWX&f!B?%8ksa$)iJ zzWUZPkH7i&tA}5FCFic(rU#LVhKP3?IhHG{KMs3sHg9f6m+%{@Xu4#-(P&&hZ=h}p z4bC<+N+rfxuu-KN>)tU>lK+#jInz!r85>?@hQ=f^FEn6B#Hc9mr3)k`SwOI!WY5-4 zvc9}@S~Dg$3=2v{BW=#Q#9lgY-&ilb=YS@{k}hDyIt|!L#J#(=TuR z^qDtb?AoRyyZCg2(@1yfl|)4&=-pepF;ijS+?#P|N;wm&~=EMmS%mC>X zPMp+Y3I?^}#3^ku6{r>;Z3vQg*%c{B)*10i<#|b^cuX{<1PGcUz)+iZJ(eyW>J0ZT zJ=#<>a^@uIU>R;fc%o%N5S~N`hstmZUMwWR%SP8sh$O>ZXkaa?R7O;C<;LDBHgTK; z)jKr9=Luon@y1LoG`NTwxYWA9V2r6~hJ|73wlR*T@7{#r++BKvsc29QnCca5SObF1 zr4180FPuGz@igqC*6;@*-G z5_}ih;~xs$V-5p4~F6ykHR&-2=e_7Zr_QPbBV)_WKPX zBn=aq2671`=O(S8dEFj=ka1uxdxr1P-KnDasdJ=`=_Lg|JUIbJ$B4Ewb+9{Pl9aL&} zyzvgOIE1kO;t*aUGh`XfkU@5U1@AgL2!i)Lgg0*=3k@ze>`P@tB~`{@fIuP)$O)?F zY)ZWFD=;iLvOq;MEOKO_I+Fzy>YG9XKCB=|2hMTpm=4|WIfCju`h_#JSE4sK0#r1; zk-NgmN@{T^Az)50<50r!x9+BIEU0ro`dq^ISp^StE}=@YPzOOXL{3FR^Wdiv1mRjc zcLX6@xuJYE!3#?uc%5QMe6~UZTJyZDzEvsc3}l zT-CK{&Lq1uujxc+0{rG_b;!%81HX*a8M&OQ-z^`}jNQ3}Qy$vs&O(Gy-RL zWw7W^5P}s!IJCe8F9a@l%K|SnumYFLh{{;t0tSIgr~L?g#oe^Y$3zptzb!PdfuU4JR8pmjKm-J*Go(WTS)$DCm!d-%Zyb7UWVSQ8Z{*D{ zf9mj89$S3j`8N(dM%moOAG{DGbj>l1|N7YDt5%KRe{VheEqk_O@lXD6@hdMM{@M%n zY{wgie!!XDSAOTsg_jTi?yHNhEi69ql!4r^m)@Wp-#@x;Wbw)8M(iC4MkyG5GWZe9 z8H7Qm13eLW2u~ z=^!AGmEdHMy3}nm;vdt>j*3p%8Kd~GW8w=9*t6?j-3SuouccSyuca2+F{l-V(r~^c zL-t8ZQL}t<)X?Y=#)0`qR0fEc{5Vl$}jj)D-+NK61nLnS> z`i6>H-+19+{uCPYJAb4(=8yCj&L05*w;@Qp2hmJJJfV4|qUJRToeB+jo1u>#3~3Ep zDc$kDYHO!dg2|v#< zxz=ZsUU*Ur6(Gj8Kl8c8 zC%zTNNp$R`7$o^9<|(}hsAx#sVOT6zCdT^g7vzYV9i#K8T#e9w_)c}5>z}Bhr$H4A zB^3=-%_0>+f=ES>AX1UqsEdIj6~TotLV9WzsR$B8DuM)&iquA3AX1Uqh?yRdinKta zBE9KIMS!4{0-&abCNYA~=y^v)Gs5LarO=??NJW}sDN27~q#_{THUw$tmL=RitGT73 z<~DKT3k`ZkD$)k-x^xmoDgpu)Ly%!v>}nRNs98+Bs6vB*A{D^})}?b7sd%>+kxHQf zpG*=TOh6zj!O0*?8>u{}l^qqGvdc#*g$6;S@(=|#H79KZ2@c##uVf6_#gtkol%TfH zNTr!8_B=!Yf0v3z1eve}<5y_F_w0_7MwOg$A&DgHa13DAc;Ff$uz`Hfj(i1`6~Mh)l^Po^@Y=$Z?jBibmw*Y+HZH zZw!HnLId`wkqz%-)(H|MT%^~F?W~j9h$gB%BD3!I^{k_!o^^=`3JqA(M1DCuj6ws> zbk`jmPTU*81GdimY@xwGYEp1P z>j||^P5REEVG0dGH7OvNu!8f*smZTvHA%%9HCbrTOict5Bq%L3Fqwy%`xS|r6kHeEl)g|qDrz#Bb%h3(1!_`2FzW;-fdpz& zMg@v61R^ylnj)=TVm0{EEsk5@bW9S59>h^HK{n8Pv*zZInN2 z=B@n`2n2y26^%gnB%iUHi9iYsI5BJ*_}ChHtI&W?+d+c%*w(Ezm)?R`qXZ>V|3Wkr zfYe4T1%6V`>_Rj7eG~G-4j&bb{Md}<Y$(j`o{`?M_s;Ke_v@mw zIW2!HOmN{Yj!;Vmg65%AMyv$ZgMdW1SnL6YV6n@L#&QmThE8LB3-ShPDjIpaeGqTt zA-+O`o;w552I+C>B-|MgkcbWjsfqn+lLFt?EK*Uk=yfz$EHvoJqO<{v(n-jofPlpi zWLOseK(k0i&7#*jV6o5uyIE82sATwlp0q()PC8*tB^gKo0gC}h@8q1M%aEK4+Uew6 zdr6XW-+{D{N~NNa7T&+lYB|M0rG8hB_!XN}d>P`Mvp*33UE;6z z3livaK|-s9RJ^`$p^ zQBo>#Br~WC6r}(mzYqX5e?jM`kR@m@GKKt>7e(-~}C79a!7}P}y7d zCiak?_f#|@V3pI_DV0DSRBC6r@eN~f*Vfw@LEN=VX&8q(IWKrG*LXJ)-n`{2G}vs| zm&%Ars*IgCGR0!FjpzY%4pu`~W50Nq*zC=MR7VrMJJ^9l-}ma=_9SJ|0R_X>H+<)f2Ikgq9Jr3|4VSe{}Nnf|Etg-^uGiI+zL+Zf5`}9 z0tP_Z|0)j~9Kt_^G!PU}(MZGQEu|8@1eMwqYZjr3CjlcQo&@i48h1hcu&gnMaqI=Fji!YHx3=SiRvw&|?f#ZjX=JW(B|{MGExS*CB>8o^?Atg@W)I1Ioka9N#Cm__9m zIL(3^U(7$BnWvBa;yO-08gsf@ak|=4H;_{4t~k&+u%8agC}jcsSd75WIX5%Tzly#& z*~)_R37(;J3$WVlDC)xuf!mErbW0YT+)dIgS^Bst)GYwQ>_KKa)&IM ze;BWIq8&i%%TdYj#(Fc}%rirueFmZD%DtW~Sn!gsbZ9r2r9*!6K0l(MPlIn5c0_^o z3S*sxh%1GNWJI&z*O(E_(nnQtl12EnsTk>s0b&6geK~-F00r9>FSiIUv4bY`Xz*4_ z@U;pb1H=SB#W?~)aO}C7*OxPczFXn^K-%ff7@*PSY?|QhIW^-mxUG}yTCg58mCRaj zIf+EeXTix{aBA3`{ad!ZJvk|d|311uke^$?Nh|@-LScYmrM*T;drc(m#CynslcLJqdG(EL z9uEcUiY5lPn@2w2!lrSj|aqICd7k9L67zuVp6B6;m46PyFYZVTi_9202ev@ek(^nFcCdS?S5D@Ii8{9 zct#{gZ>=E5EO>AO$KHUrb#8}K32t9)Ai6LoL6_SWNHi7b(%_`2=u%HBOEYURIVqw( z!`Db-C)4swD^4U>&a~om(d!Ftj}79?g0ncGv7O$^0+J;l_DWStJWgEdkO_&U?LlgjF=x3m!*&C*b+#Q8U^?3l3hx#U5LE(~&2AHBW9-?i7_lC= zEOIuo;3jFB_!*6sRD5Jkctkz`bU95>qDzDGYR8glriQ@fs2y;0&Sz4LP!cnf1;2vl zhg-=2(e!a5!uVADB{Azn#m?G5bZ=I4v!7$=PF5?3(%?4jgHIGr>e9(smdL7lnJC42}9K7KDRzCa~{j>9csC~!!D84gvl(oMkAI? zbKr(o2i&}rdBma(l`JfKGeadkffacxP~f7CBt@15r%h@yNm=^1YGXB=E&yV?H%Z+X z9VJ_nc_C?7uLwqy*N(k*g>^=6Sp4XXBa@!Xpfs`@?OFtyD=@NENv<0FYK}mh4#|pv zGmLTqT1EhK9(^*zz`joRXv$=T(dId7F`Q$^f=>tWgzX-8OJ}CDZ`*7iZBC{(Ryn6* z;+G)C1ijiV{T6!V>~)lpq^Xu67IPcT$UzT;n&rpN=TcR24z}mSNSwuUl?2bV5_H)| zucV=Uvf%82Im^qwV<`;atpXQv zpuoi`PUGMtdmveGaw2KPG&0-C8V2GEta1k(oOU;KB*91)oK1>Z!`{(S%lH_VgFtia zVxc#39%+$eF|%LkYyu!Kq`q-&pctvvYJNfdA}Hkx)M~iE4lEBw?w*8V&0Sh)0f)Vj zKqX_^F~76;gZZ7NwaX-9E&?T%0J@{ks`BQ7qHviLKAIr-LlYi5Nt0!95%SyOK5K-u7HuYsrh$z+My$ zY$I)zxT3&~fd+0F=*WN0!t!;bp@IxxwXc-5Kmi|ZH6xQa!&z|3^^n5L(#KUbK}NHg zgkJ0`EkZBPPeX5F=(FIgBMkWCr$vf03r@bi^M?l__8L3wA>8*$?@6`-y=!oe`r}pW zl@C@eTHdTWx~Xt_Q2 zMC@pc%{BDJW?Bqn7CQr^2E5tCzeI6)NyMf1!oXz~yl}E0adyxcjyU?_!&<^+7CQm- z4yX|1AfO7+sxx3CwYSCkdD5XZYUPC_^{BTo(H3Gg;DZj*0S>XC19B0p9!xw6(4)aQ zuOl)A01OxK5y0Q$4&*weWY$?3x)9K>EU3&Zc(V`?C@}NTBV6Px`oKk2&$PrzxLBbk zXOe&&RuDb&V;e}SPlZ_r@6)5%yRDf(GrAZMq{FkA$-a`BMHO6hw5F;+Z2|;p(}UFc zUX{=FK_$FLX^{8W(L9Mb9Kf9hF6^WL7iYPQ6Oim!WWi~zWMb2J;CgDw#QQ@>utT6r zc2Zva^rwz8|Eo#_>UKVp+B+SZM9iRK)J_UeQQlI?f>ZW1m_u2<`q)y5r+s{5zXinD z76Ga3+DFlP&tWJD;Cdy1Z8ANQ-~>cyaB`Dqg=FbdReH>n`-R3>J7A6>Qezwms(bw0 zqX#>C#}3ZT=+I@oT14yZB7*l2Pu&P-mFOHGgEs+Woars)iv5~~$^{1Gh=750V$bnP zmJQHA4*^a2FnAW+n17eQ&$7lzBQbXXz}TQm2I#5Ad$P4Xc9Ji(gM|(KOT7=kTB^I; z3CrWd1d2MFL)qf0t-8LZ`OA7tohwxbF{L2Kg!oJ3u?h+r~e#)8IkBN-MT#4$i1T%Y!MksUV=u%s?vOlD#dF1G`P z#Q)`fpoTx!0@P4=K<)Nl{dN$vTNa$u5=W?6Dp_R}B2>U5i;b>nO$4qMK(P8eNNu#< zQ!6FLaify&Ml0X4SDgiK=2Zg)ylV6auR4pq;8pXvKET6N0GHla0SM&iL7Ka)S6ER2 z(-l@!1G=oh1(y}L$}Vdb{7AU0=m>5M=n|JT^;EOq1AD5#Hfl8vIxl;wS#a&CX6aiB zPZfyase;s@Jyl?Z>j|veNR604Ch=6W;MN_@(xo!J8&L|#{PKg#0t|2((P91J9W=wd zMl-U)!Qq`OZFVk~s(Pnm;f})lN1wb;rP8s#Uwfk?_J?!lTQ=Kqfb+lEjstDwHaOp+ z1H+!vJ8`+Lw%sETyxMjzn}Sv1cV@xa_P1K7!lVTzs%lqZgw~U~Wbr{br&}Wo;c(Dt zY*3O(&Vuu}MbRDLFutBtJ-&x(qq}~_cZ(G;&M$4T0zReL_@+sjo?=V}`C7HsueCI| zeIP%`FqBzvniI+K2%qdl6J%S^10MpBq(&Ae0jSxLT&;reFi-(nwGh9{JF7jz@O}pB zy;evt;qSFVA`RDIA&xF_JanBU3GwE2mZWk#lm!psA#*=x`L5}?9Uo0^=uDBLB4-Ev zPAE_!J^}@ZkFwqQ_-LtxalI7=G}ZN17*10qoAFt2_J(D!U<2xX2Ch)vR1yg>y)S+ zV8abk(CXfPNH)o`;CjO-OP}2^Dpdtp42&5}E$E@vnWT5KLAlWm3J~9D2gP0d@{B^i zX2G!oou7$lfn|sec&Ukc&7w43(jk)`r5TIm3i}-37}mPnWVr|8n=JQb>yicUZC%g= z)&)I;)+LLR0fyymo8oO-#9MND<53= z3p&;f19OL|ss56Fq0GJA8G+&))t3~)I-kZ z^zz~lUtRpt%k=*2;@4iI_h(1!yFwdwb`I=pPqiQH%#194^UDVM$+w?)jzHbltm(np z!#{a(>#7m_@8Ix18Jp5MFo(b4uyXR3Yai1}ll ziK)2sA^3i$8jmU)b$_ z`t8p>_2!R%w)oX&=^NdP-+p{#+r7I-etTqY!}h!9X6$3UZ@m8Xk&GuGKK1E0pZ>JxdvbOT6o+^m>FP(r!=)ozEV=GuMDn;8=G!TDwj5^y zgOzq7B~`T{A*oz!coTn;Gr~1{n1Q{IQMgktVIXq=c8D(&?uzUt=s0z*Xin3m$WtrLP}O?}|Cay?M+IT)}6f-h8Pg zZ-N0gI0tUZ6j-M;dF3q&&imm*tu|mCwI&Qiurp{p<0P+_1*dExt+p(ETotZ10BL!0 zHnMIGj>jW|EC0ZRR|Yr}XGW%{- ziw^xu3-McwS@6qs|t{5N|u-W<=V6mYCTyaMS zw@?R0<0Pgn3(gx~5y4xm1_M3#>4^)ntl8puyHtt+9b(TG9lEqmV!pHBZ25*#48V%ZkRXCL)AQy# z3x16;-&y*o%B?d1UmYi?FO;7B_;HGD=xl(*YF39x(2XcMDVK{EJviRA&!SD_{IJj_!95pW7 zxg2#8Wn{r=Cx8bhKF!@T=19(Z0yB;qf)M9d&hc|Y;g&=eoc&6eeRr-p3wSvJ%Dm6A zL;$iwF!cP#4L67wSK!Jb&Vob4@ln)dI-)V8h`#6wyW=*C-Q00^a}BCCXgusB%iex- z+AYcFWx=7t8%?rA!2>fC1uoRNNtXDQS#a8Vl1bL+a9FYr2JGvs^#n0Ig(JO)gECq0 zp^x(cD~|Jl2zQ*%uYXO12B%PfBB?BW93}WSiU6X;PyT|NodCcL1T_pW>*A%d9q7L){t8o6NKY4Uo3B|aIiMC9)}@sHmJhZW9}D|xIPVC@1-EN>x(txz0xqP{ zfQz@{jmVSblLaRyD0Ba{r<<7=T_A>o1Uh)vAa8WD;O=mK?b}RfjwAT!jgp5nTv^PV zS9C|*0ingu5Oo9TA7Q{i;+_sL;hqi$DFX~7aA6>U%ME0*L6QYG8S~!pLbFjtFZ!;M z8&#hqz%t5$^HMRBAaMh;;8zhiVvX1hjCH18Sh{~q3&`*~LTGYdepU@6gd43t39Q?N ztHhN9R~r2NW^STN(??Z-E0>kYJ=B?-zJSn^jv<=H+C1l}2^r@C6u}ycy?A*-6)PwpqE^fu3A6(8k zg-ACOd+k}G;33E?I2$%QvD4cW$xr|T(&*@r1FB|I7iccFQx|AB&@y!U08!Je!LK0j zcqI-*#U@1sXLJn}iCX}oH8_V(L#<+9y+sjmn-Gz#;w<=mW))}YqpIMF1VHqBxj$^3 zR1F=9;T8)J;}(lchxoCE?aG3im}Gip@6_IXt!I1dVYi3VrdVDB&`TodAOO=ixmf@(ys+I2+xS<~UjM?88+m;J(W9 zZ(NReoyIICQ3lZAmJrafD>~F}5wOCS0oJlFlLcpArq#;Q*N2-EGoFN+8Wrf)rZbEOXpsXz-DB@ zZ%{r>mcAPaqnTvCq4dmBJj0J(@J=4+exJ~tSeYz1r^JS`GQfJTwK5=r6u%w0#L8sB zJK@aN?5HX|-c%L1kwC1c_dcS-xsiZ?VgjWMk!omjk>&V%=l9Hx&rBS2U!WSz=+OW5 zg~%1!tn`(?Z`WNuJ2^4lSty;2Ks#)+qaAx(VIZAFPTDJ{-A(Ex-047LC@J*7i6_zS zS?mn(Ynrk6(Ac`Ch~H-G>uMzt+=g>Wdp}QM!Ls0I5EX9m&@fCniuP{|ULr?Zc#-Ie z(ygRevuLTRch(d+CuG$;LY-AxqKEUgC{vHCd~E9DtlFRt=b;0n9??NL^_T^BsYjA2 z0ANgkj{q8F2%$wURxb+CK^eu%)0K`z4 zV7%-RWWkS^M}Xd-@=6JPJOXrH_6V}z+9Sx)*M~NL2w3m1RvlP(5mqyM6RVyD{|83xX6aK^dWfkiu;j451z~ zyZDP@!1^)aTdf{OT4<{cIoO+DM`*O^@!NK2gtHfD#3_)_1ZOdm0w!IGDlmffRHf`w z62c|%4OB9O3YE<3#u$0OT?9B7Hs75#Z2!0Rih5t$Mb}w@;&AkJR-k-WcBu>-IzZ+O z9k}iIWK$pu&S&$*69NGI2;d`tBWu`je-u*y_kjmDY(NLY7F=i^D%1s5c#*(b4t2BO zY`xqSXH6ehH9P^7M3d+fTEpL~E`+*S@FQl}&>I#gh$|bmEcn2N4cK7V(0SRgWx=&! z%hI-62!;)fV#AijYz-T#zzEtmH*8SJ8>~wLl}xAWV#5YF7&hOXHf&4uvgS=HV#CF8 z*4RsB*w6tYHgrJ3v#KmHY+3LyVgmqlF7PoxL@?=K6HUebXX0-FAzs!5!u2vNq~!sC zmo+`Wku{~;?7(2s;R5;KrWEKPHlQ0iMg&%vQeZ8c(kwXJ%T_B(A6E@)N`V-93M7_e z#4Pv`Go|PadKSc$O=%W+LUJLTMAPO#4x2Gb!bxxtT3g(S~jIw zaBDBK^r+(#MPF0P!L^D94Lg z@GxEk0OCd9V}L=;DiB_2y&WLj6pSJO*2e%x)~xPO6Ml!E@PnmZfevOB=!Q0{z={pGFsncevkFp&Hmkr2vkI(bvzi6Bwlhngs?tMDRe@PWYduAkSp@{lDkxnFv-&=z zW!~qtOfR#FMlh>r6r0s7=Dy4-T0*G+eP~v*sB6tC)Huv)fL58+3A$Zj4qjAuxqZ*- z9{MM}ZiVw0k)g@G1bdqmD^3#K=EU0IR>tU%Tfw)hk-goLP~Hm8g1fEYKl>~_oK)Nj zMq8LJ`*h8Qj+8zQcrY^9S?O_(2jb5vjrH`wI zwTD0qWdjn+_Am>6#Oxt@gR%s1WqX(fAJ`rO8|)!EFWbW`xVDE``uebk%?^E_7Z^v- zT|S(Y1;3k?wybt3gR`s7fM&r-jL8!Sejgi6ka0#2oN<=? zK^7+g^nS7i!oxrXXqBULTJ813IHJxuI(J(k!4uzOgd74?VYT}zeP|&*q}?;g z#&5c+gce2PhT19z){AY923@n8l0O5M z1*aDkNX}XM+-nT}R0rU&%KUg}b@+}YS!KJ`D%(BSDyzG~)l55nz>7My3+@YivH`a(POpyU!6dVl6sQ=-AiXXIOCSt{9|#4R%W>i#|LiP?_4x&&$0CZ?zKjj#Kx>=1k0XJtpqqPu*&Jx{3lf*N2DL3$W@ z;lxu5jo?9QW2;yB8AG!sam@36OAs*KZwYdrQ|dV}k`p1og}0`G>m(VDWE(XLP6mYH zoSywAsuPIdO`%^3n5+g!CS(?zH&fklH$Z5iFhshQ(Tvg$DrtYvO4~)|o>B}>798d( zR`;=r_9Kni4`eW8=-X*ue_dkAB|p@mZ#0LRMRQWKG#j&+Sp$nRljVZ}8m9t2qy+dO zE5NmcX|U8d&|x_O-O#B3U_~kbSj(w^EVxYtWa(RqQ~(geUW3GPDj*Ba19(L4DWNyS zdLXWx3dn-9>IQMmmME|x6@bpmsemlFP6cG?>mwCVyP|;@;W9|wL5vR-&I9Xh)~EvO zorEt~D9^j6AMCF^KudnuDj2xo zAGQjnE}Tar7$7u?!}%;`is(pzq6&9N3U&CZgvYMGDly+(GrOO@ys&p{@AUZCfzDie;S&qpwO4J~wE4H?3~^^Prp?BTImbj zQ^#kf3G9IRF@UZf`Z75^ll&hGc%sEeo$jCBJ4;=Rnu-Sq@ml}Ei4E<^$?5Th?wa7I zeKVa7Q5pO))0yqeEp$%~ei}!^Q-a@SI{5Ll;K#AC&J?+cV`B^5Q}xe}Ow94GA+Tvb zwr76dLdP(~)UG5kYwmK!*B}=CPxLvBh3@ITJT^wZOw7@TGN@?) zXU0as(JvXegVQ9ZH6GviWT!o|&^^WfGB!rd%uuNxr#g@DNOh`9FJnHtCywo=F|Y$M zv3H?eU2lFL?XDUlb~ntE;0doSOin+{g*B#TynS$Du01*NaT>c5%`dYLw-1iDDJB3o z(M@w5m0YoJdXfhI1Oq%V3)E5saw)ba5AJV!;Jp(MPLKqB?bQ4MUz|PIrYn@bc6NMX z!WTh@VBq8clCmhS{k9JR_d3-m0A4L|=2~xHz$5q>9)2VI>+TAvQfr0d0icXnKUn~$cD$Sp;A=8r=d*L|xml}(JmRtO>G>&| mB&?e3ud|)WePiSMJ49%wdVD>P_8@c#jQMV7t* literal 0 HcmV?d00001 diff --git a/Test/FakeDuckTest/output/bbdf3bbd4c3bc28c.deps.json b/Test/FakeDuckTest/output/bbdf3bbd4c3bc28c.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/bbdf3bbd4c3bc28c.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/c9f4be41ca1cc2b4.deps.json b/Test/FakeDuckTest/output/c9f4be41ca1cc2b4.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/c9f4be41ca1cc2b4.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/f2ecbf8ced20575c.deps.json b/Test/FakeDuckTest/output/f2ecbf8ced20575c.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/f2ecbf8ced20575c.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/f3560b99de458aec.deps.json b/Test/FakeDuckTest/output/f3560b99de458aec.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/f3560b99de458aec.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/output/f6b51804a0ba8ff0.deps.json b/Test/FakeDuckTest/output/f6b51804a0ba8ff0.deps.json new file mode 100644 index 0000000..f5392b8 --- /dev/null +++ b/Test/FakeDuckTest/output/f6b51804a0ba8ff0.deps.json @@ -0,0 +1 @@ +{"w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "main": "48352329f97d0858", "_withcontent": "5b2e220c5bae60c9", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/Test/FakeDuckTest/temp/dd3002730623424b.pyi b/Test/FakeDuckTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/FakeDuckTest/temp/dd3002730623424b.pyi rename to Test/FakeDuckTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/FakeDuckTest/temp/9474791561654346.pyi b/Test/FakeDuckTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/FakeDuckTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/FakeDuckTest/temp/_phase1_manifest.json b/Test/FakeDuckTest/temp/_phase1_manifest.json index 6157aa9..4c7becd 100644 --- a/Test/FakeDuckTest/temp/_phase1_manifest.json +++ b/Test/FakeDuckTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\FakeDuckTest\\App\\main.py": {"sha1": "48352329f97d0858", "mtime": 1782827899.6785, "size": 12227}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_fakeduck.py": {"sha1": "79b337e5ea8951e2", "mtime": 1782826620.7129657, "size": 9717}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_list.py": {"sha1": "f2ecbf8ced20575c", "mtime": 1784203829.5212443, "size": 3277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_withcontent.py": {"sha1": "5b2e220c5bae60c9", "mtime": 1782475015.06193, "size": 2039}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32process.py": {"sha1": "067c78e9f121dce3", "mtime": 1781200703.5409546, "size": 4802}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\FakeDuckTest\\App\\main.py": {"sha1": "48352329f97d0858", "mtime": 1782827899.6785, "size": 12227}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_fakeduck.py": {"sha1": "79b337e5ea8951e2", "mtime": 1782826620.7129657, "size": 9717}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_list.py": {"sha1": "f2ecbf8ced20575c", "mtime": 1784203829.5212443, "size": 3277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_withcontent.py": {"sha1": "5b2e220c5bae60c9", "mtime": 1782475015.06193, "size": 2039}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32process.py": {"sha1": "067c78e9f121dce3", "mtime": 1781200703.5409546, "size": 4802}} \ No newline at end of file diff --git a/Test/FakeDuckTest/temp/_sha1_map.txt b/Test/FakeDuckTest/temp/_sha1_map.txt index c1be7c3..84afdad 100644 --- a/Test/FakeDuckTest/temp/_sha1_map.txt +++ b/Test/FakeDuckTest/temp/_sha1_map.txt @@ -1,4 +1,5 @@ 067c78e9f121dce3:includes/w32\win32process.py +14d33679f7fadf1f:includes/testcheck.py 271ea3decb810db2:includes/atom.py 48352329f97d0858:main.py 5b2e220c5bae60c9:includes/_withcontent.py @@ -6,10 +7,9 @@ 79b337e5ea8951e2:includes/_fakeduck.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py -ee084e9fc6ee413a:includes/memhub.py f2ecbf8ced20575c:includes/_list.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/FakeDuckTest/temp/ab6e54ba9a669f76.pyi b/Test/FakeDuckTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/FakeDuckTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/FakeDuckTest/temp/ee084e9fc6ee413a.pyi b/Test/FakeDuckTest/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/FakeDuckTest/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/FakeDuckTest/temp/f3560b99de458aec.pyi b/Test/FakeDuckTest/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/FakeDuckTest/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/ForAndLoopTest/output/6deb1a24b47f47fc.deps.json b/Test/ForAndLoopTest/output/6deb1a24b47f47fc.deps.json index 4e6ab8b..e9f75f1 100644 --- a/Test/ForAndLoopTest/output/6deb1a24b47f47fc.deps.json +++ b/Test/ForAndLoopTest/output/6deb1a24b47f47fc.deps.json @@ -1 +1 @@ -{"atom": "271ea3decb810db2", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "_list": "f2ecbf8ced20575c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "stdio": "6f62fe05c5ea1ceb", "_fakeduck": "79b337e5ea8951e2", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ForAndLoopTest/temp/dd3002730623424b.pyi b/Test/ForAndLoopTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/ForAndLoopTest/temp/dd3002730623424b.pyi rename to Test/ForAndLoopTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/ForAndLoopTest/temp/9474791561654346.pyi b/Test/ForAndLoopTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/ForAndLoopTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/ForAndLoopTest/temp/_phase1_manifest.json b/Test/ForAndLoopTest/temp/_phase1_manifest.json index 1b29052..79bf4c2 100644 --- a/Test/ForAndLoopTest/temp/_phase1_manifest.json +++ b/Test/ForAndLoopTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ForAndLoopTest\\App\\main.py": {"sha1": "6deb1a24b47f47fc", "mtime": 1782827984.6760156, "size": 4951}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_fakeduck.py": {"sha1": "79b337e5ea8951e2", "mtime": 1782826620.7129657, "size": 9717}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_list.py": {"sha1": "f2ecbf8ced20575c", "mtime": 1784203829.5212443, "size": 3277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ForAndLoopTest\\App\\main.py": {"sha1": "6deb1a24b47f47fc", "mtime": 1782827984.6760156, "size": 4951}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_fakeduck.py": {"sha1": "79b337e5ea8951e2", "mtime": 1782826620.7129657, "size": 9717}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_list.py": {"sha1": "f2ecbf8ced20575c", "mtime": 1784203829.5212443, "size": 3277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/ForAndLoopTest/temp/_sha1_map.txt b/Test/ForAndLoopTest/temp/_sha1_map.txt index dedebc9..27b601e 100644 --- a/Test/ForAndLoopTest/temp/_sha1_map.txt +++ b/Test/ForAndLoopTest/temp/_sha1_map.txt @@ -1,13 +1,13 @@ +14d33679f7fadf1f:includes/testcheck.py 271ea3decb810db2:includes/atom.py 6deb1a24b47f47fc:main.py 6f62fe05c5ea1ceb:includes/stdio.py 79b337e5ea8951e2:includes/_fakeduck.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py -ee084e9fc6ee413a:includes/memhub.py f2ecbf8ced20575c:includes/_list.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/ForAndLoopTest/temp/ab6e54ba9a669f76.pyi b/Test/ForAndLoopTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/ForAndLoopTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/ForAndLoopTest/temp/ee084e9fc6ee413a.pyi b/Test/ForAndLoopTest/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/ForAndLoopTest/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/ForAndLoopTest/temp/f3560b99de458aec.pyi b/Test/ForAndLoopTest/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/ForAndLoopTest/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/FormatStringTest/output/cdff0d7b58fc935b.deps.json b/Test/FormatStringTest/output/cdff0d7b58fc935b.deps.json index 7701fda..4ad59df 100644 --- a/Test/FormatStringTest/output/cdff0d7b58fc935b.deps.json +++ b/Test/FormatStringTest/output/cdff0d7b58fc935b.deps.json @@ -1 +1 @@ -{"ctraits": "42ced27d9e76aef5", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "ctraits": "42ced27d9e76aef5", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/FormatStringTest/temp/dd3002730623424b.pyi b/Test/FormatStringTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/FormatStringTest/temp/dd3002730623424b.pyi rename to Test/FormatStringTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/FormatStringTest/temp/_phase1_manifest.json b/Test/FormatStringTest/temp/_phase1_manifest.json index 2b5f3ae..923c478 100644 --- a/Test/FormatStringTest/temp/_phase1_manifest.json +++ b/Test/FormatStringTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\FormatStringTest\\App\\main.py": {"sha1": "cdff0d7b58fc935b", "mtime": 1782266179.3674748, "size": 1498}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ctraits.pyi": {"sha1": "42ced27d9e76aef5", "mtime": 1782216490.489452, "size": 572}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\FormatStringTest\\App\\main.py": {"sha1": "cdff0d7b58fc935b", "mtime": 1782266179.3674748, "size": 1498}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ctraits.pyi": {"sha1": "42ced27d9e76aef5", "mtime": 1782216490.489452, "size": 572}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/FormatStringTest/temp/_sha1_map.txt b/Test/FormatStringTest/temp/_sha1_map.txt index 3fb222c..e2df7c4 100644 --- a/Test/FormatStringTest/temp/_sha1_map.txt +++ b/Test/FormatStringTest/temp/_sha1_map.txt @@ -1,7 +1,7 @@ +14d33679f7fadf1f:includes/testcheck.py 42ced27d9e76aef5:includes/ctraits.pyi 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py bbdf3bbd4c3bc28c:includes/w32\win32console.py cdff0d7b58fc935b:main.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/FuncTest/output/067f811511854c88.deps.json b/Test/FuncTest/output/067f811511854c88.deps.json index 92c368b..a37be66 100644 --- a/Test/FuncTest/output/067f811511854c88.deps.json +++ b/Test/FuncTest/output/067f811511854c88.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/FuncTest/temp/dd3002730623424b.pyi b/Test/FuncTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/FuncTest/temp/dd3002730623424b.pyi rename to Test/FuncTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/FuncTest/temp/_phase1_manifest.json b/Test/FuncTest/temp/_phase1_manifest.json index e7b1669..a5c192b 100644 --- a/Test/FuncTest/temp/_phase1_manifest.json +++ b/Test/FuncTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\FuncTest\\App\\main.py": {"sha1": "067f811511854c88", "mtime": 1784309886.7278845, "size": 3098}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\FuncTest\\App\\main.py": {"sha1": "067f811511854c88", "mtime": 1784309886.7278845, "size": 3098}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file diff --git a/Test/FuncTest/temp/_sha1_map.txt b/Test/FuncTest/temp/_sha1_map.txt index 35cdb6f..92bd903 100644 --- a/Test/FuncTest/temp/_sha1_map.txt +++ b/Test/FuncTest/temp/_sha1_map.txt @@ -1,7 +1,7 @@ 067f811511854c88:main.py +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 72e2d5ccb7cedcf1:includes/w32\win32memory.py 7e529fe7a078cfef:includes/w32\win32base.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/GenericTest/output/16e1f65b154831e8.deps.json b/Test/GenericTest/output/16e1f65b154831e8.deps.json index f02d7ee..2a27f59 100644 --- a/Test/GenericTest/output/16e1f65b154831e8.deps.json +++ b/Test/GenericTest/output/16e1f65b154831e8.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/GenericTest/temp/dd3002730623424b.pyi b/Test/GenericTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/GenericTest/temp/dd3002730623424b.pyi rename to Test/GenericTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/GenericTest/temp/_phase1_manifest.json b/Test/GenericTest/temp/_phase1_manifest.json index 63ba4f7..216e39a 100644 --- a/Test/GenericTest/temp/_phase1_manifest.json +++ b/Test/GenericTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\GenericTest\\App\\main.py": {"sha1": "16e1f65b154831e8", "mtime": 1782266275.0221426, "size": 5369}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\GenericTest\\App\\main.py": {"sha1": "16e1f65b154831e8", "mtime": 1782266275.0221426, "size": 5369}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/GenericTest/temp/_sha1_map.txt b/Test/GenericTest/temp/_sha1_map.txt index 3449281..9160313 100644 --- a/Test/GenericTest/temp/_sha1_map.txt +++ b/Test/GenericTest/temp/_sha1_map.txt @@ -1,6 +1,6 @@ +14d33679f7fadf1f:includes/testcheck.py 16e1f65b154831e8:main.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/GenericTest2/output/bdfc8bd243b7e5b7.deps.json b/Test/GenericTest2/output/bdfc8bd243b7e5b7.deps.json index f02d7ee..2a27f59 100644 --- a/Test/GenericTest2/output/bdfc8bd243b7e5b7.deps.json +++ b/Test/GenericTest2/output/bdfc8bd243b7e5b7.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/GenericTest2/temp/dd3002730623424b.pyi b/Test/GenericTest2/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/GenericTest2/temp/dd3002730623424b.pyi rename to Test/GenericTest2/temp/14d33679f7fadf1f.pyi diff --git a/Test/GenericTest2/temp/_phase1_manifest.json b/Test/GenericTest2/temp/_phase1_manifest.json index afb8eaf..b6046b7 100644 --- a/Test/GenericTest2/temp/_phase1_manifest.json +++ b/Test/GenericTest2/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\GenericTest2\\App\\main.py": {"sha1": "bdfc8bd243b7e5b7", "mtime": 1782479447.3739374, "size": 8453}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\GenericTest2\\App\\main.py": {"sha1": "bdfc8bd243b7e5b7", "mtime": 1782479447.3739374, "size": 8453}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/GenericTest2/temp/_sha1_map.txt b/Test/GenericTest2/temp/_sha1_map.txt index 479fc36..a83ff75 100644 --- a/Test/GenericTest2/temp/_sha1_map.txt +++ b/Test/GenericTest2/temp/_sha1_map.txt @@ -1,6 +1,6 @@ +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py bbdf3bbd4c3bc28c:includes/w32\win32console.py bdfc8bd243b7e5b7:main.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/HashTableTest/output/02d833b3cf571c5b.deps.json b/Test/HashTableTest/output/02d833b3cf571c5b.deps.json index f1d4415..155b9bf 100644 --- a/Test/HashTableTest/output/02d833b3cf571c5b.deps.json +++ b/Test/HashTableTest/output/02d833b3cf571c5b.deps.json @@ -1 +1 @@ -{"atom": "271ea3decb810db2", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "hashtable": "b8c66c8ff44eb874", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "hashtable": "b8c66c8ff44eb874", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/HashTableTest/temp/dd3002730623424b.pyi b/Test/HashTableTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/HashTableTest/temp/dd3002730623424b.pyi rename to Test/HashTableTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/HashTableTest/temp/9474791561654346.pyi b/Test/HashTableTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/HashTableTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/HashTableTest/temp/_phase1_manifest.json b/Test/HashTableTest/temp/_phase1_manifest.json index 4c20a5f..f926441 100644 --- a/Test/HashTableTest/temp/_phase1_manifest.json +++ b/Test/HashTableTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\HashTableTest\\App\\main.py": {"sha1": "02d833b3cf571c5b", "mtime": 1782828002.1143503, "size": 7795}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hashtable.py": {"sha1": "b8c66c8ff44eb874", "mtime": 1782826619.490043, "size": 9385}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\HashTableTest\\App\\main.py": {"sha1": "02d833b3cf571c5b", "mtime": 1782828002.1143503, "size": 7795}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hashtable.py": {"sha1": "b8c66c8ff44eb874", "mtime": 1782826619.490043, "size": 9385}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/HashTableTest/temp/_sha1_map.txt b/Test/HashTableTest/temp/_sha1_map.txt index cde28e2..8f88461 100644 --- a/Test/HashTableTest/temp/_sha1_map.txt +++ b/Test/HashTableTest/temp/_sha1_map.txt @@ -1,12 +1,12 @@ 02d833b3cf571c5b:main.py +14d33679f7fadf1f:includes/testcheck.py 271ea3decb810db2:includes/atom.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py b8c66c8ff44eb874:includes/hashtable.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py -ee084e9fc6ee413a:includes/memhub.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/HashTableTest/temp/ab6e54ba9a669f76.pyi b/Test/HashTableTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/HashTableTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/HashTableTest/temp/ee084e9fc6ee413a.pyi b/Test/HashTableTest/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/HashTableTest/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/HashTableTest/temp/f3560b99de458aec.pyi b/Test/HashTableTest/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/HashTableTest/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/IterTest/output/6b8853854d6ef556.deps.json b/Test/IterTest/output/6b8853854d6ef556.deps.json index 9da11e2..48c6c93 100644 --- a/Test/IterTest/output/6b8853854d6ef556.deps.json +++ b/Test/IterTest/output/6b8853854d6ef556.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/IterTest/temp/dd3002730623424b.pyi b/Test/IterTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/IterTest/temp/dd3002730623424b.pyi rename to Test/IterTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/IterTest/temp/9474791561654346.pyi b/Test/IterTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/IterTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/IterTest/temp/_phase1_manifest.json b/Test/IterTest/temp/_phase1_manifest.json index 7dc1091..4510ecc 100644 --- a/Test/IterTest/temp/_phase1_manifest.json +++ b/Test/IterTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\IterTest\\App\\main.py": {"sha1": "6b8853854d6ef556", "mtime": 1782474645.4172094, "size": 1600}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\IterTest\\App\\main.py": {"sha1": "6b8853854d6ef556", "mtime": 1782474645.4172094, "size": 1600}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file diff --git a/Test/IterTest/temp/_sha1_map.txt b/Test/IterTest/temp/_sha1_map.txt index 53a3934..ff122d0 100644 --- a/Test/IterTest/temp/_sha1_map.txt +++ b/Test/IterTest/temp/_sha1_map.txt @@ -1,8 +1,8 @@ +14d33679f7fadf1f:includes/testcheck.py 6b8853854d6ef556:main.py 6f62fe05c5ea1ceb:includes/stdio.py 72e2d5ccb7cedcf1:includes/w32\win32memory.py 7e529fe7a078cfef:includes/w32\win32base.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/IterTest/temp/ab6e54ba9a669f76.pyi b/Test/IterTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/IterTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/JsonTest/output/8a97754e9e3c2b9a.deps.json b/Test/JsonTest/output/8a97754e9e3c2b9a.deps.json index 76cbe79..4a3aa43 100644 --- a/Test/JsonTest/output/8a97754e9e3c2b9a.deps.json +++ b/Test/JsonTest/output/8a97754e9e3c2b9a.deps.json @@ -1 +1 @@ -{"json.__writer": "20cd49775c100a38", "__writer": "20cd49775c100a38", "json.__parser": "240a9a4157959a9f", "__parser": "240a9a4157959a9f", "atom": "271ea3decb810db2", "json.__init__": "57288496f7c2d1ad", "__init__": "57288496f7c2d1ad", "json": "57288496f7c2d1ad", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "json.__writer": "20cd49775c100a38", "__writer": "20cd49775c100a38", "json.__parser": "240a9a4157959a9f", "__parser": "240a9a4157959a9f", "atom": "271ea3decb810db2", "json.__init__": "57288496f7c2d1ad", "__init__": "57288496f7c2d1ad", "json": "57288496f7c2d1ad", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/JsonTest/temp/dd3002730623424b.pyi b/Test/JsonTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/JsonTest/temp/dd3002730623424b.pyi rename to Test/JsonTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/JsonTest/temp/9474791561654346.pyi b/Test/JsonTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/JsonTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/JsonTest/temp/_phase1_manifest.json b/Test/JsonTest/temp/_phase1_manifest.json index 97bdd03..0da9c12 100644 --- a/Test/JsonTest/temp/_phase1_manifest.json +++ b/Test/JsonTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\JsonTest\\App\\main.py": {"sha1": "8a97754e9e3c2b9a", "mtime": 1782828053.1672907, "size": 14025}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\json\\__init__.py": {"sha1": "57288496f7c2d1ad", "mtime": 1783239811.8873823, "size": 7653}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\json\\__parser.py": {"sha1": "240a9a4157959a9f", "mtime": 1782826918.100951, "size": 7517}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\json\\__writer.py": {"sha1": "20cd49775c100a38", "mtime": 1782826901.8906734, "size": 3784}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\JsonTest\\App\\main.py": {"sha1": "8a97754e9e3c2b9a", "mtime": 1782828053.1672907, "size": 14025}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\json\\__init__.py": {"sha1": "57288496f7c2d1ad", "mtime": 1783239811.8873823, "size": 7653}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\json\\__parser.py": {"sha1": "240a9a4157959a9f", "mtime": 1782826918.100951, "size": 7517}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\json\\__writer.py": {"sha1": "20cd49775c100a38", "mtime": 1782826901.8906734, "size": 3784}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file diff --git a/Test/JsonTest/temp/_sha1_map.txt b/Test/JsonTest/temp/_sha1_map.txt index 9621830..d5cd47c 100644 --- a/Test/JsonTest/temp/_sha1_map.txt +++ b/Test/JsonTest/temp/_sha1_map.txt @@ -1,3 +1,4 @@ +14d33679f7fadf1f:includes/testcheck.py 20cd49775c100a38:includes/json\__writer.py 240a9a4157959a9f:includes/json\__parser.py 271ea3decb810db2:includes/atom.py @@ -6,9 +7,8 @@ 72e2d5ccb7cedcf1:includes/w32\win32memory.py 7e529fe7a078cfef:includes/w32\win32base.py 8a97754e9e3c2b9a:main.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py -ee084e9fc6ee413a:includes/memhub.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/JsonTest/temp/ab6e54ba9a669f76.pyi b/Test/JsonTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/JsonTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/JsonTest/temp/ee084e9fc6ee413a.pyi b/Test/JsonTest/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/JsonTest/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/JsonTest/temp/f3560b99de458aec.pyi b/Test/JsonTest/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/JsonTest/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/LLvmLiteTest/App/main.py b/Test/LLvmLiteTest/App/main.py index 274172a..9395df2 100644 --- a/Test/LLvmLiteTest/App/main.py +++ b/Test/LLvmLiteTest/App/main.py @@ -97,36 +97,50 @@ def test_build_add(pool: memhub.MemPool | t.CPtr): core: llvmlite.LLVMTypeCore | t.CPtr = llvmlite.LLVMTypeCore(pool) mcore: llvmlite.LLVMModuleCore | t.CPtr = llvmlite.LLVMModuleCore(pool) ty_i32: llvmlite.LLVMType | t.CPtr = core.Int32() + testcheck.info("DBG: step1 core/ty_i32 ok") # 创建模块 + 函数 mod: llvmlite.Module | t.CPtr = mcore.NewModule("test_add") + testcheck.info("DBG: step2 NewModule ok") func: llvmlite.Function | t.CPtr = mcore.CreateFunction(mod, "add", ty_i32) + testcheck.info("DBG: step3 CreateFunction ok") # 添加参数 mcore.AddParam(func, ty_i32, "%a") + testcheck.info("DBG: step4 AddParam a ok") mcore.AddParam(func, ty_i32, "%b") + testcheck.info("DBG: step5 AddParam b ok") # 创建 entry 块 entry: llvmlite.BasicBlock | t.CPtr = mcore.CreateBlock(func, "entry") + testcheck.info("DBG: step6 CreateBlock ok") # 创建 builder builder: llvmlite.IRBuilder | t.CPtr = mcore.NewBuilder(func) + testcheck.info("DBG: step7 NewBuilder ok") llvmlite.position_at_end(builder, entry) + testcheck.info("DBG: step8 position_at_end ok") # 为参数创建 Value 包装 v_a: llvmlite.Value | t.CPtr = mcore.SSAValue(ty_i32, "%a") + testcheck.info("DBG: step9 SSAValue a ok") v_b: llvmlite.Value | t.CPtr = mcore.SSAValue(ty_i32, "%b") + testcheck.info("DBG: step10 SSAValue b ok") # %0 = add i32 %a, %b v_c: llvmlite.Value | t.CPtr = llvmlite.build_add(builder, v_a, v_b) + testcheck.info("DBG: step11 build_add ok") # ret i32 %0 llvmlite.build_ret(builder, v_c) + testcheck.info("DBG: step12 build_ret ok") # 打印函数 buf: t.CChar | t.CPtr = pool.alloc(4096) + testcheck.info("DBG: step13 pool.alloc buf ok") buf[0] = 0 mcore.PrintFunction(buf, 4096, func) + testcheck.info("DBG: step14 PrintFunction ok") testcheck.info(buf) # 验证关键内容 diff --git a/Test/LLvmLiteTest/output/3e914ffe8cc3c120.deps.json b/Test/LLvmLiteTest/output/3e914ffe8cc3c120.deps.json deleted file mode 100644 index 643b5b9..0000000 --- a/Test/LLvmLiteTest/output/3e914ffe8cc3c120.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"llvmlite.__values": "05c11f22675c60cb", "__values": "05c11f22675c60cb", "llvmlite.__module": "21a7fcfc665f75ef", "__module": "21a7fcfc665f75ef", "atom": "271ea3decb810db2", "linkedlist": "2d39c6c7d3557b3e", "llvmlite.__types": "455ff4e74c3dbfb0", "__types": "455ff4e74c3dbfb0", "llvmlite.__builder": "46ea362b72c10a9e", "__builder": "46ea362b72c10a9e", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "llvmlite.__init__": "95394ca8da0f655a", "__init__": "95394ca8da0f655a", "llvmlite": "95394ca8da0f655a", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "llvmlite.__verify": "d4117f5e00a6c3b5", "__verify": "d4117f5e00a6c3b5", "testcheck": "dd3002730623424b", "llvmlite.__function": "e0b84369e50c937c", "__function": "e0b84369e50c937c", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "main.__types": "455ff4e74c3dbfb0", "main.__function": "e0b84369e50c937c", "main.__values": "05c11f22675c60cb", "main.__module": "21a7fcfc665f75ef"} \ No newline at end of file diff --git a/Test/LLvmLiteTest/output/5b8cf12a5862b640.deps.json b/Test/LLvmLiteTest/output/5b8cf12a5862b640.deps.json new file mode 100644 index 0000000..6ad4f68 --- /dev/null +++ b/Test/LLvmLiteTest/output/5b8cf12a5862b640.deps.json @@ -0,0 +1 @@ +{"testcheck": "14d33679f7fadf1f", "llvmlite.__types": "15f1ded02f3aa5bc", "__types": "15f1ded02f3aa5bc", "llvmlite.__module": "21a7fcfc665f75ef", "__module": "21a7fcfc665f75ef", "atom": "271ea3decb810db2", "linkedlist": "2d39c6c7d3557b3e", "llvmlite.__function": "4dad2ba72ed7ba09", "__function": "4dad2ba72ed7ba09", "llvmlite.__verify": "6b3bc463fd044545", "__verify": "6b3bc463fd044545", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "llvmlite.__builder": "946e087da91aaada", "__builder": "946e087da91aaada", "string": "9474791561654346", "llvmlite.__init__": "95394ca8da0f655a", "__init__": "95394ca8da0f655a", "llvmlite": "95394ca8da0f655a", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "llvmlite.__values": "f9e36e2cd6fa659f", "__values": "f9e36e2cd6fa659f"} \ No newline at end of file diff --git a/Test/LLvmLiteTest/temp/dd3002730623424b.pyi b/Test/LLvmLiteTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/LLvmLiteTest/temp/dd3002730623424b.pyi rename to Test/LLvmLiteTest/temp/14d33679f7fadf1f.pyi diff --git a/.transpyc_cache/455ff4e74c3dbfb0.pyi b/Test/LLvmLiteTest/temp/15f1ded02f3aa5bc.pyi similarity index 99% rename from .transpyc_cache/455ff4e74c3dbfb0.pyi rename to Test/LLvmLiteTest/temp/15f1ded02f3aa5bc.pyi index 984146e..5ab4cec 100644 --- a/.transpyc_cache/455ff4e74c3dbfb0.pyi +++ b/Test/LLvmLiteTest/temp/15f1ded02f3aa5bc.pyi @@ -11,6 +11,7 @@ import string import memhub from linkedlist import GSListNode +@t.NoVTable class ParamNode(GSListNode[ParamNode]): Ty: t.CVoid | t.CPtr class LLVMType(t.REnum): diff --git a/Test/LLvmLiteTest/temp/3e914ffe8cc3c120.doc.json b/Test/LLvmLiteTest/temp/3e914ffe8cc3c120.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/Test/LLvmLiteTest/temp/3e914ffe8cc3c120.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/Test/LLvmLiteTest/temp/3e914ffe8cc3c120.pyi b/Test/LLvmLiteTest/temp/3e914ffe8cc3c120.pyi deleted file mode 100644 index c9678f0..0000000 --- a/Test/LLvmLiteTest/temp/3e914ffe8cc3c120.pyi +++ /dev/null @@ -1,72 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -import t, c -from stdint import * -import stdio -import string -import stdlib -import memhub -import testcheck -import llvmlite - -POOL_SIZE: t.CDefine = 524288 # 512KB - -def test_type_print(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_value_print(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_build_add(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_build_if_else(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_module_print(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_array_type(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_struct_type(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_func_type(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_declare(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_float_types(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_float_binops(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_bitwise_ops(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_fcmp(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_casts(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_fp_conversions(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_phi(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_switch(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_select(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_globals(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_attributes(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_atomic(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_inline_asm_unreachable(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_verify_valid(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_verify_no_terminator(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_verify_duplicate_def(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_verify_undef_use(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def test_verify_module(pool: memhub.MemPool | t.CPtr) -> t.CInt: pass - -def main() -> int: pass diff --git a/Test/LLvmLiteTest/temp/455ff4e74c3dbfb0.pyi b/Test/LLvmLiteTest/temp/455ff4e74c3dbfb0.pyi deleted file mode 100644 index 984146e..0000000 --- a/Test/LLvmLiteTest/temp/455ff4e74c3dbfb0.pyi +++ /dev/null @@ -1,120 +0,0 @@ -""" -Auto-generated Python stub file from llvmlite.__types.py -Module: llvmlite.__types -""" - - -import t, c -from stdint import * -import viperlib -import string -import memhub -from linkedlist import GSListNode - -class ParamNode(GSListNode[ParamNode]): - Ty: t.CVoid | t.CPtr -class LLVMType(t.REnum): - class Int: - Bits: t.CInt - class Ptr: - Pointee: LLVMType | t.CPtr - class Func: - Ret: LLVMType | t.CPtr - Params: ParamNode | t.CPtr - PCount: t.CInt - class Array: - ElemTy: LLVMType | t.CPtr - Count: t.CInt - class Struct: - Fields: ParamNode | t.CPtr - FCount: t.CInt - Name: t.CChar | t.CPtr - class Float: - Bits: t.CInt - class Void: - pass - class Label: - pass - class Metadata: - pass - -def _new_type(pool: memhub.MemBuddy | t.CPtr) -> LLVMType | t.CPtr: pass - -def Int1(pool: memhub.MemBuddy | t.CPtr) -> LLVMType | t.CPtr: pass - -def Int8(pool: memhub.MemBuddy | t.CPtr) -> LLVMType | t.CPtr: pass - -def Int16(pool: memhub.MemBuddy | t.CPtr) -> LLVMType | t.CPtr: pass - -def Int32(pool: memhub.MemBuddy | t.CPtr) -> LLVMType | t.CPtr: pass - -def Int64(pool: memhub.MemBuddy | t.CPtr) -> LLVMType | t.CPtr: pass - -def Ptr(pool: memhub.MemBuddy | t.CPtr, pointee: LLVMType | t.CPtr) -> LLVMType | t.CPtr: pass - -def Func(pool: memhub.MemBuddy | t.CPtr, ret: LLVMType | t.CPtr, params: ParamNode | t.CPtr, count: t.CInt) -> LLVMType | t.CPtr: pass - -def Void(pool: memhub.MemBuddy | t.CPtr) -> LLVMType | t.CPtr: pass - -def Array(pool: memhub.MemBuddy | t.CPtr, elem_ty: LLVMType | t.CPtr, count: t.CInt) -> LLVMType | t.CPtr: pass - -def Struct(pool: memhub.MemBuddy | t.CPtr, fields: ParamNode | t.CPtr, fcount: t.CInt, name: t.CChar | t.CPtr) -> LLVMType | t.CPtr: pass - -def Half(pool: memhub.MemBuddy | t.CPtr) -> LLVMType | t.CPtr: pass - -def Float(pool: memhub.MemBuddy | t.CPtr) -> LLVMType | t.CPtr: pass - -def Double(pool: memhub.MemBuddy | t.CPtr) -> LLVMType | t.CPtr: pass - -def FP128(pool: memhub.MemBuddy | t.CPtr) -> LLVMType | t.CPtr: pass - -def Label(pool: memhub.MemBuddy | t.CPtr) -> LLVMType | t.CPtr: pass - - -PNODE_SIZE: t.CDefine = 16 - -def new_param_node(pool: memhub.MemBuddy | t.CPtr, ty: LLVMType | t.CPtr) -> ParamNode | t.CPtr: pass - -def param_list_append(head: ParamNode | t.CPtr, tail: ParamNode | t.CPtr, node: ParamNode | t.CPtr) -> ParamNode | t.CPtr: pass - -def paramnode_get_ty(node: ParamNode | t.CPtr) -> LLVMType | t.CPtr: pass - -def paramnode_get_next(node: ParamNode | t.CPtr) -> ParamNode | t.CPtr: pass - -def paramnode_set_ty(node: ParamNode | t.CPtr, ty: LLVMType | t.CPtr) -> t.CInt: pass - -def paramnode_set_next(node: ParamNode | t.CPtr, nxt: ParamNode | t.CPtr) -> t.CInt: pass - - -@t.NoVTable -class LLVMTypeCore: - Pool: memhub.MemBuddy | t.CPtr - def __init__(self: LLVMTypeCore, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - def Int1(self: LLVMTypeCore) -> LLVMType | t.CPtr: pass - def Int8(self: LLVMTypeCore) -> LLVMType | t.CPtr: pass - def Int16(self: LLVMTypeCore) -> LLVMType | t.CPtr: pass - def Int32(self: LLVMTypeCore) -> LLVMType | t.CPtr: pass - def Int64(self: LLVMTypeCore) -> LLVMType | t.CPtr: pass - def Ptr(self: LLVMTypeCore, pointee: LLVMType | t.CPtr) -> LLVMType | t.CPtr: pass - def Func(self: LLVMTypeCore, ret: LLVMType | t.CPtr, params: ParamNode | t.CPtr, count: t.CInt) -> LLVMType | t.CPtr: pass - def Array(self: LLVMTypeCore, elem_ty: LLVMType | t.CPtr, count: t.CInt) -> LLVMType | t.CPtr: pass - def Struct(self: LLVMTypeCore, fields: ParamNode | t.CPtr, fcount: t.CInt, name: t.CChar | t.CPtr) -> LLVMType | t.CPtr: pass - def Void(self: LLVMTypeCore) -> LLVMType | t.CPtr: pass - def Half(self: LLVMTypeCore) -> LLVMType | t.CPtr: pass - def Float(self: LLVMTypeCore) -> LLVMType | t.CPtr: pass - def Double(self: LLVMTypeCore) -> LLVMType | t.CPtr: pass - def FP128(self: LLVMTypeCore) -> LLVMType | t.CPtr: pass - def Label(self: LLVMTypeCore) -> LLVMType | t.CPtr: pass - def NewParamNode(self: LLVMTypeCore, ty: LLVMType | t.CPtr) -> ParamNode | t.CPtr: pass - def ParamListAppend(self: LLVMTypeCore, head: ParamNode | t.CPtr, tail: ParamNode | t.CPtr, node: ParamNode | t.CPtr) -> ParamNode | t.CPtr: pass - def PrintType(self: LLVMTypeCore, buf: t.CChar | t.CPtr, size: t.CSizeT, ty: LLVMType | t.CPtr) -> t.CInt: pass - -def TypePrint(buf: t.CChar | t.CPtr, size: t.CSizeT, ty: LLVMType | t.CPtr, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - -def _strappend(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _print_struct_body(buf: t.CChar | t.CPtr, size: t.CSizeT, fields: ParamNode | t.CPtr, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - -def PrintStructDefinition(buf: t.CChar | t.CPtr, size: t.CSizeT, ty: LLVMType | t.CPtr, pool: memhub.MemBuddy | t.CPtr) -> t.CInt: pass - -def get_struct_name(ty: LLVMType | t.CPtr) -> t.CChar | t.CPtr: pass diff --git a/Test/LLvmLiteTest/temp/46ea362b72c10a9e.pyi b/Test/LLvmLiteTest/temp/46ea362b72c10a9e.pyi deleted file mode 100644 index fbd9c3b..0000000 --- a/Test/LLvmLiteTest/temp/46ea362b72c10a9e.pyi +++ /dev/null @@ -1,219 +0,0 @@ -""" -Auto-generated Python stub file from llvmlite.__builder.py -Module: llvmlite.__builder -""" - - -import t, c -from stdint import * -import string -import viperlib -import memhub -from linkedlist import GSListNode, GSList -from .__types import LLVMType, TypePrint -from .__values import Value, new_value, SSAValue -from .__function import Function, BasicBlock, block_append_text, function_move_block_to_end, _ll_name_needs_quote - -class IRBuilder: - Pool: memhub.MemBuddy | t.CPtr - Func: Function | t.CPtr - CurBlock: BasicBlock | t.CPtr - Counter: t.CInt - -BUILDER_SIZE: t.CDefine = 32 - -def new_builder(pool: memhub.MemBuddy | t.CPtr, func: Function | t.CPtr) -> IRBuilder | t.CPtr: pass - -def position_at_end(builder: IRBuilder | t.CPtr, block: BasicBlock | t.CPtr) -> t.CInt: pass - -def _alloc_ssa_name(builder: IRBuilder | t.CPtr) -> t.CChar | t.CPtr: pass - -def _type_str(builder: IRBuilder | t.CPtr, ty: LLVMType | t.CPtr) -> t.CChar | t.CPtr: pass - -def _emit(builder: IRBuilder | t.CPtr, text: t.CChar | t.CPtr) -> t.CInt: pass - -def _mark_terminated(builder: IRBuilder | t.CPtr) -> t.CInt: pass - -def builder_cur_block_is_terminated(builder: IRBuilder | t.CPtr) -> t.CInt: pass - -def build_alloca(builder: IRBuilder | t.CPtr, ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def build_load(builder: IRBuilder | t.CPtr, ty: LLVMType | t.CPtr, ptr: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_store(builder: IRBuilder | t.CPtr, val: Value | t.CPtr, ptr: Value | t.CPtr) -> t.CInt: pass - -def build_add(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_sub(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_mul(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_sdiv(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_udiv(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_srem(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_urem(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_and(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_or(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_xor(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_shl(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_lshr(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_ashr(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_fadd(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_fsub(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_fmul(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_fdiv(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_frem(builder: IRBuilder | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_fneg(builder: IRBuilder | t.CPtr, val: Value | t.CPtr) -> Value | t.CPtr: pass - -def _build_binop(builder: IRBuilder | t.CPtr, op: t.CChar | t.CPtr, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - - -ICMP_EQ: t.CDefine = 0 -ICMP_NE: t.CDefine = 1 -ICMP_SGT: t.CDefine = 2 -ICMP_SGE: t.CDefine = 3 -ICMP_SLT: t.CDefine = 4 -ICMP_SLE: t.CDefine = 5 -ICMP_UGT: t.CDefine = 6 -ICMP_UGE: t.CDefine = 7 -ICMP_ULT: t.CDefine = 8 -ICMP_ULE: t.CDefine = 9 -FCMP_FALSE: t.CDefine = 0 -FCMP_OEQ: t.CDefine = 1 -FCMP_OGT: t.CDefine = 2 -FCMP_OGE: t.CDefine = 3 -FCMP_OLT: t.CDefine = 4 -FCMP_OLE: t.CDefine = 5 -FCMP_ONE: t.CDefine = 6 -FCMP_ORD: t.CDefine = 7 -FCMP_UNO: t.CDefine = 8 -FCMP_UEQ: t.CDefine = 9 -FCMP_UGT: t.CDefine = 10 -FCMP_UGE: t.CDefine = 11 -FCMP_ULT: t.CDefine = 12 -FCMP_ULE: t.CDefine = 13 -FCMP_UNE: t.CDefine = 14 -FCMP_TRUE: t.CDefine = 15 - -def _icmp_pred_str(pred: t.CInt) -> t.CChar | t.CPtr: pass - -def _fcmp_pred_str(pred: t.CInt) -> t.CChar | t.CPtr: pass - -def build_icmp(builder: IRBuilder | t.CPtr, pred: t.CInt, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_fcmp(builder: IRBuilder | t.CPtr, pred: t.CInt, lhs: Value | t.CPtr, rhs: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_br(builder: IRBuilder | t.CPtr, target: BasicBlock | t.CPtr) -> t.CInt: pass - -def build_cond_br(builder: IRBuilder | t.CPtr, cond: Value | t.CPtr, then_blk: BasicBlock | t.CPtr, else_blk: BasicBlock | t.CPtr) -> t.CInt: pass - -def build_ret(builder: IRBuilder | t.CPtr, val: Value | t.CPtr) -> t.CInt: pass - -def build_ret_void(builder: IRBuilder | t.CPtr) -> t.CInt: pass - -def build_call(builder: IRBuilder | t.CPtr, callee: t.CChar | t.CPtr, args: Value | t.CPtr, arg_count: t.CInt, ret_ty: LLVMType | t.CPtr, is_variadic: t.CInt) -> Value | t.CPtr: pass - -def build_call_indirect(builder: IRBuilder | t.CPtr, callee_val: Value | t.CPtr, args: Value | t.CPtr, arg_count: t.CInt, ret_ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def build_bitcast(builder: IRBuilder | t.CPtr, val: Value | t.CPtr, to_ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def build_sext(builder: IRBuilder | t.CPtr, val: Value | t.CPtr, to_ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def build_trunc(builder: IRBuilder | t.CPtr, val: Value | t.CPtr, to_ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def build_zext(builder: IRBuilder | t.CPtr, val: Value | t.CPtr, to_ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def build_ptrtoint(builder: IRBuilder | t.CPtr, val: Value | t.CPtr, to_ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def build_inttoptr(builder: IRBuilder | t.CPtr, val: Value | t.CPtr, to_ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def build_fpext(builder: IRBuilder | t.CPtr, val: Value | t.CPtr, to_ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def build_fptrunc(builder: IRBuilder | t.CPtr, val: Value | t.CPtr, to_ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def build_fp2si(builder: IRBuilder | t.CPtr, val: Value | t.CPtr, to_ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def build_si2fp(builder: IRBuilder | t.CPtr, val: Value | t.CPtr, to_ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def build_fp2ui(builder: IRBuilder | t.CPtr, val: Value | t.CPtr, to_ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def build_ui2fp(builder: IRBuilder | t.CPtr, val: Value | t.CPtr, to_ty: LLVMType | t.CPtr) -> Value | t.CPtr: pass - -def build_gep(builder: IRBuilder | t.CPtr, elem_ty: LLVMType | t.CPtr, ptr: Value | t.CPtr, idx: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_gep_array(builder: IRBuilder | t.CPtr, array_ty: LLVMType | t.CPtr, elem_ty: LLVMType | t.CPtr, ptr: Value | t.CPtr, idx: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_gep_struct(builder: IRBuilder | t.CPtr, struct_ty: LLVMType | t.CPtr, field_ty: LLVMType | t.CPtr, ptr: Value | t.CPtr, field_idx: t.CInt) -> Value | t.CPtr: pass - - -class PhiIncoming(GSListNode[PhiIncoming]): - Val: Value | t.CPtr - Block: BasicBlock | t.CPtr - -PHIINC_SIZE: t.CDefine = 24 - -def new_phi_incoming(pool: memhub.MemBuddy | t.CPtr, val: Value | t.CPtr, block: BasicBlock | t.CPtr) -> PhiIncoming | t.CPtr: pass - -def build_phi(builder: IRBuilder | t.CPtr, ty: LLVMType | t.CPtr, incoming_head: PhiIncoming | t.CPtr, count: t.CInt) -> Value | t.CPtr: pass - - -class SwitchCase(GSListNode[SwitchCase]): - CaseVal: Value | t.CPtr - Block: BasicBlock | t.CPtr - -SWCASE_SIZE: t.CDefine = 24 - -def new_switch_case(pool: memhub.MemBuddy | t.CPtr, case_val: Value | t.CPtr, block: BasicBlock | t.CPtr) -> SwitchCase | t.CPtr: pass - -def build_switch(builder: IRBuilder | t.CPtr, val: Value | t.CPtr, default_blk: BasicBlock | t.CPtr, cases_head: SwitchCase | t.CPtr, case_count: t.CInt) -> t.CInt: pass - -def build_select(builder: IRBuilder | t.CPtr, cond: Value | t.CPtr, true_val: Value | t.CPtr, false_val: Value | t.CPtr) -> Value | t.CPtr: pass - -def build_unreachable(builder: IRBuilder | t.CPtr) -> t.CInt: pass - - -ATOMIC_XCHG: t.CDefine = 0 -ATOMIC_ADD: t.CDefine = 1 -ATOMIC_SUB: t.CDefine = 2 -ATOMIC_AND: t.CDefine = 3 -ATOMIC_NAND: t.CDefine = 4 -ATOMIC_OR: t.CDefine = 5 -ATOMIC_XOR: t.CDefine = 6 -ATOMIC_MAX: t.CDefine = 7 -ATOMIC_MIN: t.CDefine = 8 -ATOMIC_UMAX: t.CDefine = 9 -ATOMIC_UMIN: t.CDefine = 10 -ATOMIC_ORDER_NOTATOMIC: t.CDefine = 0 -ATOMIC_ORDER_UNORDERED: t.CDefine = 1 -ATOMIC_ORDER_MONOTONIC: t.CDefine = 2 -ATOMIC_ORDER_ACQUIRE: t.CDefine = 3 -ATOMIC_ORDER_RELEASE: t.CDefine = 4 -ATOMIC_ORDER_ACQ_REL: t.CDefine = 5 -ATOMIC_ORDER_SEQ_CST: t.CDefine = 6 - -def _atomic_op_str(op: t.CInt) -> t.CChar | t.CPtr: pass - -def _atomic_order_str(ord: t.CInt) -> t.CChar | t.CPtr: pass - -def build_atomicrmw(builder: IRBuilder | t.CPtr, op: t.CInt, ptr: Value | t.CPtr, val: Value | t.CPtr, order: t.CInt) -> Value | t.CPtr: pass - -def build_cmpxchg(builder: IRBuilder | t.CPtr, ptr: Value | t.CPtr, cmp_val: Value | t.CPtr, new_val: Value | t.CPtr, succ_order: t.CInt, fail_order: t.CInt) -> Value | t.CPtr: pass - -def build_inline_asm(builder: IRBuilder | t.CPtr, ret_ty: LLVMType | t.CPtr, asm_text: t.CChar | t.CPtr, constraints: t.CChar | t.CPtr, has_side_effects: t.CInt) -> Value | t.CPtr: pass - -def _append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass diff --git a/Test/LLvmLiteTest/temp/e0b84369e50c937c.pyi b/Test/LLvmLiteTest/temp/4dad2ba72ed7ba09.pyi similarity index 98% rename from Test/LLvmLiteTest/temp/e0b84369e50c937c.pyi rename to Test/LLvmLiteTest/temp/4dad2ba72ed7ba09.pyi index c10ea89..bc85812 100644 --- a/Test/LLvmLiteTest/temp/e0b84369e50c937c.pyi +++ b/Test/LLvmLiteTest/temp/4dad2ba72ed7ba09.pyi @@ -13,17 +13,21 @@ import stdio from linkedlist import GSListNode, GSList from .__types import LLVMType, ParamNode, TypePrint +@t.NoVTable class Line(GSListNode[Line]): Buf: t.CChar | t.CPtr Len: t.CSizeT +@t.NoVTable class BasicBlock(GSListNode[BasicBlock]): Name: t.CChar | t.CPtr Lines: GSList[Line] | t.CPtr IsTerminated: t.CInt +@t.NoVTable class Param(GSListNode[Param]): Ty: LLVMType | t.CPtr Name: t.CChar | t.CPtr Attrs: t.CChar | t.CPtr +@t.NoVTable class Function(GSListNode[Function]): Name: t.CChar | t.CPtr RetTy: LLVMType | t.CPtr diff --git a/.transpyc_cache/02d833b3cf571c5b.doc.json b/Test/LLvmLiteTest/temp/5b8cf12a5862b640.doc.json similarity index 100% rename from .transpyc_cache/02d833b3cf571c5b.doc.json rename to Test/LLvmLiteTest/temp/5b8cf12a5862b640.doc.json diff --git a/.transpyc_cache/3e914ffe8cc3c120.pyi b/Test/LLvmLiteTest/temp/5b8cf12a5862b640.pyi similarity index 100% rename from .transpyc_cache/3e914ffe8cc3c120.pyi rename to Test/LLvmLiteTest/temp/5b8cf12a5862b640.pyi diff --git a/.transpyc_cache/d4117f5e00a6c3b5.pyi b/Test/LLvmLiteTest/temp/6b3bc463fd044545.pyi similarity index 99% rename from .transpyc_cache/d4117f5e00a6c3b5.pyi rename to Test/LLvmLiteTest/temp/6b3bc463fd044545.pyi index ee44bdb..ad181de 100644 --- a/.transpyc_cache/d4117f5e00a6c3b5.pyi +++ b/Test/LLvmLiteTest/temp/6b3bc463fd044545.pyi @@ -19,6 +19,7 @@ VERIFY_ERR_DUPLICATE_DEF: t.CDefine = 2 VERIFY_ERR_UNDEFINED_USE: t.CDefine = 3 VERIFY_ERR_PHI_NOT_FIRST: t.CDefine = 4 +@t.NoVTable class NameEntry(GSListNode[NameEntry]): Name: t.CChar | t.CPtr class VerifyResult: diff --git a/.transpyc_cache/46ea362b72c10a9e.pyi b/Test/LLvmLiteTest/temp/946e087da91aaada.pyi similarity index 99% rename from .transpyc_cache/46ea362b72c10a9e.pyi rename to Test/LLvmLiteTest/temp/946e087da91aaada.pyi index fbd9c3b..b1d244e 100644 --- a/.transpyc_cache/46ea362b72c10a9e.pyi +++ b/Test/LLvmLiteTest/temp/946e087da91aaada.pyi @@ -14,6 +14,7 @@ from .__types import LLVMType, TypePrint from .__values import Value, new_value, SSAValue from .__function import Function, BasicBlock, block_append_text, function_move_block_to_end, _ll_name_needs_quote +@t.NoVTable class IRBuilder: Pool: memhub.MemBuddy | t.CPtr Func: Function | t.CPtr @@ -161,6 +162,7 @@ def build_gep_array(builder: IRBuilder | t.CPtr, array_ty: LLVMType | t.CPtr, el def build_gep_struct(builder: IRBuilder | t.CPtr, struct_ty: LLVMType | t.CPtr, field_ty: LLVMType | t.CPtr, ptr: Value | t.CPtr, field_idx: t.CInt) -> Value | t.CPtr: pass +@t.NoVTable class PhiIncoming(GSListNode[PhiIncoming]): Val: Value | t.CPtr Block: BasicBlock | t.CPtr @@ -172,6 +174,7 @@ def new_phi_incoming(pool: memhub.MemBuddy | t.CPtr, val: Value | t.CPtr, block: def build_phi(builder: IRBuilder | t.CPtr, ty: LLVMType | t.CPtr, incoming_head: PhiIncoming | t.CPtr, count: t.CInt) -> Value | t.CPtr: pass +@t.NoVTable class SwitchCase(GSListNode[SwitchCase]): CaseVal: Value | t.CPtr Block: BasicBlock | t.CPtr diff --git a/Test/LLvmLiteTest/temp/9474791561654346.pyi b/Test/LLvmLiteTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/LLvmLiteTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/LLvmLiteTest/temp/_phase1_manifest.json b/Test/LLvmLiteTest/temp/_phase1_manifest.json index 8bc1cfd..925ee33 100644 --- a/Test/LLvmLiteTest/temp/_phase1_manifest.json +++ b/Test/LLvmLiteTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\LLvmLiteTest\\App\\main.py": {"sha1": "3e914ffe8cc3c120", "mtime": 1783096320.3660233, "size": 50177}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\linkedlist.py": {"sha1": "2d39c6c7d3557b3e", "mtime": 1782895405.2191627, "size": 16032}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\llvmlite\\__init__.py": {"sha1": "95394ca8da0f655a", "mtime": 1784089002.4168732, "size": 16338}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\llvmlite\\__builder.py": {"sha1": "46ea362b72c10a9e", "mtime": 1783657006.512418, "size": 48509}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\llvmlite\\__function.py": {"sha1": "e0b84369e50c937c", "mtime": 1784275582.4008405, "size": 16232}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\llvmlite\\__module.py": {"sha1": "21a7fcfc665f75ef", "mtime": 1784216086.0677392, "size": 20058}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\llvmlite\\__types.py": {"sha1": "455ff4e74c3dbfb0", "mtime": 1784088625.3087547, "size": 17902}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\llvmlite\\__values.py": {"sha1": "05c11f22675c60cb", "mtime": 1783584462.175312, "size": 6645}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\llvmlite\\__verify.py": {"sha1": "d4117f5e00a6c3b5", "mtime": 1783250231.8851368, "size": 14657}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\LLvmLiteTest\\App\\main.py": {"sha1": "5b8cf12a5862b640", "mtime": 1784384536.040362, "size": 50855}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\linkedlist.py": {"sha1": "2d39c6c7d3557b3e", "mtime": 1782895405.2191627, "size": 16032}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\llvmlite\\__init__.py": {"sha1": "95394ca8da0f655a", "mtime": 1784089002.4168732, "size": 16338}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\llvmlite\\__builder.py": {"sha1": "946e087da91aaada", "mtime": 1784387312.9523027, "size": 48840}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\llvmlite\\__function.py": {"sha1": "4dad2ba72ed7ba09", "mtime": 1784387250.682758, "size": 16888}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\llvmlite\\__module.py": {"sha1": "21a7fcfc665f75ef", "mtime": 1784216086.0677392, "size": 20058}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\llvmlite\\__types.py": {"sha1": "15f1ded02f3aa5bc", "mtime": 1784387290.644663, "size": 17996}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\llvmlite\\__values.py": {"sha1": "f9e36e2cd6fa659f", "mtime": 1784387299.9652681, "size": 6739}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\llvmlite\\__verify.py": {"sha1": "6b3bc463fd044545", "mtime": 1784387320.0367622, "size": 14751}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/LLvmLiteTest/temp/_sha1_map.txt b/Test/LLvmLiteTest/temp/_sha1_map.txt index d07734f..1ad7f39 100644 --- a/Test/LLvmLiteTest/temp/_sha1_map.txt +++ b/Test/LLvmLiteTest/temp/_sha1_map.txt @@ -1,21 +1,21 @@ -05c11f22675c60cb:includes/llvmlite\__values.py +14d33679f7fadf1f:includes/testcheck.py +15f1ded02f3aa5bc:includes/llvmlite\__types.py 21a7fcfc665f75ef:includes/llvmlite\__module.py 271ea3decb810db2:includes/atom.py 2d39c6c7d3557b3e:includes/linkedlist.py -3e914ffe8cc3c120:main.py -455ff4e74c3dbfb0:includes/llvmlite\__types.py -46ea362b72c10a9e:includes/llvmlite\__builder.py +4dad2ba72ed7ba09:includes/llvmlite\__function.py +5b8cf12a5862b640:main.py +6b3bc463fd044545:includes/llvmlite\__verify.py 6f62fe05c5ea1ceb:includes/stdio.py 71e0a3ffcb3ebfad:includes/stdarg.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py +946e087da91aaada:includes/llvmlite\__builder.py +9474791561654346:includes/string.py 95394ca8da0f655a:includes/llvmlite\__init__.py -ab6e54ba9a669f76:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c3b259b4059f8668:includes/viperlib.py c9f4be41ca1cc2b4:includes/viperio.py -d4117f5e00a6c3b5:includes/llvmlite\__verify.py -dd3002730623424b:includes/testcheck.py -e0b84369e50c937c:includes/llvmlite\__function.py -ee084e9fc6ee413a:includes/memhub.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py +f9e36e2cd6fa659f:includes/llvmlite\__values.py diff --git a/Test/LLvmLiteTest/temp/ab6e54ba9a669f76.pyi b/Test/LLvmLiteTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/LLvmLiteTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/LLvmLiteTest/temp/d4117f5e00a6c3b5.pyi b/Test/LLvmLiteTest/temp/d4117f5e00a6c3b5.pyi deleted file mode 100644 index ee44bdb..0000000 --- a/Test/LLvmLiteTest/temp/d4117f5e00a6c3b5.pyi +++ /dev/null @@ -1,62 +0,0 @@ -""" -Auto-generated Python stub file from llvmlite.__verify.py -Module: llvmlite.__verify -""" - - -import t, c -from stdint import * -import string -import viperlib -import memhub -from linkedlist import GSListNode, GSList -from .__function import Function, BasicBlock, Line, Param -from .__module import LLVMModule - -VERIFY_OK: t.CDefine = 0 -VERIFY_ERR_NO_TERMINATOR: t.CDefine = 1 -VERIFY_ERR_DUPLICATE_DEF: t.CDefine = 2 -VERIFY_ERR_UNDEFINED_USE: t.CDefine = 3 -VERIFY_ERR_PHI_NOT_FIRST: t.CDefine = 4 - -class NameEntry(GSListNode[NameEntry]): - Name: t.CChar | t.CPtr -class VerifyResult: - ErrorCount: t.CInt - WarningCount: t.CInt - ErrorCode: t.CInt - ErrorBuf: t.CChar | t.CPtr - ErrorBufSize: t.CSizeT - -def _new_verify_result(pool: memhub.MemBuddy | t.CPtr, buf_size: t.CSizeT) -> VerifyResult | t.CPtr: pass - -def _report_error(result: VerifyResult | t.CPtr, code: t.CInt, msg: t.CChar | t.CPtr) -> t.CInt: pass - -def _append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT, src: t.CChar | t.CPtr) -> t.CInt: pass - -def _new_name_table(pool: memhub.MemBuddy | t.CPtr) -> GSList[NameEntry] | t.CPtr: pass - - -NENTRY_SIZE: t.CDefine = 16 - -def _name_table_add(table: GSList[NameEntry] | t.CPtr, pool: memhub.MemBuddy | t.CPtr, name: t.CChar | t.CPtr) -> t.CInt: pass - -def _name_table_contains(table: GSList[NameEntry] | t.CPtr, name: t.CChar | t.CPtr) -> t.CInt: pass - -def _is_char_name(ch: t.CChar) -> t.CInt: pass - -def _extract_def_name(pool: memhub.MemBuddy | t.CPtr, text: t.CChar | t.CPtr) -> t.CChar | t.CPtr: pass - -def _is_terminator(text: t.CChar | t.CPtr) -> t.CInt: pass - -def _is_phi(text: t.CChar | t.CPtr) -> t.CInt: pass - -def _check_uses_in_line(table: GSList[NameEntry] | t.CPtr, text: t.CChar | t.CPtr, def_name: t.CChar | t.CPtr) -> t.CInt: pass - -def _name_matches_at(text: t.CChar | t.CPtr, start: t.CInt, length: t.CInt, table: GSList[NameEntry] | t.CPtr) -> t.CInt: pass - -def _str_matches_at(text: t.CChar | t.CPtr, start: t.CInt, length: t.CInt, target: t.CChar | t.CPtr) -> t.CInt: pass - -def verify_function(pool: memhub.MemBuddy | t.CPtr, func: Function | t.CPtr, result: VerifyResult | t.CPtr) -> t.CInt: pass - -def verify_module(pool: memhub.MemBuddy | t.CPtr, mod: LLVMModule | t.CPtr, result: VerifyResult | t.CPtr) -> t.CInt: pass diff --git a/Test/LLvmLiteTest/temp/ee084e9fc6ee413a.pyi b/Test/LLvmLiteTest/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/LLvmLiteTest/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/LLvmLiteTest/temp/f3560b99de458aec.pyi b/Test/LLvmLiteTest/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/LLvmLiteTest/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/LLvmLiteTest/temp/05c11f22675c60cb.pyi b/Test/LLvmLiteTest/temp/f9e36e2cd6fa659f.pyi similarity index 99% rename from Test/LLvmLiteTest/temp/05c11f22675c60cb.pyi rename to Test/LLvmLiteTest/temp/f9e36e2cd6fa659f.pyi index 3520489..f159bb6 100644 --- a/Test/LLvmLiteTest/temp/05c11f22675c60cb.pyi +++ b/Test/LLvmLiteTest/temp/f9e36e2cd6fa659f.pyi @@ -12,6 +12,7 @@ import memhub from linkedlist import GSListNode from .__types import LLVMType, TypePrint +@t.NoVTable class Value(GSListNode[Value]): Ty: LLVMType | t.CPtr Name: t.CChar | t.CPtr diff --git a/Test/ListTest/output/1ff2c5eb32359e40.deps.json b/Test/ListTest/output/1ff2c5eb32359e40.deps.json index 82601c2..38ec49b 100644 --- a/Test/ListTest/output/1ff2c5eb32359e40.deps.json +++ b/Test/ListTest/output/1ff2c5eb32359e40.deps.json @@ -1 +1 @@ -{"atom": "271ea3decb810db2", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "_list": "f2ecbf8ced20575c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ListTest/temp/dd3002730623424b.pyi b/Test/ListTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/ListTest/temp/dd3002730623424b.pyi rename to Test/ListTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/ListTest/temp/9474791561654346.pyi b/Test/ListTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/ListTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/ListTest/temp/_phase1_manifest.json b/Test/ListTest/temp/_phase1_manifest.json index 6ebd48c..55a6f17 100644 --- a/Test/ListTest/temp/_phase1_manifest.json +++ b/Test/ListTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ListTest\\App\\main.py": {"sha1": "1ff2c5eb32359e40", "mtime": 1782828109.658356, "size": 2856}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_list.py": {"sha1": "f2ecbf8ced20575c", "mtime": 1784203829.5212443, "size": 3277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ListTest\\App\\main.py": {"sha1": "1ff2c5eb32359e40", "mtime": 1782828109.658356, "size": 2856}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_list.py": {"sha1": "f2ecbf8ced20575c", "mtime": 1784203829.5212443, "size": 3277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/ListTest/temp/_sha1_map.txt b/Test/ListTest/temp/_sha1_map.txt index 76e8bdb..1a6c65c 100644 --- a/Test/ListTest/temp/_sha1_map.txt +++ b/Test/ListTest/temp/_sha1_map.txt @@ -1,12 +1,12 @@ +14d33679f7fadf1f:includes/testcheck.py 1ff2c5eb32359e40:main.py 271ea3decb810db2:includes/atom.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py -ee084e9fc6ee413a:includes/memhub.py f2ecbf8ced20575c:includes/_list.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/ListTest/temp/ab6e54ba9a669f76.pyi b/Test/ListTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/ListTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/ListTest/temp/ee084e9fc6ee413a.pyi b/Test/ListTest/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/ListTest/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/ListTest/temp/f3560b99de458aec.pyi b/Test/ListTest/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/ListTest/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/LoopTest/output/86e203c56ae4de20.deps.json b/Test/LoopTest/output/86e203c56ae4de20.deps.json index f02d7ee..2a27f59 100644 --- a/Test/LoopTest/output/86e203c56ae4de20.deps.json +++ b/Test/LoopTest/output/86e203c56ae4de20.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/LoopTest/temp/dd3002730623424b.pyi b/Test/LoopTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/LoopTest/temp/dd3002730623424b.pyi rename to Test/LoopTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/LoopTest/temp/_phase1_manifest.json b/Test/LoopTest/temp/_phase1_manifest.json index da502a7..058e1f6 100644 --- a/Test/LoopTest/temp/_phase1_manifest.json +++ b/Test/LoopTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\LoopTest\\App\\main.py": {"sha1": "86e203c56ae4de20", "mtime": 1782109374.0530808, "size": 2366}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\LoopTest\\App\\main.py": {"sha1": "86e203c56ae4de20", "mtime": 1782109374.0530808, "size": 2366}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/LoopTest/temp/_sha1_map.txt b/Test/LoopTest/temp/_sha1_map.txt index 12dd32b..011ebb0 100644 --- a/Test/LoopTest/temp/_sha1_map.txt +++ b/Test/LoopTest/temp/_sha1_map.txt @@ -1,6 +1,6 @@ +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py 86e203c56ae4de20:main.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/MemhubTest/App/main.py b/Test/MemhubTest/App/main.py index 392f3f8..98f1704 100644 --- a/Test/MemhubTest/App/main.py +++ b/Test/MemhubTest/App/main.py @@ -73,7 +73,7 @@ def main() -> int: b3: t.CVoid | t.CPtr = buddy.alloc(100) testcheck.check(b3 is not None, "MemBuddy alloc after free", "FAIL") # realloc 增长 - b4: t.CVoid | t.CPtr = buddy.realloc(b2, 0, 400) + b4: t.CVoid | t.CPtr = buddy.realloc(b2, 400) testcheck.check(b4 is not None, "MemBuddy realloc 200->400", "FAIL") # ========== 多态分派 (核心测试) ========== diff --git a/Test/MemhubTest/output/3ff210e50f345c7c.deps.json b/Test/MemhubTest/output/3ff210e50f345c7c.deps.json new file mode 100644 index 0000000..2cd406c --- /dev/null +++ b/Test/MemhubTest/output/3ff210e50f345c7c.deps.json @@ -0,0 +1 @@ +{"testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/MemhubTest/output/4ebd3745aa9cf570.deps.json b/Test/MemhubTest/output/4ebd3745aa9cf570.deps.json deleted file mode 100644 index feddefe..0000000 --- a/Test/MemhubTest/output/4ebd3745aa9cf570.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"atom": "271ea3decb810db2", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/MemhubTest/temp/dd3002730623424b.pyi b/Test/MemhubTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/MemhubTest/temp/dd3002730623424b.pyi rename to Test/MemhubTest/temp/14d33679f7fadf1f.pyi diff --git a/.transpyc_cache/03b24bc1d9327958.doc.json b/Test/MemhubTest/temp/3ff210e50f345c7c.doc.json similarity index 100% rename from .transpyc_cache/03b24bc1d9327958.doc.json rename to Test/MemhubTest/temp/3ff210e50f345c7c.doc.json diff --git a/.transpyc_cache/4ebd3745aa9cf570.pyi b/Test/MemhubTest/temp/3ff210e50f345c7c.pyi similarity index 100% rename from .transpyc_cache/4ebd3745aa9cf570.pyi rename to Test/MemhubTest/temp/3ff210e50f345c7c.pyi diff --git a/Test/MemhubTest/temp/4ebd3745aa9cf570.doc.json b/Test/MemhubTest/temp/4ebd3745aa9cf570.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/Test/MemhubTest/temp/4ebd3745aa9cf570.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/Test/MemhubTest/temp/4ebd3745aa9cf570.pyi b/Test/MemhubTest/temp/4ebd3745aa9cf570.pyi deleted file mode 100644 index e6450ad..0000000 --- a/Test/MemhubTest/temp/4ebd3745aa9cf570.pyi +++ /dev/null @@ -1,19 +0,0 @@ -""" -Auto-generated Python stub file from main.py -Module: main -""" - - -from stdint import * -import t, c -import stdio -import stdlib -import testcheck -import memhub - -def test_polymorphic(mgr: memhub.MemManager | t.CPtr, size: t.CSizeT) -> t.CInt: pass - -def test_calloc_polymorphic(mgr: memhub.MemManager | t.CPtr) -> t.CInt: pass - -@t.CExport -def main() -> int: pass diff --git a/Test/MemhubTest/temp/9474791561654346.pyi b/Test/MemhubTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/MemhubTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/MemhubTest/temp/_phase1_manifest.json b/Test/MemhubTest/temp/_phase1_manifest.json index 980d3ac..368d034 100644 --- a/Test/MemhubTest/temp/_phase1_manifest.json +++ b/Test/MemhubTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\MemhubTest\\App\\main.py": {"sha1": "4ebd3745aa9cf570", "mtime": 1782824910.9155376, "size": 3926}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\MemhubTest\\App\\main.py": {"sha1": "3ff210e50f345c7c", "mtime": 1784375438.1600194, "size": 3923}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/MemhubTest/temp/_sha1_map.txt b/Test/MemhubTest/temp/_sha1_map.txt index adcf586..df41167 100644 --- a/Test/MemhubTest/temp/_sha1_map.txt +++ b/Test/MemhubTest/temp/_sha1_map.txt @@ -1,11 +1,11 @@ +14d33679f7fadf1f:includes/testcheck.py 271ea3decb810db2:includes/atom.py -4ebd3745aa9cf570:main.py +3ff210e50f345c7c:main.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py -ee084e9fc6ee413a:includes/memhub.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/MemhubTest/temp/ab6e54ba9a669f76.pyi b/Test/MemhubTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/MemhubTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/MemhubTest/temp/ee084e9fc6ee413a.pyi b/Test/MemhubTest/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/MemhubTest/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/MemhubTest/temp/f3560b99de458aec.pyi b/Test/MemhubTest/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/MemhubTest/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/NewAstTest/output/4175f14c5fbef360.deps.json b/Test/NewAstTest/output/4175f14c5fbef360.deps.json index 56af556..6a4cde6 100644 --- a/Test/NewAstTest/output/4175f14c5fbef360.deps.json +++ b/Test/NewAstTest/output/4175f14c5fbef360.deps.json @@ -1 +1 @@ -{"ast.lexer": "0c212981c180e7fb", "lexer": "0c212981c180e7fb", "atom": "271ea3decb810db2", "ast.__init__": "34548789d646f432", "__init__": "34548789d646f432", "ast": "34548789d646f432", "ast.astaux": "4337fb260448bbe2", "astaux": "4337fb260448bbe2", "ast.exprs": "47767b5026a8ee15", "exprs": "47767b5026a8ee15", "ast.match": "4dd6b3f1427d1cc5", "match": "4dd6b3f1427d1cc5", "ast.base": "5dab8cb390496d22", "base": "5dab8cb390496d22", "ast.stmts": "657e182b27c2a022", "stmts": "657e182b27c2a022", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "ast.tokens": "b547ac4f380bddb6", "tokens": "b547ac4f380bddb6", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "memhub": "ee084e9fc6ee413a", "ast.parser": "ee52c08239684346", "parser": "ee52c08239684346", "_list": "f2ecbf8ced20575c", "stdint": "f5522571bcce7bcb", "main.tokens": "b547ac4f380bddb6", "main.base": "5dab8cb390496d22", "main.exprs": "47767b5026a8ee15", "main.stmts": "657e182b27c2a022", "main.astaux": "4337fb260448bbe2", "main.match": "4dd6b3f1427d1cc5", "main.lexer": "0c212981c180e7fb"} \ No newline at end of file +{"ast.lexer": "0c212981c180e7fb", "lexer": "0c212981c180e7fb", "atom": "271ea3decb810db2", "ast.__init__": "34548789d646f432", "__init__": "34548789d646f432", "ast": "34548789d646f432", "ast.astaux": "4337fb260448bbe2", "astaux": "4337fb260448bbe2", "ast.exprs": "47767b5026a8ee15", "exprs": "47767b5026a8ee15", "ast.match": "4dd6b3f1427d1cc5", "match": "4dd6b3f1427d1cc5", "ast.base": "5dab8cb390496d22", "base": "5dab8cb390496d22", "ast.stmts": "657e182b27c2a022", "stmts": "657e182b27c2a022", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "ast.tokens": "b547ac4f380bddb6", "tokens": "b547ac4f380bddb6", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "ast.parser": "ee52c08239684346", "parser": "ee52c08239684346", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/NewAstTest/temp/9474791561654346.pyi b/Test/NewAstTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/NewAstTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/NewAstTest/temp/_phase1_manifest.json b/Test/NewAstTest/temp/_phase1_manifest.json index 3206144..71eb110 100644 --- a/Test/NewAstTest/temp/_phase1_manifest.json +++ b/Test/NewAstTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\NewAstTest\\App\\main.py": {"sha1": "4175f14c5fbef360", "mtime": 1783001020.789755, "size": 63423}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_list.py": {"sha1": "f2ecbf8ced20575c", "mtime": 1784203829.5212443, "size": 3277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\__init__.py": {"sha1": "34548789d646f432", "mtime": 1784102404.6307266, "size": 3409}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\astaux.py": {"sha1": "4337fb260448bbe2", "mtime": 1784006094.7981195, "size": 11489}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\base.py": {"sha1": "5dab8cb390496d22", "mtime": 1784197698.3282094, "size": 14966}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\exprs.py": {"sha1": "47767b5026a8ee15", "mtime": 1783239758.809719, "size": 40615}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\lexer.py": {"sha1": "0c212981c180e7fb", "mtime": 1783400609.908198, "size": 23535}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\match.py": {"sha1": "4dd6b3f1427d1cc5", "mtime": 1782961799.8492737, "size": 12309}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\parser.py": {"sha1": "ee52c08239684346", "mtime": 1784102405.1933146, "size": 85445}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\stmts.py": {"sha1": "657e182b27c2a022", "mtime": 1783929993.759902, "size": 37926}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\tokens.py": {"sha1": "b547ac4f380bddb6", "mtime": 1783165480.469121, "size": 13722}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\NewAstTest\\App\\main.py": {"sha1": "4175f14c5fbef360", "mtime": 1783001020.789755, "size": 63423}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_list.py": {"sha1": "f2ecbf8ced20575c", "mtime": 1784203829.5212443, "size": 3277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\__init__.py": {"sha1": "34548789d646f432", "mtime": 1784102404.6307266, "size": 3409}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\astaux.py": {"sha1": "4337fb260448bbe2", "mtime": 1784006094.7981195, "size": 11489}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\base.py": {"sha1": "5dab8cb390496d22", "mtime": 1784197698.3282094, "size": 14966}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\exprs.py": {"sha1": "47767b5026a8ee15", "mtime": 1783239758.809719, "size": 40615}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\lexer.py": {"sha1": "0c212981c180e7fb", "mtime": 1783400609.908198, "size": 23535}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\match.py": {"sha1": "4dd6b3f1427d1cc5", "mtime": 1782961799.8492737, "size": 12309}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\parser.py": {"sha1": "ee52c08239684346", "mtime": 1784102405.1933146, "size": 85445}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\stmts.py": {"sha1": "657e182b27c2a022", "mtime": 1783929993.759902, "size": 37926}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\ast\\tokens.py": {"sha1": "b547ac4f380bddb6", "mtime": 1783165480.469121, "size": 13722}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}} \ No newline at end of file diff --git a/Test/NewAstTest/temp/_sha1_map.txt b/Test/NewAstTest/temp/_sha1_map.txt index ac2e3b4..fe04566 100644 --- a/Test/NewAstTest/temp/_sha1_map.txt +++ b/Test/NewAstTest/temp/_sha1_map.txt @@ -10,11 +10,11 @@ 6f62fe05c5ea1ceb:includes/stdio.py 71e0a3ffcb3ebfad:includes/stdarg.py 90c53dd6db8d41cf:includes/stdlib.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py b547ac4f380bddb6:includes/ast\tokens.py c3b259b4059f8668:includes/viperlib.py c9f4be41ca1cc2b4:includes/viperio.py -ee084e9fc6ee413a:includes/memhub.py ee52c08239684346:includes/ast\parser.py f2ecbf8ced20575c:includes/_list.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/NewAstTest/temp/ab6e54ba9a669f76.pyi b/Test/NewAstTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/NewAstTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/NewAstTest/temp/ee084e9fc6ee413a.pyi b/Test/NewAstTest/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/NewAstTest/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/NewAstTest/temp/f3560b99de458aec.pyi b/Test/NewAstTest/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/NewAstTest/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/NoVTableTest/output/22650858c377c847.deps.json b/Test/NoVTableTest/output/22650858c377c847.deps.json index d5f6f05..6f6a6c7 100644 --- a/Test/NoVTableTest/output/22650858c377c847.deps.json +++ b/Test/NoVTableTest/output/22650858c377c847.deps.json @@ -1 +1 @@ -{"linkedlist": "2d39c6c7d3557b3e", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "linkedlist": "2d39c6c7d3557b3e", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/NoVTableTest/temp/dd3002730623424b.pyi b/Test/NoVTableTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/NoVTableTest/temp/dd3002730623424b.pyi rename to Test/NoVTableTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/NoVTableTest/temp/9474791561654346.pyi b/Test/NoVTableTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/NoVTableTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/NoVTableTest/temp/_phase1_manifest.json b/Test/NoVTableTest/temp/_phase1_manifest.json index 789603f..6aa7d66 100644 --- a/Test/NoVTableTest/temp/_phase1_manifest.json +++ b/Test/NoVTableTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\NoVTableTest\\App\\main.py": {"sha1": "22650858c377c847", "mtime": 1782800242.9985914, "size": 17052}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\linkedlist.py": {"sha1": "2d39c6c7d3557b3e", "mtime": 1782895405.2191627, "size": 16032}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\NoVTableTest\\App\\main.py": {"sha1": "22650858c377c847", "mtime": 1782800242.9985914, "size": 17052}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\linkedlist.py": {"sha1": "2d39c6c7d3557b3e", "mtime": 1782895405.2191627, "size": 16032}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/NoVTableTest/temp/_sha1_map.txt b/Test/NoVTableTest/temp/_sha1_map.txt index 45e0214..26ecc7b 100644 --- a/Test/NoVTableTest/temp/_sha1_map.txt +++ b/Test/NoVTableTest/temp/_sha1_map.txt @@ -1,12 +1,12 @@ +14d33679f7fadf1f:includes/testcheck.py 22650858c377c847:main.py 2d39c6c7d3557b3e:includes/linkedlist.py 6f62fe05c5ea1ceb:includes/stdio.py 71e0a3ffcb3ebfad:includes/stdarg.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c3b259b4059f8668:includes/viperlib.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/NoVTableTest/temp/ab6e54ba9a669f76.pyi b/Test/NoVTableTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/NoVTableTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/PointerTest/output/b436212dcff1be29.deps.json b/Test/PointerTest/output/b436212dcff1be29.deps.json index 9da11e2..48c6c93 100644 --- a/Test/PointerTest/output/b436212dcff1be29.deps.json +++ b/Test/PointerTest/output/b436212dcff1be29.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/PointerTest/temp/dd3002730623424b.pyi b/Test/PointerTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/PointerTest/temp/dd3002730623424b.pyi rename to Test/PointerTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/PointerTest/temp/9474791561654346.pyi b/Test/PointerTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/PointerTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/PointerTest/temp/_phase1_manifest.json b/Test/PointerTest/temp/_phase1_manifest.json index e761766..938dfdd 100644 --- a/Test/PointerTest/temp/_phase1_manifest.json +++ b/Test/PointerTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\PointerTest\\App\\main.py": {"sha1": "b436212dcff1be29", "mtime": 1782266285.034029, "size": 9274}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\PointerTest\\App\\main.py": {"sha1": "b436212dcff1be29", "mtime": 1782266285.034029, "size": 9274}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file diff --git a/Test/PointerTest/temp/_sha1_map.txt b/Test/PointerTest/temp/_sha1_map.txt index c92e7b2..c6c1678 100644 --- a/Test/PointerTest/temp/_sha1_map.txt +++ b/Test/PointerTest/temp/_sha1_map.txt @@ -1,8 +1,8 @@ +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 72e2d5ccb7cedcf1:includes/w32\win32memory.py 7e529fe7a078cfef:includes/w32\win32base.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py b436212dcff1be29:main.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/PointerTest/temp/ab6e54ba9a669f76.pyi b/Test/PointerTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/PointerTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/ShortCircuitTest/output/a711c9c66fd7c6ca.deps.json b/Test/ShortCircuitTest/output/a711c9c66fd7c6ca.deps.json index 262dabd..a86f7c5 100644 --- a/Test/ShortCircuitTest/output/a711c9c66fd7c6ca.deps.json +++ b/Test/ShortCircuitTest/output/a711c9c66fd7c6ca.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ShortCircuitTest/temp/dd3002730623424b.pyi b/Test/ShortCircuitTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/ShortCircuitTest/temp/dd3002730623424b.pyi rename to Test/ShortCircuitTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/ShortCircuitTest/temp/9474791561654346.pyi b/Test/ShortCircuitTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/ShortCircuitTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/ShortCircuitTest/temp/_phase1_manifest.json b/Test/ShortCircuitTest/temp/_phase1_manifest.json index 26e54b5..e96bd9b 100644 --- a/Test/ShortCircuitTest/temp/_phase1_manifest.json +++ b/Test/ShortCircuitTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ShortCircuitTest\\App\\main.py": {"sha1": "a711c9c66fd7c6ca", "mtime": 1782355546.5909688, "size": 4497}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ShortCircuitTest\\App\\main.py": {"sha1": "a711c9c66fd7c6ca", "mtime": 1782355546.5909688, "size": 4497}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/ShortCircuitTest/temp/_sha1_map.txt b/Test/ShortCircuitTest/temp/_sha1_map.txt index 47c7fc4..bc2ddd2 100644 --- a/Test/ShortCircuitTest/temp/_sha1_map.txt +++ b/Test/ShortCircuitTest/temp/_sha1_map.txt @@ -1,8 +1,8 @@ +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py +9474791561654346:includes/string.py a711c9c66fd7c6ca:main.py -ab6e54ba9a669f76:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/ShortCircuitTest/temp/ab6e54ba9a669f76.pyi b/Test/ShortCircuitTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/ShortCircuitTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/SimdTest/output/2fcb6780db4d937f.deps.json b/Test/SimdTest/output/2fcb6780db4d937f.deps.json index 9ec0f91..1252f68 100644 --- a/Test/SimdTest/output/2fcb6780db4d937f.deps.json +++ b/Test/SimdTest/output/2fcb6780db4d937f.deps.json @@ -1 +1 @@ -{"atom": "271ea3decb810db2", "vipermath": "3f7c5e78d8652535", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "vipersimd": "c24f25b14b4bbd0a", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "vipermath": "3f7c5e78d8652535", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "vipersimd": "c24f25b14b4bbd0a", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/SimdTest/temp/dd3002730623424b.pyi b/Test/SimdTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/SimdTest/temp/dd3002730623424b.pyi rename to Test/SimdTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/SimdTest/temp/9474791561654346.pyi b/Test/SimdTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/SimdTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/SimdTest/temp/_phase1_manifest.json b/Test/SimdTest/temp/_phase1_manifest.json index 9367a98..689a63c 100644 --- a/Test/SimdTest/temp/_phase1_manifest.json +++ b/Test/SimdTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\SimdTest\\App\\main.py": {"sha1": "2fcb6780db4d937f", "mtime": 1782828206.5357063, "size": 17078}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\numpy\\__init__.py": {"sha1": "c3a6aed1f1fb8b1e", "mtime": 1782949786.0890937, "size": 39111}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\vipermath.py": {"sha1": "3f7c5e78d8652535", "mtime": 1781532528.2518907, "size": 15412}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\vipersimd.py": {"sha1": "c24f25b14b4bbd0a", "mtime": 1782891155.5031893, "size": 15522}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\SimdTest\\App\\main.py": {"sha1": "2fcb6780db4d937f", "mtime": 1782828206.5357063, "size": 17078}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\numpy\\__init__.py": {"sha1": "c3a6aed1f1fb8b1e", "mtime": 1782949786.0890937, "size": 39111}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\vipermath.py": {"sha1": "3f7c5e78d8652535", "mtime": 1781532528.2518907, "size": 15412}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\vipersimd.py": {"sha1": "c24f25b14b4bbd0a", "mtime": 1782891155.5031893, "size": 15522}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/SimdTest/temp/_sha1_map.txt b/Test/SimdTest/temp/_sha1_map.txt index 5bd402c..ce9b71d 100644 --- a/Test/SimdTest/temp/_sha1_map.txt +++ b/Test/SimdTest/temp/_sha1_map.txt @@ -1,14 +1,14 @@ +14d33679f7fadf1f:includes/testcheck.py 271ea3decb810db2:includes/atom.py 2fcb6780db4d937f:main.py 3f7c5e78d8652535:includes/vipermath.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c24f25b14b4bbd0a:includes/vipersimd.py c3a6aed1f1fb8b1e:includes/numpy\__init__.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py -ee084e9fc6ee413a:includes/memhub.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/SimdTest/temp/ab6e54ba9a669f76.pyi b/Test/SimdTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/SimdTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/SimdTest/temp/ee084e9fc6ee413a.pyi b/Test/SimdTest/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/SimdTest/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/SimdTest/temp/f3560b99de458aec.pyi b/Test/SimdTest/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/SimdTest/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/SprintfTest/output/f492cb40d913400b.deps.json b/Test/SprintfTest/output/f492cb40d913400b.deps.json index 2a993fa..f9bd8c9 100644 --- a/Test/SprintfTest/output/f492cb40d913400b.deps.json +++ b/Test/SprintfTest/output/f492cb40d913400b.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/SprintfTest/temp/dd3002730623424b.pyi b/Test/SprintfTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/SprintfTest/temp/dd3002730623424b.pyi rename to Test/SprintfTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/SprintfTest/temp/_phase1_manifest.json b/Test/SprintfTest/temp/_phase1_manifest.json index f7bb7c9..02925cc 100644 --- a/Test/SprintfTest/temp/_phase1_manifest.json +++ b/Test/SprintfTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\SprintfTest\\App\\main.py": {"sha1": "f492cb40d913400b", "mtime": 1782821953.0346377, "size": 4235}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\SprintfTest\\App\\main.py": {"sha1": "f492cb40d913400b", "mtime": 1782821953.0346377, "size": 4235}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/SprintfTest/temp/_sha1_map.txt b/Test/SprintfTest/temp/_sha1_map.txt index 6e81a3d..3921ea1 100644 --- a/Test/SprintfTest/temp/_sha1_map.txt +++ b/Test/SprintfTest/temp/_sha1_map.txt @@ -1,3 +1,4 @@ +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 71e0a3ffcb3ebfad:includes/stdarg.py 7e529fe7a078cfef:includes/w32\win32base.py @@ -5,6 +6,5 @@ bbdf3bbd4c3bc28c:includes/w32\win32console.py c3b259b4059f8668:includes/viperlib.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py f492cb40d913400b:main.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/StringIterTest/output/924ed8cd4ea5c4c2.deps.json b/Test/StringIterTest/output/924ed8cd4ea5c4c2.deps.json index eafa78c..702be07 100644 --- a/Test/StringIterTest/output/924ed8cd4ea5c4c2.deps.json +++ b/Test/StringIterTest/output/924ed8cd4ea5c4c2.deps.json @@ -1 +1 @@ -{"atom": "271ea3decb810db2", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "_list": "f2ecbf8ced20575c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "_list": "f2ecbf8ced20575c", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/StringIterTest/temp/dd3002730623424b.pyi b/Test/StringIterTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/StringIterTest/temp/dd3002730623424b.pyi rename to Test/StringIterTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/StringIterTest/temp/9474791561654346.pyi b/Test/StringIterTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/StringIterTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/StringIterTest/temp/_phase1_manifest.json b/Test/StringIterTest/temp/_phase1_manifest.json index 3764bfc..8f59dbb 100644 --- a/Test/StringIterTest/temp/_phase1_manifest.json +++ b/Test/StringIterTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\StringIterTest\\App\\main.py": {"sha1": "924ed8cd4ea5c4c2", "mtime": 1782271507.3310895, "size": 6472}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_list.py": {"sha1": "f2ecbf8ced20575c", "mtime": 1784203829.5212443, "size": 3277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\StringIterTest\\App\\main.py": {"sha1": "924ed8cd4ea5c4c2", "mtime": 1782271507.3310895, "size": 6472}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\_list.py": {"sha1": "f2ecbf8ced20575c", "mtime": 1784203829.5212443, "size": 3277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/StringIterTest/temp/_sha1_map.txt b/Test/StringIterTest/temp/_sha1_map.txt index e03ebeb..169af2b 100644 --- a/Test/StringIterTest/temp/_sha1_map.txt +++ b/Test/StringIterTest/temp/_sha1_map.txt @@ -1,11 +1,11 @@ +14d33679f7fadf1f:includes/testcheck.py 271ea3decb810db2:includes/atom.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py 924ed8cd4ea5c4c2:main.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py -ee084e9fc6ee413a:includes/memhub.py f2ecbf8ced20575c:includes/_list.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/StringIterTest/temp/ab6e54ba9a669f76.pyi b/Test/StringIterTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/StringIterTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/StringIterTest/temp/ee084e9fc6ee413a.pyi b/Test/StringIterTest/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/StringIterTest/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/StringIterTest/temp/f3560b99de458aec.pyi b/Test/StringIterTest/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/StringIterTest/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/StringTest/output/39178dc5ba692b92.deps.json b/Test/StringTest/output/39178dc5ba692b92.deps.json index 9da11e2..48c6c93 100644 --- a/Test/StringTest/output/39178dc5ba692b92.deps.json +++ b/Test/StringTest/output/39178dc5ba692b92.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/StringTest/temp/dd3002730623424b.pyi b/Test/StringTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/StringTest/temp/dd3002730623424b.pyi rename to Test/StringTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/StringTest/temp/9474791561654346.pyi b/Test/StringTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/StringTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/StringTest/temp/_phase1_manifest.json b/Test/StringTest/temp/_phase1_manifest.json index e223450..ce69661 100644 --- a/Test/StringTest/temp/_phase1_manifest.json +++ b/Test/StringTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\StringTest\\App\\main.py": {"sha1": "39178dc5ba692b92", "mtime": 1782271507.3310895, "size": 3265}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\StringTest\\App\\main.py": {"sha1": "39178dc5ba692b92", "mtime": 1782271507.3310895, "size": 3265}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file diff --git a/Test/StringTest/temp/_sha1_map.txt b/Test/StringTest/temp/_sha1_map.txt index 90054fd..5bfefa3 100644 --- a/Test/StringTest/temp/_sha1_map.txt +++ b/Test/StringTest/temp/_sha1_map.txt @@ -1,8 +1,8 @@ +14d33679f7fadf1f:includes/testcheck.py 39178dc5ba692b92:main.py 6f62fe05c5ea1ceb:includes/stdio.py 72e2d5ccb7cedcf1:includes/w32\win32memory.py 7e529fe7a078cfef:includes/w32\win32base.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/StringTest/temp/ab6e54ba9a669f76.pyi b/Test/StringTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/StringTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/StructTest/output/24e26a8de1173993.deps.json b/Test/StructTest/output/24e26a8de1173993.deps.json index 9da11e2..48c6c93 100644 --- a/Test/StructTest/output/24e26a8de1173993.deps.json +++ b/Test/StructTest/output/24e26a8de1173993.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/StructTest/temp/dd3002730623424b.pyi b/Test/StructTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/StructTest/temp/dd3002730623424b.pyi rename to Test/StructTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/StructTest/temp/9474791561654346.pyi b/Test/StructTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/StructTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/StructTest/temp/_phase1_manifest.json b/Test/StructTest/temp/_phase1_manifest.json index 9b92f7a..8ce559e 100644 --- a/Test/StructTest/temp/_phase1_manifest.json +++ b/Test/StructTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\StructTest\\App\\main.py": {"sha1": "24e26a8de1173993", "mtime": 1782271507.3310895, "size": 2500}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\StructTest\\App\\main.py": {"sha1": "24e26a8de1173993", "mtime": 1782271507.3310895, "size": 2500}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file diff --git a/Test/StructTest/temp/_sha1_map.txt b/Test/StructTest/temp/_sha1_map.txt index fdfce98..6e50d22 100644 --- a/Test/StructTest/temp/_sha1_map.txt +++ b/Test/StructTest/temp/_sha1_map.txt @@ -1,8 +1,8 @@ +14d33679f7fadf1f:includes/testcheck.py 24e26a8de1173993:main.py 6f62fe05c5ea1ceb:includes/stdio.py 72e2d5ccb7cedcf1:includes/w32\win32memory.py 7e529fe7a078cfef:includes/w32\win32base.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/StructTest/temp/ab6e54ba9a669f76.pyi b/Test/StructTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/StructTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/SysLibTest/output/59e00d50660b941e.deps.json b/Test/SysLibTest/output/59e00d50660b941e.deps.json index 7a3a27b..b7dea4b 100644 --- a/Test/SysLibTest/output/59e00d50660b941e.deps.json +++ b/Test/SysLibTest/output/59e00d50660b941e.deps.json @@ -1 +1 @@ -{"w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "os.path": "13110effbb0bb06c", "path": "13110effbb0bb06c", "atom": "271ea3decb810db2", "subprocess": "2da636c61863c815", "posix": "6503c97dde0c79c4", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "os.__init__": "76dd6c275aa72b3b", "__init__": "76dd6c275aa72b3b", "os": "76dd6c275aa72b3b", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "syslibtest_impl": "a03139660029514f", "os._win32": "a68b70f233541a7f", "_win32": "a68b70f233541a7f", "string": "ab6e54ba9a669f76", "shutil": "abbcbd92436cc16a", "sys": "b5a965302cded36b", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "main": "c70684ccfe48a5a9", "viperio": "c9f4be41ca1cc2b4", "os._posix": "d152115b49e50218", "_posix": "d152115b49e50218", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file +{"w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "os.path": "13110effbb0bb06c", "path": "13110effbb0bb06c", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "subprocess": "2da636c61863c815", "posix": "6503c97dde0c79c4", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "os.__init__": "76dd6c275aa72b3b", "__init__": "76dd6c275aa72b3b", "os": "76dd6c275aa72b3b", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "9474791561654346", "syslibtest_impl": "a03139660029514f", "os._win32": "a68b70f233541a7f", "_win32": "a68b70f233541a7f", "shutil": "abbcbd92436cc16a", "sys": "b5a965302cded36b", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "main": "c70684ccfe48a5a9", "viperio": "c9f4be41ca1cc2b4", "os._posix": "d152115b49e50218", "_posix": "d152115b49e50218", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file diff --git a/Test/SysLibTest/output/a03139660029514f.deps.json b/Test/SysLibTest/output/a03139660029514f.deps.json index d1a0bbe..a1db010 100644 --- a/Test/SysLibTest/output/a03139660029514f.deps.json +++ b/Test/SysLibTest/output/a03139660029514f.deps.json @@ -1 +1 @@ -{"w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "os.path": "13110effbb0bb06c", "path": "13110effbb0bb06c", "atom": "271ea3decb810db2", "subprocess": "2da636c61863c815", "os_backend": "59e00d50660b941e", "posix": "6503c97dde0c79c4", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "os.__init__": "76dd6c275aa72b3b", "__init__": "76dd6c275aa72b3b", "os": "76dd6c275aa72b3b", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "os._win32": "a68b70f233541a7f", "_win32": "a68b70f233541a7f", "string": "ab6e54ba9a669f76", "shutil": "abbcbd92436cc16a", "sys": "b5a965302cded36b", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "main": "c70684ccfe48a5a9", "viperio": "c9f4be41ca1cc2b4", "os._posix": "d152115b49e50218", "_posix": "d152115b49e50218", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file +{"w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "os.path": "13110effbb0bb06c", "path": "13110effbb0bb06c", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "subprocess": "2da636c61863c815", "os_backend": "59e00d50660b941e", "posix": "6503c97dde0c79c4", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "os.__init__": "76dd6c275aa72b3b", "__init__": "76dd6c275aa72b3b", "os": "76dd6c275aa72b3b", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "9474791561654346", "os._win32": "a68b70f233541a7f", "_win32": "a68b70f233541a7f", "shutil": "abbcbd92436cc16a", "sys": "b5a965302cded36b", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "main": "c70684ccfe48a5a9", "viperio": "c9f4be41ca1cc2b4", "os._posix": "d152115b49e50218", "_posix": "d152115b49e50218", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file diff --git a/Test/SysLibTest/output/c70684ccfe48a5a9.deps.json b/Test/SysLibTest/output/c70684ccfe48a5a9.deps.json index 932a326..eb0545d 100644 --- a/Test/SysLibTest/output/c70684ccfe48a5a9.deps.json +++ b/Test/SysLibTest/output/c70684ccfe48a5a9.deps.json @@ -1 +1 @@ -{"w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "os.path": "13110effbb0bb06c", "path": "13110effbb0bb06c", "atom": "271ea3decb810db2", "subprocess": "2da636c61863c815", "os_backend": "59e00d50660b941e", "posix": "6503c97dde0c79c4", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "os.__init__": "76dd6c275aa72b3b", "__init__": "76dd6c275aa72b3b", "os": "76dd6c275aa72b3b", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "syslibtest_impl": "a03139660029514f", "os._win32": "a68b70f233541a7f", "_win32": "a68b70f233541a7f", "string": "ab6e54ba9a669f76", "shutil": "abbcbd92436cc16a", "sys": "b5a965302cded36b", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "os._posix": "d152115b49e50218", "_posix": "d152115b49e50218", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file +{"w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "os.path": "13110effbb0bb06c", "path": "13110effbb0bb06c", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "subprocess": "2da636c61863c815", "os_backend": "59e00d50660b941e", "posix": "6503c97dde0c79c4", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "os.__init__": "76dd6c275aa72b3b", "__init__": "76dd6c275aa72b3b", "os": "76dd6c275aa72b3b", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "9474791561654346", "syslibtest_impl": "a03139660029514f", "os._win32": "a68b70f233541a7f", "_win32": "a68b70f233541a7f", "shutil": "abbcbd92436cc16a", "sys": "b5a965302cded36b", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "os._posix": "d152115b49e50218", "_posix": "d152115b49e50218", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file diff --git a/Test/SysLibTest/temp/dd3002730623424b.pyi b/Test/SysLibTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/SysLibTest/temp/dd3002730623424b.pyi rename to Test/SysLibTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/SysLibTest/temp/9474791561654346.pyi b/Test/SysLibTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/SysLibTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/SysLibTest/temp/_phase1_manifest.json b/Test/SysLibTest/temp/_phase1_manifest.json index 288b982..29810e7 100644 --- a/Test/SysLibTest/temp/_phase1_manifest.json +++ b/Test/SysLibTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\SysLibTest\\App\\main.py": {"sha1": "c70684ccfe48a5a9", "mtime": 1782828223.3150382, "size": 918}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\SysLibTest\\App\\os_backend.py": {"sha1": "59e00d50660b941e", "mtime": 1782491896.4070306, "size": 1323}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\SysLibTest\\App\\syslibtest_impl.py": {"sha1": "a03139660029514f", "mtime": 1782828233.2147534, "size": 12395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\os\\__init__.py": {"sha1": "76dd6c275aa72b3b", "mtime": 1782826646.8940291, "size": 4395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\os\\_posix.py": {"sha1": "d152115b49e50218", "mtime": 1782826648.538678, "size": 5665}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\os\\_win32.py": {"sha1": "a68b70f233541a7f", "mtime": 1782826646.872196, "size": 7601}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\os\\path.py": {"sha1": "13110effbb0bb06c", "mtime": 1782826648.9189062, "size": 9499}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\platmacro.py": {"sha1": "93c1d18e35d188d6", "mtime": 1781237231.03366, "size": 1422}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\posix.py": {"sha1": "6503c97dde0c79c4", "mtime": 1783064077.6376991, "size": 10386}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\shutil.py": {"sha1": "abbcbd92436cc16a", "mtime": 1782826619.0231705, "size": 9131}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\subprocess.py": {"sha1": "2da636c61863c815", "mtime": 1783847277.4569364, "size": 7627}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\sys.py": {"sha1": "b5a965302cded36b", "mtime": 1783569641.07535, "size": 5509}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\fileio.py": {"sha1": "0035c95a18d4f8e8", "mtime": 1783747022.686592, "size": 14147}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32file.py": {"sha1": "f6b51804a0ba8ff0", "mtime": 1782531158.744144, "size": 8424}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32process.py": {"sha1": "067c78e9f121dce3", "mtime": 1781200703.5409546, "size": 4802}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32sync.py": {"sha1": "06f53cc594b4ac6c", "mtime": 1782297500.2581685, "size": 4726}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\SysLibTest\\App\\main.py": {"sha1": "c70684ccfe48a5a9", "mtime": 1782828223.3150382, "size": 918}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\SysLibTest\\App\\os_backend.py": {"sha1": "59e00d50660b941e", "mtime": 1782491896.4070306, "size": 1323}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\SysLibTest\\App\\syslibtest_impl.py": {"sha1": "a03139660029514f", "mtime": 1782828233.2147534, "size": 12395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\os\\__init__.py": {"sha1": "76dd6c275aa72b3b", "mtime": 1782826646.8940291, "size": 4395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\os\\_posix.py": {"sha1": "d152115b49e50218", "mtime": 1782826648.538678, "size": 5665}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\os\\_win32.py": {"sha1": "a68b70f233541a7f", "mtime": 1782826646.872196, "size": 7601}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\os\\path.py": {"sha1": "13110effbb0bb06c", "mtime": 1782826648.9189062, "size": 9499}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\platmacro.py": {"sha1": "93c1d18e35d188d6", "mtime": 1781237231.03366, "size": 1422}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\posix.py": {"sha1": "6503c97dde0c79c4", "mtime": 1783064077.6376991, "size": 10386}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\shutil.py": {"sha1": "abbcbd92436cc16a", "mtime": 1782826619.0231705, "size": 9131}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\subprocess.py": {"sha1": "2da636c61863c815", "mtime": 1783847277.4569364, "size": 7627}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\sys.py": {"sha1": "b5a965302cded36b", "mtime": 1783569641.07535, "size": 5509}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\fileio.py": {"sha1": "0035c95a18d4f8e8", "mtime": 1783747022.686592, "size": 14147}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32file.py": {"sha1": "f6b51804a0ba8ff0", "mtime": 1782531158.744144, "size": 8424}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32process.py": {"sha1": "067c78e9f121dce3", "mtime": 1781200703.5409546, "size": 4802}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32sync.py": {"sha1": "06f53cc594b4ac6c", "mtime": 1782297500.2581685, "size": 4726}} \ No newline at end of file diff --git a/Test/SysLibTest/temp/_sha1_map.txt b/Test/SysLibTest/temp/_sha1_map.txt index a6b98c8..8041cef 100644 --- a/Test/SysLibTest/temp/_sha1_map.txt +++ b/Test/SysLibTest/temp/_sha1_map.txt @@ -2,6 +2,7 @@ 067c78e9f121dce3:includes/w32\win32process.py 06f53cc594b4ac6c:includes/w32\win32sync.py 13110effbb0bb06c:includes/os\path.py +14d33679f7fadf1f:includes/testcheck.py 271ea3decb810db2:includes/atom.py 2da636c61863c815:includes/subprocess.py 59e00d50660b941e:os_backend.py @@ -12,9 +13,9 @@ 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py 93c1d18e35d188d6:includes/platmacro.py +9474791561654346:includes/string.py a03139660029514f:syslibtest_impl.py a68b70f233541a7f:includes/os\_win32.py -ab6e54ba9a669f76:includes/string.py abbcbd92436cc16a:includes/shutil.py b5a965302cded36b:includes/sys.py bbdf3bbd4c3bc28c:includes/w32\win32console.py @@ -22,7 +23,6 @@ c3b259b4059f8668:includes/viperlib.py c70684ccfe48a5a9:main.py c9f4be41ca1cc2b4:includes/viperio.py d152115b49e50218:includes/os\_posix.py -dd3002730623424b:includes/testcheck.py -ee084e9fc6ee413a:includes/memhub.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py f6b51804a0ba8ff0:includes/w32\win32file.py diff --git a/Test/SysLibTest/temp/_shared_sym.json b/Test/SysLibTest/temp/_shared_sym.json index ec0e5078da05e7676500e042a098da03c90c4984..6350724223bdaa319564c08847c653f6e6a360c7 100644 GIT binary patch literal 699092 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%0D7QBPt!-w;X_aN^wb@1?Fg@H?|HNr@9FEk3vj&d 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 diff --git a/Test/SysLibTest/temp/ab6e54ba9a669f76.pyi b/Test/SysLibTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/SysLibTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/SysLibTest/temp/ee084e9fc6ee413a.pyi b/Test/SysLibTest/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/SysLibTest/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/SysLibTest/temp/f3560b99de458aec.pyi b/Test/SysLibTest/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/SysLibTest/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/TestFBProject/output/4fb8940ff5ab1022.deps.json b/Test/TestFBProject/output/4fb8940ff5ab1022.deps.json index f02d7ee..2a27f59 100644 --- a/Test/TestFBProject/output/4fb8940ff5ab1022.deps.json +++ b/Test/TestFBProject/output/4fb8940ff5ab1022.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/TestFBProject/temp/dd3002730623424b.pyi b/Test/TestFBProject/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/TestFBProject/temp/dd3002730623424b.pyi rename to Test/TestFBProject/temp/14d33679f7fadf1f.pyi diff --git a/Test/TestFBProject/temp/_phase1_manifest.json b/Test/TestFBProject/temp/_phase1_manifest.json index 23941b1..b20d9f9 100644 --- a/Test/TestFBProject/temp/_phase1_manifest.json +++ b/Test/TestFBProject/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestFBProject\\App\\main.py": {"sha1": "4fb8940ff5ab1022", "mtime": 1782110087.2169445, "size": 5059}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestFBProject\\App\\main.py": {"sha1": "4fb8940ff5ab1022", "mtime": 1782110087.2169445, "size": 5059}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/TestFBProject/temp/_sha1_map.txt b/Test/TestFBProject/temp/_sha1_map.txt index e397858..a0a3fae 100644 --- a/Test/TestFBProject/temp/_sha1_map.txt +++ b/Test/TestFBProject/temp/_sha1_map.txt @@ -1,6 +1,6 @@ +14d33679f7fadf1f:includes/testcheck.py 4fb8940ff5ab1022:main.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/TestProject/output/3cd87018ba1e76bc.deps.json b/Test/TestProject/output/3cd87018ba1e76bc.deps.json index 123a27c..161ab81 100644 --- a/Test/TestProject/output/3cd87018ba1e76bc.deps.json +++ b/Test/TestProject/output/3cd87018ba1e76bc.deps.json @@ -1 +1 @@ -{"atom": "271ea3decb810db2", "vipermath": "3f7c5e78d8652535", "main": "49cae05490a513cb", "stdio": "6f62fe05c5ea1ceb", "zc.test": "75583f20a922ab2e", "test": "75583f20a922ab2e", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "config": "cfc83b830141b00e", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "testcheck": "dd3002730623424b", "zc.class_test": "e5fb16127bce8f68", "class_test": "e5fb16127bce8f68", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "zc.logic_test": "faec3233d98371da", "logic_test": "faec3233d98371da"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "vipermath": "3f7c5e78d8652535", "main": "49cae05490a513cb", "stdio": "6f62fe05c5ea1ceb", "zc.test": "75583f20a922ab2e", "test": "75583f20a922ab2e", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "config": "cfc83b830141b00e", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "zc.class_test": "e5fb16127bce8f68", "class_test": "e5fb16127bce8f68", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "zc.logic_test": "faec3233d98371da", "logic_test": "faec3233d98371da"} \ No newline at end of file diff --git a/Test/TestProject/output/49cae05490a513cb.deps.json b/Test/TestProject/output/49cae05490a513cb.deps.json index c4c0f68..5334f7f 100644 --- a/Test/TestProject/output/49cae05490a513cb.deps.json +++ b/Test/TestProject/output/49cae05490a513cb.deps.json @@ -1 +1 @@ -{"atom": "271ea3decb810db2", "test_numpy": "3cd87018ba1e76bc", "vipermath": "3f7c5e78d8652535", "stdio": "6f62fe05c5ea1ceb", "zc.test": "75583f20a922ab2e", "test": "75583f20a922ab2e", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "config": "cfc83b830141b00e", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "testcheck": "dd3002730623424b", "zc.class_test": "e5fb16127bce8f68", "class_test": "e5fb16127bce8f68", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "zc.logic_test": "faec3233d98371da", "logic_test": "faec3233d98371da"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "test_numpy": "3cd87018ba1e76bc", "vipermath": "3f7c5e78d8652535", "stdio": "6f62fe05c5ea1ceb", "zc.test": "75583f20a922ab2e", "test": "75583f20a922ab2e", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "config": "cfc83b830141b00e", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "zc.class_test": "e5fb16127bce8f68", "class_test": "e5fb16127bce8f68", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "zc.logic_test": "faec3233d98371da", "logic_test": "faec3233d98371da"} \ No newline at end of file diff --git a/Test/TestProject/output/75583f20a922ab2e.deps.json b/Test/TestProject/output/75583f20a922ab2e.deps.json index d749fae..30e0773 100644 --- a/Test/TestProject/output/75583f20a922ab2e.deps.json +++ b/Test/TestProject/output/75583f20a922ab2e.deps.json @@ -1 +1 @@ -{"atom": "271ea3decb810db2", "test_numpy": "3cd87018ba1e76bc", "vipermath": "3f7c5e78d8652535", "main": "49cae05490a513cb", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "config": "cfc83b830141b00e", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "testcheck": "dd3002730623424b", "zc.class_test": "e5fb16127bce8f68", "class_test": "e5fb16127bce8f68", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "zc.logic_test": "faec3233d98371da", "logic_test": "faec3233d98371da"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "test_numpy": "3cd87018ba1e76bc", "vipermath": "3f7c5e78d8652535", "main": "49cae05490a513cb", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "config": "cfc83b830141b00e", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "zc.class_test": "e5fb16127bce8f68", "class_test": "e5fb16127bce8f68", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "zc.logic_test": "faec3233d98371da", "logic_test": "faec3233d98371da"} \ No newline at end of file diff --git a/Test/TestProject/output/8e0d8fdba991b3b4.deps.json b/Test/TestProject/output/8e0d8fdba991b3b4.deps.json index e76c1ac..92edd09 100644 --- a/Test/TestProject/output/8e0d8fdba991b3b4.deps.json +++ b/Test/TestProject/output/8e0d8fdba991b3b4.deps.json @@ -1 +1 @@ -{"atom": "271ea3decb810db2", "test_numpy": "3cd87018ba1e76bc", "vipermath": "3f7c5e78d8652535", "main": "49cae05490a513cb", "stdio": "6f62fe05c5ea1ceb", "zc.test": "75583f20a922ab2e", "test": "75583f20a922ab2e", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "config": "cfc83b830141b00e", "testcheck": "dd3002730623424b", "zc.class_test": "e5fb16127bce8f68", "class_test": "e5fb16127bce8f68", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "zc.logic_test": "faec3233d98371da", "logic_test": "faec3233d98371da"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "test_numpy": "3cd87018ba1e76bc", "vipermath": "3f7c5e78d8652535", "main": "49cae05490a513cb", "stdio": "6f62fe05c5ea1ceb", "zc.test": "75583f20a922ab2e", "test": "75583f20a922ab2e", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "config": "cfc83b830141b00e", "zc.class_test": "e5fb16127bce8f68", "class_test": "e5fb16127bce8f68", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "zc.logic_test": "faec3233d98371da", "logic_test": "faec3233d98371da"} \ No newline at end of file diff --git a/Test/TestProject/output/cfc83b830141b00e.deps.json b/Test/TestProject/output/cfc83b830141b00e.deps.json index 0705eab..b16cd38 100644 --- a/Test/TestProject/output/cfc83b830141b00e.deps.json +++ b/Test/TestProject/output/cfc83b830141b00e.deps.json @@ -1 +1 @@ -{"atom": "271ea3decb810db2", "test_numpy": "3cd87018ba1e76bc", "vipermath": "3f7c5e78d8652535", "main": "49cae05490a513cb", "stdio": "6f62fe05c5ea1ceb", "zc.test": "75583f20a922ab2e", "test": "75583f20a922ab2e", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "config": "8e0d8fdba991b3b4", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "zc.class_test": "e5fb16127bce8f68", "class_test": "e5fb16127bce8f68", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "zc.logic_test": "faec3233d98371da", "logic_test": "faec3233d98371da"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "test_numpy": "3cd87018ba1e76bc", "vipermath": "3f7c5e78d8652535", "main": "49cae05490a513cb", "stdio": "6f62fe05c5ea1ceb", "zc.test": "75583f20a922ab2e", "test": "75583f20a922ab2e", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "config": "8e0d8fdba991b3b4", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "zc.class_test": "e5fb16127bce8f68", "class_test": "e5fb16127bce8f68", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "zc.logic_test": "faec3233d98371da", "logic_test": "faec3233d98371da"} \ No newline at end of file diff --git a/Test/TestProject/output/e5fb16127bce8f68.deps.json b/Test/TestProject/output/e5fb16127bce8f68.deps.json index 452f0c0..f3ce520 100644 --- a/Test/TestProject/output/e5fb16127bce8f68.deps.json +++ b/Test/TestProject/output/e5fb16127bce8f68.deps.json @@ -1 +1 @@ -{"atom": "271ea3decb810db2", "test_numpy": "3cd87018ba1e76bc", "vipermath": "3f7c5e78d8652535", "main": "49cae05490a513cb", "stdio": "6f62fe05c5ea1ceb", "zc.test": "75583f20a922ab2e", "test": "75583f20a922ab2e", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "config": "cfc83b830141b00e", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "zc.logic_test": "faec3233d98371da", "logic_test": "faec3233d98371da"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "test_numpy": "3cd87018ba1e76bc", "vipermath": "3f7c5e78d8652535", "main": "49cae05490a513cb", "stdio": "6f62fe05c5ea1ceb", "zc.test": "75583f20a922ab2e", "test": "75583f20a922ab2e", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "config": "cfc83b830141b00e", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "zc.logic_test": "faec3233d98371da", "logic_test": "faec3233d98371da"} \ No newline at end of file diff --git a/Test/TestProject/output/faec3233d98371da.deps.json b/Test/TestProject/output/faec3233d98371da.deps.json index 1ac0a97..cd29946 100644 --- a/Test/TestProject/output/faec3233d98371da.deps.json +++ b/Test/TestProject/output/faec3233d98371da.deps.json @@ -1 +1 @@ -{"atom": "271ea3decb810db2", "test_numpy": "3cd87018ba1e76bc", "vipermath": "3f7c5e78d8652535", "main": "49cae05490a513cb", "stdio": "6f62fe05c5ea1ceb", "zc.test": "75583f20a922ab2e", "test": "75583f20a922ab2e", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "config": "cfc83b830141b00e", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "testcheck": "dd3002730623424b", "zc.class_test": "e5fb16127bce8f68", "class_test": "e5fb16127bce8f68", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "test_numpy": "3cd87018ba1e76bc", "vipermath": "3f7c5e78d8652535", "main": "49cae05490a513cb", "stdio": "6f62fe05c5ea1ceb", "zc.test": "75583f20a922ab2e", "test": "75583f20a922ab2e", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "config": "cfc83b830141b00e", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "numpy.__init__": "c3a6aed1f1fb8b1e", "__init__": "c3a6aed1f1fb8b1e", "numpy": "c3a6aed1f1fb8b1e", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "zc.class_test": "e5fb16127bce8f68", "class_test": "e5fb16127bce8f68", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/TestProject/temp/dd3002730623424b.pyi b/Test/TestProject/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/TestProject/temp/dd3002730623424b.pyi rename to Test/TestProject/temp/14d33679f7fadf1f.pyi diff --git a/Test/TestProject/temp/9474791561654346.pyi b/Test/TestProject/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/TestProject/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/TestProject/temp/_phase1_manifest.json b/Test/TestProject/temp/_phase1_manifest.json index 77e537d..388d716 100644 --- a/Test/TestProject/temp/_phase1_manifest.json +++ b/Test/TestProject/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject\\App\\config.py": {"sha1": "8e0d8fdba991b3b4", "mtime": 1781111175.0269876, "size": 445}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject\\App\\main.py": {"sha1": "49cae05490a513cb", "mtime": 1782949786.0815294, "size": 8223}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject\\App\\test_numpy.py": {"sha1": "3cd87018ba1e76bc", "mtime": 1782828269.700148, "size": 40140}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject\\App\\zc\\class_test.py": {"sha1": "e5fb16127bce8f68", "mtime": 1782266207.4312654, "size": 6472}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject\\App\\zc\\config.py": {"sha1": "cfc83b830141b00e", "mtime": 1778402243.1661563, "size": 531}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject\\App\\zc\\logic_test.py": {"sha1": "faec3233d98371da", "mtime": 1778402365.7843194, "size": 8848}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject\\App\\zc\\test.py": {"sha1": "75583f20a922ab2e", "mtime": 1778401973.4865518, "size": 8976}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\numpy\\__init__.py": {"sha1": "c3a6aed1f1fb8b1e", "mtime": 1782949786.0890937, "size": 39111}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\vipermath.py": {"sha1": "3f7c5e78d8652535", "mtime": 1781532528.2518907, "size": 15412}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject\\App\\config.py": {"sha1": "8e0d8fdba991b3b4", "mtime": 1781111175.0269876, "size": 445}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject\\App\\main.py": {"sha1": "49cae05490a513cb", "mtime": 1782949786.0815294, "size": 8223}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject\\App\\test_numpy.py": {"sha1": "3cd87018ba1e76bc", "mtime": 1782828269.700148, "size": 40140}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject\\App\\zc\\class_test.py": {"sha1": "e5fb16127bce8f68", "mtime": 1782266207.4312654, "size": 6472}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject\\App\\zc\\config.py": {"sha1": "cfc83b830141b00e", "mtime": 1778402243.1661563, "size": 531}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject\\App\\zc\\logic_test.py": {"sha1": "faec3233d98371da", "mtime": 1778402365.7843194, "size": 8848}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject\\App\\zc\\test.py": {"sha1": "75583f20a922ab2e", "mtime": 1778401973.4865518, "size": 8976}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\numpy\\__init__.py": {"sha1": "c3a6aed1f1fb8b1e", "mtime": 1782949786.0890937, "size": 39111}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\vipermath.py": {"sha1": "3f7c5e78d8652535", "mtime": 1781532528.2518907, "size": 15412}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/TestProject/temp/_sha1_map.txt b/Test/TestProject/temp/_sha1_map.txt index 334c60d..3d03e0e 100644 --- a/Test/TestProject/temp/_sha1_map.txt +++ b/Test/TestProject/temp/_sha1_map.txt @@ -1,3 +1,4 @@ +14d33679f7fadf1f:includes/testcheck.py 271ea3decb810db2:includes/atom.py 3cd87018ba1e76bc:test_numpy.py 3f7c5e78d8652535:includes/vipermath.py @@ -7,13 +8,12 @@ 7e529fe7a078cfef:includes/w32\win32base.py 8e0d8fdba991b3b4:config.py 90c53dd6db8d41cf:includes/stdlib.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c3a6aed1f1fb8b1e:includes/numpy\__init__.py c9f4be41ca1cc2b4:includes/viperio.py cfc83b830141b00e:zc\config.py -dd3002730623424b:includes/testcheck.py e5fb16127bce8f68:zc\class_test.py -ee084e9fc6ee413a:includes/memhub.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py faec3233d98371da:zc\logic_test.py diff --git a/Test/TestProject/temp/_shared_sym.json b/Test/TestProject/temp/_shared_sym.json index d2c1348f3b1a4d68106ba8b30f6ff1e3eb903c3c..8217c2e2c91d30017e31d5e94f13bab6f70ce92a 100644 GIT binary patch literal 555124 zcmeFa37i~PbuT=!X4k%NmgNmwUJ#lYZQeDTq;bvkjAxN7d+esByLxV4^>mMW(c*`| zCg3+kn!TNuRR7O8_ug~QJ?DR(YJGN9%c>Uq?{aQ`c5Uj?!dxO2OsjJ-EtlOI zi_RSgC6d~KDdYRo=C{|_pWd9i?dcr;+s>f*k5k4|TQs$pPUf=L7JkJkH6D&>sRQ}{ z52z`4L)YN+rA2Kd9!ca1zi4$Zoyui575*Xq#MGh|%4ItXUm8Cgz}I#M=ioO5)9^#N zK(-5B8Vn^e@pMjU$#$Jr@hP54=k)Aad^n$osp%+S)3e=SHLVu@cAfEL|7$gwR4)a? z(S=m*v0Szzl};qpd3?v3Xet=V#6v*@sAo4=Uk4Y}q-y?jtD2lYn9H`FPejAHXL4$G zqxnPl1Hrhupc%ij_%D-MI+Kj&*jiJTYy;a2Um-rWExR5i5simpnJ|bioy)cj4kQw> zqQKhDtFa7zvNn`LDtBA9H309(Wm|IDH6tmIbTovLgAdy^lA1_F<7o{)dFM!KDmow6 z!tizLRP;$Lr*vlK*mk9b?av5nbo(;~;Tv}%gQFpXA}G`_Jt7L9B1 z1b&v*2x=d`w`L&`&crlB8~EI@pe@X4NwnVVCU{S1@lu*4;=#lm*FtDNUGU9CHFVAp z*V?caf!`UlB;TdQGp1(ocXb<2g};M;7>(mcFa%|M6`V_iFM-C^nSWuKPQVmSJQ2UN zkjSLq=hr9mzY9bihj{^}xGt=PVro(gn__|YtqYk3WPHQ;nXUy8MKBfx%V*u$&J$p+ zdEqE6ug*>8vK!z->LsCm6V&~!anty@Q34SV-PG$@Nbif0C82C}tQYIcv z#Nq31_!{*C5`iZ)1j8_h z|7j2ar|>hj!}roj6_kYf2V=cQXZPytJ}}w)Ss!~qXU7AqUuOdWHfWd#8)hf1sq`TH zgran@(d=DAchAnGK-;s^T5=&8&@N_DvqM_yTspBhJDpVHsfkO2v(}uO4Z$m;>C}P6 zOVJz~gWm$?#U^z2kj^FpYzn?H9bhv$I~`zW0_*lKj4!csI*aLSL1%HDB`i#!&iwn#HPmrc2vnb@S#t$qH^Sm$PFZ%Vn5nv!g3s`KyUp z$4OZ_owZrf9pHbQM!&{#*jR-<1;CzKR_IC8 zsI{+L(e|_%Ed8S%TDsc~VOvmGQd7ghh!zilTO(iw#r4EkK&;)u={K>jx-B40tMIMl z3P=AJJYrwrwRl?I?HJpM6uzsl!mF_h>ZMdLmI$2-Mv|J?EVsE0M-CO;23-4nm!YQP z!%iXtC@%4E5b~8@&pFGx*}t1e`Rn_q$HztngOkIf{SOZh32p4+$09f(S9&qv#S0&F zK>N9`#6v*W)_E}+={tPn;M`qzg|$P6kEvRyqvG-wtWzj&8DkdAY($paStw#D-#m< zPp^T)2U$)+MkGyWsWeTz^))#~UN&9Z@V3RDB?U|HOJL9-YUiHU;H75F|Hv^g8Q74=R1~Or&Dsi+i zY3|W|74A{jf_l-a_Ho<=?#Q+d!WvlR{I>+>zw13X|1DJ{r1KxGrab>;y9--l%2_e6 zC3G5F!jVJE?Fr_I_yxTubQ+#BR7N=qgZ~(`<91kdHi{+3`m`%IHo`xQ2Ix31R*+u( zLRLQij2rUiZ~|nm{#`++;+u~LGcJzjGRwb9dN5QK8QH?sQiPjBcLM7P*?O}bJ9ZUy-8`p{-4&pl;Sgdo@n$-U zw42H%jvYW|vF!j-D?MIKS@Ek!0&>cc&AVX--ax*p9UM4Cfl~Uq=)xk05BK&SKH4)E z3Ta2@LUScq@girK!u`OKK`7{!DclYco0y)IViJ(e4R`t1-=1?KT;!Wg!9j68UyEOQ zL7rG0YwN)HxSXPVck{T(M2W#sDwH#_CP8-X;7r^kS;ZU;N3HgmcriXogtr6nN;Bd0 zcF1m~JY<5#ASn^(Rty5mnY8N)hzA++2Rbc!GbUgRlM(^$K)}+pyrBfMo0=mgYK)c= zp>90`@nAV>HZzNQj=+BDq~QxDR*aMqVQm|d4Yse>1?-Xub_*fchoph!9T-G#(&?|5 zFfsdpN~hC(g(VNVm};?L?rXBa+x~vh7G0@3t;|*hGurFe1ISo*o~O zvo5i(IGXNXm=Jf+L2R2kH9jflFo9K$ERl5ap#I8)iZMMRZFU+^rERXACR#V^{ho<; z7aiXA8Hu_rI*e6x{BsjC5Ry>oxXZ*WP01Sz9+UywP1)-^jMMTSI^dn7efUG%XkLrh=xcBR^;&-%E$QRi2vL3^hBexZebN9UaiN8F@&H z$3J(Yo-`5fBSd^gnj^_yfs3(|zZ^1QUQY+J(|{>$k?uCCN#M-qwmhdy#5d3(?m)dt z1KeSp5!}$e%0zo3A=(p|?GyyhPap|4UmQYaL^(u< zdlN5IZ^+nkph=^lUf0NKcc*dQyPX;@lqt!?iv_uk_Poc$dj}ofPSc)yCC%UNyg~Q6 z&EPvt#COsmZiV|kNob7=Yd56#nMhwuhqMil%37&9@NV99oeG#(571(jwMrRSUDv3f ziS;G4SY@qH23FVgY0<=r#8pK5Pa9s(%bBkHS1=9S>E!;j3A2X|W;?=^G*{gt6mK+f z_7dZiG*8_Rux~SQ_7UThG)LWUXy0q%JVb}H181kS6Kp4LGRIuQO&>Sm9;SoaY0Oe- zc)RkOs$0bAizeVBw1E41LzXy=O~_T|@vSE0dx#-RoX95RDl_?*3He?+ z$ZdERBF9w*Zb{6Ray#0Nm{^gpjp$g=j#wr6%Mf%#u&#&OM@+Q$6Qh;nHRsW~9&gW? zXdj?MYvjVob1J*?rtG#Oz03rBoDOi8Y0MILq`W=5L4K_Xxt|!a)Ex;SSJ{!?VnQCE zgM3X?&f3g}(PwlDW4y=2I7o+abyU)t%ul<4{HO_Xh!UivrI^pVf&82aa+ngNtmwr> zH;~^nL7t!kc}+&rlyr?O{=md|k`CkQjI1f?n)vh|CdgBiAZ1NS*QA&Y-NwOngc78z zDd}4BvCjngARWkdBf|-fvVgiees3^=K12vKBXf?rdVg;2P+WWCC?{ zjeckXJwpeyYcZV+gIg*~r>;<2))=R?hv}ep!omw^B_V~V{YX3wPQHtSztO~dmJV+h z?lckscNxV;?uc(N5kEqQxZ^?yV$8A>+%b3tL)b3*?KROpN{AN0N;}p(gdroR(!W9D#yt0anp9`s}+TiIdgqp*N9r0 znUA^wuXwwn5E5uwVwc9F$scnAUixZ9A!O0CWG<6TlgHhFSG-+O2)Q&ZvCAV~bPJ{z zRyOn1ibBY$xi&w?<&kT;R&8a=-mNHv1e?~o8^E(!z@2}$q7X7}TDavAZ}RuL&F`{z zD+(e1=7zkTV|5K?aE*1H=(`dM(^^Y2y^Li$f@k&(&*%Kwv_$}3;5D1=m?R(Jqi zcxmCNtQ+`>w<`)EF{t(ShVX-CE8easgj}K4Y;OQ%XkoVJ->oQwq@6hf9!>*W&3M!8!WN8#jV zySs@~8zFJWT*-EW_ z6<#f?V%e>xtl-Dx->oQw%%wKmvQ{{^5;Hq)bA2OZF}2~AwYs@goY`@kYa1b>sfF9% zU6Ye7;#PoGz@2}$q7YJ?S{@v}Th;`3y+SX4xuOt~p4wk7Yl^$orxkox6uUXc329L6 z$Yo7(w|cb_>&4Zg$s6@`#y)&72oQ~xC^!C#pBgq*8({1PYs@s;2&%zi=wR?D-; z8z@N!cegspf@hz9x1tb|v07dpzFU@O?^ZTh@baveD+(bos~x#4&)%(!vIM#5*%Okq zT05O#Z_;+USGi5~%GWCjA!Dnx(wRml4gRxk@EzW-D1`K__V-KN>E5*x{Dqy4kju3z zpG`+i>6*2_SWyU>U9Dm|a)Q@F8K3cHMIj`5Ent?lw7bS-OWv#~guJhXH_HmwxW;5l z-mEBuG_cmBqGp3F%w~MCq7ah8TCyhRhAqryENeEqhG0wHtSE$(v4uCw zn$51k*OE6Y3L%56<&#U~SLJTpVFjPudby$ya>`mUXPMNp+>K(Z5OXfPT~P@6Wi5{s zeDOxm%w`?luPB71vzFBZ)q*tU4A-oI@|Pn?dauAc~@7q^7V>BNPTO6y}U{9>eN=gUQr0?aII}tCRyyVo~`wAMIj`}wbr|a z@Z=WOyTaQQg^)AX@+^T{wGq_01<%&@enlZ9(zPa?RC-yy6N%BBSi~w{uPB7Hx|a5F zyOGDP%Wrdo@9=&_Atc$gX1+|WU4FM4`ii$J3L)jL_4bA^?-o|Q!rK*vkcHQpc8ww9 zEqHmw*DDGkGp`-JJTK4nX1Vh9ibBZNYrVcPq`d{*7hkU^gbcpcirXL}-@<-xd%vO( z()yO*muLL0RbLM8R}@07-;(#sJLI@lemT5fQ3wfuH|6ivP5Yzg0nR#o07W6B1-A0Y zsM&!FNo4sKD~d-v!OyO0S=EC7>17p6#&vd1XEB{E=q#?Y#N}M(ncQ4vF57PE zUrJ?6z{$mDeQ^2OQdfE35(@{Irn86%P_GKG%>YP;kN?dkqxlK2O=ZW2?w*}VY01>= zw3b|m2DFQr)a;O!I+so?&Q2%QcxvL(ApBh_Z44911lL08*|fH>IC~^=q&K1+JRCZ# zsXZZW?!e-uXpW76_yU)6Y(i%b>1;B>i!ntF!yy zcis=LdO&B#1FV0E4OCrj;3vJXtEy`ayJyMalj+qyS(ldvVSczJmzBOFQinzCFEa__ zu_wp3Z*FOMCZ|a;5Pk#v@}{+nHH4Ot@-1VSodi>Zt#vi5y?!s@h7N+@GpW z2J-e3nL%4b*bXcgBX0rGyRa;wXc&-MT-Zgd zzpZ8`><)tt-~G6O=ao+5yt1nDywcoj2zCb`vX%BoB$i3BdNvcw8vNbF`&9$m1`t_- z!RDMeKpep{X}JooHHqUrLtH)jW(1>+SChuz%vf~sy(U>aIcCzBoDH+_UXvo87IPhk zD`OixXq}$&3mxADArpav0$~`+NUKX6@FEz+?>C}Pd554h7R3j}BtaN<$xFhE;0upb zk;FMMNf3q^jMN)geY^-Z@Yj`y;*G_p@=yc+B{9Jeo~n(yuEYW1GnMlq@eu=e&Bq18 zV`P5g_xdo&zhziM{*1t%7n1|wvB{D{-G?XMz6AsI)>7G3e1ciA)_Ag{vH_l)?^vn^ z83+#uc_*p9pkXxJQ5i#V14zY2Woe(-1RlPl{s#(0O7k7(lx~y+sP-C$~NC;ql zt%IYV5nZl!^kZMGa;>Da_z{5I9ILnxfxgCdB{bZ1Fm$*t96l1BI~G3F6N-43&`|vj zqdg>UQ?}Ss@yenHFUF0>s=+4T#vCu|t1dOzPkCyqM>!zX&7vcz)o&Nx(dm zukAHO7&fS>P&68hB`#>mkeU+n_Jok~xoxoeD+)A(sP7zo=;)!Ncl8`T(sShSp}s>$ zygNr%znaWTF0;5uF1eH`xkIoIF5s75WO7#ryDo1gS~?Bo8+6lw|AGk>`$rH#Z4XE1 zqk_3PViV!bCPwTML4>i3X&1?1{)Pz?+d)vlOoYyXoayh;sj$KdeA#Y8ggNfqu3bT`0o8lgpm78Z$p0O2C-8hn5yWRxgL z8{j{J+HlHJ%9`B(j3^Q*z9XeB0MUaO>42~wz+UX;`r*1@*19-cIM$%{K!w_A%V%rW zIYv{-bdFAdjM-j`6W~vNXA|8{X9(>J+Csf{V9PZre7Qn5(6<0*3)o3$0eJRjUatO- zaAXufR!c(j4*+E@iLo~UH526y;OkwGsLDKHyD*mt9RHDhiD>7?gCDuG=g)Sh*?t|d z))&Q&`@$~1ctY9L?B!oisC97eQd)fh-hxMGB$t;F8%WDFzp&jsZnSdhwHIj6=SDgU z=`<}wuoa%QGBm_SuI4r3W;zQn4uExD{n_+i_;O_jK+$@qrd}Uzp|g$-SRWP==f!Tn z9hL_g^SGLqhW&KPZ&lL?VD?>`57cg8o8c>ih;UoLnK{)Gd<{25egw!l0(3i_p4&jr zv6y5<1H~0K(W_2z<$4`x8P*EY`W$Y1jP8Ae#F;fm{_mtyHcslgxR+OO?F+j8W=Az$ zgA4C|^;?6kE3bHr7hlmgdk5%r-IiL6Me95MIc9ZPcRa1Y!i_ZCRRg^g3w)&=T;W%J z2kDGpJ4E}U@%aM{D=)~pegdQ9z`MX_^~CwoPtky4figMRK7pbT77%PLwFl}tf~?E? z6@{>}0E(!LIYFJ0j(y=vUaTmDwFc19$9Q=IN)E7_RQbCVg|Gm@dVd4z5DM6B?^YDT zs)WsX**By(A?x^dMIkI!fJRP+?KPri0lP?5yj)QTOBgK6Z$KqO!SZeIRusaz25Y$m z9Z1P|wu;9811mOaFP|sO^|wnxV#+_i87^)FB!NT%L>J&tK5tA&_@C4?cs>H6D4dP> zsF+{~Q^IW~;%R0$Pl!P$%zd^&uQwUa@xW}Y6Td7b3BqLH!t9Wo6U_fmOcaDUvIS8{ zPL<`~22m6jivJ-d7{Z)UYqm&B9p&9S>=IcAPXc=iVGgAw5%e=WO{L@qOC-@JCJDl{ zLffSAS`?>CL~&M36oi>}HlqN$5V~HmZcwXkDlZq41Y!1>T@n(L(D-kNNrEsV%aVk* ziCO$p#?;7%<@ui(PnOT|88M*{CLuwecf%w1Iv0umbBS1fTq2gAh>3+TGsk8t^&Vae zX%{`Y!k0j=eeF*BHoFg=1h!eiY!qvAk(ZRhPn3vcL`)=vIT}EMX3QOLQ#E)@3^-xZ z0#L16z`e{};I9`$PI!ZFQ@Mv1`TY09fD>M4TPl}(tIfX-f+!xx{#r~dgcrP6(E%5{ zLJsB%@@d@f*6WDa)x?aqCb+1kQo&Fn6BkQn5JJh1?1BAIQ6Mx~7b{-Rp>SW{k)wA- zjz-jQq{l;c`Re!GYl0Cq8Y7q5NmFXrqo*Igl+TE_CYVm7)tF%2^5X&^0i#ImazdAk(OJ9_ae#siWZDtF8k}UnqR+=)s<2b83%v^vGPuI~wom&OmE49ueyx=dT@g zuN`~n){fO$JS^l2n8$d3F}P1@VfRCU!vi`y9$@`dtK9d}>9r%3Sy)h$Vl2YGZfifN z?IYCf;6!j{`oyt1=50XWD2hF=ojjVcfA~3@f*CL!U^6;99bjhy>|vdqeJsZwg>TQo z{~u>_ETpq=fN44_ZveN%VmezWT{N@XfY3Z`_%#O_5^!|=07eYbQ4RqSDO3*|+NIEl z0Ah(0>>of;2xE$NDKsLwSRw`c2T&BkfMcZ;gpYSZA$SKVm>)n<2&0i3itB>MaY_C( zhE{7|_z5F)n~LC5UdQVAJH+4ds;(scJoG_BJzKC3S(mS5Z_&)Z47UYgHLW@;tO;mkv+YoeH=kxM0ub)6QUl43UO`aB ze+q3~=ty?5ogo!E%|+8Lp+)g7GcPD9v?VUYHJ8Zw)!t1b!zOh0kX{>I_fkdNPj`y@ ztvMfs#<9`Ffrc!d{C#_^EIIyr_@z9c9eJS6YsoT{e&YKB?tVp(mvglttZDbVCOAV3 z?#VhgzrM)P&|&T9vGB1YhkFnA9WLAaR=Lb~{y|7fc59$>)v&8&S7n^l$va!!;aBY| zR^N)>0k5Uo_kh^9983D4W#pNoostJk-^re&*Z8$folp|6$s;E z9P{?;tku8Ph0*bDYl)q6+~YdJ+I&*e>QXnKh0p4%S}3O$1Ghw~UY)8lb=p_6aOyP1 zsHxN(O8B$6)_Z@awNYT<#>g|3n$v21g%JL17M{%*WG7N{tLm@XwWslTG@bE+flSZ- zvfVH}l~6=CVX0`dNF6TF~1=h#C)pCpYKOcD(;_*YsVMS>Ae-4GnX5W}!mXk}+a`Jk(yWbAQ^E-65Q)jz$wp(X=pjLQq4Ou}BlNw)4 zmlY&%gvLHwM9S`psG)Qs8CAs?>he4FN;KXaDR2VX#?D$q+Flb%EX+mYsxXI}6&AG= zZs@-!XFd9XQ33s9e=REgL*n#8ChhBAAZfdjmBOP7k^AWMzj`roK`6jt&HKCym!J0j zb%?k__W+&NTS4n$MP|O*t7c^jEcX3`Y7fo%@s~#3au3q!xs6>~Oo#>A{Q2$m{2nIM zdnA@fi1n%R1FUriSWnU^x;3N;63F{{u3OI|bb4+}LdOi30zyA;#g!b;qhpvtsOWSu z6AuX;#QYgu_lzE+Q*>)&At5%Qeb3Bm&upAd?QN)b;uAMqsC>5Sg$h=gdvT%S-d_sR zJiX{1}fuL75I``I@CxGnp*{V1WLafkL3 z%NsPKA0t#WR^|JJA`Mb>kW$fp<(EJk6_0#wl~U1u=~v?v9U@fpyb8^zd}pjNr)Z5% z(W|wjSY*^cMAvh%dwMw=tg%cS$TIH#^uTtT{LozPS?n4HCOLQ#GKY6_Equsx_^-R=zoSmjZgJL;I;woL^2K9lT%2KHX^$@XE z*SbRe2dPkd=qKtrSEyeO9$fgdPyd1>1Ma1Vy51G)cVt2Bz_~gapq{E5T#^3$fq{Sj z*hWvNz4s#@nAz?<)OD!T-r&?jlhgD@yvYsk1ONBYe|_Wo ze{jxwylagmXnkIwGZ*?mA- zc0U|Z9?;qG0PEM;K!6Rp6wVNKm9xS3yuTcOr5Jp|PHXFm+V`}34}Yf^bi(dqHt3!< zwBer?gHG6y%LW~;IfNWd$J7)4zr>&ucBxulGu8~$rzvUrh;iyIJkZQZiZYkBea^>_A{sd!5wf{Ph6#nOwdV0e_PibV5>oo7%ml=jR^~ z!%j$4Z^K?MWj+5&iQd01hMkbNeM`~F^Mt{j|67Rw{#{G}gjD9+iURP8)SU0T0Vlt4 z+J|0`HyTfQ`W5~ncoK;25t4h`B;pm#H$PD#k&zOKjEYHwknY;HFUTam=1+)8f{+5* zwp2q0J_cG08(tL;iCy@PzDsHX{J=VhLT& z_r%xVB;*YcGTzy+d&_;t2gR@xvcTDl-eW#E9uWgi$c$zKk2Bswjx?@|fhS}Ovw`=R zH;n(b7%spm2A+^<$p+qI&LzGLSRDk;y&B!2-xd+{ zl!u5P6N4_!$Wt>xi+z*#l#+)(Du$hqoW^GJb<@<8a+mN|h=C_$Yq2TbTizD_b}{UP z3??@0u*-Q^C(S=8hMkbr!-gF;IWMt)R}4EL(}iuqd(3&k*FasXz$Qn?{;;ulHR?4F z1V12#o{$m2rh1RL5%@!5;0aj*Y~VfS3*c!n@PrldCEz`+jpzT57xYHz zbj0iQ8c+~!(>FqHg3|EK#g*Muax)Z(SAuSWa`7_I%~3dB2D&*)$ZbWLIH#MUn7mBU z%~4jqqjd3Zq5|`-0&-%f1c;(+)#aCSwUw4Hv2cKCI*aIRUT3VpPUF-@A-iR2cyMNN zWcqBde|mayWMF1`c#0V9b!;>{K6Ll&OiD|pW~a5}LNuUV%%obQQfXtDNG7-zO3$XXg~i#U+Tq^2BHB^);L&5Dh!#1pcqy8*S~~8}cEm@u_ zzY6r9e57jsNnKk1Nj?cL_LQ4>iA8nBb#~5C)mvkWQ(7pKjHWMvWJAg5V%n__JNs%C zDm0}9xX`vMtJn^m?bO*Wo$c1y9w0^A8>ojOjemev9P8&s;!Fc+oKoZAnC5KsT$o6# zK3Uw@NiYUIwa9P9*Ly1 zw6ksUFM<8IErnOl&d_bjpo%RthaB43@OdrnVheey&}1f*E>eX)m~B7R9~c^iAkM)6 z>$#2f0)5UQogLQM5$NiGY?0f6RL9$$5?-OeFRhbIbY<(e%&npG#K`FI^vD=>1Z;oB z#;`7YVKi}JNKI?g(FGS*0CtBrz^?4h5-V{%SR!=?vg^Yaa4o1V55Ba_{vfAoJExU} zO#APiIy*HzJl232fMxxqu2I{CvznT8-UY$(U$Ly^Z5@@?{Dv@zn6q>{cIxdVw)d=~Lytwc_(g=A<;+4qynMUdyseSA^=kL1{?nu_=qud+V zX80;_Ik%r}YmOTLiJIo~5HN5QZJjfk{~=BW2Wocnjf#SuLhMQwvF1VsLG^3p_R)#K zscAVY7c}P@WNPyI+jEX!e~Ol?DC_9Jb^zEj($H=koQbER^KmUa#S+Q18|>~E8?do& z2$7E0p48H#YAQXPOuD5EtjMAr=Ysep8^2+*`}JJ@`eg-8+m@>JIjH-dr7(@ECgKQ` zX58=~P#z(w%s$Tu)IR>(;qkX;0v`Sw|@`=NhT5}u2aXMpIGZ;&xv}##1%d7A zSjkf1kf+w%#xX=^92>zn#uDL7EWcdz3!QIEts_rz>}U@>T)d%s(Da3CO3Qdb7{NoTM{^ttX-}BcFRZQRm8F#V2rS z$Ok9z%W9Dc@xrke#2HjtP_0$dmBxgUv$y=i{#Ael8`c0xrdAI{Vo1 zP)18$ngGJZL~=omhqS>&2I~ifOk{=5g}-df33-|i)0xGta!X>)R z?QlL$XBv1iosNdi8GeM2eVAkjj$sKui$-jNcqyI!@v6L_|06D0)yudG)hs}mu%WqE zfH^t~*Z>wVm{@?*1l)1OHL(k>Y9_E{i+e&G=4QL5<2Sbngy~FR>qy{q|LDk2(BzE> z!ov(T0m26F;lc@jiN$obptHEn5|?wCXL7J0XIld^qoZ}~bpZiyZ)2T=VxdUrSl`^S zzJoo7dgcxu)Jh1&tY|7+*H1xwbvnRibapzx&IH)QIy(ztkVoO$%Z5Xog*81%ZVQ-2 zeBD7vD9*Da74WU{9$(vu{?VyM7`r1t2@32S37i-Sj7(Ew+~P8!U(@y<@Sg;rYtHnK zOb1W&1Az;5wdPi8tm_P{;{y*44^9Wgy32`^m~C@GD`WXtYXC($lJS{o;x&7_3(m1? zB&M-HykBuU$NC=*PV`ToB39>47mQ=A64beFcye-lGB`Ce zI5<2-&0f081*wb)y43`Vv{}KxIIO?pGXd)5cefkfYrMDKEhgT6L$AT1;lK#_WZmNi zx6OOFyG*zvfvK4jCq@QGh6B^V0r--%#Ab+J?%w?LsLb%`f z2j!yPT&n4Yv%Bzzv1VAFW$!7)+sH!yQgR3WUb(=pEd_oBQ5^6u%SFDm6uHF*>%^$A zqTs%J$jiO#f2;?rnzZb{47EfO0KN+A-JQq|9y3uB*8guS)wN7E0KVA`_JRqUu>OB{ zDQvjK@PZA1--HNjPb()Zd@lp;RT(@#0mut!=6pm<4umz|yGji}N(DHNi;01-*tu+z zgLyzv`plmd6AWRY?{%g20fLcK_RBvkCJVya*6OnGuzrnyQ%n|w<(y^fr<~$W-g-c2 zA0ez@beDsd_Hdh+90-f{%JvZ{C44*}CI-T4wX#zpESJSv1ffWMWqLVJiAjO5QmbrI zpjYW}-4_34F(D9EDcxAQb6RyMl53XuN5up~Se{cRnBoMHTCBtWUQ95Abtx|@wV3j9 z1aGTU_?njp?X83b8MjuKhu7s9{Ggab2rCh`luD%Tx&%H2kc-FF(_#W3Ou{b<(|D1R z&o3D=$Y%U*g-m22hr`Th;cpiMPMCCEd1NmDuPX(ce^LxO zVYcz!(q#brE01!I`FF*z6Q{Pb5HzK2Uvm0CqiKb zz_gVSU1i$_$HynBQ}LmXb#{E{?%A1?mQ2k~YsrOZK)aYp%?@d)bLqt5>~vC%rzS29 z!r!IR#sKLGTnnXVfhTcsc5W^l>4V`=sBbRRdn{B^=eR$+>S1SnLEo?EtM>iELSsp- zaQ}+5?^kx!S!WUO|Jhf)&ibl=FSG4g_taSb=xA^fYU-RtTxY7J`>KGwufGNAvkG2; zb7fSExHLR#4n=2IPbXZ6i<(3LZIjUNzPW9neISueCl;J%V{@2+%mr`v;CNta918cQ z1}BGy1Np)(==*qL+*#z(7QllQ3t)Tr!c_E0w;tCeJvIJ6Tsdp%sS#i+Xu+jRZNas| zTC9!X3xkq@w9)BJQl1(k3HUvq08d=ufAU(K+aU?$X$&Njd>{rjlo(@o?h8 zN-Sc{p{sX_Yzbc&Q!hprG7F|W{AFWK=BBa5+B61dCa0jpy#c$$k@DSwC(yo~s++_q z=<3=d_#|m(;B4pI>1ZlC7jxS$g_}jxCxx3xkH#{szH9JQe?x2?D<(^ihHGZx(NH3+ zVHaALwZB1);6t=V-|c$>$Y&^CaIXM@A1k@W$>BJ|HJb57AN4J9tPIl@h` z(q-3PnA8?E6_Tfb{{6~Y1TK)S`PmH@PDhjJj2Z*87=%@^sfDr862??WjW@kC+A>YQ zMQ(!dK_Z?`CUAO8rPZ|C{19g9uFpZFb(3Z8l$*!KXQqZ5xmONW?3EkfWSq#PG(UD^ z62GnsUl_%c>Uq&n3=G97B+~ zIPN+#0<@NAtP6&zkw=CbbDqF5bNgw!O5mtjt{74hnWxr{1SV!0bacc@db_IkXS<9U zKYeM@%?WBy*o64R)Mkjm<(yPv^@nhixH>P^WUh9bfszNj?o=YCjc3w}ne^aW~k4J+w944%KfvbhcAxyL7f&XM3Po z#NOs!6Od?w$ObkSZJ@55qKYN(_aAXj3-ztQHBlQ`MTo3mchL%_LP<@F4`d<{Ejbd8 zB!v71t79MEz8NVJ^7H_HcW9l>>x_BbJseq9s0^j(Lf8$(J>g{;2h-V5_~*LNY^pYP z^xaM2mcT@|va@I_D@h>qEhXoH@9$ktab)HpvXrgG?Z>nff8z;U&h2LpS_NBI=vf81 zi>OSbd@=D&>2C@d3k(Ya%Z${!R)IHkbIGq`-oz&E@zZjV}XfBLCOD-9DS9pLZ z))*`D*CJ=9_62H1aXKqnUyMXUt0tE$J)xTl|Aa5+guh5=9K`^m$HrmBhJ1(Edxtnl zXCRwwp3F!b(k{I`TNRE^jt48>a=f>kbOSBNOBcqsoU@Qq_$c_wv+)1N*&GW=PU1XI zXE}SpV+mvy=CtH^B!7r9mL4O;-leX{cVKk(kj^Hrh=kvZbhfhNL@bkHb}KRS{Df{u zjZogfTs~Igmj-yh|2#=&85@hP?Q}F9)5IK?yh(sJd+c_&`1EbUdz*M!<7`6AC9!Ox z6*4D$qmXk3emS906ayr6EELw&wzX0iM$%JAk*Io@5w3}D?wXRP8fPP73rE35td+wz z66xobSJD~D+WuH95z70bLJnxPk|V!5K&U$4Rdo7agI&&j^4V)QwG}*Uztv$niXv=qzS86r3drX}k97GqJ;}Qm(4vviv4HGX?*w@$*?e*THwU*_FW<~~;;PB8$LlAFq zLwwwO#M|=LJpAzVa9{}bp%bJ1C#Q&2ywwfxQ{DsKkq2DddB9^i(ZjdExy}PUh zda{2a*gqW{9v=-h1oU<{&=R)b8}pz~k4#R_^p6IohbPBI0`Ns%@gsqg#8$q;4ZVat zdC$2`kw~8`P87u#MQ3_qbt|uz;<%VVxYN z?qYkb8&V02)m9tQkpTE1QzO$ZEnb(&9I9HwQ1vLh*A1_PRcgaP|De*i345IzR0(U- zMjO;dOxS&HSS1`D*4wbsPuT0-kV-f-Y_%b6)P%jk4X=bVLsy{(5b=I#Gd+Qoo z`vzi|H@U%-u&wTNAYwP#I}u~P*$uOV4Yqr1I51;2<{(D-A~%#0w$(K!#s_Dn8Uphc zH<%K()a@7gdJkNP#`}6hCd2lD!EySwWcy1H^S{Fe#1pk=HLtJ-@SY0HS4g9Jz8%|c z$^(8!1#qkP=oQwmn#bh|;$~MtTq#Xh`Pbx1V0Wbiu84-5d=2(UkT(TxsK8zD#v0Q> zrL-d>e?Tt$n=0Vj{ItdhptQ{v|A<@x++HC72M?|xtvO3u>F~`!GcIu+?5&W)71LUV z_sNA`IR}c_TXnI<8|gJrLllP3U#J)1^N8jio!zUm`=B|%{g55-fXnH{`__mcv@ZDk( zBqTwtJVx8N#JntUvagUJz|XBrfL{?4AR+%}RRK!0z@M*7fUS24Z7PJ+m-{MK!Q#2X zW4c58@%;`l!4T3uRtl!*GJ7l-J^|7wddgE`vLR$Vys^S)Y|EBR3Pk>-A*p+{maSgA7$H=<0*?qVD{%S8g2^=5^slApJhu8vSiQ{;QI0nVUK}c#G~3|-8q+BJg|LL1(4k1dvIcX-?2F9fz5Lh6>vc;%JI z<-&W#1W8C+a%;tetEi@K1R(+?k4fd>DKCPiAU1JD-xN$Il}X4}W&KECX#7k=m|iHU zPb%|`^7xyB3&jg1S@@R zbD=pIS1NN%nv;UXb#gQnC(HE}lf%Ywag~#_RL1LU*c(9tLCM-ud0A@%PtOWLN#jx( zlCnW>6ioyruS?~mxA9~&VA4|(y;M$m8}>#_dP?S(%1LhnPe17?sbDH6y$yP!COsuL zOl4Vip*)$GYlD(3rt;>+R+UVQo02`IvP8(C82M_alc{9mXbOIrN}F#E!kLZbXBp!8 z-BQ=B>JkeFn5MIpG@!_K#KUSbsa_&R2yCI*@u9nCXHr@+H9M^(7oq{}VkR{^q@~WK z6N|IcNj09DxHJfVmr5JML^8p(PYc zmvj61`}e{H?b_R(&cOrQz&68I_?&wKa4^7nZezXhFAwSLu+EMI z*wFyA^4Sh80e0wYr_OfiY`4z#KqK3|0d}3v_Q6*-!=GD38W4bL;Z^w$Dv>*(EydJD z%~`AbXV(;jPyt_ON0sAOF#eU=bt;{VhBcRVyv-ni)_6F&;9>y6&AMus085!?a&v5$ zowO$3gZxLUVOlCcFj40mSeXs*AA^}YuL3KZ04;Sb0D2|y30rv{2>N+B^gql8b$XUd7@)z@Oc7Rd_ z1C^8M{sCh$VK%@=`r*qu_SC|9vc#e~<2pO1JN39Rf%ZXfGbh)gUZ9_K0~#=aVhZd)<@Yk70@1{oD*GrA`Ehf@?=#X}g;6g-=^LI_0$a+X*yNHuspMPZHypIs) z3@$~~`uwbk^L{#<>w_xxS`O9|T*;UAVBWcE#v2^n4))c2IK#9 zAb)3H+0KsbJBU=>9$yTqb7CPq!+krL^Dp6Q?hS?wNQe~N0SZn%kxUCsXJ5mRrYp2s zV-FP~4dWEnE-v~CW{<*E*ep?4_NBB6jwQr4WPb*W&R}dvLpXy|(YQZ@NoO#2$RSj4 zNbus+pTVLt7<={*DmbnBGdM>&gR!L$p@J6^7lf8*hX}ZT116IBfDMp{^xdt7!@*QY zjj2gr=QBDx9bjhy>|vdq1^=4T&&HljR61YC#C)Ak!69loz#6G@Y%@ir^HgTe*ZCEo zbL^l+rSov~ysz^sKN_JR&{gbY74f7WdWcqGs&=N2zA@qL6Fmui83G zT+Sf@jL8b{{ag-VdJF13Eh%VEsB92skk{8on8}Y$ekDnouGhQqx)- z{s^78986%j(5O$>QbE^}rPFw4Dv?aX$xAGcVTGHxui^?7zm87D9ZBsxP{oT)XkWvk z!IL-8X}A-DCy)Z(1JyPH^t!%^MOFMJIu+xs2B=t!K-t%@sD^WN8pcTsbl?epC#Fpy z{3SXS<0KAgQL#J|e-evM;$NoIFizrRA`_Py6Z75a3U~Tf=~Qf#%tq(^Y7W|E`qyYR z4COk^_ohj6`QJjTVJNBeHB38)-%6`tsHyZdOsnCy(`neu7zz26(bP3p?;zK)UmQ)X z<9Ctk*sqVK*73XPbleTcVl^289g77p{cA;?E$A#>U&_dD(JDNw%_lWMf_OjJB^vDd zZCWKKRbT^*`wVfkZualeDH$W0(NtV+J&hmHtcYknN3G&$JmLquNCRH)qf;?DU{G5T zT@b8)^c^rS9I*EjD?A$a72Z&)lHaFOczY%b(ebeKO)p}0$Li2kuY~=H-5&R856apPZM@!sWD{U5@K4^2Bjf)(ox<0F z!ecPK{UyD@Wc**G(>b2G^OM|HdxO>fWjeLD8SUkTPGk=IxZhq_hzay7boy?OWMVPt z&BTqEOkd9Lv?S7L>1%Y>(2c>>R4^7jCl+L1VeHLMZKz0X_y(PlyApBD*Kq?vZhuXu z;|?{c#^<#juQqaj*#kf!$ ze0Tp!yymt_-=T)U|>@i@%Dytl~eU(|qSx z|HHw+(8!q36lXU-mSeXB1RA(*aDk|_vU++*FR@rf4odc##V9elZ7%3e9`Cy0-=>FN zywiJ-tHfrmxCXboVr=_p_b+Ze6ZIbB_IPGt@zQ}H_@2>pFnAyyh7J^}SlX>P@LeUq z`5*K{OQDG+_K?md12te?ViBFq>x}6vsxz*$bGno9mSYC4Z#8}7kQ9S98yXE(u1frm z#{s0GY%GC(ImagSnsMtE?xoss_ld=cmeV!=YzM$|!u=%^_a-{rTgz-5j#;v_J>rJ? zc@y>KhN70G>mRLl(e;l^)LR;dIs?i+CTC_p*6xCO^@K6Ax6+~BQ)b~O%oVMlb}8pu zOyGAn7=|6usI@(1!oHsl z_TDlh52~?PA{4C0N39H$@$U}6a(z$DvEk!h%E5G4ms}jyedTfpB^DN;xILIk!=Ak&3_~&ssNp+c9enQ5Sc4_fIUy#U$;L^?*sDC0PP9Ziu@dPd#H2G# zC!O*&3HL4!h4ZEo;XGR+oL?3b&S^T~Y%W`cv`bCgiaFWQwH*h)HyMS&sbBTg)w9gsb-*`w+{<#H?ws3%eNcApL!yh z7BU700o*1gfXC?s;9vmSMX_u$2mGUA_+Q#k{LrV_EBz z)TAVl+;~FBMTj*{Bnz3CT#=j<6G^;rB1vWD$4LSknPhrPxwkiQZW$ay+}lp6;gyab!u zIGj8FT@3$4I{Xd?&jro11b=?RNuh1^Njd>I7{Ef*s{#i;B!>TGjm58C6j~h}CcwNH z{+H9?-&q!q#K==}9-3TvC4$$8iQuV*i@>{C@H=86cqN?(%A?Zf1rHhyQ{eMr;9u1^ z@Ts&{b$t9sV&I>l179A4k0+7~UQPY&r-XLDrN*HT#iC+CR|iMXUd`KEMv=zv6BEsA z=tNWQDu)vB5HQ2W;g67gI7rCuD$j`tBugid^8A5RBAJH0QY<3luu#5QOaiZ?lR&w% zoYc;1$&{EmI0)d~Vgh&rodC*B0GuVbrRag%wzaoCox7ad&o;2l@Kpf6+!kQll@_)` zXFGMaOJ}=vwg<`s_XgN?I@|Y{nN?GIQTG>O5_l7x1j6P67@l zkc!TG7BzTMOaQ;uPyxVo9rJ1*_^)CDcuPYC0Qc3N3E*R50(fgf1ppV;o(bT2F#)`t zP5_R9qmYM53+)dI?S$`WvJRcB~#GlYfqI|E!bEaS&yu+DF6T|WmtWM1Qcf_Re=XBC2XHA3IAhS0$|Du>gK0_ywa&HPGg1udZ+zFQ*#M(A~ zA|{N_(h0-i;3==OF~4?9XdC@Jojk6sO!Ji5_?P#KiR6oPB6096WcS785izNJnNBL@ zM-orl#&R9-7roD{m^8jZCyjES%iE@^{5^&^@_spgU-7AeUgv{iqWT)0sLEGd&pVFt zZ-~j@8+0-#zZ3PkAt(R2mCyB+elm^8jkCyny`#?xki{EcGxztcGUo_5LO?-#@W_l?6Zt%)4}x|l4! zODBu+l@rdhz?@9cV~w{U^?mKE!v9Doobrn!51Wtio5aw6j}CqLGU;hoE`CA`|M%(e zm;2hX+g0&%Vj}q=ok+_4h$iUcw5cqn(+q8$HkM%)yC7Sx0ZzcF`3>uXjz8O7Ec)be zXxjANUYtN1LZ3@&GkHYJ`*utvr(E^9!-CpXxdaIqa zdEG-ju3%NVuYRx9e=VK**Qc~lI+}%u;6UAWu2 z+Y~O`jlVmzq8&ecM`6c*kUxiQk1IC*06Q8m_Wf1vJRmFB_bWRP!(8-W(_dN7Wr0oq zMp^^utIOA`%|P-waLx;cZxXJNvzuv6g5-YPH-dY0R?Eh53!M>cFplh5LQFv$pi{RQ#>6&45ZtP-VU9$VU$vSZqSLfFv5h7`_4L8< zwOsr1eS%KQ<_^7>gvwLlUQfP?Ygh3pIu)A}*=XW}-J%x~^(4qUXN35<;T4JNMgrS| zbXqQ4NklP4SdGE$Vp^*_FH9TA-3o@kpO0HeWlXObnY$zF0evH%~aqeqh&9$p}np(|y zqW_>c-@UKq+SPoTPR-rMY!>J9_tjgwdLO1!uX&i7OC&IbZ(&hQMpFr~wjI8rYghCm zbc!}_mm#xWjrl2FRM`Wwbo$+CtkY^ZY(+&vNlnE7iGN@wIxs&@r)+aF*TJFaFV?j$ z)-R>gubI+ku!RM+@O(YgXnq*Gma4`%IvsDE)8Zi(G?fg|O|foq{zR^QB8TaeY{o)N z9fuOhB+#1p`!Uge9HCRQd5S8o*Kj2j^&KxNFPqURx@6Jzl?+$ER7&P_O167nzK#iX z9HY~*nGIyD*av9IYDXWVCabmWPKcG9w|3SO*CBV9??#j_?@LTcOXMrhAet??x}%k8h3mzIeI7Ec5UCn ztc<&DtF7^+Cj^cB z3u3?tsS5X%1NV-#kpFKn^o0CC*<*{(7Z>K9{gis z&Fo1$ysl=eZ_^p00{Kvp>71e2@30q?|t^hMlmudT%*$uj;J%e-pz_SaDo| z-K*kb{%JAngk`w)j3&bb>aED-{~(5$ur{?~mGiDlm3Pky?eByIn-$0Ox@$N29b%vf zs~B%8U*5beXyl_}5+E$?t5AF0RepRy3^ZZATSY9+xL>Nb^o_qx3^-vCnB9@_upW%R zM+`Y(WmLsxZmPWgA}RiPG3pI z5|?GJUf_LVzzM4@OcEKx%7t=T%_`R#GqtV8%KVmV!7#?)F>pD@CUo|Y&L#tF3cfKN zU^6;99bjhy>|vdqh04T7?e#88HMDoiw$`afL3r8mp}S{iQd%-KJFO)bq5x zrOu@ji?h?nNI!9D5dJQeHin60f9yLXzsw`rD%>o zR$VBo19b|_v9z7tk?jf&P6JC$;G_EE?0$AcYnKBcuIbF1tE<!(gX5rP1Xx$ia{SK(9Xh_(6tojJB zpT1tOpL~IY^;oqjywCpZ%>KLXQF8~9E(PVV=3|7!=L_)nQN?fUc^Q^OV||vw?PXR>|sm|B@-#(b-=d<@2vrg zo{2Vtt%JZ>8PhHfCgLXVoh(Bz_KRNhIgS0ocM=5l3#^zXvWs<-S~_`YG?7>oHVEHC zsQ+|{wbMiz-!>3UUx=o(abQw2XfMV01Yh&@YaUC(i8Q|(_kctu9_~-2qVw?uEuO|B zg7C!mT>|f20xXOtGKb9*i3?h?KOP=Sgfp>(Zw9r*yB%XO-klSW3xLQBwv0tDYT^DQ z92pn1w7hVU?-faEM+=EE@JK)?nrpBX-nV4~GtZO0gbzi^k zk->yW_j{fU9Y{ks`GCha)BIa-6;`;I=Fj8Bn9vn1l_0iRfopy)G_ewlLC1Sa|L@f7-iG?uES@2=Kj(76MOXQ*!pJ1g8 zmq=+|OiF}dzrr$u4z9Q1KfY9y3^+2sSR$F%iAjbq3|5eg_u(-9o)XEtuS7B*5R(jH zSm=6d!I2Rj;$JbOVQti37n25IoMfLR4GHlQ{<9Kc{9H^Jgn@&OyfB2)*Xyfg5f6>j zRLjyiFftvS9-f*eh6qRey7JPGX$Ql{BH=mpuDg2X`sNOmvzvXmce)eYgbBjxH>e3alvkmy7 zaVff7HRy}RMKr5NHJ28x{*;1!Qz&h4Y59GVf6i^Y3OKJ+ft9R7ZXUMzHbsGY*OK*A z5TEH6R4u~Jt|{yp2V9nH89&UG;9S`2@k4d^(>W_oAc)>HE96c zu{^+4-T}0$(q)U0rb=3*{3qn9#G936Z1oyBs&v^BrKyq@DPNl?{Tgf>z_Uq z96xblYM44P25)_xvnI#iZuK7J+No0`C#Hk_W8*UcYMdBHal|RXWMN`X zDZ$hIqchYK6K|FrQT~Vb+U&w$=VX82BsEC9b8!UO>OIJH!w*l42ZjUF!GZoMYM^){ z;RtlK_dwT=jStO?jt7TEPLE8DQ#%QGHQ|V~!+WG_j2$y*tVP6I3fAE`!jxdS-KY9T zPXrs`9qe&IdGdj8wHW_-uhWf?>75TET=nP9Ek&%&a012Z%e-ovm2f-g4pHbod_d(oVmBp_qca8rb4Y!kQ{f;2md2Hh;-8YI5T zpNg6$aAWg3nj?f`Teg}hnA26TZDJ=H(<7XmXbDXyyQiYq5oJhCyOg?1ODKhF^}0&; zwZoCQo+CZIN9RJ?vB;5Q<)!-Z8geV(FYptD$q_bDUVg$Wdum z@P7XOy>4DwQz$vx8P_hRgNtdGskRdCj2H4oCUX(nj7>)j`h7gU5609~st$8+;+05% z$ry=6?GxQbodJH*bU>hfeaVG*W+SROf9Uj;{3wWb78s@;XLBs%mZq*d)X4}a8TnEv zm7G6z_)4Z!GV;JuDmm|Y`bwr$@_srcZ^7l-a6kKFu|&w|66J5pL@V~~bb2QGS}2Xp07l}`dP0M~qwPox8>k?LH3E(Y=v2KERXvu8 zrK4~oY6TEL=l-dR%Hcjpr|hk$>=C&8j)tOXoY8}7EavaiMEi6vouZ8e-0-$>?S^&~ zC!$&`?9XYcIemyu)oYD89Z&Zsld4Pp!-_)t{tjKs4t<19!Rt}MCt?ZJS23x-eT+`U z>rlneQakBSV#*WM-EfEqUYp!zzd)bYJ^IyQn}hIY~Eno1`#A^*rs<#F9lr)T4C z%FwfMK~+~mh3|FM;&mOTQ}QNUu!k!y#*JnFgR++3QPC4Z(IybvCeR6BIV#Ie# zlV14^QA%}R30Z(VA{VkzWm~jxE3RF~5-y_V(!@CapXFl4Uc8|qX57C#%ah_C#Ls?@ z&hB+dtaQ1^Aj}xLt`fdS`9u6`V&DlgX&k_Nlvl%lDh8e~!^8o+NBJgvHy1K{!pw^s zD$U-zJPdx17=FTx1cz16v-|`;D+ZtNrvBzi^?Q16&o7IKfba(UmP!$Le4owVA|?dF zo822Lh2Y^mFaM~R00?h99VUXO_n-V*Vj>{C3Eb^q1NGkv@>S=A_CUfLvTG}WdvagK zZxn-0cyqL;61o@nNPJKXIpK}U-b&=&+^_Jk7>it`%T5g@7sdF^AKKKmaz)o3;@b?%2wIhWzk=k)vFx5Vo zh^M3RjOJ@zXQu<~On^PClb3bjT`;lchhtHg@@hQ9e9bpd^Vt21Nb@_+uxLy(XFY0v zIF|Bf{Y(ROkG;Z(bib{jd(-V3iTJa=ftts@VnmwXUeNrQnhvo+)t~eN6g9dtMU8-y zhaJd>RKK@U^?`)%=8KUOd1nFF(pkXH!32_AUqo*oH-BRZ5MKHHqdsFgi|UMfXAGDg zNVFX6%Afgg3+RuB{iQ&Zugp8`Ur(p~J%!D{*a6_!AC9J@iMa4;;75EGbQafH;&KiN zJb-z)_INL*#uCl`8%@W*U=G?7^J zSA_4Pj^q14EEJ6pc$+4g5R8`u7aXD<`s!YhiIP@(<85rqbFX zxQzwJLB<`je_JTvL|~#ll|dA?3ABil88un72eAdi_af_G5wO&N$N-9`2+MygScI?t zM%^A_oduEp_Z1>Z(TlhQ7^eqwS1@jog*F9$4XA$&z%mme8`zuo88MDz%zofSKwB_8 z1+i7YKSX+eh{U=ZB8%8rh$`UmVI*ESMEJ`=gAz)x;)qK5wy<(Orfi0qeC0Pt`B-&D zq$zkr1Z*mDxx^Bwi%|^0OrZnH3WVVI~~1 z1K2j4flK_~jCbJS8R(!UVB9mXnA_IU@XRC4zZ}m|zI=rjSm=W-3y$sQ4!h zp;*q`r;R7eeftYB5fNq+-C8Ol+ab`q+#>!xLnxM`@&hrU5GL8&Rw|Uj660;k4d0ls z@6KD`Nnm#-%sn|+Di+C^DEyEi9&2J9HJ+@Ab+?$X2s1MFmkKLCu?m}%H~AU-Q9~-$ z%z9i*Dujs&Wm1upw!mLuh{ZCUR~Db(fcG^o&>ge!i&MOkkT5Td?G9kQ0DwB!rIN{ly693O7GI@=dOb9Pmkmjg(3KhCeGf7xPc&m}- zNcc1;jkENH1kHKe6-mvj5sYjNme>)3x{FU#-`T+`Bm-}tZWE$ox*Q|zDE z_xUEEZ0DPCIE=#)93I7C7Kf*CcqI;R#NkaiybXu9)`!-Jq~+uxDJOqad;BXd) zM{rocA&$c;eWZw6vnD{ z_|`QzY{p>=4maU&GY)+?9KvA;hhZFMa5#-a1c!MXF5qwxhb0_z9DW6dU&Y}!ariA9 zK8(XhaQF)xK7+$w;qccud=H0z!r|vQ{5uZoJ7Cy=!#*6Y$KfCjJvj8^Fo44(4pTUU za0ug&!Xb^rt8jQV4$zDMECYvk;_xmUK7hmT@;P6u%euhJL zCk$(F*n`8hINXWDi*dLQhx>5|;4qFu5QmrIu!zGGI6RHRD{*)u4sXKYZ8*Fghxg*} zJ{&%d!zXa~A`V}|;dvasgTs$;_!k`7x?pI>VLJ{xaJUtR{Wu)M;Vv9TaCi`hM{sx) zhjTc@aCjLGmvMM44zI)EEjau-4)4L?IUGKU!^d#=91fqy;hQ*o3x^-z@IxH_1BaGw z7&hRr5r=&^T#v&`a5#v=12`PVVFHJTaCj*WDh`V{Jb}YgI6RHR8*q3d4sXTbZ8$uK z!+UY~7!DuD;qy3r0f%ql@OL=;5Ql%pp=AvWt8mze!zLVVz~M$5dU5E(VGxHQ9HwxX z#vz157>5)NX&in5hgae7W*l-j{00v1z~T3Bcs~w*jKiPc@Fg6+jKgu`8I4!@4WTXA>} zhxg*}aU4E@!xwS*5)RMf@Esg}jKja+(6$bSb{w|jumgu%aoCT;F&yr~VFZTo;qhcDppMI643!}B=&2!|iz(7GOm zHXOF$upNh6aJUtRqc|MH;S>%dIGp|ec{>mIIEwS{W2;z_dy~5@gAJw$S>1Ho7-P#e z#RigqIj&k7OD7@eT#^_}Z%2*jEz}UI9clumBtSwETIl2-0tq&d1PGXf1cLKEzh`E4 zXLok*B%8eE!&kRE&-2X8v$NB87x)e!fR(`afbRoY-~!+};CkR5;9lTy;0fSG;3eQ) z;7`D3z*eAOD4`G-1&ju!1G@tCKm#xzI1Km}@NJ+45WshV?*ZonS>RgWI^b^L9^f(H zao`2uMc^IaUEovTGob%4LIE%m7zIoNrUP|AJ#Z*6A2=5H7SIf|0BeEo0_Oqe1J?l8 z0(Sv-1Dk-yfaif1fIkB70DlKQ1^Q9DB>Dp*fRVs1z%-y1r~~E!hXTg{#{w&WW?&7l z7C09;54ak*2DlTr3wRXRM97GpN67~94>opXV9$|+y?`TuqktF?2fBc6;0)kQ;Bw#!;11wU;4$EF;1%FiU<>d* z@FnmSFpP30h7&U4sL?W$)i_lHd>i-6gfwO=g19t$=0nY>f0R9OSk0T5K#sFi18NlwqEMQ+?AmioDN(GTm{?%+zUJfJPo`B{2url@DZ>L_%ASwN{|>%$cQT@$--2RQw_j;;4t7= z;9I~7pcz;VtO2eDt^qayj{)xh?*auAY1U^uzDuQdREs)F*jYV#s-&E5Z*@d7+VV(G zoa|4M+cCj3js}XeDXIVacUFqM$Qfd9;BepwpaVDwxCFQqxDmJs_z7?y@C)E6;1%Fi zU^B1<_yYJBP)c49WxxbrBCt152^aO!qoCpshg z5i(-q9x`wWPE`QQfTMvmz*^uM;9B4@;Bnwx;7>r|6haZO8!!V{2s8n0KpMChxCD3r zco294coX;v_zy6-f-nV`4a@-&KoU3`I0v{BxC?k5cmdc7d=8A6N*D_q2pj|?ffR5a za6WJ^umSiT@G|fP@GoHe&V&iT0l&aFKsS&9t^}?E9swQ&-Uj{%^qWrT z4@?851M`8y00FE7E&(nD9t0i&o&kOdyav1uYysW}{t0{m6z@tH0F(n`fL(#zfO?<- zI24!<91R=;tN@yUwZM0Q^MNdI9dJExFR%f468JgrGVltp8Q21R0sIRXxEo;*FbS9p z>;qH*vw=ClQeYX71X93iU=46Ca2{|Ca4m2*a1Zb}@C5KO@Cxug@B#1@@E>6448kyA zDzGz92h;=efy01r1K$Bw0zOf zFcKIAOb2!a8h}P%0k9A_4mciY1Jb}LzBk(Hl8t^6X6)>fePyrkQ%mZ2g0bB@N1l$MQ54;8Z9_Y6Zp+B%Iup7_> zECNmfI)ST!Yk*C_W57GWyFft|p%55J*q(mC_D=v~fA4SUGWpx}rk$FX?!cRK&S`Ev zx7qi+o0#_hJ$J*ya@X&h&t2{R_uOGC^8c@EcL<8-JYX4cG>`z2KsS&9&H&B?dVtG- zTYy`E`+*05r+}w{SAbW6_khj7R^W4>|4c#wFdP^GQ~*ez<+?j)r29y6rci_2~-1ffkS{} zfo}mTfmUE0a58Waa4~Qra1-zV@F4Is@C@)O@EWig*aG|m_$N?Ab+0G}Mg!%*bYNGY z4yXs_0fz!d1IGYKAO&QARlu3RS-@q$<-o1LZNLM-gM^Iu;cQvyzlu|@0Rw9ZgMc`Y z0G^aE;vI$#5^5g1TUC;?^wy937q%YoB?(}CN89|OMyo&!Ds{tlEk5XJxp z00#mIAPJlgWPzUm_W^GKzXwVi31vVdFbh}#Gy|6bmjk~5o&r7vJ_DxAB2)l}0`q}1 z&<3xVr^>w&w0dw@;AW59F3^S~c~w}FptFoLxEj^-GBpugMg!er9c8m0;_=4z&XIVz_q}2zy@F=@C5KA@FMUMumyM@*y&(G zKVTRz9H;=M0#(3F;9y`ja0GB9a3T-|I)Iaa^}wmX#lR)N4}lwj4Zud=3E)ZKMc^gi z9pGKy@4%w!~&i-AiB88Q1< zSz&I#sg1yaa|j0kOMt_H6MzVi2HJs>fm47Bfs26afg6B(fO~<*fX9L7ffs*nI)pG7s0SK=2yh~B4sb585%>x4I`9VY zAK+_X$~-~^Fb9|mB!Lug4sb4TCvX?=Jn#bWDexIkekfrKuph8La3T-|&IHZ^?f~ut zUI1PMJ_r5*jG0du3+xN*2P_9p0M-Mi0yhJ<0M7uw1U>}*0t`BgFc{ber~-}wjs?C4 zd>^L3?2kZ}=2t1|S27Ckz zUql!IGy=1LC03 zz*gXMpnM5o46q-tKM(`rz}dh#z#YJyz;nR!z-Pc#VBFz^@xcDT0YC&e5jX=l6X*dh z18xCs1?~qP0Db{H1-uNr0{j_x57-KP4ip?gCb>I!)Bj978=tx2_FbS9p)Bv@>0$?E!0Zs(EfNtPy z;2hv8;A-Gb;4WYj@EGs{@FMUo@F!p^@HtR)6rmUx2aE^y1}cHsz#QOc;259<5WqU% zWZ)9uQs8Fb7T^KkLEx9buYfm!w}8I_e*?Y-wgE$z5{3a&ft`UGpcYsFECiMVCjjk0 z2XHEI8t?<42e=iu4R{E67-rNGU=Ex-f7gTS-EuYo@RZv&qIe+T*>W0*6lmn}IDr*|!J- zfxUrBUmfq~y93ZUF~BNdHE;!RCGartQ{YYDE#OPwD`3KLgo(iZzyZK=-~`}g z;1u8n;D^8yz>~ncz@LEr#}f*GU4Uu8A;3H!38a9tfU|)g0k;Fc0-gmv1pWe)Ehh{F z_5}6<76FTa8Q=`yOrQt247dfj6}TUG0C);`8h8bG6?hNW415m!11O9T zihxnTXkZ#J9jFEBfJ1zTFfB@$4jcw7 z0NQ~L;Bw#!;0fSK;5}e7P!c1Q0{Z|}z%jtFzOWTdf*0N1F#Wz3V0fL19%ho82AL}PhJrPKshi5m;vlg z$cV)$>9mD7)dbuG+zk8zcnWv{*d69e9qA5f?N|!^fD3`^fa`&~fqQ^Wz+=F3!1KT# zfVY8j@11dakSz$)M>;A&tK@EGtOuo)<6CzJwv0eb^Wfn~sIU=461a1-z=;91~rz(>Ha z4#IGt7N`S`1C9qy0oDUI1GfMV01pDc0e%bo5qJmq6!;7%IEhdQj0Vbq-GCXuEMQ-t z30MRy2TlM^0y=@yfir;1fXjg&19t$A0FMGM0lxz_16zPEfPVp{bge`gFaekd>;qH* zvw=B;OeQ-t(jDnu+mVcPt!<07x8k9d?2wkWj`q&(NVK(uUW|!TnOJsAS9_*2o{Y4$ zCo-)h-m)T+qVMqVQ!d=C7rRa*vk$=by=dpq28u7}SGKSl-}~m@T*-^cRTOjq?tK1* zs)0X5o-K>FM!UNB4QxGphD#kky^}379w6c~nQU>iwKbB6bN2#!rWSwrH9s)ZL}P}2 zJMGlej~|t3>d()~G!^heGEIg2giKQr?@O6~aOu>qmL0P9Sl*j5|KOs>%g!HlYzyyC znSao~RT%cD%s=Qub%cE?^ACC@Qq}hCuTJN^D)SF|PaR>u%KU@2RL)*i$OA{0^S+h&2mR-`e_e9_Co8!bp>(2!p>(2op`%0S&v`}vrGHecjo%3w+)aNL z_wUCGkWK4(^>J}wKVEwz<@+JjpI03zcdy{+ySzL?_LuL+VQu(R$g3hvCA=ikG>q3n znkslPr0HN@2_f591|hvaNIfioklxq$Q^HFhq&I1Q7TFtr`tynhi7duZ39ogKNE?nS zc$I@pUx1_ayuLxE@0NO4*&w~=@TY{=G)NC~NpunuN$wTGWRiP@mQyR*l;D<}a=VU> z7Vp%L8*ym-`|lIZN^?UFjnd2R_~K%2uA9oZt)}#%p>C??R=Q~vH_>zw?Q_$AxpAiG zCs9L4rDkvZ8Nh8aGDt`B4|-=O{>RTIQL^!15+xf?B_S1fCW*3*2a@Q|;3E1{lF5!t zuHoA%xu!eWnU16~>A1Xmu+=#`tUgs=ok~{K#p{yMnek+-M{az612+_JeCA)g@tJ?| z#%KQZ8tDuE#T%db*PbKwIqV?G4r@r(RnJN#8=_SWjqy}6)g$+lyb0^PpM-z$eiHu0 z`$_m0?A%A_!sXd;a|L;gn#jV68^>e zN%$Awv1we>x6!}0H-&)bao7Zzr-!(y>Ss)kS-uZhL08{<84 znfCu6%geOR?#mlt(i96*_(i3^CEePRPI9p~8=KL%5AgY>NFtevW?HG)>0H6h z&?qOQBib2llTTKnuFnpLMAFICkx0*SIwiOi{Kp*_v#lw&}aco@91xG#0I` znH6hjY^;tZW+mz?4K=ZuQk5<2=xkrnlO32ycEvkeI*<%$DVZH{M6|OjnV3z9vGw}5 z#VCSZtOx>h#NQB6NhH#eZt0dumT?!YLc80OEm#$8C1c|(W0s2e5M}Kz0CJnmj`YOm zi$Hutg30VO%Wja8_$N|1U`4V!($(Dwzj7j*7Y4aeONoC&$#j%AB&UD8q8xKey1N%K zLrQE5irEdx8?!4~f`r7{+gm+R+gHO869rwAYt!|=a8QP^=`dvyQA7?9Z$(C}(DUvN8$YtDHLte3?cBCczELp9EL7 zl#}GU+$s&@El0Y-Vhj>7%J8f|Y`UeLL%5u(l}uYQ-OVzcP6Z=AK)K${GL=(&j1{VC z0`WPl&B$-fBR?pbNT3ep^ciI{Th!G|qk^7n2?g?)p(i^))!AHy%Gw*%N4BIhc~YjO zGnwe2K04R#^xQ^svbBRMx=B`gJQ0ctczS{_PXQu(S$6X4ltggL2ZXPhs$mcSmCjeHuz zT^o^(&Sa`(jpHU!LvbdvJ6kqw714;~RfI;SO-s3%mc?Ew4wNy=GO61umCT8jQBznP zfCP>Yj7OT25_?)!@~RAz@pQCz@fRtnVb>|k4xp0}S=OdnhAlNQ2WgxV7@=WZid9+m zdZ#yt+WPj+WP~~(nWUT2!YDdm*#i30(_9sF!+P|@VMwa~h7AzOd&36k430!QI$GC8 zR3)OlDHc$iVj&@!oowaat0N9a`X>5a;;}1b_O>kbLaD3+{Y2Sm)yd;$)Z+3{wN-() zv!NuGA$|Va*%HWmJ6jrM9i7zhMY!5s-oyR5Xh6+kNQvVDlj53@0{N5T*BB@x$#g|m zprEO=*te-ECQd|R{I{tsk@q&WRR(m@IDw|NC@I;(PI_HSPc&e(;0keZi)IVrtu0U) zRa4v85UsAOk5$)I#bOP$l?V_5=`HB$4v|5CXk(e?R&;a&>>xmNuuQtWBUlCjq6;!b z9np-;M7fnB86;M*t(J6*vx?~l%Br1y2#B?iEo{$pLwJVxE*;|bA8pxY5wT90UQN<0 z9Bg=Xk65n_Lo|Oy3-83Hrzhq0> zTN6|TM&m1cvZWZ`%HK53wCn{~5SPJr$(*H2=Tg~DBgx||JttILP14QRA=-it^w^5p zI}^!Hs;hRbZkU;j)+CbgSmVs9M68-Rr_t{AHuYhQNR)alG?M5M*TTZnxS-e3FL6B~ znVk}@9j9b<_J|)s?IXIfP>AM?uDLTAO+-@3bUfK3ZbBr(X;!y4sx&*Dj<#ymTcC=U zDdeR_Th0JGCxd7NslhLW1rlgyrb+ zxr-lbNk_ZlEnGoOuC8lHRyEYdX4TZiYieS(m0l5XAM}dio$;D#6i;#gB#Q4D0@Z_^ zaY}KyWkCvy2cbED4kFDb$u6X$D<0wmj}1~~Y4I~wZceVDx81MxMoe=NmYx=)N7QcXQX(p``;c*jP7Av)`sQ4vx%aDv1 zwM6x`{;W>0lnq(&Yt}|WdaG^7isztR411Z3Ki)Bc@sgZ)k+oolwYWe;v$njF5HCZ1 z06V(Z#Xw7o*H{^*JY^`X_-H}#rqoNcCOfTiTNK4PvgOHW zV^y>^+E85^jmKk&Xr&Ai@334;x`S?Bk}IZ(#I_DJuC|605`TuqILn?f%cr_UgE22i zwXPnOzYoR9mST_;O^i~>7U$?QH3WNshH7 zjV`!!gAt1k69eA6eBTQLU+jdauPhKk{ceVU~oE=x-R$u(*zK)E;Q zUh>O$?j;o{#vtat9x$brZs2*V=$aXo$W$a@ie))atN=Eh zsETOXjXDSz*^ILErKGwlrP3OAcK1Mh<1Kl=M3L;|I`>VvrQs78C@rYIaTQ{jXzAE8 z#niR*q;-s?q$ETwYz~qpJm)4^Dgi>HEg@NfevX>1Oez>>CRpN@2)U@82d&D>K`!zL zI4;6jabRv2xiU0Am|iuLdV|rfX0*@+E0b%fd7c<+jMr1cl}gptCS#2>b~ok39GD+# z%ed=}oNTqWHvBL$zAPGRMVXc>lHyQU*x9lWCOOWMG@4O)cc{olm?m`JU?F1L#j+79 zS{CVQZKpXQ=@eyuZ*C+fSXK;Ku>=u~GVHo`WY}~|J%=zY!yp;BB>Kh_G8N-3Gp?vu zibRa`+l3VwG|f^DmmMhWdgne>A_58tr&kJ#Zy_0@{ie;pUGpZyl$MK9h{5ZPY`^9n zF_$9K3sja>UW8&rvE1?vmiu5+2IcmRS5_@fcvHj)Ie}uKyqY1Siz6jwQSpc6 zEGmBC0caGkpsx!`b^z|Qcob_%0e7mB7R^Y7d4qZaa^9dG$$`{gPIk9+)4l@UZy@jg z8Dt$zNI*#m5;rcQS#Atb(Sh{lEH{=kC5;x9f|3@TumE8sjC#>VSvE|HRr%B8+LY3R zB0Q%>oBq2@f5~_z+2zKR7T-mD`#aT#L&I0U_#MTpEcQ>%n@yU3b8yP6Fh&oSm zV~SGTX`0?NGaVGSU&a%+3KW;-kJ}?!KthW0~_XzQAx(m04gWX~U5pgAA zpKPfINe!U-f`-CI-dHZWlPXL zs;p18Y5m8Y1?v|B23WJoDXo_kBZ}P+=6eBGvTP8g!;t8Z{j2(@%D1&EM zHgd}k>P)t^uS!PZ%`IH~RQFdF0Xsn+Y4Nl_K>@)z6BHm%!*N>f!SF;4hU_w}B*d=~ zy;+d`syU0Ww(=aT6lbs#b0x(}`yZp-%`_^q<8@?I%FL)$n0Oi1a>nbC9Ml}`lD_Yx zO)gHJZO41$#Or>?dx9M^IeqU@5pTg_36}y|+H#AhY$L{5rOJ^Me}Lvlqm(&8&b=&+ zOtXvxDT#MrZ%Dj7L+kWx%Hx?SmJy$%_%rm!nWjTb?O~Y;R}x!bb#SVsvx`O$EwR=X z-lL=nf?cC{1;vNZHfxli@SHVDkisB(FeD%~cH!~JiI0&Ovl0FEZ2ywXO{zyv?zpyVp#>dH@vL*?aEKdi2=|u zF1P1=uB+@3v?~;2ibvg5L+5jPjTz2Ch}-sLu-ssE+Sdb89Si%G^@@vO>|b@#yvDX$ z1B6PoHGQSVTNlwUF>L-aT2wc0A#o2%gzeK1!Qt+C-J6pAEW0@hlQhzxn@4VBbEUx} zSngW(wlCab+4o*f@eyvQ)27Jg#_kq|ijFlxybXbDDePJ|kHWaR`b1SjGTM-=sY<5m zYi7Cy)M5b3e#juF-U5xCFLv~6`?o`VkPgnNtRB4kZoA60XfN*w)JVT z2T~nk+bcA%yA%5neJf-Wtz?;Eq7vqZaZ2s;Q!U*P!SR-$yAb7MYzQm60ip(RPq9=3 z#ey!leR78EgAlN82VorVP}izsnr!} z8ug7&)zsBj#b(V)Bx~y$X^>fo2U=I8BN^I1cL1fCKQ=~ggIY8@)fR819k5C2b#%0^ zuBIuK9&s?V@L@92lG~T2+ghS!xc-f89Zq~#{9p@ylT@CwU{UqLM8jMJDDOKiQ&mTaq3bQx|rOmE^e3tzXjJpoE7T*->I5f(-3!SqYKkCn1rFepK+~^&V^K z(pEcf!GQPWRDyb(ZiHbzP+FuYS+rZxvK^o(nvsQoThv~gA7!W;wc1J;uy4N{!a=v6 zzi#v1bGq(oM_hUCGLLL2J2Mi?q})604ca;vR4cinq6_hu`Spk8%&%V<1^5Vhuq}7x z5m=VJYGMu2HCUVDc-(x+5;ZyKsF1`mFgS3sHJ9$#536>Tods5-MCBx%a_v5M1 zhD(;VMq{~LA{G_kLIwK8t1HgXDdO|J_lqGe&ene6lfCwfD=p6Rq@p)|VP)l)3!sfk zW=N|jdXR;x?!ZdU3KAf z!m=gKsbn@Fc|J99w=a2t;kl9*s8CAlrcrwP3hj*72@|=mo+B^r^Ibh(NUp2r6CE6( z9YwU0p(PQ)Lj+DrWY5j6lD*>MVI-v7y>cF7GIX~b*DXN2hetzF3^Du)?@gT_*)GF!a5nIC4NXJ@SR zOL?&si5O#rQaykrJMki1M329PE1D=+yu?xs^+ z?X9cmNqy>}SEI0*Sb(8 z+xCVO6h+V~#J%Duv6F)?B1?%A=UKK9Dvgc(NB_$`Oa2)aGJaI??u`{F#sei`{&h|~s zA!0hGB)KLTUxmkBXV6<)kKuhdb~2QZn8C^5Be!r!B|F1XOza7r0obtI(ZV^VryuD@ zwix9lLl5IoDZopB@Mwu$0<@l}(Cd4!vpALLq8i7}8ViV87EWY3s*y~p-&zw? zL(!B_ay9)8D#8aaRbtN~Nh{bGvX=K6Dqvp+r0&b0<8&`{nBOHxG795pN10rInqp@g7Q$7udh+`a$ zxrgPA10v$vj>eotdEgpO3^k1rK zW~#Qax~|d|6DL7`NMtsqO^>2?2vDuT)xi{7*()Qup;;O^0xym@x|5$>&lY6pN4BK7 zoz@%BSIL(0Po8_tmY{i6r}-zJ=4az+M$wMXu`E_2s$nv!rCi6+z7N@emr~2$L9g1R zr_Zw`c%Y7-ET)OC5POEYI7R0DPO}cdW(xfVmd<1cQZw1l_XyUc(qYI8FCfO?^B*vp!ns zh>Cj=#Zanvq;6z&OIkg&4GUre1=Ac`H0CqlR}lC4?BESa@*M!Zv?CS7gRoPGss14izni#-K593em#LH{8%@!_wCB;w`AtTTYEl z@b1evsNJ(PSya5uYMnHq;=+t5dF)KDWXPn{ny#(O^5R|ArPqbXVIk}Op3bQ*hpon< zVl&i=TWNQsn$h8W4v5h!ZRq9Qfj&~g;saL2Yz4hV0X+#;E#rPkYYR2=f!a!5{0-VP zkJSyA(-4j=@WfA1YjRbRdR7?N@!UnWn10cmH4XachwP+G2ymfeO8gzh2UC9p*DJPG z&46GuGuhJfN{KI^T9oc?Z^mp5meafC8|G*vXX#2Y@g?gtcViSvI@}KoSCVpK8$#n^Y!6d)p^}cP`#q1 z#W?sw=hJ&OG@o9vLE1_DNVn(@gOkECD$Al2(m6G%jnJGLGJ{ooo=U^M34^4xs;9;X zRrN@rUQsU{aa}B5EMk{kLsskxe++lZf@4Gm>>TDO%S16cR_S(%T;0cZQ==rro`_QC z)pIg5uO6u~nOZ#%w)1C%iz*|sxp?Uq?X063D=a20B5I(g%FbLG4XOEd?;R}1q+N6q zQymdjsFb#-H&f!av(#!r->kGk6Q{JqzA&ZSuvE9X`_W0W%?YuoN3Nyh9Vm3^uyM*g(Tzr_IHyDJJ8!09ZF(RL%8*q-?sJg=LmUB1 z>Xum0bqrRkU1x?B2Q4U;LVH|n=B((fWL;HNs=lEiRgKp@IQucxJvo9l4A3j?sl2&? z;uvV}Vrz$q7J65dM_Za4F1`b^L)-|Bvr{aUKruW6hFim}QY<~a^c+EC!(1z#^HVLg z5W$jFQM}DXO%vhut=STOwuUyv&<#G0UVc{#up!f3^@9m4f2Ox+*q`y``n^oCD5ivx3FU`ho1C(xCNB`sxlj z%2w)9N?KG}7iSsTyz5iNI?jrLMsi_8TC>+QG4IUd-(+Q*vO-La9sqRs_ zb}DJl2&>)*)m_I(hvNpw_K#z1V{1?fOvnY2{pe^(VZwq>2k?hF-l>=O|m z52s{oBar@FdT%8j!ATs^*^XT$j=p$?5}Tz*#(ehkDA3c6J_Vz%q&DSp1O7|+!br)u z0K=-2C4PgX&@;?F%lR}4Ix})-5xZary)%e>kc`lz5;a4Z#KYnjy%oeV3_bAzA}x#1 zZ)5V2ll~%-{t|&^FDzX{LA>IcaOWR;X+q6Gz77-RvAXE2`nsB`>UbiVsHu-trnpHI z>k&G}4wdcRW&L-e7Z%e$aXRD*F=dY~pIpVI1v8&f4j2Ci*^-XdXgBT6Xd`**|N14J zQ1M4d^XGfi&I4L%^O>cjMi40e1lcm#b*8=)CMM}!QhsqGTx^EMF!zjeC9q8Ci^h@? zANaNPMaZqKJpWhH7DrRbe?agZ78L)a-;_v8E){K|n(SYY#8=g+HpW5-b&P46bS1rOmA;Zy0vY~EHI-#R z?jICi!opr`AvCU*bgI2a{1=jkvt)LZWsdvg{nn63hZG5LM5e7R+DVN;0g2Jg+}y$w zrlX?`v3O&=YG!?7ZM>?gYGx&eh+;^Mt8T1|Hda?hqt*4X6yE1+*G~M+c|5I?Es8Yb zJw7yrpFO7E4r}oS+P6ph87k>W?Xz$sy3FSk0#Q`Cgaug`gi+A;Av#s2>d2=@fUu8 zZP1)d%9Ry+b4Dy<0Yc@Lkk3V>P*Pc+3A5uZ4ZnnKQ|$=&mBnaxca*4x|+Jm&S;_~N=uaD z+Yp8n-8Ik&5>6yn&;|t(J`TdyNZ~u^1JL+pjNft>xq?(LrkOej&dx1}y#gWw!GtMjyQ=FXnokz1A$hhbX~!LnQBhe7!8=Vs+hmF* zzX!?Zb4$`=#AI_FB)3XQ%rHf>}<=>K2IJXoB_3@QbY0Kf<)t8D>iz=1$|8k;^*1o zwv$MlCNs_<`OFM)FKck|q=AKHIv&F{IuEvgXWO=mbMxAcc2dYf;S1BWElPD{J58ls z2+{F78)Yvb6-f+lE{5a*rlf7OlODsOq3Wd&Ju$avH%$%D7_bMTr?cn`c7t-Wor)Bm zei4^L{&rj5P7CD8(N{v@c|##vNZ%^PgpnPE)VLZNTXUzL?y{LxG+PSM@?COzk3^}4 zxdD>1a!b-ZPLel5@_19y&KpU#&Fm33L-dr~qDU!K9k)XCrre^az^OX=5k#NPBP#2- zA4BwmJfgCayAz@Vrx~uYv$Y~hgHoD7g=nQIYTtCpPP(@DLhwja(7vW5NX2X;B)d&X zJ9bovWb{6WUTKQjM#)hm`2Zvz$t_8KBFTp!`F3teauZ4Z6q5a>=X4XQSrUB&qSH*# zF;)e_cR9&!g6w=#*3N&NZgUcS9HJt(XiHZby@DqpdPzP}_SG*)ls1{Qw9)5r6Ny^6 zHSX91>9+v#Q(P0`w28dBE;h3^R!bj?uZmV03gQ{pL{}!(Hxp7pJnNch%e3~*gj5i} zbxkB%R`tz(#H(&JO4yLN*GuH%e$Ud2n3gREG3EYr;!P6;l3C@fM_Y;)~VKDX1Jt10@eb<&42 zzJ2L)HASIok36uQ_FPRd0QQDDHK5-hZd&ELieTTNDpXpc%uO6sQaNl*3AW`biNUTZ zsxA9&%2g7>TvK!}`c3f-j3JMz2||+QYKoDtSL(P7(`<4eK0Y{C@KBE^ceQwMmQPEL z;Ko5qRy=Z;;HZUF5ppmw(TxqAiM(lKAu+{`O^zS(#im9XJG**vFp*DB4LPPmuY^5G zRU0L8hH!7&Pv}m>lvH3x1ma=_)CaRV9%I4RQelHuk?73}v?)WrKyh-g1xG{d>8658 zjq9qAs39Y&pd%ZUww5&Z6nGL(W7^zftNi)w`%yM-w zHIYvTGGc#M2XjjKbRZ)Ra&<7flurjTVvehWK|GvkjPyft#l!u1tl639q&HU0tS3!+ z89{ZN*3D=&AlA@O6_3_bI-%k)LzLD2&3GL*vhwn#>n#0j>m-Eh(B z(U4^zTmz+`-J>DPLAVA=LMJpzkWHN?`|fZ;MaGa0E0a^+k&Lm#RhT%B^O#Aus2wLpa~70GEhsL4URgKIt)^FG zX#9lwFIzw#n4!Eix2&Lv{vd( z4RIM8q4uKPHIglAjkd+GztdJWCB@ZH9>jA;uJ#OZIh__)5aaYRzx%M zy+GOiZ5evU2({$Y-s62S{+eA%iW{LeI8FO}qOE4kHzDSmIcB@s^NNexU}FfidN?0q zWQvslpS<`ntPEY%o^EUDN_P3pWQ$hPyX}#c3d@pTN8ANdgFB+M<;}Pl>`i)R&(ik_ ziVd8d)ybAvrq$yU<7(L1@yUz(U}aomLv;gv(mhr+b5>O<(87X`^C?Ywn55*d2W)W5g=43+POocQYjzA z7;R~?lz1Fb4OCW)Qxh$DTc(6w@JCN;@Z-YDS++wR8SxaN(%$r)4)vc;4o`W?MQ+|G z>9}&Tm0Yi&covb5Qh5jpn{HXiA#7hc_3+&OyzZ_v&2ynw&J?11l%|y2k|rKRs;5{f z3ltk=iBUGuN0r66R4U<|co}BLTk?Jh+oHMM2RnU~QQjl*dM=}`gk2EjK7qrr#iC3m z!8kJ^B$bB9Xk5;Crjy=eM(-Non>E6Z5M_6@l!HaZ+emv!S8FoafzOsxSGzy`p|^io z1{@jjE_B8wYmyDI`b4rZ(U542RiOgG*S(A{QGP^wy^`5MiIzCNk1PYlW++dxlmmpu zSwi+cAQ{DArLFhmeuy|GTk1hlLD`_aQ|4y@bq3^V@lnnUm_kMT+FdmKToU=~cGTcm z>5^jNQy4CjiNuR>X~QMXOt9oFk%^W_;O95xw827ZcP^3|?(HY{DS4UvzQ z+4CEgfxCt{BUsulM3CdI?zLPka#Y@PA-8~6DA+LX>$=Hn*gcoSuq#xGc=Sddqj>7i z`C8d`=a8cPz;YPM-uHB`Z~4u?oiR&Mcz;lLlFN^$FQ;^PgjH| zz#~V)Cv3|y-g#kud(y6X9C0xcvC9g_cQT~H@kw#acuG7l=fN?vxESk=**KXaWGka=JB zPDfJg={nMPGQ^QSDcd$RiSnzqPIt#? z4As|es}N_1c}H8YRFHZ92XM7{{XyH>oaQ}J1L*bSqN`m#_rjGo_OsI{+VYqd6pgSh z8({CbkXp_wRGR9fi5ojgdStbocJc%jKUYH>fVgGx^PdeVetxl{M5e7nJ{@Xg*X{sF zF)iub^~mn$eLDI(UJ zQJLpLqcVj!S90-9m5iXMqOA}SXPQx&=R%`0g(#}7jwpZUB1cqGM4V?vWu6O-$`nGb zy5cP@xg97)#6@OQ=DEn_6(5OryyJnCN6^qC5+(8-N9_E>l zn!ywqORqqQ$5M^)WTLvNuAz=Tt*2)m-lIWcb`UzmzH^f-odBV6mXJLg!H?%{;aQKt z%7mVhxB-ruY}p8s3d(|-RyczPeM-qZ7n%iAXp9xT`Y5Zo6Ltr(UC*hBmWC}e%97z; z^yM&F!s70+?L?n|9icgsA-Z9780*;Qr&IgbyD4^$LsIMt1f`fl_0&q* zOtJrbXo~%U1^DihQ%&3H=g&etfFdS6?jDDv-xVmgyr!OWt3=An*oEeq36{JiV#n!@ zGtPrm=jKpD6h0Y#bC^;=w)G(6V$-(gWTo)w`uu7!kn%kNtEY);p@VkkIjx++(}VG;31L}wNp z<8;n~W5^*w+}LjR##)}yBH}%Ngsdq~=Zw&hLxgH_DpwBWtkQ@62#wP@BQ)f2{p6>? zRD6Ng4-(>I|Mhdv=DdEcSgEWqx?6dPWqe(%I$2#^6|aj$ll4{cS(R?E*ow%?BACje z1yFtwT6Ti1;D(ETa`N~KhY@<~@2Zvrk7H+K%Tg`L)ik-ek&unGKtVpJloh|W5oL<4! zMc)9RSHRG=hpwJ=w0)vXeyklIXU8#rLq1y&rBa$LnG5+tlBu2_^z42VLYo(gLNZBT zd8Dx-yS-#(a_wsRq#hp>#^~z+DBZ;nDxIB9&+g*gg<4sl#QaL^eCMp7He)=Jgr~0jNZUZA2Lj#!_ZWiEu)u5(0!H0J2MeH1jnXG zNhX#pi>A}<-Rem>PCya8{qXP(HwA^Q$rSZi$|>nGvtk_m6u+2Fn1Ek0*^6jaNGr+o zhzbgADic%b55+Hb#^FGUvp+s8spINCywg$37Io5Y6^e`lOJ{e}_LNwLHlk>EG*|i4 zk?lv~oQ%E6Jo`b$JH#9BP>Q#ZzNtcQ-7TDZ1a7omD2>YG$O!_gmeBJFEqHTKPg6f5 z@s7B6zECh&i!Q0`bpz-$R6#ViHZG5He0f! z{g`D@taJ26jV?qqJCG;MXy-?i*JGvM2VmxmS|Zo$3;AkO>E?$5mrzD`QE3@2(?W-w zmJwvs2;IqYgE*8@N;d*ZPc)M)mN%JmgNYK?BMZe6cwnGZ7%cw`Po^Bi}l{ z(wQwh3}2U!ewa+Ml&Bh&WOZ%mkdsU|f!Kv4#B|r>3>^DR8UVA+jZ7}zdT`C8iz_jQPZ^tBH3rPA+fEv9^}Bkhf^i{|p@5j_RF z&g*PCWM`M^g59^$r>zZ?_pY`!NSD5U_xF{)5QULkJ-P)XX&yCf!Soq>naQ^a^+ z+t;psg5`F8SD0)R=rvNAHrj*IxNpp%XyZzJO#7~k?s zvV*w(qle64u?H1fgSTR%Lw4q9)Ry$})lQgOk}X@g+K4baaOLVqBAJTPyXd&RFIu@; z%9R*rDWkgf;+z!w`T*Gh^2^Aag`C%n*LTbcpiw2dL|!vGPXBiY7v!1Q)EZ8xUV;hbm+}ump_Xk z3fv}F2{VgLJ2`pON~7gv)UlKsmr;wTJQ^ZNaS$bfI_v}FYZbeCmdJ~*nt9`XQn$UK zEY`YCUnuUN`4oAZuX9d|^=w_;&ojgsZpcDBSH|}N+HMsqMYq3l+EAGtI%KDzmho%f zix|1(FL&+wy0)sN*H$NZtxhzYq(zh;b;Kl+6z6af&m~ehKVSa2fX`jX2V}-mGZfBS z(_!?!yw@%}WAlcyD$+D8srcaWO`FgA;pTHTeE5UMKDhDrE!W<;dBbC$JbKRIGiL7o z$)o4es|pYadF23aQKCckNa3q)TkDQ4mmaGp%=9C61I-mspHXArCJ&tRq8);4QZBV_mQ)U=K;PsZ_cewQ-}g}n&cp!6IU=hVa#oL+vBEwPBW`*mCGWbBd6wtY7HHz9AE_M zUX-|x?jx%Mr8^d?17+xWJ5c!EdhQOC)dLFXKh0PEQ{!PeWdETL*_Uq2Gn5l&V#};! zv*SK^yl3+@*MD%{Y44x*(=C^629a66`HxJK^r5G3(;*rQ8Wj!NT2%n;Wx*j^5%H|uDdE|n4Mfx@!rFC$UB8^lQi|} zv+q4}VMSHN=113W{?Yl=$)__PJb2#wmu01D#S*OeIyKTF@0~=4?C51&O2Y%iH`|F@ z?7iG{=v;1JcShY@Aqsu##Azd{1n5{*Cr*c|B4~u_PMoJUG3zjQw4semmv^K#vOBw1 z2TryEb&rXPlonDog<&D@v}*x9jOCr-UgEvlbjW_jBq@(``#i&~4GxxB&<2N)!5y06 z)^^p6r0t^7NaEBjt3uHz(Etc%;_Q3mZnmS8W0fsBWXBGs+;Q!< zD;cC3#%vm>OQ7f6w6?0_v^Ldo<6teKa;t5UNK(xm7`KY50}LT=Au`?Vw#3W4Hvt{8 z3s5sPE!Kg`v=Qj-j`z8J)Ez?A{_76muDXO&qYJ+sE5O?B?(!mNyL*t`;Px>@VIR)E z4)mpx0{z1PEvbe9L5|8J>xV6%eWI}Z2%<#wpgrtPYhK-+aH2CL5&qCj^&T?`%QOC(Uu(PJz7A24zSe=hRQi3b z#gwmgq`mQV(Ol}E`L^41dYw&&>};p2+ULqv8&uiQ26x!m+OBf8wj1v35C!RM9q3D? z-`QGBIa^2C8)ug;qD_ba4)5|hoDSLH=&o$v=uaC|S2MwB zOQql8T1+`yN7@^Q7au{3oOqR(ITGvkdYcZ}+hyDBZEaBHLmS*-Z)>~C+uClpw?h=9 zw{@T|m40t)G39L?X)nAj+?iI@yUln#O^4o!q;EYEZB1oBTZ5aqYh{gjLlkJ%)zeaG zF_mL&7n8GV%?`^qw9jF+a*7&x(IGn}_dbU{SGhVCHRRHTdrNd`Qi)T zdw4y~=5D_GVq-#=w`u%&{b^-o73$vy=ie&#c5Hs=C!4Rmeaj6O%e@`%J$yH2dN-W@ ze$VY&F8}G~pY?1$^Bk6}OwfDz;>|O5uh@Ln1r_p%I+)ZJ-O1oJs?4Zi(DziCp}sYB z$if4y$zYyND4s(v_b|4J%K{;18q6Ktv}dk0!&~BKSX%-716yl4?)xgmYJ!Rmxs+p_ zp!bXU+KAc`qK(i56h;L))E5P&r+(+$x4qohqHU>ysAIx+}Fo zwFV&yRPhDvbg)X4R#&r;IzBW^devTwsN9+&_S{V0a(l8jw{+;utu;CfQJ~fexecBQ z(K@QZ*O8cu@mfS>(G=OyES}=cA{~0O_^C5}sV-=Ug34k}|5{g9+frHAkvl7-1D(>O zCa*#ib~cKG7E!*^HX)L4>b7r*U+=B#=+LR`xKZ5ZcuplgL;*d!-d8u;h?>9Fv8wrN z9jag48Hm6s3&+OQf_0az7|R#*Ae@nJ?@R{&bX zmn694f3nr-bgv8O(CY%L)P^Xa662C$RU;t^*t!@nCv5pltE*{woj^=;YM*HlK-ye``Un5<>w4=wA~7?UFY2L z)m_(-m?IS}qOxd;>}VFV-Yn9gH;Yy;DnwzsMk?Bt%DRr+8L7D4Ue(zTQNYe5-3QYm z%2(PZM84UP$_3uajt-s5E_kF8qF{_vuA;$Bo}D(@h}v+kW2MFrT}&OSDikBMmm`(F zb;T}JE>QhlI%F3F3|rLo3sJyxcI-3jh6+)b(91r%R#&?Zbpp+itrqd+fkb*c&M9|i z$i~r6`9PkzoPV*`O?2pWlhr#9QJ`9{S0fdzuF8mx&wMCDi>O>1B4#mC_mC0V*9OGu zB3$CFZ|Kll-?+ED8mWXRQ1880zR>Dw&RfTa%~`s}&>||grpS(sR4(=Al@7gmwMHr- z3cVbuXl>P2>geQ1MF*-(8iBb-D!MPMMkb8 zw3OkjY*gUAH2Ywq#XfS4wBm!C?%eY5neYGjXS7TIT{DTXE zmnJUrmX|A4?&Z=%cwpXkEpG*Nm5Nw38+6ES?_0lJ8&UmsZAA6kb*L{2^xKD05uhg$ z|Ljzw@<~&zq2?I0JxtfQ`{lHdD%OTjUa$16sk_?iB06+jrmxWBUJk|Pw%jAF1SXyK(!fk$S!bNd$;jcE(lR@7TvABWr%`m_qH#! zsu9$wb!H9R$bG5xDVP%jA?YI#T_nHZQg^L#x!TJ|hwO6dY|H+VyD+3O5u$(|wVDm@ zMXA$9)P#$Ub($=7I@FgY3jLpyy6e29jt;%0&T>JB0%{sxzg+b&LKHC5op0l?)xFWS zl?W^ze++KhYxUzSA~IM3*|M3-nb{6`?6))D(8;H(X$^_g0g1=&dHL z{D&y?t(w$ER5ht%Rn?>pRn?>s`adbKH+Tyy9eN9_<$@3erG0Ep=8k8KU4+lh&X#M1f}>@;qN*Rg>D*G&!ZOQ#(UflUAt8t1@#v6~Gm|Tk@W8w+ zdEOi2P8G3gDCv+R?%QmcHlk+Bv=KF1rbB&Egv^$Cwm=%~leVHds5%a+vZ)5ufogiq z2sCO?Eu;#jA(YpReQUq&^7@nx9iMXhAeVUTc@q;A-lTT%AR}?bfD@%7=gw`&_e1W7($*oQ*Q#?cU#`AT&wyabjYry zX*((fI#Ag*0zEZP?#HLC2VQkep*otnrohGuzM5ML^nPY_HA588SK>O-eMgU$R8^jl zU~iT8e|f9CUhSN^S2<5TzfOnjJQOqk&Z+HvM~{v|IZH?3ILmq#Cq%&fY)g?w~-nzu?NoXUgKG#O*E}=VF2detq2sEk^Eu>s*2<3Z{*m#kM>I?nE zd%5V4y+*55+xeuWHmGJyw80&I&yKdM?qO{gtEyZZSByFc#pUSc}rOYA(ooU@I$ zS_N%Q-2>X1GiI_Xx)25GZTp9oZfmD?RBu~HLYK#Nk(N;|GG#8J9XPq(+v=}NtT%_; zuUw|ybwh{jGOXD2exgPjQTMVo!YdL@i*=|k3hc9$OQ|#ZTqU}1eNhea11cM;(?Exu z4XpL4Y}{_{Rr0&VdV`L(r^b2Oo_d3h4)w*h-EYv*_S9B=9h-bmQU|InnMR;dQEDMI zzhDUU{S7(~DqkvFbjZH!}M(0VO??{NB$l-15U4KfEJbp*~Qe=YSqjNmM0=4mpW( zyMB0JpX+gJq2*B(v1)VaP~XzJ9{)X+tvq{9wGq{|)kaj;R)_kcK#Lo&vnOnns;#KL zt&T&^Rp>y~9vXp0m92%8j}4)`9iPkSp=*1|hJAqqJ= zK3Ye0d~_t9j*pg6E;42E^$pz$UNshvd0j+@?4s@O{%eD(W33JDaQ9!^RSl@N8{Yj7 zQ6NuJ8=wPysYGC3yZ_ph>i+A5g?Il$6g=I3Eu${6HVT;??%O`DF1hM>(ji~+zV&Uj z5p^$XBdTw!Lw!-0eOv#knZH|O-ONv@WUFoi9dfdJ+5ghos`zMa+5ggkKGWOT|9aA! zP&(vqo8NnnkW`%BgcHADgX7<}`VT2gh1f)d=f zw5FAN)Jp~FkloW?r`39?V2A=$*u8kEV7rPh7X0L`8D%Z zj={31F?Xb6udT|_v`&F@Z~G^-g2m~!ZEn&*-n<~lcmbgn@;VbWL%v?aGycm`;<+p( z^0GLu3+vluP_|@k)TC^oRu8;aNr2zB?-i#F5}up}rVqO)^5ygme@;t1IW3hrMVF5s zuI^h-l`YvQHYrVE;P6NfcFXp~JGdO+d7w60Aj5)rX4)o-7piJF%RVvxywq#o~ZIhx2ckW8GV0>@L zPK=IFE->o|@y`3;E2`4x6|daUE2^x{yiCyUOnoQly= zLBQ`|t}nNvf>0@#>&eR@IxqeXnof^byva`RERQ`1_!C^VMwf_kw*>NLM!YaN=%O$4 z*gV>fbg^HcPm8mcy2;p{kB2r5k@te^LDLc63(lN`Rm%s8Q+t7_Vcz>!I5*nbsyF}5 z$QGvPOSXAFXli**MIy(BI!)+k;C9KDMIv1--%YlsA`x%B8K_3H{py>UVlZjrql7xo zUi*06g4&6t1-wpyz>a!*sK?twecrZu4}s!TQ3XBo>ME;BM=8rszBH-0u+dfLGSE5% zb~Km6Jh>d^%ca#D3=|L8Oy}-tYEmk4mWz(K)S@xhc?+}&fgR1;a8KTb`|@V>6#~V1 zykrkVU1fCzm9pyJtGJ9!kxhZtzkyw!O(Q(H9O28QHOvYWSGl~J8bh^~dL7!uoGqv2 z0%cjbKqUk@qEwfu{52%aQL?%kv?(_1Um+5ccHq-74^t)pqok64%PMrS2;kygW&pRA-RHpHOdB~*i>I!>(qC#-IGs+pYjR2|xJWOv z<#B*e*I+}097Bgp0f657NC5QYtG|eSwfNPZj;div&H0)MdOKm{e9eR?9gKApQX_&V zF4!46`THYEIZDU=6^)@%Ja`n0sJ|f=wwcuMBSiu|Bu9akN0G;EwQ{nvl9iD3p6{U>~%dGfTYD1!I_<~*lWX}O#~!QK-0@= zT4h1GP|plii3|12C{EF4+7c8IoTFGAomultV#~ER(Ew^F4=Ca1Y?Q;WL_-AMs6|7h zlG?KL7Vw*N(t@E&hTZ}M5)gyL$1_5KglfkiU5hanMrVdmcDhI}3NT%y7ln5V`^YMR zOINo?fQ#LVV(S@SNr|oqu8O8soY9j?T~8u!=m-WvJpgn?mLQ8R6P&djD%G2;Velcn z;250Gq$s9XZbk$zuzW>d@6M12E3y;8A5=C@q|azF*PEK6qmCrX%5j@Y!Vv2tyDy&w{rIU+ z6rpb4Ffe^XtJ~RxsrM?GCFa15s1CSUm3hTd8!93!M>9%>imXB1mn(|`)U7~4lxc(A6>mtw;u(IP>d^N$VoPk6(1caGW;|k+VwDf!eI$QzBJjP^*{$rhg@k6=_TUvHpMk!o{El4R{- z`p>x84bqBk6rm@$D$=F}I;+V#2-{IIECYFo!NE&32cz<1Y^7m-L~stlBG*Ba-XF2y z$^1xk1#1L-F@FrD14t1qHFZvTkrN{2jS-qDuZnm(ro8E_RX-ib1~qyTZRDGpPuTnW zrsfkJFzM-R;};QQR&aAaB}~?Ph9j41l92ITs!59SPpgt6g7=nx0tNC#LK&Pewg=+V#ffwi}*p3_WYF7y$u0vC#)z{NFA z72#N$AR;(Lk)$z$MOr|7nYQkrgX`{!4l5fG!P%!M9gZU{LyiAFDng(;wy`i8MUQ0i zMa&#nMos|`Skkz2*Gw_34Zox0&9JVQ8QO4}URYiX>7s-&wdmH$2yo~t3G|op?T~K~ ze?q?Px^_0nFs48W6~J)xT~*#)Fev;=#C&u?_J=OKc43`N#7O{&vJOD71_>P9g3)GF z?ZpJXWhm3PG{3mi(1$Vs7n~|^MajLTOd`0P`(>{K95Zkse#g-Cu2)(is*(Ao1xjPJ zJS(tXqqP!P^MqAtrImV!;MXa&66vF+SginoCB;|_(Pc?nYuHly?wo5{$!{AA`|Z@i z_GGQBSQNOi(7+uobSi)rVfjANKv@Q`>SxMEKmng^RV!mf!y-5pd&uC4^l?*{ETcC` z!YKNgmXKbSPerfg=tXe05eod-^HPRW1gBs>iii6mwx-1%%)LGw-6~gLbQ7G@{18yh9pl!&l@J^kdd;VaSh>Nx7d!(*ssJ`?50BpDPm^;+ky8c_*WXUyfQV*I10loMevNH1y->5Mhmj%8FI1_AVjq**Lmcn(MTc+zoHD@x6e4Il zXhjsD#{}oXPRLULz;OW|0sKF1L0)ATnX5DpqZBaKESO9Yytfn(C?I(l5h1dOJ`p1S zEg3(hEAnZBYHbk%JG>x9=GQh*Ro|b$o;az3Zr{;v0^R6lK%yQlVkZAeW)@8d(b1cl z5@r)1Fq<(*x7ceuF80ABTy0p8tMzJrjb_+KI1OCbN&zmea;YG|+OiPANmqp2G`(;g zt)vzGVIcS+(3QQFB7(;i)Xrs4DR zb_hu2h(491cjSH+18y`JusM_pD<=UFCOAb$q!=Q7Mw7Y3M%0DQP#H{)A#5LWC$XFj0?P3CE{3>VQGN@r6FKoQ`m96 zENuZAm>;0YJ_Ig;E3dy+MTN9(;?%fS6nZ%TU~MoY19Y_B9j9fL?XS^`g^m1cV%N{c zsdbtv+nYsuu}9*RLV8L6@!3?C0|bbrF(jR}Oz5&W2Kjg58k)cq^j5C_X2sa?Pw78a z%3{eCB8V%s`XPc~Yo?eVy{;8TE{Mb8;mpGJm8%nn4eP}~95x&;#%jf37yyA42FQ-X zL~!DDB%uI690q(0kRq6TmvWqG*|3%c2yvbd2shdz>gVA`Vt`eR{L*AvF5z0eP^kA` z8!y!0=UIRn1`nvCeb;yw2-ZymC$q$fsYoT8tc=7I@F-qmXwr#9gar_2UkuVUN$+Tt zEa#Xv_?y@K%?_qT@ZN%Hpg=H<5fMy_=re+8KFcEQd3KT>R#44$a;QE|{NZ)E4+yP>o zSOJL~He@r&gpHNiJ|ki!02mDljM2CV-_a*o2>{UGBo5G!Vrww{5 z1Y{m#uJXa1lA#SHtqo^}^ZIeRm@a~|kH|{MV)aAF0t^TmF<|#IJLm?vMmO@pi8DJQ zZCaMInmSiu5so7I$C$i5WmI7=?Rt|V9S=*#S}J-S5d2s4I?xVo564=}#IU1yTOn6f z506B!s)rBv0>`bmQv_$l>45uJ5L<+1*Ok*U=2du_Z?{czti{YZqlYve8=Px}ocJO+&Q(6E89xr3g+k zVV#PI&uyR!sx26S&whkO4G|{+7}8-~sRHw`Pzkh#B7Vplsso=dyIwO1F8q4UB(iWl zC}Q{bMtfVg8#GDCH*e4+W#>a8cp@KC_i|3Ve`@abAKN!`_EVsuPfjN9I{_u~BT#_+ zNE|NCk5-!*H)>|UQr)PT5m_p04_*Z4cnG=rmgng1$zDF1$p0JvZ(T)_xd2=^u7IJr zbVX)Q9EaM%Y0I+wB4lH!Hca-qs0ypoX>G6aHT;Pa|I2~S_J3R3tK&X z(TXdipf!5@!P+Fl;3l}aVIxwlC=bEykXD?(8cQW3zJ^kDcu% zL!9y0nPEGV3i0?$fA^&?wcq;1iO*kXzwp80j%V7t_AS5tLHod=_NyPz6SVC&57QI0 zIsLTI@O{Cy``k%)YcP{*zw?@c{>90kzeu3b2d(MN+Qm=zUUyaw|C^qgnz&Bre`Dge zTjza$`;a>mOuE(sY*WQlegQub}l`?GoJUv>>Mag;)zH% zepGX~Cg*5!qwf)g?~6g=)@yk=L*)o-v?y6k-HJJ_HKXc`Wc1z%4CuKAzH?)(T!oSj zaHAp*+?=nn$4r%UL|8rxHc&|iSW!?01=)L#A~@BbNliuixGDJn6@aif7>w zqu$i~JNp9ivm3v&jp>^Y0z={bw^tz^!mfo!wV^ToY-2o0|2v(N8c1Fbj1fE)7%ZmKBg znALg(P6X$D^MRBQSckNS0}&i6s=(Q*|B2vKbtEMe>EouP5(3ENCs!@I$>iG6(a6ZB z7YVNe04W|M;NqQHq>dr3RgwWNEDCUC3#AC27D|!6l?dh6Mn}iyf|=2=Nk4cxJ!@RT z$EZ>%o?~bYv9VBwFsV`wMZY&+9+=PjbEAUSln3ASx?*+MY@Q)pqwtIw(Q4M z=C}&Vivf`{W5DQv21|KG@J&SDK*|fOsK)nw>z0&Pq>s<&htW9zkeXm921qkl?VRK{vc9gHcFH z6Q`C$%zFC)O~{DRo0>XTJ;6s9uDF+J7*^>e&~Ius;w4aAt7XfUmfO`b3>Xkwz8Ekn z23dwd1ZRghkYNB;T%iOJycaKfbrHO#yt+sqHAQ*`0Bm4kC6P5M;FWuBP8c0;$(m?Vs9kATbK4$*6|qJ55-mv z?uRD!W-{NNOH>Gf0~JExP%|DG5%IHogX0}^ad1r!m2F(piz?gynO+ z`fn0pf>SC$nUqK$X9@AsMgTF{Pw_$|odAFYf*J-GR06+a_@M8ke9&Lh5-5VJ`@yOA zBjO|pT`)I{kn}+!P6CKFZ1|>wby5N$7IKCJTBDfo+^QUD!F@Z_5^&#+d|3}CB?dXN zbhTb1B!0NN6eWIf3&kKS%xN8CCL`6$08W+L&Or&x<@r4w? zVSQs#&7APVuIsy^Vv%?chdG>1S^mJ|sai(b<5+$hIPtOzZq#tKEA+1bz*(;tpnKXu zNOY95+DA?{X-PxSwn8xOnPa@c+r!&6pl+GaKYsq7MDJ%T)>4g8gTIjzGAthJ|Z{;LBg%s zj$x+dbb%NF66oN~1lj3|;L+Lst}i;FJ5KOpG%6m_a*3F^u6PqIlX~V45GMN>qT52o zPd6Yb#x);c!ZjaGQu>Wc|C>v$4aZwqH-g>smc3I3pxO*EPG zQBxw66M6Cw4Hk(nAWWfSh%aJ0w4$6l7H6;zx2+H;;I0Sb66prBxk4XKEp zBRQnp$y#^fei(!gxXgQYKnY&NApO7C**bl8Zf0z9t9h9hmufH$?)I!F(v@JZyD&8H zV5A7nj!g@;eHp`A3SdAP9RqSg)tl%7&E;Bjfrb+;MR%Mansl4s1p-fNVqa903@W&y ztEjNT0uXJ2bLupZ76a=RgNVCAA}lQy!M~@pSfr1d5;rUWV#>>7$=+7ez^NE6!2mHX z!9?Ydc&*{PL~vCcvtNp{#8bSI!*Ue{ry_O+7&PH5=@1jMEa?z4nq?f=VU{8|XDk%( zbaf}_j5}2ri|Qy>4{s%GJqIora>YfLsvG* z3b#aX4ump7m7dCJS;XPh1rW!Ar--wj!U1t6cs?esH){=S*y_XJm2mLbj=*P#;5QjD zjY!|kgi#6EYQ5f%QSiDR=)NPQ+ww9ZIG4l*@-o2su=X+_f(*Z2Im^q4;6YOI&FL6T z=6X|8B8&uLQ@oo*M-)Z^0)`2cGK6iRPbV|bI`iTA#;i9pHXVJqYDlo58-Jb(g(`-< zim&UnPMe(=^MZw}vk~ZrZFcnIh%1>$i^$1(N!DGJUQ}lYE;_?VVFWHbh1Olf&H(8T z$@ivTRf8kAOcxdHV>yKf6TvqS6_N7LGVG5+f8+gf^hFejp{U$ShE+sMO`WTzs5zmk z79%vPYOD0zo@2Or+yrD-pRTI)``jJ|Ko*fa0;ATW1(zk+$ARX3OFAf1Qye3G!GqjfdR)B!@9_`hE z^?t&tq}TH5BKSWjvn$ePG?`0GO$o1#-lm8?L3Bi39T4#9pp+q!#g*~L$xDZKSFJQC zHZX9M*J(S9ve0!p<=|-k33m2|>xsAR&DXphXS?VI%}^YUzCkmTuiCDbW5WQboMC`yJKow9 z5W)G#ei#V>0C5EH5x}W+Y`Ap_5x_0t{v8|8!LcRoLl2bd0xKLFux6*aA~<`m=wh@< zA2;=Q0?5iHF(#}=d>cC>)fK@{nPbCfP*4z;?bt-{z8xE|!LecRY{w>on~qJSZ#5hn z5W}&7)PWrvu)?tcYqnz(!L|1i=`)(lC8nl?V?%FKL=DFV2-6r0=-6&D9NSGRb8P4Y z$A(U6$0lOdjtxzi2>SQ#*kF=}bw~n}OsDJ8jty{dZ1HfWV_T(%Id3sCHe5Gni@jQo z4Fe!!!vMrQZOSaiCW0q3HUPlp0v`jU2qqh>vZ-|ZX~i2rh=)0WaAUYEWaR;XhdE<_ zQ|n4M>xF^P;o5ost`z9NHlQ0gM+8>5Qee$?r6M@{%aIY0K5iP+l>#yB6iCd@5k>G* z=1MUd>@0}OcBLYC->wwc;7T!gwks9EO;;+?w;HY#h~Y{>>cFlPSm8>6HQSYn;M!k` z^chX&5>r#cm7=#PqJ}F4glP;I!mj-GmMGq8SeaYny{S%#B08bai%#i6uZUSL^pcJz zQ%v-PQ2}~>X&}sPMATgip)lics|mEm@zHIolP_-3d_}&vW%ct#41jzQ17zomB6u=i z1OW0y;A4P(-6{|kb+iM7rNk-%U}GBK)VkH%4S~Ns7Wn>3uRsU43UmXzRbYh%0Bg2e z6~Wnej*N)(anqn~6^LQ8Kw`FA6~RxLTg7Owxgajvt%~4%yH#L=TgBknZdC*~-Kt36 zYPeM(hFb-x1G`mVgJ`_(Px@*dGEbL>E}I{hq~h^@l(VV*?Vi{h-H>YDXnc_iB3114trg$5NlK=r< z3Q8GbfNjhXZJe-;Iiigd>wPCTicYBZqEousD`M8wUNm7M=-+#_7rqL2z2K|Z@~5^j z0SEsX4`)_;SLdPb`!qlCQ1^YBpA=#A;6H_mLvLzzzu|E1@8&>7aAKqN1VX%zjV`D- zV+5`^hxG#yCjoSRvIfkj&wKS_*U?&`d%o_<&~8`8_Sv;LnXbXspzO zsg<%W3X9+rlXO@qbiqYojBsgUr9_+zU>KEjiQl^E_K=#G~Qy7;LCT#&MffT`cGc`Ky1_+ZW3}J6&^hW99 z2DcyA+>SEym{Kf`2o86ZHuoE19lwbFIUcVxq#wxO$S`(fedFsA8JRx1!_1;PnOTxX z5i?uhFqjeN!2ms%0={oB@cWv9>j+bSrE#ExIs)Cmr2t?>DF9frO93LdE(M76twt#T zh~ck6VsV{0G{=bW7*a2@VLI(&@a2nKC*uplHHG(4U&j06#4cRuGO@ z5ivYsMRFJEbRKYsUxneiev9G^%_W3@XGDICBPq1uTNE*N^IH`2t#f9dq^~vjqyCgP zx-FP<`MVUYbtTVtYWafGa0@}L+VJSt*1B@tbAx=PT+h3eLdk2WA8VD0Q)(9TZoOD^ z8^u8V=mdG+Y5EPfUN1CCjk5aDYkE$p;gs@)a-osWYsjF|Y!s@6Vy)o?PP6JL$fg^3 zrDCb%*PT+W;4@9Fb@_au?$t|m*9~gTdb6N^Ec#BV)F^q)O0D2kG)ehVqgZZu1;1V@ z*6J0FGheMWokF2fC^(g}=io=DQgS`N;Wxc{qgd0^%sYWwDLMtGRw|auOZZ&Yekw^8wn1+Pv&4zVsP|;x{Yb5; z>$}r)V^0MOt$UYuet2@nv+ctRi@)Eo_~yHDm;X8X+R5L(vGi|;7x(??0gU_^E zhv=Ii^z9J+=NLRIE4aHJ?e-KQIYBk@emkX>xL#;EXW=Dgk>9Z;%MZ1zWR>t zoPwlJ!z}K4x&6YM%f}bmufLJY^Jit=`DFRCck#of0)Z^F)(|mcv;Nr3LhEWx%krNO zw*T@oO$3R9rYVJ;bbsP=O2* zsESM0qvY3|DlyFW^g>k{j@K*{-HKB!HmZ=FN>DE4-JsHF*4$>v)oW5MyJW1Yw9@s4 z-|(tx^{Ner>;;(*zZx_v75wN2je<+|rd(^%|FsFJIpqQkRSbe!vDnP>k`A@boeO5? zMm;}hj!g!mPq`EG0WI0(i+|j`d~k2>wk_)ST>JCSPww2)-f>j3Z1JPtFTH(Wq4jmu zxiLmL?d<4J#{9V_7h0Qi*AvHHTt5Et(t&+o^6}p;ww}@b^tW)@2adH5zsG7uboqYZ zxK6cRYt&p=a1zOqPa5Glb+=g8*0$zV{7T?e>MZJcSIeK1FIW9?rCh1{c~VuaQBI*u z@>?pnWJIe)aK)(x#eB)DRNbKL(?1pe9JgMpRmwpQuc((erBLsuaS3yq+tU4&lD ztrJrXauh$Ap^r8!w635ImpR>>YybY^#aCV;!_1QZ$K8=&oH%}9apBP7 z2XD83yKm|6`|Ulikl2vJQF4+*Jvuox>IWX#=grX&i~s)i;{NBm4bk59di%)X_9r_| zKKDV0|AHibdcPvZe&-6X>n}7Vr;$Cz^b~#UiN0px5`Uf~CpSj!6cUdQJ(0xkKS&H~ zKeK1){Ugf<-i~x2)S7jQT6bo~-OfC4w=cA6noRxiDf%$fZ4~}ole_<^1C{%!#VAVe_LY|aLRVl;_DPle`m+oN|+&N+`{ zjsFZSp#mxuMX0OGfD6Z^smyzG^w}E4*2wTI9r^X*8$Ua7?AKr_sSFwVU%s+@;P}aX zWO&X~ETnITdDGj&&SbW(0ULEgj(iJv5Kf)gu=wJE_B$`Ocl~LhwO(Nfr#|h@xZ5HM z(DB%Qau4mD$Ec&`xLy!8Ta6mIb&3T%uUIHoD_UDQXmc8Vv0Q4@$a-sa^YR6XBpzLO>5 z(aG7dt&@RI%QAFTLRhYt4<#eURj9^trq-xXeWZVE)$&3smn5xPR@h>Jy<&oh(C#H7 z!XKRswl1_TLB}in+~QkD+ei0M1h@Rzn_5n-PTR(w4k)s`oXpDN?l*IOF#98NIK$K1 zIbh@9aNlPUmQXanz^6!0U7wW{I+4>2xuw@XTYTx=<-h#8z4LG`go>1EgSiab<|pRH zMtM3FO*nm`?!@OG=4ghw<>PNG9r=hN0Z=y`%rtY0``&FI-=~RE5zYA~!g*&j@VAnE zy)el^=aJmcHqd*tFsn(E}&$v0JX9^m=SX5Oz+ zWJ)PR2?>YqR4R>9K%r{EuT~J&`F^3Eujd=3QZ1-A0xh&bvFs8)*P$@7Tq$U85>O68 zK87-jX1(m@bqEoZ%N4iSpz-T|f!v`YsadT0wPLmEm75e97uiD%wa(@MZZ1H^@r{Sn zUvkQEwr)huaRET>q~oFl-0+M>AEq4_qL-a_5F?xAdeLi?^M0MOrF>qy&}O6R1#Y=n z%Qsy=s4*wzTVGY9jy^T#HYS3FJv5Im)A#fi#`%*Mt<&$D^5^O2ms{t0GgGs(qubQq z3Fz^yyQsRVzK`)F{p;n{T8&RrHOq`qtxvG3$DceLb|)x_qU0s zhSNf8E&p?F`*bim>24z$Rg*uzjiQ~ixXJarfL?6DAL@gNgoydUh|bnb1g>@XD}gQq TP#A;x*7*jnC#RydnIHZ?LQ{n? literal 1026702 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

UE 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%0DCN`ySI=-;$;| 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

L;9yb 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 IqgLv_0j;Zto&W#< diff --git a/Test/TestProject/temp/ab6e54ba9a669f76.pyi b/Test/TestProject/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/TestProject/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/TestProject/temp/ee084e9fc6ee413a.pyi b/Test/TestProject/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/TestProject/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/TestProject/temp/f3560b99de458aec.pyi b/Test/TestProject/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/TestProject/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/TestProject2/output/0df65b8ed15664b0.deps.json b/Test/TestProject2/output/0df65b8ed15664b0.deps.json deleted file mode 100644 index 0c6f101..0000000 --- a/Test/TestProject2/output/0df65b8ed15664b0.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"hashlib.__sha1": "0df65b8ed15664b0", "__sha1": "0df65b8ed15664b0", "hashlib.__md5": "19f8024d10c828e8", "__md5": "19f8024d10c828e8", "zlib.pyzlib": "1c46d554b3a3f9f3", "pyzlib": "1c46d554b3a3f9f3", "zlib.zdef": "213348433fb01cc6", "zdef": "213348433fb01cc6", "binascii": "257e074b935c33b4", "atom": "271ea3decb810db2", "zlib.zinflate": "451745df21e598af", "zinflate": "451745df21e598af", "main": "541a1ed9b8be53c8", "stdio": "6f62fe05c5ea1ceb", "hashlib.__sha512": "6ff26590374ae6fc", "__sha512": "6ff26590374ae6fc", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "zlib.zchecksum": "8ebed83a7817fa0c", "zchecksum": "8ebed83a7817fa0c", "zlib.zdeflate": "90921d009fdd674c", "zdeflate": "90921d009fdd674c", "stdlib": "90c53dd6db8d41cf", "hashlib.__init__": "96837bcc64032444", "__init__": "d63d2c2a2bd9bd2a", "hashlib": "96837bcc64032444", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "hashlib.__sha256": "c9d54a4158f7f5a8", "__sha256": "c9d54a4158f7f5a8", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "config": "cfc83b830141b00e", "zlib.zhuff": "d541ade6afb689a5", "zhuff": "d541ade6afb689a5", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5", "zlib.__init__": "d63d2c2a2bd9bd2a", "zlib": "d63d2c2a2bd9bd2a"} \ No newline at end of file diff --git a/Test/TestProject2/output/19f8024d10c828e8.deps.json b/Test/TestProject2/output/19f8024d10c828e8.deps.json deleted file mode 100644 index 0c6f101..0000000 --- a/Test/TestProject2/output/19f8024d10c828e8.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"hashlib.__sha1": "0df65b8ed15664b0", "__sha1": "0df65b8ed15664b0", "hashlib.__md5": "19f8024d10c828e8", "__md5": "19f8024d10c828e8", "zlib.pyzlib": "1c46d554b3a3f9f3", "pyzlib": "1c46d554b3a3f9f3", "zlib.zdef": "213348433fb01cc6", "zdef": "213348433fb01cc6", "binascii": "257e074b935c33b4", "atom": "271ea3decb810db2", "zlib.zinflate": "451745df21e598af", "zinflate": "451745df21e598af", "main": "541a1ed9b8be53c8", "stdio": "6f62fe05c5ea1ceb", "hashlib.__sha512": "6ff26590374ae6fc", "__sha512": "6ff26590374ae6fc", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "zlib.zchecksum": "8ebed83a7817fa0c", "zchecksum": "8ebed83a7817fa0c", "zlib.zdeflate": "90921d009fdd674c", "zdeflate": "90921d009fdd674c", "stdlib": "90c53dd6db8d41cf", "hashlib.__init__": "96837bcc64032444", "__init__": "d63d2c2a2bd9bd2a", "hashlib": "96837bcc64032444", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "hashlib.__sha256": "c9d54a4158f7f5a8", "__sha256": "c9d54a4158f7f5a8", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "config": "cfc83b830141b00e", "zlib.zhuff": "d541ade6afb689a5", "zhuff": "d541ade6afb689a5", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5", "zlib.__init__": "d63d2c2a2bd9bd2a", "zlib": "d63d2c2a2bd9bd2a"} \ No newline at end of file diff --git a/Test/TestProject2/output/213348433fb01cc6.deps.json b/Test/TestProject2/output/213348433fb01cc6.deps.json deleted file mode 100644 index 0c6f101..0000000 --- a/Test/TestProject2/output/213348433fb01cc6.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"hashlib.__sha1": "0df65b8ed15664b0", "__sha1": "0df65b8ed15664b0", "hashlib.__md5": "19f8024d10c828e8", "__md5": "19f8024d10c828e8", "zlib.pyzlib": "1c46d554b3a3f9f3", "pyzlib": "1c46d554b3a3f9f3", "zlib.zdef": "213348433fb01cc6", "zdef": "213348433fb01cc6", "binascii": "257e074b935c33b4", "atom": "271ea3decb810db2", "zlib.zinflate": "451745df21e598af", "zinflate": "451745df21e598af", "main": "541a1ed9b8be53c8", "stdio": "6f62fe05c5ea1ceb", "hashlib.__sha512": "6ff26590374ae6fc", "__sha512": "6ff26590374ae6fc", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "zlib.zchecksum": "8ebed83a7817fa0c", "zchecksum": "8ebed83a7817fa0c", "zlib.zdeflate": "90921d009fdd674c", "zdeflate": "90921d009fdd674c", "stdlib": "90c53dd6db8d41cf", "hashlib.__init__": "96837bcc64032444", "__init__": "d63d2c2a2bd9bd2a", "hashlib": "96837bcc64032444", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "hashlib.__sha256": "c9d54a4158f7f5a8", "__sha256": "c9d54a4158f7f5a8", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "config": "cfc83b830141b00e", "zlib.zhuff": "d541ade6afb689a5", "zhuff": "d541ade6afb689a5", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5", "zlib.__init__": "d63d2c2a2bd9bd2a", "zlib": "d63d2c2a2bd9bd2a"} \ No newline at end of file diff --git a/Test/TestProject2/output/257e074b935c33b4.deps.json b/Test/TestProject2/output/257e074b935c33b4.deps.json deleted file mode 100644 index 0c6f101..0000000 --- a/Test/TestProject2/output/257e074b935c33b4.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"hashlib.__sha1": "0df65b8ed15664b0", "__sha1": "0df65b8ed15664b0", "hashlib.__md5": "19f8024d10c828e8", "__md5": "19f8024d10c828e8", "zlib.pyzlib": "1c46d554b3a3f9f3", "pyzlib": "1c46d554b3a3f9f3", "zlib.zdef": "213348433fb01cc6", "zdef": "213348433fb01cc6", "binascii": "257e074b935c33b4", "atom": "271ea3decb810db2", "zlib.zinflate": "451745df21e598af", "zinflate": "451745df21e598af", "main": "541a1ed9b8be53c8", "stdio": "6f62fe05c5ea1ceb", "hashlib.__sha512": "6ff26590374ae6fc", "__sha512": "6ff26590374ae6fc", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "zlib.zchecksum": "8ebed83a7817fa0c", "zchecksum": "8ebed83a7817fa0c", "zlib.zdeflate": "90921d009fdd674c", "zdeflate": "90921d009fdd674c", "stdlib": "90c53dd6db8d41cf", "hashlib.__init__": "96837bcc64032444", "__init__": "d63d2c2a2bd9bd2a", "hashlib": "96837bcc64032444", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "hashlib.__sha256": "c9d54a4158f7f5a8", "__sha256": "c9d54a4158f7f5a8", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "config": "cfc83b830141b00e", "zlib.zhuff": "d541ade6afb689a5", "zhuff": "d541ade6afb689a5", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5", "zlib.__init__": "d63d2c2a2bd9bd2a", "zlib": "d63d2c2a2bd9bd2a"} \ No newline at end of file diff --git a/Test/TestProject2/output/451745df21e598af.deps.json b/Test/TestProject2/output/451745df21e598af.deps.json deleted file mode 100644 index 0c6f101..0000000 --- a/Test/TestProject2/output/451745df21e598af.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"hashlib.__sha1": "0df65b8ed15664b0", "__sha1": "0df65b8ed15664b0", "hashlib.__md5": "19f8024d10c828e8", "__md5": "19f8024d10c828e8", "zlib.pyzlib": "1c46d554b3a3f9f3", "pyzlib": "1c46d554b3a3f9f3", "zlib.zdef": "213348433fb01cc6", "zdef": "213348433fb01cc6", "binascii": "257e074b935c33b4", "atom": "271ea3decb810db2", "zlib.zinflate": "451745df21e598af", "zinflate": "451745df21e598af", "main": "541a1ed9b8be53c8", "stdio": "6f62fe05c5ea1ceb", "hashlib.__sha512": "6ff26590374ae6fc", "__sha512": "6ff26590374ae6fc", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "zlib.zchecksum": "8ebed83a7817fa0c", "zchecksum": "8ebed83a7817fa0c", "zlib.zdeflate": "90921d009fdd674c", "zdeflate": "90921d009fdd674c", "stdlib": "90c53dd6db8d41cf", "hashlib.__init__": "96837bcc64032444", "__init__": "d63d2c2a2bd9bd2a", "hashlib": "96837bcc64032444", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "hashlib.__sha256": "c9d54a4158f7f5a8", "__sha256": "c9d54a4158f7f5a8", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "config": "cfc83b830141b00e", "zlib.zhuff": "d541ade6afb689a5", "zhuff": "d541ade6afb689a5", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5", "zlib.__init__": "d63d2c2a2bd9bd2a", "zlib": "d63d2c2a2bd9bd2a"} \ No newline at end of file diff --git a/Test/TestProject2/output/541a1ed9b8be53c8.deps.json b/Test/TestProject2/output/541a1ed9b8be53c8.deps.json index 2e7e413..995dd61 100644 --- a/Test/TestProject2/output/541a1ed9b8be53c8.deps.json +++ b/Test/TestProject2/output/541a1ed9b8be53c8.deps.json @@ -1 +1 @@ -{"hashlib.__sha1": "0df65b8ed15664b0", "__sha1": "0df65b8ed15664b0", "hashlib.__md5": "19f8024d10c828e8", "__md5": "19f8024d10c828e8", "zlib.pyzlib": "1c46d554b3a3f9f3", "pyzlib": "1c46d554b3a3f9f3", "zlib.zdef": "213348433fb01cc6", "zdef": "213348433fb01cc6", "binascii": "257e074b935c33b4", "atom": "271ea3decb810db2", "zlib.zinflate": "451745df21e598af", "zinflate": "451745df21e598af", "stdio": "6f62fe05c5ea1ceb", "hashlib.__sha512": "6ff26590374ae6fc", "__sha512": "6ff26590374ae6fc", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "zlib.zchecksum": "8ebed83a7817fa0c", "zchecksum": "8ebed83a7817fa0c", "zlib.zdeflate": "90921d009fdd674c", "zdeflate": "90921d009fdd674c", "stdlib": "90c53dd6db8d41cf", "hashlib.__init__": "96837bcc64032444", "__init__": "96837bcc64032444", "hashlib": "96837bcc64032444", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "hashlib.__sha256": "c9d54a4158f7f5a8", "__sha256": "c9d54a4158f7f5a8", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "config": "cfc83b830141b00e", "zlib.zhuff": "d541ade6afb689a5", "zhuff": "d541ade6afb689a5", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"hashlib.__sha1": "0df65b8ed15664b0", "__sha1": "0df65b8ed15664b0", "testcheck": "14d33679f7fadf1f", "hashlib.__md5": "19f8024d10c828e8", "__md5": "19f8024d10c828e8", "zlib.pyzlib": "1c46d554b3a3f9f3", "pyzlib": "1c46d554b3a3f9f3", "zlib.zdef": "213348433fb01cc6", "zdef": "213348433fb01cc6", "binascii": "257e074b935c33b4", "atom": "271ea3decb810db2", "zlib.zinflate": "451745df21e598af", "zinflate": "451745df21e598af", "stdio": "6f62fe05c5ea1ceb", "hashlib.__sha512": "6ff26590374ae6fc", "__sha512": "6ff26590374ae6fc", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "zlib.zchecksum": "8ebed83a7817fa0c", "zchecksum": "8ebed83a7817fa0c", "zlib.zdeflate": "90921d009fdd674c", "zdeflate": "90921d009fdd674c", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "hashlib.__init__": "96837bcc64032444", "__init__": "96837bcc64032444", "hashlib": "96837bcc64032444", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "hashlib.__sha256": "c9d54a4158f7f5a8", "__sha256": "c9d54a4158f7f5a8", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "config": "cfc83b830141b00e", "zlib.zhuff": "d541ade6afb689a5", "zhuff": "d541ade6afb689a5", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/TestProject2/output/6ff26590374ae6fc.deps.json b/Test/TestProject2/output/6ff26590374ae6fc.deps.json deleted file mode 100644 index 0c6f101..0000000 --- a/Test/TestProject2/output/6ff26590374ae6fc.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"hashlib.__sha1": "0df65b8ed15664b0", "__sha1": "0df65b8ed15664b0", "hashlib.__md5": "19f8024d10c828e8", "__md5": "19f8024d10c828e8", "zlib.pyzlib": "1c46d554b3a3f9f3", "pyzlib": "1c46d554b3a3f9f3", "zlib.zdef": "213348433fb01cc6", "zdef": "213348433fb01cc6", "binascii": "257e074b935c33b4", "atom": "271ea3decb810db2", "zlib.zinflate": "451745df21e598af", "zinflate": "451745df21e598af", "main": "541a1ed9b8be53c8", "stdio": "6f62fe05c5ea1ceb", "hashlib.__sha512": "6ff26590374ae6fc", "__sha512": "6ff26590374ae6fc", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "zlib.zchecksum": "8ebed83a7817fa0c", "zchecksum": "8ebed83a7817fa0c", "zlib.zdeflate": "90921d009fdd674c", "zdeflate": "90921d009fdd674c", "stdlib": "90c53dd6db8d41cf", "hashlib.__init__": "96837bcc64032444", "__init__": "d63d2c2a2bd9bd2a", "hashlib": "96837bcc64032444", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "hashlib.__sha256": "c9d54a4158f7f5a8", "__sha256": "c9d54a4158f7f5a8", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "config": "cfc83b830141b00e", "zlib.zhuff": "d541ade6afb689a5", "zhuff": "d541ade6afb689a5", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5", "zlib.__init__": "d63d2c2a2bd9bd2a", "zlib": "d63d2c2a2bd9bd2a"} \ No newline at end of file diff --git a/Test/TestProject2/output/8ebed83a7817fa0c.deps.json b/Test/TestProject2/output/8ebed83a7817fa0c.deps.json deleted file mode 100644 index 0c6f101..0000000 --- a/Test/TestProject2/output/8ebed83a7817fa0c.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"hashlib.__sha1": "0df65b8ed15664b0", "__sha1": "0df65b8ed15664b0", "hashlib.__md5": "19f8024d10c828e8", "__md5": "19f8024d10c828e8", "zlib.pyzlib": "1c46d554b3a3f9f3", "pyzlib": "1c46d554b3a3f9f3", "zlib.zdef": "213348433fb01cc6", "zdef": "213348433fb01cc6", "binascii": "257e074b935c33b4", "atom": "271ea3decb810db2", "zlib.zinflate": "451745df21e598af", "zinflate": "451745df21e598af", "main": "541a1ed9b8be53c8", "stdio": "6f62fe05c5ea1ceb", "hashlib.__sha512": "6ff26590374ae6fc", "__sha512": "6ff26590374ae6fc", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "zlib.zchecksum": "8ebed83a7817fa0c", "zchecksum": "8ebed83a7817fa0c", "zlib.zdeflate": "90921d009fdd674c", "zdeflate": "90921d009fdd674c", "stdlib": "90c53dd6db8d41cf", "hashlib.__init__": "96837bcc64032444", "__init__": "d63d2c2a2bd9bd2a", "hashlib": "96837bcc64032444", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "hashlib.__sha256": "c9d54a4158f7f5a8", "__sha256": "c9d54a4158f7f5a8", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "config": "cfc83b830141b00e", "zlib.zhuff": "d541ade6afb689a5", "zhuff": "d541ade6afb689a5", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5", "zlib.__init__": "d63d2c2a2bd9bd2a", "zlib": "d63d2c2a2bd9bd2a"} \ No newline at end of file diff --git a/Test/TestProject2/output/90921d009fdd674c.deps.json b/Test/TestProject2/output/90921d009fdd674c.deps.json deleted file mode 100644 index 0c6f101..0000000 --- a/Test/TestProject2/output/90921d009fdd674c.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"hashlib.__sha1": "0df65b8ed15664b0", "__sha1": "0df65b8ed15664b0", "hashlib.__md5": "19f8024d10c828e8", "__md5": "19f8024d10c828e8", "zlib.pyzlib": "1c46d554b3a3f9f3", "pyzlib": "1c46d554b3a3f9f3", "zlib.zdef": "213348433fb01cc6", "zdef": "213348433fb01cc6", "binascii": "257e074b935c33b4", "atom": "271ea3decb810db2", "zlib.zinflate": "451745df21e598af", "zinflate": "451745df21e598af", "main": "541a1ed9b8be53c8", "stdio": "6f62fe05c5ea1ceb", "hashlib.__sha512": "6ff26590374ae6fc", "__sha512": "6ff26590374ae6fc", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "zlib.zchecksum": "8ebed83a7817fa0c", "zchecksum": "8ebed83a7817fa0c", "zlib.zdeflate": "90921d009fdd674c", "zdeflate": "90921d009fdd674c", "stdlib": "90c53dd6db8d41cf", "hashlib.__init__": "96837bcc64032444", "__init__": "d63d2c2a2bd9bd2a", "hashlib": "96837bcc64032444", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "hashlib.__sha256": "c9d54a4158f7f5a8", "__sha256": "c9d54a4158f7f5a8", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "config": "cfc83b830141b00e", "zlib.zhuff": "d541ade6afb689a5", "zhuff": "d541ade6afb689a5", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5", "zlib.__init__": "d63d2c2a2bd9bd2a", "zlib": "d63d2c2a2bd9bd2a"} \ No newline at end of file diff --git a/Test/TestProject2/output/_shared_sym_includes.pickle b/Test/TestProject2/output/_shared_sym_includes.pickle deleted file mode 100644 index ce36e5846d969494e85ed2ee9d2f7932dc2ae10b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1195877 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

TuMqs)fv$NT2( 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 JzqSV=|3C8Dndkrj diff --git a/Test/TestProject2/output/c9d54a4158f7f5a8.deps.json b/Test/TestProject2/output/c9d54a4158f7f5a8.deps.json deleted file mode 100644 index 0c6f101..0000000 --- a/Test/TestProject2/output/c9d54a4158f7f5a8.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"hashlib.__sha1": "0df65b8ed15664b0", "__sha1": "0df65b8ed15664b0", "hashlib.__md5": "19f8024d10c828e8", "__md5": "19f8024d10c828e8", "zlib.pyzlib": "1c46d554b3a3f9f3", "pyzlib": "1c46d554b3a3f9f3", "zlib.zdef": "213348433fb01cc6", "zdef": "213348433fb01cc6", "binascii": "257e074b935c33b4", "atom": "271ea3decb810db2", "zlib.zinflate": "451745df21e598af", "zinflate": "451745df21e598af", "main": "541a1ed9b8be53c8", "stdio": "6f62fe05c5ea1ceb", "hashlib.__sha512": "6ff26590374ae6fc", "__sha512": "6ff26590374ae6fc", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "zlib.zchecksum": "8ebed83a7817fa0c", "zchecksum": "8ebed83a7817fa0c", "zlib.zdeflate": "90921d009fdd674c", "zdeflate": "90921d009fdd674c", "stdlib": "90c53dd6db8d41cf", "hashlib.__init__": "96837bcc64032444", "__init__": "d63d2c2a2bd9bd2a", "hashlib": "96837bcc64032444", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "hashlib.__sha256": "c9d54a4158f7f5a8", "__sha256": "c9d54a4158f7f5a8", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "config": "cfc83b830141b00e", "zlib.zhuff": "d541ade6afb689a5", "zhuff": "d541ade6afb689a5", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5", "zlib.__init__": "d63d2c2a2bd9bd2a", "zlib": "d63d2c2a2bd9bd2a"} \ No newline at end of file diff --git a/Test/TestProject2/output/cfc83b830141b00e.deps.json b/Test/TestProject2/output/cfc83b830141b00e.deps.json index 162aebe..37028d0 100644 --- a/Test/TestProject2/output/cfc83b830141b00e.deps.json +++ b/Test/TestProject2/output/cfc83b830141b00e.deps.json @@ -1 +1 @@ -{"hashlib.__sha1": "0df65b8ed15664b0", "__sha1": "0df65b8ed15664b0", "hashlib.__md5": "19f8024d10c828e8", "__md5": "19f8024d10c828e8", "zlib.pyzlib": "1c46d554b3a3f9f3", "pyzlib": "1c46d554b3a3f9f3", "zlib.zdef": "213348433fb01cc6", "zdef": "213348433fb01cc6", "binascii": "257e074b935c33b4", "atom": "271ea3decb810db2", "zlib.zinflate": "451745df21e598af", "zinflate": "451745df21e598af", "main": "541a1ed9b8be53c8", "stdio": "6f62fe05c5ea1ceb", "hashlib.__sha512": "6ff26590374ae6fc", "__sha512": "6ff26590374ae6fc", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "zlib.zchecksum": "8ebed83a7817fa0c", "zchecksum": "8ebed83a7817fa0c", "zlib.zdeflate": "90921d009fdd674c", "zdeflate": "90921d009fdd674c", "stdlib": "90c53dd6db8d41cf", "hashlib.__init__": "96837bcc64032444", "__init__": "96837bcc64032444", "hashlib": "96837bcc64032444", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "hashlib.__sha256": "c9d54a4158f7f5a8", "__sha256": "c9d54a4158f7f5a8", "viperio": "c9f4be41ca1cc2b4", "zlib.zhuff": "d541ade6afb689a5", "zhuff": "d541ade6afb689a5", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"hashlib.__sha1": "0df65b8ed15664b0", "__sha1": "0df65b8ed15664b0", "testcheck": "14d33679f7fadf1f", "hashlib.__md5": "19f8024d10c828e8", "__md5": "19f8024d10c828e8", "zlib.pyzlib": "1c46d554b3a3f9f3", "pyzlib": "1c46d554b3a3f9f3", "zlib.zdef": "213348433fb01cc6", "zdef": "213348433fb01cc6", "binascii": "257e074b935c33b4", "atom": "271ea3decb810db2", "zlib.zinflate": "451745df21e598af", "zinflate": "451745df21e598af", "main": "541a1ed9b8be53c8", "stdio": "6f62fe05c5ea1ceb", "hashlib.__sha512": "6ff26590374ae6fc", "__sha512": "6ff26590374ae6fc", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "zlib.zchecksum": "8ebed83a7817fa0c", "zchecksum": "8ebed83a7817fa0c", "zlib.zdeflate": "90921d009fdd674c", "zdeflate": "90921d009fdd674c", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "hashlib.__init__": "96837bcc64032444", "__init__": "96837bcc64032444", "hashlib": "96837bcc64032444", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "hashlib.__sha256": "c9d54a4158f7f5a8", "__sha256": "c9d54a4158f7f5a8", "viperio": "c9f4be41ca1cc2b4", "zlib.zhuff": "d541ade6afb689a5", "zhuff": "d541ade6afb689a5", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/TestProject2/output/d541ade6afb689a5.deps.json b/Test/TestProject2/output/d541ade6afb689a5.deps.json deleted file mode 100644 index 0c6f101..0000000 --- a/Test/TestProject2/output/d541ade6afb689a5.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"hashlib.__sha1": "0df65b8ed15664b0", "__sha1": "0df65b8ed15664b0", "hashlib.__md5": "19f8024d10c828e8", "__md5": "19f8024d10c828e8", "zlib.pyzlib": "1c46d554b3a3f9f3", "pyzlib": "1c46d554b3a3f9f3", "zlib.zdef": "213348433fb01cc6", "zdef": "213348433fb01cc6", "binascii": "257e074b935c33b4", "atom": "271ea3decb810db2", "zlib.zinflate": "451745df21e598af", "zinflate": "451745df21e598af", "main": "541a1ed9b8be53c8", "stdio": "6f62fe05c5ea1ceb", "hashlib.__sha512": "6ff26590374ae6fc", "__sha512": "6ff26590374ae6fc", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "zlib.zchecksum": "8ebed83a7817fa0c", "zchecksum": "8ebed83a7817fa0c", "zlib.zdeflate": "90921d009fdd674c", "zdeflate": "90921d009fdd674c", "stdlib": "90c53dd6db8d41cf", "hashlib.__init__": "96837bcc64032444", "__init__": "d63d2c2a2bd9bd2a", "hashlib": "96837bcc64032444", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "hashlib.__sha256": "c9d54a4158f7f5a8", "__sha256": "c9d54a4158f7f5a8", "viperio": "c9f4be41ca1cc2b4", "zc.config": "cfc83b830141b00e", "config": "cfc83b830141b00e", "zlib.zhuff": "d541ade6afb689a5", "zhuff": "d541ade6afb689a5", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5", "zlib.__init__": "d63d2c2a2bd9bd2a", "zlib": "d63d2c2a2bd9bd2a"} \ No newline at end of file diff --git a/Test/TestProject2/temp/dd3002730623424b.pyi b/Test/TestProject2/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/TestProject2/temp/dd3002730623424b.pyi rename to Test/TestProject2/temp/14d33679f7fadf1f.pyi diff --git a/Test/TestProject2/temp/9474791561654346.pyi b/Test/TestProject2/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/TestProject2/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/TestProject2/temp/_phase1_manifest.json b/Test/TestProject2/temp/_phase1_manifest.json index 0f76911..36df067 100644 --- a/Test/TestProject2/temp/_phase1_manifest.json +++ b/Test/TestProject2/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject2\\App\\main.py": {"sha1": "541a1ed9b8be53c8", "mtime": 1782266206.092594, "size": 881}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject2\\App\\zc\\config.py": {"sha1": "cfc83b830141b00e", "mtime": 1778402243.1661563, "size": 531}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\binascii.py": {"sha1": "257e074b935c33b4", "mtime": 1782266199.8074288, "size": 14937}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hashlib\\__init__.py": {"sha1": "96837bcc64032444", "mtime": 1777902641.540433, "size": 186}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hashlib\\__md5.py": {"sha1": "19f8024d10c828e8", "mtime": 1784356818.7075372, "size": 5847}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hashlib\\__sha1.py": {"sha1": "0df65b8ed15664b0", "mtime": 1784356827.656474, "size": 4516}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hashlib\\__sha256.py": {"sha1": "c9d54a4158f7f5a8", "mtime": 1782266203.9352357, "size": 5332}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hashlib\\__sha512.py": {"sha1": "6ff26590374ae6fc", "mtime": 1782266223.3380039, "size": 7162}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\zlib\\pyzlib.py": {"sha1": "1c46d554b3a3f9f3", "mtime": 1783538216.7783763, "size": 26101}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\zlib\\zchecksum.py": {"sha1": "8ebed83a7817fa0c", "mtime": 1782266235.9510274, "size": 4067}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\zlib\\zdef.py": {"sha1": "213348433fb01cc6", "mtime": 1782827035.812386, "size": 8591}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\zlib\\zdeflate.py": {"sha1": "90921d009fdd674c", "mtime": 1783538197.82992, "size": 19061}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\zlib\\zhuff.py": {"sha1": "d541ade6afb689a5", "mtime": 1782827037.897873, "size": 13495}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\zlib\\zinflate.py": {"sha1": "451745df21e598af", "mtime": 1782827035.992862, "size": 18078}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject2\\App\\main.py": {"sha1": "541a1ed9b8be53c8", "mtime": 1782266206.092594, "size": 881}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject2\\App\\zc\\config.py": {"sha1": "cfc83b830141b00e", "mtime": 1778402243.1661563, "size": 531}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\binascii.py": {"sha1": "257e074b935c33b4", "mtime": 1782266199.8074288, "size": 14937}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hashlib\\__init__.py": {"sha1": "96837bcc64032444", "mtime": 1777902641.540433, "size": 186}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hashlib\\__md5.py": {"sha1": "19f8024d10c828e8", "mtime": 1784356818.7075372, "size": 5847}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hashlib\\__sha1.py": {"sha1": "0df65b8ed15664b0", "mtime": 1784356827.656474, "size": 4516}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hashlib\\__sha256.py": {"sha1": "c9d54a4158f7f5a8", "mtime": 1782266203.9352357, "size": 5332}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hashlib\\__sha512.py": {"sha1": "6ff26590374ae6fc", "mtime": 1782266223.3380039, "size": 7162}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\zlib\\pyzlib.py": {"sha1": "1c46d554b3a3f9f3", "mtime": 1783538216.7783763, "size": 26101}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\zlib\\zchecksum.py": {"sha1": "8ebed83a7817fa0c", "mtime": 1782266235.9510274, "size": 4067}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\zlib\\zdef.py": {"sha1": "213348433fb01cc6", "mtime": 1782827035.812386, "size": 8591}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\zlib\\zdeflate.py": {"sha1": "90921d009fdd674c", "mtime": 1783538197.82992, "size": 19061}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\zlib\\zhuff.py": {"sha1": "d541ade6afb689a5", "mtime": 1782827037.897873, "size": 13495}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\zlib\\zinflate.py": {"sha1": "451745df21e598af", "mtime": 1782827035.992862, "size": 18078}} \ No newline at end of file diff --git a/Test/TestProject2/temp/_sha1_map.txt b/Test/TestProject2/temp/_sha1_map.txt index 976db2f..df25906 100644 --- a/Test/TestProject2/temp/_sha1_map.txt +++ b/Test/TestProject2/temp/_sha1_map.txt @@ -1,4 +1,5 @@ 0df65b8ed15664b0:includes/hashlib\__sha1.py +14d33679f7fadf1f:includes/testcheck.py 19f8024d10c828e8:includes/hashlib\__md5.py 1c46d554b3a3f9f3:includes/zlib\pyzlib.py 213348433fb01cc6:includes/zlib\zdef.py @@ -12,13 +13,12 @@ 8ebed83a7817fa0c:includes/zlib\zchecksum.py 90921d009fdd674c:includes/zlib\zdeflate.py 90c53dd6db8d41cf:includes/stdlib.py +9474791561654346:includes/string.py 96837bcc64032444:includes/hashlib\__init__.py -ab6e54ba9a669f76:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c9d54a4158f7f5a8:includes/hashlib\__sha256.py c9f4be41ca1cc2b4:includes/viperio.py cfc83b830141b00e:zc\config.py d541ade6afb689a5:includes/zlib\zhuff.py -dd3002730623424b:includes/testcheck.py -ee084e9fc6ee413a:includes/memhub.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/TestProject2/temp/_shared_sym.json b/Test/TestProject2/temp/_shared_sym.json index 7d00629211abaae200e8d157415167e2e7a0eacd..283482818d12d194687588aa5868949700fd42b7 100644 GIT binary patch literal 463682 zcmeFa349w@wLk78cDyEWmS#_ymNrc{6R%0S#%tn^EjwP4v`wqZvYgS4ExB6aCT-uN z3&jHQSgNu-C=@9BTKa$ok9{e;ANyM1PuU(&cs~k#{2xnMfA>41ku=g=*&59pr5W|} z={FwR$>@9Tx#ymH?m6c^ukwMV6-z4c-<^qF@rLlJnTg=EJK~v`_9f!$ru`F5-eAbr zG^%`mO#OC!=F|O&i|Iw7pEnV&NqwpOvJ0=Rb5HPp$sOUplyJps`Agm2 zU^Ea(NEPwglO8+;!jVKQ-hhXb!D&y#&$-3ob(5ZmC-u`6%2Vc#J)w~2lzY-Y6HeTe zh*yUr!I0-T-cj!lyQiW7uNwqo@m1Q_?paUBqyBcKCv<#wB3^ki=$}m7m+-_J)nCFd zxC5RUpYm^}|7OS+iG~6Rxj~hsyh>ifzXCt`ocKye!XNNXM<==XB8hlacULetofcTt zNzZf?pR5W}2q!L%SGxE+67h;eyuLroCGGb@a{R;A_J@aq{y@ZsPhQg>9`zp&_$K++ zm81UCzJyd0osic{74n9dyfG$kipiT}@|K$t@-~;eJtm*azq)|`zf%G$%# z4w+2&BU66gH2$?({k9YP|L=Fbr!3pN`LVs%cH)lQG z6Nd4~Xs#Bg)KjVMVAHYXY1f_iCo(N8!;v=>~{eh-BE>$>z zVBpkDFdF8+zcQ5kx45VSd|q%>TruhMPJ2SWNmVTTeJi}G0x926ey4VZi^4ta=bA6q z#cTSwx+aAqRXjg2l8CS3A1WyU&$QozSFH;9!olg2{NGi7fa%14D;x<$6#-Q92YeX* zs~Dwdz#k0ouj}~N7#}VX{scu(^a2J%eT3>q)ZfLwr%I0hY$bnC$f=U&-@!kt@a12x z!B21V`eyN0-JEb3pK&?=UL@qeBl$3;Ow!nkS7oxKGl6p zn{&s!{FVMlxM}v3KOqnDe}$`;JRFk`#pDr}Jj%Z@=90%_@?n>J#3dh%$=CBqawGrt zG5+Vx@`UV-$&)VG7n7%A^6{7~$7Fv@X7loim^>YmXJT?7CI>Z6d^nTuQ*EfBRdD5> zrg7B*$>($9qfS}*B6G5mqXdkrlZ=fm-~wEeCdmZ73VFaRy?LVnjR^+y9JkvO3C{Sv z?uaiOar1@H9rp2=X=LsfAiFC$vhij9y_fK%MR{ya@W<8`{^&~%w$Z;VU!GiDcDv-} zi{%!spKUR@JtlX=Z zHM*2LAcx`DXdauKqfjocP!)@GB?=t2@0`&JwT7$uCoEKT(GrniQRI-%GwGi41-#s^ zF`))&gQ8dvZMiV|m*mGq7R0dwzK(pr;Q(`&xIEy6xLVdN8S9A#d{fH8d#2|+r^4>( zp!bA(D %QO6jj<&Sl0NY>o84B7zY$Q^Ew29|Cq4MAtv(d6{_HQN{{FR+!LxcU@ z?vdVs&ZE6OrWSVd`y#$Y&h=ur8*h52%LicIXs4^u>>hHBjt}+{)2uV3xx_x2o!y7V z`$wp0)*I4XY9CFmw7s39)HE9mX)d#mCLc}APhzEAVMw#mKANMwhuqzxW5hI98q%z? zp5|smW|~sYmSq8&j9s<-wzQM=&H}f)h*?(-L?GtbRhOmCg@XbGqdPhwbx{u_!(nL0&FXPG9d)2t=D$_Jg{{C#jaK)kqp~r zY`<8SIiXN(N3t}-vONj&iUcB?69|=yu3AfH_~|;XXSuVk<9e2R>^iPzx!bPedY1d{ zI<9BA17C^Nns|4D6HSxHJOv#b*Bh3<+IWkH|kbQ0`_s-NjiQ>*i+xPf(?`fOZ z*V^uFZJlVd?rd~kNuLlz_2M-U+TqRtN|}8}l^KsHv9IAvE0RR=v#jmvXd_pRU#K*B zM2U)K4QLV%<{wm+JfK9yvi9I1`gy*5nKI9LK#7WG4QLV%=6aPSk0+6_93Lm2m^)RL ztLRwPcaL=8v`4dd5ydf`7 z_AxWQ8F>Uo`G-net7UQNh?mA2y2k@*K6ie#Kz^bXYLT0t$o}O_SBrD#)S{ZJg`yNM*tjZKE6a+GwCO2A_EsnDJJ4fzQUx!MSvUUk784 znp&PGT+9x^*b&UP+?VZrcJ&mpf6gNudf5B&&=*19A~3y zUK1<*g@nV78ESO<1EH%QclCCn#?C zb|puM>KJyljz4V@LEPx&l0=y8la_x8(ta{VKjZC^M3@GY9sv4$pp4N^zg&_C(}U8Z zUxGZLjM2|{yCf0j4W&n)K7lA>^wTewB*J{6G<*8Qq73%wmrD|1p3%CL-7iVPQC#qT zr7DkV?OUHIgHq%o#f6_hk_hvY(x1YrL?w1JPWcOOB1f34vobaK#b@p4cLMBQPCl8c z(UM>(I(z3An1daW|9C^ayr1T2T!1%7>>+yMYrOW)947YnW6g=tY_c6HL z^aDuIOgmnQJTPN!i)jP=Y);0HSB7yJhGFs}uTELsjk_|&^3){YNOZqFRVl1mDcU8< zc!-+0n4buzb@w>0)!w_1_w($p z%!{u~34`A`CUOTIVk(zM!^+ivhF0>d-wxEP>>aNLc6vuOd^gY)o#dC|8S0pA?$Omb z?osWG=Qi!KLZel{88wRWy3}GAHXahb7}O|>K}Xv{tAV-~epWAyHHy#7uXHpPh6$yZ zH@sNWM0A@d7Qim8;k#y|8F98R0PJcJb7w67cG~?~H@|-Lc)%SMxSR_Ze(f}o-+!2S zt&#Sax7yedksTBEg!h`)Maay=02g`FX``E8WP2QUV$KHVTHLsq*T}#upajW6L~YRX zRw9-MJ*PDqKTeP&-dmq)(AT-s0VsYiYCd0U(F4EW)rHQm)Fx&-zdwL#;2Q>e2M>;S zxjP5?54cRtbn{1os8+}f`)fu`sC}+bVqdRY%5r?J!j{z8N_>(NxM* zjSRA^3n#O~F}ctdEQ>sIUYVv_@}p-qPsX+6$Byiy_Htd79@o+b5!uZM7ucu7jY+cB z?3~%>_@_(o)lq~y$PJn>EZj)4Un@dL?jzZ6%?W{UN3}&0g2fvv z)>sSO&;+rTKbg=5!X3t1%?>zYqp>kf*D?DIP1l{a?bwtaYv=4fHs_Fb!X_j`#htVl zS*{K?ajXOh@kYDL#oe!4P(u8&ewRJhD65xSbh~mwyKJ_OFWE|`mUvNjc}=yqx3skH zX`b+UeS0Rn6S{fFS=ZSIfD`hQ~&1(FvZ&%~P3nT#}HDBzKo8Idpls9beji zqgQ3u(2za1iHr5)@{KA>ghh#1R)eK&ikrS4BaZ^VUnPy$ zC=uyO#D49Wsw+}Af+*KP7|z(wsDu$6B_do6!nTd_DjjE$o%)u_8bMMb)|E$i7}%a+ zRuhVvJNPnbG>?C-az%iYh-+1k-DF!^1Z4l9l0~N(Dzb-cBg;-Ah+;IR)%A*pf{+mv z%`x1lYKsE1pP(Cx5zP%MO|-`$qFDo$1O21+xSa9jCxiY;kx{xxWs49P5!=ecL;dy` zCHXss1G-nGh^9V76stxL4vp9~n%(M6TZU8*s#FojBcfWPP_=Dktx?&EwD)?IFIp54 z@m)S{-`FzcA~PeK#8jS}>3G(vJZ&4;#+1vXsIzE*Ppibyc8O?!YX*i~2k^fw%TBzu zdmtD%j{l7vrx&S&d0jje;o5O~8Lv)_bbjWqRhgry6wy#u+BeKq$}k%b@w-)`+v$i_ zDMM_JLZ|n8Vx|7L$`}o@h=#W6h<%>pQ*ifGtzZR)d=6@iOlnl zRL1D^MKrM07+2c}S1Wf|ir7A_vOS-WZ6C6l+!0%*F8jMkk(V?mJ3TZkBO2DKfv!$+ znyXcs7tqnH#@@#^?ajNa^^{7p znU3ai(6ni;GGT<`Zz|6gVxBh5Q}G6N#R_Eu+e*ySra3A;lHI2AY@_2@joE424z>o1 z%wA!*>2j5BJ00B`WtQ5;w>G(`iXu+esDwLc3AeV`OPH^$BEmx|;XSm3JKF3e%$HXY z;agO~dkG0E3#^TV)wXjY!ndk~_t6oqRhL@Z7%vzlzgwkz1uX&oQ2rqD)a7a&RQGb-gy zV#>CzNT8f&MXFn=Yze#QC@=NfW1HC{*u@*21#M9|cGGcO=C{cvvrmgiUaFGpp(JUO zDQ4dkk-SnR*-J^%uIRuvY(QqT~kt6Cs#FK*s4n;OptW7uYeHx5ODazn z9nWgcv$?}AqC$u72P)AaTB5Bjb`cdieZN+T4$~6tXtRr`(DD1LO7svR(WsqsROtOR ztWq|eBXmS-K-9iTDs%z2s!T_Tnc6o?g?`{=D$_AyruI!!p)+`u%52loPW0yG+ zI)ei$&%<;)tHX8@6}m>pRH8@dh}Ol+QgJc?fU}} z?&J#`{5w>>*VFN>#Y$r%;aa8mNX+=fD&rgI7+24Ed5qbv0j};of)KV~d|#)sy^)YD z$lA88`4~BU%HZ_PI=75i$LQ%Je2;ruMl^KN2zhs><|cLZ(wF53)^r zkBLIsKT?^x>6q3kOzl(O84=ars#I^GrfQ%5{*#F6KUAt7YO416{4WtvUDc@USSRSH z)~O2IV%ubWNW}GAm8+MIYn8jpu6xww%M6#(=c*hh={VMfBa_@SY~q=-w$#iCTO`JH zZ&q4qQe`KtNOQI;se{D?)!OmwmrD|1E6n;NbNY^$as8_$iLf=M_G)C7+N0#64w)&| z>Z>J*uvO;DgzY-Dy-_K;cBVFF+RG)0 zuz_cz=B(R0@OO&_-r)U`MA*kuQ#@OnTeAB_^mAV?NrX*3Q_{DW{=*{r2Je?7!q%SJ z0%u!?Pxb*3b^WU)iLlS7w$9ks?vp(xqMh|_Nh0j_slB@dO+QmkZ1UX_zuK3qC{i;r zwsrw!Pl|>-_w|xQ*a}n&55R@DEgbbH5&4|AOA=vYQ0?s{=?@yudAlSL_6pTzdkI>G zre=Hc-I7GuJXDjqojpX^#e&1K)R?E zr%QM*ER#eM$o>?PMA&Xrd%2BWN0}&}BejLoUM@+5tw*&9uXb#-rvoVy<#(heeCq9z zMA(K@$K9@4KT*Pmo;%(yNrWv)b=>VL0Tg9`=(*$Vl0?{^RP!lSt+T01DHElHq~fya z*Gm#%t5R+6$PZX;DpVGglchql>Z>J*ux+Wf!17nyRk|!HE=xId$#+Wwcnx33K& zlNZ50`Fcqr?5e75>?9;E8B*GS}spCF-C;kgX^bOuGNre4YGv9CH)PK!l z_^0MRVe{2Y{x(kjcP)m0YW5R$V%0o*97WmW*^3G$Q=WbD-I7Gul~wcd@NT<2dr|#l z%FEMUE=hzPS~Hp3<=KnsDRs4(ydtx|I|uH*wnQ)nN~;L+clo~Vo4%w@v2qTk#~Ac)$=KD zmL$TCuPM%UnRa1ZR`+H}B5VMgdb3^O8evRU_hv~V><6n&D(bedso9JdOA=vsSWVXC zO=45CS$VT05jKlWakgtV3q!EFH%k&>@7UCv?V8QP;H&P6eP=rp7&g^t%Zg# zYasjOl0?{#R?~XU+`j%d!pwo3w@VUXi`tC0+t(0B=%wboU6Kg9)@Hojz79D;Z#C!b zl0?|ZR(pF%`q`!|ed_I!MA+L_3;mR)#ce7#Ed6>(BJ6jY$=<#xFLY&dUoT07J#aH$ zZ{MUBI<>j4mn6czxY{ynXV+L!d)$;~tG!&32s`C!_O2uib5r&%^>#@jY@Vxmmb}So zDSGIpJll--OA=v6U2W3Y+Gm#Ci{^etq4wO@OA=v!U2XKS+}PJ$)2=jKc~f3q`t_1T*rGR+y?tJu z@MJmn^^!!`wpV+7X}b5O#ynQKK+Z93-VNtf)4$x|`;cubaKvOgxXn0z88Psik$m>h`7!8;St z`w|n;iFlPlkd7bgU(dHRO1G)_aL*OT#>2i)_}G{)G~;*qZi|MG_4vXkBEi{XV(Fe0PG~wXCAzzJy0@ULZH{W(VkX zklFTtdHJs-zrWihH(xBbaLsFr$?Y+@V_x1P?TAhocSevejaQ9EJP}{w{)FfsaLIdI z{O>QKg~GhtmDk+x4`qc~<+U~PmGkmdG5Kn4-mc;AyEZ28cgdZxe4nh=N_|j2+`PaL zR!TFHGl>tPW zpmgI3HW5ef)J|Nf*Q!n9En}QN@TSC{l~x}Mfd=-BP85GlKV^p**pdyVCJW(?S}ElUHksZ}85@b63hy&{3z=N_t=>p7 zi8H@1k=!3JmpM5QZkaSW6uog`w<^q&`z97iKk->Hr<2NQb5bGPAS9in;s5HAOIK>-g4Bi7e;a`pJ*y zIZ~1;$`OFXgq(92!tXRLE}3E9Zf|?*#NNraX77}B$qe}qFqV7GD^*6|DScki zoY0gkU!zD8!gKJ$gdXFAz$%&A-_4b|0wIkVsf!e=mf4?Cen$@sgTcC z%<2PuD0byBxIx6(5l7s7VL^Uh8cFrO{uY%Rc@%tTs%$jr2VqN#Xqls(KB zvy@3-Z^hDfWx+dd?s`#Ex4>s&UsSkjd(N*YPukx5>*gdu=pP^`1tqZ9O<;e}$>AAu zav)q25rcpnEL)Vy3JihCW1 zh}O-?{)jI;>+w=9R9CA!aeo65&srrD!ZR^VNpn!8iEA2&Xmal=;U>DSC7lRYW0*2j{Gwig*vjvYi!l`6q4ky5l*)VXsP_7xZ4O?h-mc6nA?110x7-!gAD+59K`2t>3$TzuoTXKB#qd^!!OQ8mQm z{dbyWD2a}o%{Jl!It@@ZfJGktWsHC7%f)Q~%l5&9x44r|JF2;TmK%e zSBjbiTpgA3a!DdAVbC>LYPCTNd$g|rKyzcUv-jr(3~U)(+V>tjn$&~q)rr{F((SbOuG!F;Cf-| zcttxw&AX`l(wrm+v(GXmVPg^+Td~#D@=BPIrAflt#4NU(6Hi??!&;Rm&FAPaCltaY zB!0QO;*ndOi^Oi!iREUUSUl#$LYSG8p)191UQ=lo&56{PyutQ;I*G*0NrW&PMO$3# zOG;ty(~0C!b0Q(k(coRsl(}PVss{UxIpTy#3%uF7M%>EW1@??N=7cBs8AER2K|b5I z&D7#ac$}>bxxJ^_teXoWy&dZ_Clh{n0fEBn0WCbSmR*4jiU1K*s;jB#gQiD+1ZLXuf* zP)%^g_m0{`rv{b&z?8Xr-^$ay=;^+NZk(6-0+XgzZ*}Wkp1)U174kJaaB^)--tUq- z^H!#BqZ`-iaCBzI6EfHNw>-9m@2$=y9NX?;_xM=f-Xi9$%f#*xH&q)sA%nmAn>@;A zz?e%OkI9E!@)4JOG$vnvQ$oIxfBP8!^JaNM_QvE%m+Xtl*|)aM%hNG=MsGCZ=kO-v z5ycg0DoKz~_yLr-p`jdHW~7im(w8ZPQpEgpQpo%Ol0+B=%#=bY0)jdzWPSiiB8(B{ zO2PDw%v9LiKnm&ykR-wY;;OV=usD>+{x71Tg&TgtpxWv*`LNaDHMVkxDf)zgriL_q zD??7K*&K7i;LFN1bJLUFa9_s8%yB0SNMy|T;zJWG%K4^l(9IW_V0W044B;L?h{<67Fv@_&Q*xQ=8Ic;{6=I9HEGP zOhJhr%etcGGMY?zs!AFQFTpD=yTiM0s%^s8*6j5(d%Z0aZMsVjd8m8R6Y&_2m;;)k z#+UO-vf~k1AOO?1gA~vXD3;S+i7|dD30;erc#YS??@9AV1VJ|D3@KCv=K?-K4Eb!o z3nD5H$K*q?!kSIb=S09_MiH?3lYV~fsXy3M65GjY&(~7CSRKB!k7#w0sIe_spdp?4 z1p>=on&h2{!Wb5`{8ff!4^PlH(QnT@J-$OLZvERmIn~iVvDY`r@BQs)o7kPT{#At| zo`|4*BySV;_qu#7;cyeo4&xi5;!D~S9(h{<3xPO~l{*4fBq`=?3Lme^lfKI4YQ*i1 z^Inrx0Dpsp@FagN;X=4F#^g;gd2>wO!cPpIJqp0rfO)&t zfLa(1cPJP!mlY~V$k6gL@^*Kd=SE-Ds5{T}Eok5jG#7S*PIFC!dvWe@S88o6blEUG z1Dlsm7tbds|u}URUq*0OsE15#E4X3<> zgdUNxfQoaF*v98%>dcn(6Bp2S>eyhMj>=&GCmPs()O&1G_zLnW9*Z z6xtps#2(TzMabWSLDBUCWkonMPpY5K&D;H25n9d)iBSYGlOIj#HzRAX?JEmLbzd>ko}qrvqDjW;c~2 z`jer)>_Y5%?8}SFI3r8aCEd2(aUu1#)qpVNCN{1TCfvjt5H4;@%kJYUnLZDUrJwlG zMO=B(&URh`i z3ZGeoj&a7RskX8d?IyFPv`D!6H0wmtW=d#5zm9xR1pj<${ zG+y038VNE-CGT-5B|2wjamFH#w9rG} z=b14cWBGAWg##xqRoKFwo!6jj9=N7kRGyUoz-y&H?Dhxz5x-~Je_B+h>5Pt>@p>+c zDK3n#>~KL;P5Vyz1V+Lky0Co47m7;s)(%Ue(}V96UY$E!|H`nhLhm}JIFn!mVUNwYo0tn6D>*F@&`7-|(U zxP@0mJEX5g&9o;RanA-t_R$&LJ!<`d*=WQqF7W=%PO)h~o$%Q)Csw4y;P`owAqw9A z#@Jdq#6+x=eV$2Q$UPVGMMqucC&Mgs zDQyVP>W~V%UL*nsgj3iF5qW1!^Y}7fP|(TG83JIBI$HtQuY~*^;R&+83i&%@L(t%k z2BKl#q&rXlOGjuzyfIS}j^7sOrQ!6Q0i@v#2KXgBe5OQ%x4JTC%#?N6(s2B2$(4x1 zXAIkMk!WM(h&jSqg!~=hSFj#u^S3j8(l~qSG;b*6_Ju;hkb5S4+&E}wN2gtO|1Krl zVRu#_rLbnZSzQzJA77lKW9to0`rIcyg0pU0D8EUi+)PKgHtdV2qibqpwW?os<;u)N z&b#=b-+hT>>ZWnb%Ms^-CK6V?R*rrCBHw!NbTHs^Pn_b{NE9{t@|)8+yz0=WdxUnh zB^J;GM=a7NG{Hxw2@RgvS$-FewW<(b>fg)9KB)>R9cfLZzHHN7@Z6r@-Gvucm$Kn7 zZYg`5PF+@n<&Zyc!W{|noH#+&!vgE0ws53$foHduO^0DKXA`EwPp1p3LeW6PKf^sG zUnuMk3QjT?&;~W@+t^X~=>iEv_GAetU7D>+v`w`rwW#Fx1l<7F9xuv6ED!BfF}aYN zzGvu$c4ca4-Pr7y@&WUWZ+WRUUaEt1L(F}ApC?qr4zE1Eg%=&(N;keWMWwea+6z;h z_*OXR%AF6&W1IewH;v@mz`T3@@=nj#9)#)irEapggs9>*M%m#h3RKn@r~@w*E8N0F z=`^NZvoOI4X39e_P#K*aNna(iC@Z7;yB)e+9k`SM@wbxkgrqr!>8!9qd_@#@=Q+qLfqppj0`LgQ_###rV2Et z41{88(v~Nm+rsO29;-KbC1F8jOa^zF;l*e4oo2VwsYIQk65f!v)C$2Kxg>w#ir{|A zvtAkQq*I2*8{DoTclXfX@JR3IX#WuP4MuAORHX{*JG3?2;O@fZMWe&Ly*;LEp}L88 znQ#cuKPR({K|6hymRQeoO_FEnMs=NtZLRfe&$+?f)7#fMJ}_27HAXKWqv5^oAN)V- zIoEK;1D#{!TD)FBQ>w9^W1V7|`Ub{F&2EA z+Ws3-wZSZL^E-OItGgsT(KgYL=Thqxm-Fl!A1KXuZWi%eWauPd+`jh&WbS z&#{^>rMTOX*jwNi`53Efl`Ry2eRb2B^n#hlr^S>q*rO?va6BVud|V zM9_wXgd5qu{-fmDdcKIF4eLnd4elZ8MdUdmem2+~_;!31=^S+Tx~R9-7l?S;V0G&G zri2F%ct`tg!b`f8pz(zwnl_jmJ|lZaMqES0MrWshqD{MKzJzE>J2EmfLQM7|5!t`n z5;EX3w5M~d6XQxwb(e_h-)y1EC+T1>w?rjida;P2uiJWg`B zcLV|IlCZs0#P-j&u&o{JJnBBu)jvkPE4xgUx#y4-uYYkqja6j zGXh1d2T3^g-TAXVlkpkS5sb|twZuNoTQfQ9>RM^5cz=7DlEFY&#e1HRc?l|d|Dn<+ ztmr)_lfM1cz3daHSuQ+-k+9BnL#9M*uX$xZ;{r(~LbE5$iHETGb7Q7>>?j0fbr+|K z!})@y6$|Gn1Z8WLzoFgzvz|YhP%*-a$W56tB&d#LSLy_GjX41kmI-dj6p(c#gUoG? zIbr>r&K{=oBeXS9XjV!lf!u6xaii?EPE z=Uro2bX#B4z}~78*gJG0dbc?d5hnKQY@Z?`tCRfM*L4E=mQFyAn-dUWvb!#pNtf)4$x|`;cubb_cIl7TpPukXlndK^A!3%ihBiLj zbH%aoFu!Es*qARg<9GRPi-wQ&_`)Y5!P#SDAx|JYe5#xOEF4i_I22?)Z=~f|#5Xg0 ztfjfNwQX-(YwOg+?q;vIgO`8!6XmPP(^WC-?dS8EVR$=xX}VS`wbMiwP{fxx{0hl< z4KBfQ&j!QB6Pr2WBE@($44ha9j=0Xj&f65#6(r>IOp>o4d-yupwVRu`L2g)FcP4f@ z+TgKmLTm4cna*y5Dj2SI&fxz-A^)9jB4_T3fmCXuWbTK2MyD>#~ z(jVsc$ChG{*Qu=0(Ts@o8a->`QNBRsiw0*zeAlP=qHr3sIT#}KTv(gR86D4vIM;!* z+cP~K^crsk7BE-_1x$;%)l`1`;=2;uD>J-nLaN|*#H{BXw>QM(jWKysOx_%mxA5K% z+g$SYn0zk(>H_}%&O+_Rc@2u)ux^u?_jYX)RV|%Xj(h&QkZYB3p9=ZR8E%7NPu8vE zyIF!c!r3q}@ZEF+zwU-)sbADqHBkt%3@mrGlkngjM&;>rn1PEz(}FkiJUA>|GS5J$eXz1 zJ`f|agF9@Pwj0tmnbYm*=QsJ3f-`OhG2$%kSkzHzL96a+9pw^uRJb3+kgN^;AUEsC zVrU0?T_qV}+!kWUdadh9_srEYkN8%2yr4=%A`kk3i6=H1}kL%hpt2}-(f!H6N_ z3Og7pnLCJmG?g^FC4({RM)cmk#+YjQVVd$8a2(6tX)k59vRTw@@F>sHwKO z^oaxbA5)1F9@CtkF}t;KFWrI7msS3R2R3To6#c*}{E0{Y36(kF(ajEnkuTLD&QmIT z!b2Rj5Ir^S)*k0D7eACr_jf&nBdWsN-x3~esC83mY1ntj!A_bJ24T2gt?E{Uk#hE& z5%|x;yacf|!Xtn@#7huoBRmYqSpHJF?u26jL*7m}ATT2Cgrfo>?-Cd`!b1Zg?Gl(Z z!s7!Y+KxC#$k@iG?YUEq6f!pPI`U`v;lc&!jhv3QQ;r#oCc7gJ9JUz@yd#bto?}4V zNrw>U8t`|@aYSv3yQ$<`Q)#eTp=HJqgso-7t4{j^YJEgF!p|ONh?(;JXK|&(ZSBo_ z+S(_lTAF?B`}TUK%B95F7wj$1ccjE5e%D~x zJuW5XyTam>Z$;OQO99!t_(xId;@HRV6)MEoR{*G$Vn5IA=T=SZPYI z*|+MHqbi~V`FNcw1E*Ku#_N-E2>VY9vhkgfIL{u%wU~xgnvN(OV0Sv4{|RUFkFSuG zQhE2RClvNg3f2ZkOoe#0KkPn!+CS@PAyg?>=LkeF&rAA6MRYNFkF>)Ak1B>Ml;vLe z0DlphD9G2bzgz7ir0Q8>Mwd4)<5%N2S^&#~(a3BxB9MVY97RIjLBXP2c*lgyD<4}DTK|N2r6+W}6_2egiRA62 zZTg?;E-W?PIoH?ZcN1%D>9s&<2~A`pw(y#R{cSwhV4azsmrocvu<7u(mxoCsf&fq9 zI-{vY-hKxsJHKm}=%*(^Fr@gtwh^dVPc_B-2C#fA% zQ!O3s`*yePY4i9xro34vsrLwbRL(8n!|XQ>b;XzLO?ZlI8fDEYwz!Vl?3LC_pyk;m z0dZIAv)_-kbMI24S`0T~Dz1G!Cw*zZV zuq#()R6rSTvrL+(f~=E4H2x&Fj9kXno!IA%IhpW|8mt_B^}~sFTH5G`OJ%qX#>A@Kfzo=H``BrVP9JIB%_hs`NbT+tRI0 za_#9q(97Fs(vz(dk=<`S*$uKMEKmCoe7us$64{YE_7KLh@ZLp)F)X26iVbS9Pvw!zW9H;S7~R<{ z(w8E`J?u%HSpGZx)RJINDNout=+oweL>ToDDo?Rt5Vo2di1egdmww_>+MqmXQrZkt zQuq`jj0T)1QYA~m1MEsg9LeYayT+V22=~bgilZo}nz?o2m@p>}!X4yxk#-cnrDXT$ zWO1K4SrG26^2?$)y?Com7Vj`83&LGT?lf`GHst)AN#Ue@Nn#lx}R|f|2 zWywEsN&a+cE2`>pgX8Su^~w&+x^w*ei4yCkXGeYBXviNq)#D3$L;l%_C}qL{H}%C= zPV@(4AD6~KPhfIdkfKdegKwZ3FSokjGOudzB&3*pC{|ehz~Yj$<8?!adq)O3hlhK6 zh)pPZF@J9_pJLi=;PIONK*Sdcc&3d%iF_%0m`}<36ZtA^1!;!`<@6W~_-koxL4ziV zgZ|@!+zGaGUw*52c1U9R(9~4eC#dRS&R7}hR2k&a1!u@%x!ilw7ZB+}W?fBu`N2+C z&j7zDMqFECOJAd+orT4jZ97+ln!f&l-m(5cEU342s~C442b%XIl~;R;F>T!?GG!G2s_y>*y$5h z9vJVZjt!wuSsxp!;;yepaJqWF;LRBUe;Y@d-O7UnhN3NUMzf0>_&;n=U!}fLl8~&L z>CTwZ=2R(A-lM|!@`2&*(J^~0SG>BrTlR!@T#_&(yW~nP1xZ>#N4A=iJz^W%#_sVz z*nd3Wn;eycp@@j~8kIH@Z;8gZ;eanP;0Z^1LuNCx^VLb3K1*Wp_2LuBFsD8}Lv zHcXV?^p#FAj+7On`1W14DaJuM#b_7^dL{?_6CqFNRM}cs(9_K}rMRv%N>R2HXR=ZZ z&?!ZIU&!Z6S_->Y57W18Ju4gv+aeS$I&E0NJVDuZ6nbXgI&==ptZMaBND4qA@TDZ;uw|Fn|FJr*p| zGHCG$n1*C<0$=9s|5;u#crtL|Eg;4S^&_nnV?j+55 z>ntmVImNhvPBE%Rr+q%bRmF=_0_`@h^7cda$7B{WzD&)8S8nLFUhrvg7+CQgV$Znp5AS7)ohB%KPZ z>vtXQ9O&2hCfUY?H0Gch?3lY@6AaP>oUB3|hl9~dZNt#g_1 z_IR_^;+ltfr@VVxC-%1PZf&ZB&0QO$uGwac**OBXc9@?Ag(!NF42_Qw8*Oy= zH5%2yr8d~1l?u_$F5a?f$VINe8w6DCxI3a|u=A*UxO40v@o=I+vEgu5+Ay3edPhcv zM%<(0-QB&Tqr^-%37Fb3LD#87(J#yG8sheMXxv3@e$j5(Xk?|O*82-Cskj3rgoHf#CNaHv5NqbqZ z(T{Y=Te~n1%H8eL>@9k}rL6SVcXwbPwwL%;J@GTB#{v6+z0B9?nQM(;jan)!D!MP; zCW`C+$FJpDOAPL8A6zgt)%~(ho0A1$ach2ASXjWuo-`*5!g|gu`)N;gCu_LM)H*^~ z!YG!5mHNsL;#5XI)ACH8r9f+4KW$r4O@g4kNE!+v84CeFocWP9lV*2y68cDY`I$-N-4Yx2rds698crepZ;qiky6Q zmm-5?N(H$FMPIEjO@ZL>lnPRYH^^3R--iJRq}IVLYR%d9yeOE+s` zJ0)i~%Mo>025(k&r?c{TvjS62%R=EMCxQfTUz6syt-d4|^z0G^3JiEPy z6_1M(TTCyu{Fle9KJAr#-V@>IjN3Cg?F;eCAq<-?E+9OuZw9-I*FUFvwDGnXJi?QF zY)LGtiw4ETelgU>%Dr;BM%NXX}zA!b^16N-Ji_q8-n?%us`YI3q;Pn+H)+r@f!a!oTTF<`no zP&%sluZizKF}NJZB`@O2w3w||rY-Kyg81^ekYCu3Q!j=+yYq^{pkH_KVz`j&dKccC zbeYsKV?F#^?Cs}s7{^yrfa8GM0H**i1iXj?zj$_DJ`|Hj3URX*Cq3qC6Dd$>?)24m zZ2V8_d`yA6!{&tKP4{gsKw;){HvkiSi)^=g zW}44MhAdPW%!Yg?9V-L&65%T93_I|+!}&kzaQ=5Xod55H>!2e7fj0V=@pY;Fmlu8W z-BY|xdU4l-#w-1;EthBk-DZ9jN9Hq+9BbEev?ekG!EK2ADuLj<{gWMG@J+-fF5%ml zS0b!oomW0@+}Jz5BBe5L&y2m21x^BT>tKvG$uG&%C^g0#rS9O(q}OwId_zp$7?U@} z0*XmJL1XLK!1_0 zeQ`ry@*SRup>Lua`VFa}pY(?#<*_&4MmA>9bl1e#?=HpItA2rZ+78!X8FvjdPk|r( zYMw&b12CZ+Ep*DUDP7dh>)hVMA4Di!HIT$hJV;X2o<~CDFFiPhe2^B`MIqk}3HLvc}*NCrjzz#)tl|uoB z#+7prL3s*eLTmQYY0WnEpgehq+?3LxQk^DeY{J>AU`lK|8jPPWpl($lhef(mDHP2K zHkW?Vt;LzMt1ZF)N%^(poMCtICld-p7|qxskfMdL4fe1(DG=`RFAzwX zp`j7#D?WA=dx6@-#N<>fhc<8PgtujHR_l z#m6JXHHmg=eQo!_&XVXlu42>adc1x-;74Lpx9kZCY=4PXz^~FOeO=iTNK8a+ zHTI2C@AdB9!?;eChehb)iC5)lf6avCJJl1M6FI^Z#TX^Gbn%9{5#KD&VCzPK%$a2b zh~3~-bBFz*NYpdU)uNkQMMn#xQ4_|f*AsBOG^(PGUm{oY@If#T2?a4dMkB(MSLO&e z*-i&>&EU}ZXm2Uk%I=)Cauweh2cuzMId;U`=0zvsD<pkfUMEa&Z$3=0(vQ3n)=Y^{`@__d-{^!l|gzQy&bS^S@z3E85t7qtlcCIkme?xC+ zwh_3tGIJB1Ctjp0yvR9OcwlM8k_!AMx5wlTm%PViOHKjh5kuI<6ZM9E*YJ3WwvN|j zjrp#4tuo`sPR%-dlTf9IL9kEKssCRQRXsZo)@*eJ`CZ@K>kbE}eM8a6Y&6n6Y%J{s z@=1~%3AExedrH$;e7!h8o-}ZaXzMp`Yg@m?^`$bA{)&rRGZzLkwlM3%iCR=Nq_v`~ z4=swq~&q&}$mX2!=}rn{6l+aBQdULt$2CO!T|trBG|kgaZ6kE@D_ zv|w{u3r2Y*i7(Ih5v;d}nVJGJ9lYa(6QnAVlWBoCG~C1HWzFK8HTLQ`R7wU(uvnB$UwKcR(MQ|ZHm5O8=ld_6DD^vtG#1pB=hO~-|`EHA((y}b{ zV0jR%xr4W5D|;rg<=dTG=rmi;y`LIhq;*yWXL`es>Inz^gO10t$E}lv*fL5+}neo2#g{4W`lsLIvL~3N^8dp}Mk~h?5bZXQv!mqI^8>75^JD#P94b!F3qOvVAc50ucS`?tuqLt}L z^q{be$J9whMw>z7T#535mZ<}+SwiJV2N*3@4s91-c8INah(mM=vO2?)=@0OfODp$Q zsqK^D#;UA2)@x3rgqmZe3scq{K>>+vv7D21nzN02EUxIxgfBESmE1%rrbkJy7t|D$ z9hkzqH`=Bvx6$d!hQ8@&SkBZEHP6q~@q`l9+pUH2%4Gr8uRo{hG@~)?+K%}n(>`;K zOHw7cH@g?toR)RMdY!nVbUImf!;#Vv&2p5LL@Ru^%@@6!PDvU%r>BG7q%Ug90nJx(R1T(^ z3Z~vmH~#f~yw0dR{AX0k|9y1Bzb?JuQ2XUtoX@RA)Rjd;z3(ZnS5YU>*O6j{fUvYg9_6J!V=j3-W+EYRUY?H0Gch?3lY@6Aa78Zf zI<`8=c%a|aTN1J>MP!%SN4B^7;801(t`d>0w4UtRrmf7=Ydh;AzmjU{5q7EWMjF13l6??Cu|-hr8SdM*4f)M}|fQdXDsyFIt;Kq-|KD zSM?2z^d1-)8h7=$y9UOo*XPY5sy0}%#tf zBCa-U9#&>>rJt}nL`-eiG_1>DTB-?qo`|mvdxqN7{XfL(&G{mdHmt4n8CN$D(|nGI zrVY#LMuTqb%GFN9oG%b@wqb#-8|-zBtCw;Rv%FBm(uQTVzHg{|e6%DqcZz7*u%xb^ zYi((o^9Nd6ylQvtrtTs7E6H~07_+zIW>x#{q~DUm`3$+Fp8e2X;+N(S*X|uX!!E04 z9q5v8p9WkY6vUZw0V{jRUI}c@mB1Ns87KRuy}ZxM;hplvN^^~h{x(KdjXQ+wQ~c-T z(9iJGN+SUM6qXde`ICuk3c_17a&;js5R=y^XrdU=iDKNGCjm%^Y{a%M)_vMVfn2^CBsM*O-$4;l%;D{&89YnJIb}XLn{a(_o)ACnUnA`ME+$ zTZ>E~+1f>){mPu22ph&uG#D!E|yf&Y<8bHArbb6zAQ&bIbB$Br?=$|quDzZ zK_&Cg*?ZDYc~a2X2h7Qnur+ca@+_`cP@l}tzMqz0OM*R-e#$4$pP7>8-hayKm z?dTHBYOljQ*3`2h{gh9fYx%F4*v(Dp0^E06aW{(SPQ>jw)19V2F1sRAf~hV&+3j&z zr#T4{c7n|>K})B!+BsO$L3wc!44RW5VH4EcZFEL2F)It4GA$&xiLY3k03S3bK*Ii? zc?D>r27Y#N0{o&m0TQ;pJU7P*ruP*Vw>!+-zW>ggUr+^tIiV3Y`&(FOR@$qSU%{>Yj7Vr9b3!BR zbJvukY1}+fH@;)9HYX>-9&foDeA}D8v5%XR3Sob<+(YcN4KJdPkz#)M`PEO9d8M6S z{mh&=2wQtCC=PQ5NE1i(K<05?9e*;hiV-%o$`wc2^(jI-QXK{^SLC5cr#ZoPD^JO8 z6s*;pbO_ryEhrsx%94`KVV!iY*GcD?Iq4AgG0NR{Sk%~v{j)jlggtz==B&xqH1%O` zG)MhDx|mVEV+LCq+OW?n6GJf~x_&n7OXh?{*t#V*UU??=a$(Py6C`2Vl8bUCTuwE0 zDHyzAkqa=T4^g`$6T*=Kbab^n^;pA{s zPnI1ylOv$kf-koLD|M7Hzbuoy;N-?DEqqPPWp^K z86}wXl#O0;Cw&I@QcQZv&M&!>K7%~{q^E2JlRN1%sF!NeQ}%|*Ez3@oClmMDpllYC zd-9S|l}yZ=vU^N!iI71t^4Z=_Cbt`hBl^qa>bx@=&NOE4Wr*i@MNy}!^YWxi_ATzt zfcWyT>}hH5ASTH7C-LE)D~^qaeWCENF<)rL@ABOi4Ik_Ag-=9+v&Y6lo|*zv&l6x8 zF1{C{Chw7U@Jl(?OBM2ln7lD2 zZ;HvAWAc`p67eN_d9nO9m%KeDpL zg2=~k1%liwAJ7DU9XrWiD@$CmH2mK#5CR znU1Gjg_QR?R+E;fAU!mghkvi5oQEc|5Ruwo*)YeHVHTC4Ee-SQhm4kq1)A=bhdJx6 z8xzBf`&y`md9*y6UGfo^d^9Fs&z+YW`C@d8|9P`KVf+1-xVeRFn9H-dRKtu5T&RY* zTQ+61wd`kYaZVmFMY+GF0U3(HHlv44w{1R^b1Ht1nxH6YkYnpoO#?F*3_G>#tZ z2DRmp}P^sAFxd-@Obj*gXpY@LX#4Oa_nkUe2}+CS0ccB?zi zrcwo}GE|w}gYBn%o9j&i(xkiXAB|D(w%6v;F3MqN-{QlRZf^NF2JOn2d{s=on#Z56 z;ok4HF?qjB?#z2X3gJG~KmbL#vg}Vf0sO_B00?(zxdJF|%f_~HB~EL=xlrlCHGpvM zVjzIxG+@6@0Nv&UK0M~cU_K!EY|&H z|B@C6uaJFN`iYAtp%c$5&54K53p_7JJPvXT&liz*grC@$&EC|eu&DFA3HPNwmpQl}aTpOMl(BFx}h%danUF$vWc~ukp(M>B*2UVC_m5 zU()idO3va*cc*41g45PYp}gKF;KW2H;(E<5!LpA#Aa$D0%FBMd3MOb#%l`JmXYH~d zuY(l$9xfV)IC=WVD?`Dcqa|QxlIE%#4vzQrxd%Isy1R#ZdPj{lZGj{=^D&WzEc2(O zIS=lz;S%SSX|7%UW7Je}NR(;mHLB980#a{tQ@ZDkl2Xq(jq^~&t5dN=p`Z-H?Dg28 z*>@FWF69!e=K4)M`=&zKwgl^~Iiq~0c<}6EtjqQdwvc%V#$4~gv6~g z_zj1$#d?x;14Bc@?t%WnerknXCt|tIdX^2N2mAZR+?~8-j*FTn(liZ6(*~906LVB@ zAMP9&r=FPWMJ)ee{b<(mExLQ8({+HFBvMKZhqBUok}G-U{&(_Edf13f2A*CBh+hBRX*>`GUq={jV8 zx-!jpY=qoLTq!Wmk_};%jIr(O93Xd~P`hZf67l-aQC|N!=90%_^5KHJWf-2zXAG)q zd|-gsvp{5*ifM*Lc1ECOU3$JcBIJ_cVK^c9k}^)XFR5+vPi=>;p?HD)5a5<=4rdlOL0xl7GWibIoIG z0PTPdz>R=ofV%*916~GrIp7U|Hv%33ydUr>z^4IU2YdtY6TnXazX$vQP|H67s{?ES zYz15nXaaNsx&Y&V!vG&(3J?XH1Uw&bAK(GND*$f>yoE!Q?c|lNoF@AmzV#U3JAlUl zzW_W5_ygdNfaSa_nNi`lU42S^k1w0?{0N@pX zw*cM>_z>XV0bc<8C*XU4?*slD@P7e+0sIxvu$;pRz*fLEKntK1a1hWBI0m>0FblX9 za4+EbfL8%t4R{ye-GEO5J_Yy|;M;&-0GD*djNL= z{t561;QfG6-ie!y0X_!!IN)c1p95-YIn)9!16&Tc3UD=G05AwR2Dk|@4VVGk0k{(o z2fP^Y8o+A-?*P0L@L|A50AB$7C*TKwCjh?z{1#Bb`LHE`M!;&o4#0VU-GFAmen2N+ z7;uO~lj5_a7~llpG~jl?ivV%JYXJ`e-VJyU;NyT#0KN+N z8sJBO9|N8S{10GB1Ba!6)qpjC^8n`qS^%wpZa@!U3@{Gx0j2;a0ds&C0OkR&0=ydV zcECFT9|8Oa;ERAS0e%2@0`L^zH-NtZ{tj5Ng2PI{Ho$hk<$xx@HGpdYLx5qxEdUST zRzL`FH{c$?{eT4EVZfUK9{_w1@EG9pfX4yf1^g25E5I{=KLhGka;OJv0c-_a3b+h# zCEzN61Q-C^2sj2f0hk8d4!8sGB0wDQ8o+A-?*zOH@KM0W0AB)p8Sn$Z6M$a>o&x+8 z@HariDh?|ETLIeumjNyZTm`rqFaQ_?90S}0m8Obz^?$$0R9Z9Tf?Cqum!Lc za2eooz}0|j04~4~zzw(sFblX9a2Mciz{>&m1KtF981Qd^4*)&~cnt6zz~g`?0lx(N z3GfV{b}ffGz-GV}z@>o809OI71`GmRfSUnsKoBqscpl&`z{>zH2fPvRCcvYBe*=6L z@HxP@0p9`q0`Mf@kAOb`YSwY61#ALr23!KT6mTWrD!>3>5O5RVWZf>z&8Qk0{jf{bHMKbe*i4!D;}!`YyfNo z>;hcOAsg1DpVy2HXyK1K^E-{{;LW!2bY#2iUrS!!|%CpbOv! zFu((VR{;J4@KL~*0AB_?0r(-{H-O&)D)^^kO91Nt=KyvAE(Tl!xE3%BI0Tpk_yDH? zw{wWHk8V;)z82ql5bznmX92$kJOxNV0`3Cb4R|@=e!!am z4+H)U@BzT*0FME_19%+pB;c2TKLMTrG;HUv0$(62`~$|6>uNm z1%THA9t6A(@Ce|ufX@NG3-})3*MO%0OSu-XWq^%^k`0@w<;3~)K%YQQxB7hni*3%~;i0m6WL0nZ1#0`N+} zy8!P7d>rrzz*hiY1^f{3BMwnEb-pT$zvEl~036}pVMjScS?vYt4^QG-bAV3(J_+~* z;7LH^b2zL9TmiTeFbVJhB7i91UH~ee*!_S6;H`kS0X_!!IN+OrZvlP<_;0{70F*^V z*{+@HhuXwH9NP@I8Q=y4071Y%0sa~AHo)5f-vE3Q@K?a!06Q<_a1me--~!wPxEU}5 zKzSFt18^rG4tO!(wSWf!?*}{z_yXWR0Y3!%2=Kpv-ves+XJ@s5jR2H}McGBWRYH65 zt$l#$i#W^x?%%~B0eBPOVZft+e*=6M@I64q#T=FZo(tFwI085dxD9X$@M^%n0zLxx z55WHi_yM5)5)KW3D*;ylLVz&fLBQ((p9g#a@HF6m02P;VSORDStOo1=oCnwqXa?*D zbOMF}hXA(#Jb+oit$^nN?gG3N@G`(dfHwf%2Y3YVNx-K7Ujuv{@MFMF08az{2T*Yt zhb4eUz-qt_z-%xz~g}L0-gl?67WaBp8(a*RNyaMoMz*_(x0DKVeIlyCpZv(yq_&MMg zfZqfD0I1^Q%$5Vr0j%c`WtVrTgWryCbpT$~&f(R7F97}%@EgEy0e=Jh9k7Z2O}3ds zlzn`!`j1?VZ(Rep2XHUoen0~7VZcWKKLY$1P`igi9iSD^1~>vZ3b-9`2jKO9hX9`e zd=~Icz_$SZ1wg?t`yJr_2Q1~Ei7f-H2W$Xb0=N{gAJ7Rn3^)Ri0e-+~!0muI;KhK~ z0bUPy4*=E2QTF9dmH1cit*-*k*~ei$;4Z-3fDZsZ2snHNha-UZ0NxAuI^Y|CTk$Ku z!&ghL9HjFbKF6 z5CXgc@Jhgc06q%%Dd4{VwO4bf12h4i3m65A0Zsu<1KtRD6X0`z#{j-3JL?k(*;VB1P~&FE&idRzHURY;{C~u~ z37lm`bwAF`bocc1tPHcS%`z}-O;7KGfWWW_%?!v4U=qmlZ9UUPZ}c*YKllYy5b&V} z8pU1Qao4yYf?M<#V`5^WF)(3*jz#eITy^c`L}{4U7vf!qUfFUV&>9s~Ir$e)7z5adT7{|@pWAWfu+S_rZZWIae5 z$T=XFfm{yqQjk0mS}7!Y+qBxhSC`?fNO>E`w?MuPa^_`3&H{N5s{|5OV zki(Y~IRf&RAm0S}8OYB;PI(cLZ6H^I^n;9n+ye3d$TY~OK|TZWB*^zc8m=JH2y!OK zSs>Sf>;*Xj@-mQzLEZ`SO_09=`7OwCR}yIhIS1rMkefj61$i~dqadFJc^c#ykfr@Z zmVtDG^nm0+3Ly7^yawcxAfE#HF38`5{1)W6tB7m^ITd6N$kiZ+Kn{bv3FOTnPk?+L zL00W1vKr(RkZmAcAl)FBfLsc)59B(K5=a?j5@ZVGl^}P5OoKcK@@|m#fP50< zQy^af`6|e_LH-8hDUhQe{|@pWAPswnG=i)GSq*Xu$TpBJkZzDmKrRK@2XY-q38V}% z2{HxpN{~B2ra>MAc{j*=Kt2ibDUd$~`3lHigM16*2OvKL`5DO1L4FHz+|@*ufh-5v z46+5}EReH7UI20)$Zn85AUTkif{cQUf&2l;?H~_;OoO}+319<>s8sx(u9|8Fi$d^I>2IM;+KLPny zkj57iX#!afvH|2wkh4I}2e|;`YLII{iXbJBLm-DiUIlVD$QwW&0{Jk=M?n4r* z3-Wg$&wxA&@=K6kfh@e1NHfS`69s+qE$ooM)1M(=ypMZP~~;~Bb zQUoc1On~6hCORc_gD%hm_-PvCYao9Lg6m?{R*=0Q`#?Sb@|J?;X>S~nw8kAbS z^LMn_$MMqy$jd=q0dhac10e4Nc^AkhK>i5iEJT@SgPaF)J_x2^Y7@wp0r_K)zXtgh z$PYn&1o8`ze*>BS5+VygR)U-WauUeNARQo`AQyw|0=X7sFGvBT2r>>b0rGN?SAg6P z@&L#?LEZ)O36MVm`7+2KgZwqfw?KXf@*|L6fczWCe6o*P0J0L~1dx+JP6p`!=>)kL zWEaS_AbUXyAVrXIkO`2NgS-Odevk)C=VkSCEK1ptx4~lw+kyzdAe3Pg9kq z{LoOYRK#IK-l6EfkhdrLSMi?A?&to8Hv#BZ>;Uwy;MMJZ8q3b4r+K`t-M@&JviqBP z9h=gw(P=NmKl6F{x_<$$UH3Qe!gYTmuUhvv@sc$$V7;1zVX>MRuu@G7Sf(b1%RFAz>)*m_db{V%;}t!+jfhWNl0rCcNebbt zB`Ji1mXr-nS(45;Vo8O>YEu90yp%-tLr)++bQ0o2522^4=%0HVe@p-A*`WD*NGIP) z|3K{u9&hJ);O>TbJPRb|$MNfYp8rv9-^0_(I6fo!r%+TxXBp7$=eO)iDEkgPEnp|ozmPo${aBzMllRtn zJV7JDXhN+6ClX2F^YG6KK8pyYZp33NA48;nZe`3=<%IHK?y2R&ljZS|+`!aGk&pZG zKvG%Z-_bYC2OlacdIowr2FmT-#qM%`N3mR(*2f^${w{T3J_f;m@i7Sgi;qF@Ul*+< z2>->$Ao#Bbli#qqS6R_p?(Wz*Q0~pQ_x2SB$^+ASt#2Kq^I9MO#cO^17q9j4U%b}G zfALx$|HW&4{1>nF@n5{w$A9r!AOFQ`ef$@%_3>Z4*2jPGS|9(#Ykm9|ul4a?yw=Bm z@me4M#cO^17fxAJR_tsqc6XLaJ*7flscT1(O2ua`)}vH>=7Rs?GZ*|9pSj?_aDajM zyL!8Nckbx!+0oP8)!9XNO7ii84dCZP2mBZ2ij@_GLTR9rNLR75Q0(X{PV1TDMqqj7 z$ba$7k^kbEBmc!SNB)avj{FzT9QiMvIr3jTbL78x=E#5X%#r`%nIr$jGe`c5XO8?A z&m8$Lo;mVgJago~c;?7|@ywC`;+Z4=#WP3#i)W7f7tb8|FP=H_Up#Zm38?-zN>R*p|`KE zBVXEC>Y+~yCv55z(yG!hHa@z4y0VzQQ&1cq9D^EKQn|A7n*8`gxpWaJ6Y|X;E>H$1 z2N^_o)S1YrIhPw88JyHA>%1EeVu+{j&mYVWk+AiFuz*EvM_W4`1f?xkPH^(`GEip` zuv|GMkQ-xC-OzI3{_88f3nsXj2-hH_J?+Q)@*&V%%cgxWa+rOuD# zoTk*wIfXVuk-{i_oW;&Mtc?VwE=JzA>Aj??7Wc3V=uTTF<5fX*0iiBOp3AJ7OMl%O za71Cvxrv~1)eaIHZF&Z)uJQ|;h|x(^3+rLE3T`b|SAnbP#ZeW~q}nQ^*hQ?8SKXq+ zhQN?1SX~b#R#}$y)3ycNRlsY=txOGthQNcoH#%ekm*V@CGzxSy0TDwHoH*mz2QD8&Ew@;rUu8$rD>XCuy>!X zG#n@ojgh0<9O&a@sB%zxqgSQ~F`XA|^l&i8}uyi=?ehpOJ42=RSyUDe! z?BZK!qBc^>4ULXix-?FX-b~-hDpxiJWwYSw7U;9yD{TNcBal&xoYZfv|fFnBmI zlNzTy%axM?nIVfh1oc`oGc%$!Zbu+-hK!4K&bmz+*DY#p3WVBVbt@Fy5Y0!6(}*(z zDK%ME=zPXTCk7Eq(7O@p6s= zkg0O2X+s_XSY-kIGku^v)?pn!^(v_9ci0G|W`~XNEY0P|#)gjM#EBSds=Fyqbq|qp zWlKgvQvja&pU}_mdoT!6VqaJ^QyhtvOOn5Nboh>Hy0QB>_a{#E> zodb@Rv2hysa_n|*n&x;eAMq>}O1&wnN-9PJYOCUNEY_J!P2~5Zp@}YGH??8v?NG+= zrXiwcHw{@9j?+AWR?$cm`Ysi{kvpA_%ob7*H@AFcL2+mhEUP-Z`g-&934%gLcYC4G z+tr2y^$7G`Ffo~dL4x`aV-5@<(2dAJg8C?9Mn=ct7$m4q0Mj^@pVEa`6KJH9)Tdb1 z;7Easie(8ZYN$T|>QP`DMyDnL-mX4NkLdoZ1KA8wkBjI-gl2GD@S$n-1tS>H8iEP_ zWf2VLSw-;BwEC(Mto>|NjS2oWz!wgV<__ftxdPS&MKg)&&lo#4MW3e_g7iv=HHqpk zfNdHZ9TVujS{mr=h^B{sjvCm`Db%K-Euy!z=OBBDQpN_m$su4lP(C~~IB;ZI{SqvAala-@p(9UYALa62V8I*y z#8PRZpD;z?a>a7WcN8?+ufc}v0KA+w1jbTz{ zF5EIulMC7zuKD1?jRYRo+Gt)=Q`4#e9JslF`VcBNUkS0u0oW#BakqgZU0Om|L2PZ* zX*2k66GFnL8&Al>mIg};Sa4-R!orR27hPy{5x&w;c^u7d3GvY&h+qTmZcRDg*Pidn z_jYvUi^W1I-=>q)a>fmgj8R7;ToWz&4Ub_U3^_DNtpvyVK%TWCCn3yItl^P|G&ATm zVB8Wg#!$3~Nez)#1Vz}ofX_hG2FP6^VldbN?*Fc4>f#fJ`0c0jwHPR9pjo_Gt ztP1!wQfg(9md1hU?;yVo0p3S6>VPzH6>9Ix0BH@Qx_3xsD{T=bHaLRZP7Y*bLR)eZL!-2Qqm3f+hiI^- z_2EE@g;lp9qg9sNRE|#D7O+C6y&OuM;LC*+opegToQ++q z<+|&XqC}*Tu)Z3sUIjH)`=af{Q)?<>qxA+7a&WCtnRj4XjZ8nGhxQ7+M@!aEN-yZfPu-BkRvs!hcQFT|jL&3DsKDhtumih1n& zM0%>A)f=FN-9ep%svXopE~a?7JUKW?X8`zY0J|-914+ja5@{(hxK)XEyRo3^?a;Ss zy9v;w8f^f@REsMX0Yfp0qOG=UiB#{Yty3yfqnG4({fR!^IbqvN=d(F%z&2Vvg8bIl z$`olWOJwQP(*hAy;bbBTMtl=#ZDMtog4IW$jAI!;v3hO!XquZ1l}DVpSx}Y$VmDx6 zSD%7nRU5E_#4!;s+>H)89>yJRbfWqkvaT`Q*ig!Qgq9-hLdWvJ?ZwI=7 znr7lOxWiJ!7g*c@aW^gSXt*?OR)DBKLGD`u_84j*`3sr~TbZ-m9V|EWSk=&0^&6P_ zMy=|1k*p0?r;Pu!N0hiWS!hoiz|^;9qD_iyp`D|l(L@9V6clQ=L%WVO21Z$$@%JEkX zj@(=>?V%?hqrOjh&>nOkD`Zjs1a%hDCbpxGNLUw0FhKPq@U652niNwc5pi-LBEqAd zhBTTWO_b^2cA-2#o2`j$SWu-IW7>p`$HA%1 zP{wXNk>si^CxTzG_o~5($tt7CiGi^L4s{X~TcSs-T*OVrJfwqG+aO_$FIi;i)YEDz zV#C!NX!|DVPiq2RZhX_~bmY4{%~$`N@U;efK2)6r3G>6AcS68Q7L zs}4wL(*8H??b_{!o=afeg|u`qV8b2%T-jN&aMGJp`T-$c=HTDd<4vA^p-JP-nF!kf34eFnCs2 z;-c)K?E((_X-St?gJi@Fi|hgH zQhP~N%d4^KZj=|V4N`e3jU&Tldbdj|c5R??(K9Q;FaaNL6-Qv|J{0JrKuQLZUs;3} z^QhtL`d%0C(wR87VZi!&9YNlETWN`pqSZ91MaK#Q*%3zddK4kjMZ=BxRTjJD)!qmJ zVfU*7j&(oZx4C`J_^!7iuNu9~!7gHB<_c2-X-_+c>NMt+QmA?u`Pk+4)2f!&2crRB zLvNr}cOKEU?6Rr%La(Jp9OsjkOSh;kv07&_8m=CJj3q`!tS4{I6v1fqAx8_ZOJ?UU z{qdvVhDr7gehwOQcC6#1TE>|ck$0jB&y89x>PwWPoVbp-<^-?)3YuX&kW9Rk=m-#p zF4qB4j@GdC`_;+luiZ*Gy88_3J5Xj_stiY5sX(26dKD8z8J6cJ#%R+pH#sUHoKdXO zocvU-MAY-x)IWIYMboRP7iCyPo2GfXk%f-18^u)h+Dq{22VU)YDb;GvgD%a{aUwd# zFj&grw11+Bj@&|*?84R4P-IP7bB-{bdRmowi@+QCXgw*C8RThz`WIxqEX^7*`?UUb zYn3c5*uosGY=bMwEaGGYqJD<#EGOgqUd_okz*JuuQ#m@XqOT3Z@U8ox9!>uMDuq=P zL#6r3m~j_)tK@6L(o&nCQ9S_mDy4RT&BNyIg~Za~P?BKO|3G*;o_PsXh7u3ih=YfC zi9WL_X@Hu46J?m1$o{p8iELO4YJ@s8Z2_eDZ48>Bg;EQVDT39sN=1N93Wu0%YzuC> zpuLB(-I&AdEtFc~W*;O~$v(g~jM8Q*m3zB74prAUIxv*qPow1Op6>R};?CYusoY-d z-C68vW1u=7d9Mi)&6&c={DBf}XVLq2dA(!2hVbeUOsFucipgcDS_ip}hsJ4dnYH0l zsS75?=|&dK80MLR{Y)B%Cdy^_hV6=z?xC2n(sbwmzjQ>eyaeiNylRCKYlBpB1K6%p zzr`vEz4}gH`qcM3Xp`mXqAu)mhl~PM+aQ--pU)5Rc3)y``e|Zx=pemOPXStxZGu;) zgTINkrszwfC{<-4y;a7d_$(Ix70X{Z)Y)v@;sH`Lt?C9*JG6!dst#~9psOTIT$8a% zWR&XRdFPX&qs?e|rGftCS3LtB15z&p zPct`B&7>}*U-A)?Cm6L0JdMLQYX;prR44ryD~g7x%a~_;STaHDpx04Cy%?ab0J@1{ z(&8aqE8I(T;1xC{!Kte_kK%zEd1!#T8t4WJ?|8F0?9-g0u4PTihs(u-cs+GH-JJa( zO&($`NNr7l>+6G)mGHpueGK@yC{9<6I6t1$-Cx|s%VKXB!Nc6y=oV0m1- zzE}kbT1|j=;lz;%I>3iHM!Z{@bajZc8l1>aPV$R3=(#b~1fgEW;`ipR*n91zm%~En z8nKRRAnLY+aK+2;;U-r0f@Q>9L*@! zWmjBwb*fhAzY~nABs_bs-eqMI=V6R`EqE5)aK&YpzT}F1mtKO5bSvBtIFuBm?g!W6 z8^E)7-$nbb+ne%j3i&LUdQfv-aoOH0F5h#}Rd$XMP79_U;?mu)@6u~`6K|SfSh@tG z-VC1ObC-@xOpTZKQXpTRyn*#I^Vd`z*UzWQFtESh| zyZ+=g*d1&QnO%%}7@Ui8*WiMO>&E#V^U8uL`lHf(V3f8SuxeOY#DDVAYo!^(tNhG= z^3VJZJ1r=N`6ZIoyOGrjoz-6UadhTG58#VvyZX;=@QlOfiP@r{vut)^NGh$HB5H$dud_>hV34O2Hi6O`E>r45ruALoS1MR)Ny~Up1e7X)s zO6d2_mS20rRn$z<6!kbnw+5_n+!EO`q{Sf)OhxMEfZf5VFCvc$1jTTH>g!Nql~*<`M5k>FBvb(}HLBHA!v(6p zwAF~EWvUSaZwPcwH#m}Zw?fL1CaG^jixUIp3}CEr`}-bg<2L&ke}_D(G;RmiTpS%c zf-8dA3v2@Gf)aIEz67p7FHKY5>g*{Ncl6}j5~%tfaLdW@Xx`kR!4Z1@8h!*4)RRPL zi7j971o#Z9RjkZqP%HkJ|e*^xe362fWA}UP- z`QgE#BXnpMZ^P5LNw54*juz>XM+$^XbV#PNucy%0(U&h4dV1P~QO)~(60?wotC4b1 zk7B&E(0~zM-$X;Rjey(W)k3h-ZKT!#`1A@58utQDhN{KPHcm4tZp_G%=gyUd6ko`e zZph1cwTyY``VKuUWZq`_O+t>4jiG8K*qVmuWTY(Ua5)zi=<1mvx(_vGBLS<`%!<_t zxta8OXR4{ki3+F5mZ*;h%A3#Dzhcvb5ZJKur`iNjvl~L4YtxJ^)+xbjSF}+Or6R+ z2PQEEB_0j}vzatbodKp$q*)M?5w#LC!ksY z(mQdOll+*n+vz#t$i7^tt%dOfVaC25cbz9URQ&P)kWR}#zES3Bm zj}dml7|O6Z?jn=bLBXlWZ6m3P^^GE7+qJOjTG-?Gq%9;ubizqlh6+S9A*vb~rOc%t zhvSSO)D6hel-2n$v#buPMQdwj!D0EVbakVZ*)H4+MyKk?V`b%JASwqwX*;`UDkO{T zZV%QI(h2Ish-1TU^Gr{tL1)23wxH4G8bOW0?l@*#q*F34y%8m7jq%r7>hH)n2HAxnQ|P!kX# z^@DdDWF%)HYbY(dJ_M}}S`scw2XvOOp{fKyt0R!GLYri7d2*k=?T7mxOVR!B#0*91KwX0l3!}cI?dWEO)oJ5A^i*4s_t2hvY1#^vRWUSb*-K zr}ma6s+WWN;G3g6D zWTcR3LYNFxOIP@kNAeT)awOOFL9P=czJwI6@EH)Y25tky-iEI+-FZgW$G;Ei;xi%0 zkS`8IF|j}8;|DauBVfSSL|hFsxhSO8`<%(n6dSUv@EsCT4~(%Y7#JARC($%Q;j0(*#9&Ipz{-5b&@4IKxKXr^O}%@G%OwX#Gk9>x;`hPzGT};^s`?)N9Mcd6M+^Tau)RBjEo`vFrk9d_2);jO zK54M41Lf#CTDq$ADIkApBiF=`H04rH1A4+{s~1Ftl3#xo$X-Uu(#9g(4Khq;P0(Dz z9Qe>54|rU4jf|#c3))(tZ`lwFT{e*Kp(WLx9eq8W#l9W1N9A8o#RF~2czJS)8afV$ zsNbcrK`A1{zl$!b#H%-@YsN=$oFw5_KPP1?^s1OAzXk)n<>)b3agrRy<-z+Gu!W_` z`iNi&u+)D-6?$>mlU$2q!T6LuQN$)#Mi&K<4azxMO`>54t9RJ-qN_jx!QfN>7n!!? z=x=M)kyZaSRR3=x6v79*7K8e2Dk5EYoS_I=e4L*nE!Gse^E-RGJKH;orE;mWr_eUQ zL!$a1GFTg?>Tyqf1j!9pqDPdccWr5d%#+3GY9TUe9vjL}(pijQ!c)lWBa>9s0yKYC zM@|~h)|w}lG|VAUEd{nkN6QpGVIh*P81vy)x>^B_73nWY1z=m!%O*gn6MSxC`|8|c z@HND(rpf7%mZ7ake>w=Z4j3FVA*ufdUl z(P?!CkdJEhR|VoY3_lBy?`lZI5L3g$`EeQp+6YE{_`o2qk*?177K(kv_8mQaUB&kH z_8o1UqILkazN4=@-`CNR&v*0`25@(8=#=oyD}|SHDvh}VxU+}W53eVqk6LftsV+!s z4Wz|!4bE#2eA#`#$q=;@Vi$`P>!(ctKEyQU_K%P9E%{jYqb3&cXn?u^nJh7?GL!yo zbHEV+tqMTYzjpPPijk)#D>Kf#fX>J>|IGd3QXr87k6!Iv%Jxxaj=u?^<-8&0i?cF;E z`g(f$+I$8zg^bn(IJ2gr-hlwB`Jj1DmMb2n-)Y4vU`&weh%SP!L9*DQ-VM>K^m%() zFe?{v%kjX_C?9gB)9VLmVBZ#G5XGz8klCVxiSR_vWF?0#S;3rdLm)6^Qg=Yg!ts1* zFt7I=>HBN@=|lmJwXW+N=%r7`_R?v%p6-tB&h9pYQ+E=Zx{C<)pI6d9F|ZM&?nWL9 zCMe{g@M_*+lDsOAj8ye%1{Oy#xT^|_4UtGzuVv&Uf0QH>iDY#@kPUgAyFgb5*>k#j zP-7hhB3RboAz)kRHUInwwM4#!O{8xOq+2NUW}SzldL$3l{cXTDA`3nmQ<+B*5X?eB zS&)ZDsfSrSm6op+(>4snbGmvDW2rP%v7D~n&sfr=DwfmL2Z3EcpDeCcjYw7>VI&R+ zRH<+ztB-U36Swd}a%MGhy80wb%@?XRBP6TOu+#wu8d{6f)nkmM7l97=)uWShFEd{ABf@^VcbeOh2^Bnl2PlK^C54&NT0%jYl{+QXv%HzXR zblem32E(qtLP;@x8?62W{0r#93+6-9QSW5Funz*Hz79Mc&pf2xBDEMovoK11gE*!z z+bC48Mow4Xg#5+>N5)2VWN2j&Hh&FM-(nu}sG~fz>-Ha_H9&obOHeG+d?;yuq3)cn zzRQxw=|wHxM#_?`0qT2j`S?39ewd4f zsiT~W!%}IWFBD@HD$Iv*>RHZ*df<-sYUR)X^<&O~9^kGrJ1M8DpE8!bKvgWKt6#7d z^!M&ey!22&y1k8)BKG_yIwPb)^2m& zOVQr<=V_{2t&|#|8h~C<9!LF)sl$GXWVH~;2Kv)#ieY_ox@ut^;6^REp~f1Zma=3r zodpghbGll=Sh7o1ET^jz7)w^Eisf{*hBbzZw!opr8lct#-NfDBg0Br6t02@SmJSbK z!9(d9ptdr4aAL%cOG2~;sFMWkm@kF~Ky3rMWnyrczNA|!b@A!E%Dg-URCKqD{$|(4 zBAsII=q~K&Ds<6T<=gXZ7F=yl1x!p8v;cKF{ix0WsVYJwHJrz+J zJXoIy&7e9VVlfvD?a-E?3$ZC~2LY>|RE3f9{*XPxj2f$Urrgx#X3VXz>b#VDIDgpY zu3ZV5LA}rtF*s7E2xd?hL&WiHL8_MA1Z{HW$1O>8@Rffu4eO-1K^mE}Yb(%?STWbb&bt+L*DYl1Ns8t1;uu)aofQa3YQv5l_MurMb_51tdvRJl8Pd4S-+^1Nlm7rs4x1W zxC3KiB%UBcwUkpGg1kkE$WHGr06j@iuU2$K%aJvRnkuSJdrk zZtk2UBR4%Uc}1F=H#^D5O{OS!rF`BzC4)~UEBAn}nJr1K&2wXWDG_UA(Le-nRRQ}_ zX2*Lp_^c{q(6$!c{6L38^aYMv;t~=L_1aVmYBgzfW@HVFng)*^P=*IbaJIqm!8AdR z=PF?J28%y`xDI{|R&Ppmrm0FzoqV(*$fz^HenJQRc1oa3c&x-n}<59LO;A#@aJBagNx3cbDU#e8R5lBzyrq4_1TOf*iH zeAGhImr$$7rd0I_LDQ8TRWy-Q^(hOTtqIW3+W^&lU|B zs3x}os&9b11+8#&I5(wR;>OU_X}bER!=c+iHV0b4w;T@L4zfAW621eDW)#!t6!wlJ zReje&XSGRW2KAjxSj?p3@ByC7SPvisB8xY_tUrA^o1>9U0Xcr z-?@YZ`Vh#$Jc-h;MBt|0u>&->Z$JW8egidZ4)tFwgvN`}R7j<9C_h}lIn$8YMylU{ zc?qv7rQF-q|D~VRuZhs9{~&h))R0xeuk>5GXf^M|MCk`o%qX}rgQVBfQAq-q4) z(h)j%lpnHlZld4SLL%je+jHTn1u~Y=sE6M(glr8I@bGFWq%1!;Ix;*sQJ(O{R2pxl zyY*3&)WSwDi0Q>h8&w%wGkG_!>hHBvc9jk zqnEz@UTEL3vwfh@*_rO-lYi6)3YPCXfEx+y6ghzL=QmOv+(YvSDs&*o=Te&}L-jPZ zl|=HIfJyg$wFSB@5efEhn*)vrs6mZ#KqFe}mqAtsoQzT@Bdf(C#rkPefDbXvbip9K zF~aXFi?Kq3CK$CHSs813KWEy{!{JR+z3a{gHWO2B3Dk9g>TG1bO3DyR+ZITu0uF0V zUf{c#4+03M{aa?u*&ynpw4{`_G_?U*Zw)ky!d3+^Dkk|`shLHZ3BRdch}{t2eMBhH zK7WLxMkG&=e6iM164KHtI~37OjHy%f<{XEy!wAXK`wru2Q4RPPnt?_%)`= zsR45wsxF4^%@afA@)*9EPT}x;`iEWs4g@3^bt!n(l{?G5g`QHmuhd)WE40Ib=#ShY z4&Y;2XR(7=QW`Ac<9J0doYjJ^+OWlXMnKh1;AB-i;gb52W|ZsHOABOD%moulJx6 zqpEglY5Z0KT~ZVjBj8m9WWHJ#&lju{PYtA0Lx+tBQaRN9Gj@y2?EaR~1zb>EFdsDg zD_3y(TNS}6Xc6+E)hGLNNmhkz2#TNL)iA8LEGd$fqJP~Q@I_&GbvjoXouW@;yS+m` zWgIqni$RSe|K*8bk)wZZ%~rs{(ew%D#H>p<>?NbkoC zLwcxCHVujTle$T`lMIIPsoiPhnIS&mR*Z^?_rJbt#G9|_K2%k_gIY+}qpJxyc*M>d z2kdDU9azi&)mtE455Vqk8D7o>EgBf7g_|%-HGMtu4I5vIR}Uj+-T3@pGa8={Yb;F- zk0GRza7Y(69R4*-y%!nk;otrx^o86IZAc^eak^;K$*9tdV$&)ZzeE-oSaYZkrg_@G zWaMc>7NR%nU{k{Eb-g=j8rfU!F6aApcJC;6v>Ax{II>xq+ea+kk6Qw!7^-oKzVgc_ zw$N(meTINb1JtLvJScUW{maGxA3(^4hpK0x0qS#U7WOY0S=f*kdf9AnlBSLPxq7i$ z$Y-I{7m*o#Z-B}Z{M;HZRDf%qIFuhN=J^Ur$#i|dnqbsdbzLD#@5e}8MNo|t2=cHl zd4+YQ0qX0iA?;s6gK+U}NHa<^K)2;mlg}(sf>D2&mdN`tqeLER;oyYV{=%kiAnM!5 zYzeFE{MA+gaJaWoBiAC@Vga zpH^2aD-BUUva_;(%go9KajEpyo3xBrR{0@7)U$S0_HUV4*&xblVl2;J*{G70hNz#| zS=qm3W@Up=s)^#@V08m(i28+{mHk_0RyK&T@;Y$LfYKX(X=i2smYJ0e3O$2DrDgla=}%PcXxdd0tP4Va=Z?1`8aCCM%{X@XIm$S^Uf_j|TUJ>VjGP8O0R z*A0QbDM zWM?-V>*uNs$HE~)bnLWv>jKLdh`QX*kU90wRWr13$WWH1s+CZ$DP84fX#HF@Lkoxc z(;p_2{G#;-gnF@Gf9bDP>o0{Z(hg&Ch&Na^bQe0x9Ubk(?n1uY(_Y-!mL{v~ky%R) z3t6=N$yc#eHiisoy80bfkH4>&qf3Vm4wiTxyS>sfFjyWc<@jP+SsdRQO2X9wDWAF# z(w5>ohv|>BDYPZRXhYOXwHEwAK}!pD6aAj2PfQ0zc9E(`xT(t8{pFGJ_+T+tq)Xr? z=o18V5e*%Bn3%qe4o|e`PsQWY@Ob7g*jEC>-8>VYfOeyG$~ zpt&NOz4_+ykwf%BKYnN^(8meTx(5MTbkWGjMH76s(C{nX;^x$bJ@~SbNvO=H9kxot z9{xJQg5u<1k~HQoo_6)oY~t7q1>mHE0+r4^YH%gjCmsRkxxP^Y%@v|4n~rriQC%QONLU zb<`^;wZBEZlK!FW)tz`;Oj*vyS1q}$l-1 z{k}XlIcCB}6_Kwj<~1`q_L1k!SZ()(SU97BD7E^P>NUuqvB2*e?xBL7EV>-8b)iSr zWhDu`&iPy)XnsJ(xW~>4{Ag+jOl;I`Je4-ivE?x$UVnz zoDDC+w=J|C?jS5F)hQ}V-OwYeOnpGzMF@3wD)QBM_C&JEj$w^JY2ij78CE?20j~#n z2&BGxHgcr}8@beixt`U-5NWsG3A>#myyZoNY683-e z-Z~^s!?E?cj*TAKn5*F}>Gs!gh}%$B_P+!Eij>ce}2S=3R94 zKfTmCnOF~_UBk^dDFQcE4zsO z^o;^3qhVUDtI_1L#;QgGkuqA4vU(R+9v#Z&yB#N{_vp%(VczOb((Nr~^(65oWBqq& zIYoE#A0$7kr&zl5=k4m*GzEu2t&W^Dx%0$m%XM++k&Ol~<8yx>Ir7L~bEG#?H@Z?c zSw=Dtv7^bDAZ7Jq(tD5ki7w1f^*=x7-+sXlB*yU!4VNAsv!XAz?kd}le(bK+5t@~> zKKq3yj^6u@qj!Joxd%S~?8EPW`Yj(k`mxXd^zpl|-oE4XpFVyM-5@QMe7@V1=#j0` z!{KdqqILxHuSlmkxUdq}|FQ#Hh|4eOXmR2oR5Wg4JKNss0?|fB7_K0()%k-b*Or6$$OnNp-GZEz0j>ldUSolZPcEe*dT+Us@pR>;`U4?w%aoh zDWVP8k+@RTMSrTE^qHGSeSZEzx2@2lX)8JwPDeJG{$(&Awt4|+LIceU>7Ts1NI%3| zkrA>^SGCENIx}WBCRJLIm1n2j;N&CrQ5I5nEkAYhE-G1TTkd$=KQ9?( zjjT1gNtn!Ocp^9B%b$7qXPbm-zCs_Y8b+cAC zFH<+@WvpW`GtXc^Ai^#xjnWNL8kwcA+sNARA{O5sKBp+1`V6lP%Lq!3Y;CN%_)$7; z_0>^&)d~%aWwMYV&16AUkYTJ0hE`)N>Kq0li=IX%LF$U}vpdISx^q19p%1mvG`oDb z^{GccpnD2;lM#yQD^GpyHLdNfM<2ia==)wxK|cNR?5FR2=D~_)ZQX+n-^3$b<@O|c zWJB-cR+^otj%^UP+pTVTOsd-pXQXpwFw_^s86naFOs*2dnN(?lR;mf&9B&ej6OE8< zxAA3`jhMC86fB>jHWc%U$8#kim$BYz)U=jW-;?7oE*6V0>cfN2z~L(SS3{xkij9u?;=4@hHeOQ$wBE z6%%{tj!(&q;-0EgMI%&J1&q+mm__vOHmP2gl$xyg)N-|cvHry`){CWB61vbM7Yma` znelS5=3jbCSSDXMkGA$&jS()9y%A2sD2iuNy{s|F>IE$~B=d6%YRJetNq0Y!+cx&6 zCQ%mQtVGM78jwu6EReb*i4OI|!q+A>tW1io6~l@wdSt^crP8tYyO#u#hp~qS3JJ`b zo8cB8XSm77k>O0DCmIegoJISJre+gG_qvMGBP&Yb6lVWbNDaDERfrpY`domfcxCuK#yz-xTyZ! zCQ(FNiEdn8_g1ip3?&dSk>RPPsk|No+AOw$joj09B^bG9klgq{nZa-l7vCg$T2i7v zA23Ln55x>rwOIw>_ztNSIlDlQTrKA8f_lUs@iQ23YQdZ#_%QJ#`v*8spgu+fOSK)6 zn?wZk$hlG60uCeKnjh)1-bvs)lP>Nv$&e_;Tt{B_M%{F!hgEqEF^tAMiZD3+-lj%&1z33`B zj2JQagllkmWP>AancXzd2$Z52fpa#vkt+r_ay4I#gwsy;`t!)HKIgG$LTieJLYa6-Q*3Mwi);5WrmcF$OOss7(oq@Gg zy5uTh?v!h3dUPF0eG!R~CIv9kVCML0Y6b%>zd9q8fk}ytT&&VQX$LIF=)l7vF^WvV z=#h<5{lG)rF4yEDb1#z%HVEewOBlIZb&O)+i-D{qD^mba-J^JC-Su4AIUgJl%zr3ZT zRsMVS)$h@VJdS?m6Gz|j{-@vmI(^9FsYgGICEt&|;+g69KmGd89(`>3=$&^nvaLk7 z^A!(lKfU$nUH7%>H|rqMNK99S4@;YoY0&?YHbb#B1!UQY!KyH?D>Pk9SA1B<#dU+w zOAhwYZaO?SG{r~bw+Cke{26YrE_bVFEGt#?$gLb31~cE)H$voWh!H|7QJ58&R4)sx zQ~5_2e078UP$NqkqR9yxFZHW?vhEv32UvpFYB{?wlp0%@!Ia6UEHh1$8_f-^ z)fEGhhGT&u%NAALabU9B+%`#%T*Jv)Cr9X zb$*3rFh~)r+Bc|OBTI^IGEcTjN0ZED@hXGiB&#_Xh}g==1f6X6QjJ5Yv%LgWc88Q&)&}X3OP!o~N=q%_UK75O!B;(d3uFw0(x{!5VYD11~@TpDS;cwV89thaw9dz zHN!6J^F~1|a~hi&h}g`6VAL|rNcxbKTJHc7w4YbH{)Qf1f0G(d+D`_NNH_|zZp@Vhq%)%D?Pep4W>>R4A^g&!B&Rhma)=ghYi;L-6l~AX(c*q>cP1t z6N$?_$>MY8Nk2R`2g6?_CX?wNJ+jGgq`*IN!meU=DXxu8+ZX`W={wz_h0 z*f2g%%3z?LN>yeOJuU5SY#>tQ^vLES$T6BH^(OPAr(b*j(L3K`&y(o~26))u?W+w)N^#^GSZyjnTnAm(+HDOeKQp!L}n^Rh|E+>s+Wb#R7|Q@m?|?B!yz*jlbbtJF(C0u z7O38VCI}qvb=w_1at&wCR5BQ5I#V(1(iKg9_DsbIc01{_f` zF_?jft&B`Sj_pk4KG)gNW8&=MGnEVmYo_u)bf}`nksBjKPTrebX)r{HX;Q_ZSgA9d zsni#Wy+%wR@h&~G2_n-LslN;cyl}@h3p!K=!^RoL?1o*AAsPkknXQ3%Wgy5*=Q;k& zAs7~4=bDKgT{8vIc?JV{y&26^47;=ulb`)|hJi?_Er{KWqz_rC^$s9`E&kB;H}vTG zo3zWzOeKSXqW2lu!m!Jlx5*Euw2a3v5Gkz6wa2ltNmG)n_Uu7M7Wc#pljcepPd(5==F?ZMbh>OpC>2Lx&#OVu%)w%^Mi^Bl6}g z2|7xC^v+K|eb4Q*!Ep4>R~~)*?a3a)(|`ETb8mci`f`T5H^I9Pw3U(UY_#Hjnsac_ z;vBt4+WPD}Klt>ccRusTW3*erd(^EY`>99oJNnu;9DU;BM<2K^zBTcn+g=`$((A2> z?8KVmT1^M_M#)%)4SHm=*B7@NAriM6AriNnR4)s}?UB=xSd=#$vc_QKVYwzfFK0l~ ztSwMYtJF8ty~#BZJtijdMlKoZG8n95{4*HsjS!ivnp|m%5N_I}icPIlW78VZVSOfe zvzS1}40>b}B%^&gc#8=#7?Mr*Ahyh4ka2Hz+R7kkv`tnG(#$<=JqCMWAVWWbm?n9Q zTisj4f)W8Es)4&OB&!84UCmO%k6Ni1a%nlOU$m zkuNZ{B971oS)L+HJ;n|8ZLXW7N7qdT<H;^J!H~GgU{adFz$*_mUbG0@q>*)s zUeY((ZZ~c+XmuG3XIpO4K%~_fnFO)iq^T8ggf@uWr12DC>M?ec?{wWHJ-Ti(sI3eJ zES$`ITsJ~wHN@nKr4A~*NfkF~rJ4p?*ZNs~(b~JjATsfzM>Ysf^6|JC7$k!M3&YHi z&aK67Wia5homfyG+q%5Q+i%wOQAVUJ{Trpl0hm;;NLHLwb#5t?;Nr97VMoWBrn=|XLI_~*Tak~c^AiMO9KS8LzCzg#Tq>b zWQ;4F-I8E+cGIGzJ6oVRFJrw&>@A|{k?o!AgQSDJm@k8&>dt`Sk>zodiM=ymAf6t8 z)R_C#Toib(TSR(vij=t`_NAG@PYkRr{{sFi0=#kag!A>MQvF1o#vtxWv zGM0go9y#OsR?CbKSuHa{WVOtsdRb(wmN`ctt?|i7kpR`?K`xs-s7aLNH7n8bpavuj z(*o5rV}0Y-hg_S|V`5VtztU|18O}2p>f1~+LS*t|a^;Y=f451MO0ZH*K$Lk)Mt?fi z87XJzP}fK~lPkd_N(5mgT9sfxQVA9)`<-B`6?|AsD{%-tvT14Aj#`096xmjy<9VvT zM;*NIYCMGmn#NP$V1=&D1?D`n)Mf?)VkP#G>190zDK5`a*mZe}Yr4D{U8(s|F`m50 zPLFInG&BF?)NC*7F~`UY;O*@-nhQB8;bao73KW8!>feuUTv5r=Msh(kB2;!CX5n!Y4`z268C ze{O_OFQJ}n62+feiIyudAThB8s`VzZN-s;0Sm+aOb<938@bq3WpDH_-k!Jb{m5XTsw6v`L{Cd3*1HN~M9KX*MzQ3=onX+*V1S!UUKTeP zsbV7(m>MsOtKbrlKXR*>9=VE>x0kDq@xiEIq)8tz(vmq-;OH_KDBAX?mg$wwhDV}p zlL=K%Y9fOX6WN%5OYcdEUf}BclC)RINcKrFnOu59k8CpR*vx#P#t4zVY=rQRME`D+ z>Scj*w&o_~S}QevG18isVth)9AwdH@axt*iC&gGoheVUJO1`|{Djg$F=6Ob*T%}`D zz1(Jfm5z}oNA*o^`b9~TC`U4_M9WbckgP9Qp!%=U`Lx(lWYHtra)wvw7;f=ihMT+> zIU|$kiH2(n=f-{|rEOO{`e$54>5&zsiA~LouvC^bAR|j|&@r--O^tMcq&kB=O*S&6 zv_>XDtQ&Mp?~u-IfwH6JbclV_ZTIxZCVQ;kW3w*N``jJ(9evGR&wk|LXFl?VB+51Sw<6HRO_cOb@>7q!=IM7l{M-jBt@5Q3 zb05~{L`7*i^vEjeJw*7)sxdfi{$W>lnY-@x_ zUp7J{wl%3<7Itjw@0$5xP0*RYC~8aCK##2U4C61uEzQSp>-ftgdZK3;e|^bSlpa~p zS;b#Qmc(C1R(AZA!C=Q<1|p?3GTr#g)Sxs#3*^RM+0`Zi;g`i4GAW=(wuWA}G>MXn zmFR|I_03RCBq4*4i6pSc$?;M!L(O2oIRe;l>AnDuw zf>s<(-S$AgNpj1AB{OD62Ed>Up0sMLyQtxSo5wk5BeT;W)uFC*LAc^>!5H z!Bvp#Mg_hl3a4!&5FXMl)s_DQ0|tQ zcYvH{RreH_KqQL^L=lvbN6tgoIk0_h6pp1de6S0j#ZJS9SJR)tbzeaz5`p@1Rx%4W zG&mvXrQTpxzdIe$E@f0b^Ydi9l_xK=Qo_J(U3lx8+o zi$J{wYXl;OHbxPE-utisb&b`v_T#H|jiA-6)<)3V3H__J5t8X(+DE0;MB&y8cFsBfCHJUbn%^{6b_=z@KjA7>G2)6jF0PtUf!gaqPIp zvtv41i5;VG>kS-^f)-ppd1>MjlJgO>(o5Q;=#^{>1fELta^d8u=%t?isLt?W=A?-8 zJ-)g;cF-)>YIDj0%UW&DWcGSK9Dwbyqi~p0Ja!VaMS(ODQ1P;oj&Va-r%NWQ66D6tLoD3^$ z)`QJn(~ZJ;(KLuN>grN&M`U965y?o_14OUH6J+V-!qMBMOV#IwB=haM!Xm==hQYVtD-qP=vT(NrXtw>T+izq8?Ti7T-w~QJsk8aOdNx?bTstqIXkDD9| zZqgP^Rv%L*E#4;zM+BCP98_p~?vlQN)i1nKe#uJ5k5RFdRDH%PQ$m^XrUKm=F9*C; zXT1KTRk4-ePm^!b_ixd5lC8fj+D>%7q^_fl$9DR;RjVWuzO7oNWcnE_l)EYD^OGe6va>e{uzBo8}M0&q8;8v%-w`!xo z3bTk-MV73AiYzQ~a)1-;fkfdHL{g8bYuFC@un0a;J9p6o%kHd4Fd2!$F{E%GP6I8c z8_zf2lC;Qmsa{khJGV~o_J`N_8paPweN6QJ6mOGiy~6GfMjfVHY45UB%8My*(MI$7+M0-WS@rjxY2u+lJ#&LpyAP!(Cp+&<_`QFwgnmt7Ci zbVQbf?~*lL>*aTd`bJifdY0~$BDI~Qa<2?#9#QzY+^wSeQBvBi1R+%_c>z(QN-NFq zl%@P+-u03vI~9AfSFv?@s~{8=*;3IW+f=j{KS!~69cfOJ43VmDDeD&vaI}?c=3#&G zABEFe4>`Q3en_e@$*8X-NiO=97NalPC+iyw^ieo`1jB#4&U2hmIK}!&JUlC9dv&uH z5JCIFAfga`TsYQsj7CXbAjOS!Shad*aYrqg%M)O|;S2EWC6GF9Me zM3@8-A`A<>SxdxeR~Anz5@cyeB)}C`t*@ZBh!}A{A}0F`cofc~ezI&IEgIH}%qS-S zsT;`>fU4fRYO($Xdw2Fq_*uHLWFP;mbm)h3sx# zbkx%7%h5b&e5ckfNn#Y?=Ar*xq%j?9TZ=tYUx}byNd$4K?tT(Mz?-r0lgqVCrZ4!z2RLOdt?TBo2 zM;OanQjcQcw&t{?E>b1D5)G08_#Tea<1O-?2EiBZB2Dj;M&RA=^kUHto#e z8IfQDAh}5gmfWxiUv*3hCIBKv4&sOy>e#v)WZBh)yXSVIW^m5!2twMt2Nrd;3gCk#nP)J`{yp^Pxdr+u1WZdFd_Ti#c}1rW>FlQszgZfy|Gh*`@QN zV{MG{wK2p~ov)3Nc&cCzJ_<)XBy;sgl=bRKyznAIPAN!^Sg|5+7Zp!wW|BSg6Snnr z+N(7|tEXUKWhPG2@aQo>}QCFOG_?$(0Ym-k4P%=PQ zGwwAilB1+6XWXyGRxlos01Yf92pFO%n;nhbMVUf{AaU6KCL?DmHsSh!UN-+Q{gd1+ z!^`C#qhGL`)uf9q<6)C7I!$Te{Uq%;9harjy-Us-h6X1lGp;!M8TsFgE6yC>X?KX1 zyk_2U#~ppgT~9rF@6mhT|Mcy59KHJu&p!PAqaXR~(Ko)IE}lL5_Q&Yr*;aj_P}}bE z@b3Ibet&tq_2|3b#OS-8yYoJRCZDmUn`)o_qX*AzX_f!RMn{Lvjqsmu{dVzGsdQv} ze!M)AKdY7h;k!6aPlSw24NsigilYDC;K<}nt>>qIZ$}0$vMoP0RvsyB@9Ic@KYVU0 zaS|g$we2rYZf`%mh2=W&1x;j0ZHO#W8!DIpM&UFJIt7mEhrzVQiehC664en_%Ap@3X_VzIJTn_Qa9 zB~IS2B)JnngvvDpShM3wsv6=3D={KVDn(>vH_9m7ZS@7cHl-F>QfiTvUFs;@FLhKul-gO-I0@%2tFCFx=!mDhBP!EHc>@&F zMQ^8G@yziUbY96&=FE~|axFv9d86>NNxwODUXdz`@Uwo`mO5`#KOD_B(YXL*Y9d(y z;2W4X%x2N?Bm;SUUNX3ZGGIp(jDS%%w#z()`?O;dc?76^k|JyEPqN(ONW7XR3Y2T) z$U%KCe+MfXoAgL4%RutVX|fCy+=dl}V|pbk8us*pcJSph73NJ@xk*NHp-yTYR*Fj2 zyAF~hGh*SUr0R>EVn=aYDVOUQj?w*}TeKPF{!e+E7M{&-x5vscNQSc0D;Xw>L4jk4 z!Z9Gu$uWpjd2>>fz!rRbRFA@Yc~p<;M@dOP6M*bnNmc;(2A-{BkPI%--A*#N)RZM~ z3{m)1p~5>Ic?6ifV~{Mbb|hY7JBICZUZB~k+p%;tc|$o_d^+)Fv+XT2$0(edJ+?Od z<6nX65oVc~NnRM+jBkxf2VkztP_0fWThj?Ix7+1@DWh=OHmkCMBP>!j$pMp2Q?{r~ z0One@6P>c1=#_1qU$!Wm9C}c;=ERu`iCfs1kAh8mk$$=!Jw+KbVfOi{UzFoDQTUt>0g6;P1Sm=* zhXB+5?<(QKX(~XiC#oN23F(DK0&&ex@j}uU1t5dHXam4pTi|KV7<8I92JQ4)U=+@; z1!o?R5Edz$MLvTPsLM)jxSYn;UgijoklPvO@ovbCuYj!l2)p0;# zE+>`bl_i<@$tz3A#4nA3q$x(>dU_Up`N^N2Rqw6A`j{9;Ua=74B#V|oG#-WHC?pR% z>3b-GllqlHldA5V@VhnZcSegv(bsQaVSmc<56F+#GW-!I7`H{HT<9V%(qOgAjIRQa zBVH+>_Oye9=qTq{pENmJdjkpD&eq;wIc4WX+tSjaaKvD9e=9^p%cNN}F(+nKFa|{7 zG-<}@9n}&OYGcD1E6wU5R5~9Pk-3zdl9a$j-pN68nZ+uX$dY9=k%bL>HhIu}qHqd= zD9oJOpeuqUKoUK$nGhdzqwwTNf6a@Wgk28qOK!AyNYxdUjCIB2V7wq)^8-<<`Af498=gl3dF?B0RkJd}3w1mxQg@kB1)-dj%7wp} z+omMB`caY<%0+E*EoGK8UqQHy4v2c^+-Y+b^T|tA5-7+^R%n7VzxPE%$fzYEC>Vny zjfzJk7g_7JUJH}PC$ikv>qMm3B8AN1p3bI;$??IF{q8%w@-B_!Bd_$VB-OcLzig9n z@M6d)90Qwf*x@@EK~;zZSw@!(F`=rj>57*Z$+lB9d-gBCei58uX z7Ff|`ErI|v3dhuGPQ6&9Ug9Y6BBMmmi=*)Cxfe(Eqa^Fa3W2!o0bV6`hM3*z+?n=wgA&1{j z{Sh;mWr#R=w@Abx6rIyX1*1$9Ubb7l zTO23Jt#3-Q!blP9Htzw_BMBn~A&yBj1tRp&{QAqHy;FsW;`rcL^0}(*5g+=xAukl_ zcKlWPmR_ZCVrZ~fp3XWOA$+pUE_{f%?1^+#IC-y_cju)S`;`r07AGY+VByJl_o#FL z{LjbN*S~rki^w~4$)bJQPGtm(!q<=%N#~(za1LY4OZM-CSE5MCik4f+u|~yGQuS3+ zS#y$AwN#+Hs&?`yAeTDzZpaXepnY=G$ev$)D%@OH{No# zD?lRkNI`N8vZJ+l}hyB)L^gN!F+?+-?)SiS$TDbwS9eE}8=2T!Hok zjneY&QaIU59gIYH=W0JJ%R=YsDF>qYFJrKGhMx33dSQ~Y7s7-k5PJxYN+t(PzEqN= zAi_^c&iE9ZJPPJF;*!Ov;*!yCc#u!Giv%YFTbi9au)XuxY!{uU4JwDD&(j9Q8@9)4 zV3Q1F5zl^L6LB)IS+7CQX{swy zC5jZO*;Cyp9HUqAVzjFtlIlDG6wD?iPw^V*+t?XX-6;Hd8`vZ_>7b%q_P`c}&w5}J zX)>@$=Gg;V6z&deQT>j^z$SuaU=vm6Jg|vW8Q4T>_P`c}>(MK!pOfTPF(p|8n{c~L z)EU?W;W~pk4r~`V1KR~N8`y+N1~y^x2eznWJ+MiV6h!#zAK1htx9N~XTr!=m^9MG; z$-tIo=MHSg=swO1of+GO>Eh(E8rUQQnXyR*WIXN4f`Kgxw`Xhu5T7gZ0PqwhAI!5U zKmH8j4G}2!af-k*O|_7h7l7QynF5~Qq4XkMG1BPdwe#5zr6NwuCgSEiM--_tl#0~s zp)?A|c-h|{)elK?9ZE&8_$g5_dyW`|KW{^+A1 zp){)Bu^384uneW5>YRsCkt#!}NX;Hfqi{W5M)h-&+$yFdYbX_Nw~0DKsUTcu07SU* zTi-?T=L%aA`;+w5&3C?)xs(= zv`w~y44s}?M1n{932rQ`KAAE2C%Xo}x~*4ahp>w5)(or26+HmC4u;iSa*dsvHs#8v ztJVsu$QWZ5iZ~cnbIETQtYU8%b5Xd#u$oK0YFI^X2&>rnU|7v1&%$c1eAfe3kukz5 zin?Z4MXm^|$aOHR=8_xi%#|-wm7QX!>VZ{koi))6tRe-%DoT1iVD+g?lzFNfWtM_f zY=p3ijrw6Vm-98jDz?O+g6w-?HJA0Wu!>C23FVWcY^f6i`W0teG)hif5L4R zcpjqf{5V@l1BGePTKF6f>CUQyS><`f44W6v)S#%DjW#5U-@n?VimsYg;=E{ zf8S$Fq(l7dc9-4ly*}UPe$MCOs)ubR(Yd(n{z3nWIxo?A-Y5xE!RL*V?p@JD zt^IQ&FJxxwg}#|u^rCPsIpicu%oH}k7lpBhU-ryYE>BI62`c?t{EOa++G0k6ab$}b z31lUZ5MUL0d$%fkXklMBY2B|g*(EpG(yzVtZfN0bVj_pL`3o3D8pisiU-Wwb25vlV!ZrA7VoKG&fwyd?kj*F~+Wu_h_`E`5hyJudr zl4QvtXVhy)FxB7?To765*?>{XR-~NYcd3+;$50Og_Ewd7!kT8%dV|TdU>1rBp&m8$q0m; zUNQo8E@4{IFczH%L0^#tCK_mr?VT;c!!DD#t`fi2BFeDQ-4e!d&p?4xs6j3hVGviZ1u;r4+UJj>-hS~5>K_IDLuZKv7`*vHz;HdjHLcrF zVwFlgzRwT}{VPMYzDqS+N;!k_c9dm3HZ=wFGt=hoqS&Ft8>y<9WaHJ5ovI!`+uHlp z!k)L2nR?@kJ&oh1x=sFj<*cEQaMKFQDh6MxMMpsRIZg4+O|infCj?xeG$06 zDRhhUcg%t%F! zOw{9tjV!J2&m~viH9~-m7@7LGgM&ajxP_%M@+T1FcZR1CBsqB|IX?*vlCx8-_uqzo zdq)7B=7<4SMwtVXF8#m*g-Ky1it<22#AY<`Z0?~!QRO-oQ<34&Ys5u2qF+uq^BZEu}~^b7z82LkKmuN9iP&`iEN97w#~S0qM9GL1p2p?@@+e^ z^pp<8cUM)VS`<=6BV($#la*=;=JCPCxBFY?4iz>$k(L*dix(I6P9}S<7(F)5e$hNJ zU61cf8}kuZomPr(j>zhcdiYYaW!jlrZIbEPWahMXNRUfP z6|leyeeN@3ls=fGBf)n>5HdT|Asi?Ll~f5DYWugCvFX5aJ?T=HdeQ=?Hog}S7wp#| z48pBvqpAW=*_I=y$CNAK&y;7tLf@yZ3Y8U_ydUR+DE?K-?5hYx#>pzQsc`L$!Al|nKQ}cVX!5@ ztJHXUSr^C3MX3aY_s2V3H2!g-arC|Ax=8jNNiNSM-|Sg<=gT(#^}YPz^Aug~zrP0V z<^rbPVGQnLybO0a!DST;^s@snas<#A-2m@#0yj8%4iuKWHQ79Kxix*F;}~sMT9-=8 zCMMW!tpm2Z9{Wa2bGH=S`?LX)nnw$pUn{`9PYZkg+PwUUz71+ad8|@}i=hDP3(4f$ zjYH?#e%TgFFu0-%!eQ#tMxgnNA2beK0NVLW`xmAzXoyU&nrh8{-8k^KI!1*ygK`vA z6tF1vvM@t|F>TnkajY6_eYo&QVRHcxzjf}Esnb8(F*7A{>|CmcU8HOG3qz@iD%?tw zsuN@!jpl5X&A#HJXY7pb+Yy zJ#o;=FM;VG&3JA-;j9Lh@%oTR;}-$%rXJ!E2QcF_5^X5>>{=;d4*b zs8|bh`h)S==)M5Hwy@{Z*4$og5!=QpBiqN6glQT2O^>lWRBKyCmlyH6c9zZ&@wTp> zo9EW!La%6^n{w+K>_a6G!eCBE2w5Cc+w1YqvEf6q(D?jHa%B<{z}AK1#!eSC8XeiC zATfOq!b)TR@q$#9Hvol($9L;|Pv@3X7dl+prhy9F34Y3?c2e|-f~hDpk6dVcaH@6n zqh#+)p-t6ss{69jFj^~BM~Zql)CdkY(9K``ssJM_wC0XAFQ0{+0i_#P6H%ctbt;*g zGD4-f&%IfOwV0Bn1dfJYxGClF|slD6&22+ny)f2(oQk z!`4uIo6i5L3Rf{d+mimuU&h>KDsdgN9!VE3WFF|D8=f%i+e?}IvDMBhS}m>Bl>c< zxR*F>U*xr@uF?T%X>S2F48H-FIo0Fa^`F(<2yZa%XO8!~X|@Iu;B7 literal 935260 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%0DsV!_X9f6W0lLV%#?-k-Z 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 z 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

l~q%t?U@fMAiMzNAOv3)OZ0*| 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 A9smFU diff --git a/Test/TestProject2/temp/ab6e54ba9a669f76.pyi b/Test/TestProject2/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/TestProject2/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/TestProject2/temp/ee084e9fc6ee413a.pyi b/Test/TestProject2/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/TestProject2/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/TestProject2/temp/f3560b99de458aec.pyi b/Test/TestProject2/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/TestProject2/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/TestProject3/output/0019c939aae7f9f1.deps.json b/Test/TestProject3/output/0019c939aae7f9f1.deps.json new file mode 100644 index 0000000..2936a93 --- /dev/null +++ b/Test/TestProject3/output/0019c939aae7f9f1.deps.json @@ -0,0 +1 @@ +{"w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "testcheck": "14d33679f7fadf1f", "enumtest": "1b58766d38d05de3", "atom": "271ea3decb810db2", "vector": "285a822aa26bfbda", "definetest": "64ac83614c9bdbc6", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "9474791561654346", "main": "b235d6477436c524", "vectortest": "b777c587cc21465a", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "fileiotest": "c01b27dbcd683245", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file diff --git a/Test/TestProject3/output/1b58766d38d05de3.deps.json b/Test/TestProject3/output/1b58766d38d05de3.deps.json index c04137a..5030c5a 100644 --- a/Test/TestProject3/output/1b58766d38d05de3.deps.json +++ b/Test/TestProject3/output/1b58766d38d05de3.deps.json @@ -1 +1 @@ -{"mpooltest": "0019c939aae7f9f1", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "atom": "271ea3decb810db2", "definetest": "64ac83614c9bdbc6", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "ab6e54ba9a669f76", "main": "b235d6477436c524", "vectortest": "b777c587cc21465a", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "vector": "bf9813f6e3c9d351", "fileiotest": "c01b27dbcd683245", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file +{"mpooltest": "0019c939aae7f9f1", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "testcheck": "14d33679f7fadf1f", "atom": "271ea3decb810db2", "vector": "285a822aa26bfbda", "definetest": "64ac83614c9bdbc6", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "9474791561654346", "main": "b235d6477436c524", "vectortest": "b777c587cc21465a", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "fileiotest": "c01b27dbcd683245", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file diff --git a/Test/TestProject3/output/64ac83614c9bdbc6.deps.json b/Test/TestProject3/output/64ac83614c9bdbc6.deps.json index 55aa415..080c2a9 100644 --- a/Test/TestProject3/output/64ac83614c9bdbc6.deps.json +++ b/Test/TestProject3/output/64ac83614c9bdbc6.deps.json @@ -1 +1 @@ -{"mpooltest": "0019c939aae7f9f1", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "enumtest": "1b58766d38d05de3", "atom": "271ea3decb810db2", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "ab6e54ba9a669f76", "main": "b235d6477436c524", "vectortest": "b777c587cc21465a", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "vector": "bf9813f6e3c9d351", "fileiotest": "c01b27dbcd683245", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file +{"mpooltest": "0019c939aae7f9f1", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "testcheck": "14d33679f7fadf1f", "enumtest": "1b58766d38d05de3", "atom": "271ea3decb810db2", "vector": "285a822aa26bfbda", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "9474791561654346", "main": "b235d6477436c524", "vectortest": "b777c587cc21465a", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "fileiotest": "c01b27dbcd683245", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file diff --git a/Test/TestProject3/output/b235d6477436c524.deps.json b/Test/TestProject3/output/b235d6477436c524.deps.json index 8bc99f3..993e7c0 100644 --- a/Test/TestProject3/output/b235d6477436c524.deps.json +++ b/Test/TestProject3/output/b235d6477436c524.deps.json @@ -1 +1 @@ -{"mpooltest": "0019c939aae7f9f1", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "enumtest": "1b58766d38d05de3", "atom": "271ea3decb810db2", "definetest": "64ac83614c9bdbc6", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "ab6e54ba9a669f76", "vectortest": "b777c587cc21465a", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "vector": "bf9813f6e3c9d351", "fileiotest": "c01b27dbcd683245", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file +{"mpooltest": "0019c939aae7f9f1", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "testcheck": "14d33679f7fadf1f", "enumtest": "1b58766d38d05de3", "atom": "271ea3decb810db2", "vector": "285a822aa26bfbda", "definetest": "64ac83614c9bdbc6", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "9474791561654346", "vectortest": "b777c587cc21465a", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "fileiotest": "c01b27dbcd683245", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file diff --git a/Test/TestProject3/output/b777c587cc21465a.deps.json b/Test/TestProject3/output/b777c587cc21465a.deps.json index 47d27f3..eb0338c 100644 --- a/Test/TestProject3/output/b777c587cc21465a.deps.json +++ b/Test/TestProject3/output/b777c587cc21465a.deps.json @@ -1 +1 @@ -{"mpooltest": "0019c939aae7f9f1", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "enumtest": "1b58766d38d05de3", "atom": "271ea3decb810db2", "definetest": "64ac83614c9bdbc6", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "ab6e54ba9a669f76", "main": "b235d6477436c524", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "vector": "bf9813f6e3c9d351", "fileiotest": "c01b27dbcd683245", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file +{"mpooltest": "0019c939aae7f9f1", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "testcheck": "14d33679f7fadf1f", "enumtest": "1b58766d38d05de3", "atom": "271ea3decb810db2", "vector": "285a822aa26bfbda", "definetest": "64ac83614c9bdbc6", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "9474791561654346", "main": "b235d6477436c524", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "fileiotest": "c01b27dbcd683245", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file diff --git a/Test/TestProject3/output/c01b27dbcd683245.deps.json b/Test/TestProject3/output/c01b27dbcd683245.deps.json index b74fa3d..587c9b6 100644 --- a/Test/TestProject3/output/c01b27dbcd683245.deps.json +++ b/Test/TestProject3/output/c01b27dbcd683245.deps.json @@ -1 +1 @@ -{"mpooltest": "0019c939aae7f9f1", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "enumtest": "1b58766d38d05de3", "atom": "271ea3decb810db2", "definetest": "64ac83614c9bdbc6", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "ab6e54ba9a669f76", "main": "b235d6477436c524", "vectortest": "b777c587cc21465a", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "vector": "bf9813f6e3c9d351", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file +{"mpooltest": "0019c939aae7f9f1", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "testcheck": "14d33679f7fadf1f", "enumtest": "1b58766d38d05de3", "atom": "271ea3decb810db2", "vector": "285a822aa26bfbda", "definetest": "64ac83614c9bdbc6", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "9474791561654346", "main": "b235d6477436c524", "vectortest": "b777c587cc21465a", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0"} \ No newline at end of file diff --git a/Test/TestProject3/temp/dd3002730623424b.pyi b/Test/TestProject3/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/TestProject3/temp/dd3002730623424b.pyi rename to Test/TestProject3/temp/14d33679f7fadf1f.pyi diff --git a/.transpyc_cache/bf9813f6e3c9d351.pyi b/Test/TestProject3/temp/285a822aa26bfbda.pyi similarity index 100% rename from .transpyc_cache/bf9813f6e3c9d351.pyi rename to Test/TestProject3/temp/285a822aa26bfbda.pyi diff --git a/Test/TestProject3/temp/9474791561654346.pyi b/Test/TestProject3/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/TestProject3/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/TestProject3/temp/_phase1_manifest.json b/Test/TestProject3/temp/_phase1_manifest.json index eb76b7c..42c45a8 100644 --- a/Test/TestProject3/temp/_phase1_manifest.json +++ b/Test/TestProject3/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject3\\App\\definetest.py": {"sha1": "64ac83614c9bdbc6", "mtime": 1781005527.138675, "size": 9399}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject3\\App\\enumtest.py": {"sha1": "1b58766d38d05de3", "mtime": 1781025043.7585423, "size": 2094}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject3\\App\\fileiotest.py": {"sha1": "c01b27dbcd683245", "mtime": 1781261000.2857711, "size": 12600}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject3\\App\\main.py": {"sha1": "b235d6477436c524", "mtime": 1782110387.1454024, "size": 15478}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject3\\App\\mpooltest.py": {"sha1": "0019c939aae7f9f1", "mtime": 1782828388.8033123, "size": 2789}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject3\\App\\vectortest.py": {"sha1": "b777c587cc21465a", "mtime": 1782828416.8050296, "size": 1215}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\platmacro.py": {"sha1": "93c1d18e35d188d6", "mtime": 1781237231.03366, "size": 1422}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\vector.py": {"sha1": "bf9813f6e3c9d351", "mtime": 1782826619.9232223, "size": 2141}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\fileio.py": {"sha1": "0035c95a18d4f8e8", "mtime": 1783747022.686592, "size": 14147}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32file.py": {"sha1": "f6b51804a0ba8ff0", "mtime": 1782531158.744144, "size": 8424}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject3\\App\\definetest.py": {"sha1": "64ac83614c9bdbc6", "mtime": 1781005527.138675, "size": 9399}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject3\\App\\enumtest.py": {"sha1": "1b58766d38d05de3", "mtime": 1781025043.7585423, "size": 2094}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject3\\App\\fileiotest.py": {"sha1": "c01b27dbcd683245", "mtime": 1781261000.2857711, "size": 12600}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject3\\App\\main.py": {"sha1": "b235d6477436c524", "mtime": 1782110387.1454024, "size": 15478}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject3\\App\\mpooltest.py": {"sha1": "0019c939aae7f9f1", "mtime": 1782828388.8033123, "size": 2789}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TestProject3\\App\\vectortest.py": {"sha1": "b777c587cc21465a", "mtime": 1782828416.8050296, "size": 1215}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\platmacro.py": {"sha1": "93c1d18e35d188d6", "mtime": 1781237231.03366, "size": 1422}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\vector.py": {"sha1": "285a822aa26bfbda", "mtime": 1784375432.2854693, "size": 2071}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\fileio.py": {"sha1": "0035c95a18d4f8e8", "mtime": 1783747022.686592, "size": 14147}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32file.py": {"sha1": "f6b51804a0ba8ff0", "mtime": 1782531158.744144, "size": 8424}} \ No newline at end of file diff --git a/Test/TestProject3/temp/_sha1_map.txt b/Test/TestProject3/temp/_sha1_map.txt index 23df6cc..eeb15a9 100644 --- a/Test/TestProject3/temp/_sha1_map.txt +++ b/Test/TestProject3/temp/_sha1_map.txt @@ -1,22 +1,22 @@ 0019c939aae7f9f1:mpooltest.py 0035c95a18d4f8e8:includes/w32\fileio.py +14d33679f7fadf1f:includes/testcheck.py 1b58766d38d05de3:enumtest.py 271ea3decb810db2:includes/atom.py +285a822aa26bfbda:includes/vector.py 64ac83614c9bdbc6:definetest.py 6f62fe05c5ea1ceb:includes/stdio.py 71e0a3ffcb3ebfad:includes/stdarg.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py 93c1d18e35d188d6:includes/platmacro.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py b235d6477436c524:main.py b777c587cc21465a:vectortest.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -bf9813f6e3c9d351:includes/vector.py c01b27dbcd683245:fileiotest.py c3b259b4059f8668:includes/viperlib.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py -ee084e9fc6ee413a:includes/memhub.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py f6b51804a0ba8ff0:includes/w32\win32file.py diff --git a/Test/TestProject3/temp/_shared_sym.json b/Test/TestProject3/temp/_shared_sym.json index 6e2ef56accc592fc473a04e49273efc7a019a2f7..77335ebbb4fbee9b9f4bf55202c6ad025ca93851 100644 GIT binary patch literal 521371 zcmeFa34B{wbwBPT-j~GLw@GH7$!sRJ6DOHnmgPkAY}sSUSs2dJE>NH_{7MU@&=&Z0ftIC((w3G1+W)`(we(kJeoNs8{O@^BPkNHx zmF=r{k1~3i&u32jY$s3ObIv{Y+;h+JRO{PXS~j%6e^+ydvc1VGOY`x?U@A1fsOGXe z7Nhe6;dnwF@N3@>=-=)!KRuJX<25<>yPZM(FDJF9wrFxWmB?kUEBq6uLb1rAnjFag zIT}i`H*~oJSC&<8Y$2X2{6m|9sbns@weT0=H~h8p%DK z3uXKDUxHr<#zIS~_HP#dWXJA+H!I$l1 zKTM`VDfqB`@kI1|G!|m|n3pd6Q2)ff^wYWd?51FHDM$LV-MU6js;Q997ELu;fz$BD z_QhySjm6=!v@U@3+4p*u;*s>Cs!0Q$JC@X?c{Ksro88LZ6JEZOBJo%-K2Oy!=ua2> z=5i=}L1R~ML|tJ2X3*e#ml{j!l7)Y(TYD<}jQz!E3_gO!DDA7@d^~c6Nvu!*fuTA+ zojI|1?8;I+on*hiIg$Uj7^`D!T`*Pbi>TqnP(qF9Y+>)~3+oD`eM9@5t|i8b;9`_% zKIzVOjx%-5Ge>E8LvALQ-NHUpo&%x9Xb4`lC7~wcix=6ytN#F&6Z@@XDv{P0(7_(y z!?0fkDWzl4c#M7B&AtZtFpjV%Py|gcz<}tFp!zBOcj4dDImdpsnLTLWbk4Kyz(1?u zWnXWDpI#2D%kWo&3~&-YV>|m^DiLBr0{Js#y)Q%V&yWY0%05Vj$wL|Pu#dPhWYkC8 znu-t)IcY4VN7!#DN*9^Po*27#ZZ^rJJr__DOHrSCIh~vvQDH;x@)MP5i zHo{<1Wh>Ll+^+)mP+qdxP0{0bvaLmX9L%xD;UV^@=7nwbFOz%nyUSr88N7oGG5tJ} zAxAT0Btwp^+45Ioa|RY=>599XtvF!wu#H;8VRN-l#<2zc%oa?q$rc2d;Fz&Urlu2d z*bs*2QtHz3+|aQ>H8ji&^8E3^!;$$REEBQ0pi$vPHN>`6D}k?3mB{Cz>3vL*MRAs^7&^cJ;*S-En#ku2h-(#bk;kA4YS7*=0l0aN`z&F$%7f|mJQ{TS1IREpTf%I!ALc%Y%nTHqE!zS# zrc*Wf^`evY!F3*YA!5m*6qV*!LfmnCDJyJ^EReq_^5CliJit0wm#c$Kr)%;*i-Fkx zBLE-km{|tjuCpfH%kCHp9H7^+Cjlm49lZ{gt^-@oU-SWu6Zx>M>G(xQ#h8M194XTb z+s-63%wq@ctRhZ_Qt6`hK`V z-@E6v3pu`xbB3(5Jvtxsglh*YeYQKDWO=hqK6F8XLO$}b$6;XUaSTIu4!f0lo02~+8` zKR0tL!|9)JjRq&ZzToJ@lv_at%d$|d!S>q^c839W)Ek&|O$SHM1w4LayjwVUCtDz&ecu4EV0&Fyf@e{-t9%SuCu|ZnK91{wsf~5!Ub*Cg?q~5VpxNI?@O^O z0$9$lwRmNiD%Qk;q~{0fnXq93OTPm5vjQzD)_C*0xd^xJ7tnM!oGMYU*8TF4Dsr)I zDay6}p+x#`a>4fJ!P;|jrl(sW$336fP0wjh`ExU!V^7!i339i=3>y!U^s2^${5g_7 zCB_8A6V-l$2{s?B=&zJ8;(cO_Ks;e=H|&5j4jOxka2<2rFm&B%$Bw;4Sv%+Sv9AKO z6AmFJ6?f8Eq+J&_a_oR*7Ml(r>ur#?zO;C+KX}IL8=E?VeT0VQfi*P@J24y{j0_%E zhmSIPJTg*}7H=G46baFmPMv2gurG2mARaGdO%`ZxJM(_a`XdQASb5LA+q)gXb}4WqBjtj@B}@+F|Vs0F>WlKg>^aM_066|UY8Ksw!|o*%?n_h zbh)Rntu=(RF)_MkCeha=#IUh2_Axn*dQaA8Q9|?@3n(b8cVe1dhT?9P5V1zXI31`< zRDL@T6)1Gova7Qoji~dZqK^Tup6^_fP~lU}meaZvgfTtc%cOydWns%M63rME4wH@F_j)cO;hermFgip*z=EK$pxXBg?2?9O- zfXl7aCFx@?PcRB*zB?fA3aF_x=+vQ@%~yl;BK6&RnInGE_|=)Dj3 zbC60omb+%$r|JQcH8HRhrwowoEFg8-GlT3f9^fFHZ0WY&o9cz2+wc%jA9g>$gP1`3 ze1WksZ;*-8@14T7LDzGTKEi@%5`@}$%H$ z^H|3xrd-$ybbyCbg6j6=an{A+zJv!g8bqEotVSSm$JLVl9N5?vhh_w&u5cPUB7LZ4F@Q?6-$_U4sfR17VJ<0(N~11v$X+sg5x=jdSOKyEKV+wj?tTT9?JcwXebQm_um zkStxljh-u6inh_SCQH#adj90@lJ)C|Ov+LLH+oK`39SRND@|w}kY{OfthB&5oN|$m zLzo$tCb&+>z1&+g&CbcfG|9ML`Iu1CZWW1>l0mt%C}d~kQtm1Oc1l*I$;Wa^ex+#{ zJ0a7uzo^uWpL1zi!A{A(G_7C<G=WCXUw!t$u zP5!fyBZi+%gqg!>+I{lLd9Sk;RCaCF7*aW!Ib3!W@a-(O5noh-eIoHKn zW9EroSKOw|s$Cb{m>Hucmn4t7@pDHj)f=FrXI5fnkycu6C*+fw1Z_&VZ0O8VYsd|q zW7<_P-N;wu(1q0MKGCIVMH>|dK#Shgiy8xJ!i;v;HdZrKWnW(duY z3mLMQAxjw&%aHih9E{~m&u2Rs50j}-A|<3I#?U(Q{zBh<__Erty0uK&Z6UieWKV|d z&5(T=eYhl>(b?utg;Hvjk)=Lz%*Q5{9?X#IAJ0{l?+O|9S&5SjGg&eXW`CA-OBG^$ zrW)%7rV&7w)6amy+4tdAIC{~}^nwkvyOy-VV(=#YCgTQgSZTwn155%#R0lN{5mJZz zP(v^b)dm_08U|;p05n)dQh`mP=D?8uO-=a|yLSZWbBQGX&B;`Rslb3tr;C0Hb~g(@ zD_ik)&F8WYdvz~qOA)&)XNi6Vpx>7v_h-lh%m;ap`5+Hv$iqJ3%2e}K5PgEaA{Rt$ zL3M|b{!okuh#R4a2lnlU^!i>Q*&|y2?!4?p1z))d&@nO4h$gRH2QB3FR6T!GUD0rY z7Psl^Izexebr(gShskjkhMay8q^>B;Y}IyPUO0MmXz1v%!TE4lJvJYn$2u^#GnUD^ zkk7Wey|EN8)bK5xbG=MGz5!p_aR{uw?X`|hO-)GAe!hNuUq=Zh9Sh~GtW}WhEyR$R zT&)90Khg2RGzcWT9e`Jw3U4+;=Be_QKFtWg{)Gg(6=K~|R5{yMKn#IGYboEL1BO`< zNPs&4urw*JEjT);qlUo|NT^$(R7#GRJKeKv5f6^AzA9Gx+Nh2d21p=bZ5xvfc6f*b z)~|zwNfKCKAC(4{cEB`HE15=gnBZ|@!3?-hx#V+!h5AM$q@4hC!s}-m z)|-#uZXw&)SH7#cLu6;Iw>Rw<QJGO5eaIi236YT+Nq=EY40a=yf6|132*zXMA;S{#ws%Y zV;wV$hd{#IrDK*Rg zVwfy}h4_p#N0L4QifXkJ59lyqvIG*$P7S6sBi(JB`FQ5}K^-v+nm|I_0dkcFxI;T5 z@X$`_Xkp|87TR$w3zd0(5)KLUF`gp7Oa}^sCy;=)O^mvN*f5uMm@s<+31$bJgQRJ1 z)kEJ?I#{S)L;~9;uOxzv1VIDch+F_ISV=?Xx;sC{{#5+o7Qy9FYUJONYx1tA0+$3pI+UcqL69X2&0G z-Et$Vf2HGvxfG~)CAH)=@Qxhe=<`46c%ecO32&#a&qI>dZ+Bjyhj=Uaf9r^$L=g#b zE4%NLgjTz-<{|CeqMh?#R0R^!HilG|rRspYd9Iz>t7C<66^K}6St$)G*GAo`V}(jY zM69wbl!ldSpYGGKLiHgQR=A#*vs~%hd09CVI!qW=fdsQ1U`kr6{0POIjuWa3F>y*- zr~Cu#qK*^hRAAziv_|EJR$xX z{<04E1RmfneXEs*c-1KRb2{XEks(W5#yaFG>-Yyc_Ubtbw>ioRd%GP4tW$0^2Vqf z+f4gmbG1r9cv8pc#>2QND#<3(8+jn#sDm8C1S!cB(;*(ncjzEJm>^|EFWfwkAJ9RL zFX68r4Y|J=ygDSxQrRPbD;=#Y5Vjj6SK#GDloz@Pj(e(|9;Lk}`pEU87IwK+oU-?OIMHBFrsa zgG}Gn(z2li{xkPI^{u6yDQhRhcL)DW$9xtKb0@RF4E7oziy&p;dv7eoynT+R|F=5c zb9i{WV9SvRxJ#=-;v@c79q~)?5O-V(vtY9<0e861KrEXh-yiE}A45b7V5OaJu7i`f z)j4kSHtondhX=G1fXefo?%^Rls3UzG8L2$q=|LXS0UhZRh)5TpPDq;eehRYLt+e++ z9cd5`X_tmnp89@~2i2!TeHk`XdHVY;9@Hmvs3B~q@|^$g^Pt9bsPlMGyLAN~lD1fX z%ES699cvg5Yg=$M9$%DFQ%3H#G)QmJF-Gt(LeEs@84j=%S}8!eO%$^wZ`PV^V&w}% zf80D~S=k-*AE9NU#h#Nbf4QO{Hp}eEBggNVnJs;_q98WUG+qrUrgD_Lol~S=K&`)8 zQ4m{bLN{{Ia(J~gHQ&txUh#HCLF}YyNL*S&O?rq2y!6$Ig4j;e;JM7Mn)Cz@c*WZl z1+l57!FG8a7{NU&&kFW$#uL#73Mj+XD77NXeDfkCVQc2fgz3ih|gf)39yG{W%MUO@FVV zAU5hWlucewNBUu&w9DSDD2QD<4Na5Uypw*02fgz3ih|g~(>NPRY~@M6%)?&(az#Px zv9GE91pz3`xOPTp{JpEQoCHzAMoH;zFtufyL%S6FBkqMPG~J_@qR@??D1)A zaMD_R(j7eLrLR^L#D<^7J|nO1C%u&iyX@VHg4p)ccy}GTe-@ng{JRweu@9(WWTdtO zrQEi*m~4h=X%FRIUPtTFRi0!+b5=6TBkBaL2N@> zf?ZavA1}|N6g#|KQ4m{_mSC4v0?14JD8&wMR}{qdq=qZ0>%62crIeQmlC6Bbq9C>^ zHI9tzUR6?|GOwJh5Ruhittg0XOO1V%y;@f3GOxI-;K$|Pttf~sOij3DSvX#;nHjfk z-w@lGnsCdqZoJYnGj83sA+|O(a6{UJq~*=4L@VIVzgtlddz~5{9K2iB0_R?#m%m(5 z5WAn6UoLBj^9t1pzALa@U*m}VP|e6?EplGrS_yJ}l_PdYHM}=i*aO2qQAWc^!e8-3SuKw6MA`V80mjo1N!{y z6$P=Ys)1hHU!`gOU$2I~_9 z%QIfCD2N?e&B$eW_PjF666CsPkJzo%*y%KVleW`M@s@h!>lFpDb*o|NbfuF9|7AS* z7VlRS#6GU(_eYw z_GU#vY!+Lzu*O8Yq9c zq9FF8HME`~m)G`&n>kSNc11yKQEPg;ygoQwFSX+Bih|g+*7SCHjd8f%YQ@_X1+kH> z@%Fm(vn^Qq!rK)EvA3-e`l(Ng+d^(w@%4&=*zeYiUfz=Dy0Vq8R}{n^xaQZ(Tl8F~ zw(|9gg4h?=*k)yRjpen+EqJ!Z%M}H&Q?6m}>e4W`VDAcVR}{qNxrS%UdaJInhptFN zS-xLy@qR@?Y@}-}I_BTWYcET`3k_AR+G$n3UQrO+>KfdK?M5Q}7kKb3-mfT#O?Hiy zFSFM!ZG*0OR>H4%yP_br+%?`_m(IHdt51+g=)8NEC& zk9)IR`Fce`?AB|%zCKNR3$ic1UQrM`_!<_sPK|sEku1~u6$P=aZwY>R%FnI(vUtCu zAolt#dB40v4!82l;{A$(*Z_EI{%&2@Km0zxS*s7AD2Q!=jXW~!?!bj4viyq`1+h zH~U#KrIG1GoT}l}@LWn=TAmwO7#Uhn4<8L5RYQYeb$(#^N;F3%8UK7&b7VS09?g&$ zAMvwq1bk#RLr(k186P>DA?F^?k;mA#=h&Z5ka-f$lrn6kD#Jh{;^`D3$9`Am7__B& z7QV#6s3sDK82?1a2+gOkFfJ$9;dMa>W41MvIDa^o-4s23XYT1-h}^?$3}1*gy6ld&ff=^01G%R>){oL&JX44uz^} zWypOi7N3lbM&f_6E;}_r|8OfD6WFm(gDM;<(*^BuFh`$b3jK6WZE8mK{YOAEdJr`u zX@h2v_dlJ(&fd}QRfeU3$SGt`-k*{f}AdtwPzdF30DY?AKVYsY5wBGox)0j@9x*tnDOHmla< zbShbk(~{qrnm)@aCnIZbs;YuQ-+$Y@*XqWiZ9!NM438zR2>Gqa@MW7Gi~V{5<^fGF z&Z~m&{})N2arR7dRwo;YxTzSwjr(_#nXb>+N)7xd3r3n z_+Gu)JUV97*q#Zq_FlckJTB%M4p!PWc-S~SgoJ>8O^LmKPteBeq35*x7~? z#Gt)!?pZ%45TiJGPS_F4G4?x*c#gBETtthF`H~h_@zui*dtyD#?ki$ zFl7-*U$i2^_<-;M+8f21>)&ROQDDh9iyw> z+*XYfK#GXCy<1m`Nc&P~aWNhi0+_dT#y(grPC&j<<<3fJX@-k(^Tb0=8kq%;u=_V{ zh<0taT_+BQj}Av7Ba!*zkt2iQ1+3ey_OQ58nIe@%?`jazF|^03p~2cy^zQNf zDA!vZ3AJ{;Fx|K}bz&`9fCBp~%=bppiPnXLs@AgmfIif^^E7&b*18?6ZFmaMp1hJ| zIiE6BpqZw}l7R)x01N>~G6N9CTa3;R)b5Sad)Q`HFbVW9Y;Eh`6?^fa+u$?NfQH>T zbDq(jjI;Mk#W;cJA3&@Ql)z>;fxfzg53d#D1LB?tF$my;jawuAH8IqP8-Za0Y~2s& z7sYTRnm(vGVA2-a0BZ{|h}-scg&4MklHq7HxEQ~rCc>eln71c{l+IqqtiPfR*P1qZ z;>fWh$4(3$9T^-sdSv*>hNnYW)}@!1(OI{kvkvB$ybQjyqmH0D*uK1;sHqey z8^T);^r8+G#+4vJZI49HM+H;4#8$%7Iz|{uf`qY)sF%@U{=5zorjKC3jE7U`Fn?8t z31dc(VD>DhW8qXfl#0emTObEEo#juR$_AmQxN(q=;Q ziuGE^>|T{t!t-5`0H8w8Z*~h_$#7-u}rwJdY2|fnE`1VGh)$sG268LNFgdw+BBTdU|UJVj_8~kw!M14n!J5-YPT(#SUA7Ca5m4uCb@_?hHi_;PIrK+!@cN85+n@U)|Y*@vb0MX^h7 z3-f@Z9*t}o4&e#EHI$08KGIgLe0|n^dJV>}<6@{80kVz&-H9jXHYVrAMahC@jnH6J zWA#R8+*?3HvDT2yXK~x3&4|=m$zP+lJ$K^?8y0m&h!0?Zwyh&E5c>tlN^yi_zMSf0oHy#vM;9>-i2%->U|CF${dA9$e#BeTVUsU>A$_ zMPug&>Q+{e<$eOK)WE*LXZ3vf(oa!`8i6uCm_C7`Al41+DAfn-@_{Vp{fdHEP{4|( zv^9a9i4HSbOJ1xfh$RMWZj|=&I#e3K%(C)#D+*%Wf${!2lphqZo8GM`h{Xuo^1QE0 zO+wc4?TUg}qrk?6X}VXBQU#b*R`GI0L9ARbG`|i73VkWpr zMQlw7r}JXa5p$nS&}&VGvpg^xb|NFj3B+XJ!s?Km6HGrW#tOt7*#avhr^?c=F;)}} z#n;6cgP1dFtQKjhqx4559QlbDM-X!;4UT}HVQVTSz44$~H*R510)7T!TA^vt*v*QQ zC9HTvj1`EPb|$4@dLeYZV%(rs-BjXYoIuPzGjl>>5*p2kaRM@E2C&TCXv=~zmlaRLLJ#xEqk?40y*z%7hZ2AAh*n*guW73sc53hx^i@{vsOV(Gr z?|Sp*($Ag*HW$Qf6k~Idmy|+}m9XSqF_s|aXt3sI+G*C_R1NyL7;wa-1=eHT0B&dQ z0)0vhIpPhzN#r(OR-67QV?^;d_9Zd4AYSl7MF+d!6>>1wkWa(E zTdyHvx2}$OJ;CKrG8qiV(=oAR1|gL6_M6y#XhU21!6T93;gMq}7LF~1A`62yww14b z;oTEl2t^ms*>+rK8w@QPf-mKF!s`j9;;GQ0rX_f*fS%HULWC9>D99BN=vf^oj1@ux z+BUDAkBU_*HB(PBB$grZt2xLk6>4M+bChfo^lCkb)Ua@myr!sY7B!5DLK5}H_yr-G z)s%A0Qijo2NK$SU-kX|ou3647=nF~CZDFE@#TK*?)Hd2gXo4R!rpjthEH?EVn<`s4 zg<001pp+L|R1;kDy`%QxsX=Qrwjeg{t-0K5Uhezx?5wKJ!uc%$+aVyURnwz#2WrKWxM{Azv~fY>z)qI2F8!qux@<<_dzht+{y`= z{O2DNKU)C-ADPXN(>`*>N6u!*xyN(lG4|~__U991o`f?b;v;H?ln-lLA&VKZRBAM{ zJ6Z4Xl;(;I)FnvB{Qz3r(2@^65iV4Z^qIL(kCn5$R_t;Kv6T^;pfbA=;h}w>_^rRS8#6z9g{?~lGqeKiZ;z7rR z*8xYKu7V~bAM9A;^coH{>&p0OKh6A>xLD4#kk_iUi(n_$?DW{ZbF)b{P;V}vCYGW; z^>R8nH>M^pq~gnSfkY^loW9~_KTD=GGM$K1_ECrD*i7c-xuN4nL&t}PLZP9N`GxsN zsATRT3wuXGsgSkM1pA=X)G9^8jMNQ3+s;bL&ZmeqdMZ2}WE~91RP*5!Ddlf*;r%67Q@sYE)Q$`$%$JwiVZ z+IrYW2Jaw4Z0#P&kfRwg!dfZ$wAncu$nFf;lOcOEWM78tXW_I1>sTH9EI;J-qQ1C_99 zvFL!F>GXYE@Q&~Z=x;k4f3_`tDW-BRmK%LQl*~P^=VFwNK##@;>S8bHb+;CFyaVv1 zydAG253~+jUJ<0!EpN+tH5JtQl+}>Q&q=v5GO*N1cq`=o%(||7;KC0{?mL3oO-C@ftcIhk5N2U9F4*HKf9aELkHph3>-_0lNMDoI zE-FTE*K0ub>z?EYSA9sb@4A?b*}Lf3uAt3z(R87ZiK{&gYvto|%mH=uOb56iMbenQ zfM;?#I66BX^m||GLH3*=JIo5FGA5E1RhYwOnH;u9a}F1y^8V z5Jgtly_wL*m>%R;OJOfDR?Ex8bOcg}kaXlgK}YO%vFP7xh9mD@(dWbr2cn~~t-uP~ zJr3G>TcwgzIvliz{hEMvMci9=6`16dO}5iOjO<9jt%JA`Sl6vX>*UlJwx7g2g4(Vf z4j&#q8a{C}G%R*_4>V(?SRYYp%338iB zq>cdG36h=m%uFK773Q_9B3C;P&i!V&Ha^^Tkg9hIS*B3yyoyZiJVkFd%e2wK_JTxx zQ-SfRSs%6yhJiw>$konc^$xRKodLOZJjyZ=EfWx>)il9S6SGtgW!p(87D4|UNNLU4 z_V8jn>C{RLD9nuo6Kcqzl_=RRz<((bO>vf4qnF}jyQ0ZpXnC328KmJE&=X9OP(lqZ z#Unf&xQpJpxuvC0k6cm6ks-&F8?;K~7Mm-P=>hg)TkG_zw$qbYnAHY*8TP$13>z=m z%;;wiF@{1djZXx! znWxHjbCJBLHP(~1fhJt4O%>kJUr6m9%o(y5R)v?qvTv#ac|>d8^(dYyboxCWCFu8H z->$-xYP0WZXgka4wY{0Rj?q1feKQBG5-l-qkcH8M9wxnkhjF9*825O6r(F}?F;Lgw zxOc)6oSyRf0v>F+vV2%exjyn!_MiQ*yZxtJGoIj#$AujOhgsoR3f!ZkJTv1BVAo{a z%!4UGhkJFHW1a~QI!>5zZYj=I`;~UfrQxB01r`)x&1&jXW@8C;o#m!$N#5x-A;q>t z$Tc!sO;DXsE@Kugc5n~5a;8GG4UX3=+6FHWsSs_06^SW*HYLtp~>mXpBm7ONv(a1h+bj+Jgm|1c$vLYjw>g+OsH3Z!7pv_th>Eli);5lF|Xh&e*Zo&@o zZu~lz{U*ewW$gguX1^L_-RSi%dpVMBblkg5xIxa&sE4`Ugxb8Woq^tbVOaOVAo>|d zO_Mj?qTej)x@V5ldm;Nu9$K?#ZO%cYA7UT9*oOAEv?rqt?Xv)D{Y{$@6YzaK` zJvww^K|K~aeC&95L0u^6ntdqS5u2zs#@Z33N7)^V%YHSSX652n*kJTv-KIR+DAIf%mV<|Ne3vuUn(@m?E%0DcpRQ^YOm;%rC8k{&4Jx{ESJw4BOSFIqk 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

nrX3x!T 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 str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/TestProject3/temp/bf9813f6e3c9d351.pyi b/Test/TestProject3/temp/bf9813f6e3c9d351.pyi deleted file mode 100644 index 00d2f9f..0000000 --- a/Test/TestProject3/temp/bf9813f6e3c9d351.pyi +++ /dev/null @@ -1,24 +0,0 @@ -""" -Auto-generated Python stub file from vector.py -Module: vector -""" - - -import t, c -from stdint import * -import memhub - -class Vector[T]: - data: t.CVoid | t.CPtr - length: t.CSizeT - capacity: t.CSizeT - elem_size: t.CSizeT - pool: memhub.MemManager | t.CPtr - def __init__(self: Vector, pool: memhub.MemManager | t.CPtr, capacity: t.CSizeT, _hint: T) -> t.CInt: pass - def push(self: Vector, value: T) -> t.CInt: pass - def _grow(self: Vector) -> t.CInt: pass - def get(self: Vector, index: t.CSizeT) -> T: pass - def set(self: Vector, index: t.CSizeT, value: T) -> t.CInt: pass - def len(self: Vector) -> t.CSizeT: pass - def clear(self: Vector) -> t.CInt: pass - def free(self: Vector) -> t.CInt: pass \ No newline at end of file diff --git a/Test/TestProject3/temp/ee084e9fc6ee413a.pyi b/Test/TestProject3/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/TestProject3/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/TestProject3/temp/f3560b99de458aec.pyi b/Test/TestProject3/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/TestProject3/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/TypeCastTest/output/78418cf2ee722f0f.deps.json b/Test/TypeCastTest/output/78418cf2ee722f0f.deps.json index 9da11e2..48c6c93 100644 --- a/Test/TypeCastTest/output/78418cf2ee722f0f.deps.json +++ b/Test/TypeCastTest/output/78418cf2ee722f0f.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/TypeCastTest/temp/dd3002730623424b.pyi b/Test/TypeCastTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/TypeCastTest/temp/dd3002730623424b.pyi rename to Test/TypeCastTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/TypeCastTest/temp/9474791561654346.pyi b/Test/TypeCastTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/TypeCastTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/TypeCastTest/temp/_phase1_manifest.json b/Test/TypeCastTest/temp/_phase1_manifest.json index 6f5ac6e..d71d49a 100644 --- a/Test/TypeCastTest/temp/_phase1_manifest.json +++ b/Test/TypeCastTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TypeCastTest\\App\\main.py": {"sha1": "78418cf2ee722f0f", "mtime": 1782109471.5646322, "size": 6566}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\TypeCastTest\\App\\main.py": {"sha1": "78418cf2ee722f0f", "mtime": 1782109471.5646322, "size": 6566}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file diff --git a/Test/TypeCastTest/temp/_sha1_map.txt b/Test/TypeCastTest/temp/_sha1_map.txt index cf9e2fd..8361a81 100644 --- a/Test/TypeCastTest/temp/_sha1_map.txt +++ b/Test/TypeCastTest/temp/_sha1_map.txt @@ -1,8 +1,8 @@ +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 72e2d5ccb7cedcf1:includes/w32\win32memory.py 78418cf2ee722f0f:main.py 7e529fe7a078cfef:includes/w32\win32base.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/TypeCastTest/temp/ab6e54ba9a669f76.pyi b/Test/TypeCastTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/TypeCastTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/VRandomTest/output/e24a7f4a875f4518.deps.json b/Test/VRandomTest/output/e24a7f4a875f4518.deps.json index b129803..9e2740e 100644 --- a/Test/VRandomTest/output/e24a7f4a875f4518.deps.json +++ b/Test/VRandomTest/output/e24a7f4a875f4518.deps.json @@ -1 +1 @@ -{"vipermath": "3f7c5e78d8652535", "vrandom": "62cc01c2bb770ca3", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "vipermath": "3f7c5e78d8652535", "vrandom": "62cc01c2bb770ca3", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/VRandomTest/temp/dd3002730623424b.pyi b/Test/VRandomTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/VRandomTest/temp/dd3002730623424b.pyi rename to Test/VRandomTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/VRandomTest/temp/_phase1_manifest.json b/Test/VRandomTest/temp/_phase1_manifest.json index 04412a6..d55d672 100644 --- a/Test/VRandomTest/temp/_phase1_manifest.json +++ b/Test/VRandomTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\VRandomTest\\App\\main.py": {"sha1": "e24a7f4a875f4518", "mtime": 1782109440.0645702, "size": 4476}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\vipermath.py": {"sha1": "3f7c5e78d8652535", "mtime": 1781532528.2518907, "size": 15412}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\vrandom.py": {"sha1": "62cc01c2bb770ca3", "mtime": 1782101201.2607212, "size": 12067}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\VRandomTest\\App\\main.py": {"sha1": "e24a7f4a875f4518", "mtime": 1782109440.0645702, "size": 4476}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\vipermath.py": {"sha1": "3f7c5e78d8652535", "mtime": 1781532528.2518907, "size": 15412}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\vrandom.py": {"sha1": "62cc01c2bb770ca3", "mtime": 1782101201.2607212, "size": 12067}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/VRandomTest/temp/_sha1_map.txt b/Test/VRandomTest/temp/_sha1_map.txt index be3eecf..9a0c734 100644 --- a/Test/VRandomTest/temp/_sha1_map.txt +++ b/Test/VRandomTest/temp/_sha1_map.txt @@ -1,8 +1,8 @@ +14d33679f7fadf1f:includes/testcheck.py 3f7c5e78d8652535:includes/vipermath.py 62cc01c2bb770ca3:includes/vrandom.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -dd3002730623424b:includes/testcheck.py e24a7f4a875f4518:main.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/VariadicTest/output/c1416dfae155d6e2.deps.json b/Test/VariadicTest/output/c1416dfae155d6e2.deps.json index 455dddf..8ef9b0e 100644 --- a/Test/VariadicTest/output/c1416dfae155d6e2.deps.json +++ b/Test/VariadicTest/output/c1416dfae155d6e2.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "stdarg": "71e0a3ffcb3ebfad", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperlib": "c3b259b4059f8668", "viperio": "c9f4be41ca1cc2b4", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/VariadicTest/temp/dd3002730623424b.pyi b/Test/VariadicTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/VariadicTest/temp/dd3002730623424b.pyi rename to Test/VariadicTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/VariadicTest/temp/9474791561654346.pyi b/Test/VariadicTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/VariadicTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/VariadicTest/temp/_phase1_manifest.json b/Test/VariadicTest/temp/_phase1_manifest.json index 40d86de..0aef1cb 100644 --- a/Test/VariadicTest/temp/_phase1_manifest.json +++ b/Test/VariadicTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\VariadicTest\\App\\main.py": {"sha1": "c1416dfae155d6e2", "mtime": 1782266230.8679473, "size": 6842}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\VariadicTest\\App\\main.py": {"sha1": "c1416dfae155d6e2", "mtime": 1782266230.8679473, "size": 6842}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdarg.py": {"sha1": "71e0a3ffcb3ebfad", "mtime": 1781258888.113146, "size": 277}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperlib.py": {"sha1": "c3b259b4059f8668", "mtime": 1782821991.979496, "size": 56772}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/Test/VariadicTest/temp/_sha1_map.txt b/Test/VariadicTest/temp/_sha1_map.txt index ac17918..cfc6252 100644 --- a/Test/VariadicTest/temp/_sha1_map.txt +++ b/Test/VariadicTest/temp/_sha1_map.txt @@ -1,10 +1,10 @@ +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 71e0a3ffcb3ebfad:includes/stdarg.py 7e529fe7a078cfef:includes/w32\win32base.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py c1416dfae155d6e2:main.py c3b259b4059f8668:includes/viperlib.py c9f4be41ca1cc2b4:includes/viperio.py -dd3002730623424b:includes/testcheck.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/VariadicTest/temp/ab6e54ba9a669f76.pyi b/Test/VariadicTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/VariadicTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/WebTest/output/8046d45456d0b153.deps.json b/Test/WebTest/output/8046d45456d0b153.deps.json index 726d6b5..7550264 100644 --- a/Test/WebTest/output/8046d45456d0b153.deps.json +++ b/Test/WebTest/output/8046d45456d0b153.deps.json @@ -1 +1 @@ -{"atom": "271ea3decb810db2", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "ab6e54ba9a669f76", "requests": "b558d8d8f01f4825", "viperio": "c9f4be41ca1cc2b4", "socket": "d7e3386b828acb66", "memhub": "ee084e9fc6ee413a", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"atom": "271ea3decb810db2", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "platmacro": "93c1d18e35d188d6", "string": "9474791561654346", "requests": "b558d8d8f01f4825", "viperio": "c9f4be41ca1cc2b4", "socket": "d7e3386b828acb66", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/WebTest/temp/9474791561654346.pyi b/Test/WebTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/WebTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/WebTest/temp/_phase1_manifest.json b/Test/WebTest/temp/_phase1_manifest.json index 00cb85b..2cb35c3 100644 --- a/Test/WebTest/temp/_phase1_manifest.json +++ b/Test/WebTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\WebTest\\App\\main.py": {"sha1": "8046d45456d0b153", "mtime": 1783055933.4493492, "size": 2570}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "ee084e9fc6ee413a", "mtime": 1784214242.4485993, "size": 17765}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\platmacro.py": {"sha1": "93c1d18e35d188d6", "mtime": 1781237231.03366, "size": 1422}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\requests.py": {"sha1": "b558d8d8f01f4825", "mtime": 1783055330.1315396, "size": 9850}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\socket.py": {"sha1": "d7e3386b828acb66", "mtime": 1783054980.3909142, "size": 14514}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\winsock2.py": {"sha1": "6446627d4f07a1b5", "mtime": 1783052668.8022628, "size": 3547}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\WebTest\\App\\main.py": {"sha1": "8046d45456d0b153", "mtime": 1783055933.4493492, "size": 2570}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\platmacro.py": {"sha1": "93c1d18e35d188d6", "mtime": 1781237231.03366, "size": 1422}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\requests.py": {"sha1": "b558d8d8f01f4825", "mtime": 1783055330.1315396, "size": 9850}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\socket.py": {"sha1": "d7e3386b828acb66", "mtime": 1783054980.3909142, "size": 14514}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\winsock2.py": {"sha1": "6446627d4f07a1b5", "mtime": 1783052668.8022628, "size": 3547}} \ No newline at end of file diff --git a/Test/WebTest/temp/_sha1_map.txt b/Test/WebTest/temp/_sha1_map.txt index 0da1ad9..36ee9d5 100644 --- a/Test/WebTest/temp/_sha1_map.txt +++ b/Test/WebTest/temp/_sha1_map.txt @@ -5,9 +5,9 @@ 8046d45456d0b153:main.py 90c53dd6db8d41cf:includes/stdlib.py 93c1d18e35d188d6:includes/platmacro.py -ab6e54ba9a669f76:includes/string.py +9474791561654346:includes/string.py b558d8d8f01f4825:includes/requests.py c9f4be41ca1cc2b4:includes/viperio.py d7e3386b828acb66:includes/socket.py -ee084e9fc6ee413a:includes/memhub.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/WebTest/temp/ab6e54ba9a669f76.pyi b/Test/WebTest/temp/ab6e54ba9a669f76.pyi deleted file mode 100644 index 4fc3440..0000000 --- a/Test/WebTest/temp/ab6e54ba9a669f76.pyi +++ /dev/null @@ -1,48 +0,0 @@ -""" -Auto-generated Python stub file from string.py -Module: string -""" - - -from stdint import * -import t, c - -def strcpy(dest: str, src: str) -> str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/Test/WebTest/temp/ee084e9fc6ee413a.pyi b/Test/WebTest/temp/ee084e9fc6ee413a.pyi deleted file mode 100644 index 45551ef..0000000 --- a/Test/WebTest/temp/ee084e9fc6ee413a.pyi +++ /dev/null @@ -1,81 +0,0 @@ -""" -Auto-generated Python stub file from memhub.py -Module: memhub -""" - - -import t, c -from stdint import * -import string -import atom -import viperio - -MEMHUB_ALIGN: t.CDefine = 8 -MEMSLAB_MIN_BLOCK: t.CDefine = 16 -MEMSLAB_BITMAP_BYTES: t.CDefine = 256 -MEMBUDDY_MIN_BLOCK: t.CDefine = 32 -MEMBUDDY_MAX_ORDERS: t.CDefine = 32 -MEMBUDDY_HEADER_SIZE: t.CDefine = 8 - -def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass - -def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass - -def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass - - -@t.CVTable -class MemManager: - __provides__: list[str] = ['__memmgr__'] - base: t.CVoid | t.CPtr - size: t.CSizeT - def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemManager) -> t.CInt: pass - def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass - def __exit__(self: MemManager) -> t.CInt: pass - def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass -class MemPool(MemManager): - offset: t.CSizeT - high_water: t.CSizeT - def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemPool) -> t.CInt: pass -class MemSlab(MemManager): - block_size: t.CSizeT - block_count: t.CSizeT - used_count: t.CSizeT - free_list: t.CVoid | t.CPtr - alloc_map: t.CUInt8T | t.CPtr - alloc_map_size: t.CSizeT - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass - def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemSlab) -> t.CInt: pass -class MemBuddy(MemManager): - max_order: t.CInt - free_lists: t.CUInt64T | t.CPtr - lock_val: t.CVolatile | t.CInt - usable: t.CVoid | t.CPtr - usable_size: t.CSizeT - def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass - def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass - def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass - def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass - def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass - def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass - def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass - def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def _lock(self: MemBuddy) -> t.CInt: pass - def _unlock(self: MemBuddy) -> t.CInt: pass - def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass - def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass - def reset(self: MemBuddy) -> t.CInt: pass - def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass \ No newline at end of file diff --git a/Test/WebTest/temp/f3560b99de458aec.pyi b/Test/WebTest/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/Test/WebTest/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/Test/ZlibTest/output/03b24bc1d9327958.deps.json b/Test/ZlibTest/output/03b24bc1d9327958.deps.json index 9462b24..3518b45 100644 --- a/Test/ZlibTest/output/03b24bc1d9327958.deps.json +++ b/Test/ZlibTest/output/03b24bc1d9327958.deps.json @@ -1 +1 @@ -{"__zlib.pyzlib": "0f8134f67bdaba8f", "pyzlib": "0f8134f67bdaba8f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "__zlib.zdeflate": "784dde8a8697b7ab", "zdeflate": "784dde8a8697b7ab", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "__zlib.zdef": "9b7d2adaae94f021", "zdef": "9b7d2adaae94f021", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.zchecksum": "cb151b297f4ea56d", "zchecksum": "cb151b297f4ea56d", "__zlib.test_pyzlib": "d855b3e66d1d6522", "test_pyzlib": "d855b3e66d1d6522", "__zlib.zhuff": "dd19090b337e9bea", "zhuff": "dd19090b337e9bea", "testcheck": "dd3002730623424b", "__zlib.zinflate": "e445a2bb299d1b7d", "zinflate": "e445a2bb299d1b7d", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"__zlib.pyzlib": "0f8134f67bdaba8f", "pyzlib": "0f8134f67bdaba8f", "testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "__zlib.zdeflate": "784dde8a8697b7ab", "zdeflate": "784dde8a8697b7ab", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "__zlib.zdef": "9b7d2adaae94f021", "zdef": "9b7d2adaae94f021", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.zchecksum": "cb151b297f4ea56d", "zchecksum": "cb151b297f4ea56d", "__zlib.test_pyzlib": "d855b3e66d1d6522", "test_pyzlib": "d855b3e66d1d6522", "__zlib.zhuff": "dd19090b337e9bea", "zhuff": "dd19090b337e9bea", "__zlib.zinflate": "e445a2bb299d1b7d", "zinflate": "e445a2bb299d1b7d", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ZlibTest/output/0f8134f67bdaba8f.deps.json b/Test/ZlibTest/output/0f8134f67bdaba8f.deps.json new file mode 100644 index 0000000..518cf08 --- /dev/null +++ b/Test/ZlibTest/output/0f8134f67bdaba8f.deps.json @@ -0,0 +1 @@ +{"main": "03b24bc1d9327958", "testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "__zlib.zdeflate": "784dde8a8697b7ab", "zdeflate": "784dde8a8697b7ab", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "__zlib.zdef": "9b7d2adaae94f021", "zdef": "9b7d2adaae94f021", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.zchecksum": "cb151b297f4ea56d", "zchecksum": "cb151b297f4ea56d", "__zlib.test_pyzlib": "d855b3e66d1d6522", "test_pyzlib": "d855b3e66d1d6522", "__zlib.zhuff": "dd19090b337e9bea", "zhuff": "dd19090b337e9bea", "__zlib.zinflate": "e445a2bb299d1b7d", "zinflate": "e445a2bb299d1b7d", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ZlibTest/output/784dde8a8697b7ab.deps.json b/Test/ZlibTest/output/784dde8a8697b7ab.deps.json index f610c22..91fb90a 100644 --- a/Test/ZlibTest/output/784dde8a8697b7ab.deps.json +++ b/Test/ZlibTest/output/784dde8a8697b7ab.deps.json @@ -1 +1 @@ -{"main": "03b24bc1d9327958", "__zlib.pyzlib": "0f8134f67bdaba8f", "pyzlib": "0f8134f67bdaba8f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "__zlib.zdef": "9b7d2adaae94f021", "zdef": "9b7d2adaae94f021", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.zchecksum": "cb151b297f4ea56d", "zchecksum": "cb151b297f4ea56d", "__zlib.test_pyzlib": "d855b3e66d1d6522", "test_pyzlib": "d855b3e66d1d6522", "__zlib.zhuff": "dd19090b337e9bea", "zhuff": "dd19090b337e9bea", "testcheck": "dd3002730623424b", "__zlib.zinflate": "e445a2bb299d1b7d", "zinflate": "e445a2bb299d1b7d", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"main": "03b24bc1d9327958", "__zlib.pyzlib": "0f8134f67bdaba8f", "pyzlib": "0f8134f67bdaba8f", "testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "__zlib.zdef": "9b7d2adaae94f021", "zdef": "9b7d2adaae94f021", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.zchecksum": "cb151b297f4ea56d", "zchecksum": "cb151b297f4ea56d", "__zlib.test_pyzlib": "d855b3e66d1d6522", "test_pyzlib": "d855b3e66d1d6522", "__zlib.zhuff": "dd19090b337e9bea", "zhuff": "dd19090b337e9bea", "__zlib.zinflate": "e445a2bb299d1b7d", "zinflate": "e445a2bb299d1b7d", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ZlibTest/output/9b7d2adaae94f021.deps.json b/Test/ZlibTest/output/9b7d2adaae94f021.deps.json index 1bf85b0..696e3b5 100644 --- a/Test/ZlibTest/output/9b7d2adaae94f021.deps.json +++ b/Test/ZlibTest/output/9b7d2adaae94f021.deps.json @@ -1 +1 @@ -{"main": "03b24bc1d9327958", "__zlib.pyzlib": "0f8134f67bdaba8f", "pyzlib": "0f8134f67bdaba8f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "__zlib.zdeflate": "784dde8a8697b7ab", "zdeflate": "784dde8a8697b7ab", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.zchecksum": "cb151b297f4ea56d", "zchecksum": "cb151b297f4ea56d", "__zlib.test_pyzlib": "d855b3e66d1d6522", "test_pyzlib": "d855b3e66d1d6522", "__zlib.zhuff": "dd19090b337e9bea", "zhuff": "dd19090b337e9bea", "testcheck": "dd3002730623424b", "__zlib.zinflate": "e445a2bb299d1b7d", "zinflate": "e445a2bb299d1b7d", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"main": "03b24bc1d9327958", "__zlib.pyzlib": "0f8134f67bdaba8f", "pyzlib": "0f8134f67bdaba8f", "testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "__zlib.zdeflate": "784dde8a8697b7ab", "zdeflate": "784dde8a8697b7ab", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.zchecksum": "cb151b297f4ea56d", "zchecksum": "cb151b297f4ea56d", "__zlib.test_pyzlib": "d855b3e66d1d6522", "test_pyzlib": "d855b3e66d1d6522", "__zlib.zhuff": "dd19090b337e9bea", "zhuff": "dd19090b337e9bea", "__zlib.zinflate": "e445a2bb299d1b7d", "zinflate": "e445a2bb299d1b7d", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ZlibTest/output/cb151b297f4ea56d.deps.json b/Test/ZlibTest/output/cb151b297f4ea56d.deps.json index 1ea42be..502a389 100644 --- a/Test/ZlibTest/output/cb151b297f4ea56d.deps.json +++ b/Test/ZlibTest/output/cb151b297f4ea56d.deps.json @@ -1 +1 @@ -{"main": "03b24bc1d9327958", "__zlib.pyzlib": "0f8134f67bdaba8f", "pyzlib": "0f8134f67bdaba8f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "__zlib.zdeflate": "784dde8a8697b7ab", "zdeflate": "784dde8a8697b7ab", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "__zlib.zdef": "9b7d2adaae94f021", "zdef": "9b7d2adaae94f021", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.test_pyzlib": "d855b3e66d1d6522", "test_pyzlib": "d855b3e66d1d6522", "__zlib.zhuff": "dd19090b337e9bea", "zhuff": "dd19090b337e9bea", "testcheck": "dd3002730623424b", "__zlib.zinflate": "e445a2bb299d1b7d", "zinflate": "e445a2bb299d1b7d", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"main": "03b24bc1d9327958", "__zlib.pyzlib": "0f8134f67bdaba8f", "pyzlib": "0f8134f67bdaba8f", "testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "__zlib.zdeflate": "784dde8a8697b7ab", "zdeflate": "784dde8a8697b7ab", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "__zlib.zdef": "9b7d2adaae94f021", "zdef": "9b7d2adaae94f021", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.test_pyzlib": "d855b3e66d1d6522", "test_pyzlib": "d855b3e66d1d6522", "__zlib.zhuff": "dd19090b337e9bea", "zhuff": "dd19090b337e9bea", "__zlib.zinflate": "e445a2bb299d1b7d", "zinflate": "e445a2bb299d1b7d", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ZlibTest/output/d855b3e66d1d6522.deps.json b/Test/ZlibTest/output/d855b3e66d1d6522.deps.json index 3ea635f..0147545 100644 --- a/Test/ZlibTest/output/d855b3e66d1d6522.deps.json +++ b/Test/ZlibTest/output/d855b3e66d1d6522.deps.json @@ -1 +1 @@ -{"main": "03b24bc1d9327958", "__zlib.pyzlib": "0f8134f67bdaba8f", "pyzlib": "0f8134f67bdaba8f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "__zlib.zdeflate": "784dde8a8697b7ab", "zdeflate": "784dde8a8697b7ab", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "__zlib.zdef": "9b7d2adaae94f021", "zdef": "9b7d2adaae94f021", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.zchecksum": "cb151b297f4ea56d", "zchecksum": "cb151b297f4ea56d", "__zlib.zhuff": "dd19090b337e9bea", "zhuff": "dd19090b337e9bea", "testcheck": "dd3002730623424b", "__zlib.zinflate": "e445a2bb299d1b7d", "zinflate": "e445a2bb299d1b7d", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"main": "03b24bc1d9327958", "__zlib.pyzlib": "0f8134f67bdaba8f", "pyzlib": "0f8134f67bdaba8f", "testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "__zlib.zdeflate": "784dde8a8697b7ab", "zdeflate": "784dde8a8697b7ab", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "__zlib.zdef": "9b7d2adaae94f021", "zdef": "9b7d2adaae94f021", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.zchecksum": "cb151b297f4ea56d", "zchecksum": "cb151b297f4ea56d", "__zlib.zhuff": "dd19090b337e9bea", "zhuff": "dd19090b337e9bea", "__zlib.zinflate": "e445a2bb299d1b7d", "zinflate": "e445a2bb299d1b7d", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ZlibTest/output/dd19090b337e9bea.deps.json b/Test/ZlibTest/output/dd19090b337e9bea.deps.json index 257d8e6..7e37fd6 100644 --- a/Test/ZlibTest/output/dd19090b337e9bea.deps.json +++ b/Test/ZlibTest/output/dd19090b337e9bea.deps.json @@ -1 +1 @@ -{"main": "03b24bc1d9327958", "__zlib.pyzlib": "0f8134f67bdaba8f", "pyzlib": "0f8134f67bdaba8f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "__zlib.zdeflate": "784dde8a8697b7ab", "zdeflate": "784dde8a8697b7ab", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "__zlib.zdef": "9b7d2adaae94f021", "zdef": "9b7d2adaae94f021", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.zchecksum": "cb151b297f4ea56d", "zchecksum": "cb151b297f4ea56d", "__zlib.test_pyzlib": "d855b3e66d1d6522", "test_pyzlib": "d855b3e66d1d6522", "testcheck": "dd3002730623424b", "__zlib.zinflate": "e445a2bb299d1b7d", "zinflate": "e445a2bb299d1b7d", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"main": "03b24bc1d9327958", "__zlib.pyzlib": "0f8134f67bdaba8f", "pyzlib": "0f8134f67bdaba8f", "testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "__zlib.zdeflate": "784dde8a8697b7ab", "zdeflate": "784dde8a8697b7ab", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "__zlib.zdef": "9b7d2adaae94f021", "zdef": "9b7d2adaae94f021", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.zchecksum": "cb151b297f4ea56d", "zchecksum": "cb151b297f4ea56d", "__zlib.test_pyzlib": "d855b3e66d1d6522", "test_pyzlib": "d855b3e66d1d6522", "__zlib.zinflate": "e445a2bb299d1b7d", "zinflate": "e445a2bb299d1b7d", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ZlibTest/output/e445a2bb299d1b7d.deps.json b/Test/ZlibTest/output/e445a2bb299d1b7d.deps.json index 66cf6da..79d0f4c 100644 --- a/Test/ZlibTest/output/e445a2bb299d1b7d.deps.json +++ b/Test/ZlibTest/output/e445a2bb299d1b7d.deps.json @@ -1 +1 @@ -{"main": "03b24bc1d9327958", "__zlib.pyzlib": "0f8134f67bdaba8f", "pyzlib": "0f8134f67bdaba8f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "__zlib.zdeflate": "784dde8a8697b7ab", "zdeflate": "784dde8a8697b7ab", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "__zlib.zdef": "9b7d2adaae94f021", "zdef": "9b7d2adaae94f021", "string": "ab6e54ba9a669f76", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.zchecksum": "cb151b297f4ea56d", "zchecksum": "cb151b297f4ea56d", "__zlib.test_pyzlib": "d855b3e66d1d6522", "test_pyzlib": "d855b3e66d1d6522", "__zlib.zhuff": "dd19090b337e9bea", "zhuff": "dd19090b337e9bea", "testcheck": "dd3002730623424b", "stdint": "f5522571bcce7bcb"} \ No newline at end of file +{"main": "03b24bc1d9327958", "__zlib.pyzlib": "0f8134f67bdaba8f", "pyzlib": "0f8134f67bdaba8f", "testcheck": "14d33679f7fadf1f", "stdio": "6f62fe05c5ea1ceb", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "__zlib.zdeflate": "784dde8a8697b7ab", "zdeflate": "784dde8a8697b7ab", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "__zlib.zdef": "9b7d2adaae94f021", "zdef": "9b7d2adaae94f021", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "__zlib.zchecksum": "cb151b297f4ea56d", "zchecksum": "cb151b297f4ea56d", "__zlib.test_pyzlib": "d855b3e66d1d6522", "test_pyzlib": "d855b3e66d1d6522", "__zlib.zhuff": "dd19090b337e9bea", "zhuff": "dd19090b337e9bea", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/Test/ZlibTest/temp/dd3002730623424b.pyi b/Test/ZlibTest/temp/14d33679f7fadf1f.pyi similarity index 100% rename from Test/ZlibTest/temp/dd3002730623424b.pyi rename to Test/ZlibTest/temp/14d33679f7fadf1f.pyi diff --git a/Test/ZlibTest/temp/9474791561654346.pyi b/Test/ZlibTest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/Test/ZlibTest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/Test/ZlibTest/temp/_phase1_manifest.json b/Test/ZlibTest/temp/_phase1_manifest.json index d47877d..01c0966 100644 --- a/Test/ZlibTest/temp/_phase1_manifest.json +++ b/Test/ZlibTest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\__zlib\\pyzlib.py": {"sha1": "0f8134f67bdaba8f", "mtime": 1782266233.8661451, "size": 20930}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\__zlib\\test_pyzlib.py": {"sha1": "d855b3e66d1d6522", "mtime": 1782407614.5315387, "size": 36204}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\__zlib\\zchecksum.py": {"sha1": "cb151b297f4ea56d", "mtime": 1782266234.306909, "size": 4068}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\__zlib\\zdef.py": {"sha1": "9b7d2adaae94f021", "mtime": 1782393175.830038, "size": 8195}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\__zlib\\zdeflate.py": {"sha1": "784dde8a8697b7ab", "mtime": 1782396643.2488594, "size": 18977}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\__zlib\\zhuff.py": {"sha1": "dd19090b337e9bea", "mtime": 1782388678.1362753, "size": 13596}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\__zlib\\zinflate.py": {"sha1": "e445a2bb299d1b7d", "mtime": 1782266257.0389085, "size": 18067}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\main.py": {"sha1": "03b24bc1d9327958", "mtime": 1782110043.5860827, "size": 484}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "ab6e54ba9a669f76", "mtime": 1783933178.7264287, "size": 9922}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "dd3002730623424b", "mtime": 1783927513.1159866, "size": 1818}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\__zlib\\pyzlib.py": {"sha1": "0f8134f67bdaba8f", "mtime": 1782266233.8661451, "size": 20930}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\__zlib\\test_pyzlib.py": {"sha1": "d855b3e66d1d6522", "mtime": 1782407614.5315387, "size": 36204}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\__zlib\\zchecksum.py": {"sha1": "cb151b297f4ea56d", "mtime": 1782266234.306909, "size": 4068}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\__zlib\\zdef.py": {"sha1": "9b7d2adaae94f021", "mtime": 1782393175.830038, "size": 8195}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\__zlib\\zdeflate.py": {"sha1": "784dde8a8697b7ab", "mtime": 1782396643.2488594, "size": 18977}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\__zlib\\zhuff.py": {"sha1": "dd19090b337e9bea", "mtime": 1782388678.1362753, "size": 13596}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\__zlib\\zinflate.py": {"sha1": "e445a2bb299d1b7d", "mtime": 1782266257.0389085, "size": 18067}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\Test\\ZlibTest\\App\\main.py": {"sha1": "03b24bc1d9327958", "mtime": 1782110043.5860827, "size": 484}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\testcheck.py": {"sha1": "14d33679f7fadf1f", "mtime": 1784375629.8057406, "size": 1979}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32memory.py": {"sha1": "72e2d5ccb7cedcf1", "mtime": 1781200703.5389092, "size": 3142}} \ No newline at end of file diff --git a/Test/ZlibTest/temp/_sha1_map.txt b/Test/ZlibTest/temp/_sha1_map.txt index 161bc24..db8e459 100644 --- a/Test/ZlibTest/temp/_sha1_map.txt +++ b/Test/ZlibTest/temp/_sha1_map.txt @@ -1,16 +1,16 @@ 03b24bc1d9327958:main.py 0f8134f67bdaba8f:__zlib\pyzlib.py +14d33679f7fadf1f:includes/testcheck.py 6f62fe05c5ea1ceb:includes/stdio.py 72e2d5ccb7cedcf1:includes/w32\win32memory.py 784dde8a8697b7ab:__zlib\zdeflate.py 7e529fe7a078cfef:includes/w32\win32base.py 90c53dd6db8d41cf:includes/stdlib.py +9474791561654346:includes/string.py 9b7d2adaae94f021:__zlib\zdef.py -ab6e54ba9a669f76:includes/string.py bbdf3bbd4c3bc28c:includes/w32\win32console.py cb151b297f4ea56d:__zlib\zchecksum.py d855b3e66d1d6522:__zlib\test_pyzlib.py dd19090b337e9bea:__zlib\zhuff.py -dd3002730623424b:includes/testcheck.py e445a2bb299d1b7d:__zlib\zinflate.py f5522571bcce7bcb:includes/stdint.py diff --git a/Test/ZlibTest/temp/_shared_sym.json b/Test/ZlibTest/temp/_shared_sym.json index 6c9b31902ca8710cb134d39f7b6430ad46a075eb..60e47aa4423f044b8ac0c5c14585d5d9d42464b6 100644 GIT binary patch literal 436960 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%0DJaa()?;^TSYWabK#*Ar*smK=d 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

D^16qqKfZ;J0xWNw)8xFkZAIS03 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 str: pass - -def strcat(dest: str, src: str) -> str: pass - -def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass - -def strlen(src: str) -> t.CSizeT | t.CExport: pass - -def strcmp(str1: str, str2: str) -> t.CInt: pass - -def samestr(str1: str, str2: str) -> bool: pass - -def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass - -def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass - -def strchr(s: str, cr: t.CInt) -> str: pass - -def strrchr(s: str, cr: t.CInt) -> str: pass - -def strstr(s: str, needle: str) -> str: pass - -def strspn(s: str, skip: str) -> int: pass - -def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass - -def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass - -def atoi(src: str) -> t.CInt: pass - -def atoll(src: str) -> t.CInt64T: pass - -def atof(src: str) -> t.CDouble: pass - -def split(s: str, delim: str, result: t.CArray[str]) -> int: pass diff --git a/TransPyV/Test/temp/dd3002730623424b.deps.txt b/TransPyV/Test/temp/14d33679f7fadf1f.deps.txt similarity index 100% rename from TransPyV/Test/temp/dd3002730623424b.deps.txt rename to TransPyV/Test/temp/14d33679f7fadf1f.deps.txt diff --git a/TransPyV/Test/temp/bf9813f6e3c9d351.deps.txt b/TransPyV/Test/temp/285a822aa26bfbda.deps.txt similarity index 100% rename from TransPyV/Test/temp/bf9813f6e3c9d351.deps.txt rename to TransPyV/Test/temp/285a822aa26bfbda.deps.txt diff --git a/TransPyV/Test/temp/_sha1_map.txt b/TransPyV/Test/temp/_sha1_map.txt index cf1f690..c019a14 100644 --- a/TransPyV/Test/temp/_sha1_map.txt +++ b/TransPyV/Test/temp/_sha1_map.txt @@ -2,12 +2,12 @@ 57288496f7c2d1ad:includes/json/__init__.py 240a9a4157959a9f:includes/json/__parser.py 20cd49775c100a38:includes/json/__writer.py -ee084e9fc6ee413a:includes/memhub.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py 6f62fe05c5ea1ceb:includes/stdio.py 90c53dd6db8d41cf:includes/stdlib.py ab6e54ba9a669f76:includes/string.py -dd3002730623424b:includes/testcheck.py +14d33679f7fadf1f:includes/testcheck.py c9f4be41ca1cc2b4:includes/viperio.py 7e529fe7a078cfef:includes/w32/win32base.py bbdf3bbd4c3bc28c:includes/w32/win32console.py diff --git a/TransPyV/Test/temp/ee084e9fc6ee413a.deps.txt b/TransPyV/Test/temp/f3560b99de458aec.deps.txt similarity index 100% rename from TransPyV/Test/temp/ee084e9fc6ee413a.deps.txt rename to TransPyV/Test/temp/f3560b99de458aec.deps.txt diff --git a/TransPyV/temp/_shared_sym.json b/TransPyV/temp/_shared_sym.json index 5ecd8587bf0bae7548c2c0df0f4e423f672f3630..2fe9920d2fbcce2cec36a0064842a04303438a38 100644 GIT binary patch delta 1378 zcma)*Ur1AN6vub3&1KHi-EDSKE3Z1I=E_YCiHNYMl=Y8_igIpqlDFxVITMP?=m%-c zK)7&v5qhhaDA>#%L?Tj4UxIutC?cXFDxyN9erJm;wb{eDzu!5(&-a|)pL3`C`h;n2 zJxpLCOJU2Ho~1GaTh7wh3YN}{EQ76NnJkNCGZT}TnOT^X<*-#Tc#(}cCU6Qb@tzr6 z!Yh1dhN{%pQ9-Bl<53F~rTf*k4sR%+DQ}{9$O4t(+bH&0ph|on#Zf*QJ`nt=2OU-@ z#M_gQE`E$+sTEw}=O{K>x#CL{2lyy_#d@ms9naA)gLh24)-1{0m?wb^vm{6reqfHo zMM4bgCDN$pZNs zeqU-Wt=|0~k}FRF=mz#mP9 zyC$GSK1Pb*;)=v=;J^epgyVRB0<8MP-4vL?AvKcn>0qLkha4B?Jpza9rTO-~|K5ZP zgO9)te&Y6bCb)X;oUB(G_z=Li*-&!%`V??m%`KN(9=CjMYq+iDwr=?PRKZ}k5pVKe Xd2<^7-0Z^Lb#ne+k>OCC>=S+hr!lqV delta 1340 zcma)*T}V_>5XZgO%=}8-ySqB+)_M)Ub@L-ri;$E`$wVX~!nW(WlG|=8yPD8L8k{s^ zrHBjj5JGSHP`>O{A54fyGkp>AHG@Jb$|55yB6w8USrSXu;B_M2F~UCK4K5@? zsj!GPZEa8ORY={P@uT<>C)NW*T9?xa!AqMz9D!(V&B3;TP8EphOfj?AAeHWVpr) zjCSK=2>|DGAc+wgE)o%`VT#0kl!grw6pJw$_L7g&a9rXo#cTM9`>`iRxbo1_;H4h2 ze6g(_x69h*YIl1&yy}HopQJdQ?k=mhL-AN!`MO!LT~zIO*9e(HE|xuo7L(->@1e9W zP{2`V3k!4PQA8q>k1wYo2`lxWvy@O^bsgu6Z0>Axw%9$YFWlvBQGKG#srn*1Jjx|6 z-@~eh47rq&_TE@m`~XGD$dr?*z+2OhCm*79T}Y01k}V%5?($Y#dV$lew5X0sqVM;I z*qsA*pBWWBm@*ZwOLZKflQ{X#J&o_u5SsZAlr17GGco+A7X7L)+xxBn+RF{ z16el{9G>D2)JmN1+U8Q5xHKG=AVyXQ9tjE8K7$O%+4UsWVmE0`+2C1y71^@s6 diff --git a/debug_dict_full.txt b/debug_dict_full.txt new file mode 100644 index 0000000..08af040 --- /dev/null +++ b/debug_dict_full.txt @@ -0,0 +1,83 @@ +├ INFO: 读取配置文件: Test/DictTest/project.json +├ INFO: 项目目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest +├ INFO: 源目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\App +├ INFO: 临时目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\temp +├ INFO: 输出目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\output +├ INFO: 阶段: all +├ INFO: 编译器: llc -filetype=obj -relocation-model=pic +├ INFO: 目标三元组: x86_64-pc-windows-gnu +├ INFO: 数据布局: e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128 +├ INFO: output: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\output +├ INFO: temp: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\temp +├ INFO: 清理完成 +├ INFO: 已清除全局缓存: D:\Users\TermiNexus\Desktop\TransPyC\.transpyc_cache +├ INFO: 找到 1 个可达源文件(从入口遍历) +├ INFO: [1/1] 生成签名: main.py +├ INFO: -> b3c2b99b6f3be4c7.pyi (签名) +├ INFO: 处理 14 个被引用的 Python 库文件 +├ INFO: 生成签名: _dict.py -> e3e7b6de8d7d8b03.pyi +├ INFO: 生成签名: atom.py -> 271ea3decb810db2.pyi +├ INFO: 生成签名: json\__init__.py -> 57288496f7c2d1ad.pyi +├ INFO: 生成签名: json\__parser.py -> 240a9a4157959a9f.pyi +├ INFO: 生成签名: json\__writer.py -> 20cd49775c100a38.pyi +├ INFO: 生成签名: memhub.py -> f3560b99de458aec.pyi +├ INFO: 生成签名: stdint.py -> f5522571bcce7bcb.pyi +├ INFO: 生成签名: stdio.py -> 6f62fe05c5ea1ceb.pyi +├ INFO: 生成签名: stdlib.py -> 90c53dd6db8d41cf.pyi +├ INFO: 生成签名: string.py -> 9474791561654346.pyi +├ INFO: 生成签名: testcheck.py -> 14d33679f7fadf1f.pyi +├ INFO: 生成签名: viperio.py -> c9f4be41ca1cc2b4.pyi +├ INFO: 生成签名: w32\win32base.py -> 7e529fe7a078cfef.pyi +├ INFO: 生成签名: w32\win32console.py -> bbdf3bbd4c3bc28c.pyi +├ INFO: 结构体注册表: 24 个类型, 0 个枚举 +├ INFO: -> b3c2b99b6f3be4c7.stub.ll (声明) +├ INFO: 生成声明: _dict.py -> e3e7b6de8d7d8b03.stub.ll +├ INFO: 生成声明: atom.py -> 271ea3decb810db2.stub.ll +├ INFO: 生成声明: json\__init__.py -> 57288496f7c2d1ad.stub.ll +├ INFO: 生成声明: json\__parser.py -> 240a9a4157959a9f.stub.ll +├ INFO: 生成声明: json\__writer.py -> 20cd49775c100a38.stub.ll +├ INFO: 生成声明: memhub.py -> f3560b99de458aec.stub.ll +├ INFO: 生成声明: stdint.py -> f5522571bcce7bcb.stub.ll +├ INFO: 生成声明: stdio.py -> 6f62fe05c5ea1ceb.stub.ll +├ INFO: 生成声明: stdlib.py -> 90c53dd6db8d41cf.stub.ll +├ INFO: 生成声明: string.py -> 9474791561654346.stub.ll +├ INFO: 生成声明: testcheck.py -> 14d33679f7fadf1f.stub.ll +├ INFO: 生成声明: viperio.py -> c9f4be41ca1cc2b4.stub.ll +├ INFO: 生成声明: w32\win32base.py -> 7e529fe7a078cfef.stub.ll +├ INFO: 生成声明: w32\win32console.py -> bbdf3bbd4c3bc28c.stub.ll +├ SUCCESS: 声明接口生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\temp +├ INFO: SHA1 映射表 (15 个文件): +├ INFO: includes.binary: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\includes.binary (17 个文件) +├ INFO: 找到 1 个可达源文件(已按依赖排序) +├ INFO: 处理顺序: +├ INFO: 1. main.py +├ INFO: [缓存] 构建共享符号表数据... +├ INFO: [缓存] 共享符号表构建完成 (0.30s, 677 符号, 5 泛型模板, 1 doc 元数据) +├ INFO: +需要翻译 1 个文件 +[DEBUG find_func] FIRST lookup 'dict.__before_init__' already in self.functions +[DEBUG find_func] func.name='e3e7b6de8d7d8b03.dict.__before_init__' args=[< i8*>] +[DEBUG find_func] module_sha1='b3c2b99b6f3be4c7' + File "D:\Users\TermiNexus\Desktop\TransPyC\Projectrans.py", line 22, in + main() + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Config.py", line 266, in main + trans.run() + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Phase2Translator.py", line 467, in run + self._translate_file(src_path, out_path, prebuilt_ModuleSha1Map=msm) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Phase2Translator.py", line 1039, in _translate_file + result = trans.Convert( + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Shell\TransPyC.py", line 555, in Convert + code: str = self.translator.GenerateCCode(Tree, target='llvm') + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Translator\LlvmGenerator.py", line 642, in GenerateCCode + return self.GenerateLlvmDirect(Tree) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Translator\LlvmGenerator.py", line 132, in GenerateLlvmDirect + self.ImportHandler._EmitImportDeclarationsLlvm(Node, Gen) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesImports.py", line 103, in _EmitImportDeclarationsLlvm + self._EmitModuleDeclarationsLlvm(name, Gen, register_module_name=current_module) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesImports.py", line 636, in _EmitModuleDeclarationsLlvm + self._EmitExternalClassDeclLlvm(node, Gen, module_name=module_name) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesImports.py", line 1583, in _EmitExternalClassDeclLlvm + self._TryLoadStructFromStub(ClassName, Gen, source_sha1=source_sha1) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesImports.py", line 2009, in _TryLoadStructFromStub + self._TryLoadClassMembersFromPyi(class_name, stub_filename, Gen) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesImports.py", line 2058, in _TryLoadClassMembersFromPyi diff --git a/debug_dict_output.txt b/debug_dict_output.txt new file mode 100644 index 0000000..05ba769 --- /dev/null +++ b/debug_dict_output.txt @@ -0,0 +1 @@ +链接失败,立即终止编译。 diff --git a/full_log.txt b/full_log.txt new file mode 100644 index 0000000..05ba769 --- /dev/null +++ b/full_log.txt @@ -0,0 +1 @@ +链接失败,立即终止编译。 diff --git a/full_log2.txt b/full_log2.txt new file mode 100644 index 0000000..689edd5 --- /dev/null +++ b/full_log2.txt @@ -0,0 +1,378 @@ +├ INFO: 读取配置文件: Test/ZlibTest/project.json +├ INFO: 项目目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest +├ INFO: 源目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\App +├ INFO: 临时目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\temp +├ INFO: 输出目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output +├ INFO: 阶段: all +├ INFO: 编译器: llc -filetype=obj +├ INFO: 目标三元组: x86_64-pc-windows-gnu +├ INFO: 数据布局: e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128 +├ INFO: output: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output +├ INFO: temp: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\temp +├ INFO: 清理完成 +├ INFO: 已清除全局缓存: D:\Users\TermiNexus\Desktop\TransPyC\.transpyc_cache +├ INFO: 找到 8 个可达源文件(从入口遍历) +├ INFO: [1/8] 生成签名: __zlib\pyzlib.py +├ INFO: -> 0f8134f67bdaba8f.pyi (签名) +├ INFO: [2/8] 生成签名: __zlib\test_pyzlib.py +├ INFO: -> d855b3e66d1d6522.pyi (签名) +├ INFO: [3/8] 生成签名: __zlib\zchecksum.py +├ INFO: -> cb151b297f4ea56d.pyi (签名) +├ INFO: [4/8] 生成签名: __zlib\zdef.py +├ INFO: -> 9b7d2adaae94f021.pyi (签名) +├ INFO: [5/8] 生成签名: __zlib\zdeflate.py +├ INFO: -> 784dde8a8697b7ab.pyi (签名) +├ INFO: [6/8] 生成签名: __zlib\zhuff.py +├ INFO: -> dd19090b337e9bea.pyi (签名) +├ INFO: [7/8] 生成签名: __zlib\zinflate.py +├ INFO: -> e445a2bb299d1b7d.pyi (签名) +├ INFO: [8/8] 生成签名: main.py +├ INFO: -> 03b24bc1d9327958.pyi (签名) +├ INFO: 处理 8 个被引用的 Python 库文件 +├ INFO: 生成签名: stdint.py -> f5522571bcce7bcb.pyi +├ INFO: 生成签名: stdio.py -> 6f62fe05c5ea1ceb.pyi +├ INFO: 生成签名: stdlib.py -> 90c53dd6db8d41cf.pyi +├ INFO: 生成签名: string.py -> 9474791561654346.pyi +├ INFO: 生成签名: testcheck.py -> 14d33679f7fadf1f.pyi +├ INFO: 生成签名: w32\win32base.py -> 7e529fe7a078cfef.pyi +├ INFO: 生成签名: w32\win32console.py -> bbdf3bbd4c3bc28c.pyi +├ INFO: 生成签名: w32\win32memory.py -> 72e2d5ccb7cedcf1.pyi +├ INFO: 结构体注册表: 27 个类型, 0 个枚举 +├ INFO: -> 0f8134f67bdaba8f.stub.ll (声明) +├ INFO: -> d855b3e66d1d6522.stub.ll (声明) +├ INFO: -> cb151b297f4ea56d.stub.ll (声明) +├ INFO: -> 9b7d2adaae94f021.stub.ll (声明) +├ INFO: -> 784dde8a8697b7ab.stub.ll (声明) +├ INFO: -> dd19090b337e9bea.stub.ll (声明) +├ INFO: -> e445a2bb299d1b7d.stub.ll (声明) +├ INFO: -> 03b24bc1d9327958.stub.ll (声明) +├ INFO: 生成声明: stdint.py -> f5522571bcce7bcb.stub.ll +├ INFO: 生成声明: stdio.py -> 6f62fe05c5ea1ceb.stub.ll +├ INFO: 生成声明: stdlib.py -> 90c53dd6db8d41cf.stub.ll +├ INFO: 生成声明: string.py -> 9474791561654346.stub.ll +├ INFO: 生成声明: testcheck.py -> 14d33679f7fadf1f.stub.ll +├ INFO: 生成声明: w32\win32base.py -> 7e529fe7a078cfef.stub.ll +├ INFO: 生成声明: w32\win32console.py -> bbdf3bbd4c3bc28c.stub.ll +├ INFO: 生成声明: w32\win32memory.py -> 72e2d5ccb7cedcf1.stub.ll +├ SUCCESS: 声明接口生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\temp +├ INFO: SHA1 映射表 (16 个文件): +├ INFO: includes.binary: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\includes.binary (10 个文件) +├ INFO: 找到 8 个可达源文件(已按依赖排序) +├ INFO: 处理顺序: +├ INFO: 1. __zlib\pyzlib.py +├ INFO: 2. __zlib\test_pyzlib.py +├ INFO: 3. __zlib\zchecksum.py +├ INFO: 4. __zlib\zdef.py +├ INFO: 5. __zlib\zdeflate.py +├ INFO: 6. __zlib\zhuff.py +├ INFO: 7. __zlib\zinflate.py +├ INFO: 8. main.py +├ INFO: [缓存] 构建共享符号表数据... +├ INFO: [缓存] 共享符号表构建完成 (0.42s, 873 符号, 5 泛型模板, 8 doc 元数据) +├ INFO: +需要翻译 8 个文件 +├ INFO: 并行翻译 (workers=8) +├ INFO: 共享符号表已序列化 (423KB) +├ INFO: -> cb151b297f4ea56d.ll +├ INFO: [1/8] 完成: __zlib\zchecksum.py +[FATAL] 方法体编译失败 (.append_bytes): TypeError: Type of #1 arg mismatch: i8* != i8 +Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 32, in HandleBodyLlvm + self.Trans.IfHandler._HandleIfLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesIf.py", line 193, in _HandleIfLlvm + self.Trans.BodyHandler.HandleBodyLlvm(Node.body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 30, in HandleBodyLlvm + self.Trans.AnnAssignHandler._HandleAnnAssignLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 289, in _HandleAnnAssignLlvm + self._HandleAnnAssignLlvmInner(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 487, in _HandleAnnAssignLlvmInner + InitValue = self.HandleExprLlvm(Node.value, VarType=VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBase.py", line 526, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 277, in _HandleCallLlvm + return self._HandleTypedefCastLlvm(Node, FuncName) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 1619, in _HandleTypedefCastLlvm + ArgVal = self.HandleExprLlvm(Node.args[0]) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBase.py", line 526, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 255, in _HandleCallLlvm + result = self.Trans.ExprBuiltinHandle._HandleBuiltinCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprBuiltin.py", line 179, in _HandleBuiltinCallLlvm + return self._HandleReallocLlvm(Node.args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprBuiltin.py", line 723, in _HandleReallocLlvm + result: ir.Value = Gen.builder.call(realloc_func, [ptr_val, size_val], name="realloc_result") + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\builder.py", line 881, in call + inst = instructions.CallInstr(self.block, fn, args, name=name, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\instructions.py", line 105, in __init__ + raise TypeError(msg) +TypeError: Type of #1 arg mismatch: i8* != i8 +├ ERROR: __zlib\pyzlib.py: Type of #1 arg mismatch: i8* != i8 + 源代码 (D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\App\__zlib\pyzlib.py, line 387): + 387 | def append_bytes(buf: BYTE | t.CPtr[t.CPtr], length: t.CSizeT | t.CPtr, cap: t.CSizeT | t.CPtr, + Type of #1 arg mismatch: i8* != i8 + 源代码 (D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\App\__zlib\pyzlib.py, line 391): + 391 | if needed > c.Deref(cap): + Type of #1 arg mismatch: i8* != i8 + 源代码 (D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\App\__zlib\pyzlib.py, line 394): + 394 | new_buf: BYTEPTR = BYTEPTR(realloc(c.Deref(buf), new_cap)) + Type of #1 arg mismatch: i8* != i8 +Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Phase2Translator.py", line 1039, in _translate_file + result = trans.Convert( + ^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Shell\TransPyC.py", line 555, in Convert + code: str = self.translator.GenerateCCode(Tree, target='llvm') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Translator\LlvmGenerator.py", line 642, in GenerateCCode + return self.GenerateLlvmDirect(Tree) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Translator\LlvmGenerator.py", line 179, in GenerateLlvmDirect + self.FunctionHandler._EmitFunctionLlvm(Node, Gen) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 32, in HandleBodyLlvm + self.Trans.IfHandler._HandleIfLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesIf.py", line 193, in _HandleIfLlvm + self.Trans.BodyHandler.HandleBodyLlvm(Node.body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 30, in HandleBodyLlvm + self.Trans.AnnAssignHandler._HandleAnnAssignLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 289, in _HandleAnnAssignLlvm + self._HandleAnnAssignLlvmInner(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 487, in _HandleAnnAssignLlvmInner + InitValue = self.HandleExprLlvm(Node.value, VarType=VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBase.py", line 526, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 277, in _HandleCallLlvm + return self._HandleTypedefCastLlvm(Node, FuncName) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 1619, in _HandleTypedefCastLlvm + ArgVal = self.HandleExprLlvm(Node.args[0]) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBase.py", line 526, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 255, in _HandleCallLlvm + result = self.Trans.ExprBuiltinHandle._HandleBuiltinCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprBuiltin.py", line 179, in _HandleBuiltinCallLlvm + return self._HandleReallocLlvm(Node.args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprBuiltin.py", line 723, in _HandleReallocLlvm + result: ir.Value = Gen.builder.call(realloc_func, [ptr_val, size_val], name="realloc_result") + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\builder.py", line 881, in call + inst = instructions.CallInstr(self.block, fn, args, name=name, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\instructions.py", line 105, in __init__ + raise TypeError(msg) +TypeError: Type of #1 arg mismatch: i8* != i8 + +The above exception was the direct cause of the following exception: + +Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Phase2Translator.py", line 89, in _parallel_translate_worker + trans._translate_file(src_path, out_path, prebuilt_ModuleSha1Map=prebuilt_ModuleSha1Map) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Phase2Translator.py", line 1055, in _translate_file + raise type(e)(enriched) from e +TypeError: Type of #1 arg mismatch: i8* != i8 + 源代码 (D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\App\__zlib\pyzlib.py, line 387): + 387 | def append_bytes(buf: BYTE | t.CPtr[t.CPtr], length: t.CSizeT | t.CPtr, cap: t.CSizeT | t.CPtr, + Type of #1 arg mismatch: i8* != i8 + 源代码 (D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\App\__zlib\pyzlib.py, line 391): + 391 | if needed > c.Deref(cap): + Type of #1 arg mismatch: i8* != i8 + 源代码 (D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\App\__zlib\pyzlib.py, line 394): + 394 | new_buf: BYTEPTR = BYTEPTR(realloc(c.Deref(buf), new_cap)) + Type of #1 arg mismatch: i8* != i8 + +├ INFO: -> dd19090b337e9bea.ll +├ INFO: [3/8] 完成: __zlib\zhuff.py +├ INFO: -> 03b24bc1d9327958.ll +├ INFO: [4/8] 完成: main.py +├ INFO: -> d855b3e66d1d6522.ll +├ INFO: [5/8] 完成: __zlib\test_pyzlib.py +├ INFO: -> 784dde8a8697b7ab.ll +├ INFO: [6/8] 完成: __zlib\zdeflate.py +├ INFO: -> e445a2bb299d1b7d.ll +├ INFO: [7/8] 完成: __zlib\zinflate.py +├ INFO: -> 9b7d2adaae94f021.ll +├ INFO: [8/8] 完成: __zlib\zdef.py +├ ERROR: +1 个文件翻译失败,继续编译 includes +├ INFO: 翻译总耗时: 2.4s +├ INFO: +[阶段二完成] .ll 文件生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output +├ INFO: [includes] 发现 Python 源文件: stdio.py +├ INFO: [includes] 发现 Python 源文件: string.py +├ INFO: [includes] 发现 Python 包文件: w32\fileio.py +├ INFO: [includes] 发现 Python 包文件: w32\win32base.py +├ INFO: [includes] 发现 Python 包文件: w32\win32console.py +├ INFO: [includes] 发现 Python 包文件: w32\win32file.py +├ INFO: [includes] 发现 Python 包文件: w32\win32memory.py +├ INFO: [includes] 发现 Python 包文件: w32\win32process.py +├ INFO: [includes] 发现 Python 包文件: w32\win32sync.py +├ INFO: [includes] 发现 Python 包文件: w32\winsock2.py +├ INFO: [includes] 发现 Python 源文件: stdlib.py +├ INFO: [includes] 发现 Python 源文件: stdint.py +├ INFO: [includes] 发现 Python 源文件: testcheck.py +├ INFO: +[includes 编译] 找到 13 个 Python 源文件 +├ INFO: 跳过(声明文件): stdint.py +├ INFO: 跳过(声明文件): stdio.py +├ INFO: 跳过(声明文件): stdlib.py +├ INFO: 翻译 10 个文件 +├ INFO: -> 9474791561654346.ll +├ INFO: [1/10] 翻译完成: string.py +├ INFO: -> 7e529fe7a078cfef.ll +├ INFO: [2/10] 翻译完成: win32base.py +├ INFO: -> 06f53cc594b4ac6c.ll +├ INFO: [3/10] 翻译完成: win32sync.py +├ INFO: -> 6446627d4f07a1b5.ll +├ INFO: [4/10] 翻译完成: winsock2.py +├ INFO: -> f6b51804a0ba8ff0.ll +├ INFO: [5/10] 翻译完成: win32file.py +├ INFO: -> 067c78e9f121dce3.ll +├ INFO: [6/10] 翻译完成: win32process.py +├ INFO: -> bbdf3bbd4c3bc28c.ll +├ INFO: [7/10] 翻译完成: win32console.py +├ INFO: -> 72e2d5ccb7cedcf1.ll +├ INFO: [8/10] 翻译完成: win32memory.py +├ INFO: -> 0035c95a18d4f8e8.ll +├ INFO: [9/10] 翻译完成: fileio.py +├ INFO: -> 14d33679f7fadf1f.ll +├ INFO: [10/10] 翻译完成: testcheck.py +├ INFO: 编译 10 个 .ll 文件 +├ SUCCESS: [1/10] 编译成功: win32base.py +├ SUCCESS: [2/10] 编译成功: win32process.py +├ SUCCESS: [3/10] 编译成功: testcheck.py +├ SUCCESS: [4/10] 编译成功: win32console.py +├ SUCCESS: [5/10] 编译成功: win32file.py +├ SUCCESS: [6/10] 编译成功: win32memory.py +├ SUCCESS: [7/10] 编译成功: string.py +├ SUCCESS: [8/10] 编译成功: win32sync.py +├ SUCCESS: [9/10] 编译成功: winsock2.py +├ SUCCESS: [10/10] 编译成功: fileio.py +├ INFO: [清理] 删除 10 个过时文件 +├ INFO: +[编译] 找到 7 个 .ll 文件需要编译 +├ INFO: 并行编译 7 个文件 (workers=7) +├ SUCCESS: cb151b297f4ea56d.ll +├ SUCCESS: 03b24bc1d9327958.ll +├ SUCCESS: 784dde8a8697b7ab.ll +├ SUCCESS: dd19090b337e9bea.ll +├ SUCCESS: 9b7d2adaae94f021.ll +├ SUCCESS: e445a2bb299d1b7d.ll +├ SUCCESS: d855b3e66d1d6522.ll +├ INFO: +[链接] 找到 7 个 .obj 文件 +├ INFO: [链接] 额外库文件: 10 个 +├ INFO: - 9474791561654346.obj +├ INFO: - 7e529fe7a078cfef.obj +├ INFO: - bbdf3bbd4c3bc28c.obj +├ INFO: - 14d33679f7fadf1f.obj +├ INFO: - f6b51804a0ba8ff0.obj +├ INFO: - 0035c95a18d4f8e8.obj +├ INFO: - 72e2d5ccb7cedcf1.obj +├ INFO: - 067c78e9f121dce3.obj +├ INFO: - 06f53cc594b4ac6c.obj +├ INFO: - 6446627d4f07a1b5.obj +├ INFO: 执行: clang++ -Wl,--allow-multiple-definition -Wl,--unresolved-symbols=ignore-in-object-files -o D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\ZlibTest.exe D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\03b24bc1d9327958.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\784dde8a8697b7ab.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\9b7d2adaae94f021.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\cb151b297f4ea56d.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\dd19090b337e9bea.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\e445a2bb299d1b7d.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\9474791561654346.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\7e529fe7a078cfef.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\bbdf3bbd4c3bc28c.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\14d33679f7fadf1f.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\f6b51804a0ba8ff0.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\0035c95a18d4f8e8.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\72e2d5ccb7cedcf1.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\067c78e9f121dce3.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\06f53cc594b4ac6c.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\6446627d4f07a1b5.obj -lmsvcrt -lucrt -lpthread -lmingwex -lkernel32 -luser32 -latomic +├ ERROR: 链接失败: D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x216): undefined reference to `0f8134f67bdaba8f.runtime_version' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x2f6): undefined reference to `0f8134f67bdaba8f.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x3f4): undefined reference to `0f8134f67bdaba8f.decompress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x525): undefined reference to `0f8134f67bdaba8f.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x58c): undefined reference to `0f8134f67bdaba8f.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x5e9): undefined reference to `0f8134f67bdaba8f.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x646): undefined reference to `0f8134f67bdaba8f.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x74e): undefined reference to `0f8134f67bdaba8f.compressobj' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x79f): undefined reference to `0f8134f67bdaba8f.Compress.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x866): undefined reference to `0f8134f67bdaba8f.Compress.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x931): undefined reference to `0f8134f67bdaba8f.Compress.flush' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0xa2d): undefined reference to `0f8134f67bdaba8f.decompress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0xb2b): undefined reference to `0f8134f67bdaba8f.Compress.delete' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0xbb5): undefined reference to `0f8134f67bdaba8f.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0xbdc): undefined reference to `0f8134f67bdaba8f.decompressobj' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0xc50): undefined reference to `0f8134f67bdaba8f.Decompress.decompress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0xd58): undefined reference to `0f8134f67bdaba8f.Decompress.delete' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0xdd6): undefined reference to `0f8134f67bdaba8f.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0xdfd): undefined reference to `0f8134f67bdaba8f.decompressobj' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0xe2d): undefined reference to `0f8134f67bdaba8f.Decompress.decompress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0xeaf): undefined reference to `0f8134f67bdaba8f.Decompress.unconsumed_tail' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0xf30): undefined reference to `0f8134f67bdaba8f.Decompress.flush' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0xf99): undefined reference to `0f8134f67bdaba8f.Decompress.delete' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1025): undefined reference to `0f8134f67bdaba8f.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x10af): undefined reference to `0f8134f67bdaba8f.decompressobj' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x10dc): undefined reference to `0f8134f67bdaba8f.Decompress.decompress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1166): undefined reference to `0f8134f67bdaba8f.Decompress.unused_data' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1209): undefined reference to `0f8134f67bdaba8f.Decompress.delete' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x12a6): undefined reference to `0f8134f67bdaba8f.compressobj' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x12c5): undefined reference to `0f8134f67bdaba8f.Compress.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x12e0): undefined reference to `0f8134f67bdaba8f.Compress.copy' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1327): undefined reference to `0f8134f67bdaba8f.Compress.flush' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x137b): undefined reference to `0f8134f67bdaba8f.Compress.flush' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x13ee): undefined reference to `0f8134f67bdaba8f.Compress.delete' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x13f8): undefined reference to `0f8134f67bdaba8f.Compress.delete' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1473): undefined reference to `0f8134f67bdaba8f.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x149a): undefined reference to `0f8134f67bdaba8f.decompressobj' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x14a7): undefined reference to `0f8134f67bdaba8f.Decompress.copy' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x150d): undefined reference to `0f8134f67bdaba8f.Decompress.decompress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1533): undefined reference to `0f8134f67bdaba8f.Decompress.decompress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1610): undefined reference to `0f8134f67bdaba8f.Decompress.delete' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x161a): undefined reference to `0f8134f67bdaba8f.Decompress.delete' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1653): undefined reference to `0f8134f67bdaba8f.zlib_adler32' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x169a): undefined reference to `0f8134f67bdaba8f.zlib_adler32' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x16c2): undefined reference to `0f8134f67bdaba8f.zlib_adler32' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1753): undefined reference to `0f8134f67bdaba8f.zlib_crc32' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1797): undefined reference to `0f8134f67bdaba8f.zlib_crc32' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x17bf): undefined reference to `0f8134f67bdaba8f.zlib_crc32' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x186c): undefined reference to `0f8134f67bdaba8f.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x190d): undefined reference to `0f8134f67bdaba8f.decompress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1a0e): undefined reference to `0f8134f67bdaba8f.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1a9b): undefined reference to `0f8134f67bdaba8f.decompress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1bf0): undefined reference to `0f8134f67bdaba8f.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1c52): undefined reference to `0f8134f67bdaba8f.decompress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1dce): undefined reference to `0f8134f67bdaba8f.compressobj' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1e0e): undefined reference to `0f8134f67bdaba8f.Compress.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1e63): undefined reference to `0f8134f67bdaba8f.Compress.flush' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1ebf): undefined reference to `0f8134f67bdaba8f.Compress.delete' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1ef4): undefined reference to `0f8134f67bdaba8f.compressobj' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1f0e): undefined reference to `0f8134f67bdaba8f.Compress.compress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1f25): undefined reference to `0f8134f67bdaba8f.Compress.flush' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x1f9a): undefined reference to `0f8134f67bdaba8f.Compress.delete' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x2eba): undefined reference to `0f8134f67bdaba8f.decompress' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x2eeb): undefined reference to `0f8134f67bdaba8f.get_error_code' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x2f02): undefined reference to `0f8134f67bdaba8f.get_error' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x2f19): undefined reference to `0f8134f67bdaba8f.get_error' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x2f46): undefined reference to `0f8134f67bdaba8f.get_error_code' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x2f68): undefined reference to `0f8134f67bdaba8f.clear_error' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x2f74): undefined reference to `0f8134f67bdaba8f.get_error_code' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x2f96): undefined reference to `0f8134f67bdaba8f.get_error_code' +D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\ZlibTest\output\d855b3e66d1d6522.obj:d855b3e66d1d6522_dso.ll:(.text+0x2f9d): undefined reference to `0f8134f67bdaba8f.get_error' +clang++: error: linker command failed with exit code 1 (use -v to see invocation) +├ ERROR: +链接失败,立即终止编译。 diff --git a/includes/hello.py b/includes/hello.py new file mode 100644 index 0000000..e4cfae4 --- /dev/null +++ b/includes/hello.py @@ -0,0 +1,5 @@ +import stdio + + +def helloworld(): + stdio.printf("Hello, world!\n") \ No newline at end of file diff --git a/includes/llvmlite/__builder.py b/includes/llvmlite/__builder.py index e5d580f..36f26d6 100644 --- a/includes/llvmlite/__builder.py +++ b/includes/llvmlite/__builder.py @@ -22,7 +22,11 @@ from .__function import Function, BasicBlock, block_append_text, function_move_b # builder.build_store(ConstInt(42), a) # r = builder.build_load(i32_ty, a) # builder.build_ret(r) +# +# 注意: 加 @t.NoVTable 以与硬编码 BUILDER_SIZE=32 保持一致 +# (所有方法均为顶层函数,无需 vtable)。 # ============================================================ +@t.NoVTable class IRBuilder: Pool: memhub.MemBuddy | t.CPtr # 内存池 Func: Function | t.CPtr # 所属函数 @@ -897,7 +901,10 @@ def build_gep_struct(builder: IRBuilder | t.CPtr, struct_ty: LLVMType | t.CPtr, # ============================================================ # PhiIncoming: phi 节点的入边 (value, block) 对 # 继承 GSListNode[PhiIncoming] 获取强类型 Next +# +# 注意: 必须加 @t.NoVTable(理由见 __function.py 的 Line 注释)。 # ============================================================ +@t.NoVTable class PhiIncoming(GSListNode[PhiIncoming]): Val: Value | t.CPtr Block: BasicBlock | t.CPtr @@ -965,7 +972,10 @@ def build_phi(builder: IRBuilder | t.CPtr, ty: LLVMType | t.CPtr, # ============================================================ # SwitchCase: switch 指令的 case 分支 +# +# 注意: 必须加 @t.NoVTable(理由见 __function.py 的 Line 注释)。 # ============================================================ +@t.NoVTable class SwitchCase(GSListNode[SwitchCase]): CaseVal: Value | t.CPtr Block: BasicBlock | t.CPtr diff --git a/includes/llvmlite/__function.py b/includes/llvmlite/__function.py index 5db70fb..508d6e6 100644 --- a/includes/llvmlite/__function.py +++ b/includes/llvmlite/__function.py @@ -13,7 +13,12 @@ from .__types import LLVMType, ParamNode, TypePrint # # 每条 LLVM IR 指令序列化为一行文本,通过链表组织。 # 继承 GSListNode[Line] 获取强类型 Next: Line|CPtr +# +# 注意: 必须加 @t.NoVTable。否则 TransPyC 为子类添加 vtable 指针(T*), +# 但完全丢失父类 GSListNode[T] 的 Next 字段,导致 struct 布局错位, +# 所有字段访问读取垃圾值(见续 XV 会话根因分析)。 # ============================================================ +@t.NoVTable class Line(GSListNode[Line]): Buf: t.CChar | t.CPtr # 行文本(NUL 结尾) Len: t.CSizeT # 文本长度(不含 NUL) @@ -25,7 +30,10 @@ class Line(GSListNode[Line]): # 持有名称 + 指令行链表 + 终止指令标志。 # 继承 GSListNode[BasicBlock] 获取强类型 Next: BasicBlock|CPtr # Lines 为 GSList[Line] 指针,提供 O(1) 追加。 +# +# 注意: 必须加 @t.NoVTable(理由同 Line)。 # ============================================================ +@t.NoVTable class BasicBlock(GSListNode[BasicBlock]): Name: t.CChar | t.CPtr # 块名(如 "entry"/"if.then") Lines: GSList[Line] | t.CPtr # 指令行链表容器(Head/Tail/Count) @@ -37,7 +45,10 @@ class BasicBlock(GSListNode[BasicBlock]): # # 继承 GSListNode[Param] 获取强类型 Next: Param|CPtr # Attrs 存储参数属性文本(如 "noundef"/"nocapture"/"readonly"),None=无属性 +# +# 注意: 必须加 @t.NoVTable(理由同 Line)。 # ============================================================ +@t.NoVTable class Param(GSListNode[Param]): Ty: LLVMType | t.CPtr # 参数类型 Name: t.CChar | t.CPtr # 参数名(如 "%0"/"%a") @@ -51,7 +62,10 @@ class Param(GSListNode[Param]): # 继承 GSListNode[Function] 获取强类型 Next: Function|CPtr # Params/Blocks 为 GSList 指针,提供 O(1) 追加。 # Attrs 存储函数级属性文本(如 "nounwind"/"noinline"),None=无属性 +# +# 注意: 必须加 @t.NoVTable(理由同 Line)。 # ============================================================ +@t.NoVTable class Function(GSListNode[Function]): Name: t.CChar | t.CPtr # 函数名 RetTy: LLVMType | t.CPtr # 返回类型 @@ -161,9 +175,12 @@ def function_move_block_to_end(func: Function | t.CPtr, block: BasicBlock | t.CP 用于解决 SSA 名非单调问题:BB 按创建顺序排列,但指令按控制流顺序生成, 导致 SSA 编号在文本输出时非单调递增,llc 报错。 在 position_at_end 时调用此函数,使 BB 顺序与 position 顺序一致。 + + 注意:必须使用 GSList[BasicBlock] 带类型参数,否则 TransPyC 创建不完整 + struct 类型,导致 blocks.Head/Tail/Count 字段访问读取垃圾值。 """ if func is None or block is None: return - blocks: GSList | t.CPtr = func.Blocks + blocks: GSList[BasicBlock] | t.CPtr = func.Blocks if blocks is None: return # 已经是 Tail,无需移动 diff --git a/includes/llvmlite/__types.py b/includes/llvmlite/__types.py index 3ac24d7..f21b383 100644 --- a/includes/llvmlite/__types.py +++ b/includes/llvmlite/__types.py @@ -10,7 +10,10 @@ from linkedlist import GSListNode # ParamNode: 函数参数类型链表节点 # 继承 GSListNode[ParamNode] 获取强类型 Next: ParamNode|CPtr # Ty 用 t.CVoid | t.CPtr 前向引用,使用时转型为 (LLVMType | t.CPtr) +# +# 注意: 必须加 @t.NoVTable(理由见 __function.py 的 Line 注释)。 # ============================================================ +@t.NoVTable class ParamNode(GSListNode[ParamNode]): Ty: t.CVoid | t.CPtr # LLVMType*(前向引用,使用时转型) diff --git a/includes/llvmlite/__values.py b/includes/llvmlite/__values.py index 4af3140..02af208 100644 --- a/includes/llvmlite/__values.py +++ b/includes/llvmlite/__values.py @@ -13,7 +13,10 @@ from .__types import LLVMType, TypePrint # 表示一个 LLVM IR 值:SSA 临时值(%0/%result)或常量字面量(42/0)。 # 每个值有类型指针、名字、是否常量标志。 # 继承 GSListNode[Value] 获取强类型 Next: Value|CPtr(值池链表) +# +# 注意: 必须加 @t.NoVTable(理由见 __function.py 的 Line 注释)。 # ============================================================ +@t.NoVTable class Value(GSListNode[Value]): Ty: LLVMType | t.CPtr # 值的类型 Name: t.CChar | t.CPtr # SSA 名("%0"/"%result")或常量文本("42"/"1.5e+00") diff --git a/includes/llvmlite/__verify.py b/includes/llvmlite/__verify.py index 2bd6d9c..6d269f8 100644 --- a/includes/llvmlite/__verify.py +++ b/includes/llvmlite/__verify.py @@ -28,7 +28,10 @@ VERIFY_ERR_PHI_NOT_FIRST: t.CDefine = 4 # ============================================================ # NameEntry: 已定义 SSA 名条目(链表节点) +# +# 注意: 必须加 @t.NoVTable(理由见 __function.py 的 Line 注释)。 # ============================================================ +@t.NoVTable class NameEntry(GSListNode[NameEntry]): Name: t.CChar | t.CPtr # SSA 名(如 "%0"/"%result") diff --git a/includes/memhub.py b/includes/memhub.py index 7b1c44a..339d97c 100644 --- a/includes/memhub.py +++ b/includes/memhub.py @@ -84,7 +84,7 @@ class MemManager: string.memset(ptr, 0, total) return ptr - def realloc(self, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: + def realloc(self, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: if ptr is None: return self.alloc(new_size) if new_size == 0: @@ -93,10 +93,7 @@ class MemManager: new_ptr: t.CVoid | t.CPtr = self.alloc(new_size) if new_ptr is None: return ptr - copy_size: t.CSizeT = old_size - if new_size < old_size: - copy_size = new_size - string.memcpy(new_ptr, ptr, copy_size) + # 基类无法追踪旧分配大小, 不复制数据; 子类可覆盖以保留数据 self.free(ptr) return new_ptr @@ -453,7 +450,7 @@ class MemBuddy(MemManager): return 1 # realloc 覆盖: 伙伴系统从块头读取旧阶数, 无需 old_size - def realloc(self, ptr: t.CVoid | t.CPtr, old_size: t.CSizeT, new_size: t.CSizeT) -> t.CVoid | t.CPtr: + def realloc(self, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: if ptr is None: return self.alloc(new_size) if new_size == 0: @@ -477,3 +474,48 @@ class MemBuddy(MemManager): string.memcpy(new_ptr, ptr, old_data_size) self.free(ptr) return new_ptr + + # === 状态查询 === + + @property + def mem_size(self) -> t.CSizeT: + # 可用区总大小(2 的幂),分配上限为 mem_size - MEMBUDDY_HEADER_SIZE + return self.usable_size + + def stats(self) -> t.CSizeT: + # 返回可用区总大小,用于状态统计 + return self.usable_size + + def free_count(self) -> t.CSizeT: + # 统计所有阶数空闲链中的块总数 + count: t.CSizeT = 0 + i: t.CInt + for i in range(MEMBUDDY_MAX_ORDERS + 1): + head_val: t.CUInt64T = self.free_lists[i] + cur: t.CVoid | t.CPtr = t.CVoid(head_val, t.CPtr) + while cur is not None: + count += 1 + cur = t.CVoid(c.Deref(t.CUInt64T(cur, t.CPtr)), t.CPtr) + return count + + def self_check(self) -> t.CInt: + # 验证伙伴分配器内部一致性,返回 0=OK,非 0=损坏 + if self.usable is None: + return 0 + i: t.CInt + for i in range(MEMBUDDY_MAX_ORDERS + 1): + head_val: t.CUInt64T = self.free_lists[i] + cur: t.CVoid | t.CPtr = t.CVoid(head_val, t.CPtr) + while cur is not None: + # 检查指针在可用区内 + if t.CUInt64T(cur) < t.CUInt64T(self.usable): + return 1 + if t.CUInt64T(cur) >= t.CUInt64T(self.usable) + self.usable_size: + return 2 + # 检查对齐:order i 的块必须按 _block_size_at_order(i) 对齐 + offset: t.CSizeT = t.CUInt64T(cur) - t.CUInt64T(self.usable) + bs: t.CSizeT = _block_size_at_order(i) + if offset % bs != 0: + return 3 + cur = t.CVoid(c.Deref(t.CUInt64T(cur, t.CPtr)), t.CPtr) + return 0 diff --git a/includes/string.py b/includes/string.py index 678191b..37c9321 100644 --- a/includes/string.py +++ b/includes/string.py @@ -39,10 +39,9 @@ def strncpy(dest: str, src: str, n: t.CSizeT) -> str: dest += 1 i += 1 # 填充剩余空间为 '\0' - while i < n: + for i in range(n): dest[0] = 0 dest += 1 - i += 1 return original_dest @@ -351,4 +350,16 @@ def split(s: str, delim: str, result: t.CArray[str]) -> int: start[0] = '\0' start += 1 result[count] = None # 结尾标记 - return count \ No newline at end of file + return count + + +ascii_lowercase: str = "abcdefghijklmnopqrstuvwxyz" +ascii_uppercase: str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +ascii_letters: str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + +digits: str = "0123456789" +hexdigits: str = "0123456789abcdefABCDEF" +octdigits: str = "01234567" +punctuation: str = "!\"#$%&'()*+,-./:;<=>?@[]^_`{|}~" +whitespace: str = " \t\n\r\f\v" +printable: str = "01234567890123456789abcdefABCDEF01234567!\"#$%&'()*+,-./:;<=>?@[]^_`{|}~ \t\n\r\f\v" diff --git a/includes/testcheck.py b/includes/testcheck.py index 629cc83..bd4c028 100644 --- a/includes/testcheck.py +++ b/includes/testcheck.py @@ -20,11 +20,13 @@ def begin(name: str): SetConsoleOutputCP(CP_UTF8) SetConsoleCP(CP_UTF8) stdio.printf("=== %s ===\n\n", name) + stdio.fflush(None) def section(name: str): """打印分节标题""" stdio.printf("--- %s ---\n", name) + stdio.fflush(None) def ok(msg: str): @@ -32,6 +34,7 @@ def ok(msg: str): global _pass_count _pass_count += 1 stdio.printf("PASS: %s\n", msg) + stdio.fflush(None) def fail(msg: str): @@ -39,6 +42,7 @@ def fail(msg: str): global _fail_count _fail_count += 1 stdio.printf("FAIL: %s\n", msg) + stdio.fflush(None) def check(cond: t.CInt, ok_msg: str, fail_msg: str): @@ -52,6 +56,7 @@ def check(cond: t.CInt, ok_msg: str, fail_msg: str): def info(msg: str): """打印信息消息(不计入 PASS/FAIL)""" stdio.printf("%s\n", msg) + stdio.fflush(None) def end() -> t.CInt: @@ -61,6 +66,7 @@ def end() -> t.CInt: _total_fail += _fail_count stdio.printf("\n--- Summary ---\n") stdio.printf("PASS: %d, FAIL: %d\n", _pass_count, _fail_count) + stdio.fflush(None) return _fail_count @@ -68,4 +74,5 @@ def summary() -> t.CInt: """打印所有套件的总计汇总,返回总失败数""" stdio.printf("\n=== Total Summary ===\n") stdio.printf("Total PASS: %d, Total FAIL: %d\n", _total_pass, _total_fail) + stdio.fflush(None) return _total_fail diff --git a/includes/vector.py b/includes/vector.py index 62dd751..e32a74b 100644 --- a/includes/vector.py +++ b/includes/vector.py @@ -31,9 +31,8 @@ class Vector[T](): if self.pool == None: return new_capacity: t.CSizeT = self.capacity * 2 if new_capacity == 0: new_capacity = 4 - old_size: t.CSizeT = self.capacity * self.elem_size new_size: t.CSizeT = new_capacity * self.elem_size - new_data: t.CVoid | t.CPtr = self.pool.realloc(self.data, old_size, new_size) + new_data: t.CVoid | t.CPtr = self.pool.realloc(self.data, new_size) if new_data == None: return self.data = new_data self.capacity = new_capacity diff --git a/lib/Projectrans/DeclarationGenerator.py b/lib/Projectrans/DeclarationGenerator.py index fb7f1da..e618ea0 100644 --- a/lib/Projectrans/DeclarationGenerator.py +++ b/lib/Projectrans/DeclarationGenerator.py @@ -476,6 +476,7 @@ class DeclarationGenerator: seen_member_names: set[str] = set() for base in node.bases: base_name: str | None = None + type_args: list[str] = [] if isinstance(base, ast.Attribute): base_name = base.attr elif isinstance(base, ast.Name): @@ -485,10 +486,19 @@ class DeclarationGenerator: base_name = base.value.attr elif isinstance(base.value, ast.Name): base_name = base.value.id + slice_node: ast.AST = base.slice + if isinstance(slice_node, ast.Name): + type_args.append(slice_node.id) + elif isinstance(slice_node, ast.Tuple): + for elt in slice_node.elts: + if isinstance(elt, ast.Name): + type_args.append(elt.id) if base_name and not self._is_marker_base(base_name): base_member_types: list[str] base_seen: set[str] base_member_types, base_seen = self._get_inherited_members(base_name) + if type_args: + base_member_types = self._specialize_member_types(base_member_types, type_args) for mt in base_member_types: member_types.append(mt) seen_member_names.update(base_seen) @@ -632,8 +642,124 @@ class DeclarationGenerator: decls.append(f'declare {ret_type} @"{method_name}"({param_str})') else: decls.append(f'declare {ret_type} @{method_name}({param_str})') + # 为继承但未覆写的方法生成包装声明 + # 这些声明让跨模块调用能正确解析子类包装函数的签名, + # 避免 stub 缺失导致默认 i32 返回类型 → 64 位指针截断 + decls.extend(self._generate_inherited_method_decls(node, class_name, struct_type_name)) return decls + def _generate_inherited_method_decls(self, node: ast.ClassDef, child_class_name: str, child_struct_type: str) -> list[str]: + """为继承但未覆写的方法生成包装声明 + + 在 Phase 1 stub 中声明子类继承方法的签名(与父类相同,但 self 参数为子类类型)。 + 这样测试模块翻译时能从 temp stub 中获取正确的返回类型, + 避免 Phase 2 includes 翻译滞后导致跨模块调用使用默认 i32 返回类型。 + """ + decls: list[str] = [] + # 收集子类自身定义的方法名(这些不需要生成包装,子类有自己的实现) + seen_method_names: set[str] = set() + for item in node.body: + if isinstance(item, ast.FunctionDef): + seen_method_names.add(item.name) + + # 沿继承链收集父类方法,近祖先优先 + for base in node.bases: + base_name: str | None = None + if isinstance(base, ast.Attribute): + base_name = base.attr + elif isinstance(base, ast.Name): + base_name = base.id + elif isinstance(base, ast.Subscript): + if isinstance(base.value, ast.Attribute): + base_name = base.value.attr + elif isinstance(base.value, ast.Name): + base_name = base.value.id + if not base_name or self._is_marker_base(base_name): + continue + self._CollectInheritedWrapperDecls( + base_name, child_class_name, child_struct_type, + seen_method_names, decls) + return decls + + def _CollectInheritedWrapperDecls( + self, parent_name: str, child_class_name: str, child_struct_type: str, + seen_method_names: set[str], decls: list[str]) -> None: + """递归收集父类及其祖先的方法,为未覆写的方法生成包装声明""" + # 查找父类节点:先在当前 .pyi 中查找,找不到则查跨模块类定义映射 + parent_node: ast.ClassDef | None = None + for n in ast.iter_child_nodes(self._pyi_tree): + if isinstance(n, ast.ClassDef) and n.name == parent_name: + parent_node = n + break + if parent_node is None: + parent_node = self._cross_module_class_defs.get(parent_name) + if parent_node is None: + return + + # 为父类的每个方法生成包装声明 + for item in parent_node.body: + if isinstance(item, ast.FunctionDef): + if hasattr(item, 'type_params') and item.type_params: + continue + method_name: str = item.name + # __before_init__ 只在自身类生成,不生成继承包装 + if method_name == '__before_init__': + continue + # 跳过子类已覆写的方法,以及已处理的祖先方法 + if method_name in seen_method_names: + continue + seen_method_names.add(method_name) + + # 构建包装方法名:{module_sha1}.{child_class}.{method_name} + wrapper_name: str = f'{child_class_name}.{method_name}' + if self.module_sha1: + wrapper_name = f"{self.module_sha1}.{wrapper_name}" + + # 解析返回类型(与父类方法相同) + ret_type: str = self._get_type_str(item.returns) if item.returns else 'void' + if not ret_type: + ret_type = 'void' + elif ret_type == 'i8*': + if item.returns is None: + ret_type = 'void' + + # 构建参数列表:第一个参数(self)替换为子类类型,其余与父类相同 + params: list[str] = [] + for arg_idx, arg in enumerate(item.args.args): + arg_type: str + if arg_idx == 0 and arg.arg == 'self': + arg_type = f'{child_struct_type}*' + else: + if arg.annotation: + arg_type = self._get_type_str(arg.annotation) + else: + arg_type = 'i8*' + arg_type = self._decay_array_to_ptr(arg_type) + params.append(arg_type) + + param_str: str = ', '.join(params) if params else '' + if wrapper_name[0].isdigit(): + decls.append(f'declare {ret_type} @"{wrapper_name}"({param_str})') + else: + decls.append(f'declare {ret_type} @{wrapper_name}({param_str})') + + # 递归处理祖先类 + for base in parent_node.bases: + base_name: str | None = None + if isinstance(base, ast.Attribute): + base_name = base.attr + elif isinstance(base, ast.Name): + base_name = base.id + elif isinstance(base, ast.Subscript): + if isinstance(base.value, ast.Attribute): + base_name = base.value.attr + elif isinstance(base.value, ast.Name): + base_name = base.value.id + if base_name and not self._is_marker_base(base_name): + self._CollectInheritedWrapperDecls( + base_name, child_class_name, child_struct_type, + seen_method_names, decls) + def _get_inherited_members(self, base_name: str) -> tuple[list[str], set[str]]: member_types: list[str] = [] seen_names: set[str] = set() @@ -675,6 +801,36 @@ class DeclarationGenerator: seen_names.add(stmt.targets[0].attr) return member_types, seen_names + def _specialize_member_types(self, member_types: list[str], type_args: list[str]) -> list[str]: + """将基类成员类型中的泛型参数 T 替换为具体类型参数 + + 处理泛型基类继承(如 GSListNode[BasicBlock])时,基类 _get_inherited_members + 返回的成员类型中会包含未特化的 T 引用(形式为 %"SHA1.T"*)。 + + 替换策略:使用 i8*(不透明指针)代替 T*,而非具体类型指针。 + 原因:跨模块场景中,具体类型指针的 SHA1 前缀可能与导入模块不一致, + 导致 TransPyC 类型转换失败。i8* 作为通用指针类型,可安全赋值给 + 任何 Class | t.CPtr 注解的变量,运行时行为与 T* 相同(都是指针)。 + + Args: + member_types: 基类成员类型字符串列表 + type_args: 类型参数名列表(如 ['BasicBlock']) + + Returns: + 特化后的成员类型字符串列表 + """ + if not type_args: + return member_types + result: list[str] = [] + for mt in member_types: + new_mt: str = mt + # 将 %"SHA1.T"* 替换为 i8*(不透明指针) + new_mt = re.sub(r'%"[a-f0-9]+\.T"\*', 'i8*', new_mt) + # 将 %"SHA1.T"(非指针,如 embedded struct)替换为 i8* + new_mt = re.sub(r'%"[a-f0-9]+\.T"', 'i8*', new_mt) + result.append(new_mt) + return result + def _llvm_type_size_str(self, type_str: str) -> int: """估算 LLVM 类型字符串的大小(字节),用于 REnum 变体大小比较 @@ -839,6 +995,18 @@ class DeclarationGenerator: base: str = self._get_type_str(annotation.value) if base == 'i8*' and isinstance(annotation.slice, ast.Constant): return f'[{self._get_const_int(annotation.slice)} x i8]' + # 处理 t.CPtr[Type] 语法(指向 Type 的指针) + # 例如: t.CPtr[t.CPtr] -> i8** (void**), t.CPtr[t.CInt] -> i32* (int*) + # t.CPtr[t.CPtr[t.CInt]] -> i32** (int**) + ValueIsCPtr: bool = ( + (isinstance(annotation.value, ast.Attribute) and annotation.value.attr == 'CPtr') + or (isinstance(annotation.value, ast.Name) and annotation.value.id == 'CPtr') + ) + if ValueIsCPtr and isinstance(annotation.slice, (ast.Attribute, ast.Name, ast.Subscript)): + slice_type: str = self._get_type_str(annotation.slice, embedded=True) + if slice_type and slice_type != 'void': + return f'{slice_type}*' + return 'i8*' if isinstance(annotation.slice, ast.Constant) and isinstance(annotation.slice.value, int): return f'[{annotation.slice.value} x {base}]' # 处理 t.CArray[elem_type, count] 注解 → [count x elem_type] diff --git a/lib/core/Handles/HandlesClassDef.py b/lib/core/Handles/HandlesClassDef.py index 5d58f21..349a67e 100644 --- a/lib/core/Handles/HandlesClassDef.py +++ b/lib/core/Handles/HandlesClassDef.py @@ -537,12 +537,32 @@ class ClassHandle(BaseHandle): Gen.class_members[ClassName] = inherited + Gen.class_members[ClassName] if ParentClass in Gen.class_methods: parent_methods: list = list(Gen.class_methods[ParentClass]) + # 构建子类已有方法映射(方法短名 -> 方法全名) + child_method_map: dict[str, str] = {} + for m in Gen.class_methods[ClassName]: + method_name: str = m.split('.')[-1] if '.' in m else m + child_method_map[method_name] = m + # 父类方法在前(保证 vtable 布局一致性,子类多态分派索引正确), + # 子类新增方法在后。子类覆盖的方法放在父类方法的位置(用子类实现)。 + new_methods: list = [] + covered_names: set[str] = set() for pm in parent_methods: method_name: str = pm.split('.')[-1] if '.' in pm else pm - child_method: str = f"{ClassName}.{method_name}" - if child_method not in Gen.class_methods[ClassName]: - Gen.class_methods[ClassName].append(child_method) + if method_name in child_method_map: + # 子类覆盖了父类方法 — 用子类的实现,放在父类的位置 + new_methods.append(child_method_map[method_name]) + covered_names.add(method_name) + else: + # 父类独有方法 — 子类未覆盖,注册子类包装器 + child_method: str = f"{ClassName}.{method_name}" + new_methods.append(child_method) Gen.register_method(ClassName, child_method) + # 添加子类新增方法(不在父类中的) + for m in Gen.class_methods[ClassName]: + method_name: str = m.split('.')[-1] if '.' in m else m + if method_name not in covered_names: + new_methods.append(m) + Gen.class_methods[ClassName] = new_methods # 提取首个裸字符串字面量作为结构体 __doc__ docstring if (Node.body and isinstance(Node.body[0], ast.Expr) and isinstance(Node.body[0].value, ast.Constant) @@ -666,7 +686,19 @@ class ClassHandle(BaseHandle): 例如 Label 继承 Widget.place,生成 Label.place 函数, 内部将 self 从 Label* bitcast 为 Widget*,然后调用 Widget.place。 """ - methods: list = Gen.class_methods.get(ClassName, []) + # 收集本类方法 + 沿继承链收集父类方法名 + # 原代码只遍历 class_methods[ClassName],遗漏父类独有方法(如 __enter__), + # 导致子类调用继承的方法时链接失败(undefined reference) + methods: list = list(Gen.class_methods.get(ClassName, [])) + p: str | None = Gen.class_parent.get(ClassName) if hasattr(Gen, 'class_parent') else None + while p: + parent_methods: list = Gen.class_methods.get(p, []) + for pm in parent_methods: + pm_short: str = pm.split('.')[-1] if '.' in pm else pm + # 避免重复:如果子类已覆写同名方法,不添加 + if not any(m.split('.')[-1] == pm_short for m in methods): + methods.append(pm) + p = Gen.class_parent.get(p) if not methods: return if ClassName not in Gen.structs: diff --git a/lib/core/Handles/HandlesExprBuiltin.py b/lib/core/Handles/HandlesExprBuiltin.py index 9125f36..ae09c61 100644 --- a/lib/core/Handles/HandlesExprBuiltin.py +++ b/lib/core/Handles/HandlesExprBuiltin.py @@ -792,7 +792,10 @@ class ExprBuiltinHandle(BaseHandle): elif dst.type.width > 64: dst = Gen.builder.trunc(dst, ir.IntType(64), name="trunc_memset_dst") dst = Gen.builder.inttoptr(dst, ir.PointerType(ir.IntType(8)), name="memset_dst_int2ptr") - if isinstance(val.type, ir.IntType) and val.type.width != 32: + if isinstance(val.type, ir.PointerType): + # 0 字面量被推断为 null 指针(i8*),memset 第二参数需要 i32 + val = ir.Constant(ir.IntType(32), 0) + elif isinstance(val.type, ir.IntType) and val.type.width != 32: if val.type.width < 32: val = Gen.builder.zext(val, ir.IntType(32), name="zext_memset_val") else: diff --git a/lib/core/Handles/HandlesExprCall.py b/lib/core/Handles/HandlesExprCall.py index e0fdd3c..f3f05ea 100644 --- a/lib/core/Handles/HandlesExprCall.py +++ b/lib/core/Handles/HandlesExprCall.py @@ -1872,69 +1872,180 @@ class ExprCallHandle(BaseHandle): self._check_eh_return(result, FuncName, Gen, called_func=func) return result + @staticmethod + def _has_cvtable_decorator(node: ast.ClassDef) -> bool: + """检查 ClassDef 是否有 @t.CVTable 装饰器(或 @CVTable)""" + for decorator in node.decorator_list: + if isinstance(decorator, ast.Attribute) and getattr(decorator.value, 'id', None) == 't' and decorator.attr == 'CVTable': + return True + if isinstance(decorator, ast.Call): + inner = decorator.func + if isinstance(inner, ast.Attribute) and getattr(inner.value, 'id', None) == 't' and inner.attr == 'CVTable': + return True + if isinstance(inner, ast.Name) and inner.id == 'CVTable': + return True + if isinstance(decorator, ast.Name) and decorator.id == 'CVTable': + return True + return False + + @staticmethod + def _has_novtable_decorator(node: ast.ClassDef) -> bool: + """检查 ClassDef 是否有 @t.NoVTable 装饰器""" + for decorator in node.decorator_list: + if isinstance(decorator, ast.Attribute) and getattr(decorator.value, 'id', None) == 't' and decorator.attr == 'NoVTable': + return True + if isinstance(decorator, ast.Name) and decorator.id == 'NoVTable': + return True + return False + def _try_register_vtable_ondemand(self, ClassName: str, class_sha1: str, Gen: "LlvmGeneratorMixin") -> None: """按需 vtable 注册:从 .pyi stub 检查 @t.CVTable 并注册到 vtable 集合。 - 当 vcall 决策点发现 ClassName 不在 vtable 集合中时调用。 - 读取 temp/{sha1}.pyi 文件,查找 ClassName 的 ClassDef, - 检查 @t.CVTable 装饰器,注册 vtable 和方法列表。 + 沿继承链递归收集方法,保证 vtable 布局与 prescan 的 _EmitClassLlvm 一致: + - 基类方法在前(固定索引,保证多态分派正确) + - 子类新增方法在后 + - 子类覆盖的方法放在父类的位置(用子类实现) + + 与 prescan 的 _resolve_class_flags 逻辑一致: + - 类自身有 @t.CVTable → 注册 + - 类自身有 @t.NoVTable → 不注册 + - 类继承 @t.CVTable 基类(且无 @t.NoVTable)→ 注册(自动启用 CVTable) """ try: import_handler = self.Trans.ImportHandler project_root = import_handler._find_project_root() - pyi_path = os.path.join(project_root, 'temp', f'{class_sha1}.pyi') - if not os.path.isfile(pyi_path): + struct_sha1_map = getattr(Gen, '_struct_sha1_map', {}) + + # 缓存已读取的 .pyi 文件(sha1 -> class_map) + pyi_cache: dict[str, dict[str, ast.ClassDef]] = {} + + def load_pyi(sha1: str) -> dict[str, ast.ClassDef] | None: + if sha1 in pyi_cache: + return pyi_cache[sha1] + pyi_path = os.path.join(project_root, 'temp', f'{sha1}.pyi') + if not os.path.isfile(pyi_path): + return None + with open(pyi_path, 'r', encoding='utf-8') as f: + pyi_code = f.read() + tree = ast.parse(pyi_code) + cmap: dict[str, ast.ClassDef] = {} + for node in ast.iter_child_nodes(tree): + if isinstance(node, ast.ClassDef): + cmap[node.name] = node + pyi_cache[sha1] = cmap + return cmap + + def collect_class_methods(class_name: str, sha1: str, visited: set[str]) -> tuple[list[str], bool, bool, str | None]: + """递归收集类的方法列表(基类方法在前,子类方法在后)。 + + Returns: + (methods, is_cvtable, is_novtable, parent_name) + """ + if class_name in visited: + return ([], False, False, None) + visited.add(class_name) + + class_map = load_pyi(sha1) + if class_map is None: + return ([], False, False, None) + + target_node = class_map.get(class_name) + if target_node is None: + return ([], False, False, None) + + is_cvtable = self._has_cvtable_decorator(target_node) + is_novtable = self._has_novtable_decorator(target_node) + + # 收集自身方法 + self_methods: list[str] = [] + for item in target_node.body: + if isinstance(item, ast.FunctionDef): + method_name = item.name + if method_name in ('__new__', '__init__', '__before_init__'): + continue + if method_name == '__call__': + self_methods.append(f"{class_name}.__call__") + else: + self_methods.append(f"{class_name}.{method_name}") + + # 收集基类方法 + parent_methods: list[str] = [] + parent_name: str | None = None + for base in target_node.bases: + base_name: str | None = None + if hasattr(base, 'id'): + base_name = base.id + elif hasattr(base, 'attr'): + base_name = base.attr + if not base_name or base_name in ('Object', 'CVTable', 'NoVTable', 'CStruct', 'CUnion', 'CEnum', 'REnum', 'Exception', 'Enum'): + continue + if parent_name is None: + parent_name = base_name + + # 检查同文件内的基类 + base_node = class_map.get(base_name) + if base_node is not None: + base_methods, base_cvtable, base_novtable, _ = collect_class_methods(base_name, sha1, visited) + if base_novtable: + pass # 父类是 NoVTable,不继承 vtable + elif base_cvtable: + is_cvtable = True + parent_methods.extend(base_methods) + else: + # 跨模块基类 — 查找基类的 sha1 + base_sha1 = struct_sha1_map.get(base_name) + if base_sha1: + base_methods, base_cvtable, base_novtable, _ = collect_class_methods(base_name, base_sha1, visited) + if base_novtable: + pass + elif base_cvtable: + is_cvtable = True + parent_methods.extend(base_methods) + else: + # 无法找到基类的 sha1 + if base_name in Gen._cross_module_novtable: + pass # 父类是 NoVTable,不继承 vtable + + # 合并方法列表:基类方法在前,子类方法在后 + # 子类覆盖的方法放在父类的位置 + child_method_map: dict[str, str] = {} + for m in self_methods: + mn = m.split('.')[-1] if '.' in m else m + child_method_map[mn] = m + + merged: list[str] = [] + covered_names: set[str] = set() + for pm in parent_methods: + mn = pm.split('.')[-1] if '.' in pm else pm + if mn in child_method_map: + merged.append(child_method_map[mn]) + covered_names.add(mn) + else: + # 父类独有方法 — 用子类名(虚分派时函数查找会沿继承链回退) + merged.append(f"{class_name}.{mn}") + + for m in self_methods: + mn = m.split('.')[-1] if '.' in m else m + if mn not in covered_names: + merged.append(m) + + return (merged, is_cvtable, is_novtable, parent_name) + + methods, is_cvtable, is_novtable, parent_name = collect_class_methods(ClassName, class_sha1, set()) + + if is_novtable: return - with open(pyi_path, 'r', encoding='utf-8') as f: - pyi_code = f.read() - pyi_tree = ast.parse(pyi_code) - # 查找目标 ClassDef - target_node: ast.ClassDef | None = None - for node in ast.iter_child_nodes(pyi_tree): - if isinstance(node, ast.ClassDef) and node.name == ClassName: - target_node = node - break - if target_node is None: - return - # 检查 @t.CVTable 装饰器 - is_cvtable: bool = False - for decorator in target_node.decorator_list: - if isinstance(decorator, ast.Attribute) and getattr(decorator.value, 'id', None) == 't' and decorator.attr == 'CVTable': - is_cvtable = True - break - if isinstance(decorator, ast.Call): - inner = decorator.func - if isinstance(inner, ast.Attribute) and getattr(inner.value, 'id', None) == 't' and inner.attr == 'CVTable': - is_cvtable = True - break - if isinstance(inner, ast.Name) and inner.id == 'CVTable': - is_cvtable = True - break - if isinstance(decorator, ast.Name) and decorator.id == 'CVTable': - is_cvtable = True - break if not is_cvtable: return + # 注册到 vtable 集合(共享集合) Gen._cross_module_vtable_classes.add(ClassName) Gen.class_vtable.add(ClassName) - # 预注册方法列表(与 prescan 逻辑一致) - if ClassName not in Gen.class_methods: - Gen.class_methods[ClassName] = [] - for item in target_node.body: - if isinstance(item, ast.FunctionDef): - method_name = item.name - # 构造函数不放入 vtable(避免子类与基类 vtable 大小不一致破坏多态分派) - if method_name in ('__new__', '__init__', '__before_init__'): - continue - if method_name == '__init__': - full_name = f"{ClassName}.__init__" - elif method_name == '__call__': - full_name = f"{ClassName}.__call__" - else: - full_name = f"{ClassName}.{method_name}" - if full_name not in Gen.class_methods[ClassName]: - Gen.class_methods[ClassName].append(full_name) + # 设置方法列表(与 prescan 逻辑一致:基类方法在前) + Gen.class_methods[ClassName] = methods + # 设置 class_parent(用于虚分派时的函数查找回退) + if parent_name and ClassName not in Gen.class_parent: + Gen.class_parent[ClassName] = parent_name except Exception: pass diff --git a/lib/core/Handles/HandlesFunctions.py b/lib/core/Handles/HandlesFunctions.py index b64f19c..154e15e 100644 --- a/lib/core/Handles/HandlesFunctions.py +++ b/lib/core/Handles/HandlesFunctions.py @@ -1601,6 +1601,15 @@ class FunctionHandle(BaseHandle): } if IsExternFunc or IsStateFunc: return + # 治本修复:如果函数已经有 body(blocks 不为空),跳过重复编译。 + # 否则会导致同一函数被追加第二个 entry block(llvmlite 自动重命名为 entry.1), + # 产生非法 IR:两个 entry block + 第二个 block 无前驱成为死代码。 + # 触发场景:泛型特化路径 _EmitGenericSpecialization 先调用 _EmitFunctionForwardDeclLlvm + # 再调用 _EmitFunctionLlvm,若特化在多个调用点被重复触发(如 list[str] 在 split/upper 等多处使用), + # 同一 MangledName 会进入此函数两次,第二次会重复追加 entry block。 + existing_blocks: list = getattr(func, 'blocks', []) + if existing_blocks: + return func EntryBlock = func.append_basic_block(name="entry") Gen.builder = ir.IRBuilder(EntryBlock) Gen.func = func @@ -1612,6 +1621,15 @@ class FunctionHandle(BaseHandle): # 保存当前的 var_type_info,以便函数结束时恢复 saved_var_type_info = Gen.var_type_info.copy() saved_var_type_assignments = Gen.var_type_assignments.copy() + # 治本修复:保存并清空 _local_heap_ptrs / _var_to_heap_ptr。 + # 当 with 上下文中的代码(如 s1.split(','))触发内联编译 list[str].__new__ 时, + # 若不清空,__new__ 方法会继承外层 with 的 _local_heap_ptrs(含 %call_enter 条目), + # 方法结束时 _emit_local_heap_frees 会尝试 bitcast/free %call_enter, + # 但该值在 __new__ 作用域中不存在 → llc 报错 'use of undefined value'。 + saved_local_heap_ptrs = list(Gen._local_heap_ptrs) + saved_var_to_heap_ptr = dict(Gen._var_to_heap_ptr) + Gen._local_heap_ptrs = [] + Gen._var_to_heap_ptr = {} # 函数内部定义的变量会在赋值时添加到 var_type_info 中 # 这样函数内部定义的元类型变量(如 a = t.CInt32T)就能被正确处理 for stmt in Node.body: @@ -1810,8 +1828,9 @@ class FunctionHandle(BaseHandle): Gen.var_type_info = saved_var_type_info Gen.var_type_assignments = saved_var_type_assignments Gen._stop_iter_flag_param = None - Gen._local_heap_ptrs = [] - Gen._var_to_heap_ptr = {} + # 恢复外层作用域的 _local_heap_ptrs / _var_to_heap_ptr + Gen._local_heap_ptrs = saved_local_heap_ptrs + Gen._var_to_heap_ptr = saved_var_to_heap_ptr Gen._variadic_info = None self.Trans._CurrentCpythonObjectClass = saved_cpython_class self.Trans.CurrentCReturnTypes = None diff --git a/lib/core/Handles/HandlesImports.py b/lib/core/Handles/HandlesImports.py index 55b17fd..5f21505 100644 --- a/lib/core/Handles/HandlesImports.py +++ b/lib/core/Handles/HandlesImports.py @@ -375,10 +375,22 @@ class ImportHandle(BaseHandle): SearchExtensions = ['.pyi', '.py'] sub_path_base = os.path.join(parent_dir, node.module) found_sub = False + # 治本修复:用包目录名(如 'json')而非 register_module_name(当前编译模块名,如 '_dict')。 + # 当 _dict.py 导入 json 包,递归处理 json/__init__.py 中的 `from .__parser import parse` 时, + # register_module_name='_dict' 会导致 actual_module='_dict.__parser', + # 使 _mangle_func_name 查找失败回退到 self.module_sha1,生成错误的 mangled name。 + # 包名推导优先级: + # 1. module_name(如果它在 ModuleSha1Map 中,说明是已注册的包名,如 'json') + # — 处理 sha1 命名的 .pyi 文件(parent_dir 是 temp 目录时) + # 2. os.path.basename(parent_dir)(原始路径推导,如 'json') + if module_name and module_name in Gen.ModuleSha1Map: + pkg_basename = module_name + else: + pkg_basename = os.path.basename(parent_dir) for ext in SearchExtensions: candidate = sub_path_base + ext if os.path.isfile(candidate): - actual_module = f"{register_module_name}.{node.module}" if register_module_name else node.module + actual_module = f"{pkg_basename}.{node.module}" if pkg_basename else node.module self._RegisterSubModuleSha1(candidate, actual_module, node.module, Gen) if not getattr(self.Trans, '_ImportedModules', None): self.Trans._ImportedModules = set() @@ -392,7 +404,7 @@ class ImportHandle(BaseHandle): break # SHA1 map 回退 if not found_sub: - actual_module = f"{register_module_name}.{node.module}" if register_module_name else node.module + actual_module = f"{pkg_basename}.{node.module}" if pkg_basename else node.module ModuleSha1Map = getattr(Gen, 'ModuleSha1Map', {}) target_sha1 = ModuleSha1Map.get(actual_module) or ModuleSha1Map.get(node.module) if target_sha1: @@ -413,12 +425,18 @@ class ImportHandle(BaseHandle): SearchExtensions = ['.pyi', '.py'] # Load __init__.py to make package-level names available self._LoadPackageInitForRelativeImport(mod_dir, Gen, register_module_name) + # 治本修复:用包目录名(如 'json')而非 register_module_name(当前编译模块名,如 '_dict')。 + # 同 if node.module 分支的修复逻辑。 + if module_name and module_name in Gen.ModuleSha1Map: + pkg_basename = module_name + else: + pkg_basename = os.path.basename(mod_dir) for alias in node.names: found_alias = False for ext in SearchExtensions: sub_path = os.path.join(mod_dir, alias.name + ext) if os.path.isfile(sub_path): - sub_ModulePath = f"{register_module_name}.{alias.name}" if register_module_name else alias.name + sub_ModulePath = f"{pkg_basename}.{alias.name}" if pkg_basename else alias.name if not getattr(self.Trans, '_ImportedModules', None): self.Trans._ImportedModules = set() self.Trans._ImportedModules.add(sub_ModulePath) @@ -430,7 +448,7 @@ class ImportHandle(BaseHandle): break # SHA1 map 回退 if not found_alias: - sub_ModulePath = f"{register_module_name}.{alias.name}" if register_module_name else alias.name + sub_ModulePath = f"{pkg_basename}.{alias.name}" if pkg_basename else alias.name ModuleSha1Map = getattr(Gen, 'ModuleSha1Map', {}) target_sha1 = ModuleSha1Map.get(sub_ModulePath) or ModuleSha1Map.get(alias.name) if target_sha1: @@ -1538,6 +1556,23 @@ class ImportHandle(BaseHandle): Gen.class_member_bitoffsets[ClassName] = {} if ClassName not in Gen.class_methods: Gen.class_methods[ClassName] = [] + # 先计算 source_sha1,确保首次 _TryLoadStructFromStub 调用就能使用正确的 sha1 + # 优先使用传入的 source_sha1(来自 _TryLoadClassMembersFromPyi 的直接调用, + # 当前模块未直接导入定义模块时 module_name 查找会失败,需依赖传入的 source_sha1) + if not source_sha1: + if actual_module_name and hasattr(Gen, 'ModuleSha1Map') and actual_module_name in Gen.ModuleSha1Map: + source_sha1 = Gen.ModuleSha1Map[actual_module_name] + elif module_name and hasattr(Gen, 'ModuleSha1Map') and module_name in Gen.ModuleSha1Map: + source_sha1 = Gen.ModuleSha1Map[module_name] + # 提前注册 struct:使用导入的 source_sha1 创建 opaque struct, + # 避免后续 _TryLoadStructFromStub 触发嵌套编译时,StructGen 用本地 sha1 + # 创建缺少基类字段(如 GSListNode.Next)的本地类型定义。 + Gen._get_or_create_struct(ClassName, source_sha1=source_sha1, packed=IsPacked) + # Track which module defines this class (for cross-module name mangling) + if source_sha1: + if not hasattr(Gen, 'class_sha1_map'): + Gen.class_sha1_map = {} + Gen.class_sha1_map[ClassName] = source_sha1 # --- 预扫描预注册:修复编译时序问题 --- # _TryLoadStructFromStub → _parse_llvm_type → _specialize_generic_class # 可能触发 list[str].__new__ 编译(其中调用 pool.alloc(48)), @@ -1560,24 +1595,10 @@ class ImportHandle(BaseHandle): if _has_methods_prescan and IsCVTable: Gen._cross_module_vtable_classes.add(ClassName) Gen.class_vtable.add(ClassName) - # 先计算 source_sha1,确保首次 _TryLoadStructFromStub 调用就能使用正确的 sha1 - # 优先使用传入的 source_sha1(来自 _TryLoadClassMembersFromPyi 的直接调用, - # 当前模块未直接导入定义模块时 module_name 查找会失败,需依赖传入的 source_sha1) - if not source_sha1: - if actual_module_name and hasattr(Gen, 'ModuleSha1Map') and actual_module_name in Gen.ModuleSha1Map: - source_sha1 = Gen.ModuleSha1Map[actual_module_name] - elif module_name and hasattr(Gen, 'ModuleSha1Map') and module_name in Gen.ModuleSha1Map: - source_sha1 = Gen.ModuleSha1Map[module_name] # 首次加载就传入 source_sha1,避免从其他模块的 output stub 中加载到错误的结构体定义 # (如 HandlesExprCall.py 的 output stub 中 43f27dda2e5b5923.Value 只有 5 字段, # 而正确的 aaf8ba449d1e64c1.Value 有 6 字段) self._TryLoadStructFromStub(ClassName, Gen, source_sha1=source_sha1) - # Track which module defines this class (for cross-module name mangling) - if source_sha1: - if not hasattr(Gen, 'class_sha1_map'): - Gen.class_sha1_map = {} - Gen.class_sha1_map[ClassName] = source_sha1 - Gen._get_or_create_struct(ClassName, source_sha1=source_sha1, packed=IsPacked) # 如果 _get_or_create_struct 因 sha1 冲突创建了新的 opaque struct, # 需用 source_sha1 重新加载正确的 stub body。 if source_sha1: @@ -1727,11 +1748,32 @@ class ImportHandle(BaseHandle): # 直接从 AST 提取泛型基类名(如 GSListNode[Value] -> GSListNode), # 后续继承字段展平逻辑会从 .pyi 加载该基类的字段。 if isinstance(_base.value, ast.Name): - _base_name = _base.value.id + _base_short_name: str = _base.value.id elif isinstance(_base.value, ast.Attribute): - _base_name = _base.value.attr + _base_short_name: str = _base.value.attr else: continue + # 尝试手动构造特化名并检查是否已有特化 class_members。 + # 这解决了 _ResolveGenericSlice 失败但特化已通过其他路径 + # (如 _parse_llvm_type)触发的情况。特化 class_members 中 + # 的 T 已被正确替换为具体类型(如 BasicBlock),避免使用 + # 未特化的 GSListNode 导致 T* 占位类型残留。 + _slice_name: str | None = None + if isinstance(_base.slice, ast.Name): + _slice_name = _base.slice.id + elif isinstance(_base.slice, ast.Attribute): + _slice_name = _base.slice.attr + elif isinstance(_base.slice, ast.Subscript): + # 嵌套泛型(如 GSList[GSListNode[T]]),暂不处理 + pass + _manual_spec_name: str | None = None + if _slice_name is not None: + _manual_spec_name = f"{_base_short_name}[{_slice_name}]" + if _manual_spec_name is not None and _manual_spec_name in Gen.class_members: + # 特化 class_members 已存在,直接使用(T 已被替换) + _base_name = _manual_spec_name + else: + _base_name = _base_short_name else: continue if _base_name == ClassName: @@ -1960,6 +2002,17 @@ class ImportHandle(BaseHandle): st.set_body(*elem_types) if is_packed: Gen.class_packed.add(class_name) + # 同步设置短名 struct 的 body:当存在 sha1 冲突时,_get_or_create_struct + # 返回 full_key struct,但代码可能通过短名引用旧 struct(由 setup_from_symbol_table + # 早期创建的 opaque 占位符,使用本地 sha1 前缀)。需要同步设置短名 struct + # 的 body,确保 GEP 指令能正确访问字段(修复跨模块类型定义冲突导致的 + # 字段索引错位问题)。 + short_st = Gen.structs.get(class_name) + if short_st is not None and short_st is not st and isinstance(short_st, ir.IdentifiedStructType) and short_st.is_opaque: + try: + short_st.set_body(*elem_types) + except Exception: + pass # set_body 可能因已设置而失败,忽略 except Exception as _e: if _config_mode == "strict": raise @@ -2028,48 +2081,75 @@ class ImportHandle(BaseHandle): return self.Trans._BuildScalarConstantUnified(value_node, target_type, Gen) def _LookupStubFuncType(self, func_name: str, Gen: LlvmGeneratorMixin) -> ir.FunctionType | None: - """从 stub.ll 文件中查找指定函数的 LLVM 类型""" + """从 stub.ll 文件中查找指定函数的 LLVM 类型 + + 扫描 output/ 和 temp/ 两个目录的 .stub.ll 文件。 + 关键修复:output/(Phase 2 完整结果)必须覆盖 temp/(Phase 1 不完整结果), + 否则继承包装方法(在 Phase 2 的 _generate_inherited_method_wrappers 中生成) + 将无法被解析,导致跨模块调用使用默认 i32 返回类型 → 64 位指针截断。 + """ if not getattr(self, '_stub_func_cache', None): self._stub_func_cache = {} - + ProjectRoot = self._find_project_root() temp_dir = os.path.join(ProjectRoot, 'temp') - - if not os.path.isdir(temp_dir): + output_dir = os.path.join(ProjectRoot, 'output') + + # 文件数签名:检测 stub 新增(增量编译时 output 逐步填充完整签名) + output_count = sum(1 for f in os.listdir(output_dir) if f.endswith('.stub.ll')) if os.path.isdir(output_dir) else 0 + temp_count = sum(1 for f in os.listdir(temp_dir) if f.endswith('.stub.ll')) if os.path.isdir(temp_dir) else 0 + signature = (output_count, temp_count) + if getattr(self, '_stub_func_cache_signature', None) != signature or not self._stub_func_cache: + # 签名变化或缓存为空,重建缓存 + self._stub_func_cache = {} + self._stub_func_cache_signature = signature + + if not os.path.isdir(temp_dir) and not os.path.isdir(output_dir): return None - + if func_name not in self._stub_func_cache: - for filename in os.listdir(temp_dir): - if not filename.endswith('.stub.ll'): + # 先扫描 temp/(Phase 1,不完整签名),再扫描 output/(Phase 2,完整签名)覆盖之 + # 这样 output 中存在的继承包装方法会覆盖 temp 中的同名旧声明(若有), + # 也填补 temp 中缺失的函数声明 + for scan_dir in [temp_dir, output_dir]: + if not os.path.isdir(scan_dir): continue - - stub_path = os.path.join(temp_dir, filename) - source_sha1 = filename.replace('.stub.ll', '') - try: - with open(stub_path, 'r', encoding='utf-8') as f: - content = f.read() - - for line in content.splitlines(): - stripped = line.strip() - if not stripped.startswith('declare '): - continue - - name_match = stripped.split('@', 1) - if len(name_match) < 2: - continue - - stub_func_name = name_match[1].split('(', 1)[0].strip().strip('"') - - match = re.match(r'declare\s+(.+?)\s+@("?[\w.]+"?)\s*\((.*)\)$', stripped) - if match: - stub_ret = match.group(1).strip() - stub_params = match.group(3).strip() - self._stub_func_cache[stub_func_name] = (stub_ret, stub_params, '...' in stub_params, source_sha1) - except Exception as _e: - if _config_mode == "strict": - raise - _vlog().warning(f"处理导入失败: {_e}", "Exception") + for filename in os.listdir(scan_dir): + if not filename.endswith('.stub.ll'): + continue + + stub_path = os.path.join(scan_dir, filename) + # 预检查文件存在性:os.listdir 与 open 之间文件可能被并发写入删除 + if not os.path.isfile(stub_path): + continue + source_sha1 = filename.replace('.stub.ll', '') + try: + with open(stub_path, 'r', encoding='utf-8') as f: + content = f.read() + + for line in content.splitlines(): + stripped = line.strip() + if not stripped.startswith('declare '): + continue + + name_match = stripped.split('@', 1) + if len(name_match) < 2: + continue + + stub_func_name = name_match[1].split('(', 1)[0].strip().strip('"') + + match = re.match(r'declare\s+(.+?)\s+@("?[\w.]+"?)\s*\((.*)\)$', stripped) + if match: + stub_ret = match.group(1).strip() + stub_params = match.group(3).strip() + self._stub_func_cache[stub_func_name] = (stub_ret, stub_params, '...' in stub_params, source_sha1) + except FileNotFoundError: + continue + except Exception as _e: + if _config_mode == "strict": + raise + _vlog().warning(f"处理导入失败: {_e}", "Exception") if func_name not in self._stub_func_cache: return None @@ -2110,7 +2190,8 @@ class ImportHandle(BaseHandle): def _strip_llvm_param_name(self, param_str: str) -> str: """剥离 LLVM IR 参数字符串中的参数名,仅保留类型部分""" param_str = param_str.strip() - result = re.sub(r'\s+%[\w.]+\s*$', '', param_str) + # 支持 %name 和 %"quoted.name" 两种参数名形式 + result = re.sub(r'\s+%("[^"]*"|[\w.]+)\s*$', '', param_str) return result.strip() def _parse_simple_llvm_type(self, type_str: str) -> ir.Type | None: @@ -2573,6 +2654,12 @@ class ImportHandle(BaseHandle): existing = Gen.structs.get(struct_name) if existing is not None: return existing + # 尝试用 source_sha1 前缀的全名查找 + if actual_source_sha1: + full_key = f"{actual_source_sha1}.{struct_name}" + existing_full = Gen.structs.get(full_key) + if existing_full is not None: + return existing_full return None return ir.IntType(32) diff --git a/lib/core/Handles/HandlesTypeMerge.py b/lib/core/Handles/HandlesTypeMerge.py index a3c0d93..4af492f 100644 --- a/lib/core/Handles/HandlesTypeMerge.py +++ b/lib/core/Handles/HandlesTypeMerge.py @@ -856,9 +856,10 @@ class HandlesTypeMerge(BaseHandle): if TypeItem.OriginalType: Result.OriginalType = TypeItem.OriginalType continue - # 统计 t.CPtr(CVoid + PtrCount=1) + # 统计 t.CPtr(CVoid + PtrCount>0) + # 注意: t.CPtr[t.CPtr] 的 PtrCount=2(双重指针),需要完整累加 if TypeItem.PtrCount > 0 and TypeItem.BaseType and (TypeItem.BaseType is t.CVoid or isinstance(TypeItem.BaseType, t.CVoid)): - cptr_count += 1 + cptr_count += TypeItem.PtrCount # BaseType 保持不变,只计数,后续统一累加 if TypeItem.IsRenum and TypeItem.Name: Result.IsRenum = True diff --git a/lib/core/Handles/HandlesWith.py b/lib/core/Handles/HandlesWith.py index 91bfea4..6f5d06d 100644 --- a/lib/core/Handles/HandlesWith.py +++ b/lib/core/Handles/HandlesWith.py @@ -8,6 +8,28 @@ import llvmlite.ir as ir class WithHandle(BaseHandle): + def _ResolveInheritedMethod(self, ClassName: str, MethodName: str, Gen: "Translator.LlvmGen") -> tuple[str | None, "ir.Function | None"]: + """沿继承链查找方法,返回 (定义方法的类名, 函数对象) + + 当子类未覆写 __enter__/__exit__ 等方法时,沿 Gen.class_parent 链查找父类实现。 + _generate_inherited_method_wrappers 只为 class_methods[ClassName] 中的方法生成包装, + 不包括父类独有方法,因此 with 语句需要单独处理继承查找。 + """ + # 先检查子类自身 + FullName: str = f'{ClassName}.{MethodName}' + func = Gen._find_function(FullName) if hasattr(Gen, '_find_function') else Gen.functions.get(FullName) + if func: + return (ClassName, func) + # 沿继承链查找 + p: str | None = Gen.class_parent.get(ClassName) if hasattr(Gen, 'class_parent') else None + while p: + parent_full: str = f'{p}.{MethodName}' + parent_func = Gen._find_function(parent_full) if hasattr(Gen, '_find_function') else Gen.functions.get(parent_full) + if parent_func: + return (p, parent_func) + p = Gen.class_parent.get(p) + return (None, None) + def _HandleWithLlvm(self, Node: ast.With) -> None: Gen: "Translator.LlvmGen" = self.Trans.LlvmGen for item in Node.items: @@ -60,10 +82,16 @@ class WithHandle(BaseHandle): ctx_is_var_ref: bool = isinstance(context_expr, ast.Name) enter_result: ir.Value | None = None if ClassName: - EnterFuncName: str = f'{ClassName}.__enter__' - if EnterFuncName in Gen.functions: + # 沿继承链查找 __enter__(子类可能未覆写,使用父类实现) + enter_class, enter_func = self._ResolveInheritedMethod(ClassName, '__enter__', Gen) + if enter_func is not None: ctx_Loaded: ir.Value = Gen._load(ctx_alloca, name="__with_ctx") - enter_call: ir.CallInstr = Gen.builder.call(Gen.functions[EnterFuncName], [ctx_Loaded], name="call_enter") + # 父类方法需要 self 为父类指针类型,bitcast 子类指针 + if enter_class != ClassName and enter_class in Gen.structs: + parent_ptr_type = ir.PointerType(Gen.structs[enter_class]) + if ctx_Loaded.type != parent_ptr_type: + ctx_Loaded = Gen.builder.bitcast(ctx_Loaded, parent_ptr_type, name="cast_enter_self") + enter_call: ir.CallInstr = Gen.builder.call(enter_func, [ctx_Loaded], name="call_enter") enter_result = enter_call if isinstance(enter_call.type, ir.PointerType): pointee: ir.Type = enter_call.type.pointee @@ -139,10 +167,16 @@ class WithHandle(BaseHandle): if Gen._with_provides_stack: Gen._with_provides_stack.pop() if ClassName: - ExitFuncName: str = f'{ClassName}.__exit__' - if ExitFuncName in Gen.functions: + # 沿继承链查找 __exit__(子类可能未覆写,使用父类实现) + exit_class, exit_func = self._ResolveInheritedMethod(ClassName, '__exit__', Gen) + if exit_func is not None: ctx_Loaded: ir.Value = Gen._load(ctx_alloca, name="__with_ctx") - Gen.builder.call(Gen.functions[ExitFuncName], [ctx_Loaded], name="call_exit") + # 父类方法需要 self 为父类指针类型,bitcast 子类指针 + if exit_class != ClassName and exit_class in Gen.structs: + parent_ptr_type = ir.PointerType(Gen.structs[exit_class]) + if ctx_Loaded.type != parent_ptr_type: + ctx_Loaded = Gen.builder.bitcast(ctx_Loaded, parent_ptr_type, name="cast_exit_self") + Gen.builder.call(exit_func, [ctx_Loaded], name="call_exit") Gen._unregister_local_heap_ptr(original_ctx_val) if ctx_val is not original_ctx_val: Gen._unregister_local_heap_ptr(ctx_val) diff --git a/lib/core/LLVMCG/BaseGen.py b/lib/core/LLVMCG/BaseGen.py index 8689680..cd0b890 100644 --- a/lib/core/LLVMCG/BaseGen.py +++ b/lib/core/LLVMCG/BaseGen.py @@ -389,12 +389,24 @@ class BaseGenMixin: return int(llvm_str[1:]) # 4. 特殊名称(非整数类型,但需要标记为 typedef 以跳过 opaque 定义) + # 注意:如果 name 已注册为 struct(用户定义了同名 class,如 includes/_dict.py 中的 dict), + # 则不应视为 typedef,应返回 None 让调用方走 struct 创建路径。 + # 解决时序问题:_parse_llvm_declare 从 stub.ll 解析时 dict 可能尚未注册到 Gen.structs, + # 但 SymbolTable 在 .pyi 解析阶段已就绪,可通过 is_struct 检查区分 class 和 typedef。 _SPECIAL_TYPEDEFS: set[str] = { 'typedef', 'CType', 'CVolatile', 'CEnum', 'CUnion', 'CStruct', 'enum', 'REnum', 'renum', 'list', 'dict', 'tuple', 'set', 'str', 'bytes', 'array', 'type', 'CArray', } if name in _SPECIAL_TYPEDEFS: + if name in self.structs: + return None # 已注册为 struct,不视为 typedef + if self.SymbolTable is not None: + try: + if self.SymbolTable.is_struct(name): + return None # SymbolTable 中标记为 struct,不视为 typedef + except Exception: + pass return 0 # 标记为 typedef,但位宽为 0(非整数) return None diff --git a/lib/core/LLVMCG/StructGen.py b/lib/core/LLVMCG/StructGen.py index 3ab012a..13098bb 100644 --- a/lib/core/LLVMCG/StructGen.py +++ b/lib/core/LLVMCG/StructGen.py @@ -248,7 +248,15 @@ class StructGenMixin: if is_packed: self.structs[ClassName].packed = True continue - mangled_name: str = self._mangle_name(ClassName) + # 修复跨模块类型定义冲突:如果类是从其他模块导入的(已在 class_sha1_map 注册), + # 必须使用导入的 source_sha1 作为前缀,而非本地模块的 sha1。 + # 否则会创建缺少基类字段(如 GSListNode.Next)的本地类型定义, + # 导致字段索引错位 → 访问违规崩溃。 + _imported_sha1: str = self.class_sha1_map.get(ClassName, '') + if _imported_sha1: + mangled_name: str = f"{_imported_sha1}.{ClassName}" + else: + mangled_name: str = self._mangle_name(ClassName) struct_type: ir.IdentifiedStructType = ir.IdentifiedStructType(self.module, mangled_name, packed=is_packed) self.structs[ClassName] = struct_type @@ -361,7 +369,18 @@ class StructGenMixin: _vtable_first_ok: bool = True if _has_vtable_precheck and len(existing_st.elements) > 0: _vtable_first_ok = isinstance(existing_st.elements[0], ir.PointerType) - if len(existing_st.elements) >= _expected_count_pre and _vtable_first_ok: + # 检测 T* 占位类型(未特化的泛型类型参数)。 + # 当 struct 包含 T* 字段时(如 BasicBlock 继承 GSListNode[BasicBlock] 但 stub 未特化), + # 说明 stub 使用了未特化的基类,需清除重新生成。 + _has_t_placeholder_pre: bool = False + for _elem_pre in existing_st.elements: + if isinstance(_elem_pre, ir.PointerType) and isinstance(_elem_pre.pointee, ir.IdentifiedStructType): + _pname_pre: str = _elem_pre.pointee.name + _short_pre: str = _pname_pre.rsplit('.', 1)[-1] if '.' in _pname_pre else _pname_pre + if _short_pre == 'T': + _has_t_placeholder_pre = True + break + if len(existing_st.elements) >= _expected_count_pre and _vtable_first_ok and not _has_t_placeholder_pre: if ClassName in self.class_packed and not existing_st.packed: existing_st.packed = True continue @@ -438,7 +457,12 @@ class StructGenMixin: # 由 _TryLoadStructFromStub 设置完整 body。 member_types = [] else: - member_types = [ir.IntType(8)] + # 无 vtable 且 class_members 为空:常见于 register_method 早期 + # 调用 _generate_structs(此时 class_members[ClassName]=[] 但尚未 + # 填充实际字段)。保持 opaque,避免 set_body(*[i8]) 永久损坏 struct + # (llvmlite 的 set_body 只能调用一次)。后续 _generate_structs 调用 + # 会从 class_members 或 stub 设置正确 body。 + member_types = [] # 获取之前创建的 struct 并设置成员 struct_type: ir.IdentifiedStructType = self.structs[ClassName] @@ -454,10 +478,26 @@ class StructGenMixin: import_handler: Any = self._import_handler_ref if import_handler is not None and ClassName not in self._classes_in_progress: try: - import_handler._TryLoadStructFromStub(ClassName, self) + # 传入 source_sha1 确保从正确的 stub 文件加载完整定义 + _src_sha1: str = self.class_sha1_map.get(ClassName, '') + import_handler._TryLoadStructFromStub(ClassName, self, source_sha1=_src_sha1 or None) except Exception: pass struct_type = self.structs.get(ClassName, struct_type) + # 检测 stub body 中的 T* 占位类型(未特化的泛型类型参数)。 + # 若 stub 使用了未特化的基类(如 GSListNode 而非 GSListNode[BasicBlock]), + # 清除 _elements 让 set_body 用正确的 class_members 重新设置。 + if struct_type.elements is not None and member_types: + _has_t_placeholder_post: bool = False + for _elem_post in struct_type.elements: + if isinstance(_elem_post, ir.PointerType) and isinstance(_elem_post.pointee, ir.IdentifiedStructType): + _pname_post: str = _elem_post.pointee.name + _short_post: str = _pname_post.rsplit('.', 1)[-1] if '.' in _pname_post else _pname_post + if _short_post == 'T': + _has_t_placeholder_post = True + break + if _has_t_placeholder_post: + struct_type._elements = None if struct_type.elements is None: # 防御性检查:member_types 为空时不调用 set_body。 # set_body(*[]) 会设置 elements=() 使 is_opaque=False, @@ -485,18 +525,20 @@ class StructGenMixin: # _shared_class_vtable 和 _shared_cross_module_vtable,导致 class_vtable 与 # _cross_module_vtable_classes 内容相同,无法用以区分本模块类与跨模块类。 # _generate_structs 会为所有 class_methods 的类创建空 struct type,导致 self.structs - # 也包含所有类。唯一可靠的过滤条件是 self.functions:_EmitClassLlvm 在本函数之前 - # 调用(LlvmGenerator.py L178-182),本模块定义的类方法已加入 self.functions; - # import 声明的跨模块类方法也在 self.functions 中。若 self.functions 中没有任何 - # 以 "{ClassName}." 开头的键,说明本模块既未定义也未导入该类的方法,虚表会保持 - # 全 null,虚表分派时调用 null 指针引发段错误。此时应跳过虚表创建,让链接器 - # 从定义该类的模块解析虚表符号。 + # 也包含所有类。过滤条件是 self.functions:只考虑本模块定义的函数(define,有函数体), + # 跳过跨模块的 declare(无函数体)。跨模块类的 declare 通过 HandlesImports 加入 + # self.functions(短名如 "MemManager.alloc"),但其 is_declaration=True。 + # 若只存在 declare 而无 define,说明本模块未定义该类,虚表应由定义模块创建。 + # vtable linkage='internal',跨模块调用通过对象的 vtable 指针(首字段)完成分派, + # 不依赖本模块的 vtable 全局变量。 has_local_method: bool = False prefix: str = f"{ClassName}." - for func_name in self.functions: + for func_name, func_obj in self.functions.items(): if func_name.startswith(prefix): - has_local_method = True - break + # 跳过跨模块的 declare(无函数体),只考虑本模块定义的函数 + if not getattr(func_obj, 'is_declaration', False): + has_local_method = True + break if not has_local_method: continue VtableType: ir.ArrayType = ir.ArrayType(ir.PointerType(ir.IntType(8)), len(methods)) diff --git a/lib/includes/t.py b/lib/includes/t.py index 2e1486d..bf1f894 100644 --- a/lib/includes/t.py +++ b/lib/includes/t.py @@ -3,7 +3,7 @@ from __future__ import annotations import sys import types -from typing import Any, ClassVar, Optional, TypeVar, Generic, TypeAlias +from typing import Any, ClassVar, Optional, TypeVar, Generic, TypeAlias, Callable from lib.constants.config import mode as _ConfigMode from lib.core.VLogger import get_logger as _vlog diff --git a/regression_output.txt b/regression_output.txt new file mode 100644 index 0000000..270fed7 --- /dev/null +++ b/regression_output.txt @@ -0,0 +1,1710 @@ +====================================================================== +TransPyC 回归测试 +====================================================================== + +发现 45 个测试项目 + +====================================================================== +阶段一:编译所有项目 +====================================================================== +[1/45] 编译 ArgparseTest ... 通过 (7.9s) +[2/45] 编译 AstTest ... 失败 (42.8s) +[3/45] 编译 BuddyTest ... 通过 (8.0s) +[4/45] 编译 BuiltinDecoratorTest ... 通过 (5.9s) +[5/45] 编译 CPythonTest ... 通过 (8.8s) +[6/45] 编译 ClosureTest ... 通过 (5.0s) +[7/45] 编译 ClosureTest2 ... 通过 (5.4s) +[8/45] 编译 DecoratorMarkerTest ... 通过 (5.2s) +[9/45] 编译 DecoratorTest ... 通过 (6.8s) +[10/45] 编译 DictTest ... 失败 (10.9s) +[11/45] 编译 DocTest ... 通过 (5.6s) +[12/45] 编译 EdgeCaseTest ... 通过 (3.9s) +[13/45] 编译 EqTest ... 通过 (3.9s) +[14/45] 编译 FakeDuckTest ... 失败 (7.2s) +[15/45] 编译 ForAndLoopTest ... 通过 (5.0s) +[16/45] 编译 FormatStringTest ... 通过 (4.4s) +[17/45] 编译 FuncTest ... 通过 (4.7s) +[18/45] 编译 GenericTest ... 通过 (4.4s) +[19/45] 编译 GenericTest2 ... 通过 (4.8s) +[20/45] 编译 HashTableTest ... 通过 (5.1s) +[21/45] 编译 IterTest ... 通过 (4.8s) +[22/45] 编译 JsonTest ... 失败 (6.6s) +[23/45] 编译 LLvmLiteTest ... 通过 (21.8s) +[24/45] 编译 ListTest ... 通过 (4.2s) +[25/45] 编译 LoopTest ... 通过 (4.4s) +[26/45] 编译 MemhubTest ... 通过 (4.5s) +[27/45] 编译 NewAstTest ... 通过 (24.1s) +[28/45] 编译 NoVTableTest ... 通过 (3.5s) +[29/45] 编译 PointerTest ... 通过 (4.3s) +[30/45] 编译 ShortCircuitTest ... 通过 (4.9s) +[31/45] 编译 SimdTest ... 失败 (13.1s) +[32/45] 编译 SprintfTest ... 通过 (4.8s) +[33/45] 编译 StringIterTest ... 通过 (4.8s) +[34/45] 编译 StringTest ... 通过 (4.6s) +[35/45] 编译 StructTest ... 通过 (4.9s) +[36/45] 编译 SysLibTest ... 通过 (9.7s) +[37/45] 编译 TestFBProject ... 通过 (4.5s) +[38/45] 编译 TestProject ... 失败 (14.8s) +[39/45] 编译 TestProject2 ... 失败 (12.1s) +[40/45] 编译 TestProject3 ... 通过 (12.0s) +[41/45] 编译 TypeCastTest ... 通过 (8.1s) +[42/45] 编译 VRandomTest ... 通过 (9.5s) +[43/45] 编译 VariadicTest ... 通过 (7.8s) +[44/45] 编译 WebTest ... 通过 (9.4s) +[45/45] 编译 ZlibTest ... 通过 (10.0s) + +编译阶段: 通过 38, 失败 7 + +====================================================================== +阶段二:运行所有可执行文件 +====================================================================== +找到 38 个可执行文件 + + ArgparseTest: 通过 + BuddyTest: 通过 + BuiltinDecoratorTest: 通过 + CPythonTest: 通过 + ClosureTest: 通过 + ClosureTest2: 通过 + DecoratorMarkerTest: 通过 + DecoratorTest: 通过 + DocTest: 通过 + EdgeCaseTest: 通过 + EqTest: 通过 + ForAndLoopTest: 通过 + FormatStringTest: 通过 + FuncTest: 通过 + GenericTest: 通过 + GenericTest2: 通过 + HashTableTest: 通过 + IterTest: 通过 + LLvmLiteTest: 失败 + ListTest: 通过 + LoopTest: 通过 + MemhubTest: 通过 + NewAstTest: 通过 + NoVTableTest: 通过 + PointerTest: 通过 + ShortCircuitTest: 通过 + SprintfTest: 通过 + StringIterTest: 通过 + StringTest: 通过 + StructTest: 失败 + SysLibTest: 通过 + TestFBProject: 通过 + TestProject3: 通过 + TypeCastTest: 通过 + VRandomTest: 通过 + VariadicTest: 通过 + WebTest: 通过 + ZlibTest: 通过 + +运行阶段: 通过 36, 失败 2 + +====================================================================== +回归测试报告 +====================================================================== +总计: 45 通过: 36 失败: 9 + +---------------------------------------------------------------------- +失败项目详情: +---------------------------------------------------------------------- + +【AstTest】编译失败 + ... (省略前 4 行) ... + ├ INFO: 输出目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\AstTest\output + ├ INFO: 阶段: all + ├ INFO: 编译器: llc -filetype=obj -relocation-model=pic + ├ INFO: 目标三元组: x86_64-pc-windows-gnu + ├ INFO: 数据布局: e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128 + ├ INFO: output: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\AstTest\output + ├ INFO: temp: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\AstTest\temp + ├ INFO: 清理完成 + ├ INFO: 找到 1 个可达源文件(从入口遍历) + ├ INFO: [1/1] 生成签名: main.py + ├ INFO: -> 0853acdbdfc9b27c.pyi (签名) + ├ INFO: 处理 24 个被引用的 Python 库文件 + ├ INFO: 生成签名: ast\__init__.py -> 34548789d646f432.pyi + ├ INFO: 生成签名: ast\astaux.py -> 4337fb260448bbe2.pyi + ├ INFO: 生成签名: ast\base.py -> 5dab8cb390496d22.pyi + ├ INFO: 生成签名: ast\exprs.py -> 47767b5026a8ee15.pyi + ├ INFO: 生成签名: ast\lexer.py -> 0c212981c180e7fb.pyi + ├ INFO: 生成签名: ast\match.py -> 4dd6b3f1427d1cc5.pyi + ├ INFO: 生成签名: ast\parser.py -> ee52c08239684346.pyi + ├ INFO: 生成签名: ast\stmts.py -> 657e182b27c2a022.pyi + ├ INFO: 生成签名: ast\tokens.py -> b547ac4f380bddb6.pyi + ├ INFO: 缓存命中(全局): atom.py -> 271ea3decb810db2.pyi + ├ INFO: 缓存命中(全局): memhub.py -> f3560b99de458aec.pyi + ├ INFO: 生成签名: platmacro.py -> 93c1d18e35d188d6.pyi + ├ INFO: 生成签名: posix.py -> 6503c97dde0c79c4.pyi + ├ INFO: 生成签名: stdarg.py -> 71e0a3ffcb3ebfad.pyi + ├ INFO: 缓存命中(全局): stdint.py -> f5522571bcce7bcb.pyi + ├ INFO: 缓存命中(全局): stdio.py -> 6f62fe05c5ea1ceb.pyi + ├ INFO: 缓存命中(全局): stdlib.py -> 90c53dd6db8d41cf.pyi + ├ INFO: 缓存命中(全局): string.py -> 9474791561654346.pyi + ├ INFO: 生成签名: sys.py -> b5a965302cded36b.pyi + ├ INFO: 缓存命中(全局): viperio.py -> c9f4be41ca1cc2b4.pyi + ├ INFO: 生成签名: viperlib.py -> c3b259b4059f8668.pyi + ├ INFO: 缓存命中(全局): w32\win32base.py -> 7e529fe7a078cfef.pyi + ├ INFO: 缓存命中(全局): w32\win32console.py -> bbdf3bbd4c3bc28c.pyi + ├ INFO: 缓存命中(全局): w32\win32process.py -> 067c78e9f121dce3.pyi + ├ INFO: 结构体注册表: 103 个类型, 7 个枚举 + ├ INFO: -> 0853acdbdfc9b27c.stub.ll (声明) + ├ INFO: 生成声明: ast\__init__.py -> 34548789d646f432.stub.ll + ├ INFO: 生成声明: ast\astaux.py -> 4337fb260448bbe2.stub.ll + ├ INFO: 生成声明: ast\base.py -> 5dab8cb390496d22.stub.ll + ├ INFO: 生成声明: ast\exprs.py -> 47767b5026a8ee15.stub.ll + ├ INFO: 生成声明: ast\lexer.py -> 0c212981c180e7fb.stub.ll + ├ INFO: 生成声明: ast\match.py -> 4dd6b3f1427d1cc5.stub.ll + ├ INFO: 生成声明: ast\parser.py -> ee52c08239684346.stub.ll + ├ INFO: 生成声明: ast\stmts.py -> 657e182b27c2a022.stub.ll + ├ INFO: 生成声明: ast\tokens.py -> b547ac4f380bddb6.stub.ll + ├ INFO: 缓存命中(全局): atom.py -> 271ea3decb810db2.stub.ll + ├ INFO: 缓存命中(全局): memhub.py -> f3560b99de458aec.stub.ll + ├ INFO: 生成声明: platmacro.py -> 93c1d18e35d188d6.stub.ll + ├ INFO: 生成声明: posix.py -> 6503c97dde0c79c4.stub.ll + ├ INFO: 生成声明: stdarg.py -> 71e0a3ffcb3ebfad.stub.ll + ├ INFO: 缓存命中(全局): stdint.py -> f5522571bcce7bcb.stub.ll + ├ INFO: 缓存命中(全局): stdio.py -> 6f62fe05c5ea1ceb.stub.ll + ├ INFO: 缓存命中(全局): stdlib.py -> 90c53dd6db8d41cf.stub.ll + ├ INFO: 缓存命中(全局): string.py -> 9474791561654346.stub.ll + ├ INFO: 生成声明: sys.py -> b5a965302cded36b.stub.ll + ├ INFO: 缓存命中(全局): viperio.py -> c9f4be41ca1cc2b4.stub.ll + ├ INFO: 生成声明: viperlib.py -> c3b259b4059f8668.stub.ll + ├ INFO: 缓存命中(全局): w32\win32base.py -> 7e529fe7a078cfef.stub.ll + ├ INFO: 缓存命中(全局): w32\win32console.py -> bbdf3bbd4c3bc28c.stub.ll + ├ INFO: 生成声明: w32\win32process.py -> 067c78e9f121dce3.stub.ll + ├ SUCCESS: 声明接口生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\AstTest\temp + ├ INFO: SHA1 映射表 (25 个文件): + ├ INFO: 找到 1 个可达源文件(已按依赖排序) + ├ INFO: 处理顺序: + ├ INFO: 1. main.py + ├ INFO: 过滤旧文件: stub 29->25, sig 42->25 + ├ INFO: [缓存] 构建共享符号表数据... + ├ INFO: [缓存] 共享符号表构建完成 (0.72s, 2373 符号, 5 泛型模板, 10 doc 元数据) + ├ INFO: + 需要翻译 1 个文件 + ├ INFO: -> 0853acdbdfc9b27c.ll + ├ INFO: [1/1] main.py (2.2s) + ├ INFO: 翻译总耗时: 2.2s + ├ INFO: + [阶段二完成] .ll 文件生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\AstTest\output + ├ INFO: [includes] 发现 Python 源文件: stdint.py + ├ INFO: [includes] 发现 Python 源文件: sys.py + ├ INFO: [includes] 发现 Python 源文件: string.py + ├ INFO: [includes] 发现 Python 包文件: w32\fileio.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32base.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32console.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32file.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32memory.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32process.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32sync.py + ├ INFO: [includes] 发现 Python 包文件: w32\winsock2.py + ├ INFO: [includes] 发现 Python 包文件: ast\astaux.py + ├ INFO: [includes] 发现 Python 包文件: ast\base.py + ├ INFO: [includes] 发现 Python 包文件: ast\exprs.py + ├ INFO: [includes] 发现 Python 包文件: ast\lexer.py + ├ INFO: [includes] 发现 Python 包文件: ast\match.py + ├ INFO: [includes] 发现 Python 包文件: ast\parser.py + ├ INFO: [includes] 发现 Python 包文件: ast\stmts.py + ├ INFO: [includes] 发现 Python 包文件: ast\tokens.py + ├ INFO: [includes] 发现 Python 包文件: ast\__init__.py + ├ INFO: [includes] 发现 Python 源文件: memhub.py + ├ INFO: [includes] 发现 Python 源文件: stdio.py + ├ INFO: [includes] 发现 Python 源文件: stdlib.py + ├ INFO: [includes] 发现间接依赖: platmacro.py + ├ INFO: [includes] 发现间接依赖: posix.py + ├ INFO: [includes] 发现间接依赖: viperlib.py + ├ INFO: [includes] 发现间接依赖: viperio.py + ├ INFO: [includes] 发现间接依赖: stdarg.py + ├ INFO: [includes] 发现间接依赖: atom.py + ├ INFO: + [includes 编译] 找到 29 个 Python 源文件 + ├ INFO: 跳过(预编译): atom.py -> 271ea3decb810db2.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(声明文件): platmacro.py + ├ INFO: 跳过(声明文件): stdarg.py + ├ INFO: 跳过(声明文件): stdint.py + ├ INFO: 跳过(声明文件): stdio.py + ├ INFO: 跳过(声明文件): stdlib.py + ├ INFO: 跳过(预编译): string.py -> 9474791561654346.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): viperio.py -> c9f4be41ca1cc2b4.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): memhub.py -> f3560b99de458aec.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32base.py -> 7e529fe7a078cfef.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32console.py -> bbdf3bbd4c3bc28c.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 翻译 18 个文件 + ├ INFO: -> 6503c97dde0c79c4.ll + ├ INFO: [1/18] 翻译完成: posix.py + ├ INFO: -> b547ac4f380bddb6.ll + ├ INFO: [2/18] 翻译完成: tokens.py + ├ INFO: -> 06f53cc594b4ac6c.ll + ├ INFO: [3/18] 翻译完成: win32sync.py + ├ INFO: -> 067c78e9f121dce3.ll + ├ INFO: [4/18] 翻译完成: win32process.py + ├ INFO: -> 6446627d4f07a1b5.ll + ├ INFO: [5/18] 翻译完成: winsock2.py + ├ INFO: -> 72e2d5ccb7cedcf1.ll + ├ INFO: [6/18] 翻译完成: win32memory.py + ├ INFO: -> f6b51804a0ba8ff0.ll + ├ INFO: [7/18] 翻译完成: win32file.py + ├ INFO: -> b5a965302cded36b.ll + ├ INFO: [8/18] 翻译完成: sys.py + ├ INFO: -> 0c212981c180e7fb.ll + ├ INFO: [9/18] 翻译完成: lexer.py + ├ INFO: -> c3b259b4059f8668.ll + ├ INFO: [10/18] 翻译完成: viperlib.py + ├ INFO: -> 0035c95a18d4f8e8.ll + ├ INFO: [11/18] 翻译完成: fileio.py + ├ INFO: -> 5dab8cb390496d22.ll + ├ INFO: [12/18] 翻译完成: base.py + ├ WARN: HandlesBase: 忽略异常 'NoneType' object is not subscriptable + ├ INFO: -> 4dd6b3f1427d1cc5.ll + ├ INFO: [13/18] 翻译完成: match.py + ├ INFO: -> 4337fb260448bbe2.ll + ├ INFO: [14/18] 翻译完成: astaux.py + ├ INFO: -> 657e182b27c2a022.ll + ├ INFO: [15/18] 翻译完成: stmts.py + ├ INFO: -> 47767b5026a8ee15.ll + ├ INFO: [16/18] 翻译完成: exprs.py + ├ WARN: HandlesBase: 忽略异常 'NoneType' object is not subscriptable + ├ INFO: -> ee52c08239684346.ll + ├ INFO: [17/18] 翻译完成: parser.py + ├ WARN: HandlesBase: 忽略异常 'NoneType' object is not subscriptable + ├ INFO: -> 34548789d646f432.ll + ├ INFO: [18/18] 翻译完成: __init__.py + ├ INFO: 编译 18 个 .ll 文件 + ├ SUCCESS: [1/18] 编译成功: posix.py + ├ SUCCESS: [2/18] 编译成功: astaux.py + ├ SUCCESS: [3/18] 编译成功: lexer.py + ├ SUCCESS: [4/18] 编译成功: base.py + ├ SUCCESS: [5/18] 编译成功: tokens.py + ├ SUCCESS: [6/18] 编译成功: match.py + ├ WARN: [7/18] 编译失败: stmts.py: llc.exe: error: llc.exe: D:\Users\TermiNexus\Desktop\TransPyC\Test\AstTest\output\657e182b27c2a022_dso.ll:4476:1: error: expected instruction opcode + } + ^ + ├ WARN: [8/18] 编译失败: parser.py: llc.exe: error: llc.exe: D:\Users\TermiNexus\Desktop\TransPyC\Test\AstTest\output\ee52c08239684346_dso.ll:4282:1: error: expected instruction opcode + } + ^ + ├ WARN: [9/18] 编译失败: __init__.py: llc.exe: error: llc.exe: D:\Users\TermiNexus\Desktop\TransPyC\Test\AstTest\output\34548789d646f432_dso.ll:1865:1: error: expected instruction opcode + } + ^ + ├ SUCCESS: [10/18] 编译成功: viperlib.py + ├ SUCCESS: [11/18] 编译成功: exprs.py + ├ SUCCESS: [12/18] 编译成功: win32memory.py + ├ SUCCESS: [13/18] 编译成功: fileio.py + ├ SUCCESS: [14/18] 编译成功: win32file.py + ├ SUCCESS: [15/18] 编译成功: sys.py + ├ SUCCESS: [16/18] 编译成功: win32process.py + ├ SUCCESS: [17/18] 编译成功: win32sync.py + ├ SUCCESS: [18/18] 编译成功: winsock2.py + ├ WARN: 保留失败文件以便调试: D:\Users\TermiNexus\Desktop\TransPyC\Test\AstTest\output\657e182b27c2a022.ll + ├ WARN: 保留失败文件以便调试: D:\Users\TermiNexus\Desktop\TransPyC\Test\AstTest\output\ee52c08239684346.ll + ├ WARN: 保留失败文件以便调试: D:\Users\TermiNexus\Desktop\TransPyC\Test\AstTest\output\34548789d646f432.ll + ├ ERROR: + includes 文件编译失败 + [FATAL] 方法体编译失败 (list[str].append): TypeError: 'NoneType' object is not subscriptable + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 32, in HandleBodyLlvm + self.Trans.IfHandler._HandleIfLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesIf.py", line 193, in _HandleIfLlvm + self.Trans.BodyHandler.HandleBodyLlvm(Node.body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 30, in HandleBodyLlvm + self.Trans.AnnAssignHandler._HandleAnnAssignLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 289, in _HandleAnnAssignLlvm + self._HandleAnnAssignLlvmInner(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 487, in _HandleAnnAssignLlvmInner + InitValue = self.HandleExprLlvm(Node.value, VarType=VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBase.py", line 526, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 490, in _HandleCallLlvm + return self._HandleMethodCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 2509, in _HandleMethodCallLlvm + VtableSlotPtr = Gen.builder.gep(ObjVal, [ir.Constant(ir.IntType(32), 0), ir.Constant(ir.IntType(32), 0)], name=f"vtable_slot_{ClassName}") + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\builder.py", line 927, in gep + instr = instructions.GEPInstr(self.block, ptr, indices, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\instructions.py", line 563, in __init__ + lasttyp, typ = typ, typ.gep(i) + ^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\types.py", line 633, in gep + return self.elements[i.constant] + ~~~~~~~~~~~~~^^^^^^^^^^^^ + TypeError: 'NoneType' object is not subscriptable + [FATAL] 方法体编译失败 (list[str].append): TypeError: 'NoneType' object is not subscriptable + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 32, in HandleBodyLlvm + self.Trans.IfHandler._HandleIfLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesIf.py", line 193, in _HandleIfLlvm + self.Trans.BodyHandler.HandleBodyLlvm(Node.body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 30, in HandleBodyLlvm + self.Trans.AnnAssignHandler._HandleAnnAssignLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 289, in _HandleAnnAssignLlvm + self._HandleAnnAssignLlvmInner(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 487, in _HandleAnnAssignLlvmInner + InitValue = self.HandleExprLlvm(Node.value, VarType=VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBase.py", line 526, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 490, in _HandleCallLlvm + return self._HandleMethodCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 2509, in _HandleMethodCallLlvm + VtableSlotPtr = Gen.builder.gep(ObjVal, [ir.Constant(ir.IntType(32), 0), ir.Constant(ir.IntType(32), 0)], name=f"vtable_slot_{ClassName}") + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\builder.py", line 927, in gep + instr = instructions.GEPInstr(self.block, ptr, indices, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\instructions.py", line 563, in __init__ + lasttyp, typ = typ, typ.gep(i) + ^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\types.py", line 633, in gep + return self.elements[i.constant] + ~~~~~~~~~~~~~^^^^^^^^^^^^ + TypeError: 'NoneType' object is not subscriptable + [FATAL] 方法体编译失败 (list[str].append): TypeError: 'NoneType' object is not subscriptable + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 32, in HandleBodyLlvm + self.Trans.IfHandler._HandleIfLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesIf.py", line 193, in _HandleIfLlvm + self.Trans.BodyHandler.HandleBodyLlvm(Node.body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 30, in HandleBodyLlvm + self.Trans.AnnAssignHandler._HandleAnnAssignLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 289, in _HandleAnnAssignLlvm + self._HandleAnnAssignLlvmInner(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 487, in _HandleAnnAssignLlvmInner + InitValue = self.HandleExprLlvm(Node.value, VarType=VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBase.py", line 526, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 490, in _HandleCallLlvm + return self._HandleMethodCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 2509, in _HandleMethodCallLlvm + VtableSlotPtr = Gen.builder.gep(ObjVal, [ir.Constant(ir.IntType(32), 0), ir.Constant(ir.IntType(32), 0)], name=f"vtable_slot_{ClassName}") + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\builder.py", line 927, in gep + instr = instructions.GEPInstr(self.block, ptr, indices, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\instructions.py", line 563, in __init__ + lasttyp, typ = typ, typ.gep(i) + ^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\types.py", line 633, in gep + return self.elements[i.constant] + ~~~~~~~~~~~~~^^^^^^^^^^^^ + TypeError: 'NoneType' object is not subscriptable + +【DictTest】编译失败 + ├ INFO: 读取配置文件: D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\project.json + ├ INFO: 项目目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest + ├ INFO: 源目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\App + ├ INFO: 临时目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\temp + ├ INFO: 输出目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\output + ├ INFO: 阶段: all + ├ INFO: 编译器: llc -filetype=obj -relocation-model=pic + ├ INFO: 目标三元组: x86_64-pc-windows-gnu + ├ INFO: 数据布局: e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128 + ├ INFO: output: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\output + ├ INFO: temp: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\temp + ├ INFO: 清理完成 + ├ INFO: 找到 1 个可达源文件(从入口遍历) + ├ INFO: [1/1] 生成签名: main.py + ├ INFO: -> b3c2b99b6f3be4c7.pyi (签名) + ├ INFO: 处理 14 个被引用的 Python 库文件 + ├ INFO: 生成签名: _dict.py -> e3e7b6de8d7d8b03.pyi + ├ INFO: 缓存命中(全局): atom.py -> 271ea3decb810db2.pyi + ├ INFO: 生成签名: json\__init__.py -> 57288496f7c2d1ad.pyi + ├ INFO: 生成签名: json\__parser.py -> 240a9a4157959a9f.pyi + ├ INFO: 生成签名: json\__writer.py -> 20cd49775c100a38.pyi + ├ INFO: 缓存命中(全局): memhub.py -> f3560b99de458aec.pyi + ├ INFO: 缓存命中(全局): stdint.py -> f5522571bcce7bcb.pyi + ├ INFO: 缓存命中(全局): stdio.py -> 6f62fe05c5ea1ceb.pyi + ├ INFO: 缓存命中(全局): stdlib.py -> 90c53dd6db8d41cf.pyi + ├ INFO: 缓存命中(全局): string.py -> 9474791561654346.pyi + ├ INFO: 缓存命中(全局): testcheck.py -> 14d33679f7fadf1f.pyi + ├ INFO: 缓存命中(全局): viperio.py -> c9f4be41ca1cc2b4.pyi + ├ INFO: 缓存命中(全局): w32\win32base.py -> 7e529fe7a078cfef.pyi + ├ INFO: 缓存命中(全局): w32\win32console.py -> bbdf3bbd4c3bc28c.pyi + ├ INFO: 结构体注册表: 24 个类型, 0 个枚举 + ├ INFO: -> b3c2b99b6f3be4c7.stub.ll (声明) + ├ INFO: 生成声明: _dict.py -> e3e7b6de8d7d8b03.stub.ll + ├ INFO: 缓存命中(全局): atom.py -> 271ea3decb810db2.stub.ll + ├ INFO: 生成声明: json\__init__.py -> 57288496f7c2d1ad.stub.ll + ├ INFO: 生成声明: json\__parser.py -> 240a9a4157959a9f.stub.ll + ├ INFO: 生成声明: json\__writer.py -> 20cd49775c100a38.stub.ll + ├ INFO: 缓存命中(全局): memhub.py -> f3560b99de458aec.stub.ll + ├ INFO: 缓存命中(全局): stdint.py -> f5522571bcce7bcb.stub.ll + ├ INFO: 缓存命中(全局): stdio.py -> 6f62fe05c5ea1ceb.stub.ll + ├ INFO: 缓存命中(全局): stdlib.py -> 90c53dd6db8d41cf.stub.ll + ├ INFO: 缓存命中(全局): string.py -> 9474791561654346.stub.ll + ├ INFO: 缓存命中(全局): testcheck.py -> 14d33679f7fadf1f.stub.ll + ├ INFO: 缓存命中(全局): viperio.py -> c9f4be41ca1cc2b4.stub.ll + ├ INFO: 缓存命中(全局): w32\win32base.py -> 7e529fe7a078cfef.stub.ll + ├ INFO: 缓存命中(全局): w32\win32console.py -> bbdf3bbd4c3bc28c.stub.ll + ├ SUCCESS: 声明接口生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\temp + ├ INFO: SHA1 映射表 (15 个文件): + ├ INFO: 找到 1 个可达源文件(已按依赖排序) + ├ INFO: 处理顺序: + ├ INFO: 1. main.py + ├ INFO: 过滤旧文件: stub 34->15, sig 56->15 + ├ INFO: [缓存] 构建共享符号表数据... + ├ INFO: [缓存] 共享符号表构建完成 (0.53s, 677 符号, 5 泛型模板, 20 doc 元数据) + ├ INFO: + 需要翻译 1 个文件 + ├ ERROR: main.py: Type of #1 arg mismatch: i8* != %"e3e7b6de8d7d8b03.dict"* + 源代码 (D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\App\main.py, line 14): + 14 | w32.win32console.SetConsoleOutputCP(65001) + Type of #1 arg mismatch: i8* != %"e3e7b6de8d7d8b03.dict"* + 源代码 (D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\App\main.py, line 26): + 26 | d.set_int("beta", 20) + Type of #1 arg mismatch: i8* != %"e3e7b6de8d7d8b03.dict"* + ├ INFO: 翻译总耗时: 1.2s + ├ INFO: + [阶段二完成] .ll 文件生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\output + ├ INFO: [includes] 发现 Python 包文件: w32\fileio.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32base.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32console.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32file.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32memory.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32process.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32sync.py + ├ INFO: [includes] 发现 Python 包文件: w32\winsock2.py + ├ INFO: [includes] 发现 Python 源文件: string.py + ├ INFO: [includes] 发现 Python 源文件: testcheck.py + ├ INFO: [includes] 发现 Python 源文件: stdlib.py + ├ INFO: [includes] 发现 Python 源文件: memhub.py + ├ INFO: [includes] 发现 Python 源文件: _dict.py + ├ INFO: [includes] 发现 Python 源文件: stdio.py + ├ INFO: [includes] 发现 Python 源文件: stdint.py + ├ INFO: [includes] 发现 Python 包文件: json\__init__.py + ├ INFO: [includes] 发现 Python 包文件: json\__parser.py + ├ INFO: [includes] 发现 Python 包文件: json\__writer.py + ├ INFO: [includes] 发现间接依赖: atom.py + ├ INFO: [includes] 发现间接依赖: viperio.py + ├ INFO: + [includes 编译] 找到 20 个 Python 源文件 + ├ INFO: 跳过(预编译): atom.py -> 271ea3decb810db2.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(声明文件): stdint.py + ├ INFO: 跳过(声明文件): stdio.py + ├ INFO: 跳过(声明文件): stdlib.py + ├ INFO: 跳过(预编译): string.py -> 9474791561654346.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): viperio.py -> c9f4be41ca1cc2b4.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): memhub.py -> f3560b99de458aec.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32base.py -> 7e529fe7a078cfef.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32console.py -> bbdf3bbd4c3bc28c.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): testcheck.py -> 14d33679f7fadf1f.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32file.py -> f6b51804a0ba8ff0.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): fileio.py -> 0035c95a18d4f8e8.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32memory.py -> 72e2d5ccb7cedcf1.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32process.py -> 067c78e9f121dce3.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32sync.py -> 06f53cc594b4ac6c.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): winsock2.py -> 6446627d4f07a1b5.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 翻译 4 个文件 + ├ INFO: -> e3e7b6de8d7d8b03.ll + ├ INFO: [1/4] 翻译完成: _dict.py + ├ INFO: -> 20cd49775c100a38.ll + ├ INFO: [2/4] 翻译完成: __writer.py + ├ INFO: -> 240a9a4157959a9f.ll + ├ INFO: [3/4] 翻译完成: __parser.py + ├ INFO: -> 57288496f7c2d1ad.ll + ├ INFO: [4/4] 翻译完成: __init__.py + ├ INFO: 编译 4 个 .ll 文件 + ├ SUCCESS: [1/4] 编译成功: __writer.py + ├ SUCCESS: [2/4] 编译成功: __init__.py + ├ SUCCESS: [3/4] 编译成功: __parser.py + ├ SUCCESS: [4/4] 编译成功: _dict.py + ├ INFO: [清理] 删除 4 个过时文件 + ├ INFO: [编译] 无 .ll 文件需要重新编译 + ├ INFO: + [链接] 找到 0 个 .obj 文件 + ├ INFO: [链接] 额外库文件: 17 个 + ├ INFO: - 271ea3decb810db2.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 9474791561654346.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - c9f4be41ca1cc2b4.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - f3560b99de458aec.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 7e529fe7a078cfef.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - bbdf3bbd4c3bc28c.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 14d33679f7fadf1f.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - f6b51804a0ba8ff0.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 0035c95a18d4f8e8.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 72e2d5ccb7cedcf1.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 067c78e9f121dce3.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 06f53cc594b4ac6c.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 6446627d4f07a1b5.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - e3e7b6de8d7d8b03.obj + ├ INFO: - 240a9a4157959a9f.obj + ├ INFO: - 20cd49775c100a38.obj + ├ INFO: - 57288496f7c2d1ad.obj + ├ INFO: 执行: clang++ -Wl,--allow-multiple-definition -o D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\output\DictTest.exe D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\271ea3decb810db2.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\9474791561654346.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\c9f4be41ca1cc2b4.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\f3560b99de458aec.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\7e529fe7a078cfef.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\bbdf3bbd4c3bc28c.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\14d33679f7fadf1f.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\f6b51804a0ba8ff0.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\0035c95a18d4f8e8.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\72e2d5ccb7cedcf1.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\067c78e9f121dce3.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\06f53cc594b4ac6c.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\6446627d4f07a1b5.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\output\e3e7b6de8d7d8b03.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\output\240a9a4157959a9f.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\output\20cd49775c100a38.obj D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\output\57288496f7c2d1ad.obj -lmsvcrt -lucrt -lpthread -lmingwex -lkernel32 + ├ ERROR: 链接失败: D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\output\e3e7b6de8d7d8b03.obj:e3e7b6de8d7d8b03_dso.ll:(.text+0xa64): undefined reference to `e3e7b6de8d7d8b03.write' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\output\e3e7b6de8d7d8b03.obj:e3e7b6de8d7d8b03_dso.ll:(.text+0xa8a): undefined reference to `e3e7b6de8d7d8b03.parse' + D:/msys64/mingw64/bin/ld: D:/msys64/mingw64/lib/libmingw32.a(lib64_libmingw32_a-crtexewin.o): in function `main': + D:/W/B/src/mingw-w64/mingw-w64-crt/crt/crtexewin.c:62:(.text.startup+0xb6): undefined reference to `WinMain' + clang++: error: linker command failed with exit code 1 (use -v to see invocation) + ├ ERROR: + 链接失败,立即终止编译。 + [FATAL] 方法体编译失败 (.main): TypeError: Type of #1 arg mismatch: i8* != %"e3e7b6de8d7d8b03.dict"* + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 30, in HandleBodyLlvm + self.Trans.AnnAssignHandler._HandleAnnAssignLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 289, in _HandleAnnAssignLlvm + self._HandleAnnAssignLlvmInner(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 487, in _HandleAnnAssignLlvmInner + InitValue = self.HandleExprLlvm(Node.value, VarType=VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBase.py", line 526, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 281, in _HandleCallLlvm + return self._HandleClassNewLlvm(Node, FuncName) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 3456, in _HandleClassNewLlvm + Gen.builder.call(NewFunc, [result], name=f"before_init_{ClassName}") + File "D:\Python312\Lib\site-packages\llvmlite\ir\builder.py", line 881, in call + inst = instructions.CallInstr(self.block, fn, args, name=name, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\instructions.py", line 105, in __init__ + raise TypeError(msg) + TypeError: Type of #1 arg mismatch: i8* != %"e3e7b6de8d7d8b03.dict"* + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Phase2Translator.py", line 1039, in _translate_file + result = trans.Convert( + ^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Shell\TransPyC.py", line 555, in Convert + code: str = self.translator.GenerateCCode(Tree, target='llvm') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Translator\LlvmGenerator.py", line 642, in GenerateCCode + return self.GenerateLlvmDirect(Tree) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Translator\LlvmGenerator.py", line 179, in GenerateLlvmDirect + self.FunctionHandler._EmitFunctionLlvm(Node, Gen) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 30, in HandleBodyLlvm + self.Trans.AnnAssignHandler._HandleAnnAssignLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 289, in _HandleAnnAssignLlvm + self._HandleAnnAssignLlvmInner(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 487, in _HandleAnnAssignLlvmInner + InitValue = self.HandleExprLlvm(Node.value, VarType=VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBase.py", line 526, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 281, in _HandleCallLlvm + return self._HandleClassNewLlvm(Node, FuncName) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 3456, in _HandleClassNewLlvm + Gen.builder.call(NewFunc, [result], name=f"before_init_{ClassName}") + File "D:\Python312\Lib\site-packages\llvmlite\ir\builder.py", line 881, in call + inst = instructions.CallInstr(self.block, fn, args, name=name, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\instructions.py", line 105, in __init__ + raise TypeError(msg) + TypeError: Type of #1 arg mismatch: i8* != %"e3e7b6de8d7d8b03.dict"* + + The above exception was the direct cause of the following exception: + + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Phase2Translator.py", line 467, in run + self._translate_file(src_path, out_path, prebuilt_ModuleSha1Map=msm) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Phase2Translator.py", line 1055, in _translate_file + raise type(e)(enriched) from e + TypeError: Type of #1 arg mismatch: i8* != %"e3e7b6de8d7d8b03.dict"* + 源代码 (D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\App\main.py, line 14): + 14 | w32.win32console.SetConsoleOutputCP(65001) + Type of #1 arg mismatch: i8* != %"e3e7b6de8d7d8b03.dict"* + 源代码 (D:\Users\TermiNexus\Desktop\TransPyC\Test\DictTest\App\main.py, line 26): + 26 | d.set_int("beta", 20) + Type of #1 arg mismatch: i8* != %"e3e7b6de8d7d8b03.dict"* + +【FakeDuckTest】编译失败 + ├ INFO: 读取配置文件: D:\Users\TermiNexus\Desktop\TransPyC\Test\FakeDuckTest\project.json + ├ INFO: 项目目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\FakeDuckTest + ├ INFO: 源目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\FakeDuckTest\App + ├ INFO: 临时目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\FakeDuckTest\temp + ├ INFO: 输出目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\FakeDuckTest\output + ├ INFO: 阶段: all + ├ INFO: 编译器: llc -filetype=obj -relocation-model=pic + ├ INFO: 目标三元组: x86_64-pc-windows-gnu + ├ INFO: 数据布局: e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128 + ├ INFO: output: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\FakeDuckTest\output + ├ INFO: temp: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\FakeDuckTest\temp + ├ INFO: 清理完成 + ├ INFO: 找到 1 个可达源文件(从入口遍历) + ├ INFO: [1/1] 生成签名: main.py + ├ INFO: -> 48352329f97d0858.pyi (签名) + ├ INFO: 处理 14 个被引用的 Python 库文件 + ├ INFO: 生成签名: _fakeduck.py -> 79b337e5ea8951e2.pyi + ├ INFO: 生成签名: _list.py -> f2ecbf8ced20575c.pyi + ├ INFO: 生成签名: _withcontent.py -> 5b2e220c5bae60c9.pyi + ├ INFO: 缓存命中(全局): atom.py -> 271ea3decb810db2.pyi + ├ INFO: 缓存命中(全局): memhub.py -> f3560b99de458aec.pyi + ├ INFO: 缓存命中(全局): stdint.py -> f5522571bcce7bcb.pyi + ├ INFO: 缓存命中(全局): stdio.py -> 6f62fe05c5ea1ceb.pyi + ├ INFO: 缓存命中(全局): stdlib.py -> 90c53dd6db8d41cf.pyi + ├ INFO: 缓存命中(全局): string.py -> 9474791561654346.pyi + ├ INFO: 缓存命中(全局): testcheck.py -> 14d33679f7fadf1f.pyi + ├ INFO: 缓存命中(全局): viperio.py -> c9f4be41ca1cc2b4.pyi + ├ INFO: 缓存命中(全局): w32\win32base.py -> 7e529fe7a078cfef.pyi + ├ INFO: 缓存命中(全局): w32\win32console.py -> bbdf3bbd4c3bc28c.pyi + ├ INFO: 缓存命中(全局): w32\win32process.py -> 067c78e9f121dce3.pyi + ├ INFO: 结构体注册表: 28 个类型, 0 个枚举 + ├ INFO: -> 48352329f97d0858.stub.ll (声明) + ├ INFO: 生成声明: _fakeduck.py -> 79b337e5ea8951e2.stub.ll + ├ INFO: 生成声明: _list.py -> f2ecbf8ced20575c.stub.ll + ├ INFO: 生成声明: _withcontent.py -> 5b2e220c5bae60c9.stub.ll + ├ INFO: 缓存命中(全局): atom.py -> 271ea3decb810db2.stub.ll + ├ INFO: 缓存命中(全局): memhub.py -> f3560b99de458aec.stub.ll + ├ INFO: 缓存命中(全局): stdint.py -> f5522571bcce7bcb.stub.ll + ├ INFO: 缓存命中(全局): stdio.py -> 6f62fe05c5ea1ceb.stub.ll + ├ INFO: 缓存命中(全局): stdlib.py -> 90c53dd6db8d41cf.stub.ll + ├ INFO: 缓存命中(全局): string.py -> 9474791561654346.stub.ll + ├ INFO: 缓存命中(全局): testcheck.py -> 14d33679f7fadf1f.stub.ll + ├ INFO: 缓存命中(全局): viperio.py -> c9f4be41ca1cc2b4.stub.ll + ├ INFO: 缓存命中(全局): w32\win32base.py -> 7e529fe7a078cfef.stub.ll + ├ INFO: 缓存命中(全局): w32\win32console.py -> bbdf3bbd4c3bc28c.stub.ll + ├ INFO: 缓存命中(全局): w32\win32process.py -> 067c78e9f121dce3.stub.ll + ├ SUCCESS: 声明接口生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\FakeDuckTest\temp + ├ INFO: SHA1 映射表 (15 个文件): + ├ INFO: 找到 1 个可达源文件(已按依赖排序) + ├ INFO: 处理顺序: + ├ INFO: 1. main.py + ├ INFO: 过滤旧文件: stub 37->15, sig 64->15 + ├ INFO: [缓存] 构建共享符号表数据... + ├ INFO: [缓存] 共享符号表构建完成 (0.21s, 725 符号, 5 泛型模板, 25 doc 元数据) + ├ INFO: + 需要翻译 1 个文件 + ├ INFO: -> 48352329f97d0858.ll + ├ INFO: [1/1] main.py (0.7s) + ├ INFO: 翻译总耗时: 0.7s + ├ INFO: + [阶段二完成] .ll 文件生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\FakeDuckTest\output + ├ INFO: [includes] 发现 Python 源文件: stdlib.py + ├ INFO: [includes] 发现 Python 源文件: _fakeduck.py + ├ INFO: [includes] 发现 Python 源文件: memhub.py + ├ INFO: [includes] 发现 Python 源文件: _list.py + ├ INFO: [includes] 发现 Python 源文件: testcheck.py + ├ INFO: [includes] 发现 Python 源文件: stdint.py + ├ INFO: [includes] 发现 Python 源文件: string.py + ├ INFO: [includes] 发现 Python 源文件: _withcontent.py + ├ INFO: [includes] 发现 Python 包文件: w32\fileio.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32base.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32console.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32file.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32memory.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32process.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32sync.py + ├ INFO: [includes] 发现 Python 包文件: w32\winsock2.py + ├ INFO: [includes] 发现 Python 源文件: stdio.py + ├ INFO: [includes] 发现间接依赖: atom.py + ├ INFO: [includes] 发现间接依赖: viperio.py + ├ INFO: + [includes 编译] 找到 19 个 Python 源文件 + ├ INFO: 跳过(预编译): atom.py -> 271ea3decb810db2.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(声明文件): stdint.py + ├ INFO: 跳过(声明文件): stdio.py + ├ INFO: 跳过(声明文件): stdlib.py + ├ INFO: 跳过(预编译): string.py -> 9474791561654346.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): viperio.py -> c9f4be41ca1cc2b4.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): memhub.py -> f3560b99de458aec.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32base.py -> 7e529fe7a078cfef.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32console.py -> bbdf3bbd4c3bc28c.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): testcheck.py -> 14d33679f7fadf1f.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32file.py -> f6b51804a0ba8ff0.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): fileio.py -> 0035c95a18d4f8e8.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32memory.py -> 72e2d5ccb7cedcf1.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32process.py -> 067c78e9f121dce3.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32sync.py -> 06f53cc594b4ac6c.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): winsock2.py -> 6446627d4f07a1b5.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 翻译 3 个文件 + ├ INFO: -> f2ecbf8ced20575c.ll + ├ INFO: [1/3] 翻译完成: _list.py + ├ INFO: -> 5b2e220c5bae60c9.ll + ├ INFO: [2/3] 翻译完成: _withcontent.py + ├ INFO: -> 79b337e5ea8951e2.ll + ├ INFO: [3/3] 翻译完成: _fakeduck.py + ├ INFO: 编译 3 个 .ll 文件 + ├ SUCCESS: [1/3] 编译成功: _list.py + ├ SUCCESS: [2/3] 编译成功: _withcontent.py + ├ SUCCESS: [3/3] 编译成功: _fakeduck.py + ├ INFO: [清理] 删除 3 个过时文件 + ├ INFO: + [编译] 找到 1 个 .ll 文件需要编译 + ├ INFO: 并行编译 1 个文件 (workers=1) + ├ ERROR: 48352329f97d0858.ll: llc.exe: error: llc.exe: D:\Users\TermiNexus\Desktop\TransPyC\Test\FakeDuckTest\output\48352329f97d0858_dso.ll:3065:62: error: use of undefined value '%call_enter' + %local_free_cast = bitcast %"f3560b99de458aec.MemManager"* %call_enter to i8* + ^ + ├ ERROR: + 1 个文件编译失败 + +【JsonTest】编译失败 + ├ INFO: 读取配置文件: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\project.json + ├ INFO: 项目目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest + ├ INFO: 源目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\App + ├ INFO: 临时目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\temp + ├ INFO: 输出目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output + ├ INFO: 阶段: all + ├ INFO: 编译器: llc -filetype=obj -relocation-model=pic + ├ INFO: 目标三元组: x86_64-pc-windows-gnu + ├ INFO: 数据布局: e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128 + ├ INFO: output: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output + ├ INFO: temp: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\temp + ├ INFO: 清理完成 + ├ INFO: 找到 1 个可达源文件(从入口遍历) + ├ INFO: [1/1] 生成签名: main.py + ├ INFO: -> 8a97754e9e3c2b9a.pyi (签名) + ├ INFO: 处理 13 个被引用的 Python 库文件 + ├ INFO: 缓存命中(全局): atom.py -> 271ea3decb810db2.pyi + ├ INFO: 缓存命中(全局): json\__init__.py -> 57288496f7c2d1ad.pyi + ├ INFO: 缓存命中(全局): json\__parser.py -> 240a9a4157959a9f.pyi + ├ INFO: 缓存命中(全局): json\__writer.py -> 20cd49775c100a38.pyi + ├ INFO: 缓存命中(全局): memhub.py -> f3560b99de458aec.pyi + ├ INFO: 缓存命中(全局): stdint.py -> f5522571bcce7bcb.pyi + ├ INFO: 缓存命中(全局): stdio.py -> 6f62fe05c5ea1ceb.pyi + ├ INFO: 缓存命中(全局): string.py -> 9474791561654346.pyi + ├ INFO: 缓存命中(全局): testcheck.py -> 14d33679f7fadf1f.pyi + ├ INFO: 缓存命中(全局): viperio.py -> c9f4be41ca1cc2b4.pyi + ├ INFO: 缓存命中(全局): w32\win32base.py -> 7e529fe7a078cfef.pyi + ├ INFO: 缓存命中(全局): w32\win32console.py -> bbdf3bbd4c3bc28c.pyi + ├ INFO: 缓存命中(全局): w32\win32memory.py -> 72e2d5ccb7cedcf1.pyi + ├ INFO: 结构体注册表: 24 个类型, 0 个枚举 + ├ INFO: -> 8a97754e9e3c2b9a.stub.ll (声明) + ├ INFO: 缓存命中(全局): atom.py -> 271ea3decb810db2.stub.ll + ├ INFO: 缓存命中(全局): json\__init__.py -> 57288496f7c2d1ad.stub.ll + ├ INFO: 缓存命中(全局): json\__parser.py -> 240a9a4157959a9f.stub.ll + ├ INFO: 缓存命中(全局): json\__writer.py -> 20cd49775c100a38.stub.ll + ├ INFO: 缓存命中(全局): memhub.py -> f3560b99de458aec.stub.ll + ├ INFO: 缓存命中(全局): stdint.py -> f5522571bcce7bcb.stub.ll + ├ INFO: 缓存命中(全局): stdio.py -> 6f62fe05c5ea1ceb.stub.ll + ├ INFO: 缓存命中(全局): string.py -> 9474791561654346.stub.ll + ├ INFO: 缓存命中(全局): testcheck.py -> 14d33679f7fadf1f.stub.ll + ├ INFO: 缓存命中(全局): viperio.py -> c9f4be41ca1cc2b4.stub.ll + ├ INFO: 缓存命中(全局): w32\win32base.py -> 7e529fe7a078cfef.stub.ll + ├ INFO: 缓存命中(全局): w32\win32console.py -> bbdf3bbd4c3bc28c.stub.ll + ├ INFO: 缓存命中(全局): w32\win32memory.py -> 72e2d5ccb7cedcf1.stub.ll + ├ SUCCESS: 声明接口生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\temp + ├ INFO: SHA1 映射表 (14 个文件): + ├ INFO: 找到 1 个可达源文件(已按依赖排序) + ├ INFO: 处理顺序: + ├ INFO: 1. main.py + ├ INFO: 过滤旧文件: stub 38->14, sig 73->14 + ├ INFO: [缓存] 构建共享符号表数据... + ├ INFO: [缓存] 共享符号表构建完成 (0.26s, 756 符号, 5 泛型模板, 33 doc 元数据) + ├ INFO: + 需要翻译 1 个文件 + ├ INFO: -> 8a97754e9e3c2b9a.ll + ├ INFO: [1/1] main.py (0.9s) + ├ INFO: 翻译总耗时: 0.9s + ├ INFO: + [阶段二完成] .ll 文件生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output + ├ INFO: [includes] 发现 Python 包文件: json\__init__.py + ├ INFO: [includes] 发现 Python 包文件: json\__parser.py + ├ INFO: [includes] 发现 Python 包文件: json\__writer.py + ├ INFO: [includes] 发现 Python 源文件: testcheck.py + ├ INFO: [includes] 发现 Python 包文件: w32\fileio.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32base.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32console.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32file.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32memory.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32process.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32sync.py + ├ INFO: [includes] 发现 Python 包文件: w32\winsock2.py + ├ INFO: [includes] 发现 Python 源文件: memhub.py + ├ INFO: [includes] 发现 Python 源文件: string.py + ├ INFO: [includes] 发现 Python 源文件: stdint.py + ├ INFO: [includes] 发现 Python 源文件: stdio.py + ├ INFO: [includes] 发现间接依赖: viperio.py + ├ INFO: [includes] 发现间接依赖: atom.py + ├ INFO: + [includes 编译] 找到 18 个 Python 源文件 + ├ INFO: 跳过(预编译): atom.py -> 271ea3decb810db2.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(声明文件): stdint.py + ├ INFO: 跳过(声明文件): stdio.py + ├ INFO: 跳过(预编译): string.py -> 9474791561654346.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): viperio.py -> c9f4be41ca1cc2b4.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): memhub.py -> f3560b99de458aec.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): __parser.py -> 240a9a4157959a9f.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): __writer.py -> 20cd49775c100a38.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): __init__.py -> 57288496f7c2d1ad.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32base.py -> 7e529fe7a078cfef.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32console.py -> bbdf3bbd4c3bc28c.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): testcheck.py -> 14d33679f7fadf1f.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32file.py -> f6b51804a0ba8ff0.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): fileio.py -> 0035c95a18d4f8e8.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32memory.py -> 72e2d5ccb7cedcf1.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32process.py -> 067c78e9f121dce3.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): win32sync.py -> 06f53cc594b4ac6c.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 跳过(预编译): winsock2.py -> 6446627d4f07a1b5.x86_64-pc-windows-gnu.pic.obj + ├ INFO: + [编译] 找到 1 个 .ll 文件需要编译 + ├ INFO: 并行编译 1 个文件 (workers=1) + ├ SUCCESS: 8a97754e9e3c2b9a.ll + ├ INFO: + [链接] 找到 1 个 .obj 文件 + ├ INFO: [链接] 额外库文件: 16 个 + ├ INFO: - 271ea3decb810db2.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 9474791561654346.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - c9f4be41ca1cc2b4.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - f3560b99de458aec.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 240a9a4157959a9f.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 20cd49775c100a38.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 57288496f7c2d1ad.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 7e529fe7a078cfef.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - bbdf3bbd4c3bc28c.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 14d33679f7fadf1f.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - f6b51804a0ba8ff0.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 0035c95a18d4f8e8.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 72e2d5ccb7cedcf1.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 067c78e9f121dce3.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 06f53cc594b4ac6c.x86_64-pc-windows-gnu.pic.obj + ├ INFO: - 6446627d4f07a1b5.x86_64-pc-windows-gnu.pic.obj + ├ INFO: 执行: clang++ -Wl,--allow-multiple-definition -Wl,--unresolved-symbols=ignore-in-object-files -o D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\JsonTest.exe D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\271ea3decb810db2.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\9474791561654346.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\c9f4be41ca1cc2b4.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\f3560b99de458aec.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\240a9a4157959a9f.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\20cd49775c100a38.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\57288496f7c2d1ad.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\7e529fe7a078cfef.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\bbdf3bbd4c3bc28c.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\14d33679f7fadf1f.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\f6b51804a0ba8ff0.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\0035c95a18d4f8e8.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\72e2d5ccb7cedcf1.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\067c78e9f121dce3.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\06f53cc594b4ac6c.x86_64-pc-windows-gnu.pic.obj D:\Users\TermiNexus\Desktop\TransPyC\includes.binary\6446627d4f07a1b5.x86_64-pc-windows-gnu.pic.obj -lmsvcrt -lucrt -lpthread -lmingwex -lkernel32 -luser32 -latomic + ├ ERROR: 链接失败: D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0x5f6): undefined reference to `8a97754e9e3c2b9a.parse' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0x652): undefined reference to `8a97754e9e3c2b9a.parse' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0x68e): undefined reference to `8a97754e9e3c2b9a.parse' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0x70e): undefined reference to `8a97754e9e3c2b9a.parse' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0x778): undefined reference to `8a97754e9e3c2b9a.parse' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0x7cc): more undefined references to `8a97754e9e3c2b9a.parse' follow + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0xa2f): undefined reference to `8a97754e9e3c2b9a.write' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0xa86): undefined reference to `8a97754e9e3c2b9a.write' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0xad8): undefined reference to `8a97754e9e3c2b9a.write' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0xb2a): undefined reference to `8a97754e9e3c2b9a.write' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0xb7a): undefined reference to `8a97754e9e3c2b9a.write' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0xc3c): more undefined references to `8a97754e9e3c2b9a.write' follow + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0xd57): undefined reference to `8a97754e9e3c2b9a.parse' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0x1178): undefined reference to `8a97754e9e3c2b9a.parse' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0x1222): undefined reference to `8a97754e9e3c2b9a.parse' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0x1292): undefined reference to `8a97754e9e3c2b9a.parse' + D:/msys64/mingw64/bin/ld: D:\Users\TermiNexus\Desktop\TransPyC\Test\JsonTest\output\8a97754e9e3c2b9a.obj:8a97754e9e3c2b9a_dso.ll:(.text+0x1302): undefined reference to `8a97754e9e3c2b9a.parse' + clang++: error: linker command failed with exit code 1 (use -v to see invocation) + ├ ERROR: + 链接失败,立即终止编译。 + +【SimdTest】编译失败 + ├ INFO: 读取配置文件: D:\Users\TermiNexus\Desktop\TransPyC\Test\SimdTest\project.json + ├ INFO: 项目目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\SimdTest + ├ INFO: 源目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\SimdTest\App + ├ INFO: 临时目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\SimdTest\temp + ├ INFO: 输出目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\SimdTest\output + ├ INFO: 阶段: all + ├ INFO: 编译器: llc -filetype=obj + ├ INFO: 目标三元组: x86_64-pc-windows-gnu + ├ INFO: 数据布局: e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128 + ├ INFO: output: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\SimdTest\output + ├ INFO: temp: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\SimdTest\temp + ├ INFO: 清理完成 + ├ INFO: 找到 1 个可达源文件(从入口遍历) + ├ INFO: [1/1] 生成签名: main.py + ├ INFO: -> 2fcb6780db4d937f.pyi (签名) + ├ INFO: 处理 13 个被引用的 Python 库文件 + ├ INFO: 缓存命中(全局): atom.py -> 271ea3decb810db2.pyi + ├ INFO: 缓存命中(全局): memhub.py -> f3560b99de458aec.pyi + ├ INFO: 生成签名: numpy\__init__.py -> c3a6aed1f1fb8b1e.pyi + ├ INFO: 缓存命中(全局): stdint.py -> f5522571bcce7bcb.pyi + ├ INFO: 缓存命中(全局): stdio.py -> 6f62fe05c5ea1ceb.pyi + ├ INFO: 缓存命中(全局): stdlib.py -> 90c53dd6db8d41cf.pyi + ├ INFO: 缓存命中(全局): string.py -> 9474791561654346.pyi + ├ INFO: 缓存命中(全局): testcheck.py -> 14d33679f7fadf1f.pyi + ├ INFO: 缓存命中(全局): viperio.py -> c9f4be41ca1cc2b4.pyi + ├ INFO: 生成签名: vipermath.py -> 3f7c5e78d8652535.pyi + ├ INFO: 生成签名: vipersimd.py -> c24f25b14b4bbd0a.pyi + ├ INFO: 缓存命中(全局): w32\win32base.py -> 7e529fe7a078cfef.pyi + ├ INFO: 缓存命中(全局): w32\win32console.py -> bbdf3bbd4c3bc28c.pyi + ├ INFO: 结构体注册表: 23 个类型, 0 个枚举 + ├ INFO: -> 2fcb6780db4d937f.stub.ll (声明) + ├ INFO: 缓存命中(全局): atom.py -> 271ea3decb810db2.stub.ll + ├ INFO: 缓存命中(全局): memhub.py -> f3560b99de458aec.stub.ll + ├ INFO: 生成声明: numpy\__init__.py -> c3a6aed1f1fb8b1e.stub.ll + ├ INFO: 缓存命中(全局): stdint.py -> f5522571bcce7bcb.stub.ll + ├ INFO: 缓存命中(全局): stdio.py -> 6f62fe05c5ea1ceb.stub.ll + ├ INFO: 缓存命中(全局): stdlib.py -> 90c53dd6db8d41cf.stub.ll + ├ INFO: 缓存命中(全局): string.py -> 9474791561654346.stub.ll + ├ INFO: 缓存命中(全局): testcheck.py -> 14d33679f7fadf1f.stub.ll + ├ INFO: 缓存命中(全局): viperio.py -> c9f4be41ca1cc2b4.stub.ll + ├ INFO: 生成声明: vipermath.py -> 3f7c5e78d8652535.stub.ll + ├ INFO: 生成声明: vipersimd.py -> c24f25b14b4bbd0a.stub.ll + ├ INFO: 缓存命中(全局): w32\win32base.py -> 7e529fe7a078cfef.stub.ll + ├ INFO: 缓存命中(全局): w32\win32console.py -> bbdf3bbd4c3bc28c.stub.ll + ├ SUCCESS: 声明接口生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\SimdTest\temp + ├ INFO: SHA1 映射表 (14 个文件): + ├ INFO: 找到 1 个可达源文件(已按依赖排序) + ├ INFO: 处理顺序: + ├ INFO: 1. main.py + ├ INFO: 过滤旧文件: stub 49->14, sig 93->14 + ├ INFO: [缓存] 构建共享符号表数据... + ├ INFO: [缓存] 共享符号表构建完成 (0.41s, 1038 符号, 5 泛型模板, 42 doc 元数据) + ├ INFO: + 需要翻译 1 个文件 + ├ WARN: HandlesImports: 忽略异常 Undefined function: 'printf' + ├ WARN: HandlesImports: 忽略异常 Undefined function: 'printf' + ├ WARN: HandlesImports: 忽略异常 Undefined function: 'printf' + ├ WARN: HandlesImports: 忽略异常 Undefined function: 'CUnsignedChar' + ├ INFO: -> 2fcb6780db4d937f.ll + ├ INFO: [1/1] main.py (3.2s) + ├ INFO: 翻译总耗时: 3.2s + ├ INFO: + [阶段二完成] .ll 文件生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\SimdTest\output + ├ INFO: [includes] 发现 Python 源文件: stdlib.py + ├ INFO: [includes] 发现 Python 源文件: memhub.py + ├ INFO: [includes] 发现 Python 源文件: vipersimd.py + ├ INFO: [includes] 发现 Python 源文件: stdio.py + ├ INFO: [includes] 发现 Python 源文件: stdint.py + ├ INFO: [includes] 发现 Python 源文件: testcheck.py + ├ INFO: [includes] 发现 Python 包文件: numpy\__init__.py + ├ INFO: [includes] 发现间接依赖: string.py + ├ INFO: [includes] 发现间接依赖: atom.py + ├ INFO: [includes] 发现间接依赖: viperio.py + ├ INFO: [includes] 发现间接依赖: w32\win32console.py + ├ INFO: [includes] 发现间接依赖: w32\win32base.py + ├ INFO: [includes] 发现间接依赖: vipermath.py + ├ INFO: + [includes 编译] 找到 13 个 Python 源文件 + ├ INFO: 跳过(声明文件): stdint.py + ├ INFO: 跳过(声明文件): stdio.py + ├ INFO: 跳过(声明文件): stdlib.py + ├ INFO: 跳过(预编译): string.py -> 9474791561654346.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): win32base.py -> 7e529fe7a078cfef.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): win32console.py -> bbdf3bbd4c3bc28c.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): testcheck.py -> 14d33679f7fadf1f.x86_64-pc-windows-gnu.static.obj + ├ INFO: 翻译 6 个文件 + ├ INFO: -> 271ea3decb810db2.ll + ├ INFO: [1/6] 翻译完成: atom.py + ├ INFO: -> c9f4be41ca1cc2b4.ll + ├ INFO: [2/6] 翻译完成: viperio.py + ├ INFO: -> c24f25b14b4bbd0a.ll + ├ INFO: [3/6] 翻译完成: vipersimd.py + ├ INFO: -> 3f7c5e78d8652535.ll + ├ INFO: [4/6] 翻译完成: vipermath.py + ├ INFO: -> f3560b99de458aec.ll + ├ INFO: [5/6] 翻译完成: memhub.py + ├ INFO: -> c3a6aed1f1fb8b1e.ll + ├ INFO: [6/6] 翻译完成: __init__.py + ├ INFO: 编译 6 个 .ll 文件 + ├ SUCCESS: [1/6] 编译成功: atom.py + ├ SUCCESS: [2/6] 编译成功: viperio.py + ├ SUCCESS: [3/6] 编译成功: vipersimd.py + ├ SUCCESS: [4/6] 编译成功: memhub.py + ├ SUCCESS: [5/6] 编译成功: vipermath.py + ├ SUCCESS: [6/6] 编译成功: __init__.py + ├ INFO: [清理] 删除 6 个过时文件 + ├ INFO: + [编译] 找到 1 个 .ll 文件需要编译 + ├ INFO: 并行编译 1 个文件 (workers=1) + ├ ERROR: 2fcb6780db4d937f.ll: llc.exe: error: llc.exe: D:\Users\TermiNexus\Desktop\TransPyC\Test\SimdTest\output\2fcb6780db4d937f_dso.ll:1934:1: error: expected instruction opcode + endif: + ^ + ├ ERROR: + 1 个文件编译失败 + [FATAL] 方法体编译失败 (ndarray[double].print_arr): Exception: Undefined function: 'printf' + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 32, in HandleBodyLlvm + self.Trans.IfHandler._HandleIfLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesIf.py", line 193, in _HandleIfLlvm + self.Trans.BodyHandler.HandleBodyLlvm(Node.body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 22, in HandleBodyLlvm + self.HandleExprLlvm(Node.value) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 77, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 352, in _HandleCallLlvm + raise Exception(f"Undefined function: '{FuncName}'") + Exception: Undefined function: 'printf' + [FATAL] 方法体编译失败 (ndarray[float].print_arr): Exception: Undefined function: 'printf' + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 32, in HandleBodyLlvm + self.Trans.IfHandler._HandleIfLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesIf.py", line 193, in _HandleIfLlvm + self.Trans.BodyHandler.HandleBodyLlvm(Node.body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 22, in HandleBodyLlvm + self.HandleExprLlvm(Node.value) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 77, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 352, in _HandleCallLlvm + raise Exception(f"Undefined function: '{FuncName}'") + Exception: Undefined function: 'printf' + [FATAL] 方法体编译失败 (ndarray[int].print_arr): Exception: Undefined function: 'printf' + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 32, in HandleBodyLlvm + self.Trans.IfHandler._HandleIfLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesIf.py", line 193, in _HandleIfLlvm + self.Trans.BodyHandler.HandleBodyLlvm(Node.body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 22, in HandleBodyLlvm + self.HandleExprLlvm(Node.value) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 77, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 352, in _HandleCallLlvm + raise Exception(f"Undefined function: '{FuncName}'") + Exception: Undefined function: 'printf' + [FATAL] 方法体编译失败 (ndarray[i32].print_arr): Exception: Undefined function: 'printf' + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 32, in HandleBodyLlvm + self.Trans.IfHandler._HandleIfLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesIf.py", line 193, in _HandleIfLlvm + self.Trans.BodyHandler.HandleBodyLlvm(Node.body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 22, in HandleBodyLlvm + self.HandleExprLlvm(Node.value) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 77, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 352, in _HandleCallLlvm + raise Exception(f"Undefined function: '{FuncName}'") + Exception: Undefined function: 'printf' + [FATAL] 方法体编译失败 (ndarray[i8].sum): Exception: Undefined function: 'CUnsignedChar' + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 30, in HandleBodyLlvm + self.Trans.AnnAssignHandler._HandleAnnAssignLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 289, in _HandleAnnAssignLlvm + self._HandleAnnAssignLlvmInner(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 487, in _HandleAnnAssignLlvmInner + InitValue = self.HandleExprLlvm(Node.value, VarType=VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBase.py", line 526, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 352, in _HandleCallLlvm + raise Exception(f"Undefined function: '{FuncName}'") + Exception: Undefined function: 'CUnsignedChar' + [FATAL] 方法体编译失败 (ndarray[i8].sum): Exception: Undefined function: 'CUnsignedChar' + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 30, in HandleBodyLlvm + self.Trans.AnnAssignHandler._HandleAnnAssignLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 289, in _HandleAnnAssignLlvm + self._HandleAnnAssignLlvmInner(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 487, in _HandleAnnAssignLlvmInner + InitValue = self.HandleExprLlvm(Node.value, VarType=VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBase.py", line 526, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 352, in _HandleCallLlvm + raise Exception(f"Undefined function: '{FuncName}'") + Exception: Undefined function: 'CUnsignedChar' + +【TestProject】编译失败 + ├ INFO: 读取配置文件: D:\Users\TermiNexus\Desktop\TransPyC\Test\TestProject\project.json + ├ INFO: 项目目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\TestProject + ├ INFO: 源目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\TestProject\App + ├ INFO: 临时目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\TestProject\temp + ├ INFO: 输出目录: D:\Users\TermiNexus\Desktop\TransPyC\Test\TestProject\output + ├ INFO: 阶段: all + ├ INFO: 编译器: llc -filetype=obj + ├ INFO: 目标三元组: x86_64-pc-windows-gnu + ├ INFO: 数据布局: e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128 + ├ INFO: output: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\TestProject\output + ├ INFO: temp: 已清空 D:\Users\TermiNexus\Desktop\TransPyC\Test\TestProject\temp + ├ INFO: 清理完成 + ├ INFO: 找到 7 个可达源文件(从入口遍历) + ├ INFO: [1/7] 生成签名: config.py + ├ INFO: -> 8e0d8fdba991b3b4.pyi (签名) + ├ INFO: [2/7] 生成签名: main.py + ├ INFO: -> 49cae05490a513cb.pyi (签名) + ├ INFO: [3/7] 生成签名: test_numpy.py + ├ INFO: -> 3cd87018ba1e76bc.pyi (签名) + ├ INFO: [4/7] 生成签名: zc\class_test.py + ├ INFO: -> e5fb16127bce8f68.pyi (签名) + ├ INFO: [5/7] 生成签名: zc\config.py + ├ INFO: -> cfc83b830141b00e.pyi (签名) + ├ INFO: [6/7] 生成签名: zc\logic_test.py + ├ INFO: -> faec3233d98371da.pyi (签名) + ├ INFO: [7/7] 生成签名: zc\test.py + ├ INFO: -> 75583f20a922ab2e.pyi (签名) + ├ INFO: 处理 12 个被引用的 Python 库文件 + ├ INFO: 缓存命中(全局): atom.py -> 271ea3decb810db2.pyi + ├ INFO: 缓存命中(全局): memhub.py -> f3560b99de458aec.pyi + ├ INFO: 缓存命中(全局): numpy\__init__.py -> c3a6aed1f1fb8b1e.pyi + ├ INFO: 缓存命中(全局): stdint.py -> f5522571bcce7bcb.pyi + ├ INFO: 缓存命中(全局): stdio.py -> 6f62fe05c5ea1ceb.pyi + ├ INFO: 缓存命中(全局): stdlib.py -> 90c53dd6db8d41cf.pyi + ├ INFO: 缓存命中(全局): string.py -> 9474791561654346.pyi + ├ INFO: 缓存命中(全局): testcheck.py -> 14d33679f7fadf1f.pyi + ├ INFO: 缓存命中(全局): viperio.py -> c9f4be41ca1cc2b4.pyi + ├ INFO: 缓存命中(全局): vipermath.py -> 3f7c5e78d8652535.pyi + ├ INFO: 缓存命中(全局): w32\win32base.py -> 7e529fe7a078cfef.pyi + ├ INFO: 缓存命中(全局): w32\win32console.py -> bbdf3bbd4c3bc28c.pyi + ├ INFO: 结构体注册表: 30 个类型, 1 个枚举 + ├ INFO: -> 8e0d8fdba991b3b4.stub.ll (声明) + ├ INFO: -> 49cae05490a513cb.stub.ll (声明) + ├ INFO: -> 3cd87018ba1e76bc.stub.ll (声明) + ├ INFO: -> e5fb16127bce8f68.stub.ll (声明) + ├ INFO: -> cfc83b830141b00e.stub.ll (声明) + ├ INFO: -> faec3233d98371da.stub.ll (声明) + ├ INFO: -> 75583f20a922ab2e.stub.ll (声明) + ├ INFO: 缓存命中(全局): atom.py -> 271ea3decb810db2.stub.ll + ├ INFO: 缓存命中(全局): memhub.py -> f3560b99de458aec.stub.ll + ├ INFO: 缓存命中(全局): numpy\__init__.py -> c3a6aed1f1fb8b1e.stub.ll + ├ INFO: 缓存命中(全局): stdint.py -> f5522571bcce7bcb.stub.ll + ├ INFO: 缓存命中(全局): stdio.py -> 6f62fe05c5ea1ceb.stub.ll + ├ INFO: 缓存命中(全局): stdlib.py -> 90c53dd6db8d41cf.stub.ll + ├ INFO: 缓存命中(全局): string.py -> 9474791561654346.stub.ll + ├ INFO: 缓存命中(全局): testcheck.py -> 14d33679f7fadf1f.stub.ll + ├ INFO: 缓存命中(全局): viperio.py -> c9f4be41ca1cc2b4.stub.ll + ├ INFO: 缓存命中(全局): vipermath.py -> 3f7c5e78d8652535.stub.ll + ├ INFO: 缓存命中(全局): w32\win32base.py -> 7e529fe7a078cfef.stub.ll + ├ INFO: 缓存命中(全局): w32\win32console.py -> bbdf3bbd4c3bc28c.stub.ll + ├ SUCCESS: 声明接口生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\TestProject\temp + ├ INFO: SHA1 映射表 (19 个文件): + ├ INFO: 找到 7 个可达源文件(已按依赖排序) + ├ INFO: 处理顺序: + ├ INFO: 1. config.py + ├ INFO: 2. test_numpy.py + ├ INFO: 3. zc\class_test.py + ├ INFO: 4. zc\config.py + ├ INFO: 5. zc\logic_test.py + ├ INFO: 6. zc\test.py + ├ INFO: 7. main.py + ├ INFO: 过滤旧文件: stub 63->19, sig 114->19 + ├ INFO: [缓存] 构建共享符号表数据... + ├ INFO: [缓存] 共享符号表构建完成 (0.52s, 1199 符号, 5 泛型模板, 57 doc 元数据) + ├ INFO: + 需要翻译 7 个文件 + ├ INFO: 并行翻译 (workers=7) + ├ INFO: 共享符号表已序列化 (541KB) + ├ INFO: -> 8e0d8fdba991b3b4.ll + ├ INFO: [1/7] 完成: config.py + ├ INFO: -> cfc83b830141b00e.ll + ├ INFO: [2/7] 完成: zc\config.py + ├ INFO: -> e5fb16127bce8f68.ll + ├ INFO: [3/7] 完成: zc\class_test.py + ├ INFO: -> faec3233d98371da.ll + ├ INFO: [4/7] 完成: zc\logic_test.py + ├ INFO: -> 75583f20a922ab2e.ll + ├ INFO: [5/7] 完成: zc\test.py + ├ INFO: -> 49cae05490a513cb.ll + ├ INFO: [6/7] 完成: main.py + ├ WARN: HandlesImports: 忽略异常 Undefined function: 'printf' + ├ WARN: HandlesImports: 忽略异常 Undefined function: 'printf' + ├ WARN: HandlesImports: 忽略异常 Undefined function: 'printf' + ├ WARN: HandlesImports: 忽略异常 Undefined function: 'CUnsignedChar' + ├ INFO: -> 3cd87018ba1e76bc.ll + ├ INFO: [7/7] 完成: test_numpy.py + ├ INFO: 翻译总耗时: 8.2s + ├ INFO: + [阶段二完成] .ll 文件生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\TestProject\output + ├ INFO: [includes] 发现 Python 源文件: testcheck.py + ├ INFO: [includes] 发现 Python 源文件: vipermath.py + ├ INFO: [includes] 发现 Python 源文件: stdint.py + ├ INFO: [includes] 发现 Python 包文件: numpy\__init__.py + ├ INFO: [includes] 发现 Python 源文件: stdlib.py + ├ INFO: [includes] 发现 Python 源文件: string.py + ├ INFO: [includes] 发现 Python 源文件: stdio.py + ├ INFO: [includes] 发现 Python 源文件: memhub.py + ├ INFO: [includes] 发现间接依赖: w32\win32console.py + ├ INFO: [includes] 发现间接依赖: w32\win32base.py + ├ INFO: [includes] 发现间接依赖: atom.py + ├ INFO: [includes] 发现间接依赖: viperio.py + ├ INFO: + [includes 编译] 找到 12 个 Python 源文件 + ├ INFO: 跳过(预编译): atom.py -> 271ea3decb810db2.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(声明文件): stdint.py + ├ INFO: 跳过(声明文件): stdio.py + ├ INFO: 跳过(声明文件): stdlib.py + ├ INFO: 跳过(预编译): string.py -> 9474791561654346.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): viperio.py -> c9f4be41ca1cc2b4.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): memhub.py -> f3560b99de458aec.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): vipermath.py -> 3f7c5e78d8652535.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): __init__.py -> c3a6aed1f1fb8b1e.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): win32base.py -> 7e529fe7a078cfef.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): win32console.py -> bbdf3bbd4c3bc28c.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): testcheck.py -> 14d33679f7fadf1f.x86_64-pc-windows-gnu.static.obj + ├ INFO: + [编译] 找到 7 个 .ll 文件需要编译 + ├ INFO: 并行编译 7 个文件 (workers=7) + ├ SUCCESS: 8e0d8fdba991b3b4.ll + ├ SUCCESS: 49cae05490a513cb.ll + ├ ERROR: 3cd87018ba1e76bc.ll: llc.exe: error: llc.exe: D:\Users\TermiNexus\Desktop\TransPyC\Test\TestProject\output\3cd87018ba1e76bc_dso.ll:1761:1: error: expected instruction opcode + endif: + ^ + ├ SUCCESS: e5fb16127bce8f68.ll + ├ SUCCESS: cfc83b830141b00e.ll + ├ SUCCESS: 75583f20a922ab2e.ll + ├ SUCCESS: faec3233d98371da.ll + ├ ERROR: + 1 个文件编译失败 + [FATAL] 方法体编译失败 (ndarray[double].print_arr): Exception: Undefined function: 'printf' + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 32, in HandleBodyLlvm + self.Trans.IfHandler._HandleIfLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesIf.py", line 193, in _HandleIfLlvm + self.Trans.BodyHandler.HandleBodyLlvm(Node.body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 22, in HandleBodyLlvm + self.HandleExprLlvm(Node.value) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 77, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 352, in _HandleCallLlvm + raise Exception(f"Undefined function: '{FuncName}'") + Exception: Undefined function: 'printf' + [FATAL] 方法体编译失败 (ndarray[float].print_arr): Exception: Undefined function: 'printf' + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 32, in HandleBodyLlvm + self.Trans.IfHandler._HandleIfLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesIf.py", line 193, in _HandleIfLlvm + self.Trans.BodyHandler.HandleBodyLlvm(Node.body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 22, in HandleBodyLlvm + self.HandleExprLlvm(Node.value) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 77, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 352, in _HandleCallLlvm + raise Exception(f"Undefined function: '{FuncName}'") + Exception: Undefined function: 'printf' + [FATAL] 方法体编译失败 (ndarray[int].print_arr): Exception: Undefined function: 'printf' + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 32, in HandleBodyLlvm + self.Trans.IfHandler._HandleIfLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesIf.py", line 193, in _HandleIfLlvm + self.Trans.BodyHandler.HandleBodyLlvm(Node.body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 22, in HandleBodyLlvm + self.HandleExprLlvm(Node.value) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 77, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 352, in _HandleCallLlvm + raise Exception(f"Undefined function: '{FuncName}'") + Exception: Undefined function: 'printf' + [FATAL] 方法体编译失败 (ndarray[i32].print_arr): Exception: Undefined function: 'printf' + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 32, in HandleBodyLlvm + self.Trans.IfHandler._HandleIfLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesIf.py", line 193, in _HandleIfLlvm + self.Trans.BodyHandler.HandleBodyLlvm(Node.body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 22, in HandleBodyLlvm + self.HandleExprLlvm(Node.value) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 77, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 352, in _HandleCallLlvm + raise Exception(f"Undefined function: '{FuncName}'") + Exception: Undefined function: 'printf' + [FATAL] 方法体编译失败 (ndarray[i8].sum): Exception: Undefined function: 'CUnsignedChar' + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 30, in HandleBodyLlvm + self.Trans.AnnAssignHandler._HandleAnnAssignLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 289, in _HandleAnnAssignLlvm + self._HandleAnnAssignLlvmInner(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 487, in _HandleAnnAssignLlvmInner + InitValue = self.HandleExprLlvm(Node.value, VarType=VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBase.py", line 526, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 352, in _HandleCallLlvm + raise Exception(f"Undefined function: '{FuncName}'") + Exception: Undefined function: 'CUnsignedChar' + [FATAL] 方法体编译失败 (ndarray[i8].sum): Exception: Undefined function: 'CUnsignedChar' + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 30, in HandleBodyLlvm + self.Trans.AnnAssignHandler._HandleAnnAssignLlvm(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 289, in _HandleAnnAssignLlvm + self._HandleAnnAssignLlvmInner(Node) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesAnnAssign.py", line 487, in _HandleAnnAssignLlvmInner + InitValue = self.HandleExprLlvm(Node.value, VarType=VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBase.py", line 526, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 352, in _HandleCallLlvm + raise Exception(f"Undefined function: '{FuncName}'") + Exception: Undefined function: 'CUnsignedChar' + +【TestProject2】编译失败 + ... (省略前 17 行) ... + ├ INFO: 处理 22 个被引用的 Python 库文件 + ├ INFO: 缓存命中(全局): atom.py -> 271ea3decb810db2.pyi + ├ INFO: 生成签名: binascii.py -> 257e074b935c33b4.pyi + ├ INFO: 生成签名: hashlib\__init__.py -> 96837bcc64032444.pyi + ├ INFO: 生成签名: hashlib\__md5.py -> 19f8024d10c828e8.pyi + ├ INFO: 生成签名: hashlib\__sha1.py -> 0df65b8ed15664b0.pyi + ├ INFO: 生成签名: hashlib\__sha256.py -> c9d54a4158f7f5a8.pyi + ├ INFO: 生成签名: hashlib\__sha512.py -> 6ff26590374ae6fc.pyi + ├ INFO: 缓存命中(全局): memhub.py -> f3560b99de458aec.pyi + ├ INFO: 缓存命中(全局): stdint.py -> f5522571bcce7bcb.pyi + ├ INFO: 缓存命中(全局): stdio.py -> 6f62fe05c5ea1ceb.pyi + ├ INFO: 缓存命中(全局): stdlib.py -> 90c53dd6db8d41cf.pyi + ├ INFO: 缓存命中(全局): string.py -> 9474791561654346.pyi + ├ INFO: 缓存命中(全局): testcheck.py -> 14d33679f7fadf1f.pyi + ├ INFO: 缓存命中(全局): viperio.py -> c9f4be41ca1cc2b4.pyi + ├ INFO: 缓存命中(全局): w32\win32base.py -> 7e529fe7a078cfef.pyi + ├ INFO: 缓存命中(全局): w32\win32console.py -> bbdf3bbd4c3bc28c.pyi + ├ INFO: 生成签名: zlib\pyzlib.py -> 1c46d554b3a3f9f3.pyi + ├ INFO: 生成签名: zlib\zchecksum.py -> 8ebed83a7817fa0c.pyi + ├ INFO: 生成签名: zlib\zdef.py -> 213348433fb01cc6.pyi + ├ INFO: 生成签名: zlib\zdeflate.py -> 90921d009fdd674c.pyi + ├ INFO: 生成签名: zlib\zhuff.py -> d541ade6afb689a5.pyi + ├ INFO: 生成签名: zlib\zinflate.py -> 451745df21e598af.pyi + ├ INFO: 结构体注册表: 35 个类型, 0 个枚举 + ├ INFO: -> 541a1ed9b8be53c8.stub.ll (声明) + ├ INFO: -> cfc83b830141b00e.stub.ll (声明) + ├ INFO: 缓存命中(全局): atom.py -> 271ea3decb810db2.stub.ll + ├ INFO: 生成声明: binascii.py -> 257e074b935c33b4.stub.ll + ├ INFO: 生成声明: hashlib\__init__.py -> 96837bcc64032444.stub.ll + ├ INFO: 生成声明: hashlib\__md5.py -> 19f8024d10c828e8.stub.ll + ├ INFO: 生成声明: hashlib\__sha1.py -> 0df65b8ed15664b0.stub.ll + ├ INFO: 生成声明: hashlib\__sha256.py -> c9d54a4158f7f5a8.stub.ll + ├ INFO: 生成声明: hashlib\__sha512.py -> 6ff26590374ae6fc.stub.ll + ├ INFO: 缓存命中(全局): memhub.py -> f3560b99de458aec.stub.ll + ├ INFO: 缓存命中(全局): stdint.py -> f5522571bcce7bcb.stub.ll + ├ INFO: 缓存命中(全局): stdio.py -> 6f62fe05c5ea1ceb.stub.ll + ├ INFO: 缓存命中(全局): stdlib.py -> 90c53dd6db8d41cf.stub.ll + ├ INFO: 缓存命中(全局): string.py -> 9474791561654346.stub.ll + ├ INFO: 缓存命中(全局): testcheck.py -> 14d33679f7fadf1f.stub.ll + ├ INFO: 缓存命中(全局): viperio.py -> c9f4be41ca1cc2b4.stub.ll + ├ INFO: 缓存命中(全局): w32\win32base.py -> 7e529fe7a078cfef.stub.ll + ├ INFO: 缓存命中(全局): w32\win32console.py -> bbdf3bbd4c3bc28c.stub.ll + ├ INFO: 生成声明: zlib\pyzlib.py -> 1c46d554b3a3f9f3.stub.ll + ├ INFO: 生成声明: zlib\zchecksum.py -> 8ebed83a7817fa0c.stub.ll + ├ INFO: 生成声明: zlib\zdef.py -> 213348433fb01cc6.stub.ll + ├ INFO: 生成声明: zlib\zdeflate.py -> 90921d009fdd674c.stub.ll + ├ INFO: 生成声明: zlib\zhuff.py -> d541ade6afb689a5.stub.ll + ├ INFO: 生成声明: zlib\zinflate.py -> 451745df21e598af.stub.ll + ├ SUCCESS: 声明接口生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\TestProject2\temp + ├ INFO: SHA1 映射表 (24 个文件): + ├ INFO: 找到 2 个可达源文件(已按依赖排序) + ├ INFO: 处理顺序: + ├ INFO: 1. main.py + ├ INFO: 2. zc\config.py + ├ INFO: 过滤旧文件: stub 70->24, sig 127->24 + ├ INFO: [缓存] 构建共享符号表数据... + ├ INFO: [缓存] 共享符号表构建完成 (0.65s, 951 符号, 5 泛型模板, 58 doc 元数据) + ├ INFO: + 需要翻译 2 个文件 + ├ INFO: 并行翻译 (workers=2) + ├ INFO: 共享符号表已序列化 (451KB) + ├ INFO: -> cfc83b830141b00e.ll + ├ INFO: [1/2] 完成: zc\config.py + ├ INFO: -> 541a1ed9b8be53c8.ll + ├ INFO: [2/2] 完成: main.py + ├ INFO: 翻译总耗时: 0.9s + ├ INFO: + [阶段二完成] .ll 文件生成到: D:\Users\TermiNexus\Desktop\TransPyC\Test\TestProject2\output + ├ INFO: [includes] 发现 Python 包文件: w32\fileio.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32base.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32console.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32file.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32memory.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32process.py + ├ INFO: [includes] 发现 Python 包文件: w32\win32sync.py + ├ INFO: [includes] 发现 Python 包文件: w32\winsock2.py + ├ INFO: [includes] 发现 Python 源文件: stdint.py + ├ INFO: [includes] 发现 Python 源文件: testcheck.py + ├ INFO: [includes] 发现 Python 包文件: zlib\pyzlib.py + ├ INFO: [includes] 发现 Python 包文件: zlib\zchecksum.py + ├ INFO: [includes] 发现 Python 包文件: zlib\zdef.py + ├ INFO: [includes] 发现 Python 包文件: zlib\zdeflate.py + ├ INFO: [includes] 发现 Python 包文件: zlib\zhuff.py + ├ INFO: [includes] 发现 Python 包文件: zlib\zinflate.py + ├ INFO: [includes] 发现 Python 包文件: zlib\__init__.py + ├ INFO: [includes] 发现 Python 包文件: hashlib\__init__.py + ├ INFO: [includes] 发现 Python 包文件: hashlib\__md5.py + ├ INFO: [includes] 发现 Python 包文件: hashlib\__sha1.py + ├ INFO: [includes] 发现 Python 包文件: hashlib\__sha256.py + ├ INFO: [includes] 发现 Python 包文件: hashlib\__sha512.py + ├ INFO: [includes] 发现 Python 源文件: binascii.py + ├ INFO: [includes] 发现间接依赖: stdio.py + ├ INFO: [includes] 发现间接依赖: stdlib.py + ├ INFO: [includes] 发现间接依赖: string.py + ├ INFO: [includes] 发现间接依赖: memhub.py + ├ INFO: [includes] 发现间接依赖: atom.py + ├ INFO: [includes] 发现间接依赖: viperio.py + ├ INFO: + [includes 编译] 找到 29 个 Python 源文件 + ├ INFO: 跳过(预编译): atom.py -> 271ea3decb810db2.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(声明文件): stdint.py + ├ INFO: 跳过(声明文件): stdio.py + ├ INFO: 跳过(声明文件): stdlib.py + ├ INFO: 跳过(预编译): string.py -> 9474791561654346.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(声明文件): __init__.py + ├ INFO: 跳过(预编译): viperio.py -> c9f4be41ca1cc2b4.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): memhub.py -> f3560b99de458aec.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): win32base.py -> 7e529fe7a078cfef.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): win32console.py -> bbdf3bbd4c3bc28c.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): testcheck.py -> 14d33679f7fadf1f.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): win32file.py -> f6b51804a0ba8ff0.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): fileio.py -> 0035c95a18d4f8e8.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): win32memory.py -> 72e2d5ccb7cedcf1.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): win32process.py -> 067c78e9f121dce3.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): win32sync.py -> 06f53cc594b4ac6c.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(预编译): winsock2.py -> 6446627d4f07a1b5.x86_64-pc-windows-gnu.static.obj + ├ INFO: 跳过(声明文件): __init__.py + ├ INFO: 翻译 11 个文件 + ├ INFO: -> c9d54a4158f7f5a8.ll + ├ INFO: [1/11] 翻译完成: __sha256.py + ├ INFO: -> 257e074b935c33b4.ll + ├ INFO: [2/11] 翻译完成: binascii.py + ├ ERROR: __sha512.py: Type of #2 arg mismatch: i8* != i32 + 源代码 (D:\Users\TermiNexus\Desktop\TransPyC\includes\hashlib\__sha512.py, line 48): + 48 | memset(self, 0, sha512.__sizeof__()) + Type of #2 arg mismatch: i8* != i32 + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Phase2Translator.py", line 1039, in _translate_file + result = trans.Convert( + ^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Shell\TransPyC.py", line 555, in Convert + code: str = self.translator.GenerateCCode(Tree, target='llvm') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Translator\LlvmGenerator.py", line 642, in GenerateCCode + return self.GenerateLlvmDirect(Tree) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Translator\LlvmGenerator.py", line 164, in GenerateLlvmDirect + self.ClassHandler._EmitClassLlvm(Node, Gen) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesClassDef.py", line 675, in _EmitClassLlvm + self.Trans.FunctionHandler._EmitFunctionLlvm(item, Gen, ClassName=ClassName) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 22, in HandleBodyLlvm + self.HandleExprLlvm(Node.value) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 77, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 255, in _HandleCallLlvm + result = self.Trans.ExprBuiltinHandle._HandleBuiltinCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprBuiltin.py", line 185, in _HandleBuiltinCallLlvm + return self._HandleMemsetLlvm(Node.args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprBuiltin.py", line 804, in _HandleMemsetLlvm + Gen.builder.call(memset_func, [dst, val, size], name="memset_call") + File "D:\Python312\Lib\site-packages\llvmlite\ir\builder.py", line 881, in call + inst = instructions.CallInstr(self.block, fn, args, name=name, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\instructions.py", line 105, in __init__ + raise TypeError(msg) + TypeError: Type of #2 arg mismatch: i8* != i32 + + The above exception was the direct cause of the following exception: + + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Phase2Translator.py", line 89, in _parallel_translate_worker + trans._translate_file(src_path, out_path, prebuilt_ModuleSha1Map=prebuilt_ModuleSha1Map) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Phase2Translator.py", line 1055, in _translate_file + raise type(e)(enriched) from e + TypeError: Type of #2 arg mismatch: i8* != i32 + 源代码 (D:\Users\TermiNexus\Desktop\TransPyC\includes\hashlib\__sha512.py, line 48): + 48 | memset(self, 0, sha512.__sizeof__()) + Type of #2 arg mismatch: i8* != i32 + + ├ INFO: -> 19f8024d10c828e8.ll + ├ INFO: [4/11] 翻译完成: __md5.py + ├ INFO: -> 0df65b8ed15664b0.ll + ├ INFO: [5/11] 翻译完成: __sha1.py + ├ INFO: -> 8ebed83a7817fa0c.ll + ├ INFO: [6/11] 翻译完成: zchecksum.py + ├ INFO: -> 213348433fb01cc6.ll + ├ INFO: [7/11] 翻译完成: zdef.py + ├ ERROR: zhuff.py: Type of #2 arg mismatch: i8* != i32 + 源代码 (D:\Users\TermiNexus\Desktop\TransPyC\includes\zlib\zhuff.py, line 32): + 32 | memset(bl_count, 0, bl_count.__sizeof__()) + Type of #2 arg mismatch: i8* != i32 + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Phase2Translator.py", line 1039, in _translate_file + result = trans.Convert( + ^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Shell\TransPyC.py", line 555, in Convert + code: str = self.translator.GenerateCCode(Tree, target='llvm') + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Translator\LlvmGenerator.py", line 642, in GenerateCCode + return self.GenerateLlvmDirect(Tree) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Translator\LlvmGenerator.py", line 164, in GenerateLlvmDirect + self.ClassHandler._EmitClassLlvm(Node, Gen) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesClassDef.py", line 675, in _EmitClassLlvm + self.Trans.FunctionHandler._EmitFunctionLlvm(item, Gen, ClassName=ClassName) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 22, in HandleBodyLlvm + self.HandleExprLlvm(Node.value) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 77, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 255, in _HandleCallLlvm + result = self.Trans.ExprBuiltinHandle._HandleBuiltinCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprBuiltin.py", line 185, in _HandleBuiltinCallLlvm + return self._HandleMemsetLlvm(Node.args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprBuiltin.py", line 804, in _HandleMemsetLlvm + Gen.builder.call(memset_func, [dst, val, size], name="memset_call") + File "D:\Python312\Lib\site-packages\llvmlite\ir\builder.py", line 881, in call + inst = instructions.CallInstr(self.block, fn, args, name=name, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\instructions.py", line 105, in __init__ + raise TypeError(msg) + TypeError: Type of #2 arg mismatch: i8* != i32 + + The above exception was the direct cause of the following exception: + + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Phase2Translator.py", line 89, in _parallel_translate_worker + trans._translate_file(src_path, out_path, prebuilt_ModuleSha1Map=prebuilt_ModuleSha1Map) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\Projectrans\Phase2Translator.py", line 1055, in _translate_file + raise type(e)(enriched) from e + TypeError: Type of #2 arg mismatch: i8* != i32 + 源代码 (D:\Users\TermiNexus\Desktop\TransPyC\includes\zlib\zhuff.py, line 32): + 32 | memset(bl_count, 0, bl_count.__sizeof__()) + Type of #2 arg mismatch: i8* != i32 + + ├ INFO: -> 451745df21e598af.ll + ├ INFO: [9/11] 翻译完成: zinflate.py + ├ INFO: -> 90921d009fdd674c.ll + ├ INFO: [10/11] 翻译完成: zdeflate.py + ├ INFO: -> 1c46d554b3a3f9f3.ll + ├ INFO: [11/11] 翻译完成: pyzlib.py + ├ ERROR: + 2 个 include 文件翻译失败 + [FATAL] 方法体编译失败 (sha512.__init__): TypeError: Type of #2 arg mismatch: i8* != i32 + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 22, in HandleBodyLlvm + self.HandleExprLlvm(Node.value) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 77, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 255, in _HandleCallLlvm + result = self.Trans.ExprBuiltinHandle._HandleBuiltinCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprBuiltin.py", line 185, in _HandleBuiltinCallLlvm + return self._HandleMemsetLlvm(Node.args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprBuiltin.py", line 804, in _HandleMemsetLlvm + Gen.builder.call(memset_func, [dst, val, size], name="memset_call") + File "D:\Python312\Lib\site-packages\llvmlite\ir\builder.py", line 881, in call + inst = instructions.CallInstr(self.block, fn, args, name=name, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\instructions.py", line 105, in __init__ + raise TypeError(msg) + TypeError: Type of #2 arg mismatch: i8* != i32 + [FATAL] 方法体编译失败 (zhuff_tree.build_codes): TypeError: Type of #2 arg mismatch: i8* != i32 + Traceback (most recent call last): + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesFunctions.py", line 1741, in _EmitFunctionLlvm + self.Trans.BodyHandler.HandleBodyLlvm(func_body) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 22, in HandleBodyLlvm + self.HandleExprLlvm(Node.value) + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesBody.py", line 77, in HandleExprLlvm + return self.Trans.ExprHandler.HandleExprLlvm(Node, VarType) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExpr.py", line 63, in HandleExprLlvm + return self.Trans.ExprCallHandle._HandleCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprCall.py", line 255, in _HandleCallLlvm + result = self.Trans.ExprBuiltinHandle._HandleBuiltinCallLlvm(Node) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprBuiltin.py", line 185, in _HandleBuiltinCallLlvm + return self._HandleMemsetLlvm(Node.args) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Users\TermiNexus\Desktop\TransPyC\lib\core\Handles\HandlesExprBuiltin.py", line 804, in _HandleMemsetLlvm + Gen.builder.call(memset_func, [dst, val, size], name="memset_call") + File "D:\Python312\Lib\site-packages\llvmlite\ir\builder.py", line 881, in call + inst = instructions.CallInstr(self.block, fn, args, name=name, + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "D:\Python312\Lib\site-packages\llvmlite\ir\instructions.py", line 105, in __init__ + raise TypeError(msg) + TypeError: Type of #2 arg mismatch: i8* != i32 + +【LLvmLiteTest】运行失败 (编译耗时 21.8s) + [运行] LLvmLiteTest.exe: 退出码 3221225477 + +【StructTest】运行失败 (编译耗时 4.9s) + [运行] StructTest.exe: 退出码 3221225477 + +====================================================================== +有 9 个测试失败,请检查上方详情。 +====================================================================== diff --git a/test_inherited_decls.py b/test_inherited_decls.py new file mode 100644 index 0000000..11cf4fb --- /dev/null +++ b/test_inherited_decls.py @@ -0,0 +1,67 @@ +import ast +import sys +sys.path.insert(0, 'd:\\Users\\TermiNexus\\Desktop\\TransPyC') + +from lib.Projectrans.DeclarationGenerator import DeclarationGenerator +from lib.includes import t + +# 读取 memhub.pyi +with open('d:\\Users\\TermiNexus\\Desktop\\TransPyC\\.transpyc_cache\\f3560b99de458aec.pyi', 'r', encoding='utf-8') as f: + pyi_content = f.read() + +tree = ast.parse(pyi_content) + +# 查找 MemBuddy 类 +mem_buddy_node = None +mem_manager_node = None +for node in ast.iter_child_nodes(tree): + if isinstance(node, ast.ClassDef): + if node.name == 'MemBuddy': + mem_buddy_node = node + elif node.name == 'MemManager': + mem_manager_node = node + +print(f"Found MemBuddy: {mem_buddy_node is not None}") +print(f"Found MemManager: {mem_manager_node is not None}") + +if mem_buddy_node: + print(f"\nMemBuddy bases: {[ast.dump(b) for b in mem_buddy_node.bases]}") + print(f"MemBuddy methods: {[item.name for item in mem_buddy_node.body if isinstance(item, ast.FunctionDef)]}") + +if mem_manager_node: + print(f"\nMemManager methods: {[item.name for item in mem_manager_node.body if isinstance(item, ast.FunctionDef)]}") + +# 创建 DeclarationGenerator 实例 +decl_gen = DeclarationGenerator( + struct_names={'MemManager', 'MemBuddy', 'MemPool', 'MemSlab'}, + enum_names=set(), + module_sha1='f3560b99de458aec', + struct_sha1_map={'MemManager': 'f3560b99de458aec', 'MemBuddy': 'f3560b99de458aec'}, + class_def_map={'MemManager': mem_manager_node, 'MemBuddy': mem_buddy_node} +) + +# 设置 _pyi_tree +decl_gen._pyi_tree = tree + +# 构建 _t_alias_map +decl_gen._t_alias_map = {} +for node in ast.iter_child_nodes(tree): + if isinstance(node, ast.ImportFrom): + if node.module in ('t', 'c'): + for alias in node.names: + name = alias.name + asname = alias.asname or name + t_cls = getattr(t, name, None) + if isinstance(t_cls, type): + decl_gen._t_alias_map[asname] = t_cls + +# 测试 _is_marker_base +print(f"\n_is_marker_base('MemManager'): {decl_gen._is_marker_base('MemManager')}") + +# 测试 _generate_inherited_method_decls +if mem_buddy_node: + struct_type_name = '%"f3560b99de458aec.MemBuddy"' + decls = decl_gen._generate_inherited_method_decls(mem_buddy_node, 'MemBuddy', struct_type_name) + print(f"\nInherited method decls ({len(decls)}):") + for d in decls: + print(f" {d}") diff --git a/thistest/App/benchmark_main.py b/thistest/App/benchmark_main.py index c27abd9..4576fa8 100644 --- a/thistest/App/benchmark_main.py +++ b/thistest/App/benchmark_main.py @@ -1,14 +1,53 @@ import w32.win32console as w32cmd +import viperstring as string +import memhub +import stdlib +import stdio +import hello import this import t, c - pagecode: t.CDefine = 65001 +def add(x: int, y: int): return x + y +def minus(x: int, y: int): return x - y + @t.CExport def main() -> int: w32cmd.SetConsoleOutputCP(pagecode) w32cmd.SetConsoleCP(pagecode) print("你好,世界") - this.this() - return 0 \ No newline at end of file + # this.this() + hello.helloworld() + + #p: bytes = stdlib.malloc(1024) + #hub = memhub.MemSlab(p, 1024) + #p1: bytes = hub.alloc(10) + #p2: bytes = hub.alloc(10) + #string.memset(p1, 0, 10) + #string.memset(p2, 0, 10) + #string.memcpy(p2, "11111111111111111\0", 13+5) + #print(p1) + #print(p2) + #print(t.CUInt64T(p2) - t.CUInt64T(p1)) + + func_p: t.Callable[[int, int], int] = add + print(func_p(66, 4)) + func_p = minus + print(func_p(66, 6)) + + fp: t.Callable[[int, int], int] = t.CUInt64T(func_p) + print(fp(67, 7)) + + #ppp: int = 1 + #while ppp: + # ppp += 1 + #print(ppp) + + #lower_est: t.CUInt64T = 0 + #lower_est -= 1 + #print(lower_est) + + pass + + return 0 diff --git a/thistest/output/0035c95a18d4f8e8.deps.json b/thistest/output/0035c95a18d4f8e8.deps.json deleted file mode 100644 index 6b8ffc5..0000000 --- a/thistest/output/0035c95a18d4f8e8.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "this": "a7bc8c01684c0001", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "benchmark_main": "c1371d3dc6b676c2", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/thistest/output/067c78e9f121dce3.deps.json b/thistest/output/067c78e9f121dce3.deps.json deleted file mode 100644 index 215ffb4..0000000 --- a/thistest/output/067c78e9f121dce3.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb", "benchmark_main": "f71cf01f35e2325a", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "203a3999d5300163", "fileio": "203a3999d5300163", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c"} \ No newline at end of file diff --git a/thistest/output/06f53cc594b4ac6c.deps.json b/thistest/output/06f53cc594b4ac6c.deps.json deleted file mode 100644 index 215ffb4..0000000 --- a/thistest/output/06f53cc594b4ac6c.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb", "benchmark_main": "f71cf01f35e2325a", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "203a3999d5300163", "fileio": "203a3999d5300163", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c"} \ No newline at end of file diff --git a/thistest/output/6166aecc7fa7ad65.deps.json b/thistest/output/6166aecc7fa7ad65.deps.json new file mode 100644 index 0000000..af7e25e --- /dev/null +++ b/thistest/output/6166aecc7fa7ad65.deps.json @@ -0,0 +1 @@ +{"atom": "271ea3decb810db2", "viperstring": "3624cfde3c5cb6cb", "hello": "6166aecc7fa7ad65", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "benchmark_main": "8c37156d7b67c1f5", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "this": "a7bc8c01684c0001", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/thistest/output/6446627d4f07a1b5.deps.json b/thistest/output/6446627d4f07a1b5.deps.json deleted file mode 100644 index 6b8ffc5..0000000 --- a/thistest/output/6446627d4f07a1b5.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "this": "a7bc8c01684c0001", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "benchmark_main": "c1371d3dc6b676c2", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/thistest/output/72e2d5ccb7cedcf1.deps.json b/thistest/output/72e2d5ccb7cedcf1.deps.json deleted file mode 100644 index 215ffb4..0000000 --- a/thistest/output/72e2d5ccb7cedcf1.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb", "benchmark_main": "f71cf01f35e2325a", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "203a3999d5300163", "fileio": "203a3999d5300163", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c"} \ No newline at end of file diff --git a/thistest/output/7e529fe7a078cfef.deps.json b/thistest/output/7e529fe7a078cfef.deps.json deleted file mode 100644 index 215ffb4..0000000 --- a/thistest/output/7e529fe7a078cfef.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb", "benchmark_main": "f71cf01f35e2325a", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "203a3999d5300163", "fileio": "203a3999d5300163", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c"} \ No newline at end of file diff --git a/thistest/output/8c37156d7b67c1f5.deps.json b/thistest/output/8c37156d7b67c1f5.deps.json new file mode 100644 index 0000000..b233fb4 --- /dev/null +++ b/thistest/output/8c37156d7b67c1f5.deps.json @@ -0,0 +1 @@ +{"atom": "271ea3decb810db2", "viperstring": "3624cfde3c5cb6cb", "hello": "6166aecc7fa7ad65", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "this": "a7bc8c01684c0001", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "viperstring.string": "9474791561654346"} \ No newline at end of file diff --git a/thistest/output/_shared_sym_includes.pickle b/thistest/output/_shared_sym_includes.pickle index 634f1e1479a041c60c6286c362c16a0d7b6362cf..6646a1d58b2f747a54b9af8373842d127c7378e1 100644 GIT binary patch literal 582206 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

gyeYt%R;L}!jvKc4d4m+Pjt7k=LgtkE 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 Zu(a~TP#7H^8(p3)&co}?Vm`Lx{{dH!PsRWM literal 511299 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

y&VyU>&06lm{u$!{~8@JG__NqY~f91bcQLHIX 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 diff --git a/thistest/output/a7bc8c01684c0001.deps.json b/thistest/output/a7bc8c01684c0001.deps.json index 6b8ffc5..af7e25e 100644 --- a/thistest/output/a7bc8c01684c0001.deps.json +++ b/thistest/output/a7bc8c01684c0001.deps.json @@ -1 +1 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "this": "a7bc8c01684c0001", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "benchmark_main": "c1371d3dc6b676c2", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file +{"atom": "271ea3decb810db2", "viperstring": "3624cfde3c5cb6cb", "hello": "6166aecc7fa7ad65", "stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "benchmark_main": "8c37156d7b67c1f5", "stdlib": "90c53dd6db8d41cf", "string": "9474791561654346", "this": "a7bc8c01684c0001", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "viperio": "c9f4be41ca1cc2b4", "memhub": "f3560b99de458aec", "stdint": "f5522571bcce7bcb", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "0035c95a18d4f8e8", "fileio": "0035c95a18d4f8e8", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c", "w32.winsock2": "6446627d4f07a1b5", "winsock2": "6446627d4f07a1b5"} \ No newline at end of file diff --git a/thistest/output/bbdf3bbd4c3bc28c.deps.json b/thistest/output/bbdf3bbd4c3bc28c.deps.json deleted file mode 100644 index 215ffb4..0000000 --- a/thistest/output/bbdf3bbd4c3bc28c.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb", "benchmark_main": "f71cf01f35e2325a", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "203a3999d5300163", "fileio": "203a3999d5300163", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c"} \ No newline at end of file diff --git a/thistest/output/c1371d3dc6b676c2.deps.json b/thistest/output/c1371d3dc6b676c2.deps.json deleted file mode 100644 index d8aa459..0000000 --- a/thistest/output/c1371d3dc6b676c2.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"stdio": "6f62fe05c5ea1ceb", "w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "this": "a7bc8c01684c0001", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb"} \ No newline at end of file diff --git a/thistest/output/f6b51804a0ba8ff0.deps.json b/thistest/output/f6b51804a0ba8ff0.deps.json deleted file mode 100644 index 215ffb4..0000000 --- a/thistest/output/f6b51804a0ba8ff0.deps.json +++ /dev/null @@ -1 +0,0 @@ -{"w32.win32base": "7e529fe7a078cfef", "win32base": "7e529fe7a078cfef", "w32.win32console": "bbdf3bbd4c3bc28c", "win32console": "bbdf3bbd4c3bc28c", "stdint": "f5522571bcce7bcb", "benchmark_main": "f71cf01f35e2325a", "w32.win32file": "f6b51804a0ba8ff0", "win32file": "f6b51804a0ba8ff0", "w32.fileio": "203a3999d5300163", "fileio": "203a3999d5300163", "w32.win32memory": "72e2d5ccb7cedcf1", "win32memory": "72e2d5ccb7cedcf1", "w32.win32process": "067c78e9f121dce3", "win32process": "067c78e9f121dce3", "w32.win32sync": "06f53cc594b4ac6c", "win32sync": "06f53cc594b4ac6c"} \ No newline at end of file diff --git a/thistest/temp/153805db5704f3e0.pyi b/thistest/temp/153805db5704f3e0.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/153805db5704f3e0.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/203a3999d5300163.pyi b/thistest/temp/203a3999d5300163.pyi deleted file mode 100644 index a0c57dc..0000000 --- a/thistest/temp/203a3999d5300163.pyi +++ /dev/null @@ -1,80 +0,0 @@ -""" -Auto-generated Python stub file from w32.fileio.py -Module: w32.fileio -""" - - -import t, c -from stdint import * -import w32.win32base -import w32.win32file - -class MODE(t.CEnum): - R = 0 - W = 1 - A = 2 - RP = 3 - WP = 4 - AP = 5 - X = 6 - XP = 7 -class FRESULT(t.CEnum): - OK = 0 - ERR = -1 - ERR_CLOSED = -2 - ERR_PERM = -3 - ERR_IO = -4 - ERR_NOTFOUND = -5 - -SEEK_SET: t.CDefine = 0 -SEEK_CUR: t.CDefine = 1 -SEEK_END: t.CDefine = 2 -INVALID_SET_FILE_POINTER: t.CDefine = -1 -SHARE_READ: t.CDefine = 0x00000001 -SHARE_WRITE: t.CDefine = 0x00000002 -SHARE_DELETE: t.CDefine = 0x00000004 - -class File: - handle: w32.win32base.HANDLE - closed: bool - can_read: bool - can_write: bool - is_append: bool - _share_mode: ULONG - def __init__(self: File, filename: str, mode: ULONG, share: ULONG) -> t.CInt: pass - def __enter__(self: File) -> 'File' | t.CPtr: pass - def __exit__(self: File) -> t.CInt: pass - def read(self: File, buf: bytes, count: ULONG) -> LONG: pass - def write(self: File, buf: bytes, count: ULONG) -> LONG: pass - def write_str(self: File, s: str) -> LONG: pass - def seek(self: File, offset: LONG, origin: ULONG) -> LONG: pass - def tell(self: File) -> LONG: pass - def close(self: File) -> LONG: pass - def flush(self: File) -> LONG: pass - def size(self: File) -> LONGLONG: pass - def readline(self: File, buf: bytes, max_count: ULONG) -> LONG: pass - def read_all(self: File, buf: bytes, max_count: ULONG) -> LONG: pass -class FileW: - handle: w32.win32base.HANDLE - closed: bool - can_read: bool - can_write: bool - is_append: bool - _share_mode: ULONG - def __init__(self: FileW, filename: w32.win32base.LPCWSTR, mode: ULONG, share: ULONG) -> t.CInt: pass - def __enter__(self: FileW) -> 'FileW' | t.CPtr: pass - def __exit__(self: FileW) -> t.CInt: pass - def read(self: FileW, buf: bytes, count: ULONG) -> LONG: pass - def write(self: FileW, buf: bytes, count: ULONG) -> LONG: pass - def write_str(self: FileW, s: str) -> LONG: pass - def seek(self: FileW, offset: LONG, origin: ULONG) -> LONG: pass - def tell(self: FileW) -> LONG: pass - def close(self: FileW) -> LONG: pass - def flush(self: FileW) -> LONG: pass - def size(self: FileW) -> LONGLONG: pass - def readline(self: FileW, buf: bytes, max_count: ULONG) -> LONG: pass - def read_all(self: FileW, buf: bytes, max_count: ULONG) -> LONG: pass - -def open(filename: str, mode: ULONG, share: ULONG) -> File | t.CPtr: pass - -def openw(filename: LPCWSTR, mode: ULONG, share: ULONG) -> FileW | t.CPtr: pass diff --git a/thistest/temp/271ea3decb810db2.pyi b/thistest/temp/271ea3decb810db2.pyi new file mode 100644 index 0000000..3d637bf --- /dev/null +++ b/thistest/temp/271ea3decb810db2.pyi @@ -0,0 +1,26 @@ +""" +Auto-generated Python stub file from atom.py +Module: atom +""" + + +import t, c + +ATOMIC_RELAXED: t.CDefine = 0 +ATOMIC_CONSUME: t.CDefine = 1 +ATOMIC_ACQUIRE: t.CDefine = 2 +ATOMIC_RELEASE: t.CDefine = 3 +ATOMIC_ACQ_REL: t.CDefine = 4 +ATOMIC_SEQ_CST: t.CDefine = 5 + +def __atomic_test_and_set(ptr: t.CUInt64T | t.CPtr, order: t.CInt) -> t.CBool: pass + +def __atomic_clear(ptr: t.CUInt64T | t.CPtr, order: t.CInt) -> t.CVoid: pass + +def __atomic_thread_fence(order: t.CInt) -> t.CVoid: pass + +def __atomic_signal_fence(order: t.CInt) -> t.CVoid: pass + +def __atomic_always_lock_free(size: t.CSizeT, ptr: t.CVoid | t.CPtr) -> t.CBool: pass + +def __atomic_is_lock_free(size: t.CSizeT, ptr: t.CVoid | t.CPtr) -> t.CBool: pass diff --git a/thistest/temp/28d30831dd445f0f.pyi b/thistest/temp/28d30831dd445f0f.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/28d30831dd445f0f.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/2db2d238d218d3d8.pyi b/thistest/temp/2db2d238d218d3d8.pyi deleted file mode 100644 index d78cb7d..0000000 --- a/thistest/temp/2db2d238d218d3d8.pyi +++ /dev/null @@ -1,9 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -def this() -> t.CInt: pass diff --git a/thistest/temp/2df45af226a48b4b.pyi b/thistest/temp/2df45af226a48b4b.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/2df45af226a48b4b.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/3624cfde3c5cb6cb.pyi b/thistest/temp/3624cfde3c5cb6cb.pyi new file mode 100644 index 0000000..cf49077 --- /dev/null +++ b/thistest/temp/3624cfde3c5cb6cb.pyi @@ -0,0 +1,10 @@ +""" +Auto-generated Python stub file from viperstring.py +Module: viperstring +""" + +import t +import c + + +from .string import * \ No newline at end of file diff --git a/thistest/temp/6166aecc7fa7ad65.pyi b/thistest/temp/6166aecc7fa7ad65.pyi new file mode 100644 index 0000000..65d4528 --- /dev/null +++ b/thistest/temp/6166aecc7fa7ad65.pyi @@ -0,0 +1,12 @@ +""" +Auto-generated Python stub file from hello.py +Module: hello +""" + +import t +import c + + +import stdio + +def helloworld() -> t.CInt: pass diff --git a/thistest/temp/77dcdc6020d63dc5.pyi b/thistest/temp/77dcdc6020d63dc5.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/77dcdc6020d63dc5.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/81d55b73067644b3.doc.json b/thistest/temp/81d55b73067644b3.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/thistest/temp/81d55b73067644b3.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/thistest/temp/81d55b73067644b3.pyi b/thistest/temp/81d55b73067644b3.pyi deleted file mode 100644 index a51320e..0000000 --- a/thistest/temp/81d55b73067644b3.pyi +++ /dev/null @@ -1,14 +0,0 @@ -""" -Auto-generated Python stub file from benchmark_main.py -Module: benchmark_main -""" - - -import w32.win32console as w32cmd -import this -import t, c - -pagecode: t.CDefine = 65001 - -@t.CExport -def main() -> int: pass diff --git a/thistest/temp/86df096a4b57c422.pyi b/thistest/temp/86df096a4b57c422.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/86df096a4b57c422.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/87f45d9188e9d92f.pyi b/thistest/temp/87f45d9188e9d92f.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/87f45d9188e9d92f.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/.transpyc_cache/067f811511854c88.doc.json b/thistest/temp/8c37156d7b67c1f5.doc.json similarity index 100% rename from .transpyc_cache/067f811511854c88.doc.json rename to thistest/temp/8c37156d7b67c1f5.doc.json diff --git a/thistest/temp/c1371d3dc6b676c2.pyi b/thistest/temp/8c37156d7b67c1f5.pyi similarity index 55% rename from thistest/temp/c1371d3dc6b676c2.pyi rename to thistest/temp/8c37156d7b67c1f5.pyi index a51320e..7aef927 100644 --- a/thistest/temp/c1371d3dc6b676c2.pyi +++ b/thistest/temp/8c37156d7b67c1f5.pyi @@ -5,10 +5,19 @@ Module: benchmark_main import w32.win32console as w32cmd +import viperstring as string +import memhub +import stdlib +import stdio +import hello import this import t, c pagecode: t.CDefine = 65001 +def add(x: int, y: int) -> t.CInt: pass + +def minus(x: int, y: int) -> t.CInt: pass + @t.CExport def main() -> int: pass diff --git a/thistest/temp/90c53dd6db8d41cf.pyi b/thistest/temp/90c53dd6db8d41cf.pyi new file mode 100644 index 0000000..98359ba --- /dev/null +++ b/thistest/temp/90c53dd6db8d41cf.pyi @@ -0,0 +1,20 @@ +""" +Auto-generated Python stub file from stdlib.py +Module: stdlib +""" + +import c + + +from stdint import * +import t + +def malloc(size: t.CSizeT) -> t.CVoid | t.CPtr | t.State: pass + +def calloc(nmemb: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr | t.State: pass + +def realloc(p: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CVoid | t.CPtr | t.State: pass + +def free(p: t.CVoid | t.CPtr) -> t.State: pass + +def system(cmd: t.CConst | t.CChar | t.CPtr) -> INT | t.State: pass diff --git a/thistest/temp/9474791561654346.pyi b/thistest/temp/9474791561654346.pyi new file mode 100644 index 0000000..1f82b1e --- /dev/null +++ b/thistest/temp/9474791561654346.pyi @@ -0,0 +1,59 @@ +""" +Auto-generated Python stub file from string.py +Module: string +""" + + +from stdint import * +import t, c + +def strcpy(dest: str, src: str) -> str: pass + +def strcat(dest: str, src: str) -> str: pass + +def strncpy(dest: str, src: str, n: t.CSizeT) -> str: pass + +def strlen(src: str) -> t.CSizeT | t.CExport: pass + +def strcmp(str1: str, str2: str) -> t.CInt: pass + +def samestr(str1: str, str2: str) -> bool: pass + +def strncmp(str1: str, str2: str, n: t.CSizeT) -> t.CInt: pass + +def memcmp(ptr1: t.CVoid | t.CPtr, ptr2: t.CVoid | t.CPtr, n: t.CSizeT) -> t.CInt: pass + +def strchr(s: str, cr: t.CInt) -> str: pass + +def strrchr(s: str, cr: t.CInt) -> str: pass + +def strstr(s: str, needle: str) -> str: pass + +def strspn(s: str, skip: str) -> int: pass + +def memset(ptr: t.CVoid | t.CPtr, value: t.CInt, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memset32(ptr: t.CVoid | t.CPtr, value: t.CUInt32T, count: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def memcpy(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr | t.CExport: pass + +def memmove(dest: t.CVoid | t.CPtr, src: t.CVoid | t.CPtr, num: t.CSizeT) -> t.CVoid | t.CPtr: pass + +def atoi(src: str) -> t.CInt: pass + +def atoll(src: str) -> t.CInt64T: pass + +def atof(src: str) -> t.CDouble: pass + +def split(s: str, delim: str, result: t.CArray[str]) -> int: pass + + +ascii_lowercase: t.CExtern | str +ascii_uppercase: t.CExtern | str +ascii_letters: t.CExtern | str +digits: t.CExtern | str +hexdigits: t.CExtern | str +octdigits: t.CExtern | str +punctuation: t.CExtern | str +whitespace: t.CExtern | str +printable: t.CExtern | str \ No newline at end of file diff --git a/thistest/temp/9664af47f66007d8.pyi b/thistest/temp/9664af47f66007d8.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/9664af47f66007d8.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/98028bc8b755b5f0.pyi b/thistest/temp/98028bc8b755b5f0.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/98028bc8b755b5f0.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/9db454840b9dbfe8.pyi b/thistest/temp/9db454840b9dbfe8.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/9db454840b9dbfe8.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/_phase1_manifest.json b/thistest/temp/_phase1_manifest.json index 0a89b99..9594612 100644 --- a/thistest/temp/_phase1_manifest.json +++ b/thistest/temp/_phase1_manifest.json @@ -1 +1 @@ -{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\BenchmarkProject\\App\\benchmark_main.py": {"sha1": "f71cf01f35e2325a", "mtime": 1782991404.519475, "size": 233}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\thistest\\App\\benchmark_main.py": {"sha1": "c1371d3dc6b676c2", "mtime": 1784107847.4885626, "size": 263}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "d:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\this.py": {"sha1": "a7bc8c01684c0001", "mtime": 1784109007.4091208, "size": 1345}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\thistest\\App\\benchmark_main.py": {"sha1": "c1371d3dc6b676c2", "mtime": 1784107847.4885626, "size": 263}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\this.py": {"sha1": "a7bc8c01684c0001", "mtime": 1784109007.4091208, "size": 1345}} \ No newline at end of file +{"D:\\Users\\TermiNexus\\Desktop\\TransPyC\\thistest\\App\\benchmark_main.py": {"sha1": "8c37156d7b67c1f5", "mtime": 1784430860.3193777, "size": 1144}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\atom.py": {"sha1": "271ea3decb810db2", "mtime": 1782226548.693161, "size": 1290}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\hello.py": {"sha1": "6166aecc7fa7ad65", "mtime": 1784387694.4150121, "size": 72}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\memhub.py": {"sha1": "f3560b99de458aec", "mtime": 1784375410.1873891, "size": 19458}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdint.py": {"sha1": "f5522571bcce7bcb", "mtime": 1782383975.8824987, "size": 4356}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdio.py": {"sha1": "6f62fe05c5ea1ceb", "mtime": 1783239556.0959673, "size": 714}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\stdlib.py": {"sha1": "90c53dd6db8d41cf", "mtime": 1783874975.3597875, "size": 375}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\string.py": {"sha1": "9474791561654346", "mtime": 1784387475.6951904, "size": 10395}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\this.py": {"sha1": "a7bc8c01684c0001", "mtime": 1784109007.4091208, "size": 1345}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperio.py": {"sha1": "c9f4be41ca1cc2b4", "mtime": 1782812279.506002, "size": 1556}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\viperstring.py": {"sha1": "3624cfde3c5cb6cb", "mtime": 1778930749.052393, "size": 23}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32base.py": {"sha1": "7e529fe7a078cfef", "mtime": 1782488356.7736557, "size": 2662}, "D:\\Users\\TermiNexus\\Desktop\\TransPyC\\includes\\w32\\win32console.py": {"sha1": "bbdf3bbd4c3bc28c", "mtime": 1781200703.5338137, "size": 5604}} \ No newline at end of file diff --git a/thistest/temp/_sha1_map.txt b/thistest/temp/_sha1_map.txt index c553a6a..eba7030 100644 --- a/thistest/temp/_sha1_map.txt +++ b/thistest/temp/_sha1_map.txt @@ -1,6 +1,13 @@ +271ea3decb810db2:includes/atom.py +3624cfde3c5cb6cb:includes/viperstring.py +6166aecc7fa7ad65:includes/hello.py 6f62fe05c5ea1ceb:includes/stdio.py 7e529fe7a078cfef:includes/w32\win32base.py +8c37156d7b67c1f5:benchmark_main.py +90c53dd6db8d41cf:includes/stdlib.py +9474791561654346:includes/string.py a7bc8c01684c0001:includes/this.py bbdf3bbd4c3bc28c:includes/w32\win32console.py -c1371d3dc6b676c2:benchmark_main.py +c9f4be41ca1cc2b4:includes/viperio.py +f3560b99de458aec:includes/memhub.py f5522571bcce7bcb:includes/stdint.py diff --git a/thistest/temp/a642413df3ed705a.pyi b/thistest/temp/a642413df3ed705a.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/a642413df3ed705a.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/bbc118f202878cbe.pyi b/thistest/temp/bbc118f202878cbe.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/bbc118f202878cbe.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/bc52093344ff9400.pyi b/thistest/temp/bc52093344ff9400.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/bc52093344ff9400.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/c1371d3dc6b676c2.doc.json b/thistest/temp/c1371d3dc6b676c2.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/thistest/temp/c1371d3dc6b676c2.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/thistest/temp/c38e082ec6d38c8e.pyi b/thistest/temp/c38e082ec6d38c8e.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/c38e082ec6d38c8e.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/c9f4be41ca1cc2b4.pyi b/thistest/temp/c9f4be41ca1cc2b4.pyi new file mode 100644 index 0000000..fdbd7ec --- /dev/null +++ b/thistest/temp/c9f4be41ca1cc2b4.pyi @@ -0,0 +1,22 @@ +""" +Auto-generated Python stub file from viperio.py +Module: viperio +""" + + +import t, c +from stdint import * + +class Buf: + data: t.CChar | t.CPtr + length: t.CSizeT + capacity: t.CSizeT + owned: bool + def __init__(self: Buf, data: t.CChar | t.CPtr, capacity: t.CSizeT, length: t.CSizeT, owned: bool) -> t.CInt: pass + def clear(self: Buf) -> t.CInt: pass + def write(self: Buf, src: t.CChar | t.CPtr, count: t.CSizeT) -> t.CSizeT: pass + def cstr(self: Buf) -> t.CChar | t.CPtr: pass + def reset(self: Buf) -> t.CInt: pass + def __enter__(self: Buf) -> 'Buf' | t.CPtr: pass + def __exit__(self: Buf) -> t.CInt: pass + def free(self: Buf) -> t.CInt: pass \ No newline at end of file diff --git a/thistest/temp/e907dcfbc2e1b32b.pyi b/thistest/temp/e907dcfbc2e1b32b.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/e907dcfbc2e1b32b.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/f3560b99de458aec.pyi b/thistest/temp/f3560b99de458aec.pyi new file mode 100644 index 0000000..84f0bbf --- /dev/null +++ b/thistest/temp/f3560b99de458aec.pyi @@ -0,0 +1,86 @@ +""" +Auto-generated Python stub file from memhub.py +Module: memhub +""" + + +import t, c +from stdint import * +import string +import atom +import viperio + +MEMHUB_ALIGN: t.CDefine = 8 +MEMSLAB_MIN_BLOCK: t.CDefine = 16 +MEMSLAB_BITMAP_BYTES: t.CDefine = 256 +MEMBUDDY_MIN_BLOCK: t.CDefine = 32 +MEMBUDDY_MAX_ORDERS: t.CDefine = 32 +MEMBUDDY_HEADER_SIZE: t.CDefine = 8 + +def _align_up(val: t.CSizeT, align: t.CSizeT) -> t.CSizeT: pass + +def _largest_pow2_le(val: t.CSizeT) -> t.CSizeT: pass + +def _block_size_at_order(order: t.CInt) -> t.CSizeT: pass + + +@t.CVTable +class MemManager: + __provides__: list[str] = ['__memmgr__'] + base: t.CVoid | t.CPtr + size: t.CSizeT + def __init__(self: MemManager, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemManager, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemManager, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemManager) -> t.CInt: pass + def calloc(self: MemManager, count: t.CSizeT, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def realloc(self: MemManager, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def __enter__(self: MemManager) -> 'MemManager' | t.CPtr: pass + def __exit__(self: MemManager) -> t.CInt: pass + def alloc_buf(self: MemManager, capacity: t.CSizeT) -> viperio.Buf | t.CPtr: pass +class MemPool(MemManager): + offset: t.CSizeT + high_water: t.CSizeT + def __init__(self: MemPool, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemPool, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemPool, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemPool) -> t.CInt: pass +class MemSlab(MemManager): + block_size: t.CSizeT + block_count: t.CSizeT + used_count: t.CSizeT + free_list: t.CVoid | t.CPtr + alloc_map: t.CUInt8T | t.CPtr + alloc_map_size: t.CSizeT + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemSlab, base: t.CVoid | t.CPtr, size: t.CSizeT, block_size: t.CSizeT) -> t.CInt: pass + def alloc(self: MemSlab, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemSlab, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemSlab) -> t.CInt: pass +class MemBuddy(MemManager): + max_order: t.CInt + free_lists: t.CUInt64T | t.CPtr + lock_val: t.CVolatile | t.CInt + usable: t.CVoid | t.CPtr + usable_size: t.CSizeT + def __init__(self: MemBuddy, base: t.CVoid | t.CPtr, size: t.CSizeT) -> t.CInt: pass + def _fl_push(self: MemBuddy, order: t.CInt, block: t.CVoid | t.CPtr) -> t.CInt: pass + def _fl_pop(self: MemBuddy, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _fl_find_and_remove(self: MemBuddy, order: t.CInt, target: t.CVoid | t.CPtr) -> t.CInt: pass + def _buddy_of(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CVoid | t.CPtr: pass + def _order_for_size(self: MemBuddy, size: t.CSizeT) -> t.CInt: pass + def _split_to_order(self: MemBuddy, to_order: t.CInt) -> t.CVoid | t.CPtr: pass + def _coalesce(self: MemBuddy, block: t.CVoid | t.CPtr, order: t.CInt) -> t.CInt: pass + def _is_valid_ptr(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def _lock(self: MemBuddy) -> t.CInt: pass + def _unlock(self: MemBuddy) -> t.CInt: pass + def alloc(self: MemBuddy, size: t.CSizeT) -> t.CVoid | t.CPtr: pass + def free(self: MemBuddy, ptr: t.CVoid | t.CPtr) -> t.CInt: pass + def reset(self: MemBuddy) -> t.CInt: pass + def realloc(self: MemBuddy, ptr: t.CVoid | t.CPtr, new_size: t.CSizeT) -> t.CVoid | t.CPtr: pass + @property + def mem_size(self: MemBuddy) -> t.CSizeT: pass + def stats(self: MemBuddy) -> t.CSizeT: pass + def free_count(self: MemBuddy) -> t.CSizeT: pass + def self_check(self: MemBuddy) -> t.CInt: pass \ No newline at end of file diff --git a/thistest/temp/f69ce03954b469e7.pyi b/thistest/temp/f69ce03954b469e7.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/f69ce03954b469e7.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/f6d5ab5251ee8b21.pyi b/thistest/temp/f6d5ab5251ee8b21.pyi deleted file mode 100644 index a00afbc..0000000 --- a/thistest/temp/f6d5ab5251ee8b21.pyi +++ /dev/null @@ -1,11 +0,0 @@ -""" -Auto-generated Python stub file from this.py -Module: this -""" - - -import stdio, t, c - -s: t.CExtern | str - -def this() -> t.CInt: pass diff --git a/thistest/temp/f71cf01f35e2325a.doc.json b/thistest/temp/f71cf01f35e2325a.doc.json deleted file mode 100644 index 9e26dfe..0000000 --- a/thistest/temp/f71cf01f35e2325a.doc.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/thistest/temp/f71cf01f35e2325a.pyi b/thistest/temp/f71cf01f35e2325a.pyi deleted file mode 100644 index d500571..0000000 --- a/thistest/temp/f71cf01f35e2325a.pyi +++ /dev/null @@ -1,13 +0,0 @@ -""" -Auto-generated Python stub file from benchmark_main.py -Module: benchmark_main -""" - - -import w32.win32console as w32cmd -import t, c - -pagecode: t.CDefine = 65001 - -@t.CExport -def main() -> int: pass

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