Compare commits
1240 Commits
v0.9.0
...
v0.10.0-pr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e5ff33fcc6 | ||
|
|
c60979fff7 | ||
|
|
961ad6ebca | ||
|
|
f18237a005 | ||
|
|
cba93e61b4 | ||
|
|
e0a6e5d2f9 | ||
|
|
a9ee323760 | ||
|
|
977db86700 | ||
|
|
93d36d40d8 | ||
|
|
cabc7ffca8 | ||
|
|
521b70c715 | ||
|
|
b6c5503c5b | ||
|
|
e7e2ba4790 | ||
|
|
8749923f1a | ||
|
|
25a3e19384 | ||
|
|
b6b686665a | ||
|
|
4f5468469b | ||
|
|
7bc7f23125 | ||
|
|
25ed652fc0 | ||
|
|
cc2913352a | ||
|
|
ad796ebbec | ||
|
|
edd561f8ba | ||
|
|
0b1c4fb54f | ||
|
|
9f4eb4f7db | ||
|
|
f6e3a3917e | ||
|
|
1b536bf5f8 | ||
|
|
e3afdb6c02 | ||
|
|
918b36e28f | ||
|
|
ce26637410 | ||
|
|
2053c72008 | ||
|
|
275bde6461 | ||
|
|
f85382edd4 | ||
|
|
e016e92c41 | ||
|
|
2594b8e3f9 | ||
|
|
1e1ef594c8 | ||
|
|
01c660faba | ||
|
|
9f76237705 | ||
|
|
59d3e3f3da | ||
|
|
e5dd237f12 | ||
|
|
e9729bea7e | ||
|
|
d46b17d8a0 | ||
|
|
383d25226e | ||
|
|
745eff0783 | ||
|
|
ac301045b9 | ||
|
|
e1f3ca8172 | ||
|
|
4ff4ceeb22 | ||
|
|
4126992a8f | ||
|
|
fd99f63bd6 | ||
|
|
46dc7c3a77 | ||
|
|
a8cb551465 | ||
|
|
5a5674809c | ||
|
|
761e8a2ac6 | ||
|
|
dfa7effa14 | ||
|
|
09c022e209 | ||
|
|
8666a75161 | ||
|
|
68018d8d04 | ||
|
|
3d2c014801 | ||
|
|
4f9c341103 | ||
|
|
563f03554f | ||
|
|
219376044a | ||
|
|
591dac8b41 | ||
|
|
2bc96ade33 | ||
|
|
95c4456ccc | ||
|
|
6e6b8b404f | ||
|
|
27052c21be | ||
|
|
ec744f7385 | ||
|
|
d8c5105c91 | ||
|
|
acd5fb19f5 | ||
|
|
52ac486814 | ||
|
|
a64b32bf9c | ||
|
|
b299800e64 | ||
|
|
60c430abad | ||
|
|
255cce4f9a | ||
|
|
1ed99c2574 | ||
|
|
64b54d4380 | ||
|
|
6170973b48 | ||
|
|
1172e5bdce | ||
|
|
b0123567cd | ||
|
|
81598621e8 | ||
|
|
239ac496b2 | ||
|
|
76fb91619a | ||
|
|
e3a2d43ffa | ||
|
|
b3f4716616 | ||
|
|
c602038597 | ||
|
|
03b469212e | ||
|
|
db3f6e077e | ||
|
|
06816c51a5 | ||
|
|
9e9e8e82b2 | ||
|
|
031d4ebedc | ||
|
|
3446715af8 | ||
|
|
c7e68dab62 | ||
|
|
7093ced2d8 | ||
|
|
179f4dfe22 | ||
|
|
03517ce22e | ||
|
|
290f99b4d1 | ||
|
|
7f10bc2a1b | ||
|
|
9cb48003b0 | ||
|
|
6df961292d | ||
|
|
65f855b251 | ||
|
|
5131881bf2 | ||
|
|
8fbad90e9d | ||
|
|
d0aceebaad | ||
|
|
01b6680000 | ||
|
|
638883f352 | ||
|
|
467c2fb28d | ||
|
|
0fd129a0d8 | ||
|
|
282125a84b | ||
|
|
97a2824473 | ||
|
|
eff1333269 | ||
|
|
3741a28d94 | ||
|
|
6dd4ec160d | ||
|
|
a6a3c09c05 | ||
|
|
620cfeabe0 | ||
|
|
070d64f365 | ||
|
|
1d3c98372a | ||
|
|
c1588d70cd | ||
|
|
ef28abe896 | ||
|
|
d251232f8a | ||
|
|
05334de855 | ||
|
|
539b55f826 | ||
|
|
0699832240 | ||
|
|
ce169163b9 | ||
|
|
b4af70ada9 | ||
|
|
424670d854 | ||
|
|
6ce4644120 | ||
|
|
eaf7e56083 | ||
|
|
e55a5d7486 | ||
|
|
e1d14b1324 | ||
|
|
04d09eb891 | ||
|
|
09b4f5dffd | ||
|
|
29ad96862f | ||
|
|
839d68d62c | ||
|
|
a4d3bf3cb2 | ||
|
|
a05bda9fc3 | ||
|
|
5936b57bac | ||
|
|
af2bcd389e | ||
|
|
4bec9b038b | ||
|
|
0b3ce5f65a | ||
|
|
cb8e820f5d | ||
|
|
0a4ce9d65e | ||
|
|
f20d74c1f3 | ||
|
|
3505be422e | ||
|
|
7e9542e79a | ||
|
|
a1c1a4889b | ||
|
|
7eeb8084bf | ||
|
|
7a5bd6ae6a | ||
|
|
d20e60afb3 | ||
|
|
7340263e6a | ||
|
|
6e8cecd13e | ||
|
|
f106a0854f | ||
|
|
68b09e87b3 | ||
|
|
11f2ecd675 | ||
|
|
7b6b8b0eeb | ||
|
|
67f9580c5d | ||
|
|
6a3fce97cf | ||
|
|
2bd266a7fc | ||
|
|
f6946b88d2 | ||
|
|
5e5df6becd | ||
|
|
6c4cb92249 | ||
|
|
c3407eac5e | ||
|
|
e46b3e24d6 | ||
|
|
90763de93c | ||
|
|
5380ffa471 | ||
|
|
c9f436cc47 | ||
|
|
39dc68fa4e | ||
|
|
d6c527f662 | ||
|
|
38a7f4f7d5 | ||
|
|
1605959a04 | ||
|
|
b837e0005a | ||
|
|
58937a5366 | ||
|
|
8562c03f80 | ||
|
|
1cd61b9169 | ||
|
|
c69e289afe | ||
|
|
91b46b05ad | ||
|
|
2412760f1c | ||
|
|
d83c5493c7 | ||
|
|
d041703dc6 | ||
|
|
ecba13c38e | ||
|
|
cd3a4bb8c8 | ||
|
|
97f72b93e1 | ||
|
|
e93d57983e | ||
|
|
43c4a3bfdc | ||
|
|
954cc0e8bc | ||
|
|
ad48325dff | ||
|
|
fa1ad20d5d | ||
|
|
0547dede21 | ||
|
|
284ae23db2 | ||
|
|
9105f28c13 | ||
|
|
06cc43b11f | ||
|
|
d879d0d924 | ||
|
|
25bc84817a | ||
|
|
8fb0dfad94 | ||
|
|
c2138037d2 | ||
|
|
fadd64c1e9 | ||
|
|
4552691aed | ||
|
|
bab5c0589f | ||
|
|
2a2c614eb4 | ||
|
|
12529ec81e | ||
|
|
0179609a49 | ||
|
|
860c551aa6 | ||
|
|
1ba3474a5a | ||
|
|
f26c283541 | ||
|
|
56e9dab2ce | ||
|
|
b1fcae5cec | ||
|
|
93245ac37a | ||
|
|
3f795e44c7 | ||
|
|
e732e5158e | ||
|
|
2f5c033f09 | ||
|
|
6099369019 | ||
|
|
8d2b65386c | ||
|
|
ed835225cf | ||
|
|
43c1bc8d5f | ||
|
|
17832fe18c | ||
|
|
252f3f0bd6 | ||
|
|
e042aad819 | ||
|
|
9966daf0cf | ||
|
|
daf5e9cccf | ||
|
|
bf63d731d3 | ||
|
|
12abfc0fcf | ||
|
|
dea1b520f7 | ||
|
|
a5c268491e | ||
|
|
bf34f553bb | ||
|
|
97c61404ca | ||
|
|
c40d9f54a2 | ||
|
|
5e08593358 | ||
|
|
1f06b12f86 | ||
|
|
c7351f724e | ||
|
|
1851bce497 | ||
|
|
5fb8503fd2 | ||
|
|
792716eefc | ||
|
|
15a6c779b8 | ||
|
|
93d24e7106 | ||
|
|
b8a185c112 | ||
|
|
e242e65569 | ||
|
|
62ab33a434 | ||
|
|
f403916ef8 | ||
|
|
38f1585ac6 | ||
|
|
1f757270d9 | ||
|
|
e6de8401bf | ||
|
|
df2e34ac51 | ||
|
|
7bbd3a7e36 | ||
|
|
85a736d49b | ||
|
|
f9eb313f7c | ||
|
|
9cec486a1b | ||
|
|
7734c654a7 | ||
|
|
8e5fff6c5f | ||
|
|
faa9a740db | ||
|
|
70e39e9902 | ||
|
|
9f0b3963cb | ||
|
|
7ec2ce851c | ||
|
|
94ee4223d2 | ||
|
|
a64f4219e9 | ||
|
|
78e96cc312 | ||
|
|
89b111edca | ||
|
|
ec38943c53 | ||
|
|
ea654ef235 | ||
|
|
288b705450 | ||
|
|
73ca579056 | ||
|
|
8b5d7dc181 | ||
|
|
f05f6294cd | ||
|
|
b2c466cf3f | ||
|
|
da1b9a0e91 | ||
|
|
6cbb5a9215 | ||
|
|
cfdbb86bfa | ||
|
|
d61783b2c0 | ||
|
|
65c1e1b9e5 | ||
|
|
17d509a45a | ||
|
|
c7649766fd | ||
|
|
c0ec5e53ba | ||
|
|
a0a18017e8 | ||
|
|
411b84fcc2 | ||
|
|
e499eeb8cc | ||
|
|
803d1de5db | ||
|
|
fc8117c8e7 | ||
|
|
8bef0ede1b | ||
|
|
88128cde48 | ||
|
|
d0217e62f0 | ||
|
|
bba680b636 | ||
|
|
feb914b5c4 | ||
|
|
0a65ea34f3 | ||
|
|
bf299edfc7 | ||
|
|
6b0122547e | ||
|
|
88c0e149b5 | ||
|
|
38091b2021 | ||
|
|
ce87f293aa | ||
|
|
dca028a84f | ||
|
|
be3c4ab24a | ||
|
|
67c9a14902 | ||
|
|
014bdb795f | ||
|
|
df7e8b2e64 | ||
|
|
2b5fdd3548 | ||
|
|
e92a0eb901 | ||
|
|
e72a67f5de | ||
|
|
65dc291ff5 | ||
|
|
0bfc190a86 | ||
|
|
f8303f2e7a | ||
|
|
8ad72b167c | ||
|
|
7747082ae8 | ||
|
|
a7727adca2 | ||
|
|
028b53816d | ||
|
|
5a77117a9b | ||
|
|
05777019c8 | ||
|
|
7ebaad5099 | ||
|
|
09885c8f41 | ||
|
|
4f5ebb279d | ||
|
|
91ebf88c97 | ||
|
|
a608c51e36 | ||
|
|
3877dcf83a | ||
|
|
72d176b77a | ||
|
|
8840968e07 | ||
|
|
b6b889bff6 | ||
|
|
a30bdcbb50 | ||
|
|
82275d49a6 | ||
|
|
ee335de222 | ||
|
|
01bf7c8c38 | ||
|
|
5529a1b0b3 | ||
|
|
363be18599 | ||
|
|
ae8ad3b68b | ||
|
|
348b850e36 | ||
|
|
92c267758e | ||
|
|
b7d1ab6105 | ||
|
|
f7f1b4f594 | ||
|
|
6492bea846 | ||
|
|
b1cb89b0c2 | ||
|
|
7ecd98b0a0 | ||
|
|
7d7d4db329 | ||
|
|
e6bfe1fc88 | ||
|
|
151d3a9610 | ||
|
|
905ed36afd | ||
|
|
7fe9c9366e | ||
|
|
d5237d1a07 | ||
|
|
7bd3b29a11 | ||
|
|
60aa74257f | ||
|
|
ca0492d997 | ||
|
|
944133de6e | ||
|
|
174fdd40da | ||
|
|
ffa823f748 | ||
|
|
a83f7a822e | ||
|
|
29d527bee1 | ||
|
|
75e282c2ac | ||
|
|
8419d9114b | ||
|
|
1c414af7b9 | ||
|
|
834e8c64c5 | ||
|
|
1b3bb86546 | ||
|
|
aa560f42e7 | ||
|
|
4e69cd28cd | ||
|
|
5f0e30e17a | ||
|
|
d682771c35 | ||
|
|
ace3c3e421 | ||
|
|
94005b0c22 | ||
|
|
e9177c8932 | ||
|
|
d62c2d913e | ||
|
|
9ea88fe247 | ||
|
|
e0867a5d11 | ||
|
|
ae91101ea1 | ||
|
|
515057c41a | ||
|
|
d946ba426e | ||
|
|
07874cf77f | ||
|
|
1d9f9e838b | ||
|
|
101691e970 | ||
|
|
e2498c31ea | ||
|
|
9d8c6122cc | ||
|
|
227dda38a2 | ||
|
|
e2091413ea | ||
|
|
4976e82f0f | ||
|
|
5e949d2c6f | ||
|
|
fec7688241 | ||
|
|
2732f6036e | ||
|
|
387c44031a | ||
|
|
6cbd1c5fb1 | ||
|
|
447b9e1ea7 | ||
|
|
be08bcaafc | ||
|
|
1b5e8e0181 | ||
|
|
d2ffbd0395 | ||
|
|
88cb607975 | ||
|
|
e392956e2a | ||
|
|
3028081fa2 | ||
|
|
4003c59471 | ||
|
|
2e042f0c59 | ||
|
|
9a4238d4e2 | ||
|
|
c184dc8d2f | ||
|
|
32f41a04ac | ||
|
|
4b8174f75a | ||
|
|
313e14bc54 | ||
|
|
7aca31992b | ||
|
|
56f53e508f | ||
|
|
6c18dc63aa | ||
|
|
7b498065b5 | ||
|
|
81bd225ff7 | ||
|
|
074090a0aa | ||
|
|
3fcbcca8e4 | ||
|
|
dbaf12b043 | ||
|
|
9eb9b48534 | ||
|
|
e085fd1d57 | ||
|
|
9cc71b320b | ||
|
|
7b74cf1ab9 | ||
|
|
fb0c0e07f7 | ||
|
|
c6bb4a23ae | ||
|
|
70e271959b | ||
|
|
379abeb262 | ||
|
|
9e884847b1 | ||
|
|
5dadf9a087 | ||
|
|
c0630b782a | ||
|
|
62beb73aa2 | ||
|
|
7b6fe0159f | ||
|
|
dad22b1686 | ||
|
|
a715a51865 | ||
|
|
d4ec2319f9 | ||
|
|
88b980ac17 | ||
|
|
867c01d5e8 | ||
|
|
c8a064af3e | ||
|
|
12439f2b99 | ||
|
|
fb47ea301f | ||
|
|
6adecbd7aa | ||
|
|
f71e34fd9f | ||
|
|
dfe89588f0 | ||
|
|
d89b68a279 | ||
|
|
2a4a01cb7b | ||
|
|
c81b7f6bb4 | ||
|
|
0c11afad7a | ||
|
|
d6b26c9975 | ||
|
|
98c628f3eb | ||
|
|
36b2026075 | ||
|
|
7c535ff1a3 | ||
|
|
c6436ea6d1 | ||
|
|
5a8dee3cbe | ||
|
|
d9450d6e12 | ||
|
|
80377b3705 | ||
|
|
847a76b3a2 | ||
|
|
2c3d46bb80 | ||
|
|
e0cb6d4531 | ||
|
|
78f0177ac4 | ||
|
|
4688434c08 | ||
|
|
8913eeb1c1 | ||
|
|
75574e97cc | ||
|
|
f4089bc164 | ||
|
|
b0f04d91bf | ||
|
|
3b514d194c | ||
|
|
3ba405383e | ||
|
|
87f6c8087f | ||
|
|
90a83c8f11 | ||
|
|
27f892a14b | ||
|
|
bf4525d82d | ||
|
|
6bfb1a7fff | ||
|
|
a53ab7438c | ||
|
|
d85a080f9b | ||
|
|
4dbfc9483e | ||
|
|
53097ab183 | ||
|
|
9978a370f1 | ||
|
|
24995f46cb | ||
|
|
7ddc8c6aeb | ||
|
|
4a447f5c12 | ||
|
|
e56647f24d | ||
|
|
25238b53c9 | ||
|
|
1ed798342a | ||
|
|
1d6eb07c62 | ||
|
|
8e3d76b7ea | ||
|
|
d8838503b2 | ||
|
|
78b7742354 | ||
|
|
3d9dca47b8 | ||
|
|
c06c96bc1f | ||
|
|
db128dbc40 | ||
|
|
d6f87a8254 | ||
|
|
4c5f37db0f | ||
|
|
3e5338c902 | ||
|
|
848b7c7a34 | ||
|
|
4bf5dd15e9 | ||
|
|
d4273d8e3f | ||
|
|
780347776b | ||
|
|
5dd6986ad4 | ||
|
|
51bf41009e | ||
|
|
4defe734e2 | ||
|
|
e3cb4ebfdc | ||
|
|
c6345279cc | ||
|
|
e5a9af9a31 | ||
|
|
c0e1e31572 | ||
|
|
1e58c365ed | ||
|
|
bf87b76adb | ||
|
|
c8e06b5837 | ||
|
|
ee5cd06077 | ||
|
|
140352b637 | ||
|
|
b369321e2f | ||
|
|
b9aaba7b16 | ||
|
|
07519732a1 | ||
|
|
ae71f3c186 | ||
|
|
e1236f9deb | ||
|
|
3c9bfb5b4d | ||
|
|
86b50b0a93 | ||
|
|
da6706cb93 | ||
|
|
2842a109da | ||
|
|
021ddefb10 | ||
|
|
7d0b47c5cb | ||
|
|
9351a1f900 | ||
|
|
0ac48369fe | ||
|
|
e57ee17532 | ||
|
|
a897683272 | ||
|
|
38eb981d2c | ||
|
|
b524472b9e | ||
|
|
fc04083cb2 | ||
|
|
b1225951f2 | ||
|
|
24fd2e1849 | ||
|
|
5e5c975a9c | ||
|
|
c6336e920f | ||
|
|
cd19625522 | ||
|
|
3ac95a9213 | ||
|
|
e57ea9b501 | ||
|
|
14b335a51e | ||
|
|
319e746a55 | ||
|
|
eb4d721175 | ||
|
|
a4f850c0c6 | ||
|
|
0a8e25b405 | ||
|
|
1557a76225 | ||
|
|
d4fa379f11 | ||
|
|
e09c5fcb3c | ||
|
|
815fe25f2c | ||
|
|
5e5c84ba27 | ||
|
|
2974b23f26 | ||
|
|
697c21b120 | ||
|
|
1f72a52015 | ||
|
|
43bcf1051d | ||
|
|
bf8aa502f9 | ||
|
|
f0e92343cb | ||
|
|
48efd6689e | ||
|
|
090e689689 | ||
|
|
9d16df5f25 | ||
|
|
02651c93a7 | ||
|
|
2b1d4b6672 | ||
|
|
9087dac6fe | ||
|
|
762ed994c1 | ||
|
|
2c8a9d1160 | ||
|
|
f613316046 | ||
|
|
6b1bc15f37 | ||
|
|
9a77a0c201 | ||
|
|
755cdbb238 | ||
|
|
1996db4b95 | ||
|
|
6297f69e70 | ||
|
|
a796f9f8a8 | ||
|
|
0de9c57ade | ||
|
|
95dc01cdcb | ||
|
|
364d3996f4 | ||
|
|
33af9e878b | ||
|
|
9f8b9ea806 | ||
|
|
d53876ee1b | ||
|
|
4f654e81c8 | ||
|
|
aa33ddcf19 | ||
|
|
c8a57676b4 | ||
|
|
d0d2bc1996 | ||
|
|
2b8d2b0026 | ||
|
|
735953a262 | ||
|
|
1c686f10a1 | ||
|
|
b7088510c5 | ||
|
|
3bdb921ee5 | ||
|
|
74b48ff56b | ||
|
|
9410370cc5 | ||
|
|
743ddf83c1 | ||
|
|
caa707325a | ||
|
|
3c588e67b8 | ||
|
|
6c26dad048 | ||
|
|
393e2c125e | ||
|
|
e56dc2ed6a | ||
|
|
4a449ed85e | ||
|
|
88dbe90075 | ||
|
|
a6f6451434 | ||
|
|
8a4370c1f6 | ||
|
|
7a068450b3 | ||
|
|
ae3222e4c2 | ||
|
|
27b4bfa3fa | ||
|
|
8af229947f | ||
|
|
f235a2f539 | ||
|
|
b0ebb479f6 | ||
|
|
df92e21520 | ||
|
|
a1a25cc57f | ||
|
|
e9aaf8e0af | ||
|
|
7a80e407af | ||
|
|
57f8d535fb | ||
|
|
170a6096b9 | ||
|
|
fcc444a100 | ||
|
|
8ccb3c21e1 | ||
|
|
0484d4bb77 | ||
|
|
3ce9567f62 | ||
|
|
765e812b77 | ||
|
|
1a63c9296b | ||
|
|
9510b5aea5 | ||
|
|
490e859fbf | ||
|
|
85c4a2fdc2 | ||
|
|
3b9c9f6a97 | ||
|
|
d1f64d3059 | ||
|
|
f62bcdc803 | ||
|
|
2434fd778f | ||
|
|
1a38726fb7 | ||
|
|
24cffb2a69 | ||
|
|
527918545e | ||
|
|
4d268f67ae | ||
|
|
a65c2f4312 | ||
|
|
c490f2b849 | ||
|
|
282f7fc2e3 | ||
|
|
52348af8ec | ||
|
|
39d15ead6f | ||
|
|
d232109fce | ||
|
|
8e9c43610d | ||
|
|
53a8c20cb9 | ||
|
|
333f60a2a6 | ||
|
|
0bacc20a58 | ||
|
|
3e932c9bdf | ||
|
|
cf8a170133 | ||
|
|
67a89d4b6b | ||
|
|
85c2cda7b6 | ||
|
|
61757a6518 | ||
|
|
e245d08e54 | ||
|
|
29f797dc24 | ||
|
|
54ce1d8d2f | ||
|
|
8e47f70066 | ||
|
|
01548089ee | ||
|
|
de8d598f46 | ||
|
|
63aad4b9bf | ||
|
|
33cdb7a541 | ||
|
|
7c2f769a9a | ||
|
|
e084550390 | ||
|
|
3c282e8cf9 | ||
|
|
3c4fbdb50e | ||
|
|
18cdc28963 | ||
|
|
5f004e7167 | ||
|
|
96489607ab | ||
|
|
7436e44416 | ||
|
|
8d30e51603 | ||
|
|
64b582e397 | ||
|
|
8b86d07bfc | ||
|
|
e3fefdebe1 | ||
|
|
46aec4a593 | ||
|
|
2feb3e1d7a | ||
|
|
2609f45799 | ||
|
|
9053cbb90f | ||
|
|
3794d7ab65 | ||
|
|
7eeca21a05 | ||
|
|
70464154c7 | ||
|
|
1b29078fad | ||
|
|
864b078610 | ||
|
|
1a8b319ce2 | ||
|
|
a353514fc8 | ||
|
|
06e294fb3e | ||
|
|
961d4c4a3a | ||
|
|
876aea39e5 | ||
|
|
67be2ba95b | ||
|
|
53d2d080f4 | ||
|
|
998fbeb381 | ||
|
|
1c6e4b7750 | ||
|
|
8fbe21c79c | ||
|
|
d6d0faac6e | ||
|
|
2d4f01e6cb | ||
|
|
b42ad3170e | ||
|
|
a8dddc81f1 | ||
|
|
2e1e6f784b | ||
|
|
2af9b95c7a | ||
|
|
90be010c2b | ||
|
|
3b6b16cf77 | ||
|
|
c0c5c87c29 | ||
|
|
f5bbf4b515 | ||
|
|
c7465608a7 | ||
|
|
03f0a4289b | ||
|
|
bb2a6b73fe | ||
|
|
8e66091dd2 | ||
|
|
a5c114a848 | ||
|
|
254b2c27ac | ||
|
|
29fcb4504c | ||
|
|
ec7402b80a | ||
|
|
4501519c4f | ||
|
|
58ad7dab1b | ||
|
|
4da26a2f8d | ||
|
|
9e6aed0760 | ||
|
|
7033f11d56 | ||
|
|
8fcac42f34 | ||
|
|
4a6a97ee75 | ||
|
|
2174d8fe8c | ||
|
|
eb6f487e2a | ||
|
|
6bbe68dfcb | ||
|
|
bbeceae42e | ||
|
|
cfe785762d | ||
|
|
fdbb329fb6 | ||
|
|
9f1100b967 | ||
|
|
94706d6139 | ||
|
|
b63609e2fa | ||
|
|
84c420139d | ||
|
|
027d21035e | ||
|
|
cc9de01c99 | ||
|
|
61c6f240e9 | ||
|
|
997d673b83 | ||
|
|
6c72846d63 | ||
|
|
8bd6e1d119 | ||
|
|
6484a8e6a4 | ||
|
|
0e8e108680 | ||
|
|
3435b6c4a4 | ||
|
|
d4af6af594 | ||
|
|
b834abd293 | ||
|
|
01a6dd79c4 | ||
|
|
948b6cf7e7 | ||
|
|
b1718f329e | ||
|
|
7237f549a6 | ||
|
|
30b1660005 | ||
|
|
200fe07473 | ||
|
|
86cb22d8c9 | ||
|
|
321766fd46 | ||
|
|
3eedad96ed | ||
|
|
4b26dac08a | ||
|
|
04ef069a20 | ||
|
|
b925ed60e3 | ||
|
|
dfd85a7c53 | ||
|
|
6ca63d4c68 | ||
|
|
2325b547fd | ||
|
|
34e454c054 | ||
|
|
302386d22c | ||
|
|
210c483635 | ||
|
|
8ca4212650 | ||
|
|
c91dba5ed6 | ||
|
|
c8de05f101 | ||
|
|
0ac7cde498 | ||
|
|
108829ad9c | ||
|
|
c5b96f4e9c | ||
|
|
4c2099d33e | ||
|
|
fe5de95008 | ||
|
|
4b0cfc0751 | ||
|
|
c2bf05942e | ||
|
|
df37f80c8e | ||
|
|
2c19d7218d | ||
|
|
34899e8d36 | ||
|
|
bf8c10ed25 | ||
|
|
93c33e08c2 | ||
|
|
3992dd1dd0 | ||
|
|
cab29c2be7 | ||
|
|
f582657ffd | ||
|
|
2823ac1aee | ||
|
|
289caa7cc2 | ||
|
|
0a8bad46b5 | ||
|
|
aa4f518262 | ||
|
|
f76fa879fc | ||
|
|
8d70aba1f5 | ||
|
|
a44bb35aec | ||
|
|
4fda2b656f | ||
|
|
e626d00fdf | ||
|
|
bf09e3c3ae | ||
|
|
753dcd3301 | ||
|
|
8b5dee510e | ||
|
|
9cb73fbf78 | ||
|
|
e6b4deb5c4 | ||
|
|
8848222728 | ||
|
|
3cd62994c7 | ||
|
|
dd93a97790 | ||
|
|
e40e2d2d14 | ||
|
|
26f8ce7b5a | ||
|
|
9a61e374b5 | ||
|
|
9b12e9819c | ||
|
|
5d0a91239c | ||
|
|
c848278690 | ||
|
|
2ebb929e2c | ||
|
|
b34334ba93 | ||
|
|
05a01cd803 | ||
|
|
9ac0c06f26 | ||
|
|
52af22b0e8 | ||
|
|
81cfc73b48 | ||
|
|
f892bfccdf | ||
|
|
dbed8fefac | ||
|
|
ca14637909 | ||
|
|
7db618fba5 | ||
|
|
29c74c09ce | ||
|
|
a2b5b9f97e | ||
|
|
6a05aa4e53 | ||
|
|
43fd5d233a | ||
|
|
0bd39ed035 | ||
|
|
1db8aad039 | ||
|
|
fb2d4267f5 | ||
|
|
d7b203ae08 | ||
|
|
3e07f2e3bc | ||
|
|
94cf6f6640 | ||
|
|
6da5fe4317 | ||
|
|
3a68dee850 | ||
|
|
2ccfa6a2e8 | ||
|
|
f7bf671050 | ||
|
|
4bff9cc3df | ||
|
|
13c68a0184 | ||
|
|
6d92949715 | ||
|
|
5cf31bd3f3 | ||
|
|
929d4c8d61 | ||
|
|
482f796bad | ||
|
|
d85f532ab1 | ||
|
|
b1654f7807 | ||
|
|
4f8526e527 | ||
|
|
4b568fc469 | ||
|
|
d06146ed97 | ||
|
|
8e0e809733 | ||
|
|
d1f33a6c4c | ||
|
|
b3e1b6fdbf | ||
|
|
0bd259403c | ||
|
|
c186846463 | ||
|
|
5f92c3b3fc | ||
|
|
0665091cef | ||
|
|
688d153427 | ||
|
|
bec5ba7a73 | ||
|
|
acedf4d6a3 | ||
|
|
5dd5494f93 | ||
|
|
f253e4fabe | ||
|
|
acd09d24d5 | ||
|
|
ceac95c81a | ||
|
|
47a05d0ea2 | ||
|
|
d2975479f2 | ||
|
|
3c238ffae7 | ||
|
|
69f8d1b717 | ||
|
|
45cd9e65d3 | ||
|
|
2e4b1d8c2b | ||
|
|
4e3b65188d | ||
|
|
0ab32e066b | ||
|
|
79d8b00b27 | ||
|
|
eb02c5a451 | ||
|
|
85509c777d | ||
|
|
27677f86e4 | ||
|
|
16174ca874 | ||
|
|
a4e9233231 | ||
|
|
4fdfafa17f | ||
|
|
c9a7dab419 | ||
|
|
8882d75132 | ||
|
|
f67b15b926 | ||
|
|
2d7958f726 | ||
|
|
36072584d0 | ||
|
|
2119e52f55 | ||
|
|
ca1aa6b663 | ||
|
|
10af671b76 | ||
|
|
a4ec6cce96 | ||
|
|
5082ba7102 | ||
|
|
7405e7001b | ||
|
|
4c70651b81 | ||
|
|
21b5b60278 | ||
|
|
0abc5ec452 | ||
|
|
b1d2d620fa | ||
|
|
af6e4abe84 | ||
|
|
45b4315842 | ||
|
|
d2cb96a9e5 | ||
|
|
a3ff845a14 | ||
|
|
621f05c687 | ||
|
|
daf97eabab | ||
|
|
ee3d11cb53 | ||
|
|
1bc7e5e0a5 | ||
|
|
9280d23b1a | ||
|
|
cacd52f81d | ||
|
|
95f64761ca | ||
|
|
6e24792b9b | ||
|
|
9afe26f1d6 | ||
|
|
e7d959da90 | ||
|
|
c3f0867d2c | ||
|
|
1eaf124d4e | ||
|
|
03076bdc76 | ||
|
|
cd32d6debe | ||
|
|
3212f059ff | ||
|
|
9ae4b93083 | ||
|
|
aae7af2194 | ||
|
|
63f4c73ef0 | ||
|
|
f93d3381e0 | ||
|
|
099c80e04b | ||
|
|
14face336e | ||
|
|
67b10d8d38 | ||
|
|
1219230168 | ||
|
|
8d840e694d | ||
|
|
87382aad4d | ||
|
|
aca3a05222 | ||
|
|
84ca145663 | ||
|
|
01d0338851 | ||
|
|
f427c0532d | ||
|
|
c8532a548c | ||
|
|
1e3aef5b94 | ||
|
|
0d3180271b | ||
|
|
f0d17b13f2 | ||
|
|
9a46301d46 | ||
|
|
3bd609ee41 | ||
|
|
2c7f0e8583 | ||
|
|
ce36a25ba3 | ||
|
|
c53484f92e | ||
|
|
f391ccb8e8 | ||
|
|
a96d6a8148 | ||
|
|
bdca09007d | ||
|
|
c0e84043c9 | ||
|
|
0a884df74f | ||
|
|
519b14d506 | ||
|
|
f008a65d91 | ||
|
|
61bb70cd30 | ||
|
|
68fa3dadb0 | ||
|
|
eb38d03976 | ||
|
|
d480bb3ecd | ||
|
|
dfdb6fa1a6 | ||
|
|
42352d9f57 | ||
|
|
eae1c5db70 | ||
|
|
cc37097164 | ||
|
|
6597cc9ce8 | ||
|
|
b3f752d46c | ||
|
|
679e2d0f6b | ||
|
|
4607079ca9 | ||
|
|
ad1a42d6a5 | ||
|
|
afdf31a66c | ||
|
|
37956e2f05 | ||
|
|
dc6aa66f9a | ||
|
|
f16f16c15e | ||
|
|
3b95cbd960 | ||
|
|
3b5e8edd37 | ||
|
|
5f4571e895 | ||
|
|
2d5e991eaf | ||
|
|
7ba8bb4405 | ||
|
|
82aa181540 | ||
|
|
1a3e17bae8 | ||
|
|
e0e3664fdb | ||
|
|
23bfaf1ba2 | ||
|
|
e7d72b6f53 | ||
|
|
eab26deab9 | ||
|
|
49540dbe5e | ||
|
|
cbd891785e | ||
|
|
b1cc732cb2 | ||
|
|
b3b4f55c68 | ||
|
|
8b6b039c13 | ||
|
|
9dca62ff8b | ||
|
|
e0892fcebb | ||
|
|
adf1443105 | ||
|
|
53c2558d26 | ||
|
|
a5ea240793 | ||
|
|
4cd1629118 | ||
|
|
ce32a73e86 | ||
|
|
8a13fc7cd9 | ||
|
|
708de50887 | ||
|
|
4df478316c | ||
|
|
a5dff9fb15 | ||
|
|
b51f4d53b6 | ||
|
|
7d045842dd | ||
|
|
a9ece9e49d | ||
|
|
e6da067cf8 | ||
|
|
bae40c82b9 | ||
|
|
651edf5bc0 | ||
|
|
3a8642b1e0 | ||
|
|
09b6b9259c | ||
|
|
907f326788 | ||
|
|
4a350d8ad9 | ||
|
|
3881db0b4e | ||
|
|
9edae3e877 | ||
|
|
236208e393 | ||
|
|
4ff98de707 | ||
|
|
54964629fe | ||
|
|
072f606784 | ||
|
|
21d2338ec1 | ||
|
|
0d468e0df4 | ||
|
|
5007d49c83 | ||
|
|
35ba69a175 | ||
|
|
fa0ce2a14c | ||
|
|
389750d7d8 | ||
|
|
6c7db7ad23 | ||
|
|
2986426251 | ||
|
|
56444ebcaf | ||
|
|
c63a1978cb | ||
|
|
9d9e998d49 | ||
|
|
f7c991fa9a | ||
|
|
4d14fbb1e7 | ||
|
|
5428730e7a | ||
|
|
bf773df099 | ||
|
|
6dea5100b1 | ||
|
|
aa55f4dceb | ||
|
|
516e92926a | ||
|
|
2cd9994321 | ||
|
|
e69306a2ba | ||
|
|
93ecd031bd | ||
|
|
4eaf69dfa7 | ||
|
|
bc93bda1b7 | ||
|
|
6923f0df2a | ||
|
|
bc584aa56e | ||
|
|
ec95d06f6c | ||
|
|
c5d18d9046 | ||
|
|
af06983c60 | ||
|
|
e027872f50 | ||
|
|
e98e4fde8d | ||
|
|
2daf9de890 | ||
|
|
ae50511135 | ||
|
|
2227f83b1d | ||
|
|
e764a2298d | ||
|
|
ed4a8c2a36 | ||
|
|
8cc3e571e3 | ||
|
|
66a89a7d54 | ||
|
|
666be94a71 | ||
|
|
49fabf23a8 | ||
|
|
a3b23e348a | ||
|
|
384e887fdb | ||
|
|
d3e84cbc4c | ||
|
|
1b06948fb0 | ||
|
|
98d075728f | ||
|
|
1a7ecda67c | ||
|
|
067078db86 | ||
|
|
37650fae75 | ||
|
|
13be3e3216 | ||
|
|
87a7809104 | ||
|
|
e82c33716a | ||
|
|
9ebdddad1f | ||
|
|
90f85bb9c3 | ||
|
|
002d04a3a1 | ||
|
|
88a0b12e73 | ||
|
|
5828e7f576 | ||
|
|
a11da90d10 | ||
|
|
d8026833dc | ||
|
|
8029bb6142 | ||
|
|
baaddd395c | ||
|
|
8bcbe7b3c6 | ||
|
|
4297320886 | ||
|
|
614994d8c7 | ||
|
|
65e1f261c0 | ||
|
|
aa4caa6938 | ||
|
|
9741574516 | ||
|
|
c27c654180 | ||
|
|
c63580ee38 | ||
|
|
e9d4328fad | ||
|
|
545f9f2cca | ||
|
|
db6930d9e4 | ||
|
|
9379a41b37 | ||
|
|
c0eeedc71a | ||
|
|
400197def8 | ||
|
|
0f8b202531 | ||
|
|
1eb9775f34 | ||
|
|
89bdb315d5 | ||
|
|
ab1afd68b7 | ||
|
|
e1109e9e51 | ||
|
|
7230e19166 | ||
|
|
eb7a94bb55 | ||
|
|
18de4e57eb | ||
|
|
74cc12133e | ||
|
|
7583354f44 | ||
|
|
14c49dd681 | ||
|
|
e060208417 | ||
|
|
635eea7acb | ||
|
|
2c47f4a23d | ||
|
|
2223577302 | ||
|
|
f42d235dec | ||
|
|
06a3e278ff | ||
|
|
17c30b5fdc | ||
|
|
024b30d0b7 | ||
|
|
a108610a67 | ||
|
|
12b6abe6a3 | ||
|
|
6f82b36962 | ||
|
|
ea6b397526 | ||
|
|
118bb3f3ba | ||
|
|
bd68075f4d | ||
|
|
5fa68f8cdd | ||
|
|
199aaf2d05 | ||
|
|
892efcc166 | ||
|
|
bc90c6b82f | ||
|
|
82d3d1f0f3 | ||
|
|
576b3198f1 | ||
|
|
f55cad8f1c | ||
|
|
d98654b50d | ||
|
|
675d9d8c09 | ||
|
|
bab0bb349f | ||
|
|
65d3ed8ce8 | ||
|
|
8fc4000b63 | ||
|
|
5b35f781cb | ||
|
|
2cd11b7da7 | ||
|
|
cf30d2923c | ||
|
|
8fc97794e8 | ||
|
|
df2ba37687 | ||
|
|
85b16b2a54 | ||
|
|
eeabc6b61a | ||
|
|
2b3dafed61 | ||
|
|
7232fc36ab | ||
|
|
a8e1fd1054 | ||
|
|
c248a50338 | ||
|
|
fa0ca23798 | ||
|
|
ed224cf912 | ||
|
|
b51df25371 | ||
|
|
db8cc8eb7b | ||
|
|
a027e9fe14 | ||
|
|
b882ca809a | ||
|
|
daf0a9dc9a | ||
|
|
f2dafa7544 | ||
|
|
7fe22875a6 | ||
|
|
3da3c8ecd8 | ||
|
|
254acbbbe2 | ||
|
|
519c850f17 | ||
|
|
1cf57508b0 | ||
|
|
f8bacfcc67 | ||
|
|
9daa77c1a4 | ||
|
|
c4775dd313 | ||
|
|
ae87cb031e | ||
|
|
3c049f25ee | ||
|
|
85a90b62b7 | ||
|
|
10b0124951 | ||
|
|
c0d7ff9543 | ||
|
|
74012d4869 | ||
|
|
830c40440f | ||
|
|
21a2f71ad9 | ||
|
|
cf75e3e664 | ||
|
|
ffc307323a | ||
|
|
ff0aec28c5 | ||
|
|
31394b03ae | ||
|
|
2ab93cb385 | ||
|
|
172b396dc9 | ||
|
|
9b82d08087 | ||
|
|
410617f73b | ||
|
|
ade0d38a7c | ||
|
|
3ce55a2ac4 | ||
|
|
cc6e4dbec0 | ||
|
|
2935ae7bf1 | ||
|
|
96e418e63b | ||
|
|
e4a84dcfe9 | ||
|
|
9ea91cfce3 | ||
|
|
8c7f0cf988 | ||
|
|
afa9a00259 | ||
|
|
a0ee11c300 | ||
|
|
6e02dace18 | ||
|
|
93bac6f26f | ||
|
|
8657fbd810 | ||
|
|
68203be004 | ||
|
|
b2323ef2e7 | ||
|
|
70b017fb72 | ||
|
|
607e3bbc11 | ||
|
|
315c9285de | ||
|
|
c22427b8fd | ||
|
|
2fcfac9e84 | ||
|
|
7cc857233f | ||
|
|
f85aa09784 | ||
|
|
0b0cecc2a9 | ||
|
|
3b5b9c9587 | ||
|
|
cbe190fa70 | ||
|
|
9156466351 | ||
|
|
f79caf095d | ||
|
|
d31dcd13fc | ||
|
|
552224bbfe | ||
|
|
5ba01674fb | ||
|
|
7390afc5e1 | ||
|
|
85ec23d552 | ||
|
|
007064c0ac | ||
|
|
fd53756170 | ||
|
|
9e6dd9f23d | ||
|
|
ef8be6c7c2 | ||
|
|
de4b5b70da | ||
|
|
9edeee4b3f | ||
|
|
767a0cc1fd | ||
|
|
ae09247e34 | ||
|
|
a3ea4798bc | ||
|
|
af54a22d16 | ||
|
|
b026bfc71b | ||
|
|
80d80ad8aa | ||
|
|
dbecf33924 | ||
|
|
2b08e3604d | ||
|
|
7d3a672c2b | ||
|
|
022e46ae38 | ||
|
|
3f930d228e | ||
|
|
5eba370f7b | ||
|
|
e138951e9e | ||
|
|
5cd18d7275 | ||
|
|
d7ff5a53a7 | ||
|
|
aa14bb6fdf | ||
|
|
c275f682a9 | ||
|
|
08894025bc | ||
|
|
b063a48520 | ||
|
|
858d38d314 | ||
|
|
f5875d09e9 | ||
|
|
34db181686 | ||
|
|
be55ea2b0b | ||
|
|
aa0dd4d10d | ||
|
|
39533e4209 | ||
|
|
4bba3bf1d2 | ||
|
|
2d29d1549a | ||
|
|
c7a078f17f | ||
|
|
2cf92037e9 | ||
|
|
452ee7a103 | ||
|
|
68f70af2f3 | ||
|
|
11682e487e | ||
|
|
4d006230f9 | ||
|
|
a32f4bb05c | ||
|
|
6d4e260127 | ||
|
|
45404b5bcf | ||
|
|
861551b2ba | ||
|
|
aac820a8d5 | ||
|
|
a5ff25b0fe | ||
|
|
b81638794f | ||
|
|
88cfeb2791 | ||
|
|
d0b57535ed | ||
|
|
528add4702 | ||
|
|
dd47971877 | ||
|
|
d51a99c8e2 | ||
|
|
e192f01dc3 | ||
|
|
aedaf57249 | ||
|
|
222e58e76e | ||
|
|
c8fc80f4a0 | ||
|
|
1ed180887d | ||
|
|
d6a38a567f | ||
|
|
ae9c3276bc | ||
|
|
35d34cd4e8 | ||
|
|
4f45824632 | ||
|
|
532da174dd | ||
|
|
dbe13feba2 | ||
|
|
1c93061a7f | ||
|
|
0e371930e6 | ||
|
|
06bd748bd6 | ||
|
|
b64775772b | ||
|
|
5f76314085 | ||
|
|
57588ea936 | ||
|
|
3f344b55bb | ||
|
|
e4ae0980b4 | ||
|
|
e41da0d697 | ||
|
|
ce3955d393 | ||
|
|
22a2cc564f | ||
|
|
2b19513a05 | ||
|
|
60f8fe6f41 | ||
|
|
a2fd010521 | ||
|
|
a36d5b6302 | ||
|
|
2c14dc16dd | ||
|
|
4c7f3f7972 | ||
|
|
794df59265 | ||
|
|
3dd71713c2 | ||
|
|
c0777d1a0a | ||
|
|
55392cb047 | ||
|
|
070eedda18 | ||
|
|
ae6ec78dc3 | ||
|
|
9fe1b2a565 | ||
|
|
f374419be3 | ||
|
|
0ff25cb116 | ||
|
|
d7e50f352a | ||
|
|
aa9254eeb0 | ||
|
|
c1eba336a8 | ||
|
|
a5d7fc484a | ||
|
|
7a294e6d4e | ||
|
|
2f79417d0d | ||
|
|
73b42f924d | ||
|
|
ccf915e798 | ||
|
|
62ffa14f10 | ||
|
|
5d7840a34c | ||
|
|
fd14f6ff73 | ||
|
|
88962f9358 | ||
|
|
5bec1729f1 | ||
|
|
f3662fc152 | ||
|
|
c5047186dd | ||
|
|
1e39bd8336 | ||
|
|
e58de234ac | ||
|
|
903cc181c4 | ||
|
|
2183a098c3 | ||
|
|
1d4cba9180 | ||
|
|
ed724c5280 | ||
|
|
fbd13ac42c | ||
|
|
ea6eab557b | ||
|
|
a1cb2a0589 | ||
|
|
5de5a8ca94 | ||
|
|
274026d338 | ||
|
|
3875bc34bd |
48
.github/actions/setup-deps/action.yml
vendored
Normal file
48
.github/actions/setup-deps/action.yml
vendored
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
name: "Setup LLGO Dependencies"
|
||||||
|
description: "Install all required dependencies for LLGO"
|
||||||
|
inputs:
|
||||||
|
llvm-version:
|
||||||
|
description: "LLVM version to install"
|
||||||
|
required: true
|
||||||
|
default: "18"
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Install macOS dependencies
|
||||||
|
if: runner.os == 'macOS'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
brew update
|
||||||
|
brew install llvm@${{inputs.llvm-version}} bdw-gc openssl libffi
|
||||||
|
brew link --force libffi
|
||||||
|
echo "$(brew --prefix llvm@${{inputs.llvm-version}})/bin" >> $GITHUB_PATH
|
||||||
|
|
||||||
|
# Install optional deps for demos.
|
||||||
|
#
|
||||||
|
# NOTE: Keep this list updated as new deps are introduced.
|
||||||
|
opt_deps=(
|
||||||
|
cjson # for github.com/goplus/llgo/c/cjson
|
||||||
|
sqlite # for github.com/goplus/llgo/c/sqlite
|
||||||
|
python@3.12 # for github.com/goplus/llgo/py
|
||||||
|
)
|
||||||
|
brew install "${opt_deps[@]}"
|
||||||
|
- name: Install Ubuntu dependencies
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-${{inputs.llvm-version}} main" | sudo tee /etc/apt/sources.list.d/llvm.list
|
||||||
|
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y llvm-${{inputs.llvm-version}}-dev clang-${{inputs.llvm-version}} libclang-${{inputs.llvm-version}}-dev lld-${{inputs.llvm-version}} pkg-config libgc-dev libssl-dev zlib1g-dev libffi-dev libcjson-dev libunwind-dev
|
||||||
|
echo "/usr/lib/llvm-${{inputs.llvm-version}}/bin" >> $GITHUB_PATH
|
||||||
|
|
||||||
|
# Install optional deps for demos.
|
||||||
|
#
|
||||||
|
# NOTE: Keep this list updated as new deps are introduced.
|
||||||
|
opt_deps=(
|
||||||
|
libcjson-dev # for github.com/goplus/llgo/c/cjson
|
||||||
|
libsqlite3-dev # for github.com/goplus/llgo/c/sqlite
|
||||||
|
python3.12-dev # for github.com/goplus/llgo/py
|
||||||
|
)
|
||||||
|
sudo apt-get install -y "${opt_deps[@]}"
|
||||||
35
.github/actions/test-helloworld/action.yml
vendored
Normal file
35
.github/actions/test-helloworld/action.yml
vendored
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
name: 'Test Hello World'
|
||||||
|
description: 'Test Hello World with specific Go and module versions'
|
||||||
|
inputs:
|
||||||
|
go-version:
|
||||||
|
description: 'Go version being tested'
|
||||||
|
required: true
|
||||||
|
mod-version:
|
||||||
|
description: 'Go module version to use'
|
||||||
|
required: true
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Test Hello World
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "Testing with Go ${{ inputs.go-version }} and go.mod ${{ inputs.mod-version }}"
|
||||||
|
mkdir -p _test/helloworld && cd _test/helloworld
|
||||||
|
cat > go.mod << 'EOL'
|
||||||
|
module hello
|
||||||
|
go ${{ inputs.mod-version }}
|
||||||
|
EOL
|
||||||
|
cat > main.go << 'EOL'
|
||||||
|
package main
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/goplus/llgo/c"
|
||||||
|
)
|
||||||
|
func main() {
|
||||||
|
fmt.Println("Hello, LLGo!")
|
||||||
|
println("Hello, LLGo!")
|
||||||
|
c.Printf(c.Str("Hello, LLGo!\n"))
|
||||||
|
}
|
||||||
|
EOL
|
||||||
|
go mod tidy
|
||||||
|
llgo run .
|
||||||
3
.github/codecov.yml
vendored
Normal file
3
.github/codecov.yml
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
coverage:
|
||||||
|
ignore:
|
||||||
|
- "compiler/chore"
|
||||||
10
.github/dependabot.yml
vendored
10
.github/dependabot.yml
vendored
@@ -17,3 +17,13 @@ updates:
|
|||||||
directory: "/" # Location of package manifests
|
directory: "/" # Location of package manifests
|
||||||
schedule:
|
schedule:
|
||||||
interval: "daily"
|
interval: "daily"
|
||||||
|
|
||||||
|
- package-ecosystem: "gomod" # See documentation for possible values
|
||||||
|
directory: "/compiler/" # Location of package manifests
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
|
||||||
|
- package-ecosystem: "gomod" # See documentation for possible values
|
||||||
|
directory: "/runtime/" # Location of package manifests
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
|||||||
75
.github/workflows/doc.yml
vendored
Normal file
75
.github/workflows/doc.yml
vendored
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
name: Docs
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "**" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "**" ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
doc_verify:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: '20'
|
||||||
|
|
||||||
|
- name: Install embedme
|
||||||
|
run: npm install -g embedme
|
||||||
|
|
||||||
|
- name: Verify README.md embedded code
|
||||||
|
run: npx embedme --verify README.md
|
||||||
|
|
||||||
|
doc_test:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os:
|
||||||
|
- macos-latest
|
||||||
|
- ubuntu-24.04
|
||||||
|
runs-on: ${{matrix.os}}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: '1.23'
|
||||||
|
|
||||||
|
- name: Install dependencies on macOS
|
||||||
|
if: startsWith(matrix.os, 'macos')
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
set -x
|
||||||
|
source doc/_readme/scripts/install_macos.sh
|
||||||
|
|
||||||
|
- name: Install dependencies on Ubuntu
|
||||||
|
if: startsWith(matrix.os, 'ubuntu')
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
set -x
|
||||||
|
source doc/_readme/scripts/install_ubuntu.sh
|
||||||
|
|
||||||
|
- name: Install llgo
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
set -x
|
||||||
|
git() {
|
||||||
|
if [ "$1" = "clone" ]; then
|
||||||
|
# do nothing because we already have the branch
|
||||||
|
cd ..
|
||||||
|
else
|
||||||
|
command git "$@"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
source doc/_readme/scripts/install_llgo.sh
|
||||||
|
echo "LLGO_ROOT=$GITHUB_WORKSPACE" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Test doc code blocks
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
set -x
|
||||||
|
source doc/_readme/scripts/run.sh
|
||||||
|
|
||||||
30
.github/workflows/fmt.yml
vendored
Normal file
30
.github/workflows/fmt.yml
vendored
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
name: Format Check
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "**" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "**" ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
fmt:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: '1.23'
|
||||||
|
|
||||||
|
- name: Check formatting
|
||||||
|
run: |
|
||||||
|
for dir in . compiler runtime; do
|
||||||
|
pushd $dir
|
||||||
|
if [ -n "$(go fmt ./...)" ]; then
|
||||||
|
echo "Some files are not properly formatted. Please run 'go fmt ./...'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
popd
|
||||||
|
done
|
||||||
|
echo "All files are properly formatted."
|
||||||
74
.github/workflows/go.yml
vendored
74
.github/workflows/go.yml
vendored
@@ -5,88 +5,52 @@ name: Go
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ "main" ]
|
branches: [ "**" ]
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ "main" ]
|
branches: [ "**" ]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
test:
|
test:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
os: [macos-latest, ubuntu-latest]
|
os:
|
||||||
|
- macos-latest
|
||||||
|
- ubuntu-24.04
|
||||||
llvm: [18]
|
llvm: [18]
|
||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{matrix.os}}
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
working-directory: compiler
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
- name: Install dependencies
|
||||||
|
uses: ./.github/actions/setup-deps
|
||||||
|
with:
|
||||||
|
llvm-version: ${{matrix.llvm}}
|
||||||
|
|
||||||
- name: Update Homebrew
|
|
||||||
# needed as long as LLVM 18 is still fresh
|
|
||||||
if: matrix.llvm == 18 && startsWith(matrix.os, 'macos')
|
|
||||||
run: brew update
|
|
||||||
- name: Install LLVM ${{ matrix.llvm }} and bdw-gc
|
|
||||||
if: startsWith(matrix.os, 'macos')
|
|
||||||
run: |
|
|
||||||
HOMEBREW_NO_AUTO_UPDATE=1 brew install llvm@${{ matrix.llvm }} bdw-gc
|
|
||||||
echo `brew --prefix llvm@${{ matrix.llvm }}`/bin >> $GITHUB_PATH
|
|
||||||
- name: Install LLVM ${{ matrix.llvm }} and libgc-dev
|
|
||||||
if: startsWith(matrix.os, 'ubuntu')
|
|
||||||
run: |
|
|
||||||
echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-${{ matrix.llvm }} main" | sudo tee /etc/apt/sources.list.d/llvm.list
|
|
||||||
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y llvm-${{ matrix.llvm }}-dev clang-${{ matrix.llvm }} lld-${{ matrix.llvm }} pkg-config libgc-dev libcjson-dev libsqlite3-dev python3.11-dev
|
|
||||||
echo /usr/lib/llvm-${{ matrix.llvm }}/bin >> $GITHUB_PATH
|
|
||||||
|
|
||||||
- name: Clang information
|
- name: Clang information
|
||||||
run: |
|
run: |
|
||||||
echo $PATH
|
echo $PATH
|
||||||
which clang
|
which clang
|
||||||
clang --version
|
clang --version
|
||||||
|
|
||||||
- name: Set up Go
|
- name: Set up Go
|
||||||
uses: actions/setup-go@v5
|
uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: '1.20'
|
go-version: '1.23'
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: go build -v ./...
|
run: go build -v ./...
|
||||||
|
|
||||||
- name: Test
|
- name: Test
|
||||||
if: matrix.os != 'macos-latest'
|
if: ${{!startsWith(matrix.os, 'macos')}}
|
||||||
run: go test -v ./...
|
run: go test -v ./...
|
||||||
|
|
||||||
- name: Test with coverage
|
- name: Test with coverage
|
||||||
if: matrix.os == 'macos-latest'
|
if: startsWith(matrix.os, 'macos')
|
||||||
run: go test -v -coverprofile="coverage.txt" -covermode=atomic ./...
|
run: go test -v -coverprofile="coverage.txt" -covermode=atomic ./...
|
||||||
|
|
||||||
- name: Install
|
|
||||||
run: go install ./...
|
|
||||||
|
|
||||||
- name: LLGO tests
|
|
||||||
if: matrix.os != 'ubuntu-latest'
|
|
||||||
run: |
|
|
||||||
echo "Test result on ${{ matrix.os }} with LLVM ${{ matrix.llvm }}" > result.md
|
|
||||||
LLGOROOT=$PWD bash .github/workflows/test_llgo.sh
|
|
||||||
|
|
||||||
- name: Test _demo and _pydemo
|
|
||||||
run: |
|
|
||||||
set +e
|
|
||||||
LLGOROOT=$PWD bash .github/workflows/test_demo.sh
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
- name: Show test result
|
|
||||||
run: cat result.md
|
|
||||||
|
|
||||||
- name: PR comment with test result
|
|
||||||
uses: thollander/actions-comment-pull-request@v2
|
|
||||||
if: false
|
|
||||||
with:
|
|
||||||
filePath: result.md
|
|
||||||
comment_tag: test-result-on-${{ matrix.os }}-with-llvm-${{ matrix.llvm }}
|
|
||||||
|
|
||||||
- name: Upload coverage reports to Codecov
|
- name: Upload coverage reports to Codecov
|
||||||
uses: codecov/codecov-action@v4
|
uses: codecov/codecov-action@v5
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
token: ${{secrets.CODECOV_TOKEN}}
|
||||||
slug: goplus/llgo
|
|
||||||
|
|||||||
145
.github/workflows/llgo.yml
vendored
Normal file
145
.github/workflows/llgo.yml
vendored
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
# This workflow will build a golang project
|
||||||
|
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go
|
||||||
|
|
||||||
|
name: LLGo
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "**" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "**" ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
llgo-test:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os:
|
||||||
|
- macos-latest
|
||||||
|
- ubuntu-24.04
|
||||||
|
llvm: [18]
|
||||||
|
go: ['1.20', '1.21', '1.22', '1.23']
|
||||||
|
runs-on: ${{matrix.os}}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Install dependencies
|
||||||
|
uses: ./.github/actions/setup-deps
|
||||||
|
with:
|
||||||
|
llvm-version: ${{matrix.llvm}}
|
||||||
|
- name: Install further optional dependencies for demos
|
||||||
|
run: |
|
||||||
|
wget -P ./_demo/llama2-c https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin
|
||||||
|
py_deps=(
|
||||||
|
numpy # for github.com/goplus/llgo/py/numpy
|
||||||
|
torch # for github.com/goplus/llgo/py/torch
|
||||||
|
)
|
||||||
|
pip3.12 install --break-system-packages "${py_deps[@]}"
|
||||||
|
|
||||||
|
- name: Set up Go for build
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: '1.23'
|
||||||
|
|
||||||
|
- name: Install
|
||||||
|
working-directory: compiler
|
||||||
|
run: |
|
||||||
|
go install ./...
|
||||||
|
echo "LLGO_ROOT=$GITHUB_WORKSPACE" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Set up Go for testing
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: ${{matrix.go}}
|
||||||
|
|
||||||
|
- name: Verify Go version
|
||||||
|
run: |
|
||||||
|
go_version=$(go version | cut -d' ' -f3 | sed 's/go//')
|
||||||
|
if [[ "$go_version" != "${{matrix.go}}"* ]]; then
|
||||||
|
echo "Expected Go version ${{matrix.go}}, but got $go_version"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Using Go version: $go_version"
|
||||||
|
|
||||||
|
- name: _xtool build tests
|
||||||
|
run: |
|
||||||
|
cd _xtool
|
||||||
|
llgo build -v ./...
|
||||||
|
|
||||||
|
- name: LLGO tests
|
||||||
|
if: ${{!startsWith(matrix.os, 'ubuntu')}}
|
||||||
|
run: |
|
||||||
|
echo "Test result on ${{matrix.os}} with LLVM ${{matrix.llvm}}" > result.md
|
||||||
|
bash ./.github/workflows/test_llgo.sh
|
||||||
|
|
||||||
|
- name: Test demos
|
||||||
|
run: |
|
||||||
|
# TODO(lijie): force python3-embed to be linked with python-3.12-embed
|
||||||
|
# Currently, python3-embed is python-3.13-embed, doesn't work with pytorch
|
||||||
|
# Will remove this after pytorch is fixed.
|
||||||
|
pcdir=$HOME/pc
|
||||||
|
mkdir -p $pcdir
|
||||||
|
libdir=$(pkg-config --variable=libdir python-3.12-embed)
|
||||||
|
echo "libdir: $libdir"
|
||||||
|
ln -s $libdir/pkgconfig/python-3.12-embed.pc $pcdir/python3-embed.pc
|
||||||
|
export PKG_CONFIG_PATH=$pcdir
|
||||||
|
bash .github/workflows/test_demo.sh
|
||||||
|
|
||||||
|
- name: Show test result
|
||||||
|
run: cat result.md
|
||||||
|
|
||||||
|
- name: LLDB tests
|
||||||
|
if: ${{startsWith(matrix.os, 'macos')}}
|
||||||
|
working-directory: compiler
|
||||||
|
run: |
|
||||||
|
echo "Test lldb with llgo plugin on ${{matrix.os}} with LLVM ${{matrix.llvm}}"
|
||||||
|
bash _lldb/runtest.sh -v
|
||||||
|
|
||||||
|
helloworld-test:
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ubuntu-24.04, macos-latest]
|
||||||
|
llvm: [18]
|
||||||
|
go: ['1.20', '1.21', '1.22', '1.23']
|
||||||
|
runs-on: ${{matrix.os}}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Install dependencies
|
||||||
|
uses: ./.github/actions/setup-deps
|
||||||
|
with:
|
||||||
|
llvm-version: ${{matrix.llvm}}
|
||||||
|
|
||||||
|
- name: Set up Go 1.23 for building llgo
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: '1.23'
|
||||||
|
|
||||||
|
- name: Install llgo
|
||||||
|
working-directory: compiler
|
||||||
|
run: |
|
||||||
|
go install ./...
|
||||||
|
echo "LLGO_ROOT=$GITHUB_WORKSPACE" >> $GITHUB_ENV
|
||||||
|
|
||||||
|
- name: Set up Go for testing
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: ${{matrix.go}}
|
||||||
|
|
||||||
|
- name: Test Hello World with go.mod 1.20
|
||||||
|
if: matrix.go == '1.20' || matrix.go == '1.21' || matrix.go == '1.22' || matrix.go == '1.23'
|
||||||
|
uses: ./.github/actions/test-helloworld
|
||||||
|
with:
|
||||||
|
go-version: ${{matrix.go}}
|
||||||
|
mod-version: '1.20'
|
||||||
|
|
||||||
|
- name: Test Hello World with go.mod 1.21
|
||||||
|
if: matrix.go == '1.21' || matrix.go == '1.22' || matrix.go == '1.23'
|
||||||
|
uses: ./.github/actions/test-helloworld
|
||||||
|
with:
|
||||||
|
go-version: ${{matrix.go}}
|
||||||
|
mod-version: '1.21'
|
||||||
|
|
||||||
|
- name: Test Hello World with go.mod 1.22
|
||||||
|
if: matrix.go == '1.22' || matrix.go == '1.23'
|
||||||
|
uses: ./.github/actions/test-helloworld
|
||||||
|
with:
|
||||||
|
go-version: ${{matrix.go}}
|
||||||
|
mod-version: '1.22'
|
||||||
40
.github/workflows/populate_darwin_sysroot.sh
vendored
Executable file
40
.github/workflows/populate_darwin_sysroot.sh
vendored
Executable file
@@ -0,0 +1,40 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
TMPDIR="$(mktemp -d)"
|
||||||
|
export TMPDIR
|
||||||
|
trap 'rm -rf "${TMPDIR}"' EXIT
|
||||||
|
|
||||||
|
DARWIN_AMD64_LLVM_PREFIX=.sysroot/darwin/amd64/usr/local/opt/llvm@18
|
||||||
|
DARWIN_ARM64_LLVM_PREFIX=.sysroot/darwin/arm64/opt/homebrew/opt/llvm@18
|
||||||
|
mkdir -p "${DARWIN_AMD64_LLVM_PREFIX}" "${DARWIN_ARM64_LLVM_PREFIX}"
|
||||||
|
|
||||||
|
BREW_LLVM_FORMULA_JSON="$(mktemp)"
|
||||||
|
curl -fsSL https://formulae.brew.sh/api/formula/llvm@18.json > "${BREW_LLVM_FORMULA_JSON}"
|
||||||
|
BREW_LLVM_AMD64_BOTTLE_URL=$(jq -r '.bottle.stable.files.sonoma.url' "${BREW_LLVM_FORMULA_JSON}")
|
||||||
|
BREW_LLVM_ARM64_BOTTLE_URL=$(jq -r '.bottle.stable.files.arm64_sonoma.url' "${BREW_LLVM_FORMULA_JSON}")
|
||||||
|
curl -fsSL -H "Authorization: Bearer QQ==" "${BREW_LLVM_AMD64_BOTTLE_URL}" | tar -xzf - --strip-components=2 -C "${DARWIN_AMD64_LLVM_PREFIX}"
|
||||||
|
curl -fsSL -H "Authorization: Bearer QQ==" "${BREW_LLVM_ARM64_BOTTLE_URL}" | tar -xzf - --strip-components=2 -C "${DARWIN_ARM64_LLVM_PREFIX}"
|
||||||
|
|
||||||
|
patch_homebrew_lib_dir() {
|
||||||
|
local LIB_DIR="$1"
|
||||||
|
local HOMEBREW_PREFIX="$2"
|
||||||
|
for DYLIB_FILE in "${LIB_DIR}"/*.dylib; do
|
||||||
|
if [[ -f "${DYLIB_FILE}" ]]; then
|
||||||
|
ID=$(otool -D "${DYLIB_FILE}" | grep '@@HOMEBREW_PREFIX@@' | awk '{print $1}')
|
||||||
|
if [[ -n "${ID}" ]]; then
|
||||||
|
NEW_ID=${ID/'@@HOMEBREW_PREFIX@@'/${HOMEBREW_PREFIX}}
|
||||||
|
install_name_tool -id "${NEW_ID}" "${DYLIB_FILE}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
DEPS=$(otool -L "${DYLIB_FILE}" | grep '@@HOMEBREW_PREFIX@@' | awk '{print $1}')
|
||||||
|
for DEP in ${DEPS}; do
|
||||||
|
NEW_DEP=${DEP/'@@HOMEBREW_PREFIX@@'/${HOMEBREW_PREFIX}}
|
||||||
|
install_name_tool -change "${DEP}" "${NEW_DEP}" "${DYLIB_FILE}"
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
patch_homebrew_lib_dir "${DARWIN_AMD64_LLVM_PREFIX}/lib" /usr/lib
|
||||||
|
patch_homebrew_lib_dir "${DARWIN_ARM64_LLVM_PREFIX}/lib" /opt/homebrew
|
||||||
143
.github/workflows/populate_linux_sysroot.sh
vendored
Executable file
143
.github/workflows/populate_linux_sysroot.sh
vendored
Executable file
@@ -0,0 +1,143 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
TMPDIR="$(mktemp -d)"
|
||||||
|
export TMPDIR
|
||||||
|
trap 'rm -rf "${TMPDIR}"' EXIT
|
||||||
|
|
||||||
|
LINUX_AMD64_PREFIX=.sysroot/linux/amd64
|
||||||
|
LINUX_ARM64_PREFIX=.sysroot/linux/arm64
|
||||||
|
mkdir -p "${LINUX_AMD64_PREFIX}" "${LINUX_ARM64_PREFIX}"
|
||||||
|
|
||||||
|
POPULATE_LINUX_SYSROOT_SCRIPT="$(mktemp)"
|
||||||
|
cat > "${POPULATE_LINUX_SYSROOT_SCRIPT}" << EOF
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y lsb-release gnupg2 wget rsync
|
||||||
|
|
||||||
|
echo "deb http://apt.llvm.org/\$(lsb_release -cs)/ llvm-toolchain-\$(lsb_release -cs)-18 main" | tee /etc/apt/sources.list.d/llvm.list
|
||||||
|
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y llvm-18-dev
|
||||||
|
|
||||||
|
error() {
|
||||||
|
echo -e "\$1" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
exclude_list=()
|
||||||
|
include_list=()
|
||||||
|
|
||||||
|
exclude_list+=(--exclude "/bin")
|
||||||
|
exclude_list+=(--exclude "/boot")
|
||||||
|
exclude_list+=(--exclude "/boot*")
|
||||||
|
exclude_list+=(--exclude "/dev")
|
||||||
|
exclude_list+=(--exclude "/etc")
|
||||||
|
exclude_list+=(--exclude "/home")
|
||||||
|
exclude_list+=(--exclude "/lib/dhcpd")
|
||||||
|
exclude_list+=(--exclude "/lib/firmware")
|
||||||
|
exclude_list+=(--exclude "/lib/hdparm")
|
||||||
|
exclude_list+=(--exclude "/lib/ifupdown")
|
||||||
|
exclude_list+=(--exclude "/lib/modules")
|
||||||
|
exclude_list+=(--exclude "/lib/modprobe.d")
|
||||||
|
exclude_list+=(--exclude "/lib/modules-load.d")
|
||||||
|
exclude_list+=(--exclude "/lib/resolvconf")
|
||||||
|
exclude_list+=(--exclude "/lib/startpar")
|
||||||
|
exclude_list+=(--exclude "/lib/systemd")
|
||||||
|
exclude_list+=(--exclude "/lib/terminfo")
|
||||||
|
exclude_list+=(--exclude "/lib/udev")
|
||||||
|
exclude_list+=(--exclude "/lib/xtables")
|
||||||
|
exclude_list+=(--exclude "/lib/ssl/private")
|
||||||
|
exclude_list+=(--exclude "/lost+found")
|
||||||
|
exclude_list+=(--exclude "/media")
|
||||||
|
exclude_list+=(--exclude "/mnt")
|
||||||
|
exclude_list+=(--exclude "/proc")
|
||||||
|
exclude_list+=(--exclude "/root")
|
||||||
|
exclude_list+=(--exclude "/run")
|
||||||
|
exclude_list+=(--exclude "/sbin")
|
||||||
|
exclude_list+=(--exclude "/srv")
|
||||||
|
exclude_list+=(--exclude "/sys")
|
||||||
|
exclude_list+=(--exclude "/tmp")
|
||||||
|
exclude_list+=(--exclude "/usr/bin")
|
||||||
|
exclude_list+=(--exclude "/usr/games")
|
||||||
|
exclude_list+=(--exclude "/usr/sbin")
|
||||||
|
exclude_list+=(--exclude "/usr/share")
|
||||||
|
exclude_list+=(--exclude "/usr/src")
|
||||||
|
exclude_list+=(--exclude "/usr/local/bin")
|
||||||
|
exclude_list+=(--exclude "/usr/local/etc")
|
||||||
|
exclude_list+=(--exclude "/usr/local/games")
|
||||||
|
exclude_list+=(--exclude "/usr/local/man")
|
||||||
|
exclude_list+=(--exclude "/usr/local/sbin")
|
||||||
|
exclude_list+=(--exclude "/usr/local/share")
|
||||||
|
exclude_list+=(--exclude "/usr/local/src")
|
||||||
|
exclude_list+=(--exclude "/usr/lib/ssl/private")
|
||||||
|
exclude_list+=(--exclude "/var")
|
||||||
|
exclude_list+=(--exclude "/snap")
|
||||||
|
exclude_list+=(--exclude "*python*")
|
||||||
|
|
||||||
|
include_list+=(--include "*.a")
|
||||||
|
include_list+=(--include "*.so")
|
||||||
|
include_list+=(--include "*.so.*")
|
||||||
|
include_list+=(--include "*.h")
|
||||||
|
include_list+=(--include "*.hh")
|
||||||
|
include_list+=(--include "*.hpp")
|
||||||
|
include_list+=(--include "*.hxx")
|
||||||
|
include_list+=(--include "*.pc")
|
||||||
|
include_list+=(--include "*.def")
|
||||||
|
include_list+=(--include "*.inc")
|
||||||
|
include_list+=(--include "/lib")
|
||||||
|
include_list+=(--include "/lib32")
|
||||||
|
include_list+=(--include "/lib64")
|
||||||
|
include_list+=(--include "/libx32")
|
||||||
|
include_list+=(--include "*/")
|
||||||
|
|
||||||
|
do-sync() {
|
||||||
|
from=\$1
|
||||||
|
to=\$2
|
||||||
|
|
||||||
|
args=()
|
||||||
|
args+=(-a)
|
||||||
|
args+=(-z)
|
||||||
|
args+=(-m)
|
||||||
|
args+=(-d)
|
||||||
|
args+=(-h)
|
||||||
|
args+=(--keep-dirlinks)
|
||||||
|
args+=("--info=progress2")
|
||||||
|
args+=(--delete)
|
||||||
|
args+=(--prune-empty-dirs)
|
||||||
|
args+=(--sparse)
|
||||||
|
args+=(--links)
|
||||||
|
args+=(--copy-unsafe-links)
|
||||||
|
args+=("\${exclude_list[@]}")
|
||||||
|
args+=("\${include_list[@]}")
|
||||||
|
args+=(--exclude "*")
|
||||||
|
args+=("\${from}")
|
||||||
|
args+=("\${to}")
|
||||||
|
|
||||||
|
echo "\${args[@]}"
|
||||||
|
rsync "\${args[@]}"
|
||||||
|
|
||||||
|
exit \$?
|
||||||
|
}
|
||||||
|
|
||||||
|
do-sync / /sysroot/
|
||||||
|
EOF
|
||||||
|
chmod +x "${POPULATE_LINUX_SYSROOT_SCRIPT}"
|
||||||
|
|
||||||
|
populate_linux_sysroot() {
|
||||||
|
local ARCH="$1"
|
||||||
|
local PREFIX="$2"
|
||||||
|
docker run \
|
||||||
|
--rm \
|
||||||
|
--platform "linux/${ARCH}" \
|
||||||
|
-v "$(pwd)/${PREFIX}":/sysroot \
|
||||||
|
-v "${POPULATE_LINUX_SYSROOT_SCRIPT}":/populate_linux_sysroot.sh \
|
||||||
|
debian:bullseye \
|
||||||
|
/populate_linux_sysroot.sh
|
||||||
|
}
|
||||||
|
populate_linux_sysroot amd64 "${LINUX_AMD64_PREFIX}"
|
||||||
|
populate_linux_sysroot arm64 "${LINUX_ARM64_PREFIX}"
|
||||||
67
.github/workflows/release-build.yml
vendored
Normal file
67
.github/workflows/release-build.yml
vendored
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
name: Release Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "*"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
populate-darwin-sysroot:
|
||||||
|
runs-on: macos-latest
|
||||||
|
steps:
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: Cache Darwin sysroot
|
||||||
|
id: cache-sysroot
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
.sysroot/darwin.tar.gz
|
||||||
|
key: darwin-sysroot-${{ runner.os }}-${{ hashFiles('.github/workflows/populate_darwin_sysroot.sh') }}
|
||||||
|
- name: Populate Darwin sysroot
|
||||||
|
if: steps.cache-sysroot.outputs.cache-hit != 'true'
|
||||||
|
run: bash .github/workflows/populate_darwin_sysroot.sh
|
||||||
|
- name: Create Darwin sysroot tarball
|
||||||
|
if: steps.cache-sysroot.outputs.cache-hit != 'true'
|
||||||
|
run: tar -czvf .sysroot/darwin.tar.gz -C .sysroot darwin
|
||||||
|
- name: Upload Darwin sysroot tarball
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: darwin-sysroot-tarball
|
||||||
|
path: .sysroot/darwin.tar.gz
|
||||||
|
compression-level: 0
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: populate-darwin-sysroot
|
||||||
|
steps:
|
||||||
|
- name: Check out code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Set up Go
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: 1.23.x
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v3
|
||||||
|
- name: Download Darwin sysroot tarball
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: darwin-sysroot-tarball
|
||||||
|
path: .sysroot
|
||||||
|
- name: Populate Darwin sysroot
|
||||||
|
run: tar -xzvf .sysroot/darwin.tar.gz -C .sysroot
|
||||||
|
- name: Populate Linux sysroot
|
||||||
|
run: bash .github/workflows/populate_linux_sysroot.sh
|
||||||
|
- name: Run GoReleaser
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{github.token}}
|
||||||
|
run: |
|
||||||
|
docker run \
|
||||||
|
--rm \
|
||||||
|
-e GITHUB_TOKEN=${GITHUB_TOKEN} \
|
||||||
|
-v /var/run/docker.sock:/var/run/docker.sock \
|
||||||
|
-v $(pwd):/go/src/llgo \
|
||||||
|
-w /go/src/llgo \
|
||||||
|
ghcr.io/goreleaser/goreleaser-cross:v1.22 \
|
||||||
|
release --clean --skip nfpm,snapcraft
|
||||||
9
.github/workflows/test_demo.sh
vendored
9
.github/workflows/test_demo.sh
vendored
@@ -1,14 +1,15 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
# llgo run subdirectories under _demo and _pydemo
|
# llgo run subdirectories under _demo and _pydemo that contain *.go files
|
||||||
total=0
|
total=0
|
||||||
failed=0
|
failed=0
|
||||||
failed_cases=""
|
failed_cases=""
|
||||||
for d in ./_demo/* ./_pydemo/*; do
|
for d in ./_demo/* ./_pydemo/*; do
|
||||||
total=$((total+1))
|
if [ -d "$d" ] && [ -n "$(ls "$d"/*.go 2>/dev/null)" ]; then
|
||||||
if [ -d "$d" ]; then
|
total=$((total+1))
|
||||||
echo "Testing $d"
|
echo "Testing $d"
|
||||||
if ! llgo run -v "$d"; then
|
if ! (cd "$d" && llgo run .); then
|
||||||
echo "FAIL"
|
echo "FAIL"
|
||||||
failed=$((failed+1))
|
failed=$((failed+1))
|
||||||
failed_cases="$failed_cases\n* :x: $d"
|
failed_cases="$failed_cases\n* :x: $d"
|
||||||
|
|||||||
4
.github/workflows/test_llgo.sh
vendored
4
.github/workflows/test_llgo.sh
vendored
@@ -1,10 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
export LLGOROOT=$PWD
|
|
||||||
|
|
||||||
testcmd=/tmp/test
|
testcmd=/tmp/test
|
||||||
llgo build -o $testcmd ./_test
|
llgo build -o $testcmd ./c/bdwgc/_test
|
||||||
cases=$($testcmd)
|
cases=$($testcmd)
|
||||||
total=$(echo "$cases" | wc -l | tr -d ' ')
|
total=$(echo "$cases" | wc -l | tr -d ' ')
|
||||||
failed=0
|
failed=0
|
||||||
|
|||||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -26,6 +26,9 @@ build.dir/
|
|||||||
# Test binary, built with `go test -c`
|
# Test binary, built with `go test -c`
|
||||||
*.test
|
*.test
|
||||||
|
|
||||||
|
# Debug symbols
|
||||||
|
*.dSYM
|
||||||
|
|
||||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||||
*.out
|
*.out
|
||||||
*.swp
|
*.swp
|
||||||
@@ -35,3 +38,7 @@ build.dir/
|
|||||||
|
|
||||||
# Go workspace file
|
# Go workspace file
|
||||||
go.work*
|
go.work*
|
||||||
|
|
||||||
|
# GoReleaser
|
||||||
|
.dist/
|
||||||
|
.sysroot/
|
||||||
|
|||||||
154
.goreleaser.yaml
Normal file
154
.goreleaser.yaml
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
version: 2
|
||||||
|
|
||||||
|
dist: .dist
|
||||||
|
|
||||||
|
env:
|
||||||
|
- SYSROOT_DARWIN_AMD64={{.Env.PWD}}/.sysroot/darwin/amd64
|
||||||
|
- SYSROOT_DARWIN_ARM64={{.Env.PWD}}/.sysroot/darwin/arm64
|
||||||
|
- SYSROOT_LINUX_AMD64={{.Env.PWD}}/.sysroot/linux/amd64
|
||||||
|
- SYSROOT_LINUX_ARM64={{.Env.PWD}}/.sysroot/linux/arm64
|
||||||
|
- CGO_ENABLED=1
|
||||||
|
- CGO_CXXFLAGS=-std=c++17
|
||||||
|
|
||||||
|
before:
|
||||||
|
hooks:
|
||||||
|
- go mod download
|
||||||
|
|
||||||
|
builds:
|
||||||
|
- id: llgo-darwin-amd64
|
||||||
|
dir: compiler
|
||||||
|
main: ./cmd/llgo
|
||||||
|
binary: bin/llgo
|
||||||
|
flags:
|
||||||
|
- -tags=darwin,amd64,byollvm
|
||||||
|
ldflags:
|
||||||
|
- -X github.com/goplus/llgo/x/env.buildVersion=v{{.Version}}
|
||||||
|
- -X github.com/goplus/llgo/x/env.buildTime={{.Date}}
|
||||||
|
- -X github.com/goplus/llgo/xtool/env/llvm.ldLLVMConfigBin=/usr/local/opt/llvm@18/bin/llvm-config
|
||||||
|
env:
|
||||||
|
- CC=o64-clang
|
||||||
|
- CXX=o64-clang++
|
||||||
|
- CGO_CPPFLAGS=-I{{.Env.SYSROOT_DARWIN_AMD64}}/usr/local/opt/llvm@18/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
|
||||||
|
- CGO_LDFLAGS=-L{{.Env.SYSROOT_DARWIN_AMD64}}/usr/local/opt/llvm@18/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM-18 -lz -lm
|
||||||
|
targets:
|
||||||
|
- darwin_amd64
|
||||||
|
mod_timestamp: "{{.CommitTimestamp}}"
|
||||||
|
- id: llgo-darwin-arm64
|
||||||
|
dir: compiler
|
||||||
|
main: ./cmd/llgo
|
||||||
|
binary: bin/llgo
|
||||||
|
flags:
|
||||||
|
- -tags=darwin,arm64,byollvm
|
||||||
|
ldflags:
|
||||||
|
- -X github.com/goplus/llgo/x/env.buildVersion=v{{.Version}}
|
||||||
|
- -X github.com/goplus/llgo/x/env.buildTime={{.Date}}
|
||||||
|
- -X github.com/goplus/llgo/xtool/env/llvm.ldLLVMConfigBin=/opt/homebrew/opt/llvm@18/bin/llvm-config
|
||||||
|
env:
|
||||||
|
- CC=oa64-clang
|
||||||
|
- CXX=oa64-clang++
|
||||||
|
- CGO_CPPFLAGS=-I{{.Env.SYSROOT_DARWIN_ARM64}}/opt/homebrew/opt/llvm@18/include -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
|
||||||
|
- CGO_LDFLAGS=-L{{.Env.SYSROOT_DARWIN_ARM64}}/opt/homebrew/opt/llvm@18/lib -Wl,-search_paths_first -Wl,-headerpad_max_install_names -lLLVM-18 -lz -lm
|
||||||
|
targets:
|
||||||
|
- darwin_arm64
|
||||||
|
mod_timestamp: "{{.CommitTimestamp}}"
|
||||||
|
- id: llgo-linux-amd64
|
||||||
|
dir: compiler
|
||||||
|
main: ./cmd/llgo
|
||||||
|
binary: bin/llgo
|
||||||
|
flags:
|
||||||
|
- -tags=linux,amd64,byollvm
|
||||||
|
ldflags:
|
||||||
|
- -X github.com/goplus/llgo/x/env.buildVersion=v{{.Version}}
|
||||||
|
- -X github.com/goplus/llgo/x/env.buildTime={{.Date}}
|
||||||
|
- -X github.com/goplus/llgo/xtool/env/llvm.ldLLVMConfigBin=/usr/lib/llvm-18/bin/llvm-config
|
||||||
|
env:
|
||||||
|
- CC=x86_64-linux-gnu-gcc
|
||||||
|
- CXX=x86_64-linux-gnu-g++
|
||||||
|
- CGO_CPPFLAGS=--sysroot={{.Env.SYSROOT_LINUX_AMD64}} -I{{.Env.SYSROOT_LINUX_AMD64}}/usr/include/llvm-18 -I{{.Env.SYSROOT_LINUX_AMD64}}/usr/include/llvm-c-18 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
|
||||||
|
- CGO_LDFLAGS=--sysroot={{.Env.SYSROOT_LINUX_AMD64}} -L{{.Env.SYSROOT_LINUX_AMD64}}/usr/lib/llvm-18/lib -lLLVM-18
|
||||||
|
targets:
|
||||||
|
- linux_amd64
|
||||||
|
mod_timestamp: "{{.CommitTimestamp}}"
|
||||||
|
- id: llgo-linux-arm64
|
||||||
|
dir: compiler
|
||||||
|
main: ./cmd/llgo
|
||||||
|
binary: bin/llgo
|
||||||
|
flags:
|
||||||
|
- -tags=linux,arm64,byollvm
|
||||||
|
ldflags:
|
||||||
|
- -X github.com/goplus/llgo/x/env.buildVersion=v{{.Version}}
|
||||||
|
- -X github.com/goplus/llgo/x/env.buildTime={{.Date}}
|
||||||
|
- -X github.com/goplus/llgo/xtool/env/llvm.ldLLVMConfigBin=/usr/lib/llvm-18/bin/llvm-config
|
||||||
|
env:
|
||||||
|
- CC=aarch64-linux-gnu-gcc
|
||||||
|
- CXX=aarch64-linux-gnu-g++
|
||||||
|
- CGO_CPPFLAGS=--sysroot={{.Env.SYSROOT_LINUX_ARM64}} -I{{.Env.SYSROOT_LINUX_ARM64}}/usr/include/llvm-18 -I{{.Env.SYSROOT_LINUX_ARM64}}/usr/include/llvm-c-18 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
|
||||||
|
- CGO_LDFLAGS=--sysroot={{.Env.SYSROOT_LINUX_ARM64}} -L{{.Env.SYSROOT_LINUX_ARM64}}/usr/lib/llvm-18/lib -lLLVM-18
|
||||||
|
targets:
|
||||||
|
- linux_arm64
|
||||||
|
mod_timestamp: "{{.CommitTimestamp}}"
|
||||||
|
|
||||||
|
archives:
|
||||||
|
- format: tar.gz
|
||||||
|
name_template: >-
|
||||||
|
{{.ProjectName}}{{.Version}}.{{.Os}}-{{.Arch}}
|
||||||
|
{{- if .Arm}}v{{.Arm}}{{end}}
|
||||||
|
files:
|
||||||
|
- LICENSE
|
||||||
|
- README.md
|
||||||
|
- runtime
|
||||||
|
|
||||||
|
checksum:
|
||||||
|
name_template: "{{.ProjectName}}{{.Version}}.checksums.txt"
|
||||||
|
|
||||||
|
nfpms:
|
||||||
|
- package_name: llgo
|
||||||
|
vendor: goplus
|
||||||
|
homepage: https://github.com/goplus/llgo
|
||||||
|
maintainer: Aofei Sheng <aofei@aofeisheng.com>
|
||||||
|
description: |
|
||||||
|
LLGo is a Go compiler based on LLVM in order to better integrate Go with the C ecosystem including Python. It's a
|
||||||
|
subproject of the Go+ project.
|
||||||
|
|
||||||
|
LLGo aims to expand the boundaries of Go/Go+, providing limitless possibilities such as:
|
||||||
|
|
||||||
|
- Game development
|
||||||
|
- AI and data science
|
||||||
|
- WebAssembly
|
||||||
|
- Embedded development
|
||||||
|
- ...
|
||||||
|
license: Apache-2.0
|
||||||
|
formats:
|
||||||
|
- deb
|
||||||
|
- rpm
|
||||||
|
file_name_template: >-
|
||||||
|
{{.ProjectName}}{{.Version}}.{{.Os}}-{{.Arch}}
|
||||||
|
{{- if .Arm}}v{{.Arm}}{{end}}
|
||||||
|
bindir: /usr/local/bin
|
||||||
|
|
||||||
|
snapcrafts:
|
||||||
|
- name: llgo
|
||||||
|
title: A Go compiler based on LLVM
|
||||||
|
summary: A Go compiler based on LLVM
|
||||||
|
description: |
|
||||||
|
LLGo is a Go compiler based on LLVM in order to better integrate Go with the C ecosystem including Python. It's a
|
||||||
|
subproject of the Go+ project.
|
||||||
|
|
||||||
|
LLGo aims to expand the boundaries of Go/Go+, providing limitless possibilities such as:
|
||||||
|
|
||||||
|
- Game development
|
||||||
|
- AI and data science
|
||||||
|
- WebAssembly
|
||||||
|
- Embedded development
|
||||||
|
- ...
|
||||||
|
license: Apache-2.0
|
||||||
|
confinement: classic
|
||||||
|
name_template: >-
|
||||||
|
{{.ProjectName}}{{.Version}}.{{.Os}}-{{.Arch}}
|
||||||
|
{{- if .Arm}}v{{.Arm}}{{end}}
|
||||||
|
|
||||||
|
snapshot:
|
||||||
|
name_template: '{{trimprefix .Summary "v"}}'
|
||||||
|
|
||||||
|
release:
|
||||||
|
prerelease: auto
|
||||||
185
README.md
185
README.md
@@ -24,14 +24,16 @@ How can these be achieved?
|
|||||||
LLGo := Go + C + Python
|
LLGo := Go + C + Python
|
||||||
```
|
```
|
||||||
|
|
||||||
LLGo is compatible with C and Python through the language's **Application Binary Interface (ABI)**, while LLGo is compatible with Go through its **syntax (source code)**.
|
LLGo is compatible with C and Python through the language's **Application Binary Interface (ABI)**, while LLGo is compatible with Go through its **syntax (source code)**. And here C doesn't just include C, but all languages that are ABI compatible with C, including C/C++, Objective-C, Swift, etc.
|
||||||
|
|
||||||
|
|
||||||
## C standard libary support
|
## C/C++ standard libary support
|
||||||
|
|
||||||
You can import a C standard library in LLGo!
|
You can import a C/C++ standard library in LLGo!
|
||||||
|
|
||||||
* [c](https://pkg.go.dev/github.com/goplus/llgo/c)
|
* [c](https://pkg.go.dev/github.com/goplus/llgo/c)
|
||||||
|
* [c/syscall](https://pkg.go.dev/github.com/goplus/llgo/c/syscall)
|
||||||
|
* [c/sys](https://pkg.go.dev/github.com/goplus/llgo/c/sys)
|
||||||
* [c/os](https://pkg.go.dev/github.com/goplus/llgo/c/os)
|
* [c/os](https://pkg.go.dev/github.com/goplus/llgo/c/os)
|
||||||
* [c/math](https://pkg.go.dev/github.com/goplus/llgo/c/math)
|
* [c/math](https://pkg.go.dev/github.com/goplus/llgo/c/math)
|
||||||
* [c/math/cmplx](https://pkg.go.dev/github.com/goplus/llgo/c/math/cmplx)
|
* [c/math/cmplx](https://pkg.go.dev/github.com/goplus/llgo/c/math/cmplx)
|
||||||
@@ -40,9 +42,13 @@ You can import a C standard library in LLGo!
|
|||||||
* [c/pthread/sync](https://pkg.go.dev/github.com/goplus/llgo/c/pthread/sync)
|
* [c/pthread/sync](https://pkg.go.dev/github.com/goplus/llgo/c/pthread/sync)
|
||||||
* [c/sync/atomic](https://pkg.go.dev/github.com/goplus/llgo/c/sync/atomic)
|
* [c/sync/atomic](https://pkg.go.dev/github.com/goplus/llgo/c/sync/atomic)
|
||||||
* [c/time](https://pkg.go.dev/github.com/goplus/llgo/c/time)
|
* [c/time](https://pkg.go.dev/github.com/goplus/llgo/c/time)
|
||||||
|
* [c/net](https://pkg.go.dev/github.com/goplus/llgo/c/net)
|
||||||
|
* [cpp/std](https://pkg.go.dev/github.com/goplus/llgo/cpp/std)
|
||||||
|
|
||||||
Here is a simple example:
|
Here is a simple example:
|
||||||
|
|
||||||
|
<!-- embedme doc/_readme/llgo_simple/simple.go -->
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
package main
|
||||||
|
|
||||||
@@ -69,6 +75,51 @@ llgo run .
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## How to support C/C++ and Python
|
||||||
|
|
||||||
|
LLGo use `go:linkname` to link an extern symbol througth its ABI:
|
||||||
|
|
||||||
|
<!-- embedme doc/_readme/llgo_call_c/call_c.go#L3-L6 -->
|
||||||
|
|
||||||
|
```go
|
||||||
|
import _ "unsafe" // for go:linkname
|
||||||
|
|
||||||
|
//go:linkname Sqrt C.sqrt
|
||||||
|
func Sqrt(x float64) float64
|
||||||
|
```
|
||||||
|
|
||||||
|
You can directly integrate it into [your own code](_demo/linkname/linkname.go):
|
||||||
|
|
||||||
|
<!-- embedme doc/_readme/llgo_call_c/call_c.go -->
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import _ "unsafe" // for go:linkname
|
||||||
|
|
||||||
|
//go:linkname Sqrt C.sqrt
|
||||||
|
func Sqrt(x float64) float64
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
println("sqrt(2) =", Sqrt(2))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Or put it into a package (see [c/math](c/math/math.go)):
|
||||||
|
|
||||||
|
<!-- embedme doc/_readme/llgo_call_cmath/call_cmath.go -->
|
||||||
|
|
||||||
|
```go
|
||||||
|
package main
|
||||||
|
|
||||||
|
import "github.com/goplus/llgo/c/math"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
println("sqrt(2) =", math.Sqrt(2))
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## Python support
|
## Python support
|
||||||
|
|
||||||
You can import a Python library in LLGo!
|
You can import a Python library in LLGo!
|
||||||
@@ -92,6 +143,8 @@ Note: For third-party libraries (such as pandas and pytorch), you still need to
|
|||||||
|
|
||||||
Here is an example:
|
Here is an example:
|
||||||
|
|
||||||
|
<!-- embedme doc/_readme/llgo_call_py/call_py.go -->
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
package main
|
||||||
|
|
||||||
@@ -109,6 +162,8 @@ func main() {
|
|||||||
|
|
||||||
It is equivalent to the following Python code:
|
It is equivalent to the following Python code:
|
||||||
|
|
||||||
|
<!-- embedme doc/_readme/llgo_call_py/call_math.py -->
|
||||||
|
|
||||||
```py
|
```py
|
||||||
import math
|
import math
|
||||||
|
|
||||||
@@ -120,6 +175,8 @@ Here, We call `py.Float(2)` to create a Python number 2, and pass it to Python
|
|||||||
|
|
||||||
Let's look at a slightly more complex example. For example, we use `numpy` to calculate:
|
Let's look at a slightly more complex example. For example, we use `numpy` to calculate:
|
||||||
|
|
||||||
|
<!-- embedme doc/_readme/llgo_py_list/py_list.go -->
|
||||||
|
|
||||||
```go
|
```go
|
||||||
package main
|
package main
|
||||||
|
|
||||||
@@ -171,10 +228,17 @@ The currently supported libraries include:
|
|||||||
* [c/bdwgc](https://pkg.go.dev/github.com/goplus/llgo/c/bdwgc)
|
* [c/bdwgc](https://pkg.go.dev/github.com/goplus/llgo/c/bdwgc)
|
||||||
* [c/cjson](https://pkg.go.dev/github.com/goplus/llgo/c/cjson)
|
* [c/cjson](https://pkg.go.dev/github.com/goplus/llgo/c/cjson)
|
||||||
* [c/clang](https://pkg.go.dev/github.com/goplus/llgo/c/clang)
|
* [c/clang](https://pkg.go.dev/github.com/goplus/llgo/c/clang)
|
||||||
|
* [c/ffi](https://pkg.go.dev/github.com/goplus/llgo/c/ffi)
|
||||||
|
* [c/libuv](https://pkg.go.dev/github.com/goplus/llgo/c/libuv)
|
||||||
* [c/llama2](https://pkg.go.dev/github.com/goplus/llgo/c/llama2)
|
* [c/llama2](https://pkg.go.dev/github.com/goplus/llgo/c/llama2)
|
||||||
|
* [c/lua](https://pkg.go.dev/github.com/goplus/llgo/c/lua)
|
||||||
|
* [c/neco](https://pkg.go.dev/github.com/goplus/llgo/c/neco)
|
||||||
|
* [c/openssl](https://pkg.go.dev/github.com/goplus/llgo/c/openssl)
|
||||||
* [c/raylib](https://pkg.go.dev/github.com/goplus/llgo/c/raylib)
|
* [c/raylib](https://pkg.go.dev/github.com/goplus/llgo/c/raylib)
|
||||||
* [c/sqlite](https://pkg.go.dev/github.com/goplus/llgo/c/sqlite)
|
* [c/sqlite](https://pkg.go.dev/github.com/goplus/llgo/c/sqlite)
|
||||||
* [c/zlib](https://pkg.go.dev/github.com/goplus/llgo/c/zlib)
|
* [c/zlib](https://pkg.go.dev/github.com/goplus/llgo/c/zlib)
|
||||||
|
* [cpp/inih](https://pkg.go.dev/github.com/goplus/llgo/cpp/inih)
|
||||||
|
* [cpp/llvm](https://pkg.go.dev/github.com/goplus/llgo/cpp/llvm)
|
||||||
|
|
||||||
Here are some examples related to them:
|
Here are some examples related to them:
|
||||||
|
|
||||||
@@ -186,7 +250,7 @@ Here are some examples related to them:
|
|||||||
|
|
||||||
## Go syntax support
|
## Go syntax support
|
||||||
|
|
||||||
All Go syntax is already supported. Here are some examples:
|
All Go syntax (including `cgo`) is already supported. Here are some examples:
|
||||||
|
|
||||||
* [concat](_demo/concat/concat.go): define a variadic function
|
* [concat](_demo/concat/concat.go): define a variadic function
|
||||||
* [genints](_demo/genints/genints.go): various forms of closure usage (including C function, recv.method and anonymous function)
|
* [genints](_demo/genints/genints.go): various forms of closure usage (including C function, recv.method and anonymous function)
|
||||||
@@ -195,7 +259,7 @@ All Go syntax is already supported. Here are some examples:
|
|||||||
* [goroutine](_demo/goroutine/goroutine.go): goroutine demo
|
* [goroutine](_demo/goroutine/goroutine.go): goroutine demo
|
||||||
|
|
||||||
|
|
||||||
## Defer
|
### Defer
|
||||||
|
|
||||||
LLGo `defer` does not support usage in loops. This is not a bug but a feature, because we think that using `defer` in a loop is a very unrecommended practice.
|
LLGo `defer` does not support usage in loops. This is not a bug but a feature, because we think that using `defer` in a loop is a very unrecommended practice.
|
||||||
|
|
||||||
@@ -220,33 +284,70 @@ Here are the Go packages that can be imported correctly:
|
|||||||
* [unicode/utf8](https://pkg.go.dev/unicode/utf8)
|
* [unicode/utf8](https://pkg.go.dev/unicode/utf8)
|
||||||
* [unicode/utf16](https://pkg.go.dev/unicode/utf16)
|
* [unicode/utf16](https://pkg.go.dev/unicode/utf16)
|
||||||
* [math](https://pkg.go.dev/math)
|
* [math](https://pkg.go.dev/math)
|
||||||
|
* [math/big](https://pkg.go.dev/math/big) (partially)
|
||||||
* [math/bits](https://pkg.go.dev/math/bits)
|
* [math/bits](https://pkg.go.dev/math/bits)
|
||||||
* [math/cmplx](https://pkg.go.dev/math/cmplx)
|
* [math/cmplx](https://pkg.go.dev/math/cmplx)
|
||||||
|
* [math/rand](https://pkg.go.dev/math/rand)
|
||||||
|
* [net/url](https://pkg.go.dev/net/url)
|
||||||
|
* [errors](https://pkg.go.dev/errors)
|
||||||
|
* [context](https://pkg.go.dev/context)
|
||||||
|
* [io](https://pkg.go.dev/io)
|
||||||
|
* [io/fs](https://pkg.go.dev/io/fs)
|
||||||
|
* [io/ioutil](https://pkg.go.dev/io/ioutil)
|
||||||
|
* [log](https://pkg.go.dev/log)
|
||||||
|
* [flag](https://pkg.go.dev/flag)
|
||||||
* [sort](https://pkg.go.dev/sort)
|
* [sort](https://pkg.go.dev/sort)
|
||||||
|
* [bytes](https://pkg.go.dev/bytes)
|
||||||
|
* [bufio](https://pkg.go.dev/bufio)
|
||||||
|
* [strings](https://pkg.go.dev/strings)
|
||||||
* [strconv](https://pkg.go.dev/strconv)
|
* [strconv](https://pkg.go.dev/strconv)
|
||||||
|
* [path](https://pkg.go.dev/path)
|
||||||
|
* [path/filepath](https://pkg.go.dev/path/filepath)
|
||||||
* [sync/atomic](https://pkg.go.dev/sync/atomic)
|
* [sync/atomic](https://pkg.go.dev/sync/atomic)
|
||||||
* [sync](https://pkg.go.dev/sync) (partially)
|
* [sync](https://pkg.go.dev/sync) (partially)
|
||||||
* [syscall](https://pkg.go.dev/syscall) (partially)
|
* [syscall](https://pkg.go.dev/syscall) (partially)
|
||||||
* [errors](https://pkg.go.dev/errors) (partially)
|
* [runtime](https://pkg.go.dev/runtime) (partially)
|
||||||
* [io](https://pkg.go.dev/io) (partially)
|
|
||||||
* [io/fs](https://pkg.go.dev/io/fs) (partially)
|
|
||||||
* [os](https://pkg.go.dev/os) (partially)
|
* [os](https://pkg.go.dev/os) (partially)
|
||||||
|
* [os/exec](https://pkg.go.dev/os/exec) (partially)
|
||||||
* [fmt](https://pkg.go.dev/fmt) (partially)
|
* [fmt](https://pkg.go.dev/fmt) (partially)
|
||||||
* [reflect](https://pkg.go.dev/reflect) (partially)
|
* [reflect](https://pkg.go.dev/reflect) (partially)
|
||||||
* [time](https://pkg.go.dev/time) (partially)
|
* [time](https://pkg.go.dev/time) (partially)
|
||||||
|
* [encoding](https://pkg.go.dev/encoding)
|
||||||
|
* [encoding/binary](https://pkg.go.dev/encoding/binary)
|
||||||
|
* [encoding/hex](https://pkg.go.dev/encoding/hex)
|
||||||
|
* [encoding/base32](https://pkg.go.dev/encoding/base32)
|
||||||
|
* [encoding/base64](https://pkg.go.dev/encoding/base64)
|
||||||
|
* [encoding/csv](https://pkg.go.dev/encoding/csv)
|
||||||
|
* [net/textproto](https://pkg.go.dev/net/textproto)
|
||||||
|
* [hash](https://pkg.go.dev/hash)
|
||||||
|
* [hash/adler32](https://pkg.go.dev/hash/adler32)
|
||||||
|
* [hash/crc32](https://pkg.go.dev/hash/crc32) (partially)
|
||||||
|
* [hash/crc64](https://pkg.go.dev/hash/crc64)
|
||||||
|
* [crypto](https://pkg.go.dev/crypto)
|
||||||
|
* [crypto/md5](https://pkg.go.dev/crypto/md5)
|
||||||
|
* [crypto/sha1](https://pkg.go.dev/crypto/sha1)
|
||||||
|
* [crypto/sha256](https://pkg.go.dev/crypto/sha256)
|
||||||
|
* [crypto/sha512](https://pkg.go.dev/crypto/sha512) (partially)
|
||||||
|
* [crypto/hmac](https://pkg.go.dev/crypto/hmac) (partially)
|
||||||
|
* [crypto/rand](https://pkg.go.dev/crypto/rand) (partially)
|
||||||
|
* [crypto/subtle](https://pkg.go.dev/crypto/subtle) (partially)
|
||||||
|
* [regexp](https://pkg.go.dev/regexp)
|
||||||
|
* [regexp/syntax](https://pkg.go.dev/regexp/syntax)
|
||||||
|
* [go/token](https://pkg.go.dev/go/token)
|
||||||
|
* [go/scanner](https://pkg.go.dev/go/scanner)
|
||||||
|
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
- [Go 1.20+](https://go.dev) (build only)
|
- [Go 1.20+](https://go.dev)
|
||||||
- [LLVM 18](https://llvm.org)
|
- [LLVM 18](https://llvm.org)
|
||||||
- [LLD 18](https://lld.llvm.org)
|
|
||||||
- [Clang 18](https://clang.llvm.org)
|
- [Clang 18](https://clang.llvm.org)
|
||||||
|
- [LLD 18](https://lld.llvm.org)
|
||||||
- [pkg-config 0.29+](https://www.freedesktop.org/wiki/Software/pkg-config/)
|
- [pkg-config 0.29+](https://www.freedesktop.org/wiki/Software/pkg-config/)
|
||||||
- [bdwgc/libgc 8.0+](https://www.hboehm.info/gc/)
|
- [bdwgc/libgc 8.0+](https://www.hboehm.info/gc/)
|
||||||
- [cJSON 1.7+](https://github.com/DaveGamble/cJSON) (optional, for [github.com/goplus/llgo/c/cjson](https://pkg.go.dev/github.com/goplus/llgo/c/cjson))
|
- [OpenSSL 3.0+](https://www.openssl.org/)
|
||||||
- [SQLite 3](https://www.sqlite.org) (optional, for [github.com/goplus/llgo/c/sqlite](https://pkg.go.dev/github.com/goplus/llgo/c/sqlite))
|
- [zlib 1.2+](https://www.zlib.net)
|
||||||
- [Python 3.11+](https://www.python.org) (optional, for [github.com/goplus/llgo/py](https://pkg.go.dev/github.com/goplus/llgo/py))
|
- [Python 3.12+](https://www.python.org) (optional, for [github.com/goplus/llgo/py](https://pkg.go.dev/github.com/goplus/llgo/py))
|
||||||
|
|
||||||
## How to install
|
## How to install
|
||||||
|
|
||||||
@@ -254,30 +355,43 @@ Follow these steps to generate the `llgo` command (its usage is the same as the
|
|||||||
|
|
||||||
### on macOS
|
### on macOS
|
||||||
|
|
||||||
|
<!-- embedme doc/_readme/scripts/install_macos.sh#L2-L1000 -->
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
brew update # execute if needed
|
brew update
|
||||||
brew install llvm@18 pkg-config libgc
|
brew install llvm@18 bdw-gc openssl cjson libffi pkg-config
|
||||||
brew install cjson sqlite python@3.12 # optional
|
brew install python@3.12 # optional
|
||||||
export PATH=$(brew --prefix llvm@18)/bin:$PATH # you may want to add this to your shell RC file, e.g. ~/.zshrc
|
brew link --force libffi
|
||||||
git clone https://github.com/goplus/llgo.git
|
go install -v github.com/goplus/llgo/cmd/llgo@latest
|
||||||
cd llgo
|
|
||||||
export LLGOROOT="/path/to/llgo" # Replace this with the root directory of the llgo project
|
|
||||||
go install -v ./...
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### on Linux (Debian/Ubuntu)
|
### on Linux
|
||||||
|
|
||||||
|
#### Debian/Ubuntu
|
||||||
|
|
||||||
|
<!-- embedme doc/_readme/scripts/install_ubuntu.sh#L2-L1000 -->
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-18 main" | sudo tee /etc/apt/sources.list.d/llvm.list
|
echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-18 main" | sudo tee /etc/apt/sources.list.d/llvm.list
|
||||||
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
|
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
|
||||||
sudo apt-get update # execute if needed
|
sudo apt-get update
|
||||||
sudo apt-get install -y llvm-18-dev clang-18 lld-18 pkg-config libgc-dev
|
sudo apt-get install -y llvm-18-dev clang-18 libclang-18-dev lld-18 pkg-config libgc-dev libssl-dev zlib1g-dev libcjson-dev libsqlite3-dev libunwind-dev
|
||||||
sudo apt-get install -y libcjson-dev libsqlite3-dev python3.12-dev # optional
|
sudo apt-get install -y python3.12-dev # optional
|
||||||
export PATH=/usr/lib/llvm-18/bin:$PATH # you may want to add this to your shell RC file, e.g. ~/.bashrc
|
go install -v github.com/goplus/llgo/cmd/llgo@latest
|
||||||
git clone https://github.com/goplus/llgo.git
|
```
|
||||||
cd llgo
|
|
||||||
export LLGOROOT="/path/to/llgo" # Replace this with the root directory of the llgo project
|
#### Alpine Linux
|
||||||
go install -v ./...
|
|
||||||
|
```sh
|
||||||
|
apk add go llvm18-dev clang18-dev lld18 pkgconf gc-dev openssl-dev zlib-dev
|
||||||
|
apk add python3-dev # optional
|
||||||
|
apk add g++ # build only
|
||||||
|
export LLVM_CONFIG=/usr/lib/llvm18/bin/llvm-config
|
||||||
|
export CGO_CPPFLAGS="$($LLVM_CONFIG --cppflags)"
|
||||||
|
export CGO_CXXFLAGS=-std=c++17
|
||||||
|
export CGO_LDFLAGS="$($LLVM_CONFIG --ldflags) $($LLVM_CONFIG --libs all)"
|
||||||
|
go install -v -tags=byollvm -ldflags="-X github.com/goplus/llgo/xtool/env/llvm.ldLLVMConfigBin=$LLVM_CONFIG" github.com/goplus/llgo/cmd/llgo@latest
|
||||||
```
|
```
|
||||||
|
|
||||||
### on Windows
|
### on Windows
|
||||||
@@ -295,10 +409,15 @@ TODO
|
|||||||
|
|
||||||
How do I generate these tools?
|
How do I generate these tools?
|
||||||
|
|
||||||
|
<!-- embedme doc/_readme/scripts/install_llgo.sh#L2-L1000 -->
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
export CC=clang CXX=clang++ # only for go build; optional if you have other compatible compilers
|
git clone https://github.com/goplus/llgo.git
|
||||||
go install -v ./... # compile all tools except pydump
|
cd llgo/compiler
|
||||||
cd chore/_xtool
|
go install -v ./cmd/...
|
||||||
|
go install -v ./chore/... # compile all tools except pydump
|
||||||
|
export LLGO_ROOT=$PWD/..
|
||||||
|
cd ../_xtool
|
||||||
llgo install ./... # compile pydump
|
llgo install ./... # compile pydump
|
||||||
go install github.com/goplus/hdq/chore/pysigfetch@v0.8.1 # compile pysigfetch
|
go install github.com/goplus/hdq/chore/pysigfetch@v0.8.1 # compile pysigfetch
|
||||||
```
|
```
|
||||||
|
|||||||
47
_cmptest/_bigsqrt2/sqrt2.go
Normal file
47
_cmptest/_bigsqrt2/sqrt2.go
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
"math/big"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// We'll do computations with 200 bits of precision in the mantissa.
|
||||||
|
const prec = 200
|
||||||
|
|
||||||
|
// Compute the square root of 2 using Newton's Method. We start with
|
||||||
|
// an initial estimate for sqrt(2), and then iterate:
|
||||||
|
// x_{n+1} = 1/2 * ( x_n + (2.0 / x_n) )
|
||||||
|
|
||||||
|
// Since Newton's Method doubles the number of correct digits at each
|
||||||
|
// iteration, we need at least log_2(prec) steps.
|
||||||
|
steps := int(math.Log2(prec))
|
||||||
|
|
||||||
|
// Initialize values we need for the computation.
|
||||||
|
two := new(big.Float).SetPrec(prec).SetInt64(2)
|
||||||
|
half := new(big.Float).SetPrec(prec).SetFloat64(0.5)
|
||||||
|
|
||||||
|
// Use 1 as the initial estimate.
|
||||||
|
x := new(big.Float).SetPrec(prec).SetInt64(1)
|
||||||
|
|
||||||
|
// We use t as a temporary variable. There's no need to set its precision
|
||||||
|
// since big.Float values with unset (== 0) precision automatically assume
|
||||||
|
// the largest precision of the arguments when used as the result (receiver)
|
||||||
|
// of a big.Float operation.
|
||||||
|
t := new(big.Float)
|
||||||
|
|
||||||
|
// Iterate.
|
||||||
|
for i := 0; i <= steps; i++ {
|
||||||
|
t.Quo(two, x) // t = 2.0 / x_n
|
||||||
|
t.Add(x, t) // t = x_n + (2.0 / x_n)
|
||||||
|
x.Mul(half, t) // x_{n+1} = 0.5 * t
|
||||||
|
}
|
||||||
|
|
||||||
|
// We can use the usual fmt.Printf verbs since big.Float implements fmt.Formatter
|
||||||
|
fmt.Printf("sqrt(2) = %.50f\n", x)
|
||||||
|
|
||||||
|
// Print the error between 2 and x*x.
|
||||||
|
t.Mul(x, x) // t = x*x
|
||||||
|
fmt.Printf("error = %e\n", t.Sub(two, t))
|
||||||
|
}
|
||||||
34
_cmptest/_goparsedemo/parse.go
Normal file
34
_cmptest/_goparsedemo/parse.go
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"go/parser"
|
||||||
|
"go/token"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fset := token.NewFileSet() // positions are relative to fset
|
||||||
|
|
||||||
|
src := `package foo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func bar() {
|
||||||
|
fmt.Println(time.Now())
|
||||||
|
}`
|
||||||
|
|
||||||
|
// Parse src but stop after processing the imports.
|
||||||
|
f, err := parser.ParseFile(fset, "", src, parser.ImportsOnly)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print the imports from the file's AST.
|
||||||
|
for _, s := range f.Imports {
|
||||||
|
fmt.Println(s.Path.Value)
|
||||||
|
}
|
||||||
|
}
|
||||||
16
_cmptest/_jsondemo/json.go
Normal file
16
_cmptest/_jsondemo/json.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
s := `{"name":"math","items":[{"name":"sqrt","sig":"(x, /)"},{"name":"pi"}]}`
|
||||||
|
data := unsafe.Slice(unsafe.StringData(s), len(s))
|
||||||
|
var v any
|
||||||
|
json.Unmarshal(data, &v)
|
||||||
|
b, _ := json.MarshalIndent(v, "", " ")
|
||||||
|
fmt.Println(string(b))
|
||||||
|
}
|
||||||
19
_cmptest/_timeout/timer.go
Normal file
19
_cmptest/_timeout/timer.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
var c chan int
|
||||||
|
|
||||||
|
func handle(int) {}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
select {
|
||||||
|
case m := <-c:
|
||||||
|
handle(m)
|
||||||
|
case <-time.After(time.Second / 10):
|
||||||
|
fmt.Println("timed out")
|
||||||
|
}
|
||||||
|
}
|
||||||
48
_cmptest/base64demo/base64.go
Normal file
48
_cmptest/base64demo/base64.go
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/base32"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/hex"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
func base64Demo() {
|
||||||
|
msg := "Hello, 世界"
|
||||||
|
encoded := base64.StdEncoding.EncodeToString([]byte(msg))
|
||||||
|
fmt.Println(encoded)
|
||||||
|
decoded, err := base64.StdEncoding.DecodeString(encoded)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("decode error:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println(string(decoded))
|
||||||
|
}
|
||||||
|
|
||||||
|
func base32Demo() {
|
||||||
|
str := "JBSWY3DPFQQHO33SNRSCC==="
|
||||||
|
dst := make([]byte, base32.StdEncoding.DecodedLen(len(str)))
|
||||||
|
n, err := base32.StdEncoding.Decode(dst, []byte(str))
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("decode error:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
dst = dst[:n]
|
||||||
|
fmt.Printf("%q\n", dst)
|
||||||
|
}
|
||||||
|
|
||||||
|
func hexDemo() {
|
||||||
|
const s = "48656c6c6f20476f7068657221"
|
||||||
|
decoded, err := hex.DecodeString(s)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
fmt.Printf("%s\n", decoded)
|
||||||
|
|
||||||
|
}
|
||||||
|
func main() {
|
||||||
|
base64Demo()
|
||||||
|
base32Demo()
|
||||||
|
hexDemo()
|
||||||
|
}
|
||||||
63
_cmptest/bigintdemo/fib.go
Normal file
63
_cmptest/bigintdemo/fib.go
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math/big"
|
||||||
|
)
|
||||||
|
|
||||||
|
func fib() {
|
||||||
|
// Initialize two big ints with the first two numbers in the sequence.
|
||||||
|
a := big.NewInt(0)
|
||||||
|
b := big.NewInt(1)
|
||||||
|
|
||||||
|
// Initialize limit as 10^99, the smallest integer with 100 digits.
|
||||||
|
var limit big.Int
|
||||||
|
limit.Exp(big.NewInt(10), big.NewInt(99), nil)
|
||||||
|
|
||||||
|
// Loop while a is smaller than 1e100.
|
||||||
|
for a.Cmp(&limit) < 0 {
|
||||||
|
// Compute the next Fibonacci number, storing it in a.
|
||||||
|
a.Add(a, b)
|
||||||
|
// Swap a and b so that b is the next number in the sequence.
|
||||||
|
a, b = b, a
|
||||||
|
}
|
||||||
|
fmt.Println(a) // 100-digit Fibonacci number
|
||||||
|
}
|
||||||
|
|
||||||
|
func abs() {
|
||||||
|
a := big.NewInt(64)
|
||||||
|
b := big.NewInt(-52)
|
||||||
|
a.Set(b)
|
||||||
|
a.Abs(a)
|
||||||
|
a.Set(big.NewInt(-164))
|
||||||
|
a.Abs(a)
|
||||||
|
fmt.Println("value: ", a.String())
|
||||||
|
}
|
||||||
|
|
||||||
|
func neg() {
|
||||||
|
fmt.Println("value: ", big.NewInt(-64).Neg(big.NewInt(-64)))
|
||||||
|
fmt.Println("value: ", big.NewInt(64).Neg(big.NewInt(64)))
|
||||||
|
fmt.Println("value: ", big.NewInt(0).Neg(big.NewInt(0)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func calc() {
|
||||||
|
a := big.NewInt(64)
|
||||||
|
b := big.NewInt(-52)
|
||||||
|
c := big.NewInt(54)
|
||||||
|
fmt.Println("value:", a.Add(a, b))
|
||||||
|
fmt.Println("value:", a.Sub(b, c))
|
||||||
|
d := big.NewInt(10)
|
||||||
|
e := big.NewInt(4)
|
||||||
|
fmt.Println("value:", d.Mul(d, e))
|
||||||
|
}
|
||||||
|
|
||||||
|
func bitop() {
|
||||||
|
a := big.NewInt(4)
|
||||||
|
fmt.Println("value:", a.Lsh(a, 1))
|
||||||
|
b := big.NewInt(16)
|
||||||
|
fmt.Println("value:", b.Rsh(b, 2))
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
bitop()
|
||||||
|
}
|
||||||
28
_cmptest/crcdemo/crc.go
Normal file
28
_cmptest/crcdemo/crc.go
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"hash/adler32"
|
||||||
|
"hash/crc32"
|
||||||
|
"hash/crc64"
|
||||||
|
)
|
||||||
|
|
||||||
|
func crc64Demo() {
|
||||||
|
crc := crc64.MakeTable(crc64.ECMA)
|
||||||
|
fmt.Printf("%016x\n", crc64.Checksum([]byte("Hello world"), crc))
|
||||||
|
}
|
||||||
|
|
||||||
|
func crc32Demo() {
|
||||||
|
crc32q := crc32.MakeTable(crc32.IEEE)
|
||||||
|
fmt.Printf("%08x\n", crc32.Checksum([]byte("Hello world"), crc32q))
|
||||||
|
}
|
||||||
|
|
||||||
|
func adler32Demo() {
|
||||||
|
fmt.Printf("%08x\n", adler32.Checksum([]byte("Hello world")))
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
adler32Demo()
|
||||||
|
crc32Demo()
|
||||||
|
crc64Demo()
|
||||||
|
}
|
||||||
30
_cmptest/csvdemo/csv.go
Normal file
30
_cmptest/csvdemo/csv.go
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/csv"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"log"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
in := `first_name,last_name,username
|
||||||
|
"Rob","Pike",rob
|
||||||
|
Ken,Thompson,ken
|
||||||
|
"Robert","Griesemer","gri"
|
||||||
|
`
|
||||||
|
r := csv.NewReader(strings.NewReader(in))
|
||||||
|
|
||||||
|
for {
|
||||||
|
record, err := r.Read()
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(record)
|
||||||
|
}
|
||||||
|
}
|
||||||
39
_cmptest/ctxcancel/ctx.go
Normal file
39
_cmptest/ctxcancel/ctx.go
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// gen generates integers in a separate goroutine and
|
||||||
|
// sends them to the returned channel.
|
||||||
|
// The callers of gen need to cancel the context once
|
||||||
|
// they are done consuming generated integers not to leak
|
||||||
|
// the internal goroutine started by gen.
|
||||||
|
gen := func(ctx context.Context) <-chan int {
|
||||||
|
dst := make(chan int)
|
||||||
|
n := 1
|
||||||
|
go func() {
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
return // returning not to leak the goroutine
|
||||||
|
case dst <- n:
|
||||||
|
n++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
return dst
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
defer cancel() // cancel when we are finished consuming integers
|
||||||
|
|
||||||
|
for n := range gen(ctx) {
|
||||||
|
fmt.Println(n)
|
||||||
|
if n == 5 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
20
_cmptest/envexpand/expand.go
Normal file
20
_cmptest/envexpand/expand.go
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
mapper := func(placeholderName string) string {
|
||||||
|
switch placeholderName {
|
||||||
|
case "DAY_PART":
|
||||||
|
return "morning"
|
||||||
|
case "NAME":
|
||||||
|
return "Gopher"
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println(os.Expand("Good ${DAY_PART}, $NAME!", mapper))
|
||||||
|
}
|
||||||
21
_cmptest/flagdemo/flagdemo.go
Normal file
21
_cmptest/flagdemo/flagdemo.go
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"flag"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println("args:", os.Args[1:])
|
||||||
|
if len(os.Args) == 1 {
|
||||||
|
os.Args = []string{"flagdemo", "-cpu", "100"}
|
||||||
|
}
|
||||||
|
|
||||||
|
verbose := flag.Bool("v", false, "verbose")
|
||||||
|
cpu := flag.Int("cpu", 1, "cpu number")
|
||||||
|
host := flag.String("host", ":8888", "host")
|
||||||
|
flag.Parse()
|
||||||
|
|
||||||
|
fmt.Println("host:", *host, "cpu:", *cpu, "verbose:", *verbose)
|
||||||
|
}
|
||||||
27
_cmptest/goscandemo/scan.go
Normal file
27
_cmptest/goscandemo/scan.go
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"go/scanner"
|
||||||
|
"go/token"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// src is the input that we want to tokenize.
|
||||||
|
src := []byte("cos(x) + 1i*sin(x) // Euler")
|
||||||
|
|
||||||
|
// Initialize the scanner.
|
||||||
|
var s scanner.Scanner
|
||||||
|
fset := token.NewFileSet() // positions are relative to fset
|
||||||
|
file := fset.AddFile("", fset.Base(), len(src)) // register input "file"
|
||||||
|
s.Init(file, src, nil /* no error handler */, scanner.ScanComments)
|
||||||
|
|
||||||
|
// Repeated calls to Scan yield the token sequence found in the input.
|
||||||
|
for {
|
||||||
|
pos, tok, lit := s.Scan()
|
||||||
|
if tok == token.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
fmt.Printf("%s\t%s\t%q\n", fset.Position(pos), tok, lit)
|
||||||
|
}
|
||||||
|
}
|
||||||
15
_cmptest/hmacdemo/hmac.go
Normal file
15
_cmptest/hmacdemo/hmac.go
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/hmac"
|
||||||
|
"crypto/sha1"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
h := hmac.New(sha1.New, []byte("<key>"))
|
||||||
|
io.WriteString(h, "The fog is getting thicker!")
|
||||||
|
io.WriteString(h, "And Leon's getting laaarger!")
|
||||||
|
fmt.Printf("%x", h.Sum(nil))
|
||||||
|
}
|
||||||
19
_cmptest/ioutildemo/ioutil.go
Normal file
19
_cmptest/ioutildemo/ioutil.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
r := strings.NewReader("Go is a general-purpose language designed with systems programming in mind.")
|
||||||
|
|
||||||
|
b, err := ioutil.ReadAll(r)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("%s\n", b)
|
||||||
|
}
|
||||||
20
_cmptest/md5demo/md5.go
Normal file
20
_cmptest/md5demo/md5.go
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto"
|
||||||
|
"crypto/md5"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
h := md5.New()
|
||||||
|
io.WriteString(h, "The fog is getting thicker!")
|
||||||
|
io.WriteString(h, "And Leon's getting laaarger!")
|
||||||
|
fmt.Printf("%x\n", h.Sum(nil))
|
||||||
|
|
||||||
|
h = crypto.MD5.New()
|
||||||
|
io.WriteString(h, "The fog is getting thicker!")
|
||||||
|
io.WriteString(h, "And Leon's getting laaarger!")
|
||||||
|
fmt.Printf("%x\n", h.Sum(nil))
|
||||||
|
}
|
||||||
24
_cmptest/osexec/exec.go
Normal file
24
_cmptest/osexec/exec.go
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"runtime"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/xtool/env/llvm"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ls := "ls"
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
ls = "dir"
|
||||||
|
}
|
||||||
|
cmd := exec.Command(ls)
|
||||||
|
cmd.Stdout = os.Stdout
|
||||||
|
cmd.Stderr = os.Stderr
|
||||||
|
cmd.Run()
|
||||||
|
|
||||||
|
dir := llvm.New("").BinDir()
|
||||||
|
fmt.Println(dir)
|
||||||
|
}
|
||||||
30
_cmptest/osproc/exec.go
Normal file
30
_cmptest/osproc/exec.go
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ls := "ls"
|
||||||
|
args := []string{ls, "-l"}
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
ls = "dir"
|
||||||
|
args = []string{ls}
|
||||||
|
}
|
||||||
|
lspath, _ := exec.LookPath(ls)
|
||||||
|
if lspath != "" {
|
||||||
|
ls = lspath
|
||||||
|
}
|
||||||
|
proc, err := os.StartProcess(ls, args, &os.ProcAttr{
|
||||||
|
Files: []*os.File{nil, os.Stdout, os.Stderr},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("os.StartProcess error:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
proc.Wait()
|
||||||
|
fmt.Println("proc.Wait done")
|
||||||
|
}
|
||||||
26
_cmptest/pipedemo/pipe.go
Normal file
26
_cmptest/pipedemo/pipe.go
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
data := []byte("This is some data that needs to be stored in Body.")
|
||||||
|
pr, pw := io.Pipe()
|
||||||
|
go func() {
|
||||||
|
defer pw.Close()
|
||||||
|
if _, err := pw.Write(data); err != nil {
|
||||||
|
fmt.Println("Error writing to pipe:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
defer pr.Close()
|
||||||
|
|
||||||
|
readData, err := io.ReadAll(pr)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error reading from Body:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println("Body:", string(readData))
|
||||||
|
}
|
||||||
12
_cmptest/printfdemo/demo.go
Normal file
12
_cmptest/printfdemo/demo.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/xtool/nm"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
sym := nm.Symbol{Name: "abc", Type: nm.Text}
|
||||||
|
fmt.Printf("%016x %c %s\n", sym.Addr, sym.Type, sym.Name)
|
||||||
|
}
|
||||||
25
_cmptest/readfiledemo/readf.go
Normal file
25
_cmptest/readfiledemo/readf.go
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fileName := "err.log"
|
||||||
|
os.WriteFile(fileName, []byte("123"), 0644)
|
||||||
|
|
||||||
|
_, err := os.Stat(fileName)
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
fmt.Fprintf(os.Stderr, "File %s not found\n", fileName)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
data, err := os.ReadFile(fileName)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintf(os.Stderr, "ReadFile: %v\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("%s\n", data)
|
||||||
|
}
|
||||||
11
_cmptest/regexdemo/regex.go
Normal file
11
_cmptest/regexdemo/regex.go
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/xtool/env"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(env.ExpandEnv("$(pkg-config --libs bdw-gc)"))
|
||||||
|
}
|
||||||
14
_cmptest/sha1demo/sha1.go
Normal file
14
_cmptest/sha1demo/sha1.go
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/sha1"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
h := sha1.New()
|
||||||
|
io.WriteString(h, "The fog is getting thicker!")
|
||||||
|
io.WriteString(h, "And Leon's getting laaarger!")
|
||||||
|
fmt.Printf("%x", h.Sum(nil))
|
||||||
|
}
|
||||||
14
_cmptest/sha256demo/sha256.go
Normal file
14
_cmptest/sha256demo/sha256.go
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/sha256"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
h := sha256.New()
|
||||||
|
io.WriteString(h, "The fog is getting thicker!")
|
||||||
|
io.WriteString(h, "And Leon's getting laaarger!")
|
||||||
|
fmt.Printf("%x", h.Sum(nil))
|
||||||
|
}
|
||||||
14
_cmptest/sha512demo/sha512.go
Normal file
14
_cmptest/sha512demo/sha512.go
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/sha512"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
h := sha512.New()
|
||||||
|
io.WriteString(h, "The fog is getting thicker!")
|
||||||
|
io.WriteString(h, "And Leon's getting laaarger!")
|
||||||
|
fmt.Printf("%x", h.Sum(nil))
|
||||||
|
}
|
||||||
@@ -1,7 +1,12 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import "strconv"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
println(strconv.Itoa(-123))
|
fmt.Println(strconv.Itoa(-123))
|
||||||
|
fmt.Println(strings.Split("abc,def,123", ","))
|
||||||
}
|
}
|
||||||
|
|||||||
20
_cmptest/urldemo/url.go
Normal file
20
_cmptest/urldemo/url.go
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"net/url"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
u, err := url.Parse("http://foo.example.com/foo?bar=1")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
u.Scheme = "https"
|
||||||
|
u.Host = "bar.example.com"
|
||||||
|
q := u.Query()
|
||||||
|
q.Set("bar", "2")
|
||||||
|
u.RawQuery = q.Encode()
|
||||||
|
fmt.Println(u)
|
||||||
|
}
|
||||||
31
_demo/async/async/async.go
Normal file
31
_demo/async/async/async.go
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package async
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Void = [0]byte
|
||||||
|
|
||||||
|
type Future[T any] interface {
|
||||||
|
Then(cb func(T))
|
||||||
|
}
|
||||||
|
|
||||||
|
type future[T any] struct {
|
||||||
|
cb func(func(T))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *future[T]) Then(cb func(T)) {
|
||||||
|
f.cb(cb)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Async[T any](fn func(func(T))) Future[T] {
|
||||||
|
return &future[T]{fn}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Run[T any](future Future[T]) T {
|
||||||
|
var ret T
|
||||||
|
future.Then(func(v T) {
|
||||||
|
ret = v
|
||||||
|
})
|
||||||
|
return ret
|
||||||
|
}
|
||||||
23
_demo/async/main.go
Normal file
23
_demo/async/main.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/_demo/async/async"
|
||||||
|
"github.com/goplus/llgo/_demo/async/timeout"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Sleep(i int, d time.Duration) async.Future[int] {
|
||||||
|
return async.Async(func(resolve func(int)) {
|
||||||
|
timeout.Timeout(d).Then(func(async.Void) {
|
||||||
|
resolve(i)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
async.Run(async.Async(func(resolve func(async.Void)) {
|
||||||
|
println("read file")
|
||||||
|
defer resolve(async.Void{})
|
||||||
|
}))
|
||||||
|
}
|
||||||
16
_demo/async/timeout/timeout.go
Normal file
16
_demo/async/timeout/timeout.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package timeout
|
||||||
|
|
||||||
|
import (
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/_demo/async/async"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Timeout(d time.Duration) async.Future[async.Void] {
|
||||||
|
return async.Async(func(resolve func(async.Void)) {
|
||||||
|
go func() {
|
||||||
|
time.Sleep(d)
|
||||||
|
resolve(async.Void{})
|
||||||
|
}()
|
||||||
|
})
|
||||||
|
}
|
||||||
11
_demo/cexec/exec.go
Normal file
11
_demo/cexec/exec.go
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/goplus/llgo/c"
|
||||||
|
"github.com/goplus/llgo/c/os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ls := c.Str("ls")
|
||||||
|
os.Execlp(ls, ls, c.Str("-l"), nil)
|
||||||
|
}
|
||||||
16
_demo/cgofull/bar.go
Normal file
16
_demo/cgofull/bar.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
/*
|
||||||
|
#cgo CFLAGS: -DBAR
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "foo.h"
|
||||||
|
static void foo(Foo* f) {
|
||||||
|
printf("foo in bar: %d\n", f->a);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
func Bar(f *C.Foo) {
|
||||||
|
C.print_foo(f)
|
||||||
|
C.foo(f)
|
||||||
|
}
|
||||||
157
_demo/cgofull/cgofull.go
Normal file
157
_demo/cgofull/cgofull.go
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
/*
|
||||||
|
#cgo windows,!amd64 CFLAGS: -D_WIN32
|
||||||
|
#cgo !windows CFLAGS: -D_POSIX
|
||||||
|
#cgo windows,amd64 CFLAGS: -D_WIN64
|
||||||
|
#cgo linux,amd64 CFLAGS: -D_LINUX64
|
||||||
|
#cgo !windows,amd64 CFLAGS: -D_UNIX64
|
||||||
|
#cgo pkg-config: python3-embed
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <Python.h>
|
||||||
|
#include "foo.h"
|
||||||
|
typedef struct {
|
||||||
|
int a;
|
||||||
|
} s4;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
} s8;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
int c;
|
||||||
|
} s12;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
int c;
|
||||||
|
int d;
|
||||||
|
} s16;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int a;
|
||||||
|
int b;
|
||||||
|
int c;
|
||||||
|
int d;
|
||||||
|
int e;
|
||||||
|
} s20;
|
||||||
|
|
||||||
|
static int test_structs(s4* s4, s8* s8, s12* s12, s16* s16, s20* s20) {
|
||||||
|
printf("s4.a: %d\n", s4->a);
|
||||||
|
printf("s8.a: %d, s8.b: %d\n", s8->a, s8->b);
|
||||||
|
printf("s12.a: %d, s12.b: %d, s12.c: %d\n", s12->a, s12->b, s12->c);
|
||||||
|
printf("s16.a: %d, s16.b: %d, s16.c: %d, s16.d: %d\n", s16->a, s16->b, s16->c, s16->d);
|
||||||
|
printf("s20.a: %d, s20.b: %d, s20.c: %d, s20.d: %d, s20.e: %d\n", s20->a, s20->b, s20->c, s20->d, s20->e);
|
||||||
|
|
||||||
|
return s4->a + s8->a + s8->b + s12->a + s12->b + s12->c + s16->a + s16->b + s16->c + s16->d + s20->a + s20->b + s20->c + s20->d + s20->e;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_macros() {
|
||||||
|
#ifdef FOO
|
||||||
|
printf("FOO is defined\n");
|
||||||
|
#endif
|
||||||
|
#ifdef BAR
|
||||||
|
printf("BAR is defined\n");
|
||||||
|
#endif
|
||||||
|
#ifdef _WIN32
|
||||||
|
printf("WIN32 is defined\n");
|
||||||
|
#endif
|
||||||
|
#ifdef _POSIX
|
||||||
|
printf("POSIX is defined\n");
|
||||||
|
#endif
|
||||||
|
#ifdef _WIN64
|
||||||
|
printf("WIN64 is defined\n");
|
||||||
|
#endif
|
||||||
|
#ifdef _LINUX64
|
||||||
|
printf("LINUX64 is defined\n");
|
||||||
|
#endif
|
||||||
|
#ifdef _UNIX64
|
||||||
|
printf("UNIX64 is defined\n");
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MY_VERSION "1.0.0"
|
||||||
|
#define MY_CODE 0x12345678
|
||||||
|
|
||||||
|
static void test_void() {
|
||||||
|
printf("test_void\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef int (*Cb)(int);
|
||||||
|
|
||||||
|
extern int go_callback(int);
|
||||||
|
|
||||||
|
extern int c_callback(int i);
|
||||||
|
|
||||||
|
static void test_callback(Cb cb) {
|
||||||
|
printf("test_callback, cb: %p, go_callback: %p, c_callback: %p\n", cb, go_callback, c_callback);
|
||||||
|
printf("test_callback, *cb: %p, *go_callback: %p, *c_callback: %p\n", *(void**)cb, *(void**)(go_callback), *(void**)(c_callback));
|
||||||
|
printf("cb result: %d\n", cb(123));
|
||||||
|
printf("done\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
extern int go_callback_not_use_in_go(int);
|
||||||
|
|
||||||
|
static void run_callback() {
|
||||||
|
test_callback(c_callback);
|
||||||
|
test_callback(go_callback_not_use_in_go);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/_demo/cgofull/pymod1"
|
||||||
|
"github.com/goplus/llgo/_demo/cgofull/pymod2"
|
||||||
|
)
|
||||||
|
|
||||||
|
//export go_callback_not_use_in_go
|
||||||
|
func go_callback_not_use_in_go(i C.int) C.int {
|
||||||
|
return i + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
//export go_callback
|
||||||
|
func go_callback(i C.int) C.int {
|
||||||
|
return i + 1
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
runPy()
|
||||||
|
f := &C.Foo{a: 1}
|
||||||
|
Foo(f)
|
||||||
|
Bar(f)
|
||||||
|
C.test_macros()
|
||||||
|
r := C.test_structs(&C.s4{a: 1}, &C.s8{a: 1, b: 2}, &C.s12{a: 1, b: 2, c: 3}, &C.s16{a: 1, b: 2, c: 3, d: 4}, &C.s20{a: 1, b: 2, c: 3, d: 4, e: 5})
|
||||||
|
fmt.Println(r)
|
||||||
|
if r != 35 {
|
||||||
|
panic("test_structs failed")
|
||||||
|
}
|
||||||
|
fmt.Println(C.MY_VERSION)
|
||||||
|
fmt.Println(int(C.MY_CODE))
|
||||||
|
C.test_void()
|
||||||
|
|
||||||
|
println("call run_callback")
|
||||||
|
C.run_callback()
|
||||||
|
|
||||||
|
// test _Cgo_ptr and _cgoCheckResult
|
||||||
|
println("call with go_callback")
|
||||||
|
C.test_callback((C.Cb)(C.go_callback))
|
||||||
|
|
||||||
|
println("call with c_callback")
|
||||||
|
C.test_callback((C.Cb)(C.c_callback))
|
||||||
|
}
|
||||||
|
|
||||||
|
func runPy() {
|
||||||
|
Initialize()
|
||||||
|
defer Finalize()
|
||||||
|
Run("print('Hello, Python!')")
|
||||||
|
C.PyObject_Print((*C.PyObject)(unsafe.Pointer(pymod1.Float(1.23))), C.stderr, 0)
|
||||||
|
C.PyObject_Print((*C.PyObject)(unsafe.Pointer(pymod2.Long(123))), C.stdout, 0)
|
||||||
|
// test _Cgo_use
|
||||||
|
C.PyObject_Print((*C.PyObject)(unsafe.Pointer(C.PyComplex_FromDoubles(C.double(1.23), C.double(4.56)))), C.stdout, 0)
|
||||||
|
}
|
||||||
12
_demo/cgofull/foo.c
Normal file
12
_demo/cgofull/foo.c
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include "foo.h"
|
||||||
|
|
||||||
|
void print_foo(Foo *f)
|
||||||
|
{
|
||||||
|
printf("print_foo: %d\n", f->a);
|
||||||
|
}
|
||||||
|
|
||||||
|
int c_callback(int i)
|
||||||
|
{
|
||||||
|
return i + 1;
|
||||||
|
}
|
||||||
16
_demo/cgofull/foo.go
Normal file
16
_demo/cgofull/foo.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
/*
|
||||||
|
#cgo CFLAGS: -DFOO
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "foo.h"
|
||||||
|
static void foo(Foo* f) {
|
||||||
|
printf("foo in bar: %d\n", f->a);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
func Foo(f *C.Foo) {
|
||||||
|
C.print_foo(f)
|
||||||
|
C.foo(f)
|
||||||
|
}
|
||||||
7
_demo/cgofull/foo.h
Normal file
7
_demo/cgofull/foo.h
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int a;
|
||||||
|
} Foo;
|
||||||
|
|
||||||
|
extern void print_foo(Foo* f);
|
||||||
24
_demo/cgofull/py.go
Normal file
24
_demo/cgofull/py.go
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
/*
|
||||||
|
#cgo pkg-config: python3-embed
|
||||||
|
#include <Python.h>
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
import "fmt"
|
||||||
|
|
||||||
|
func Initialize() {
|
||||||
|
C.Py_Initialize()
|
||||||
|
}
|
||||||
|
|
||||||
|
func Finalize() {
|
||||||
|
C.Py_Finalize()
|
||||||
|
}
|
||||||
|
|
||||||
|
func Run(code string) error {
|
||||||
|
if C.PyRun_SimpleString(C.CString(code)) != 0 {
|
||||||
|
C.PyErr_Print()
|
||||||
|
return fmt.Errorf("failed to run code")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
11
_demo/cgofull/pymod1/pymod1.go
Normal file
11
_demo/cgofull/pymod1/pymod1.go
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package pymod1
|
||||||
|
|
||||||
|
/*
|
||||||
|
#cgo pkg-config: python3-embed
|
||||||
|
#include <Python.h>
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
func Float(f float64) *C.PyObject {
|
||||||
|
return C.PyFloat_FromDouble(C.double(f))
|
||||||
|
}
|
||||||
11
_demo/cgofull/pymod2/pymod2.go
Normal file
11
_demo/cgofull/pymod2/pymod2.go
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package pymod2
|
||||||
|
|
||||||
|
/*
|
||||||
|
#cgo pkg-config: python3-embed
|
||||||
|
#include <Python.h>
|
||||||
|
*/
|
||||||
|
import "C"
|
||||||
|
|
||||||
|
func Long(l int64) *C.PyObject {
|
||||||
|
return C.PyLong_FromLongLong(C.longlong(l))
|
||||||
|
}
|
||||||
28
_demo/checkfile/demo.go
Normal file
28
_demo/checkfile/demo.go
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tempDir := os.TempDir()
|
||||||
|
noexist := filepath.Join(tempDir, "noexist.txt")
|
||||||
|
|
||||||
|
if _, err := os.Stat(noexist); err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
fmt.Println("noexist:", err.Error())
|
||||||
|
} else {
|
||||||
|
fmt.Println("exist,other err:", err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := os.Open(noexist); err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
fmt.Println("noexist:", err.Error())
|
||||||
|
} else {
|
||||||
|
fmt.Println("exist,other err:", err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
18
_demo/commandrun/commandrun.go
Normal file
18
_demo/commandrun/commandrun.go
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"os/exec"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var data bytes.Buffer
|
||||||
|
cmd := exec.Command("echo", "hello llgo")
|
||||||
|
cmd.Stdout = &data
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
println("len:", len(data.Bytes()))
|
||||||
|
println("data:", data.String())
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
26
_demo/crand/rand.go
Normal file
26
_demo/crand/rand.go
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/c"
|
||||||
|
"github.com/goplus/llgo/c/math/rand"
|
||||||
|
"github.com/goplus/llgo/c/time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func fastrand64() uint64 {
|
||||||
|
v1 := uint64(rand.Random())
|
||||||
|
v2 := uint64(rand.Random())
|
||||||
|
return v1 ^ (v2 << 32)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
rand.Srand(c.Uint(time.Time(nil)))
|
||||||
|
fmt.Printf("%x\n", rand.Rand())
|
||||||
|
fmt.Printf("%x\n", rand.Rand())
|
||||||
|
|
||||||
|
rand.Srandom(c.Uint(time.Time(nil)))
|
||||||
|
fmt.Printf("%x\n", rand.Random())
|
||||||
|
fmt.Printf("%x\n", rand.Random())
|
||||||
|
fmt.Printf("%x\n", fastrand64())
|
||||||
|
}
|
||||||
42
_demo/failed/stacktrace/main.go
Normal file
42
_demo/failed/stacktrace/main.go
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
type MyStruct[T any] struct {
|
||||||
|
value T
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *MyStruct[T]) Method() {
|
||||||
|
fmt.Println("In generic method")
|
||||||
|
genericFunc[T](m.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
func genericFunc[T any](v T) {
|
||||||
|
fmt.Println("In generic function")
|
||||||
|
normalFunc()
|
||||||
|
}
|
||||||
|
|
||||||
|
func normalFunc() {
|
||||||
|
fmt.Println("In normal function")
|
||||||
|
panic("panic occurs here")
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
m := &MyStruct[string]{value: "hello"}
|
||||||
|
m.Method()
|
||||||
|
}
|
||||||
|
|
||||||
|
//Expected:
|
||||||
|
// In generic method
|
||||||
|
// In generic function
|
||||||
|
// In normal function
|
||||||
|
// panic: panic occurs here
|
||||||
|
|
||||||
|
// [0x00C6D310 github.com/goplus/llgo/internal/runtime.Rethrow+0x2f, SP = 0x60]
|
||||||
|
// [0x00C6CF44 github.com/goplus/llgo/internal/runtime.Panic+0x2d, SP = 0x50]
|
||||||
|
// [0x00C69420 main.normalFunc+0xf, SP = 0xa8]
|
||||||
|
// [0x00C69564 main.genericFunc[string]+0x18, SP = 0x74]
|
||||||
|
// [0x00C694A8 main.(*MyStruct[string]).Method+0x1f, SP = 0x84]
|
||||||
|
// [0x00C6936C main+0x4, SP = 0x40]
|
||||||
77
_demo/fcntl/fcntl.go
Normal file
77
_demo/fcntl/fcntl.go
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/goplus/llgo/c"
|
||||||
|
"github.com/goplus/llgo/c/os"
|
||||||
|
"unsafe"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
filename := c.Str("testfile.txt")
|
||||||
|
data := c.Str("Hello, os!")
|
||||||
|
var buffer [20]c.Char
|
||||||
|
|
||||||
|
// Open a file, O_CREAT|O_WRONLY|O_TRUNC means create, write only, or clear the file
|
||||||
|
fd := os.Open(filename, os.O_CREAT|os.O_WRONLY|os.O_TRUNC, 0644)
|
||||||
|
if fd == -1 {
|
||||||
|
c.Printf(c.Str("open error\n"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Writing data to a file
|
||||||
|
bytesWritten := os.Write(fd, c.Pointer(data), c.Strlen(data))
|
||||||
|
if bytesWritten == -1 {
|
||||||
|
c.Printf(c.Str("write error\n"))
|
||||||
|
os.Close(fd)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Printf(c.Str("Written %ld bytes to %s\n"), bytesWritten, filename)
|
||||||
|
|
||||||
|
// Get file status flags
|
||||||
|
flags := os.Fcntl(fd, os.F_GETFL)
|
||||||
|
if flags == -1 {
|
||||||
|
c.Printf(c.Str("os error\n"))
|
||||||
|
os.Close(fd)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Printf(c.Str("File flags: %d\n"), flags)
|
||||||
|
|
||||||
|
// Set the file status flag to non-blocking mode
|
||||||
|
if os.Fcntl(fd, os.F_SETFL, flags|os.O_NONBLOCK) == -1 {
|
||||||
|
c.Printf(c.Str("os error\n"))
|
||||||
|
os.Close(fd)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Printf(c.Str("set file status successfully\n"))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
c.Printf(c.Str("111"))
|
||||||
|
// Close file
|
||||||
|
os.Close(fd)
|
||||||
|
|
||||||
|
// Reopen the file, O_RDONLY means read-only
|
||||||
|
fd = os.Open(filename, os.O_RDONLY)
|
||||||
|
if fd == -1 {
|
||||||
|
c.Printf(c.Str("open error\n"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reading data from a file
|
||||||
|
// &buffer[:][0]
|
||||||
|
// unsafe.SliceData(buffer[:])
|
||||||
|
bytesRead := os.Read(fd, c.Pointer(unsafe.SliceData(buffer[:])), unsafe.Sizeof(buffer)-1)
|
||||||
|
if bytesRead == -1 {
|
||||||
|
c.Printf(c.Str("read error\n"))
|
||||||
|
os.Close(fd)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure that the buffer is null-terminated
|
||||||
|
buffer[bytesRead] = c.Char(0)
|
||||||
|
c.Printf(c.Str("Read %ld bytes: %s\n"), bytesRead, &buffer[0])
|
||||||
|
|
||||||
|
// Close file
|
||||||
|
os.Close(fd)
|
||||||
|
}
|
||||||
@@ -9,5 +9,5 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Expected output:
|
/* Expected output:
|
||||||
Hello World
|
Hello world
|
||||||
*/
|
*/
|
||||||
|
|||||||
10
_demo/linkname/linkname.go
Normal file
10
_demo/linkname/linkname.go
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import _ "unsafe" // for go:linkname
|
||||||
|
|
||||||
|
//go:linkname Sqrt C.sqrt
|
||||||
|
func Sqrt(x float64) float64
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
println("sqrt(2) =", Sqrt(2))
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ package main
|
|||||||
import (
|
import (
|
||||||
"github.com/goplus/llgo/c"
|
"github.com/goplus/llgo/c"
|
||||||
"github.com/goplus/llgo/c/llama2"
|
"github.com/goplus/llgo/c/llama2"
|
||||||
|
"github.com/goplus/llgo/c/time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -11,7 +12,7 @@ func main() {
|
|||||||
var tokenizerPath *c.Char = c.Str("tokenizer.bin")
|
var tokenizerPath *c.Char = c.Str("tokenizer.bin")
|
||||||
var temperature, topp c.Float = 1.0, 0.9
|
var temperature, topp c.Float = 1.0, 0.9
|
||||||
var steps c.Int = 256
|
var steps c.Int = 256
|
||||||
var rngSeed uint64 = uint64(c.Time(nil))
|
var rngSeed uint64 = uint64(time.Time(nil))
|
||||||
|
|
||||||
loop: // parse command line arguments
|
loop: // parse command line arguments
|
||||||
for {
|
for {
|
||||||
|
|||||||
9
_demo/logdemo/log.go
Normal file
9
_demo/logdemo/log.go
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
log.Println("Hello")
|
||||||
|
}
|
||||||
13
_demo/mimeheader/mimeheader.go
Normal file
13
_demo/mimeheader/mimeheader.go
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "net/textproto"
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
h := make(textproto.MIMEHeader)
|
||||||
|
h.Set("host", "www.example.com")
|
||||||
|
println(h.Get("Host"))
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Expected output:
|
||||||
|
www.example.com
|
||||||
|
*/
|
||||||
34
_demo/mkdirdemo/mkdir.go
Normal file
34
_demo/mkdirdemo/mkdir.go
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
tempDir, err := os.MkdirTemp("", "example*")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Failed to create temp directory:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer os.Remove(tempDir)
|
||||||
|
fmt.Println("Temp directory:", tempDir)
|
||||||
|
|
||||||
|
tempFile, err := os.CreateTemp("", "example*.txt")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Failed to create temp file:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer tempFile.Close()
|
||||||
|
defer os.Remove(tempFile.Name())
|
||||||
|
fmt.Println("Temp file:", tempFile.Name())
|
||||||
|
|
||||||
|
nestedDir := filepath.Join("nested", "directory")
|
||||||
|
err = os.MkdirAll(nestedDir, 0755)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Failed to create nested directory:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
fmt.Println("Nest directory:", nestedDir)
|
||||||
|
}
|
||||||
20
_demo/netdbdemo/netdb.go
Normal file
20
_demo/netdbdemo/netdb.go
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/goplus/llgo/c"
|
||||||
|
"github.com/goplus/llgo/c/net"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var hints net.AddrInfo
|
||||||
|
hints.Family = net.AF_UNSPEC
|
||||||
|
hints.SockType = net.SOCK_STREAM
|
||||||
|
|
||||||
|
host := "httpbin.org"
|
||||||
|
port := "80"
|
||||||
|
|
||||||
|
var result *net.AddrInfo
|
||||||
|
c.Printf(c.Str("%d\n"), net.Getaddrinfo(c.Str(host), c.Str(port), &hints, &result))
|
||||||
|
|
||||||
|
c.Printf(c.Str("%d\n"), net.Freeaddrinfo(result))
|
||||||
|
}
|
||||||
19
_demo/oslookpath/lookpath.go
Normal file
19
_demo/oslookpath/lookpath.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os/exec"
|
||||||
|
"runtime"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ls := "ls"
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
ls = "dir"
|
||||||
|
}
|
||||||
|
lspath, _ := exec.LookPath(ls)
|
||||||
|
if lspath != "" {
|
||||||
|
ls = lspath
|
||||||
|
}
|
||||||
|
fmt.Println(ls)
|
||||||
|
}
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/goplus/llgo/c"
|
|
||||||
"github.com/goplus/llgo/c/math/rand"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
var s c.Uint = 6
|
|
||||||
rand.Srand(s)
|
|
||||||
rr := rand.RandR(&s)
|
|
||||||
r := rand.Rand()
|
|
||||||
println("r:", r)
|
|
||||||
println("rr:", rr)
|
|
||||||
}
|
|
||||||
18
_demo/randcrypt/rand.go
Normal file
18
_demo/randcrypt/rand.go
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/rand"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
c := 10
|
||||||
|
b := make([]byte, c)
|
||||||
|
_, err := rand.Read(b)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("error:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// The slice should now contain random bytes instead of only zeroes.
|
||||||
|
fmt.Printf("%x\n", b)
|
||||||
|
}
|
||||||
12
_demo/randdemo/rand.go
Normal file
12
_demo/randdemo/rand.go
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math/rand"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(rand.Intn(100))
|
||||||
|
fmt.Println(rand.Intn(100))
|
||||||
|
fmt.Println(rand.Intn(100))
|
||||||
|
}
|
||||||
42
_demo/reflectfunc/reflectfunc.go
Normal file
42
_demo/reflectfunc/reflectfunc.go
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
func add(a, b int) int {
|
||||||
|
return a + b
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fn := func(a, b int) int {
|
||||||
|
return a + b
|
||||||
|
}
|
||||||
|
var i int
|
||||||
|
fn1 := func() {
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
fn2 := func() func() {
|
||||||
|
return func() {
|
||||||
|
println("closure", i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fns := []any{add, fn, fn1, fn2}
|
||||||
|
for _, fn := range fns {
|
||||||
|
v := reflect.ValueOf(fn)
|
||||||
|
fmt.Println(v.Type())
|
||||||
|
fmt.Println(v.Kind())
|
||||||
|
if v.Kind() != reflect.Func {
|
||||||
|
panic(fmt.Sprintf("not func: %T", fn))
|
||||||
|
}
|
||||||
|
|
||||||
|
t := v.Type()
|
||||||
|
fmt.Println(t)
|
||||||
|
fmt.Println(t.Kind())
|
||||||
|
if t.Kind() != reflect.Func {
|
||||||
|
panic(fmt.Sprintf("not func: %T", fn))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
32
_demo/socket/client/client.go
Normal file
32
_demo/socket/client/client.go
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/c"
|
||||||
|
"github.com/goplus/llgo/c/net"
|
||||||
|
"github.com/goplus/llgo/c/os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
sockfd := net.Socket(net.AF_INET, net.SOCK_STREAM, 0)
|
||||||
|
msg := c.Str("Hello, World!")
|
||||||
|
defer os.Close(sockfd)
|
||||||
|
|
||||||
|
server := net.GetHostByName(c.Str("localhost"))
|
||||||
|
if server == nil {
|
||||||
|
c.Perror(c.Str("hostname get error"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
servAddr := &net.SockaddrIn{}
|
||||||
|
servAddr.Family = net.AF_INET
|
||||||
|
servAddr.Port = net.Htons(uint16(1234))
|
||||||
|
c.Memcpy(unsafe.Pointer(&servAddr.Addr.Addr), unsafe.Pointer(*server.AddrList), uintptr(server.Length))
|
||||||
|
|
||||||
|
if res := net.Connect(sockfd, (*net.SockAddr)(unsafe.Pointer(servAddr)), c.Uint(16)); res < 0 {
|
||||||
|
c.Perror(c.Str("connect error"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
os.Write(sockfd, unsafe.Pointer(msg), c.Strlen(msg))
|
||||||
|
}
|
||||||
43
_demo/socket/server/server.go
Normal file
43
_demo/socket/server/server.go
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/c"
|
||||||
|
"github.com/goplus/llgo/c/net"
|
||||||
|
"github.com/goplus/llgo/c/os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
var buffer [256]c.Char
|
||||||
|
|
||||||
|
sockfd := net.Socket(net.AF_INET, net.SOCK_STREAM, 0)
|
||||||
|
defer os.Close(sockfd)
|
||||||
|
|
||||||
|
servAddr := &net.SockaddrIn{
|
||||||
|
Family: net.AF_INET,
|
||||||
|
Port: net.Htons(uint16(1234)),
|
||||||
|
Addr: net.InAddr{Addr: 0x00000000},
|
||||||
|
Zero: [8]c.Char{0, 0, 0, 0, 0, 0, 0, 0},
|
||||||
|
}
|
||||||
|
if res := net.Bind(sockfd, servAddr, c.Uint(unsafe.Sizeof(*servAddr))); res < 0 {
|
||||||
|
c.Perror(c.Str("bind error"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if net.Listen(sockfd, 5) < 0 {
|
||||||
|
c.Printf(c.Str("listen error"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
c.Printf(c.Str("Listening on port 1234...\n"))
|
||||||
|
|
||||||
|
cliAddr, clilen := &net.SockaddrIn{}, c.Uint(unsafe.Sizeof(servAddr))
|
||||||
|
|
||||||
|
newsockfd := net.Accept(sockfd, cliAddr, &clilen)
|
||||||
|
defer os.Close(newsockfd)
|
||||||
|
c.Printf(c.Str("Connection accepted."))
|
||||||
|
|
||||||
|
os.Read(newsockfd, unsafe.Pointer(unsafe.SliceData(buffer[:])), 256)
|
||||||
|
c.Printf(c.Str("Received: %s"), &buffer[0])
|
||||||
|
|
||||||
|
}
|
||||||
31
_demo/syncdebug/syncdebug.go
Normal file
31
_demo/syncdebug/syncdebug.go
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"sync"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
llsync "github.com/goplus/llgo/c/pthread/sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
type L struct {
|
||||||
|
mu sync.Mutex
|
||||||
|
s string
|
||||||
|
i int
|
||||||
|
w io.Writer
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
l := &L{s: "hello", i: 123, w: os.Stdout}
|
||||||
|
println("sizeof(L):", unsafe.Sizeof(L{}))
|
||||||
|
println("sizeof(sync.Mutex):", unsafe.Sizeof(sync.Mutex{}))
|
||||||
|
println("sizeof(llsync.Mutex):", unsafe.Sizeof(llsync.Mutex{}))
|
||||||
|
println("l:", l, "l.s:", l.s, "l.i:", l.i, "l.w:", l.w)
|
||||||
|
l.mu.Lock()
|
||||||
|
println("locked")
|
||||||
|
println("l:", l, "l.s:", l.s, "l.i:", l.i, "l.w:", l.w)
|
||||||
|
l.w.Write([]byte(l.s))
|
||||||
|
l.w.Write([]byte("\n"))
|
||||||
|
l.mu.Unlock()
|
||||||
|
}
|
||||||
26
_demo/sysexec/exec.go
Normal file
26
_demo/sysexec/exec.go
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os/exec"
|
||||||
|
"runtime"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
ls := "ls"
|
||||||
|
args := []string{ls, "-l"}
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
ls = "dir"
|
||||||
|
args = []string{ls}
|
||||||
|
}
|
||||||
|
lspath, _ := exec.LookPath(ls)
|
||||||
|
if lspath != "" {
|
||||||
|
ls = lspath
|
||||||
|
}
|
||||||
|
err := syscall.Exec(ls, args, nil)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("syscall.Exec error:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
11
_demo/timedur/timedur.go
Normal file
11
_demo/timedur/timedur.go
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
t := time.Now().Add(time.Second * 5)
|
||||||
|
fmt.Println(time.Until(t))
|
||||||
|
}
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
export LLVM_DIR=/opt/homebrew/Cellar/llvm@17/17.0.6
|
export LLVM_DIR=$(llvm-config --prefix)
|
||||||
clang -L$LLVM_DIR/lib -lclang -lc++ -I$LLVM_DIR/include astdump.cpp
|
clang -L$LLVM_DIR/lib -lclang -lc++ -I$LLVM_DIR/include astdump.cpp
|
||||||
221
_xtool/castdump/castdump.go
Normal file
221
_xtool/castdump/castdump.go
Normal file
@@ -0,0 +1,221 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/c"
|
||||||
|
"github.com/goplus/llgo/c/clang"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Data struct {
|
||||||
|
Depth c.Uint
|
||||||
|
Unit *clang.TranslationUnit
|
||||||
|
}
|
||||||
|
|
||||||
|
var accessMap = map[clang.CXXAccessSpecifier]string{
|
||||||
|
clang.CXXInvalidAccessSpecifier: "invalid",
|
||||||
|
clang.CXXPublic: "public",
|
||||||
|
clang.CXXProtected: "protected",
|
||||||
|
clang.CXXPrivate: "private",
|
||||||
|
}
|
||||||
|
|
||||||
|
func printIndent(depth c.Uint) {
|
||||||
|
fmt.Print(strings.Repeat(" ", int(depth)))
|
||||||
|
}
|
||||||
|
|
||||||
|
func accessToString(spec clang.CXXAccessSpecifier) string {
|
||||||
|
if str, ok := accessMap[spec]; ok {
|
||||||
|
return str
|
||||||
|
}
|
||||||
|
return "unknown"
|
||||||
|
}
|
||||||
|
|
||||||
|
func visit(cursor, parent clang.Cursor, ClientData c.Pointer) clang.ChildVisitResult {
|
||||||
|
data := (*Data)(ClientData)
|
||||||
|
printAST(cursor, data)
|
||||||
|
return clang.ChildVisit_Continue
|
||||||
|
}
|
||||||
|
|
||||||
|
func printType(t clang.Type, data *Data) {
|
||||||
|
printIndent(data.Depth)
|
||||||
|
|
||||||
|
typeSpell := t.String()
|
||||||
|
typeKind := t.Kind.String()
|
||||||
|
|
||||||
|
if t.Kind == clang.TypeInvalid {
|
||||||
|
} else if t.Kind == clang.TypeUnexposed {
|
||||||
|
c.Printf(c.Str("<UnexposedType|%s>: %s\n"), typeKind.CStr(), typeSpell.CStr())
|
||||||
|
} else if t.Kind >= clang.TypeFirstBuiltin && t.Kind <= clang.TypeLastBuiltin {
|
||||||
|
c.Printf(c.Str("<BuiltinType|%s>: %s\n"), typeKind.CStr(), typeSpell.CStr())
|
||||||
|
} else if t.Kind > clang.TypeComplex {
|
||||||
|
c.Printf(c.Str("<ComplexType|%s>: %s\n"), typeKind.CStr(), typeSpell.CStr())
|
||||||
|
}
|
||||||
|
|
||||||
|
data.Depth++
|
||||||
|
switch t.Kind {
|
||||||
|
case clang.TypePointer:
|
||||||
|
printType(t.PointeeType(), data)
|
||||||
|
case clang.TypeIncompleteArray, clang.TypeVariableArray, clang.TypeDependentSizedArray, clang.TypeConstantArray:
|
||||||
|
printType(t.ArrayElementType(), data)
|
||||||
|
case clang.TypeTypedef:
|
||||||
|
printType(t.TypeDeclaration().TypedefDeclUnderlyingType(), data)
|
||||||
|
case clang.TypeElaborated:
|
||||||
|
printType(t.NamedType(), data)
|
||||||
|
case clang.TypeFunctionProto:
|
||||||
|
printType(t.ResultType(), data)
|
||||||
|
for i := 0; i < int(t.NumArgTypes()); i++ {
|
||||||
|
printType(t.ArgType(c.Uint(i)), data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data.Depth--
|
||||||
|
|
||||||
|
typeKind.Dispose()
|
||||||
|
typeSpell.Dispose()
|
||||||
|
}
|
||||||
|
|
||||||
|
func printLocation(cursor clang.Cursor) {
|
||||||
|
loc := cursor.Location()
|
||||||
|
var file clang.File
|
||||||
|
var line, column c.Uint
|
||||||
|
|
||||||
|
loc.SpellingLocation(&file, &line, &column, nil)
|
||||||
|
filename := file.FileName()
|
||||||
|
defer filename.Dispose()
|
||||||
|
|
||||||
|
c.Printf(c.Str("(Loc:%s:%d:%d)\n"), filename.CStr(), line, column)
|
||||||
|
}
|
||||||
|
|
||||||
|
func printAccess(cursor clang.Cursor) {
|
||||||
|
kind := cursor.Kind.String()
|
||||||
|
spell := cursor.String()
|
||||||
|
defer kind.Dispose()
|
||||||
|
defer spell.Dispose()
|
||||||
|
|
||||||
|
c.Printf(c.Str("%s: %s %s"), kind.CStr(), spell.CStr(), c.AllocaCStr(accessToString(cursor.CXXAccessSpecifier())))
|
||||||
|
printLocation(cursor)
|
||||||
|
}
|
||||||
|
|
||||||
|
func printMacro(cursor clang.Cursor, unit *clang.TranslationUnit) {
|
||||||
|
kind := cursor.Kind.String()
|
||||||
|
defer kind.Dispose()
|
||||||
|
|
||||||
|
c.Printf(c.Str("%s: "), kind.CStr())
|
||||||
|
ran := cursor.Extent()
|
||||||
|
var numTokens c.Uint
|
||||||
|
var tokens *clang.Token
|
||||||
|
unit.Tokenize(ran, &tokens, &numTokens)
|
||||||
|
defer unit.DisposeTokens(tokens, numTokens)
|
||||||
|
|
||||||
|
tokensSlice := unsafe.Slice(tokens, int(numTokens))
|
||||||
|
for _, tok := range tokensSlice {
|
||||||
|
tokStr := unit.Token(tok)
|
||||||
|
c.Printf(c.Str("%s "), tokStr.CStr())
|
||||||
|
tokStr.Dispose()
|
||||||
|
}
|
||||||
|
printLocation(cursor)
|
||||||
|
}
|
||||||
|
|
||||||
|
func printFunc(cursor clang.Cursor, data *Data) {
|
||||||
|
kind := cursor.Kind.String()
|
||||||
|
spell := cursor.String()
|
||||||
|
symbol := cursor.Mangling()
|
||||||
|
defer symbol.Dispose()
|
||||||
|
defer kind.Dispose()
|
||||||
|
defer spell.Dispose()
|
||||||
|
|
||||||
|
c.Printf(c.Str("%s: %s (Symbol: %s)"), kind.CStr(), spell.CStr(), symbol.CStr())
|
||||||
|
printLocation(cursor)
|
||||||
|
printType(cursor.Type(), data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func printEnumConstant(cursor clang.Cursor) {
|
||||||
|
kind := cursor.Kind.String()
|
||||||
|
spell := cursor.String()
|
||||||
|
defer kind.Dispose()
|
||||||
|
defer spell.Dispose()
|
||||||
|
|
||||||
|
c.Printf(c.Str("%s: %s:%lld"), kind.CStr(), spell.CStr(), cursor.EnumConstantDeclValue())
|
||||||
|
printLocation(cursor)
|
||||||
|
}
|
||||||
|
|
||||||
|
func printDefault(cursor clang.Cursor, data *Data) {
|
||||||
|
kind := cursor.Kind.String()
|
||||||
|
spell := cursor.String()
|
||||||
|
defer kind.Dispose()
|
||||||
|
defer spell.Dispose()
|
||||||
|
|
||||||
|
// node which has type
|
||||||
|
if cursor.Type().Kind != clang.TypeInvalid {
|
||||||
|
c.Printf(c.Str("%s: %s"), kind.CStr(), spell.CStr())
|
||||||
|
printLocation(cursor)
|
||||||
|
printType(cursor.Type(), data)
|
||||||
|
} else {
|
||||||
|
c.Printf(c.Str("%s: %s\n"), kind.CStr(), spell.CStr())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func printAST(cursor clang.Cursor, data *Data) {
|
||||||
|
kind := cursor.Kind.String()
|
||||||
|
spell := cursor.String()
|
||||||
|
|
||||||
|
printIndent(data.Depth)
|
||||||
|
|
||||||
|
switch cursor.Kind {
|
||||||
|
case clang.CursorCXXAccessSpecifier:
|
||||||
|
printAccess(cursor)
|
||||||
|
case clang.CursorMacroDefinition:
|
||||||
|
printMacro(cursor, data.Unit)
|
||||||
|
case clang.CursorFunctionDecl, clang.CursorCXXMethod, clang.CursorConstructor, clang.CursorDestructor:
|
||||||
|
printFunc(cursor, data)
|
||||||
|
case clang.CursorEnumConstantDecl:
|
||||||
|
printEnumConstant(cursor)
|
||||||
|
default:
|
||||||
|
printDefault(cursor, data)
|
||||||
|
}
|
||||||
|
|
||||||
|
data.Depth++
|
||||||
|
clang.VisitChildren(cursor, visit, c.Pointer(data))
|
||||||
|
data.Depth--
|
||||||
|
|
||||||
|
kind.Dispose()
|
||||||
|
spell.Dispose()
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
if c.Argc != 2 {
|
||||||
|
fmt.Fprintln(os.Stderr, "Usage: castdump <headerFile>")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
args := make([]*c.Char, 3)
|
||||||
|
args[0] = c.Str("-x")
|
||||||
|
args[1] = c.Str("c++")
|
||||||
|
args[2] = c.Str("-std=c++11")
|
||||||
|
|
||||||
|
sourceFile := *c.Advance(c.Argv, 1)
|
||||||
|
index := clang.CreateIndex(0, 0)
|
||||||
|
unit := index.ParseTranslationUnit(
|
||||||
|
sourceFile,
|
||||||
|
unsafe.SliceData(args), 3,
|
||||||
|
nil, 0,
|
||||||
|
clang.DetailedPreprocessingRecord,
|
||||||
|
)
|
||||||
|
defer index.Dispose()
|
||||||
|
defer unit.Dispose()
|
||||||
|
|
||||||
|
if unit == nil {
|
||||||
|
println("Unable to parse translation unit. Quitting.")
|
||||||
|
c.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
cursor := unit.Cursor()
|
||||||
|
|
||||||
|
Data := &Data{
|
||||||
|
Depth: 0,
|
||||||
|
Unit: unit,
|
||||||
|
}
|
||||||
|
printAST(cursor, Data)
|
||||||
|
}
|
||||||
@@ -38,7 +38,7 @@ func main() {
|
|||||||
items := cjson.Array()
|
items := cjson.Array()
|
||||||
mod := py.ImportModule(pyLib)
|
mod := py.ImportModule(pyLib)
|
||||||
keys := mod.ModuleGetDict().DictKeys()
|
keys := mod.ModuleGetDict().DictKeys()
|
||||||
for i, n := uintptr(0), keys.ListLen(); i < n; i++ {
|
for i, n := 0, keys.ListLen(); i < n; i++ {
|
||||||
key := keys.ListItem(i)
|
key := keys.ListItem(i)
|
||||||
val := mod.GetAttr(key)
|
val := mod.GetAttr(key)
|
||||||
doc := val.GetAttrString(c.Str("__doc__"))
|
doc := val.GetAttrString(c.Str("__doc__"))
|
||||||
@@ -3,9 +3,9 @@ package main
|
|||||||
import (
|
import (
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/goplus/llgo/_test/testing"
|
|
||||||
"github.com/goplus/llgo/c"
|
"github.com/goplus/llgo/c"
|
||||||
"github.com/goplus/llgo/c/bdwgc"
|
"github.com/goplus/llgo/c/bdwgc"
|
||||||
|
"github.com/goplus/llgo/c/bdwgc/_test/testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ------ Test malloc ------
|
// ------ Test malloc ------
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/goplus/llgo/_test/testing"
|
|
||||||
"github.com/goplus/llgo/c"
|
"github.com/goplus/llgo/c"
|
||||||
|
"github.com/goplus/llgo/c/bdwgc/_test/testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
type TestCase struct {
|
type TestCase struct {
|
||||||
Binary file not shown.
Binary file not shown.
51
c/c.go
51
c/c.go
@@ -28,13 +28,18 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
Void = [0]byte
|
||||||
Char = int8
|
Char = int8
|
||||||
Float = float32
|
Float = float32
|
||||||
Double = float64
|
Double = float64
|
||||||
Pointer = unsafe.Pointer
|
Pointer = unsafe.Pointer
|
||||||
FilePtr = unsafe.Pointer
|
FilePtr = *FILE
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type FILE struct {
|
||||||
|
Unused [8]byte
|
||||||
|
}
|
||||||
|
|
||||||
type (
|
type (
|
||||||
Int C.int
|
Int C.int
|
||||||
Uint C.uint
|
Uint C.uint
|
||||||
@@ -50,6 +55,23 @@ type integer interface {
|
|||||||
~int | ~uint | ~uintptr | ~int32 | ~uint32 | ~int64 | ~uint64
|
~int | ~uint | ~uintptr | ~int32 | ~uint32 | ~int64 | ~uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type SizeT = uintptr
|
||||||
|
|
||||||
|
type IntptrT = uintptr
|
||||||
|
type UintptrT = uintptr
|
||||||
|
type Int8T = int8
|
||||||
|
type Int16T = int16
|
||||||
|
type Int32T = int32
|
||||||
|
type Int64T = int64
|
||||||
|
|
||||||
|
type Uint8T = uint8
|
||||||
|
type Uint16T = uint16
|
||||||
|
type Uint32T = uint32
|
||||||
|
type Uint64T = uint64
|
||||||
|
|
||||||
|
type IntmaxT = LongLong
|
||||||
|
type UintmaxT = UlongLong
|
||||||
|
|
||||||
//go:linkname Str llgo.cstr
|
//go:linkname Str llgo.cstr
|
||||||
func Str(string) *Char
|
func Str(string) *Char
|
||||||
|
|
||||||
@@ -68,6 +90,9 @@ func Alloca(size uintptr) Pointer
|
|||||||
//go:linkname AllocaCStr llgo.allocaCStr
|
//go:linkname AllocaCStr llgo.allocaCStr
|
||||||
func AllocaCStr(s string) *Char
|
func AllocaCStr(s string) *Char
|
||||||
|
|
||||||
|
//go:linkname AllocaCStrs llgo.allocaCStrs
|
||||||
|
func AllocaCStrs(strs []string, endWithNil bool) **Char
|
||||||
|
|
||||||
// TODO(xsw):
|
// TODO(xsw):
|
||||||
// llgo:link AllocaNew llgo.allocaNew
|
// llgo:link AllocaNew llgo.allocaNew
|
||||||
func AllocaNew[T any]() *T { return nil }
|
func AllocaNew[T any]() *T { return nil }
|
||||||
@@ -75,9 +100,15 @@ func AllocaNew[T any]() *T { return nil }
|
|||||||
//go:linkname Malloc C.malloc
|
//go:linkname Malloc C.malloc
|
||||||
func Malloc(size uintptr) Pointer
|
func Malloc(size uintptr) Pointer
|
||||||
|
|
||||||
|
//go:linkname Calloc C.calloc
|
||||||
|
func Calloc(num uintptr, size uintptr) Pointer
|
||||||
|
|
||||||
//go:linkname Free C.free
|
//go:linkname Free C.free
|
||||||
func Free(ptr Pointer)
|
func Free(ptr Pointer)
|
||||||
|
|
||||||
|
//go:linkname Realloc C.realloc
|
||||||
|
func Realloc(ptr Pointer, size uintptr) Pointer
|
||||||
|
|
||||||
//go:linkname Memcpy C.memcpy
|
//go:linkname Memcpy C.memcpy
|
||||||
func Memcpy(dst, src Pointer, n uintptr) Pointer
|
func Memcpy(dst, src Pointer, n uintptr) Pointer
|
||||||
|
|
||||||
@@ -209,13 +240,22 @@ func Fputc(c Int, fp FilePtr) Int
|
|||||||
//go:linkname Fputs C.fputs
|
//go:linkname Fputs C.fputs
|
||||||
func Fputs(s *Char, fp FilePtr) Int
|
func Fputs(s *Char, fp FilePtr) Int
|
||||||
|
|
||||||
|
//go:linkname Fread C.fread
|
||||||
|
func Fread(data Pointer, size, count uintptr, fp FilePtr) uintptr
|
||||||
|
|
||||||
//go:linkname Fflush C.fflush
|
//go:linkname Fflush C.fflush
|
||||||
func Fflush(fp FilePtr) Int
|
func Fflush(fp FilePtr) Int
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
//go:linkname Fopen C.fopen
|
||||||
|
func Fopen(c *Char, mod *Char) FilePtr
|
||||||
|
|
||||||
//go:linkname Time C.time
|
//go:linkname Fclose C.fclose
|
||||||
func Time(*int32) int32
|
func Fclose(fp FilePtr) Int
|
||||||
|
|
||||||
|
//go:linkname Perror C.perror
|
||||||
|
func Perror(s *Char)
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
//go:linkname Usleep C.usleep
|
//go:linkname Usleep C.usleep
|
||||||
func Usleep(useconds Uint) Int
|
func Usleep(useconds Uint) Int
|
||||||
@@ -257,3 +297,6 @@ func GetoptLong(argc Int, argv **Char, optstring *Char, longopts *Option, longin
|
|||||||
func GetoptLongOnly(argc Int, argv **Char, optstring *Char, longopts *Option, longindex *Int) Int
|
func GetoptLongOnly(argc Int, argv **Char, optstring *Char, longopts *Option, longindex *Int) Int
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
//go:linkname Sysconf C.sysconf
|
||||||
|
func Sysconf(name Int) Long
|
||||||
|
|||||||
@@ -22,6 +22,22 @@ func main() {
|
|||||||
|
|
||||||
mod.SetItem(c.Str("items"), syms)
|
mod.SetItem(c.Str("items"), syms)
|
||||||
|
|
||||||
c.Printf(c.Str("%s\n"), mod.CStr())
|
cstr := mod.CStr()
|
||||||
|
str := c.GoString(cstr)
|
||||||
|
c.Printf(c.Str("%s\n"), cstr)
|
||||||
|
cjson.FreeCStr(cstr)
|
||||||
|
|
||||||
|
mod.Delete()
|
||||||
|
|
||||||
|
cjsonLoad(str)
|
||||||
|
}
|
||||||
|
|
||||||
|
func cjsonLoad(str string) {
|
||||||
|
mod := cjson.ParseString(str)
|
||||||
|
|
||||||
|
cstr := mod.Print()
|
||||||
|
c.Printf(c.Str("%s\n"), cstr)
|
||||||
|
cjson.FreeCStr(cstr)
|
||||||
|
|
||||||
mod.Delete()
|
mod.Delete()
|
||||||
}
|
}
|
||||||
|
|||||||
673
c/cjson/cjson.go
673
c/cjson/cjson.go
@@ -17,7 +17,7 @@
|
|||||||
package cjson
|
package cjson
|
||||||
|
|
||||||
import (
|
import (
|
||||||
_ "unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/goplus/llgo/c"
|
"github.com/goplus/llgo/c"
|
||||||
)
|
)
|
||||||
@@ -26,73 +26,25 @@ const (
|
|||||||
LLGoPackage = "link: $(pkg-config --libs libcjson); -lcjson"
|
LLGoPackage = "link: $(pkg-config --libs libcjson); -lcjson"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Bool c.Int
|
||||||
|
|
||||||
// llgo:type C
|
// llgo:type C
|
||||||
type JSON struct {
|
type JSON struct {
|
||||||
Unused [0]byte
|
Unused [0]byte
|
||||||
}
|
}
|
||||||
|
|
||||||
//go:linkname Null C.cJSON_CreateNull
|
func ParseBytes(value []byte) *JSON {
|
||||||
func Null() *JSON
|
return ParseWithLength((*c.Char)(unsafe.Pointer(unsafe.SliceData(value))), uintptr(len(value)))
|
||||||
|
}
|
||||||
|
|
||||||
//go:linkname True C.cJSON_CreateTrue
|
func ParseString(value string) *JSON {
|
||||||
func True() *JSON
|
return ParseWithLength((*c.Char)(unsafe.Pointer(unsafe.StringData(value))), uintptr(len(value)))
|
||||||
|
}
|
||||||
|
|
||||||
//go:linkname False C.cJSON_CreateFalse
|
// CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
|
||||||
func False() *JSON
|
|
||||||
|
|
||||||
//go:linkname Bool C.cJSON_CreateBool
|
|
||||||
func Bool(boolean c.Int) *JSON
|
|
||||||
|
|
||||||
//go:linkname Number C.cJSON_CreateNumber
|
|
||||||
func Number(num float64) *JSON
|
|
||||||
|
|
||||||
//go:linkname String C.cJSON_CreateString
|
|
||||||
func String(str *c.Char) *JSON
|
|
||||||
|
|
||||||
//go:linkname Array C.cJSON_CreateArray
|
|
||||||
func Array() *JSON
|
|
||||||
|
|
||||||
//go:linkname Object C.cJSON_CreateObject
|
|
||||||
func Object() *JSON
|
|
||||||
|
|
||||||
// raw json
|
|
||||||
//
|
//
|
||||||
//go:linkname Raw C.cJSON_CreateRaw
|
// Render a cJSON entity to text for transfer/storage without any formatting.
|
||||||
func Raw(raw *c.Char) *JSON
|
|
||||||
|
|
||||||
// Create a string where valuestring references a string so
|
|
||||||
// it will not be freed by Delete
|
|
||||||
//
|
//
|
||||||
//go:linkname StringRef C.cJSON_CreateStringReference
|
|
||||||
func StringRef(str *c.Char) *JSON
|
|
||||||
|
|
||||||
// Create an object that only references it's elements so
|
|
||||||
// they will not be freed by Delete
|
|
||||||
//
|
|
||||||
//go:linkname ObjectRef C.cJSON_CreateObjectReference
|
|
||||||
func ObjectRef(child *JSON) *JSON
|
|
||||||
|
|
||||||
// Create an array that only references it's elements so
|
|
||||||
// they will not be freed by Delete
|
|
||||||
//
|
|
||||||
//go:linkname ArrayRef C.cJSON_CreateArrayReference
|
|
||||||
func ArrayRef(child *JSON) *JSON
|
|
||||||
|
|
||||||
// Delete a JSON entity and all subentities.
|
|
||||||
//
|
|
||||||
// llgo:link (*JSON).Delete C.cJSON_Delete
|
|
||||||
func (o *JSON) Delete() {}
|
|
||||||
|
|
||||||
// Append item to the specified array.
|
|
||||||
//
|
|
||||||
// llgo:link (*JSON).AddItem C.cJSON_AddItemToArray
|
|
||||||
func (o *JSON) AddItem(item *JSON) c.Int { return 0 }
|
|
||||||
|
|
||||||
// Append item to the specified object.
|
|
||||||
//
|
|
||||||
// llgo:link (*JSON).SetItem C.cJSON_AddItemToObject
|
|
||||||
func (o *JSON) SetItem(key *c.Char, item *JSON) c.Int { return 0 }
|
|
||||||
|
|
||||||
// llgo:link (*JSON).CStr C.cJSON_PrintUnformatted
|
// llgo:link (*JSON).CStr C.cJSON_PrintUnformatted
|
||||||
func (o *JSON) CStr() *c.Char { return nil }
|
func (o *JSON) CStr() *c.Char { return nil }
|
||||||
|
|
||||||
@@ -101,21 +53,618 @@ func (o *JSON) CStr() *c.Char { return nil }
|
|||||||
// llgo:link (*JSON).Cstr C.cJSON_PrintUnformatted
|
// llgo:link (*JSON).Cstr C.cJSON_PrintUnformatted
|
||||||
func (o *JSON) Cstr() *c.Char { return nil }
|
func (o *JSON) Cstr() *c.Char { return nil }
|
||||||
|
|
||||||
|
// malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks
|
||||||
|
//
|
||||||
|
//go:linkname FreeCStr C.cJSON_free
|
||||||
|
func FreeCStr(*c.Char)
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(const char*) cJSON_Version(void);
|
||||||
|
//
|
||||||
|
// returns the version of cJSON as a string
|
||||||
|
//
|
||||||
|
//go:linkname Version C.cJSON_Version
|
||||||
|
func Version() *c.Char
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value);
|
||||||
|
//
|
||||||
|
// Memory Management: the caller is always responsible to free
|
||||||
|
// the results from all variants of cJSON_Parse (with cJSON_Delete)
|
||||||
|
// and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or
|
||||||
|
// cJSON_free as appropriate). The exception is cJSON_PrintPreallocated,
|
||||||
|
// where the caller has full responsibility of the buffer.
|
||||||
|
//
|
||||||
|
//go:linkname Parse C.cJSON_Parse
|
||||||
|
func Parse(value *c.Char) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length);
|
||||||
|
//
|
||||||
|
// Memory Management: the caller is always responsible to free
|
||||||
|
// the results from all variants of cJSON_Parse (with cJSON_Delete)
|
||||||
|
// and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or
|
||||||
|
// cJSON_free as appropriate). The exception is cJSON_PrintPreallocated,
|
||||||
|
// where the caller has full responsibility of the buffer.
|
||||||
|
//
|
||||||
|
//go:linkname ParseWithLength C.cJSON_ParseWithLength
|
||||||
|
func ParseWithLength(value *c.Char, valueLength uintptr) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_ParseWithOpts(const char *value, const char **return_parse_end, cJSON_Bool require_null_terminated);
|
||||||
|
//
|
||||||
|
// ParseWithOpts allows you to require (and check) that the JSON is null terminated,
|
||||||
|
// and to retrieve the pointer to the final byte parsed.
|
||||||
|
// If you supply a ptr in return_parse_end and parsing fails, then
|
||||||
|
// return_parse_end will contain a pointer to the error so will match
|
||||||
|
// cJSON_GetErrorPtr().
|
||||||
|
//
|
||||||
|
//go:linkname ParseWithOpts C.cJSON_ParseWithOpts
|
||||||
|
func ParseWithOpts(value *c.Char, return_parse_end **c.Char, require_null_terminated Bool) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_ParseWithLengthOpts(const char *value, size_t buffer_length, const char **return_parse_end, cJSON_Bool require_null_terminated);
|
||||||
|
//
|
||||||
|
// ParseWithOpts allows you to require (and check) that the JSON is null terminated,
|
||||||
|
// and to retrieve the pointer to the final byte parsed.
|
||||||
|
// If you supply a ptr in return_parse_end and parsing fails, then
|
||||||
|
// return_parse_end will contain a pointer to the error so will match
|
||||||
|
// cJSON_GetErrorPtr().
|
||||||
|
//
|
||||||
|
//go:linkname ParseWithLengthOpts C.cJSON_ParseWithLengthOpts
|
||||||
|
func ParseWithLengthOpts(value *c.Char, buffer_length uintptr, return_parse_end **c.Char, require_null_terminated Bool) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item);
|
||||||
// Render a JSON entity to text for transfer/storage.
|
// Render a JSON entity to text for transfer/storage.
|
||||||
//
|
//
|
||||||
// llgo:link (*JSON).Print C.cJSON_Print
|
// llgo:link (*JSON).Print C.cJSON_Print
|
||||||
func (o *JSON) Print() *c.Char { return nil }
|
func (o *JSON) Print() *c.Char { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
|
||||||
// Render a JSON entity to text for transfer/storage without any formatting.
|
// Render a JSON entity to text for transfer/storage without any formatting.
|
||||||
//
|
//
|
||||||
// llgo:link (*JSON).PrintUnformatted C.cJSON_PrintUnformatted
|
// llgo:link (*JSON).PrintUnformatted C.cJSON_PrintUnformatted
|
||||||
func (o *JSON) PrintUnformatted() *c.Char { return nil }
|
func (o *JSON) PrintUnformatted() *c.Char { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item, int prebuffer, cJSON_Bool fmt);
|
||||||
|
//
|
||||||
// Render a JSON entity to text using a buffered strategy.
|
// Render a JSON entity to text using a buffered strategy.
|
||||||
//
|
|
||||||
// prebuffer is a guess at the final size. guessing well reduces reallocation.
|
// prebuffer is a guess at the final size. guessing well reduces reallocation.
|
||||||
//
|
|
||||||
// fmt=0 gives unformatted, =1 gives formatted.
|
// fmt=0 gives unformatted, =1 gives formatted.
|
||||||
//
|
//
|
||||||
// llgo:link (*JSON).PrintBuffered C.cJSON_PrintBuffered
|
// llgo:link (*JSON).PrintBuffered C.cJSON_PrintBuffered
|
||||||
func (o *JSON) PrintBuffered(prebuffer c.Int, fmt c.Int) *c.Char { return nil }
|
func (o *JSON) PrintBuffered(prebuffer c.Int, fmt Bool) *c.Char { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_PrintPreallocated(cJSON *item, char *buffer, const int length, const cJSON_Bool format);
|
||||||
|
//
|
||||||
|
// Render a cJSON entity to text using a buffer already allocated in memory with given
|
||||||
|
// length. Returns 1 on success and 0 on failure.
|
||||||
|
// note that cJSON is not always 100% accurate in estimating how much memory it will use,
|
||||||
|
// so to be safe allocate 5 bytes more than you actually need
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).PrintPreallocated C.cJSON_PrintPreallocated
|
||||||
|
func (o *JSON) PrintPreallocated(buffer *c.Char, length c.Int, format Bool) Bool {
|
||||||
|
return Bool(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(void) cJSON_Delete(cJSON *item);
|
||||||
|
// Delete a JSON entity and all subentities.
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).Delete C.cJSON_Delete
|
||||||
|
func (o *JSON) Delete() {}
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON *array);
|
||||||
|
//
|
||||||
|
// Returns the number of items in an array (or object).
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).GetArraySize C.cJSON_GetArraySize
|
||||||
|
func (o *JSON) GetArraySize() c.Int { return 0 }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_GetArrayItem(const cJSON *array, int index);
|
||||||
|
//
|
||||||
|
// Retrieve item number "index" from array "array". Returns NULL if unsuccessful.
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).GetArrayItem C.cJSON_GetArrayItem
|
||||||
|
func (o *JSON) GetArrayItem(index c.Int) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_GetObjectItem(const cJSON * const object, const char * const string);
|
||||||
|
//
|
||||||
|
// Get item "string" from object. Case insensitive.
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).GetObjectItem C.cJSON_GetObjectItem
|
||||||
|
func (o *JSON) GetObjectItem(s *c.Char) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_GetObjectItemCaseSensitive(const cJSON * const object, const char * const string);
|
||||||
|
//
|
||||||
|
// Get item "string" from object. Case sensitive.
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).GetObjectItemCaseSensitive C.cJSON_GetObjectItemCaseSensitive
|
||||||
|
func (o *JSON) GetObjectItemCaseSensitive(key *c.Char) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_HasObjectItem(const cJSON *object, const char *string);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).HasObjectItem C.cJSON_HasObjectItem
|
||||||
|
func (o *JSON) HasObjectItem(s *c.Char) Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(const char *) cJSON_GetErrorPtr(void);
|
||||||
|
//
|
||||||
|
// For analysing failed parses. This returns a pointer to the parse error.
|
||||||
|
// You'll probably need to look a few chars back to make sense of it.
|
||||||
|
// Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds.
|
||||||
|
//
|
||||||
|
//go:linkname GetErrorPtr C.cJSON_GetErrorPtr
|
||||||
|
func GetErrorPtr() *c.Char
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(char *) cJSON_GetStringValue(const cJSON * const item);
|
||||||
|
//
|
||||||
|
// Check item type and return its value
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).GetStringValue C.cJSON_GetStringValue
|
||||||
|
func (o *JSON) GetStringValue() *c.Char { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item);
|
||||||
|
//
|
||||||
|
// Check item type and return its value
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).GetNumberValue C.cJSON_GetNumberValue
|
||||||
|
func (o *JSON) GetNumberValue() c.Double { return 0 }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_IsInvalid(const cJSON * const item);
|
||||||
|
//
|
||||||
|
// These functions check the type of an item
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).IsInvalid C.cJSON_IsInvalid
|
||||||
|
func (o *JSON) IsInvalid() Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_IsFalse(const cJSON * const item);
|
||||||
|
//
|
||||||
|
// These functions check the type of an item
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).IsFalse C.cJSON_IsFalse
|
||||||
|
func (o *JSON) IsFalse() Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_IsTrue(const cJSON * const item);
|
||||||
|
//
|
||||||
|
// These functions check the type of an item
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).IsTrue C.cJSON_IsTrue
|
||||||
|
func (o *JSON) IsTrue() Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_IsBool(const cJSON * const item);
|
||||||
|
//
|
||||||
|
// These functions check the type of an item
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).IsBool C.cJSON_IsBool
|
||||||
|
func (o *JSON) IsBool() Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_IsNull(const cJSON * const item);
|
||||||
|
//
|
||||||
|
// These functions check the type of an item
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).IsNull C.cJSON_IsNull
|
||||||
|
func (o *JSON) IsNull() Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_IsNumber(const cJSON * const item);
|
||||||
|
//
|
||||||
|
// These functions check the type of an item
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).IsNumber C.cJSON_IsNumber
|
||||||
|
func (o *JSON) IsNumber() Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_IsString(const cJSON * const item);
|
||||||
|
//
|
||||||
|
// These functions check the type of an item
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).IsString C.cJSON_IsString
|
||||||
|
func (o *JSON) IsString() Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_IsArray(const cJSON * const item);
|
||||||
|
//
|
||||||
|
// These functions check the type of an item
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).IsArray C.cJSON_IsArray
|
||||||
|
func (o *JSON) IsArray() Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_IsObject(const cJSON * const item);
|
||||||
|
//
|
||||||
|
// These functions check the type of an item
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).IsObject C.cJSON_IsObject
|
||||||
|
func (o *JSON) IsObject() Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_IsRaw(const cJSON * const item);
|
||||||
|
//
|
||||||
|
// These functions check the type of an item
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).IsRaw C.cJSON_IsRaw
|
||||||
|
func (o *JSON) IsRaw() Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);
|
||||||
|
//
|
||||||
|
// These calls create a cJSON item of the appropriate type.
|
||||||
|
//
|
||||||
|
//go:linkname Null C.cJSON_CreateNull
|
||||||
|
func Null() *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateNull(void);
|
||||||
|
//
|
||||||
|
// same as Null func
|
||||||
|
//
|
||||||
|
//go:linkname CreateNull C.cJSON_CreateNull
|
||||||
|
func CreateNull() *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);
|
||||||
|
//
|
||||||
|
//go:linkname True C.cJSON_CreateTrue
|
||||||
|
func True() *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateTrue(void);
|
||||||
|
//
|
||||||
|
// same as True func
|
||||||
|
//
|
||||||
|
//go:linkname CreateTrue C.cJSON_CreateTrue
|
||||||
|
func CreateTrue() *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);
|
||||||
|
//
|
||||||
|
//go:linkname False C.cJSON_CreateFalse
|
||||||
|
func False() *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateFalse(void);
|
||||||
|
//
|
||||||
|
// same as False func
|
||||||
|
//
|
||||||
|
//go:linkname CreateFalse C.cJSON_CreateFalse
|
||||||
|
func CreateFalse() *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateBool(cJSON_Bool boolean);
|
||||||
|
//
|
||||||
|
// same as Bool func
|
||||||
|
//
|
||||||
|
//go:linkname CreateBool C.cJSON_CreateBool
|
||||||
|
func CreateBool(boolean c.Int) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
|
||||||
|
//
|
||||||
|
//go:linkname Number C.cJSON_CreateNumber
|
||||||
|
func Number(num float64) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateNumber(double num);
|
||||||
|
//
|
||||||
|
// same as Number func
|
||||||
|
//
|
||||||
|
//go:linkname CreateNumber C.cJSON_CreateNumber
|
||||||
|
func CreateNumber(num float64) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
|
||||||
|
//
|
||||||
|
//go:linkname String C.cJSON_CreateString
|
||||||
|
func String(str *c.Char) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateString(const char *string);
|
||||||
|
//
|
||||||
|
// same as String func
|
||||||
|
//
|
||||||
|
//go:linkname CreateString C.cJSON_CreateString
|
||||||
|
func CreateString(str *c.Char) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);
|
||||||
|
// raw json
|
||||||
|
//
|
||||||
|
//go:linkname Raw C.cJSON_CreateRaw
|
||||||
|
func Raw(raw *c.Char) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateRaw(const char *raw);
|
||||||
|
//
|
||||||
|
// same as Raw func
|
||||||
|
//
|
||||||
|
//go:linkname CreateRaw C.cJSON_CreateRaw
|
||||||
|
func CreateRaw(raw *c.Char) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
|
||||||
|
//
|
||||||
|
//go:linkname Array C.cJSON_CreateArray
|
||||||
|
func Array() *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateArray(void);
|
||||||
|
//
|
||||||
|
// same as Array func
|
||||||
|
//
|
||||||
|
//go:linkname CreateArray C.cJSON_CreateArray
|
||||||
|
func CreateArray() *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);
|
||||||
|
//
|
||||||
|
//go:linkname Object C.cJSON_CreateObject
|
||||||
|
func Object() *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateObject(void);
|
||||||
|
//
|
||||||
|
// same as Object func
|
||||||
|
//
|
||||||
|
//go:linkname CreateObject C.cJSON_CreateObject
|
||||||
|
func CreateObject() *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string);
|
||||||
|
//
|
||||||
|
// Create a string where valuestring references a string so
|
||||||
|
// it will not be freed by Delete
|
||||||
|
//
|
||||||
|
//go:linkname StringRef C.cJSON_CreateStringReference
|
||||||
|
func StringRef(str *c.Char) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateStringReference(const char *string);
|
||||||
|
//
|
||||||
|
// same as StringRef func
|
||||||
|
//
|
||||||
|
//go:linkname CreateStringReference C.cJSON_CreateStringReference
|
||||||
|
func CreateStringReference(str *c.Char) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);
|
||||||
|
//
|
||||||
|
// Create an object that only references it's elements so
|
||||||
|
// they will not be freed by Delete
|
||||||
|
//
|
||||||
|
//go:linkname ObjectRef C.cJSON_CreateObjectReference
|
||||||
|
func ObjectRef(child *JSON) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateObjectReference(const cJSON *child);
|
||||||
|
//
|
||||||
|
// same as ObjectRef func
|
||||||
|
//
|
||||||
|
//go:linkname CreateObjectReference C.cJSON_CreateObjectReference
|
||||||
|
func CreateObjectReference(child *JSON) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);
|
||||||
|
//
|
||||||
|
// Create an array that only references it's elements so
|
||||||
|
// they will not be freed by Delete
|
||||||
|
//
|
||||||
|
//go:linkname ArrayRef C.cJSON_CreateArrayReference
|
||||||
|
func ArrayRef(child *JSON) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateArrayReference(const cJSON *child);
|
||||||
|
//
|
||||||
|
// same as ArrayRef func
|
||||||
|
//
|
||||||
|
//go:linkname CreateArrayReference C.cJSON_CreateArrayReference
|
||||||
|
func CreateArrayReference(child *JSON) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateIntArray(const int *numbers, int count);
|
||||||
|
//
|
||||||
|
//go:linkname CreateIntArray C.cJSON_CreateIntArray
|
||||||
|
func CreateIntArray(numbers *c.Int, count c.Int) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateFloatArray(const float *numbers, int count);
|
||||||
|
//
|
||||||
|
//go:linkname CreateFloatArray C.cJSON_CreateFloatArray
|
||||||
|
func CreateFloatArray(numbers *c.Float, count c.Int) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateDoubleArray(const double *numbers, int count);
|
||||||
|
//
|
||||||
|
//go:linkname CreateDoubleArray C.cJSON_CreateDoubleArray
|
||||||
|
func CreateDoubleArray(numbers *c.Double, count c.Int) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_CreateStringArray(const char *const *strings, int count);
|
||||||
|
//
|
||||||
|
//go:linkname CreateStringArray C.cJSON_CreateStringArray
|
||||||
|
func CreateStringArray(strings *c.Char, count c.Int) *JSON
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);
|
||||||
|
//
|
||||||
|
// Append item to the specified array.
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddItem C.cJSON_AddItemToArray
|
||||||
|
func (o *JSON) AddItem(item *JSON) Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_AddItemToArray(cJSON *array, cJSON *item);
|
||||||
|
//
|
||||||
|
// same as AddItem func
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddItemToArray C.cJSON_AddItemToArray
|
||||||
|
func (o *JSON) AddItemToArray(item *JSON) Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
|
||||||
|
//
|
||||||
|
// Append item to the specified object.
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).SetItem C.cJSON_AddItemToObject
|
||||||
|
func (o *JSON) SetItem(key *c.Char, item *JSON) Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_AddItemToObject(cJSON *object, const char *string, cJSON *item);
|
||||||
|
//
|
||||||
|
// same as SetItem func
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddItemToObject C.cJSON_AddItemToObject
|
||||||
|
func (o *JSON) AddItemToObject(key *c.Char, item *JSON) Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_AddItemToObjectCS(cJSON *object, const char *string, cJSON *item);
|
||||||
|
//
|
||||||
|
// Use this when string is definitely const (i.e. a literal, or as good as),
|
||||||
|
// and will definitely survive the cJSON object.
|
||||||
|
// warning that When this function was used, make sure to always check that
|
||||||
|
// (item->type & cJSON_StringIsConst) is zero before writing to `item->string`
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddItemToObjectCS C.cJSON_AddItemToObjectCS
|
||||||
|
func (o *JSON) AddItemToObjectCS(s *c.Char, item *JSON) Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_AddItemReferenceToArray(cJSON *array, cJSON *item);
|
||||||
|
//
|
||||||
|
// Append reference to item to the specified array/object.
|
||||||
|
// Use this when you want to add an existing cJSON to a new cJSON,
|
||||||
|
// but don't want to corrupt your existing cJSON.
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddItemReferenceToArray C.cJSON_AddItemReferenceToArray
|
||||||
|
func (o *JSON) AddItemReferenceToArray(item *JSON) Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_AddItemReferenceToObject(cJSON *object, const char *string, cJSON *item);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddItemReferenceToObject C.cJSON_AddItemReferenceToObject
|
||||||
|
func (o *JSON) AddItemReferenceToObject(s *c.Char, item *JSON) Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_DetachItemViaPointer(cJSON *parent, cJSON * const item);
|
||||||
|
//
|
||||||
|
// Remove/Detach items from Arrays/Objects.
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).DetachItemViaPointer C.cJSON_DetachItemViaPointer
|
||||||
|
func (o *JSON) DetachItemViaPointer(item *JSON) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromArray(cJSON *array, int which);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).DetachItemFromArray C.cJSON_DetachItemFromArray
|
||||||
|
func (o *JSON) DetachItemFromArray(which c.Int) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON *array, int which);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).DeleteItemFromArray C.cJSON_DeleteItemFromArray
|
||||||
|
func (o *JSON) DeleteItemFromArray(which c.Int) {}
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObject(cJSON *object, const char *string);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).DetachItemFromObject C.cJSON_DetachItemFromObject
|
||||||
|
func (o *JSON) DetachItemFromObject(s *c.Char) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_DetachItemFromObjectCaseSensitive(cJSON *object, const char *string);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).DetachItemFromObjectCaseSensitive C.cJSON_DetachItemFromObjectCaseSensitive
|
||||||
|
func (o *JSON) DetachItemFromObjectCaseSensitive(s *c.Char) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON *object, const char *string);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).DeleteItemFromObject C.cJSON_DeleteItemFromObject
|
||||||
|
func (o *JSON) DeleteItemFromObject(s *c.Char) {}
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON *object, const char *string);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).DeleteItemFromObjectCaseSensitive C.cJSON_DeleteItemFromObjectCaseSensitive
|
||||||
|
func (o *JSON) DeleteItemFromObjectCaseSensitive(s *c.Char) {}
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_InsertItemInArray(cJSON *array, int which, cJSON *newitem);
|
||||||
|
//
|
||||||
|
// Update array items.
|
||||||
|
// Shifts pre-existing items to the right.
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).InsertItemInArray C.cJSON_InsertItemInArray
|
||||||
|
func (o *JSON) InsertItemInArray(which c.Int, newitem *JSON) Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_ReplaceItemViaPointer(cJSON * const parent, cJSON * const item, cJSON * replacement);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).ReplaceItemViaPointer C.cJSON_ReplaceItemViaPointer
|
||||||
|
func (o *JSON) ReplaceItemViaPointer(item *JSON, replacement *JSON) Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_ReplaceItemInArray(cJSON *array, int which, cJSON *newitem);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).ReplaceItemInArray C.cJSON_ReplaceItemInArray
|
||||||
|
func (o *JSON) ReplaceItemInArray(which c.Int, newitem *JSON) Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).ReplaceItemInObject C.cJSON_ReplaceItemInObject
|
||||||
|
func (o *JSON) ReplaceItemInObject(s *c.Char, newitem *JSON) Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_ReplaceItemInObjectCaseSensitive(cJSON *object,const char *string,cJSON *newitem);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).ReplaceItemInObjectCaseSensitive C.cJSON_ReplaceItemInObjectCaseSensitive
|
||||||
|
func (o *JSON) ReplaceItemInObjectCaseSensitive(s *c.Char, newitem *JSON) Bool {
|
||||||
|
return Bool(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON *) cJSON_Duplicate(const cJSON *item, cJSON_Bool recurse);
|
||||||
|
//
|
||||||
|
// Duplicate a cJSON item
|
||||||
|
//
|
||||||
|
// Duplicate will create a new, identical cJSON item to the one you pass,
|
||||||
|
// in new memory that will need to be released. With recurse!=0,
|
||||||
|
// it will duplicate any children connected to the item.
|
||||||
|
// The item->next and ->prev pointers are always zero on return from Duplicate.
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).Duplicate C.cJSON_Duplicate
|
||||||
|
func (o *JSON) Duplicate(recurse Bool) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON_Bool) cJSON_Compare(const cJSON * const a, const cJSON * const b, const cJSON_Bool case_sensitive);
|
||||||
|
//
|
||||||
|
// Recursively compare two cJSON items for equality. If either a or b is NULL or invalid,
|
||||||
|
// they will be considered unequal. case_sensitive determines if object keys are treated
|
||||||
|
// case sensitive (1) or case insensitive (0)
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).Compare C.cJSON_Compare
|
||||||
|
func (o *JSON) Compare(b *JSON, case_sensitive Bool) Bool { return Bool(0) }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(void) cJSON_Minify(char *json);
|
||||||
|
//
|
||||||
|
// Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings.
|
||||||
|
// The input pointer json cannot point to a read-only address area, such as a string constant,
|
||||||
|
// but should point to a readable and writable address area.
|
||||||
|
//
|
||||||
|
//go:linkname Minify C.cJSON_Minify
|
||||||
|
func Minify()
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON * const object, const char * const name);
|
||||||
|
//
|
||||||
|
// Helper functions for creating and adding items to an object at the same time.
|
||||||
|
// They return the added item or NULL on failure.
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddNullToObject C.cJSON_AddNullToObject
|
||||||
|
func (o *JSON) AddNullToObject(name *c.Char) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON * const object, const char * const name);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddTrueToObject C.cJSON_AddTrueToObject
|
||||||
|
func (o *JSON) AddTrueToObject(name *c.Char) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON * const object, const char * const name);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddFalseToObject C.cJSON_AddFalseToObject
|
||||||
|
func (o *JSON) AddFalseToObject(name *c.Char) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON*) cJSON_AddBoolToObject(cJSON * const object, const char * const name, const cJSON_Bool boolean);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddBoolToObject C.cJSON_AddBoolToObject
|
||||||
|
func (o *JSON) AddBoolToObject(name *c.Char, b Bool) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON*) cJSON_AddNumberToObject(cJSON * const object, const char * const name, const double number);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddNumberToObject C.cJSON_AddNumberToObject
|
||||||
|
func (o *JSON) AddNumberToObject(name *c.Char, num c.Double) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON*) cJSON_AddStringToObject(cJSON * const object, const char * const name, const char * const string);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddStringToObject C.cJSON_AddStringToObject
|
||||||
|
func (o *JSON) AddStringToObject(name *c.Char, s *c.Char) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON*) cJSON_AddRawToObject(cJSON * const object, const char * const name, const char * const raw);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddRawToObject C.cJSON_AddRawToObject
|
||||||
|
func (o *JSON) AddRawToObject(name *c.Char, raw *c.Char) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON * const object, const char * const name);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddObjectToObject C.cJSON_AddObjectToObject
|
||||||
|
func (o *JSON) AddObjectToObject(name *c.Char) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON * const object, const char * const name);
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).AddArrayToObject C.cJSON_AddArrayToObject
|
||||||
|
func (o *JSON) AddArrayToObject(name *c.Char) *JSON { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON *object, double number);
|
||||||
|
//
|
||||||
|
// helper for the cJSON_SetNumberValue macro
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).SetNumberHelper C.cJSON_SetNumberHelper
|
||||||
|
func (o *JSON) SetNumberHelper(number c.Double) c.Double { return 0 }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON *object, const char *valuestring);
|
||||||
|
//
|
||||||
|
// Change the valuestring of a cJSON_String object, only takes effect when type of
|
||||||
|
// object is cJSON_String
|
||||||
|
//
|
||||||
|
// llgo:link (*JSON).SetValuestring C.cJSON_SetValuestring
|
||||||
|
func (o *JSON) SetValuestring(v *c.Char) *c.Char { return nil }
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(void *) cJSON_malloc(size_t size);
|
||||||
|
//
|
||||||
|
// malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks
|
||||||
|
//
|
||||||
|
//go:linkname Malloc C.cJSON_malloc
|
||||||
|
func Malloc(size uintptr)
|
||||||
|
|
||||||
|
// CJSON_PUBLIC(void) cJSON_free(void *object);
|
||||||
|
//
|
||||||
|
//go:linkname Free C.cJSON_free
|
||||||
|
func Free(ptr unsafe.Pointer)
|
||||||
|
|||||||
Binary file not shown.
@@ -1,49 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/goplus/llgo/c"
|
|
||||||
"github.com/goplus/llgo/c/clang"
|
|
||||||
)
|
|
||||||
|
|
||||||
func visit(cursor, parent clang.Cursor, clientData c.Pointer) clang.ChildVisitResult {
|
|
||||||
depth := *(*c.Uint)(clientData)
|
|
||||||
printAST(cursor, depth+1)
|
|
||||||
return clang.ChildVisit_Continue
|
|
||||||
}
|
|
||||||
|
|
||||||
func printAST(cursor clang.Cursor, depth c.Uint) {
|
|
||||||
cursorKind := cursor.Kind.String()
|
|
||||||
cursorSpelling := cursor.String()
|
|
||||||
|
|
||||||
for i := c.Uint(0); i < depth; i++ {
|
|
||||||
c.Fputs(c.Str(" "), c.Stdout)
|
|
||||||
}
|
|
||||||
|
|
||||||
c.Printf(c.Str("%s: %s\n"), cursorKind.CStr(), cursorSpelling.CStr())
|
|
||||||
|
|
||||||
cursorKind.Dispose()
|
|
||||||
cursorSpelling.Dispose()
|
|
||||||
|
|
||||||
clang.VisitChildren(cursor, visit, c.Pointer(&depth))
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
index := clang.CreateIndex(0, 0)
|
|
||||||
unit := index.ParseTranslationUnit(
|
|
||||||
c.Str("todo"),
|
|
||||||
nil, 0,
|
|
||||||
nil, 0,
|
|
||||||
clang.TranslationUnit_None,
|
|
||||||
)
|
|
||||||
|
|
||||||
if unit == nil {
|
|
||||||
println("Unable to parse translation unit. Quitting.")
|
|
||||||
c.Exit(1)
|
|
||||||
}
|
|
||||||
|
|
||||||
cursor := unit.Cursor()
|
|
||||||
printAST(cursor, 0)
|
|
||||||
|
|
||||||
unit.Dispose()
|
|
||||||
index.Dispose()
|
|
||||||
}
|
|
||||||
35
c/clang/_demo/inclusion/inclusion.go
Normal file
35
c/clang/_demo/inclusion/inclusion.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/c"
|
||||||
|
"github.com/goplus/llgo/c/clang"
|
||||||
|
"github.com/goplus/llgo/compiler/chore/_xtool/llcppsymg/clangutils"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
_, unit, err := clangutils.CreateTranslationUnit(&clangutils.Config{
|
||||||
|
File: "#include <stddef.h>",
|
||||||
|
Temp: true,
|
||||||
|
IsCpp: false,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
println(err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
clang.GetInclusions(unit, func(included_file clang.File, inclusion_stack *clang.SourceLocation, include_len c.Uint, client_data c.Pointer) {
|
||||||
|
filename := included_file.FileName()
|
||||||
|
c.Printf(c.Str("Included file: %s Include length: %d\n"), filename.CStr(), include_len)
|
||||||
|
inclusions := unsafe.Slice(inclusion_stack, include_len)
|
||||||
|
for i := range inclusions {
|
||||||
|
loc := inclusions[i]
|
||||||
|
var file clang.File
|
||||||
|
var line, column c.Uint
|
||||||
|
loc.SpellingLocation(&file, &line, &column, nil)
|
||||||
|
filename = file.FileName()
|
||||||
|
c.Printf(c.Str(" included from: %s:%d:%d\n"), filename.CStr(), line, column)
|
||||||
|
}
|
||||||
|
}, nil)
|
||||||
|
}
|
||||||
163
c/clang/_demo/symboldump/symboldump.go
Normal file
163
c/clang/_demo/symboldump/symboldump.go
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/c"
|
||||||
|
"github.com/goplus/llgo/c/clang"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Context struct {
|
||||||
|
namespaceName string
|
||||||
|
className string
|
||||||
|
unit *clang.TranslationUnit
|
||||||
|
}
|
||||||
|
|
||||||
|
func newContext() *Context {
|
||||||
|
return &Context{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Context) setNamespaceName(name string) {
|
||||||
|
c.namespaceName = name
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Context) setClassName(name string) {
|
||||||
|
c.className = name
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *Context) setUnit(unit *clang.TranslationUnit) {
|
||||||
|
c.unit = unit
|
||||||
|
}
|
||||||
|
|
||||||
|
var context = newContext()
|
||||||
|
|
||||||
|
func printCursorLocation(cursor clang.Cursor) {
|
||||||
|
loc := cursor.Location()
|
||||||
|
var file clang.File
|
||||||
|
var line, column c.Uint
|
||||||
|
|
||||||
|
loc.SpellingLocation(&file, &line, &column, nil)
|
||||||
|
filename := file.FileName()
|
||||||
|
defer filename.Dispose()
|
||||||
|
|
||||||
|
c.Printf(c.Str("%s:%d:%d\n"), filename.CStr(), line, column)
|
||||||
|
}
|
||||||
|
|
||||||
|
func printMarcoInfo(cursor clang.Cursor) {
|
||||||
|
printCursorLocation(cursor)
|
||||||
|
name := cursor.String()
|
||||||
|
c.Printf(c.Str("Marco Name: %s\n"), name.CStr())
|
||||||
|
ran := cursor.Extent()
|
||||||
|
var numTokens c.Uint
|
||||||
|
var tokens *clang.Token
|
||||||
|
context.unit.Tokenize(ran, &tokens, &numTokens)
|
||||||
|
c.Printf(c.Str("Content: "))
|
||||||
|
|
||||||
|
tokensSlice := unsafe.Slice(tokens, int(numTokens))
|
||||||
|
for _, tok := range tokensSlice {
|
||||||
|
tokStr := context.unit.Token(tok)
|
||||||
|
c.Printf(c.Str("%s "), tokStr.CStr())
|
||||||
|
tokStr.Dispose()
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Printf(c.Str("\n"))
|
||||||
|
println("--------------------------------")
|
||||||
|
}
|
||||||
|
func printFuncInfo(cursor clang.Cursor) {
|
||||||
|
printCursorLocation(cursor)
|
||||||
|
|
||||||
|
cursorStr := cursor.String()
|
||||||
|
symbol := cursor.Mangling()
|
||||||
|
defer symbol.Dispose()
|
||||||
|
defer cursorStr.Dispose()
|
||||||
|
|
||||||
|
if context.namespaceName != "" && context.className != "" {
|
||||||
|
fmt.Printf("%s:%s:", context.namespaceName, context.className)
|
||||||
|
} else if context.namespaceName != "" {
|
||||||
|
fmt.Printf("%s:", context.namespaceName)
|
||||||
|
}
|
||||||
|
c.Printf(c.Str("%s\n"), cursorStr.CStr())
|
||||||
|
|
||||||
|
if cursor.Kind == clang.CursorCXXMethod || cursor.Kind == clang.CursorFunctionDecl {
|
||||||
|
c.Printf(c.Str("symbol:%s\n"), symbol.CStr())
|
||||||
|
|
||||||
|
typeStr := cursor.ResultType().String()
|
||||||
|
defer typeStr.Dispose()
|
||||||
|
c.Printf(c.Str("Return Type: %s\n"), typeStr.CStr())
|
||||||
|
c.Printf(c.Str("Parameters(%d): ( "), cursor.NumArguments())
|
||||||
|
|
||||||
|
for i := 0; i < int(cursor.NumArguments()); i++ {
|
||||||
|
argCurSor := cursor.Argument(c.Uint(i))
|
||||||
|
argType := argCurSor.Type().String()
|
||||||
|
argName := argCurSor.String()
|
||||||
|
c.Printf(c.Str("%s %s"), argType.CStr(), argName.CStr())
|
||||||
|
if i < int(cursor.NumArguments())-1 {
|
||||||
|
c.Printf(c.Str(", "))
|
||||||
|
}
|
||||||
|
|
||||||
|
argType.Dispose()
|
||||||
|
argName.Dispose()
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Printf(c.Str(" )\n"))
|
||||||
|
println("--------------------------------")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func visit(cursor, parent clang.Cursor, clientData c.Pointer) clang.ChildVisitResult {
|
||||||
|
if cursor.Kind == clang.CursorMacroDefinition {
|
||||||
|
printMarcoInfo(cursor)
|
||||||
|
} else if cursor.Kind == clang.CursorNamespace {
|
||||||
|
nameStr := cursor.String()
|
||||||
|
context.setNamespaceName(c.GoString(nameStr.CStr()))
|
||||||
|
clang.VisitChildren(cursor, visit, nil)
|
||||||
|
context.setNamespaceName("")
|
||||||
|
} else if cursor.Kind == clang.CursorClassDecl {
|
||||||
|
nameStr := cursor.String()
|
||||||
|
context.setClassName(c.GoString(nameStr.CStr()))
|
||||||
|
clang.VisitChildren(cursor, visit, nil)
|
||||||
|
context.setClassName("")
|
||||||
|
} else if cursor.Kind == clang.CursorCXXMethod || cursor.Kind == clang.CursorFunctionDecl {
|
||||||
|
printFuncInfo(cursor)
|
||||||
|
}
|
||||||
|
|
||||||
|
return clang.ChildVisit_Continue
|
||||||
|
}
|
||||||
|
|
||||||
|
func parse(filename *c.Char) {
|
||||||
|
index := clang.CreateIndex(0, 0)
|
||||||
|
args := make([]*c.Char, 3)
|
||||||
|
args[0] = c.Str("-x")
|
||||||
|
args[1] = c.Str("c++")
|
||||||
|
args[2] = c.Str("-std=c++11")
|
||||||
|
unit := index.ParseTranslationUnit(
|
||||||
|
filename,
|
||||||
|
unsafe.SliceData(args), 3,
|
||||||
|
nil, 0,
|
||||||
|
clang.DetailedPreprocessingRecord,
|
||||||
|
)
|
||||||
|
|
||||||
|
if unit == nil {
|
||||||
|
println("Unable to parse translation unit. Quitting.")
|
||||||
|
c.Exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
context.setUnit(unit)
|
||||||
|
cursor := unit.Cursor()
|
||||||
|
|
||||||
|
clang.VisitChildren(cursor, visit, nil)
|
||||||
|
unit.Dispose()
|
||||||
|
index.Dispose()
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
if c.Argc != 2 {
|
||||||
|
fmt.Fprintln(os.Stderr, "Usage: <C++ header file>\n")
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
sourceFile := *c.Advance(c.Argv, 1)
|
||||||
|
parse(sourceFile)
|
||||||
|
}
|
||||||
|
}
|
||||||
220
c/clang/_wrap/cursor.cpp
Normal file
220
c/clang/_wrap/cursor.cpp
Normal file
@@ -0,0 +1,220 @@
|
|||||||
|
#include <clang-c/Index.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
typedef enum CXChildVisitResult (*wrap_CXCursorVisitor)(CXCursor *cursor, CXCursor *parent, CXClientData client_data);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
CXClientData data;
|
||||||
|
wrap_CXCursorVisitor visitor;
|
||||||
|
} wrap_data;
|
||||||
|
|
||||||
|
CXChildVisitResult wrap_visitor(CXCursor cursor, CXCursor parent, CXClientData data) {
|
||||||
|
wrap_data *d = (wrap_data *)(data);
|
||||||
|
return d->visitor(&cursor, &parent, d->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
|
||||||
|
void wrap_clang_getLocation(CXTranslationUnit tu, CXFile file, unsigned line, unsigned column, CXSourceLocation *loc) {
|
||||||
|
*loc = clang_getLocation(tu, file, line, column);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wrap_clang_getLocationForOffset(CXTranslationUnit tu, CXFile file, unsigned offset, CXSourceLocation *loc) {
|
||||||
|
*loc = clang_getLocationForOffset(tu, file, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wrap_clang_getTranslationUnitCursor(CXTranslationUnit uint, CXCursor *cur) {
|
||||||
|
*cur = clang_getTranslationUnitCursor(uint);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned wrap_clang_equalCursors(CXCursor *cursor1, CXCursor *cursor2) {
|
||||||
|
return clang_equalCursors(*cursor1, *cursor2);
|
||||||
|
}
|
||||||
|
|
||||||
|
int wrap_clang_Cursor_isNull(CXCursor *cursor) { return clang_Cursor_isNull(*cursor); }
|
||||||
|
|
||||||
|
void wrap_clang_getCursorSemanticParent(CXCursor *C, CXCursor *parent) { *parent = clang_getCursorSemanticParent(*C); }
|
||||||
|
|
||||||
|
void wrap_clang_getCursorDefinition(CXCursor *C, CXCursor *def) { *def = clang_getCursorDefinition(*C); }
|
||||||
|
|
||||||
|
void wrap_clang_getCursorLexicalParent(CXCursor *C, CXCursor *parent) { *parent = clang_getCursorLexicalParent(*C); }
|
||||||
|
|
||||||
|
void wrap_clang_getOverriddenCursors(CXCursor *cursor, CXCursor **overridden, unsigned *num_overridden) {
|
||||||
|
clang_getOverriddenCursors(*cursor, overridden, num_overridden);
|
||||||
|
}
|
||||||
|
|
||||||
|
CXFile wrap_clang_getIncludedFile(CXCursor *cursor) { return clang_getIncludedFile(*cursor); }
|
||||||
|
|
||||||
|
void wrap_clang_getCursor(CXTranslationUnit uint, CXSourceLocation *loc, CXCursor *cur) {
|
||||||
|
*cur = clang_getCursor(uint, *loc);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wrap_clang_getCursorLocation(CXCursor *cur, CXSourceLocation *loc) { *loc = clang_getCursorLocation(*cur); }
|
||||||
|
|
||||||
|
void wrap_clang_getCursorExtent(CXCursor *cur, CXSourceRange *range) { *range = clang_getCursorExtent(*cur); }
|
||||||
|
|
||||||
|
void wrap_clang_getCursorType(CXCursor *cur, CXType *typ) { *typ = clang_getCursorType(*cur); }
|
||||||
|
|
||||||
|
CXString wrap_clang_getTypeSpelling(CXType *typ) { return clang_getTypeSpelling(*typ); }
|
||||||
|
|
||||||
|
void wrap_clang_getTypedefDeclUnderlyingType(CXCursor *cur, CXType *typ) {
|
||||||
|
*typ = clang_getTypedefDeclUnderlyingType(*cur);
|
||||||
|
}
|
||||||
|
|
||||||
|
long long wrap_clang_getEnumConstantDeclValue(CXCursor *cur) { return clang_getEnumConstantDeclValue(*cur); }
|
||||||
|
|
||||||
|
int wrap_clang_Cursor_getNumArguments(CXCursor *cur) { return clang_Cursor_getNumArguments(*cur); }
|
||||||
|
|
||||||
|
void wrap_clang_Cursor_getArgument(CXCursor *C, unsigned i, CXCursor *argCur) {
|
||||||
|
*argCur = clang_Cursor_getArgument(*C, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wrap_clang_getCanonicalType(CXType *typ, CXType *canonicalType) { *canonicalType = clang_getCanonicalType(*typ); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_isConstQualifiedType(CXType *typ) { return clang_isConstQualifiedType(*typ); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_Cursor_isMacroFunctionLike(CXCursor *cur) { return clang_Cursor_isMacroFunctionLike(*cur); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_Cursor_isMacroBuiltin(CXCursor *cur) { return clang_Cursor_isMacroBuiltin(*cur); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_Cursor_isFunctionInlined(CXCursor *cur) { return clang_Cursor_isFunctionInlined(*cur); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_isVolatileQualifiedType(CXType *T) { return clang_isVolatileQualifiedType(*T); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_isRestrictQualifiedType(CXType *T) { return clang_isRestrictQualifiedType(*T); }
|
||||||
|
|
||||||
|
void wrap_clang_getPointeeType(CXType *pointerTyp, CXType *pointeeTyp) {
|
||||||
|
*pointeeTyp = clang_getPointeeType(*pointerTyp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wrap_clang_getNonReferenceType(CXType *typ, CXType *nonRefTyp) { *nonRefTyp = clang_getNonReferenceType(*typ); }
|
||||||
|
|
||||||
|
void wrap_clang_getTypeDeclaration(CXType *typ, CXCursor *cur) { *cur = clang_getTypeDeclaration(*typ); }
|
||||||
|
|
||||||
|
void wrap_clang_getResultType(CXType *typ, CXType *resultTyp) { *resultTyp = clang_getResultType(*typ); }
|
||||||
|
|
||||||
|
int wrap_clang_getNumArgTypes(CXType *typ) { return clang_getNumArgTypes(*typ); }
|
||||||
|
|
||||||
|
void wrap_clang_getArgType(CXType *typ, unsigned i, CXType *argTyp) { *argTyp = clang_getArgType(*typ, i); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_isFunctionTypeVariadic(CXType *typ) { return clang_isFunctionTypeVariadic(*typ); }
|
||||||
|
|
||||||
|
void wrap_clang_getCursorResultType(CXCursor *cur, CXType *typ) { *typ = clang_getCursorResultType(*cur); }
|
||||||
|
|
||||||
|
void wrap_clang_getElementType(CXType *Typ, CXType *elemTyp) { *elemTyp = clang_getElementType(*Typ); }
|
||||||
|
|
||||||
|
void wrap_clang_getArrayElementType(CXType *arrayTyp, CXType *elemTyp) {
|
||||||
|
*elemTyp = clang_getArrayElementType(*arrayTyp);
|
||||||
|
}
|
||||||
|
|
||||||
|
long long wrap_clang_getArraySize(CXType *arrayTyp) { return clang_getArraySize(*arrayTyp); }
|
||||||
|
|
||||||
|
void wrap_clang_Type_getNamedType(CXType *typ, CXType *namedTyp) { *namedTyp = clang_Type_getNamedType(*typ); }
|
||||||
|
|
||||||
|
long long wrap_clang_Type_getSizeOf(CXType *typ) { return clang_Type_getSizeOf(*typ); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_Cursor_isAnonymous(CXCursor *cursor) { return clang_Cursor_isAnonymous(*cursor); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_Cursor_isAnonymousRecordDecl(CXCursor *cursor) {
|
||||||
|
return clang_Cursor_isAnonymousRecordDecl(*cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum CX_CXXAccessSpecifier wrap_clang_getCXXAccessSpecifier(CXCursor *cursor) {
|
||||||
|
return clang_getCXXAccessSpecifier(*cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum CX_StorageClass wrap_clang_Cursor_getStorageClass(CXCursor *cursor) {
|
||||||
|
return clang_Cursor_getStorageClass(*cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
CXString wrap_clang_getCursorUSR(CXCursor *cur) { return clang_getCursorUSR(*cur); }
|
||||||
|
|
||||||
|
CXString wrap_clang_getCursorSpelling(CXCursor *cur) { return clang_getCursorSpelling(*cur); }
|
||||||
|
|
||||||
|
CXString wrap_clang_getCursorDisplayName(CXCursor *cur) { return clang_getCursorDisplayName(*cur); }
|
||||||
|
|
||||||
|
void wrap_clang_getCursorReferenced(CXCursor *cur, CXCursor *referenced) {
|
||||||
|
*referenced = clang_getCursorReferenced(*cur);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned wrap_clang_Cursor_isVariadic(CXCursor *cur) { return clang_Cursor_isVariadic(*cur); }
|
||||||
|
|
||||||
|
void wrap_clang_Cursor_getCommentRange(CXCursor *cur, CXSourceRange *range) {
|
||||||
|
*range = clang_Cursor_getCommentRange(*cur);
|
||||||
|
}
|
||||||
|
|
||||||
|
CXString wrap_clang_Cursor_getRawCommentText(CXCursor *cursor) { return clang_Cursor_getRawCommentText(*cursor); }
|
||||||
|
|
||||||
|
CXString wrap_clang_Cursor_getMangling(CXCursor *cur) { return clang_Cursor_getMangling(*cur); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXConstructor_isConvertingConstructor(CXCursor *cursor) {
|
||||||
|
return clang_CXXConstructor_isConvertingConstructor(*cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXConstructor_isCopyConstructor(CXCursor *cursor) {
|
||||||
|
return clang_CXXConstructor_isCopyConstructor(*cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXConstructor_isDefaultConstructor(CXCursor *cursor) {
|
||||||
|
return clang_CXXConstructor_isDefaultConstructor(*cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXConstructor_isMoveConstructor(CXCursor *cursor) {
|
||||||
|
return clang_CXXConstructor_isMoveConstructor(*cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXField_isMutable(CXCursor *cursor) { return clang_CXXField_isMutable(*cursor); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXMethod_isDefaulted(CXCursor *cursor) { return clang_CXXMethod_isDefaulted(*cursor); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXMethod_isDeleted(CXCursor *cursor) { return clang_CXXMethod_isDeleted(*cursor); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXMethod_isPureVirtual(CXCursor *cursor) { return clang_CXXMethod_isPureVirtual(*cursor); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXMethod_isStatic(CXCursor *cursor) { return clang_CXXMethod_isStatic(*cursor); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXMethod_isVirtual(CXCursor *cursor) { return clang_CXXMethod_isVirtual(*cursor); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXMethod_isCopyAssignmentOperator(CXCursor *cursor) {
|
||||||
|
return clang_CXXMethod_isCopyAssignmentOperator(*cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXMethod_isMoveAssignmentOperator(CXCursor *cursor) {
|
||||||
|
return clang_CXXMethod_isMoveAssignmentOperator(*cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXMethod_isExplicit(CXCursor *cursor) { return clang_CXXMethod_isExplicit(*cursor); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXRecord_isAbstract(CXCursor *cursor) { return clang_CXXRecord_isAbstract(*cursor); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_EnumDecl_isScoped(CXCursor *cursor) { return clang_EnumDecl_isScoped(*cursor); }
|
||||||
|
|
||||||
|
unsigned wrap_clang_CXXMethod_isConst(CXCursor *cursor) { return clang_CXXMethod_isConst(*cursor); }
|
||||||
|
|
||||||
|
CXTokenKind wrap_clang_getTokenKind(CXToken *token) { return clang_getTokenKind(*token); }
|
||||||
|
|
||||||
|
CXString wrap_clang_getTokenSpelling(CXTranslationUnit unit, CXToken *token) {
|
||||||
|
return clang_getTokenSpelling(unit, *token);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wrap_clang_tokenize(CXTranslationUnit unit, CXSourceRange *Range, CXToken **Tokens, unsigned *NumTokens) {
|
||||||
|
clang_tokenize(unit, *Range, Tokens, NumTokens);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned wrap_clang_visitChildren(CXCursor *parent, wrap_CXCursorVisitor visitor, CXClientData client_data) {
|
||||||
|
wrap_data data = {client_data, visitor};
|
||||||
|
return clang_visitChildren(*parent, wrap_visitor, CXClientData(&data));
|
||||||
|
}
|
||||||
|
|
||||||
|
int wrap_clang_Location_isInSystemHeader(CXSourceLocation *loc) { return clang_Location_isInSystemHeader(*loc); }
|
||||||
|
|
||||||
|
void wrap_clang_getSpellingLocation(CXSourceLocation *loc, CXFile *file, unsigned *line, unsigned *column,
|
||||||
|
unsigned *offset) {
|
||||||
|
clang_getSpellingLocation(*loc, file, line, column, offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void wrap_clang_getRangeStart(CXSourceRange *range, CXSourceLocation *loc) { *loc = clang_getRangeStart(*range); }
|
||||||
|
|
||||||
|
void wrap_clang_getRangeEnd(CXSourceRange *range, CXSourceLocation *loc) { *loc = clang_getRangeEnd(*range); }
|
||||||
|
|
||||||
|
} // extern "C"
|
||||||
7
c/clang/_wrap/llgo_check.cpp
Normal file
7
c/clang/_wrap/llgo_check.cpp
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <clang-c/Index.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
printf("sizeof(clang.Cursor) = %lu\n", sizeof(CXCursor));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
16
c/clang/_wrap/llgo_check.go
Normal file
16
c/clang/_wrap/llgo_check.go
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/goplus/llgo/c"
|
||||||
|
"github.com/goplus/llgo/c/clang"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
LLGoCFlags = "-I$(llvm-config --includedir)"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
c.Printf(c.Str("sizeof(clang.Cursor) = %lu\n"), unsafe.Sizeof(clang.Cursor{}))
|
||||||
|
}
|
||||||
@@ -38,13 +38,13 @@ type String struct {
|
|||||||
/**
|
/**
|
||||||
* Retrieve the character data associated with the given string.
|
* Retrieve the character data associated with the given string.
|
||||||
*/
|
*/
|
||||||
// llgo:link C.clang_getCString
|
// llgo:link String.CStr C.clang_getCString
|
||||||
func (String) CStr() *c.Char { return nil }
|
func (String) CStr() *c.Char { return nil }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free the given string.
|
* Free the given string.
|
||||||
*/
|
*/
|
||||||
// llgo:link C.clang_disposeString
|
// llgo:link String.Dispose C.clang_disposeString
|
||||||
func (String) Dispose() {}
|
func (String) Dispose() {}
|
||||||
|
|
||||||
type StringSet struct {
|
type StringSet struct {
|
||||||
@@ -55,5 +55,14 @@ type StringSet struct {
|
|||||||
/**
|
/**
|
||||||
* Free the given string set.
|
* Free the given string set.
|
||||||
*/
|
*/
|
||||||
// llgo:link C.clang_disposeStringSet
|
// llgo:link (*StringSet).Dispose C.clang_disposeStringSet
|
||||||
func (*StringSet) Dispose() {}
|
func (*StringSet) Dispose() {}
|
||||||
|
|
||||||
|
func GoString(clangStr String) (str string) {
|
||||||
|
defer clangStr.Dispose()
|
||||||
|
cstr := clangStr.CStr()
|
||||||
|
if cstr != nil {
|
||||||
|
str = c.GoString(cstr)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
2666
c/clang/clang.go
2666
c/clang/clang.go
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user