cpyte 4.6.2__tar.gz → 4.6.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. {cpyte-4.6.2/source/cpyte.egg-info → cpyte-4.6.3}/PKG-INFO +2 -2
  2. {cpyte-4.6.2 → cpyte-4.6.3}/readme.md +1 -1
  3. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/__init__.py +1 -1
  4. cpyte-4.6.3/source/cpyte/_bignum_bc.py +181 -0
  5. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/astparse.py +34 -26
  6. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/bytecoding.py +87 -25
  7. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/compiling.py +49 -5
  8. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/elf2sef.py +10 -7
  9. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/extension_hooks.py +9 -41
  10. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/lexar.py +0 -2
  11. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/lsp_server.py +397 -9
  12. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/mainpie.py +14 -4
  13. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/optimizations.py +3 -2
  14. cpyte-4.6.3/source/cpyte/runpy_runtime.c +638 -0
  15. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/sef.py +14 -6
  16. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/semantic_analasis.py +61 -24
  17. {cpyte-4.6.2 → cpyte-4.6.3/source/cpyte.egg-info}/PKG-INFO +2 -2
  18. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte.egg-info/SOURCES.txt +1 -0
  19. cpyte-4.6.2/source/cpyte/_bignum_bc.py +0 -179
  20. {cpyte-4.6.2 → cpyte-4.6.3}/MANIFEST.in +0 -0
  21. {cpyte-4.6.2 → cpyte-4.6.3}/pyproject.toml +0 -0
  22. {cpyte-4.6.2 → cpyte-4.6.3}/setup.cfg +0 -0
  23. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/__main__.py +0 -0
  24. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/_runtime_bc.py +0 -0
  25. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/bignum.c +0 -0
  26. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/bignum_protos.h +0 -0
  27. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/clib.py +0 -0
  28. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/floats_runtime.c +0 -0
  29. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/formatter.py +0 -0
  30. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/gc_runtime.c +0 -0
  31. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/generate_bc.py +0 -0
  32. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/linker.py +0 -0
  33. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/mksef.py +0 -0
  34. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/package_manifest.py +0 -0
  35. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/runtime.c +0 -0
  36. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/runtime_scorpion.c +0 -0
  37. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/scorpion_abi.py +0 -0
  38. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/ugc.h +0 -0
  39. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/ui.py +0 -0
  40. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/update_check.py +0 -0
  41. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/winjit_patch.py +0 -0
  42. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte/winjit_stubs.c +0 -0
  43. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte.egg-info/dependency_links.txt +0 -0
  44. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte.egg-info/entry_points.txt +0 -0
  45. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte.egg-info/requires.txt +0 -0
  46. {cpyte-4.6.2 → cpyte-4.6.3}/source/cpyte.egg-info/top_level.txt +0 -0
  47. {cpyte-4.6.2 → cpyte-4.6.3}/test/test_bignum_jit.py +0 -0
  48. {cpyte-4.6.2 → cpyte-4.6.3}/test/test_compiler_regressions.py +0 -0
  49. {cpyte-4.6.2 → cpyte-4.6.3}/test/test_fuzz_del_has.py +0 -0
  50. {cpyte-4.6.2 → cpyte-4.6.3}/test/test_scorpion_abi.py +0 -0
  51. {cpyte-4.6.2 → cpyte-4.6.3}/test/test_scorpion_dl.py +0 -0
  52. {cpyte-4.6.2 → cpyte-4.6.3}/test/test_sef_tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cpyte
3
- Version: 4.6.2
3
+ Version: 4.6.3
4
4
  Summary: The Cpyte programming language compiler
5
5
  Author: Hoang Duy Tung
6
6
  License: MIT
@@ -10,7 +10,7 @@ Requires-Dist: llvmlite>=0.45
10
10
  Requires-Dist: lsprotocol>=2025.0.0
11
11
  Requires-Dist: pygls>=1.3.1
12
12
 
13
- NOTICE: It seems cpyte has been going through a lot of changes, including the OOP work which was quite fabulous and python-like. I liked how the syntax changes very interestingly and made the language better. However, as many changes are breaking-change and usualy a prone to error, I've decided to finalize a syntax-lock, in just a 2 months. After that, improvements will be delivered through the @std/improvements package with the extension hook framework.
13
+ NOTICE: It seems cpyte has been going through a lot of changes, including the OOP work which was quite fabulous and python-like. I liked how the syntax changes very interestingly and made the language better. However, after a lot of experimentation and many breaking changes, I've decided that the syntax lock is now settled. The language is being stabilized, and development will slow down as we focus on reliability and polish instead of constant churn. After that, improvements will be delivered through the @std/improvements package with the extension hook framework.
14
14
 
15
15
  Check out the official documentation [here](https://gitea.5gnew.io.vn/Cpyte-Project/Cpyte/src/branch/main/source/cpyte/cpy_language_documentation.md).
16
16
 
@@ -1,4 +1,4 @@
1
- NOTICE: It seems cpyte has been going through a lot of changes, including the OOP work which was quite fabulous and python-like. I liked how the syntax changes very interestingly and made the language better. However, as many changes are breaking-change and usualy a prone to error, I've decided to finalize a syntax-lock, in just a 2 months. After that, improvements will be delivered through the @std/improvements package with the extension hook framework.
1
+ NOTICE: It seems cpyte has been going through a lot of changes, including the OOP work which was quite fabulous and python-like. I liked how the syntax changes very interestingly and made the language better. However, after a lot of experimentation and many breaking changes, I've decided that the syntax lock is now settled. The language is being stabilized, and development will slow down as we focus on reliability and polish instead of constant churn. After that, improvements will be delivered through the @std/improvements package with the extension hook framework.
2
2
 
3
3
  Check out the official documentation [here](https://gitea.5gnew.io.vn/Cpyte-Project/Cpyte/src/branch/main/source/cpyte/cpy_language_documentation.md).
4
4
 
@@ -1,4 +1,4 @@
1
- __version__ = "4.6.2"
1
+ __version__ = "4.6.3"
2
2
 
3
3
  # ---------------------------------------------------------------------------
4
4
  # Public library API.
@@ -0,0 +1,181 @@
1
+ import base64
2
+ import zlib
3
+
4
+ from llvmlite import binding
5
+
6
+ _B64 = (
7
+ "eJzten14E1Xa/plMmgltOglQIKVJmABiVT6mKWD6pUlToCpqQFxx1U3SD2hdStO0lNLV3UxTmqrVDVi1"
8
+ "P9d1W2F9wf2wsl0vVlk3aSpWqFhd1MqybAoFC4tQAXfZj9/u+5yZSZNMcK93972u9y9LSc/c88yZ+zzn"
9
+ "ee7znJmcCM5KQ/CTAf8fWYPQP+Gn2BY8sQyAFMDKVOz82+9/6+Wav/3y7rQ13tUEYEYVQh/RCKXJjEgG"
10
+ "x3PhP8XN22EdlN+m0JjydhKtqutSlJkG+RNlXu0KWfHOtOIBjSnDrNTekWoqay/trTDa2trlq3Sm4vl1"
11
+ "g8qp82+wtHVo7iBMFa3KnTpm3sr20ygzp1ieeWP2jYE1DzLzfmVpU2WGqcMzMss6OuZTmaayhXmDganz"
12
+ "Bqe10/r8ipJVg5q5tpWyzNnoMQahbMxpg1yzr7jlsalr4WNHXb+9NHXKgpUHU4rLFigPes8oA51T9s0d"
13
+ "9HXLg0rLVJXzKZTxOGJWIK9Ji0yrkGK7E3lvIBGqZFG3RgF/nfAXBdEKi9fEorVKEgVatKifUck6OZd3"
14
+ "rnb1VK3zKSabDFf9mEXog9udKvlulJvifnrpik72L/98v/DTJXdOvW51lVPLkMXY32u0CD0EDs4av+4q"
15
+ "9jkRaGGVyvqA313l91SRTU3+BjfVnE1tQ8dH9cd70kd6dP0hHerXn+hJH7ca+glDxKg/Pqo71q3v5wzD"
16
+ "RDe1bY/fg9q3dfvdWv8W6CHg39rt92ip5iZqWxVZt4eqZ/2egH95l79hGCwnEDNu1I2N6g5xhmNOXaTH"
17
+ "4HV7qSYn3N3X2E56oZ+Avz6baq4i67P97m5/c8Dv6aKc6f09ujNc+seMboQzHLfOORgyjDjTBzjDhwA6"
18
+ "dQc5XURoGPWDxBw4ddClixDY5uCo/hg0iDnHewzHeJsxlw7wQaN+HA69uhOcIWI1nOAwOMTp+2F0gAeB"
19
+ "W3q/1XAsZJjw8odG+nwQTumxGWEYH9V/GOJ7COrOARjiDcDSoj/j0p0I6c/jzvVnenC3x3swAo2IEYwN"
20
+ "w3AKGQ5ZDUM9ehG3Gg5xujFhjBZDvwszB54RnuoYx1NyGgb4z2FwoFdsnOEbkR7dQejBZYA5+tClG+fN"
21
+ "zlj53oKGiWD6SQb3c55QH7fQ/VHwzCTojYHnomA/MWJRIktqVrsRlbrCb2pwvNyqOcOoR4fp08OKiQn6"
22
+ "bIS+Yqcvof3hgv22rF5bXqsvD7UWHLBlDfsKW8nCoC1/fzivz1rQShZ1kxb1Jbv6NNJctqhHWfqP0AOj"
23
+ "vmhRn2bpKxP0pWHFSbv6jJM+zahrWPXZbrCMEJZhm3kwnNdJFvWFzEFbERpF6okgvvvnGgpZ1aOM+jM7"
24
+ "fWVYccZOj1rUXzLQmzo4u9WWN0Rm/dRq7iWL9vtu6fAV9YZmt5NFuwEMmTvIvKDQsOUHyFvgVEfYHCQL"
25
+ "+UZBHzTIW/bbivp4m8GwGfCALX8YDom8A2RR0Fd4gMwDsIssaIXRAc7lBW1Zrb7CPl9RhBAOIUzhVAFv"
26
+ "VjgcLtjtKxjmLY8C6OMNsGX+UNh8wFcwgjsvGLLhbvfb8gCBRtBmPor9BqcKO32FXbYCEfcVdpJ5g8IY"
27
+ "ucLWMGYOPIM81UGSpxQqbOc/u8GBhNgY4htBW14H9BAuhDnaHTYP82ZDPjPfW1GEyxqw4n5GSMN+Ttca"
28
+ "BYcmQUI/CR6Ngq1kL7HhcRwgc9A9aH63WnY/I3ugyaqR41870w8JMqo/2JM+ZNQdM+pHjHO8jUqq0enf"
29
+ "qqW8LLVN6W/M9i/3+reWUlg9AlQQ58Uxr/6QUTdEMKBFx7yGMSPOaEi6Iz3px4y6cUKPQBxArLxdVLPS"
30
+ "X7ceeqC2NYF8+eu6/VtBczT+ZpYCMdlW5dtWSj2aTSE1ajFAUh/p0Y33pB8kDOcIJdXkpfDdq/xmpGxW"
31
+ "UtvMfk+3fzmolpJq3kNty/ZvQyA7h/iUhIGMh/RXXDqc3RbduFEvSM2gIDUu3YecbkIQIpBKvnGiRx/h"
32
+ "9BMh/bke3thqOMjLzoccvmRwVD9OGMZG9YO8kowYdUd6RIU5xoAg6CEThcOTQRrkYkSQJs5wAnSY72Go"
33
+ "xzDC6QUDODzqMoDiHeflccQFqgL2+kOA8JrT32MAv2HB6dGNhXTHojgozyAvIFhtjKIKwRAO8o1BnhLo"
34
+ "Cf4k9P1WWmy4hAZcKGgXzJH+IM/qjMswwPeG5YWJycvYpOY4Y+D4JNgdBRmdN/2xqeg1FCh20kHFSQ1a"
35
+ "O2JhSJCjjvmolNizXPs4CsjsNcPPncZhRwUz0K184D2w56No1A3BgtWjP9STHhG0GoZMuP1b3f7lTjy5"
36
+ "9Ui5tcm/HJYwHAOw8PnrYQ2CSbdQEGw9hkMEAyPqd+k+7knnFwg8TJD9sZ70gR7DUEgHAn7MafjQOucQ"
37
+ "EYxfuXx1Xn8zwmslh+9+zEjHR90QLKmc4Rzvbe8yJV7dlq/3uZ1Us5t6VEt9x+lbpqGaSzFYp6U8XqHh"
38
+ "b2CoR+CU1l+Hl0vc2FoFDeoRt7+5ircJ+OsAZ/wN3XBIeiAR+HTwAMhSjUoYHcbrvf7lEORV1HeCpHAI"
39
+ "KgmnGnmzpm4hB3nLPQBSggEcbuny1zVRW3vxqcYuP+7W7Ye7bIWG1+/eg/0Gp5og3Vh/o4hD+lCegDBG"
40
+ "EtJ8G4DA08tTDVAenvk2Df9pAQeSYqOLb3hxIYETEOaoFJKaN+ui6vjegP/N7eA337JeqtBN5imjYFcM"
41
+ "zJ8E90RBJeUkf8Pyaxl6Gb0gi1Be+RWrM82obGHwb2orSKu5z5bXRxQegPWLLALtRRcm6AvDivOwyjhp"
42
+ "NEpfHFZcgXUQFqMAfcFN1wzj1WccgaIeteWhgUJYtjrC+dDDYLhgGPSWLDoAqwNnPurL67JB/1lDtvxx"
43
+ "sGxCmisa+pKbPm2BVY+esKst/Epkw4vmQPzyx+V12szDtiJe9nsVo3b6clDxbQ193qK+0K0+5VRv6lWc"
44
+ "tKjPAsjSpyz0hNAI0GNefOoUdI74xgT9OVKf96ov2NWf8zaXWBrwsQB9BQ4tNKzI/LqMwTNBetRNYzMn"
45
+ "PTGsgNX2c6e6STjUQHDAKd4Mqa8IxQB/6ssgfV4wgMNu+jJLX4zQf4J2kL5sx/YX7BiBxoSG/hL8BqeQ"
46
+ "Gtb9M8NRHNZxC31JGCP4mcXMgecET/WShafEqk/yn+Ma2hNt1PONCTt9iq8EYI7OsjwrVn2Z4XsD/hFF"
47
+ "nQb38ycvtZmhRqNg/SRoiYFbouAo2mR+HjHbg6BLy079HccP6hKDh0m7jaX4iJK/HhSiqKXb0goLfbig"
48
+ "w5bVhcMpv9d2C/oc5itIX2Rp5KIvaejP7XQNUl+EELLg4Xvx+t5HFMBEd5EWqKn6CJhuHA9QPLxgy+qD"
49
+ "ACDzEQzqSzuNctQQOad6cQ+XJnAZdsqivgi1E0N/6aShHIKC6nKA/itYGpC8CIqTF2x5w7asDrLwKKnB"
50
+ "wQDBDHFbFx+BUH1poCs19jyC8qmTLy1gIMO+gvGwGVcpHARhvlAyBcSSybybzIuIlVWhUFkdsBUEyYKI"
51
+ "r+CoDVcsUG908OXTbhJXYgFIChKnRoCviHpt5hdsYqXUZzUP2qAcMgiHA5weyp5eocSCJOLzEZ+yFfWS"
52
+ "BYIBHO4JF0Lltp8v83rDUB2BfUEnIHzt1GorAr/xBVXeoC+vL4pDKgX4QghXTTah/gGePFWuMMBTgroI"
53
+ "f5L5rT6d2AgLDbjQzCcjzFF+B89qKFzYzveGyyRrrHYanKydQjFweBK0RgsqqxlldVBomjdj+XjaFRxQ"
54
+ "pEXhJUq8Ga1WSxdU1DaIjaygUEzCWMgIzpeaIJ61M0gDGlUDNTY/uZCMn+Eimb7ipREwLOokLUC1NWz+"
55
+ "KfSAK9gi4A91KWhRu62oy5cHKtcXgki7pZP0JpTWp5D6S4SLeRLfvc+miw8nUDOo7Y/ybkQgR6f5VB0N"
56
+ "0lci9F9ZPusZ+kqAFiRoDIladNZCXxUECtfzuHFxGCSLvhqhvxzmjRn1KV6OzlrwJWMQ4Xycj/EKc14D"
57
+ "oxOVpwaid5iGDBUO65wUyMh5QaMsYnLhU3Y1pJ5gAIfnWDUo4QVeNs+z6tNgH6FPA8Jr0ahdDX7DQgR5"
58
+ "BCoXxSEvxnhhwSqkEdUJhnCKb4zxlEBn8KeXHmUoscHyDYR3OjizYI4COFsxCCLG94ZlRxOTHc+kFrEx"
59
+ "sGEStEdBDR1smz8NrUWvBHUvpbeWoN29XFcqxI+mkwj0K17Kh6qJXfIxDiW1dw6a9rXsfC0715Sdp+5A"
60
+ "pUaWcoYPOIXS6Luo5OtC6OtC6JqFELtP2OnfinanPzYT7UbruDyU9dLn/EYsgjdi/0ABbz76K9ObIuzF"
61
+ "NPLt6fLr0SO9PWf/AUbfQ3cRE6RFBgbbp04aPDYLTbFQuKudd6Np3alDxIjFSxATobbrVbGrImo0ZdwX"
62
+ "nLlS7DljeUaZRn4Gbco+GMEE/E6aNx6xBwjNHqKPy/YJbDeSLoUQ2x8qTqlk3gxv7oizO0QEZG5FVsdS"
63
+ "2GCiI05fjwL2mMHMTaUf871RAslvpkdJUlnyYKa8WrOp9BgD+1Czj0lvSX8sS45uQBs18lDbWLoc96xs"
64
+ "cZIyoSZEFajEK0cI3aZFyAR/p7dauhh5WM5pFyi357iUra5+i+odeYuWrpBNVYYBmVbZ3wsIV71AdSR3"
65
+ "tabbBbhtKWFsI3cseOV5y/p+952aXld/YMoxuevUAs0P/8yFWtHzTCunXa096FW1TbFmrtYMRVQL5BtZ"
66
+ "IseXa9ZUvzTslLkUGwOKwdaQ6kiki+0KZe4OyftVR5j0o87+Xnxqumx5l6Ur5N4TkodUx5wtrCLc2q86"
67
+ "HknXVGMD92rtkNO8ABhavT4CxtELG97GXjK/yhd7hKuETaJ/W5DK6yVv9sKvL/2/eMFvnsBLhsdNubup"
68
+ "eoZqZikPfgBIbdXwbR4UDKDdaKGanVTDsOIsfPKHNQG6joHdKYU/hxUXWNGshk0TkJcjNPRwu1o5dae1"
69
+ "rSMjk1ha3PXCx6Gf5C85/NmrjebPv2u9XN6w/kTboT+cu9R1y/ceeuKTT/7+0HPfP/xqTuHdS34zcPYX"
70
+ "b55ofHKr3WtUXQzAZOH54ggUpA+xbYRhJ0JeABgWoRFrzhQGIYIHEMzo+e5XOO1J4xSElADISOQ1zng5"
71
+ "Q+gBv6VASMHunuY7jZAF2hoeYb3Ge7NYSoNIoWP4JFR7L3nNXgR985cipHKWfkTdLUMWcDXDI05ku/Eb"
72
+ "gWkIpSLMAP+Q2rV/6d+FkB0J9wdKwcAr+udTlLhvC48EUdu6v0aWWpAunlLxlLcJvpdJSs+szlZrkCKe"
73
+ "UlMx50XmeEqVMx8n+V5ilPbbGQbR8ZTObj8p9DJJ6fGlGUqlN4HSz3vMQi+TlPqfVMhkkQQvbbPQfC8x"
74
+ "Sud2SSldNzeJ0sz7aQaPJEbp96UkQbgTKK3OSEFeWTylzS+VIDQ/gdL062QyS4KX9rAUbxCj9ODbOySU"
75
+ "3r7pScnEvdKQs4BBM+Mp/fqJHYgIJkzctzIovpcYpX9eKrTgMItR8vy/Ngmlj46UztAgKp7SsQ11Qi+T"
76
+ "lLbfPMghGyleRmAvDd8/F6Fp8ZR+dkQ6cYcakyYusks6cWvnpEgmbsb/XyiduH+skk7cM8VPQLqQ8RM3"
77
+ "u/lGSSw9+QFQiiRQenJ3qoRS99H1FlQYT+nhH8+TyYIJlBbNmKXBhzFKnseCXtQeT+mjO0oUcqzWsYlz"
78
+ "ly1n0AIU/QFKv7znbYKwEFEEKN2++yUataWKgAxTyq3cgth1IqLBlG6/6Sekt0dgCCTwxDkq9Ug1QzSS"
79
+ "Y0ruw+eQc4+IMJjS6W+toZAtRYTwxL3yz8fzkfZGEVFiSqH1R4mgXaRkwZRuHEqi5JkppTT7l3sklGb8"
80
+ "bIWU0qFFUkqVtUmUnn5CSmn0wSRKn/9cSql7q5TSG7+WeumZvyVR+scSKaUUnzXpdiqfdHTP6BRJzNeo"
81
+ "khzVpy1JckJOu3SAn5Yzegn54nctUmI/fpqTEnt8EblXSsyhWCshduOIareU2MnMJGJncgNSYs9UMUle"
82
+ "/SCJ2DMvJxF7+O4kYvf+JInYK470JGJfzF4Py9lMEeKT667l3SDCC6MQIgMjjN18lEBMmpxfikyGLl3m"
83
+ "1NWBjikLVh2U24pXotQepv2GlmnZrS3Z1LSl9LmTVzLXbX36sCf3b49+wo2d3vbDO6lfv9e97aHVz/nf"
84
+ "uXLld+m3v2+9cClv9d2/O7w0+7q7fvTbzW/QGRt+8YfyQN4LG557t2QP5/nk0/MZj5ZP+SYe5Wsgo2fg"
85
+ "b67SqxsY1W3IIIrabebWcEcx/5y8vqtOBQW88MwkV1Vs6MdvmnQb2BTezJfF77mKYAsz1NTR4Ka+o8QP"
86
+ "pd1uqtlNNjb53Yw/c2gqfT4A+331Zv7xApTfuZoB/QmjbsSo73cZNrCP4b027IP6yMID+A1pwdBERqOT"
87
+ "+k4VdTN+/07d7MUvEdxOqjGbaryaAt1u9fodUFNp/Z4u/7YubiHef0X4nQVLlg324NcuQ/zncZfukFEH"
88
+ "G9NDLsXHAby3EnZYefvDZtgxtZOwM10CN/17SwF+BRlWvVPtd6/3e9y+Bvwewd+g9Td0+zOP3KO+IDzo"
89
+ "4J9RjDI07PVymWz8RqnfavjQqDvOGY5HdGOj+nOEYYN2jbnXlv+Cr2DIPl8ciNO/tYlq6lqz+koAb0By"
90
+ "DQ/z702M+I3edwn8pmnIqJ9wKdZt95mHwgW9sE225f29v3DMVtAOh+GOt1NhpP6twEeJv4rg6eIePMU/"
91
+ "OD0N+yB2XuhDq2FsdNbIqP4EECjNLOj1FfX5slrD5g7YEoYL94fyYLN5lCwcKu2rwy8ZqTr+5WDm7w7C"
92
+ "dkz9eYTfVbF4n/UnO71ZQ8OWEA4vRxSwcRuz01fZeSfPu3T8K8tZ5436M0b9AH5lqR83ztnA/LDggK1o"
93
+ "P5nX6csbWn8AZh8G2ww8S/F7pczDn9EXWfVoBD+2wq+w2TCBX6PAWBxdECrYw/hbEF1cqzUvEgbXFcFM"
94
+ "DVkGuvWHevT4HVNIt2F+OUuP4vlVn8Uvx21G3xYtVV/qd3T7H/HCta91EoUdYfwcYNiWD+E0BB5TlRpn"
95
+ "FLsMQPVISL+Wy9iweiNsNmH3GlFctKuv4K7o0xGF+O6e3WXxNVbht66Za2fvDxdAHO62mYfAhyR+NDFE"
96
+ "FoIzO8OqlekHIXTxOyzddznDJfya7+BrCohA6AfmInfacq0fKn/xJWlXqA+/cC84EDb/XVZ0IJzfCdyq"
97
+ "jjP8ty+M+oPgwFA6nn1X22XFuJ0eRWo8zAnwPz9StI1BaBPk505DKWNrV2VOqagYfJfhOuSmlStXTueK"
98
+ "uwNfDAwq84rbOl4KHwBBemKn7r2s+XfLVe8Uo3tK7mC+Uempr67dvLW8yuVx1Fc3V9pvszGrKxsrN23Z"
99
+ "2uAq21S5weOqqVzkrq3e3FDpsbrdmyqZ8k2uzRuZRuFKxpSzmF3MMtk8usiUw7KLc/A/NueGTbVghz9q"
100
+ "azZXu2sbKjc3MPhG91TX4H5sS2w33cSsK7ZaoXN3Dm/p2ryNEW+GD9GZIkEI2Zbg7rCyf5Z6nrIjv4Nh"
101
+ "/whAb1gp+y09T9me18Ewn7Et3u6wKjzdkqvawbzHrg7nhi1TP1CR95bkyg+qrKawt+kjVfiLe3NVTqSA"
102
+ "1iVovXffeyxbbn/PnV1mf4xbofhEZcts55aF7YoK93us2bEs7FVU2X+vaOe0yb/rn4XPLGh0Ezftx40O"
103
+ "+YLsecuXv7n8uddv3pf/umlW7uu9v/jVmsfTDvctmsHjS/eZbn5jjQxqtb2gqzfDuNJSPdmgV1TzencX"
104
+ "5AgO77zhcMsZ3UHhu0MhnEqCDsxcespJf2bHD5nHLNFHzb1eDgcSVr8mf52Q++vdL4TNfUTBbl9RZ1j2"
105
+ "bfx+/Pio7jiDv8MDn+P8+9nhHt2gkLCuEIGfdQjPb9PahcRJeZ//igWIYRjStqCDfww1SBYszIZLPoTe"
106
+ "XKES/AQS5O6sUz0Kn/wzrssB9ecMfTGIq1H0AdSNeD9BDfFPRUFMyaJuXyEIayCM1xZXNkJq+DtP2dZr"
107
+ "QUId2pqhJObBX5vq8ZvkIWZHilUhuyozasssTkap+L0haFSsmNnidF9pGebrT9xHWlwfuF95B0JrlcHr"
108
+ "5SGNb26alTWfcGnL7FVGpcJfoLrLyV9TxF8T4K+R8/ctnXIU5cxDyyxBXDSXz9Ws1Je6Vsv795A3DA6w"
109
+ "DovcpkpF8lAk2Do3u6LdWred0c5/IzDYjX7EwimlSh7qTksxD3QPFmtUT3k0bdqFWcoW7sepLZ71ypWq"
110
+ "nGykkfvmzTvOsQvatBlI2RJ6LfNt5aDGdzLVypY2czsI2Vv9yjatRqtssd6X6m637oA76MYZVc765Ro5"
111
+ "+ZMZrSvffTY9s8yOwBGUf4Bq6d7hzdw7pbhbFXK/401FszN2pRBlSPgu4ANtc5FvkS3DG3rWlXbIeXg4"
112
+ "pRJF/TUnzl/RsWvuIefxjouNvd1KeIHBvfYWH9D/OdAfm6nKVEXSWp3tBMcx2oZHkV+bcT8MxUj3a3yV"
113
+ "pJXtvctq7ti7p82oSEEwS+tt02UD/Lw+oDDizfUkh/k8h6cmOWR0IM1aZiBjRbqGxfajLiEestou/gTF"
114
+ "4uG1lOJrx0Orj9lBPPK2JjBfaSoN3qeBqffB1Fed7FmvyWQiN3U427kPwKELr7grjlSt8kZ3hw8o5pcm"
115
+ "89qZFI87lcW3KY3TZI+u0HRsNne4xADY7xwMxgXAKTIaAHWaMbdXbWwxKtpmtTgnDoQt5mjQvBkYZIgf"
116
+ "1UWvuRy9hq6HoNE5lC2EXF0cNldYKIsutUe1iOdl5nnt5nmRAq+c6ITtUxbfD9xa9GX2ByHIpyzWmrKD"
117
+ "q+Th6W3RiWqOTlQO3fLEi2sz3jcDMbmixTl8mtCV2SvgqnfMyrWlweeYkIbcBY5rOuGyPzhtjtK3QrZh"
118
+ "/nVKziQPr3j//sA7S9/WkDKY6PGriM7J3gdBcUrXIQ5y0De6f7zInjPgDVo0qjeKvDBpCyFjzFR5e+gL"
119
+ "GLrlotP85BPPT2UU/BgeaLsx27coPKOTiPl/dlxeXsv/4hjfXZQhHeOWWDC2FHzLFXXvrkn31kXd20oX"
120
+ "t+zfNYW/32L+fl3/yq+yR0s0YgLIZ6kyMyKxezbE+fWBk6Rxb2lQlTk/Ek1q1w5O9pYs88XJuX5zkkyD"
121
+ "5viladeJYayfDONuHzsQuQoGTKPG8M4iMh+dZDI2Vlnj4nVBdny8/u/41/2b/Hddm/9D+mT+W/5n/L/F"
122
+ "8++O0yLMf/dHiJ91rEUD3jXUWu10o6IjP9BS0mafW9LeapkzVS4qwqfbSxTU1daoIjyki1Lp8kVevGpx"
123
+ "stNYm0IFtPcDq2lud0XQ+6qlbaMuJMbxeDSOy/XyPx8omRJVYCqqwH9kRPEmVV2irHlDJnADxPhTW5wg"
124
+ "5plYzOknKuZP5NzBDgQn4MSL36la8M4AVXwKJNqmUsG64azfztxoY8fu4d6vxqpAQcKcJyvyrr9Fw+Qw"
125
+ "RG6bVosXhQVp1nvbnKoc8y2g+aWGjIdnQ3rCuPy32WHAMAcR9rFqUZk3sukCs1Oq7D+rxtEen+dAj7AE"
126
+ "4Adb4OvrIb9smfLK3kqzr1v1uqpG0xl6djS9xSTRu85rxs9OJfjy7RktzsBRmdFHPELkFLqiK9RWRdQ/"
127
+ "EWb/2IyVrJD0+UujSY8oayp1NTBPW+ZsgoRVF6jabSdJV1dpsKNVbrS3OffvzgSqvA4obgCeZIIOzOR5"
128
+ "tSSs6dFYEJZAfwbMiwlGv2uW7DZlZFzRo6ywendlKfEtvQRwPJpmY8V5ambFRdeVKehpBt//45M6M5CR"
129
+ "wkecRxmcpcR1gwrCxXRrF7UK5mKAkYcs/du57AqL9/tamL0V2lZGW9GDI6MPh45BsYqNX1s7YvHciXJW"
130
+ "WI8po/G8Txm8D9clNtz/7gc1SpuCvJoK0WvvsAK9zjRZqgYOAnBgfSmNU9ETU2EQ6AYfhMNTGfLyUl1O"
131
+ "t4xRlIoFDXWL7ufaYaLUm6EsSYv6rjoup8jo+p4r4wsbvK6qAJu7ajCwRtGqwH7etKmxZvGm2lr34pot"
132
+ "9Q1uT+1GT2V9PUI3tS5z+tK52f9JHuqzrpWHaflfmYcnrp2HVEIesm+AwXVzWjeKGeAMTubms2JOecnp"
133
+ "6TlsIWCUbuYNt2i6npIPBYiKt96GHrUbIHstj4WnK0yB4CcsTMMpuLX3/KiZ+QSm2QwXPax7qX12mfsR"
134
+ "GEKgyKIpSd0w6DX94aRcTL5snHw7QDp11xnF5Aurdouy0BUae5HQextK6Zv7GIuKr32FHPRpcQ46+Rzc"
135
+ "zOyNi/Ncfq6e/wr9Ds7ChQwvxpu4QAjdMpl/sybzb5QxrzTIRYHb+aC5wpno2ENRx/p0rdFqxNdrPnPd"
136
+ "7dGczY3mLEO5xIX6PLPwdvDBzCldRjLl0bTp4GYWurClp5q7STtdZe+cKW8nopretjBB0xlJ7kJu8XGX"
137
+ "Ohl3A3Jc98OWz/HNdffc7HDUr7xt9QqUpVim9T0c7lV8206UGJBpIGiGsPcpM9q8w6QFpq9KA17eLpsK"
138
+ "bD6ElERpKZQCWAgawqwHP2t++n+oIf95reK6dq1CJtcq8rRYrSLc76lr3K//g/SUqeIaPzBTmamJK9IN"
139
+ "YoG3yqz0AA0VxEUYF3jHXIzOOHVeycruV1mQtHcgMFCo+LXsI1UpCbXYv3s//b9xv18l3M/8L2uZr86F"
140
+ "/wpNbgIiM7dpIjcFnGKp/Ss3Ls9jpXZE3BAOWsVl6f0C5RNQ+Fj3lqKAIFI+lTJTrKPNZlNV8LnsaCIN"
141
+ "odtPEqtufqSEFWv8RgYm6UEgcG+afMb+Sgvlzf44lL5IqSEF7X9AcSMLMTkDr7mpw7G4/E/HufV/Os7f"
142
+ "/a/GefArx7ns3xunnB8n1JywSmpBPGacJGRf41/j/9f4lBiO18FdepCf7TiPerG2D5dBiN/bRSm/jtn/"
143
+ "EK+DBb8AcBOtmdsqf3X6elTIKd+b3hUs5VJ/ljHC3slp/pKRnfMAl/H+jKovHJz21Zn7v2jidL+cNf7B"
144
+ "Ixxzapa5uJ27/qK2vfh57oaDmXtO/pBb+NfM8bK9HLtvdnb451zBy1mD4Te4on1Z4743uVvfylKWHOCs"
145
+ "h7Ky5b/mbB9nlQ78mltxMquq9S1u1YWs9pLfcLf9NWuPfJC7o003ODDI3blTN976Lnf3izrlikPcmld0"
146
+ "2SmHuXte15W+fZi7t19XtX2Iu++3uvZn3uPu/4Nuz71HuAf+qBuc8T730J914x+9zzl8euWzI5zr+/rs"
147
+ "b3zKlf9AL5Y6qBIK6UdhYZxGdo7fJGr5D1KEZ56rxZpjvWiL/26A/+NThOOeFP6LMOhX8HcZEq5BceeR"
148
+ "aI9/LqQIzzixPa6h+O/Rw8btLyliLY+E81E8BTpLh+NFSDiPcSXg0xTCs8E8JMwjxtsBn6UQ3vjjZ6Lq"
149
+ "uH6uB3y6OJZpcXi+aP8tif3tgOMHvzVIuH/0vusVgl0zEs5H8Y0KgXe7ZFweEd8Zh2P7R0X8BQneLuIv"
150
+ "S/p5WsR7JfYvivgbEvu9Ij4gse8T8SMS+9+I4x2RjPc9wKfC8Wkk+Clqf0K0/1Jif17sX0Yk9v9nhTB/"
151
+ "KiI2v9iepIR+ZhGJ/UylBLv5kn50Ir5Ygl8v4mYicbwmSui3mIjFD7a/lRLm8S4icR7vEvk8GMcH2z9I"
152
+ "Cc8hqgkhvqP25SJeG4fjOHxY5LNFwnMLJfjxe0Qs3nA/28X7PiXxw9OUELc/IGJxi/GXKWE8PyMS82Uf"
153
+ "JawR+wnhCzM8Dvv5N0X7oMT+HRE/LMF/K/L/WOLPEyIekYzrrIifk9hfEfu/Iukfk+OPJfZpSsF+iizR"
154
+ "fpZS8FuGLNFv14v28yT2uUrBb4tliX5bqRT8bJEl+nmdUpi/O2XCfEbxb4r4OpmgN1HcqRSO75fF9Afj"
155
+ "lSL+kAR/WCnczyWL07GFCG1VCnu7GsBnxOFPKgXeLTIh//hxMQj9CPBZcPy0TLguir8u4nsl+HtKYe/z"
156
+ "G8Az4/DPRPsRif0/xPtekNxXM0X0owSfK+K4fo7Hl4q4UYKvFHGTBF8v4jYJ/rCIr5Pgj4h4pQR/SsQb"
157
+ "JXi3iPsl+D4R75LgA1OENWovKfgpih8X8aAEvyLin0hwVaroT0n/BhH/pwRnRVwjT8SLRdwowdeJuEmC"
158
+ "bxBxmwRvEvF1EvxxEa+U4C+kCnnUKI9bNwF/VcTbJXi/iD8vwT8S8Z9K8HERf0uC/03EhyU4nSYcn5Tw"
159
+ "ZNIE+8sS+1wRT0lJxFeK+CwJfr+I3yDBN4l4gQT/nojfKcF3irhDgv84TYiPupRY3uF8P5Am5L8/RXie"
160
+ "G8U/SIt+8TG2vuBA+1TEFRJ8NE3QU15Do/2AT/6YJugSvgcZZ49/HlIJeQ2138QSOF5c3+BZbOI/cx2O"
161
+ "+oaKSo/HDUdl1RurNzc4NlduFVsbPJWVDsfGGnezo3xTpcuDjydP1dY4oBF/uAVay5fGI9CpeH19ZQOc"
162
+ "jzuI3c9VURGHCy3AxLP1W8qiZ7eUiVjNlk0iBi0Rq6huFLEG3KyL0thUW+uJO7kh/mRNbfTO1ZurG+Iv"
163
+ "j/lio9gqr3FHXVHjFjG3B38K6MaEMTXU4gP43VS5uca1aVNtefSS2q3xt4yNuKEefJnAoc5hqmxyb4nz"
164
+ "Q9lmxwZX9aYtMUrRpmtzdCTQioK1UedX13qiWNMk2BQD66vi/Jl41ypPguP4k9Fea9y1ngbCscG9paEe"
165
+ "f5RXNlU34AP+Ib2rrH5xda6Jb9dU1pS7ty12s/i3ejJGINIWl9duqlicI4mqf4WakkPuGuY4uBNQiKiv"
166
+ "AEwxDydaTAJJFrlSYGksMhP7mARMsThNtJgEkixypTEsGWcibLo2nBuLdQmzWsn4J4HcyenZmHjJJGCK"
167
+ "RXOixSSQZJG7JcnNSYgpCUm+amlcyEv6mURMsQyQmDQlIRD7X4WYkpDcuLxIusqTdJWI5Aovrao3VDZU"
168
+ "11SC7ro8DZAIiWglkHezJtPinMWsy1OzfOkiF/4C26IaV3ltfZNpOf7i2pJ76ys99UtqXNWbl9i34W+n"
169
+ "1dg9tQ9XljfUL7lvxX1L6mu3eMorl0CqNVQuARabt9QsLnfEki3aFHQ9TtgFRJJuCcdCoiVAvLgnqnuC"
170
+ "vEeNeX2PE/hJhXfE5tYR0/goyot8TJXiZT5BJJOFPkGw4qU+XuvjxT7moo3RJi/3k3ofRUXBT1D86DlB"
171
+ "8h2C5jsE0XfEssCRJPuJup8k/I545Y9KvyNO+x0J4j+p/o54+Z/Uf0fCAjC5AjgSloDENcCRsAhcYxWI"
172
+ "XwaEVYD/LHfgdcDBH8evBI5rLgVx4SlmlDQO/yVsukaUXuuC2HoQF5ZfhZjiIlNiE9OqJCQ3CVkaF8uS"
173
+ "fmLrQlxkS2xi0p6E5CaFvXTQksXhK/DcuPyQMqyVeiO2QMQljOSq2BIRF/sSm9gikYTkOpKXiWTIlAxd"
174
+ "48KljuSlIhkyOZIWC0fyauFIXi6SIVMylOtIXjGSIVMylOu49qLhuNaqsdohlPTiXyjqo1X9ahz4eA/w"
175
+ "3wNrmpc="
176
+ )
177
+
178
+
179
+ def load_bignum_bc():
180
+ data = zlib.decompress(base64.b64decode(_B64))
181
+ return binding.parse_bitcode(data)
@@ -79,7 +79,7 @@ class Node:
79
79
 
80
80
  class Number(Node):
81
81
  inferred_type: str | None
82
- __slots__ = ("_token", "inferred_type", "value", "is_bool")
82
+ __slots__ = ("_token", "inferred_type", "is_bool", "value")
83
83
 
84
84
  def __init__(self, value: str, token=None, is_bool: bool = False):
85
85
  self.value = value
@@ -115,12 +115,12 @@ class FString(Node):
115
115
 
116
116
  class Variable(Node):
117
117
  __slots__ = (
118
+ "_dunder_via",
118
119
  "_token",
119
120
  "const_value",
120
121
  "dynamic",
121
122
  "inferred_type",
122
123
  "name",
123
- "_dunder_via",
124
124
  )
125
125
 
126
126
  def __init__(self, name: str, token=None):
@@ -155,8 +155,8 @@ class Call(Node):
155
155
  "args",
156
156
  "callee",
157
157
  "inferred_type",
158
- "param_types",
159
158
  "meta",
159
+ "param_types",
160
160
  )
161
161
 
162
162
  def __init__(self, callee, args: list, token=None):
@@ -267,7 +267,7 @@ class IfExp(Node):
267
267
  """
268
268
 
269
269
  inferred_type: str | None
270
- __slots__ = ("_token", "inferred_type", "body", "cond", "orelse")
270
+ __slots__ = ("_token", "body", "cond", "inferred_type", "orelse")
271
271
 
272
272
  def __init__(self, body, cond, orelse, token=None):
273
273
  self.body = body
@@ -284,13 +284,13 @@ class CCode(Node):
284
284
  inferred_type: str | None
285
285
  __slots__ = (
286
286
  "_token",
287
+ "includes",
287
288
  "inferred_type",
289
+ "src_file",
290
+ "src_line",
288
291
  "symbols",
289
292
  "value",
290
293
  "var_names",
291
- "includes",
292
- "src_file",
293
- "src_line",
294
294
  )
295
295
 
296
296
  def __init__(self, value: str, token=None):
@@ -1690,14 +1690,14 @@ def parse_dataclass_class(tokens: list[Token], pos: int):
1690
1690
  return parse_class(tokens, pos, sealed=sealed, dataclass=True)
1691
1691
 
1692
1692
 
1693
-
1694
1693
  def parse_protocol_class(tokens: list[Token], pos: int):
1695
1694
  """Parse `interface I:` or `protocol I:` as a protocol definition."""
1696
1695
  tok = tokens[pos]
1697
1696
  pos += 1
1698
1697
  if pos >= len(tokens) or tokens[pos].type != TokenType.IDENTIFIER:
1699
1698
  raise ParseError(
1700
- "Expected interface/protocol name", tokens[pos] if pos < len(tokens) else None
1699
+ "Expected interface/protocol name",
1700
+ tokens[pos] if pos < len(tokens) else None,
1701
1701
  )
1702
1702
  name = tokens[pos].value
1703
1703
  assert name is not None
@@ -1708,7 +1708,8 @@ def parse_protocol_class(tokens: list[Token], pos: int):
1708
1708
  pos += 1
1709
1709
  if pos >= len(tokens) or tokens[pos].type != TokenType.IDENTIFIER:
1710
1710
  raise ParseError(
1711
- "Expected base protocol name", tokens[pos] if pos < len(tokens) else None
1711
+ "Expected base protocol name",
1712
+ tokens[pos] if pos < len(tokens) else None,
1712
1713
  )
1713
1714
  base = tokens[pos].value
1714
1715
  pos += 1
@@ -2315,7 +2316,7 @@ class Raise(Node):
2315
2316
 
2316
2317
 
2317
2318
  class NewExpr(Node):
2318
- __slots__ = ("_token", "size", "type_expr", "args", "inferred_type")
2319
+ __slots__ = ("_token", "args", "inferred_type", "size", "type_expr")
2319
2320
 
2320
2321
  def __init__(self, type_expr, size=None, token=None, args=None):
2321
2322
  self.type_expr = type_expr
@@ -2333,7 +2334,7 @@ class NewExpr(Node):
2333
2334
 
2334
2335
 
2335
2336
  class Deref(Node):
2336
- __slots__ = ("_token", "operand", "inferred_type")
2337
+ __slots__ = ("_token", "inferred_type", "operand")
2337
2338
 
2338
2339
  def __init__(self, operand, token=None):
2339
2340
  self.operand = operand
@@ -2345,7 +2346,7 @@ class Deref(Node):
2345
2346
 
2346
2347
 
2347
2348
  class AddrOf(Node):
2348
- __slots__ = ("_token", "operand", "inferred_type")
2349
+ __slots__ = ("_token", "inferred_type", "operand")
2349
2350
 
2350
2351
  def __init__(self, operand, token=None):
2351
2352
  self.operand = operand
@@ -2357,7 +2358,7 @@ class AddrOf(Node):
2357
2358
 
2358
2359
 
2359
2360
  class SizeOf(Node):
2360
- __slots__ = ("_token", "type_expr", "resolved_type")
2361
+ __slots__ = ("_token", "resolved_type", "type_expr")
2361
2362
 
2362
2363
  def __init__(self, type_expr, token=None):
2363
2364
  self.type_expr = type_expr
@@ -2373,7 +2374,7 @@ class SizeOf(Node):
2373
2374
 
2374
2375
 
2375
2376
  class CastExpr(Node):
2376
- __slots__ = ("_token", "inferred_type", "type_expr", "expr")
2377
+ __slots__ = ("_token", "expr", "inferred_type", "type_expr")
2377
2378
 
2378
2379
  def __init__(self, type_expr: str, expr, token=None):
2379
2380
  self.type_expr = type_expr
@@ -2394,7 +2395,7 @@ class AsExpr(Node):
2394
2395
  `as` that fails yields null rather than silently re-typing the pointer.
2395
2396
  """
2396
2397
 
2397
- __slots__ = ("_token", "inferred_type", "type_expr", "expr", "meta")
2398
+ __slots__ = ("_token", "expr", "inferred_type", "meta", "type_expr")
2398
2399
 
2399
2400
  def __init__(self, type_expr: str, expr, token=None):
2400
2401
  self.type_expr = type_expr
@@ -2414,7 +2415,7 @@ class BorrowExpr(Node):
2414
2415
  the semantic/ownership pass enforces borrow rules.
2415
2416
  """
2416
2417
 
2417
- __slots__ = ("_token", "operand", "mutable", "inferred_type")
2418
+ __slots__ = ("_token", "inferred_type", "mutable", "operand")
2418
2419
 
2419
2420
  def __init__(self, operand, mutable: bool = False, token=None):
2420
2421
  self.operand = operand
@@ -2433,7 +2434,7 @@ class MoveExpr(Node):
2433
2434
  used afterward unless it is reassigned.
2434
2435
  """
2435
2436
 
2436
- __slots__ = ("_token", "operand", "inferred_type")
2437
+ __slots__ = ("_token", "inferred_type", "operand")
2437
2438
 
2438
2439
  def __init__(self, operand, token=None):
2439
2440
  self.operand = operand
@@ -2471,7 +2472,7 @@ class DelStmt(Node):
2471
2472
  `del obj.field` / `del arr[i]` / `del *p` clear the addressed slot.
2472
2473
  """
2473
2474
 
2474
- __slots__ = ("_token", "target", "del_kind")
2475
+ __slots__ = ("_token", "del_kind", "target")
2475
2476
 
2476
2477
  def __init__(self, target, token=None):
2477
2478
  self.target = target
@@ -2540,12 +2541,12 @@ class ClassDef(Node):
2540
2541
  "dataclass",
2541
2542
  "fields",
2542
2543
  "generic_params",
2544
+ "is_protocol",
2543
2545
  "methods",
2544
2546
  "module",
2545
2547
  "name",
2546
2548
  "properties",
2547
2549
  "sealed",
2548
- "is_protocol",
2549
2550
  )
2550
2551
 
2551
2552
  def __init__(
@@ -2579,9 +2580,18 @@ class ClassDef(Node):
2579
2580
  return f"ClassDef({seal}{dc}{self.name}, base={self.base}, fields={self.fields}, properties={self.properties}, methods={self.methods})"
2580
2581
 
2581
2582
 
2582
-
2583
2583
  class ProtocolDef(Node):
2584
- __slots__ = ("_token", "base", "name", "methods", "properties", "fields", "generic_params", "sealed", "is_protocol")
2584
+ __slots__ = (
2585
+ "_token",
2586
+ "base",
2587
+ "fields",
2588
+ "generic_params",
2589
+ "is_protocol",
2590
+ "methods",
2591
+ "name",
2592
+ "properties",
2593
+ "sealed",
2594
+ )
2585
2595
 
2586
2596
  def __init__(
2587
2597
  self,
@@ -2614,7 +2624,7 @@ InterfaceDef = ProtocolDef
2614
2624
  class PropertyDef(Node):
2615
2625
  """A `property name:` block holding paired `get`/`set` accessor bodies."""
2616
2626
 
2617
- __slots__ = ("_token", "name", "get", "set", "_ptype")
2627
+ __slots__ = ("_ptype", "_token", "get", "name", "set")
2618
2628
 
2619
2629
  def __init__(self, name: str, get, set=None, token=None):
2620
2630
  self.name = name
@@ -3611,9 +3621,7 @@ def parse_expr_stmt(tokens: list[Token], pos: int):
3611
3621
  token=tok,
3612
3622
  ),
3613
3623
  token=tok,
3614
- compound_op=(
3615
- binop_op if not isinstance(target, Variable) else None
3616
- ),
3624
+ compound_op=(binop_op if not isinstance(target, Variable) else None),
3617
3625
  ), pos
3618
3626
 
3619
3627
  _expect_newline(tokens, pos, tok)
@@ -998,6 +998,57 @@ class LLVM:
998
998
  fn = ir.Function(self.module, ir.FunctionType(ret, args), name=name)
999
999
  self.functions[name] = fn
1000
1000
 
1001
+ # Runpy dynamic class/runtime
1002
+ void_ptr = _i8ptr
1003
+ table_ptr = ir.PointerType(ir.LiteralStructType([]))
1004
+ class_ptr = _i8ptr
1005
+ func_ptr = _i8ptr
1006
+ runpy_fns = [
1007
+ ("create_table", table_ptr, [_i64]),
1008
+ ("hashmap_put", table_ptr, [table_ptr, void_ptr, void_ptr]),
1009
+ ("hashmap_get", void_ptr, [table_ptr, void_ptr]),
1010
+ ("hashmap_contains", _i32, [table_ptr, void_ptr]),
1011
+ ("hashmap_erase", table_ptr, [table_ptr, void_ptr]),
1012
+ ("hashmap_destroy", _void, [table_ptr]),
1013
+ ("hashmap_is_valid", _i32, [table_ptr]),
1014
+ ("hashmap_size", _i64, [table_ptr]),
1015
+ ("hashmap_is_empty", _i32, [table_ptr]),
1016
+ ("runpy_create_function", func_ptr, [_i32, void_ptr, void_ptr]),
1017
+ ("runpy_create_tables", table_ptr, []),
1018
+ ("runpy_create_class", class_ptr, [_i64]),
1019
+ ("runpy_destroy_class", _void, [class_ptr]),
1020
+ ("runpy_class_addfunc", class_ptr, [func_ptr, class_ptr]),
1021
+ ("runpy_class_delfunc", class_ptr, [func_ptr, class_ptr]),
1022
+ ("runpy_class_updfunc", class_ptr, [func_ptr, func_ptr, class_ptr]),
1023
+ ("runpy_function_call", _void, [func_ptr, void_ptr]),
1024
+ ("runpy_class_getfunc", func_ptr, [class_ptr, void_ptr]),
1025
+ ("runpy_class_hasfunc", _i32, [class_ptr, void_ptr]),
1026
+ ("runpy_class_replace_table", class_ptr, [class_ptr, table_ptr]),
1027
+ ("runpy_class_get_table", table_ptr, [class_ptr]),
1028
+ ("runpy_class_get_index", _i64, [class_ptr]),
1029
+ ("runpy_class_set_index", _void, [class_ptr, _i64]),
1030
+ ("runpy_function_get_impl", void_ptr, [func_ptr]),
1031
+ ("runpy_function_set_impl", _void, [func_ptr, void_ptr]),
1032
+ ("runpy_function_get_name", void_ptr, [func_ptr]),
1033
+ ("runpy_function_get_signature", _i32, [func_ptr]),
1034
+ ("runpy_function_get_generation", _i64, [func_ptr]),
1035
+ ("runpy_table_clone", table_ptr, [table_ptr]),
1036
+ ("runpy_table_merge", _i32, [table_ptr, table_ptr]),
1037
+ ("runpy_class_hotswap", _i32, [class_ptr, table_ptr]),
1038
+ ("runpy_class_redirect", _i32, [class_ptr, class_ptr]),
1039
+ (
1040
+ "runpy_class_lookup_or_inherit",
1041
+ func_ptr,
1042
+ [class_ptr, void_ptr, class_ptr],
1043
+ ),
1044
+ ]
1045
+ for name, ret, args in runpy_fns:
1046
+ try:
1047
+ fn = ir.Function(self.module, ir.FunctionType(ret, args), name=name)
1048
+ self.functions[name] = fn
1049
+ except Exception:
1050
+ pass
1051
+
1001
1052
  self.dyn_types = {}
1002
1053
 
1003
1054
  # Concurrent tri-color GC runtime functions (ugc-based)
@@ -5749,12 +5800,8 @@ class LLVM:
5749
5800
  target = node.target
5750
5801
  meta = getattr(target, "meta", None) or {}
5751
5802
  cls = meta.get("cls")
5752
- getter = self.functions.get(
5753
- f"{cls}.{target.name}.get" if cls else None
5754
- )
5755
- setter = self.functions.get(
5756
- f"{cls}.{target.name}.set" if cls else None
5757
- )
5803
+ getter = self.functions.get(f"{cls}.{target.name}.get" if cls else None)
5804
+ setter = self.functions.get(f"{cls}.{target.name}.set" if cls else None)
5758
5805
  if getter is None or setter is None:
5759
5806
  raise Exception(
5760
5807
  f"property accessor for `{cls}.{target.name}` not compiled"
@@ -5789,9 +5836,7 @@ class LLVM:
5789
5836
  and (getattr(node.target, "meta", None) or {}).get("kind") == "prop_set"
5790
5837
  ):
5791
5838
  if isinstance(node.target, Index) and not self.no_userspace:
5792
- obj_t = _bc_array_norm(
5793
- getattr(node.target.obj, "inferred_type", None)
5794
- )
5839
+ obj_t = _bc_array_norm(getattr(node.target.obj, "inferred_type", None))
5795
5840
  if (
5796
5841
  obj_t == "dynamic"
5797
5842
  or obj_t == "dynamic[]"
@@ -6677,7 +6722,6 @@ class LLVM:
6677
6722
  f"L{node._token.line}:{node._token.column}"
6678
6723
  )
6679
6724
 
6680
-
6681
6725
  def _emit_class_meta(self):
6682
6726
  if getattr(self, "_class_meta_emitted", False):
6683
6727
  return
@@ -6687,31 +6731,49 @@ class LLVM:
6687
6731
  return
6688
6732
  # Minimal struct: classid(i64), name(i8*), size_bytes(i64), is_virtual(i1), is_sealed(i1), is_dataclass(i1), vt_ptr(i8*)
6689
6733
  from llvmlite import ir
6690
- meta_ty = ir.LiteralStructType([
6691
- _i64, # classid
6692
- _i8ptr, # name
6693
- _i64, # size_bytes
6694
- _i1, # is_virtual
6695
- _i1, # is_sealed
6696
- _i1, # is_dataclass
6697
- _i8ptr, # vt_ptr
6698
- ])
6734
+
6735
+ meta_ty = ir.LiteralStructType(
6736
+ [
6737
+ _i64, # classid
6738
+ _i8ptr, # name
6739
+ _i64, # size_bytes
6740
+ _i1, # is_virtual
6741
+ _i1, # is_sealed
6742
+ _i1, # is_dataclass
6743
+ _i8ptr, # vt_ptr
6744
+ ]
6745
+ )
6699
6746
  for c in classes:
6700
6747
  cid = self._class_ids.get(c, -1)
6701
6748
  node = self._struct_nodes.get(c)
6702
6749
  name_cstr = self._const_string(c)
6703
6750
  # size: sizeof identified struct (approx) - use LLVM type
6704
- cls_ty = self.structs.get(c) or (self._module_structs.get((self._cur_module, c)) if self._cur_module else None)
6751
+ cls_ty = self.structs.get(c) or (
6752
+ self._module_structs.get((self._cur_module, c))
6753
+ if self._cur_module
6754
+ else None
6755
+ )
6705
6756
  if cls_ty is None:
6706
6757
  cls_ty = self._module_structs.get((None, c))
6707
- size = ir.Constant(_i64, cls_ty.get_abi_size(self.target_data)) if hasattr(cls_ty, 'get_abi_size') else ir.Constant(_i64, 0)
6758
+ size = (
6759
+ ir.Constant(_i64, cls_ty.get_abi_size(self.target_data))
6760
+ if hasattr(cls_ty, "get_abi_size")
6761
+ else ir.Constant(_i64, 0)
6762
+ )
6708
6763
  is_v = ir.Constant(_i1, 1 if self._class_virtual.get(c) else 0)
6709
- is_s = ir.Constant(_i1, 1 if getattr(node, 'sealed', False) else 0)
6710
- is_d = ir.Constant(_i1, 1 if getattr(node, 'dataclass', False) else 0)
6764
+ is_s = ir.Constant(_i1, 1 if getattr(node, "sealed", False) else 0)
6765
+ is_d = ir.Constant(_i1, 1 if getattr(node, "dataclass", False) else 0)
6711
6766
  vt_g = self._vt_globals.get(c)
6712
- vt_ptr = self.builder.bitcast(vt_g, _i8ptr) if vt_g is not None else ir.Constant(_i8ptr, None)
6767
+ vt_ptr = (
6768
+ self.builder.bitcast(vt_g, _i8ptr)
6769
+ if vt_g is not None
6770
+ else ir.Constant(_i8ptr, None)
6771
+ )
6713
6772
  g = ir.GlobalVariable(self.module, meta_ty, name=f"cm.meta.{c}")
6714
- g.initializer = ir.Constant(meta_ty, [ir.Constant(_i64, cid), name_cstr, size, is_v, is_s, is_d, vt_ptr])
6773
+ g.initializer = ir.Constant(
6774
+ meta_ty,
6775
+ [ir.Constant(_i64, cid), name_cstr, size, is_v, is_s, is_d, vt_ptr],
6776
+ )
6715
6777
  self._class_meta_globals[c] = g
6716
6778
 
6717
6779
  def _emit_ancestor_grid(self):