Compare commits

...

668 Commits

Author SHA1 Message Date
xushiwei
38a7f4f7d5 Merge pull request #888 from xushiwei/q
mv llcppg => github.com/goplus/llcppg
2024-11-27 17:35:50 +08:00
xushiwei
1605959a04 ci: rm Install llcppg 2024-11-27 17:24:12 +08:00
xushiwei
b837e0005a gogensig 2024-11-27 17:19:21 +08:00
xushiwei
58937a5366 mv llcppsigfetch,llcppsymg => github.com/goplus/llcppg 2024-11-27 17:17:40 +08:00
xushiwei
8562c03f80 mv llcppg => github.com/goplus/llcppg 2024-11-27 17:08:27 +08:00
xushiwei
1cd61b9169 Merge pull request #886 from visualfc/reflect.map
reflect: implement map
2024-11-27 14:12:56 +08:00
xushiwei
c69e289afe Merge pull request #887 from goplus/dependabot/go_modules/github.com/goplus/gogen-1.16.3
build(deps): bump github.com/goplus/gogen from 1.16.2 to 1.16.3
2024-11-27 14:12:31 +08:00
visualfc
91b46b05ad cl/_testgo/reflect: map demo 2024-11-27 11:31:28 +08:00
visualfc
2412760f1c internal/lib/reflect: makemap 2024-11-27 11:31:07 +08:00
dependabot[bot]
d83c5493c7 build(deps): bump github.com/goplus/gogen from 1.16.2 to 1.16.3
Bumps [github.com/goplus/gogen](https://github.com/goplus/gogen) from 1.16.2 to 1.16.3.
- [Release notes](https://github.com/goplus/gogen/releases)
- [Commits](https://github.com/goplus/gogen/compare/v1.16.2...v1.16.3)

---
updated-dependencies:
- dependency-name: github.com/goplus/gogen
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-27 03:26:05 +00:00
xushiwei
d041703dc6 Merge pull request #885 from cpunion/fix
fix: wrong llvm libs flag
2024-11-27 11:24:39 +08:00
visualfc
ecba13c38e internal/lib/reflect: use sync.Map 2024-11-27 10:33:22 +08:00
visualfc
cd3a4bb8c8 reflect: implement map 2024-11-26 20:45:01 +08:00
Li Jie
97f72b93e1 fix: wrong llvm libs flag 2024-11-26 16:08:29 +08:00
xushiwei
e93d57983e Merge pull request #884 from cpunion/unify-build
Unify cltest, llgen, gentests to build.Do
2024-11-26 15:58:06 +08:00
Li Jie
43c4a3bfdc test: enable debug testing 2024-11-26 15:43:34 +08:00
Li Jie
954cc0e8bc test: ignore syncmap since different pthread_mutex_t size on macOS and linux 2024-11-26 13:21:33 +08:00
Li Jie
ad48325dff test: regenerate test fixtures 2024-11-26 13:21:01 +08:00
Li Jie
fa1ad20d5d ffi: fix ci and install doc 2024-11-26 13:19:02 +08:00
Li Jie
0547dede21 cpp: fix ldflags of llvm 2024-11-26 13:19:02 +08:00
Li Jie
284ae23db2 doc: install missing libsqlite3-dev 2024-11-26 13:19:02 +08:00
Li Jie
9105f28c13 ci: don't install pkg-config explicitly 2024-11-26 13:18:59 +08:00
Li Jie
06cc43b11f test: test dirs under _demo only has *.go files 2024-11-26 13:17:36 +08:00
Li Jie
d879d0d924 build: make llgen, cltest, gentests call build.Do 2024-11-26 13:17:36 +08:00
xushiwei
25bc84817a Merge pull request #880 from visualfc/valist
ssa: closure use org signature
2024-11-26 13:02:30 +08:00
visualfc
8fb0dfad94 ssa: abiNamed use NameOf 2024-11-26 12:46:11 +08:00
visualfc
c2138037d2 internal/lib/reflect: call variadic check 2024-11-26 12:46:11 +08:00
visualfc
fadd64c1e9 ssa: cvtClosure remove closureCtx param 2024-11-26 12:46:11 +08:00
visualfc
4552691aed ssa: toLLVMFunc by NameValist 2024-11-26 12:46:11 +08:00
xushiwei
bab5c0589f Merge pull request #883 from luoliwoshang/ci/llcppg
ci:install llcppg dependent
2024-11-26 12:44:31 +08:00
luoliwoshang
2a2c614eb4 ci:remove pre-install pkg-config 2024-11-26 11:52:35 +08:00
luoliwoshang
12529ec81e ci:install llcppg dependent 2024-11-26 11:13:25 +08:00
luoliwoshang
0179609a49 ci:trigger for sub-repositories 2024-11-26 10:56:37 +08:00
xushiwei
860c551aa6 Merge pull request #876 from cpunion/fix-demo-test
Enable demo test
2024-11-25 12:15:33 +08:00
Li Jie
1ba3474a5a lib: impl syscall.Faccesat 2024-11-25 12:05:12 +08:00
Li Jie
f26c283541 ci: enable demo result checking 2024-11-25 12:05:12 +08:00
Li Jie
56e9dab2ce ci: test demo with python 3.12 2024-11-25 12:05:12 +08:00
Li Jie
b1fcae5cec cgo: only scan non-directories and ignore *_test.c 2024-11-25 12:05:12 +08:00
xushiwei
93245ac37a Merge pull request #879 from cpunion/fix-type-patching
Fix type patching
2024-11-25 11:52:48 +08:00
Li Jie
3f795e44c7 demo: sizeof sync.Mutex 2024-11-25 11:36:26 +08:00
Li Jie
e732e5158e cl: fix package patching 2024-11-25 11:36:26 +08:00
xushiwei
2f5c033f09 Merge pull request #878 from cpunion/update-code-gen
test: update generated code
2024-11-25 11:32:17 +08:00
Li Jie
6099369019 test: update generated code 2024-11-25 11:18:46 +08:00
xushiwei
8d2b65386c Merge pull request #874 from cpunion/fix-closure
ssa: fix wrong reflect type of closure
2024-11-25 11:05:04 +08:00
xushiwei
ed835225cf Merge pull request #875 from cpunion/fix-alloc-in-loop
Reduce alloca
2024-11-25 10:54:28 +08:00
Li Jie
43c1bc8d5f ssa: compile go string constant without alloca 2024-11-24 15:29:20 +08:00
Li Jie
17832fe18c ssa: fix type of ChanOp.Size 2024-11-24 15:21:32 +08:00
Li Jie
252f3f0bd6 ssa: fix closure type 2024-11-24 10:54:00 +08:00
xushiwei
e042aad819 Merge pull request #873 from luoliwoshang/workflow/pkgconf
ci: remove pre-installed pkg-config
2024-11-23 19:41:13 +08:00
luoliwoshang
9966daf0cf ci: remove pre-installed pkg-config 2024-11-23 19:27:11 +08:00
xushiwei
daf5e9cccf Merge pull request #871 from luoliwoshang/doc/ssizet
doc:ssize_t
2024-11-22 23:13:39 +08:00
xushiwei
bf63d731d3 Merge pull request #870 from luoliwoshang/llcppsigfetch/otherdefinetype
llcppsigfetch:typedef refer same struct & remove tokenize check for underlying
2024-11-22 23:12:34 +08:00
luoliwoshang
12abfc0fcf doc:ssize_t 2024-11-21 21:38:11 +08:00
xushiwei
dea1b520f7 Merge pull request #852 from visualfc/reflect.func
internal/lib/reflect: support method call
2024-11-21 07:42:18 +08:00
luoliwoshang
a5c268491e llcppsigfetch: test typedef anonymous enum with multiple type names 2024-11-20 17:56:44 +08:00
luoliwoshang
bf34f553bb llcppsigfetch:typedef refer same anony struct & fix typedef 's underlying token out of bound 2024-11-20 16:58:18 +08:00
luoliwoshang
97c61404ca llcppsigfetch:test config 2024-11-20 14:09:58 +08:00
visualfc
c40d9f54a2 internal/lib/reflect: value.call support multi ret 2024-11-19 20:51:08 +08:00
visualfc
5e08593358 internal/lib/reflect: toFFIArg check interface 2024-11-19 20:51:08 +08:00
visualfc
1f06b12f86 internal/lib/reflect: toFFIArg 2024-11-19 20:51:08 +08:00
visualfc
c7351f724e internal/lib/reflect: toFFIType 2024-11-19 20:51:08 +08:00
visualfc
1851bce497 internal/lib/reflect: Value.InterfaceData 2024-11-19 20:51:08 +08:00
visualfc
5fb8503fd2 internal/lib/reflect: Value.IsZero 2024-11-19 20:51:08 +08:00
visualfc
792716eefc internal/lib/reflect: Value.SetZero 2024-11-19 20:51:08 +08:00
visualfc
15a6c779b8 internal/lib/reflect: Value.New 2024-11-19 20:51:08 +08:00
visualfc
93d24e7106 internal/lib/reflect: Value.UnsafePointer 2024-11-19 20:51:08 +08:00
visualfc
b8a185c112 internal/lib/reflect: Value.Slice Value.Slice3 2024-11-19 20:51:08 +08:00
visualfc
e242e65569 internal/lib/reflect: Value.SetLen Value.SetCap 2024-11-19 20:51:08 +08:00
visualfc
62ab33a434 internal/lib/reflect: Value.Len Value.Cap 2024-11-19 20:51:08 +08:00
visualfc
f403916ef8 internal/lib/reflect: Value.bytesSlow 2024-11-19 20:51:08 +08:00
visualfc
38f1585ac6 internal/lib/reflect: Value.Float Value.Bool 2024-11-19 20:51:08 +08:00
visualfc
1f757270d9 internal/lib/reflect: impl Value.Field 2024-11-19 20:51:08 +08:00
visualfc
e6de8401bf internal/lib/reflect: makeMethodValue 2024-11-19 20:51:08 +08:00
visualfc
df2e34ac51 internal/lib/reflect: call.method 2024-11-19 20:51:08 +08:00
visualfc
7bbd3a7e36 internal/lib/reflect: TypeOf check closure 2024-11-19 20:51:07 +08:00
visualfc
85a736d49b internal/lib/reflect: closure keep orgtype 2024-11-19 20:51:07 +08:00
xushiwei
f9eb313f7c Merge pull request #869 from cpunion/fix-linking
Fix linking args, force doc test run on current ref
2024-11-19 17:46:14 +08:00
Li Jie
9cec486a1b build: compatible spaces in path outputted from pkg-config 2024-11-19 16:43:45 +08:00
Li Jie
7734c654a7 doc: make doc test use current ref 2024-11-19 10:50:49 +08:00
Li Jie
8e5fff6c5f build: fix linking args and llgo install 2024-11-19 10:50:45 +08:00
xushiwei
faa9a740db Merge pull request #866 from cpunion/cgo
Full cgo support
2024-11-16 05:33:16 +08:00
xushiwei
70e39e9902 Merge pull request #867 from luoliwoshang/c/clang/file2loc
c/clang:file to loc
2024-11-16 05:31:22 +08:00
Li Jie
9f0b3963cb cgo: support full cgo tags 2024-11-15 16:08:24 +08:00
xushiwei
7ec2ce851c Merge pull request #868 from goplus/dependabot/github_actions/codecov/codecov-action-5
build(deps): bump codecov/codecov-action from 4 to 5
2024-11-15 12:54:29 +08:00
dependabot[bot]
94ee4223d2 build(deps): bump codecov/codecov-action from 4 to 5
Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5.
- [Release notes](https://github.com/codecov/codecov-action/releases)
- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codecov/codecov-action/compare/v4...v5)

---
updated-dependencies:
- dependency-name: codecov/codecov-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-15 00:23:06 +00:00
Li Jie
a64f4219e9 cgo: full supports cgo preambles and auto compile c files 2024-11-14 23:44:25 +08:00
luoliwoshang
78e96cc312 c/clang:file to loc 2024-11-14 14:31:20 +08:00
Li Jie
89b111edca cgo: examples 2024-11-13 20:32:12 +08:00
Li Jie
ec38943c53 cl: compile cgo 2024-11-13 20:32:08 +08:00
xushiwei
ea654ef235 Merge pull request #865 from luoliwoshang/clang/include
clang:included & system header
2024-11-12 22:48:58 +08:00
luoliwoshang
288b705450 clang:included & system header 2024-11-12 20:26:33 +08:00
xushiwei
73ca579056 Merge pull request #863 from tsingbx/llcppsigfetch/c.Printf
fix llcppsigfetch: invalid memory address or nil pointer dereference
2024-11-12 15:29:38 +08:00
xushiwei
8b5d7dc181 Merge pull request #859 from goplus/dependabot/github_actions/actions/setup-go-5
build(deps): bump actions/setup-go from 4 to 5
2024-11-12 10:53:14 +08:00
xushiwei
f05f6294cd Merge pull request #861 from goplus/dependabot/go_modules/github.com/goplus/gogen-1.16.2
build(deps): bump github.com/goplus/gogen from 1.16.1 to 1.16.2
2024-11-12 10:52:55 +08:00
tsingbx
b2c466cf3f fix llcppsigfetch: invalid memory address or nil pointer dereference 2024-11-12 09:37:22 +08:00
dependabot[bot]
da1b9a0e91 build(deps): bump github.com/goplus/gogen from 1.16.1 to 1.16.2
Bumps [github.com/goplus/gogen](https://github.com/goplus/gogen) from 1.16.1 to 1.16.2.
- [Release notes](https://github.com/goplus/gogen/releases)
- [Commits](https://github.com/goplus/gogen/compare/v1.16.1...v1.16.2)

---
updated-dependencies:
- dependency-name: github.com/goplus/gogen
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-11 00:38:39 +00:00
dependabot[bot]
6cbb5a9215 build(deps): bump actions/setup-go from 4 to 5
Bumps [actions/setup-go](https://github.com/actions/setup-go) from 4 to 5.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](https://github.com/actions/setup-go/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-11 00:36:37 +00:00
xushiwei
cfdbb86bfa Merge pull request #856 from cpunion/doc-and-fmt-test
Make docs testable
2024-11-08 16:34:21 +08:00
Li Jie
d61783b2c0 doc: install numpy in virtualenv to run test 2024-11-07 11:34:58 +08:00
Li Jie
65c1e1b9e5 ci: build chore/_xtool/... 2024-11-07 11:03:07 +08:00
Li Jie
17d509a45a doc: make doc testable 2024-11-07 11:03:01 +08:00
Li Jie
c7649766fd c: fix format 2024-11-07 09:47:22 +08:00
xushiwei
c0ec5e53ba Merge pull request #855 from luoliwoshang/libffi
workflow:libffi
2024-11-07 08:01:05 +08:00
xushiwei
a0a18017e8 Merge pull request #851 from luoliwoshang/c/clang/sliceran
c/clang:demo common iterate
2024-11-07 08:00:11 +08:00
xushiwei
411b84fcc2 Merge pull request #854 from luoliwoshang/c/clang/loc2cursor
c/clang:location to cursor
2024-11-07 07:59:43 +08:00
xushiwei
e499eeb8cc Merge pull request #857 from cpunion/fix-pydump
chore: fix types error in pydump
2024-11-07 07:59:15 +08:00
Li Jie
803d1de5db chore: fix types error in pydump 2024-11-06 11:30:35 +08:00
luoliwoshang
fc8117c8e7 workflow:libffi 2024-11-05 17:15:20 +08:00
luoliwoshang
8bef0ede1b c/clang:location to cursor 2024-11-04 15:50:05 +08:00
luoliwoshang
88128cde48 c/clang:demo common iterate 2024-11-04 09:55:35 +08:00
xushiwei
d0217e62f0 Merge pull request #850 from luoliwoshang/ssa/slicelen
ssa:fit unsafe.slice int size
2024-11-04 06:49:34 +08:00
xushiwei
bba680b636 Merge pull request #849 from luoliwoshang/c/clang/visitinclude
c/clang:include
2024-11-04 06:45:27 +08:00
luoliwoshang
feb914b5c4 ssa:fit slice int size 2024-11-01 19:54:44 +08:00
luoliwoshang
0a65ea34f3 c/clang:include 2024-11-01 18:49:48 +08:00
xushiwei
bf299edfc7 Merge pull request #847 from visualfc/reflect.call
[WIP]  internal/lib/reflect: implement reflect.call
2024-11-01 17:41:57 +08:00
visualfc
6b0122547e reflect.call: internal/abi: TFlagClosure, internal/lib/reflect: flagClosure. 2024-11-01 15:27:40 +08:00
xushiwei
88c0e149b5 Merge pull request #793 from visualfc/abitypes
ssa: fix gocvt named recurs for typeargs. support sync.Map
2024-10-30 22:00:22 +08:00
visualfc
38091b2021 ssa: func Instantiate 2024-10-30 21:39:30 +08:00
visualfc
ce87f293aa ssa: fix map key has typeargs 2024-10-30 20:22:05 +08:00
visualfc
dca028a84f ssa: fix goTypes.cvtNamed recurs for typeargs 2024-10-30 20:22:05 +08:00
visualfc
be3c4ab24a ssa: cache types named in runtime 2024-10-30 20:22:05 +08:00
xushiwei
67c9a14902 Merge pull request #846 from visualfc/closureiface
ssa: fix closure type
2024-10-30 11:02:43 +08:00
visualfc
014bdb795f ssa: program.Closure, removeCtx for MakeClosure 2024-10-30 10:42:32 +08:00
visualfc
df7e8b2e64 cl/cltest: TestCompileEx check debug flag 2024-10-30 10:18:58 +08:00
visualfc
2b5fdd3548 ssa: fix closure type 2024-10-29 20:50:02 +08:00
xushiwei
e92a0eb901 Merge pull request #806 from cpunion/llvm-debug
Debug: fix struct vars debug, params modication, supports expressions, lexical scope/lifecycle
2024-10-29 11:09:00 +08:00
xushiwei
e72a67f5de Merge pull request #788 from luoliwoshang/llcppsymg/classname
llcppsymg:refine class fetch,test case,-v
2024-10-28 11:00:55 +08:00
xushiwei
65dc291ff5 Merge pull request #812 from luoliwoshang/llcppsigfetch/refine
llcppsigfetch:cross-platform,log,fix bugs
2024-10-28 10:54:33 +08:00
xushiwei
0bfc190a86 Merge pull request #845 from goplus/dependabot/go_modules/github.com/goplus/gogen-1.16.1
build(deps): bump github.com/goplus/gogen from 1.16.0 to 1.16.1
2024-10-28 10:53:47 +08:00
dependabot[bot]
f8303f2e7a build(deps): bump github.com/goplus/gogen from 1.16.0 to 1.16.1
Bumps [github.com/goplus/gogen](https://github.com/goplus/gogen) from 1.16.0 to 1.16.1.
- [Release notes](https://github.com/goplus/gogen/releases)
- [Commits](https://github.com/goplus/gogen/compare/v1.16.0...v1.16.1)

---
updated-dependencies:
- dependency-name: github.com/goplus/gogen
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-28 00:44:02 +00:00
张之阳
8ad72b167c Merge pull request #124 from luoliwoshang/llcppsymg/underprefix
llcppsymg:underprefix
2024-10-26 18:56:56 +08:00
luoliwoshang
7747082ae8 llcppsymg:remove one leading underscore only in mac 2024-10-26 18:43:14 +08:00
luoliwoshang
a7727adca2 llcppsigfetch:remove one leading underscore only in mac 2024-10-26 13:09:30 +08:00
xushiwei
028b53816d Merge pull request #844 from luoliwoshang/c/clang/reference
c/clang:referenced
2024-10-25 11:41:40 +08:00
张之阳
5a77117a9b Merge pull request #116 from luoliwoshang/llcppsigfetch/enum_anony
llcppsigfetch:anonymous enumdecl
2024-10-24 17:50:09 +08:00
luoliwoshang
05777019c8 llcppsigfetch:anony enum 2024-10-24 17:46:33 +08:00
luoliwoshang
7ebaad5099 c/clang:referenced 2024-10-24 09:46:52 +08:00
张之阳
09885c8f41 Merge pull request #112 from luoliwoshang/llcppsigfetch/closure
llcppsigfetch:use closure refine collection
2024-10-23 16:06:28 +08:00
luoliwoshang
4f5ebb279d llcppsigfetch:refine field collection 2024-10-23 16:02:39 +08:00
luoliwoshang
91ebf88c97 llcppsigfetch:use fmt to log because linux nil defer of log 2024-10-23 15:44:41 +08:00
luoliwoshang
a608c51e36 llcppsigfetch:fix fopen's return type nil 2024-10-23 15:44:41 +08:00
luoliwoshang
3877dcf83a llcppsigfetch:refine log out 2024-10-23 15:44:41 +08:00
luoliwoshang
72d176b77a llcppsigfetch:-v 2024-10-23 15:44:41 +08:00
luoliwoshang
8840968e07 llcppsigfetch:refine args parse 2024-10-23 15:44:41 +08:00
luoliwoshang
b6b889bff6 llcppsigfetch:remove leading underscores 2024-10-23 15:44:41 +08:00
luoliwoshang
a30bdcbb50 gogensig:unsigned & signed char 2024-10-23 15:44:41 +08:00
luoliwoshang
82275d49a6 llcppg:pipe writer close 2024-10-23 15:44:41 +08:00
luoliwoshang
ee335de222 llcppsigfetch:use stdin 2024-10-23 15:44:41 +08:00
luoliwoshang
01bf7c8c38 llcppsymg & llcppsigfetch parse args 2024-10-23 15:44:41 +08:00
xushiwei
5529a1b0b3 Merge pull request #842 from visualfc/libffi
[WIP] c/ffi x/ffi: import libffi
2024-10-23 14:44:57 +08:00
visualfc
363be18599 x/ffi: wrap c/ffi 2024-10-23 11:44:34 +08:00
xushiwei
ae8ad3b68b Merge pull request #837 from cpunion/const-conv
ssa: fix int constant type conversion
2024-10-23 10:58:08 +08:00
xushiwei
348b850e36 Merge pull request #838 from cpunion/unsafe-fix
fix unsafe
2024-10-23 10:57:22 +08:00
visualfc
92c267758e c/ffi: add _demo 2024-10-23 10:53:18 +08:00
visualfc
b7d1ab6105 c/ffi: import libffi 2024-10-23 10:53:18 +08:00
xushiwei
f7f1b4f594 Merge pull request #775 from visualfc/freevars
cl: function fix freevars cache
2024-10-23 10:49:51 +08:00
xushiwei
6492bea846 Merge pull request #824 from visualfc/chkabi
ssa: abi check interface method
2024-10-23 10:45:06 +08:00
Li Jie
b1cb89b0c2 test: unsafe.{Add, Alignof, Offsetof, String, StringData, SliceData, Slice} 2024-10-21 18:53:05 +08:00
Li Jie
7ecd98b0a0 ssa: fix type of unsafe.SliceData 2024-10-21 18:53:00 +08:00
Li Jie
7d7d4db329 ssa: fix int constant type conversion 2024-10-21 18:50:32 +08:00
luoliwoshang
e6bfe1fc88 llcppsymg:refine args 2024-10-21 18:48:56 +08:00
luoliwoshang
151d3a9610 llcppsymg:libs,cflags parse 2024-10-21 18:48:56 +08:00
luoliwoshang
905ed36afd llcppsymg:symbol debug log 2024-10-21 18:48:56 +08:00
luoliwoshang
7fe9c9366e llcppsymg:linux sys path 2024-10-21 18:48:56 +08:00
luoliwoshang
d5237d1a07 llcppsymg:multiple dylib path search 2024-10-21 18:48:56 +08:00
luoliwoshang
7bd3b29a11 llcppsymg:remove leading underscores 2024-10-21 18:48:56 +08:00
luoliwoshang
60aa74257f chore:remove folder 2024-10-21 18:48:56 +08:00
luoliwoshang
ca0492d997 llcppsymg:config & clangutil test
llcppsymg:clangutil test
2024-10-21 18:48:56 +08:00
luoliwoshang
944133de6e llcppsymg:symbol generate test
llcppsymg:symbo test

llcppsymg:exist symb file test

llcppsymg:GenSymbolTabledata

llcppsymg:GenSymbolTableData test

llcppsymg:full symg operation test
2024-10-21 18:48:56 +08:00
luoliwoshang
174fdd40da llcppsymg:refine dylib parse 2024-10-21 18:48:56 +08:00
luoliwoshang
ffa823f748 llcppsymg:gendylib path test
llcppsymg:headerpath test
2024-10-21 18:48:56 +08:00
luoliwoshang
a83f7a822e llcppsymg:refine logic & parse symbol test 2024-10-21 18:48:56 +08:00
luoliwoshang
29d527bee1 llcppsymg:refine classname fetch 2024-10-21 18:48:56 +08:00
luoliwoshang
75e282c2ac llcppsymg & llcppsigfetch parse args 2024-10-21 18:46:57 +08:00
xushiwei
8419d9114b Merge pull request #839 from cpunion/fix-gh-action
ci: fix python deps install
2024-10-21 18:41:33 +08:00
Li Jie
1c414af7b9 ci: instead pip3 with pip3.12 2024-10-21 18:34:44 +08:00
Li Jie
834e8c64c5 ssa: unsafe.Add 2024-10-21 17:31:58 +08:00
xushiwei
1b3bb86546 Merge pull request #828 from luoliwoshang/os/errno
os:fix os.Errno 's nil pointer derefer in linux
2024-10-21 13:44:56 +08:00
xushiwei
aa560f42e7 Merge pull request #833 from visualfc/funcaddr
cl: instr funcAddr support typec funclit
2024-10-19 16:06:32 +08:00
visualfc
4e69cd28cd cl: instr funcAddr support typec funclit 2024-10-17 20:30:39 +08:00
xushiwei
5f0e30e17a Merge pull request #829 from luoliwoshang/xtool/nm
xtool/nm:flags option & symbol version
2024-10-16 18:11:40 +08:00
luoliwoshang
d682771c35 xtool/nm:symbol version 2024-10-15 15:29:30 +08:00
luoliwoshang
ace3c3e421 nmdump:flags option 2024-10-15 12:01:42 +08:00
luoliwoshang
94005b0c22 xtool/nm:flags option 2024-10-15 10:40:25 +08:00
luoliwoshang
e9177c8932 os/errno:fix os.Errno 's nil pointer derefer in linux 2024-10-12 16:30:14 +08:00
visualfc
d62c2d913e ssa: abi check interface method 2024-10-12 15:59:10 +08:00
xushiwei
9ea88fe247 Merge pull request #827 from luoliwoshang/os/stat
[wip] os:correct error of noexist file & os.Error 's nil pointer dereference in linux
2024-10-12 11:28:32 +08:00
xushiwei
e0867a5d11 Merge pull request #826 from visualfc/reflect_value
internal/lib/reflect: fix valueInterface
2024-10-12 11:27:20 +08:00
luoliwoshang
ae91101ea1 os:correct error of noexist file 2024-10-11 16:22:14 +08:00
visualfc
515057c41a internal/lib/reflect: Value.Type 2024-10-11 09:14:36 +08:00
visualfc
d946ba426e internal/lib/reflect: fix valueInterface 2024-10-11 07:43:46 +08:00
xushiwei
07874cf77f Merge pull request #816 from luoliwoshang/c/lua/debug
c/lua:debug
2024-10-10 15:31:48 +08:00
xushiwei
1d9f9e838b Merge pull request #817 from cpunion/remove-inline-py-methods
py: remove static methods
2024-10-10 15:31:01 +08:00
xushiwei
101691e970 Merge pull request #822 from goplus/dependabot/github_actions/thollander/actions-comment-pull-request-3
build(deps): bump thollander/actions-comment-pull-request from 2 to 3
2024-10-10 15:30:05 +08:00
dependabot[bot]
e2498c31ea build(deps): bump thollander/actions-comment-pull-request from 2 to 3
Bumps [thollander/actions-comment-pull-request](https://github.com/thollander/actions-comment-pull-request) from 2 to 3.
- [Release notes](https://github.com/thollander/actions-comment-pull-request/releases)
- [Commits](https://github.com/thollander/actions-comment-pull-request/compare/v2...v3)

---
updated-dependencies:
- dependency-name: thollander/actions-comment-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-10 00:34:41 +00:00
Li Jie
9d8c6122cc py: remove inline methods 2024-10-05 23:10:00 +08:00
Li Jie
227dda38a2 lldb: fix slice index expression 2024-10-05 17:46:54 +08:00
luoliwoshang
e2091413ea c/lua:extraspace 2024-10-04 15:37:28 +08:00
luoliwoshang
4976e82f0f c/lua:debug 2024-10-04 15:37:28 +08:00
xushiwei
5e949d2c6f Merge pull request #809 from visualfc/maplen
runtime: fix map len and chan len/cap
2024-10-04 11:34:49 +08:00
xushiwei
fec7688241 Merge pull request #810 from visualfc/py
py: remove llgo_autogen.lla
2024-10-01 06:07:04 +08:00
Li Jie
2732f6036e debug: refactor test script 2024-09-30 16:38:37 +08:00
Li Jie
387c44031a ci: show lldb tests details 2024-09-30 16:38:37 +08:00
Li Jie
6cbd1c5fb1 debug: switch scope test 2024-09-30 16:38:37 +08:00
Li Jie
447b9e1ea7 debug: disable failed tests 2024-09-30 16:38:25 +08:00
Li Jie
be08bcaafc debug: compile to dwarf-4 2024-09-30 15:22:38 +08:00
Li Jie
1b5e8e0181 ci: return non-zero if run lldb tests failed 2024-09-30 15:10:12 +08:00
visualfc
d2ffbd0395 cl: function fix freevars cache 2024-09-30 10:29:38 +08:00
Li Jie
88cb607975 debug: supports scope (if, for) 2024-09-30 10:15:47 +08:00
Li Jie
e392956e2a debug: fix basic types 2024-09-27 21:36:12 +08:00
Li Jie
3028081fa2 chore: fix exit code in runtest.sh 2024-09-27 21:36:12 +08:00
Li Jie
4003c59471 ssa: debug info types.Named -> typedef 2024-09-27 21:36:12 +08:00
Li Jie
2e042f0c59 lldb: fix struct vars debugging 2024-09-27 21:36:08 +08:00
visualfc
9a4238d4e2 py: remove llgo_autogen.lla 2024-09-27 10:37:41 +08:00
visualfc
c184dc8d2f runtime: fix map len and chan len/cap 2024-09-25 20:51:58 +08:00
xushiwei
32f41a04ac Merge pull request #757 from luoliwoshang/llcppg/ast/mangle
llcppg/ast:func mangle name
2024-09-25 11:05:06 +08:00
xushiwei
4b8174f75a Merge pull request #803 from luoliwoshang/llcppsigfetch/output
llcppsigfetch:refine
2024-09-24 19:08:53 +08:00
luoliwoshang
313e14bc54 llcppsigfetch:refine mock gettype 2024-09-24 15:09:03 +08:00
luoliwoshang
7aca31992b llcppsigfetch:reuse clangutil 2024-09-24 14:43:33 +08:00
Li Jie
56f53e508f lldb: add more tests 2024-09-24 14:18:32 +08:00
Li Jie
6c18dc63aa build: enable ssa.GlobalDebug when LLGO_DEBUG=1 enabled, enable ssa.NaiveForm when LLGO_OPTIMIZED=0 2024-09-24 14:16:49 +08:00
luoliwoshang
7b498065b5 llcppsigfetch:use the closure in visitTop & enumtype 2024-09-24 12:22:01 +08:00
luoliwoshang
81bd225ff7 llcppsigfetch:keep line break 2024-09-24 11:26:34 +08:00
luoliwoshang
074090a0aa llcppsigfetch:config the output 2024-09-24 11:26:34 +08:00
Li Jie
3fcbcca8e4 lldb: fix log output when exit 2024-09-23 21:14:26 +08:00
xushiwei
dbaf12b043 Merge pull request #769 from visualfc/lib_reflect
[wip] lib reflect
2024-09-23 00:37:28 +08:00
visualfc
9eb9b48534 internal/lib/reflect: type.Field FieldByIndex FieldByName 2024-09-22 20:56:15 +08:00
visualfc
e085fd1d57 internal/lib/reflect: type.Name type.Elem 2024-09-22 20:44:57 +08:00
visualfc
9cc71b320b internal/lib/reflect: type.method 2024-09-22 20:44:55 +08:00
visualfc
7b74cf1ab9 internal/lib/reflect: interface.method 2024-09-22 20:43:40 +08:00
visualfc
fb0c0e07f7 internal/lib/reflect: reflect.pointer 2024-09-22 20:43:40 +08:00
Li Jie
c6bb4a23ae ssa: add debug info of function return type 2024-09-22 17:43:31 +08:00
Li Jie
70e271959b lldb: fix runlldb.sh to load llgo plugin 2024-09-22 14:57:21 +08:00
Li Jie
379abeb262 lldb: support expression includes dereference, parentheses 2024-09-22 14:57:16 +08:00
xushiwei
9e884847b1 Merge pull request #794 from cpunion/llvm-debug
ssa: add llvm debug info
2024-09-22 12:08:16 +08:00
Li Jie
5dadf9a087 lldb: skip some fail cases 2024-09-22 11:52:26 +08:00
Li Jie
c0630b782a ci: run lldb test 2024-09-22 11:52:26 +08:00
Li Jie
62beb73aa2 x 2024-09-22 11:52:26 +08:00
Li Jie
7b6fe0159f lldb: fix shellcheck warning 2024-09-22 11:52:26 +08:00
Li Jie
dad22b1686 cl: switch debug symbols with LLGO_DEBUG 2024-09-22 11:52:23 +08:00
xushiwei
a715a51865 Merge pull request #780 from luoliwoshang/llcppsymg/language
llcppsymg:parse c / c++ &  output  func proto
2024-09-22 08:03:19 +08:00
xushiwei
d4ec2319f9 Merge pull request #683 from luoliwoshang/llcppsigfetch/basic
llcppsigfetch
2024-09-22 07:58:35 +08:00
Li Jie
88b980ac17 lldb: refactor plugin and test scripts 2024-09-21 10:03:49 +08:00
Li Jie
867c01d5e8 ssa: clean 2024-09-21 09:10:08 +08:00
luoliwoshang
c8a064af3e llcppsigfetch:handle unexpect tag 2024-09-21 01:52:19 +08:00
Li Jie
12439f2b99 lldb: debug info test, lldb plugin, readme 2024-09-21 00:11:06 +08:00
Li Jie
fb47ea301f lldb: set llvm.ident to "LLGo Compiler" 2024-09-20 23:40:58 +08:00
Li Jie
6adecbd7aa lldb: add llgo plugin 2024-09-20 23:40:13 +08:00
Li Jie
f71e34fd9f ssa: fix function and global var debug info scope 2024-09-20 17:14:27 +08:00
xushiwei
dfe89588f0 Merge pull request #787 from luoliwoshang/llcppsymg/filter
llcppsymg:filter public method
2024-09-20 15:51:57 +08:00
Li Jie
d89b68a279 cl: don't declare var of ssa.Alloc and ssa.FieldAddr 2024-09-20 12:20:46 +08:00
Li Jie
2a4a01cb7b lldb test: test params 2024-09-20 10:21:37 +08:00
luoliwoshang
c81b7f6bb4 llcppsymg:to camel 2024-09-20 10:16:00 +08:00
Li Jie
0c11afad7a lldb test: clean 2024-09-19 21:49:41 +08:00
Li Jie
d6b26c9975 lldb test: ctrl+d to next interactive, ctrl+c to break 2024-09-19 21:45:39 +08:00
Li Jie
98c628f3eb lldb test: fix formatting 2024-09-19 21:45:34 +08:00
Li Jie
36b2026075 run lldb tests 2024-09-19 20:31:05 +08:00
Li Jie
7c535ff1a3 ssa: complex type name 2024-09-19 20:24:01 +08:00
xushiwei
c6436ea6d1 Merge pull request #800 from hackerchai/feat/c-libuv-thread
feat(c/libuv): Implement thread related funcs
2024-09-19 18:52:35 +08:00
xushiwei
5a8dee3cbe Merge pull request #799 from hackerchai/fix/c-libuv-loop
fix(c/libuv): Add missing essential funcs for uv_loop_t & uv_req_t
2024-09-19 18:50:12 +08:00
xushiwei
d9450d6e12 Merge pull request #798 from spongehah/c/sysconf
c/sysconf
2024-09-19 18:48:41 +08:00
hackerchai
80377b3705 feat(c/libuv): Implement thread related funcs
Signed-off-by: hackerchai <i@hackerchai.com>
2024-09-19 18:44:38 +08:00
hackerchai
847a76b3a2 fix(c/libuv): Add missing essential funcs for uv_loop_t & uv_req_t
Signed-off-by: hackerchai <i@hackerchai.com>
2024-09-19 18:42:31 +08:00
luoliwoshang
2c3d46bb80 llcppsigfetch:order output 2024-09-19 16:49:05 +08:00
luoliwoshang
e0cb6d4531 llcppsigfetch:output fileset 2024-09-19 15:35:42 +08:00
luoliwoshang
78f0177ac4 llcppsymg:use clang's displayname with semantic parent to construct func proto for c/c++ 2024-09-19 14:33:53 +08:00
luoliwoshang
4688434c08 llcppsymg:parse with language config 2024-09-19 14:33:53 +08:00
luoliwoshang
8913eeb1c1 llcppsymg:translation unit util 2024-09-19 14:33:53 +08:00
Li Jie
75574e97cc ssa: fix debug info of local vars 2024-09-19 10:29:11 +08:00
Li Jie
f4089bc164 ssa: struct debug info creation supports resursive 2024-09-19 09:45:26 +08:00
Li Jie
b0f04d91bf cl: fix dbg.declare (and local var) 2024-09-18 23:47:48 +08:00
Li Jie
3b514d194c ssa: remove unused 2024-09-18 23:27:54 +08:00
Li Jie
3ba405383e ssa: fix type name of debug info 2024-09-18 23:04:09 +08:00
Li Jie
87f6c8087f ssa: debug info of global variable 2024-09-18 22:17:49 +08:00
Li Jie
90a83c8f11 ssa: debug info of function/closure 2024-09-18 21:14:04 +08:00
Li Jie
27f892a14b ssa: debug info of chan 2024-09-18 21:14:04 +08:00
Li Jie
bf4525d82d ssa: debug info of Map 2024-09-18 21:14:04 +08:00
Li Jie
6bfb1a7fff ssa: debug info of interface 2024-09-18 21:14:04 +08:00
Li Jie
a53ab7438c ssa: debug info of Array and Slice 2024-09-18 21:14:04 +08:00
Li Jie
d85a080f9b ssa: support string and pointer debug info, fix params debugging 2024-09-18 21:14:04 +08:00
Li Jie
4dbfc9483e support complex debug info 2024-09-18 21:14:04 +08:00
Li Jie
53097ab183 fix debug info of struct parameter, 2024-09-18 21:14:04 +08:00
Li Jie
9978a370f1 x 2024-09-18 21:14:04 +08:00
Li Jie
24995f46cb debug test cover more types 2024-09-18 21:14:04 +08:00
Li Jie
7ddc8c6aeb increase coverage rate 2024-09-18 21:14:04 +08:00
Li Jie
4a447f5c12 cover integers, floats, bool, array, complex 2024-09-18 21:14:04 +08:00
Li Jie
e56647f24d remove unused DILexicalBlock 2024-09-18 21:14:04 +08:00
Li Jie
25238b53c9 hide llvm types on DIBuilder methods 2024-09-18 21:14:04 +08:00
Li Jie
1ed798342a move debug test into _testdata 2024-09-18 21:14:04 +08:00
Li Jie
1d6eb07c62 generate debug with dwarf language C 2024-09-18 21:14:04 +08:00
Li Jie
8e3d76b7ea gentests and cltest supports flags.txt (currently just -dbg used) 2024-09-18 21:14:04 +08:00
Li Jie
d8838503b2 generate llvm.dbg.value 2024-09-18 21:14:04 +08:00
Li Jie
78b7742354 fix argNo with 1-based index 2024-09-18 21:14:04 +08:00
Li Jie
3d9dca47b8 fix dwarf language code 2024-09-18 21:14:04 +08:00
Li Jie
c06c96bc1f add types.Map debug info, more debug symbol tests 2024-09-18 21:14:04 +08:00
Li Jie
db128dbc40 test: debug symbols generation 2024-09-18 21:14:04 +08:00
Li Jie
d6f87a8254 rename debug info class/funcs 2024-09-18 21:14:04 +08:00
Li Jie
4c5f37db0f debug symbols switch 2024-09-18 21:14:04 +08:00
Li Jie
3e5338c902 ssa: add llvm debug info 2024-09-18 21:14:04 +08:00
spongehah
848b7c7a34 c/sysconf 2024-09-18 18:40:16 +08:00
xushiwei
4bf5dd15e9 Merge pull request #796 from luoliwoshang/c/lua/fn
c/lua:custom alloc
2024-09-18 12:04:06 +08:00
张之阳
d4273d8e3f remove redundant fn body 2024-09-17 09:01:44 +08:00
xushiwei
780347776b Merge pull request #795 from cpunion/memset
Use LLVM memset intrinsic for compatibility and performance
2024-09-17 08:44:50 +08:00
xushiwei
5dd6986ad4 Merge pull request #797 from luoliwoshang/c/realloc
c:realloc
2024-09-17 08:40:05 +08:00
luoliwoshang
51bf41009e c:realloc 2024-09-16 23:37:22 +08:00
luoliwoshang
4defe734e2 c/lua:custom alloc for state 2024-09-16 23:33:14 +08:00
luoliwoshang
e3cb4ebfdc c/lua:alloc 2024-09-16 23:30:35 +08:00
luoliwoshang
c6345279cc c/lua:table field operate 2024-09-16 22:16:01 +08:00
luoliwoshang
e5a9af9a31 c/lua:remove redundant 2024-09-16 09:51:55 +08:00
Li Jie
c0e1e31572 rebuild tests 2024-09-14 16:14:50 +08:00
Li Jie
1e58c365ed instead runtime.Zeroinit of memset to compatible build.NaiveForm 2024-09-14 15:44:36 +08:00
luoliwoshang
bf87b76adb llcppsigfetch:variadic order 2024-09-13 16:06:06 +08:00
luoliwoshang
c8e06b5837 llcppsigfetch:func mangled name 2024-09-13 16:02:00 +08:00
luoliwoshang
ee5cd06077 llcppsigfetch:distinguish collect doc&comment 2024-09-13 16:02:00 +08:00
luoliwoshang
140352b637 llcppsigfetch:avoid tab 2024-09-13 16:02:00 +08:00
luoliwoshang
b369321e2f llcppsigfetch:unexpect typedef record type's named anonymous record decl resolve to normal anonymous record refer 2024-09-13 16:02:00 +08:00
luoliwoshang
b9aaba7b16 llcppsigfetch:fix nil type of FuncNoProto in C mode 2024-09-13 16:02:00 +08:00
luoliwoshang
07519732a1 llcppsigfetch:based on language configuration analysis 2024-09-13 16:02:00 +08:00
luoliwoshang
ae71f3c186 llcppsigfetch:extract info command 2024-09-13 16:02:00 +08:00
luoliwoshang
e1236f9deb llcppsigfetch:typedef anonymous record type correct refer by __ANONY_ name 2024-09-13 16:02:00 +08:00
luoliwoshang
3c9bfb5b4d llcppsigfetch:determine unexpected named typedecl in typedef anonymous 2024-09-13 16:02:00 +08:00
luoliwoshang
86b50b0a93 llcppsigfetch:null processing 2024-09-13 16:02:00 +08:00
luoliwoshang
da6706cb93 llcppsigfetch:complex typedef decl 2024-09-13 16:02:00 +08:00
luoliwoshang
2842a109da llcppsigfetch:right reference 2024-09-13 16:02:00 +08:00
luoliwoshang
021ddefb10 llcppsigfetch:dump node type for unmarshal 2024-09-13 16:02:00 +08:00
luoliwoshang
7d0b47c5cb llcppsigfetch:field access & static field 2024-09-13 16:02:00 +08:00
luoliwoshang
9351a1f900 llcppsigfetch:anonymous elaborated type refer 2024-09-13 16:02:00 +08:00
luoliwoshang
0ac48369fe llcppsigfetch:variadic param 2024-09-13 16:02:00 +08:00
luoliwoshang
e57ee17532 llcppsigfetch:func pointer 2024-09-13 16:01:59 +08:00
luoliwoshang
a897683272 Use semantic parent to refactor scoping expression construction 2024-09-13 16:01:59 +08:00
luoliwoshang
38eb981d2c llcppsigfetch:remove redundant test case 2024-09-13 16:01:59 +08:00
luoliwoshang
b524472b9e llcppsigfetch:out of class method 2024-09-13 16:01:59 +08:00
luoliwoshang
fc04083cb2 llcppsigfetch:collect public methods 2024-09-13 16:01:59 +08:00
luoliwoshang
b1225951f2 llcppsigfetch:func inline & static 2024-09-13 16:01:59 +08:00
luoliwoshang
24fd2e1849 llcppsigfetch:free override cursor 2024-09-13 16:01:59 +08:00
luoliwoshang
5e5c975a9c llcppsigfetch:constructor,destructor,static,override,virtual 2024-09-13 16:01:59 +08:00
luoliwoshang
c6336e920f llcppsigfetch:qualified name whith tag 2024-09-13 16:01:59 +08:00
luoliwoshang
cd19625522 llcppsigfetch:enum type 2024-09-13 16:01:59 +08:00
luoliwoshang
3ac95a9213 llcppsigfetch:refactor type reference test logic 2024-09-13 16:01:59 +08:00
luoliwoshang
e57ea9b501 llcppsigfetch/chore:rename 2024-09-13 16:01:59 +08:00
luoliwoshang
14b335a51e llcppsigfetch:correct class scoping 2024-09-13 16:01:59 +08:00
luoliwoshang
319e746a55 llcppsigfetch:qualified name refer 2024-09-13 16:01:59 +08:00
luoliwoshang
eb4d721175 llcppsigfetch:tag expr 2024-09-13 16:01:59 +08:00
luoliwoshang
a4f850c0c6 llcppsigfetch:lvalue & rvalue refer 2024-09-13 16:01:59 +08:00
luoliwoshang
0a8e25b405 llcppsigfetch:simpilfy func test 2024-09-13 16:01:59 +08:00
luoliwoshang
1557a76225 llcppsigfetch:split test directory 2024-09-13 16:01:59 +08:00
luoliwoshang
d4fa379f11 llcppsigfetch:record type 2024-09-13 16:01:59 +08:00
luoliwoshang
e09c5fcb3c llcppsigfetch:TypedefDecl & Elaborated Type Refer 2024-09-13 16:01:59 +08:00
luoliwoshang
815fe25f2c llcppsigfetch:anonymous record name 2024-09-13 16:01:59 +08:00
luoliwoshang
5e5c84ba27 llcppsigfetch:json memory free 2024-09-13 16:01:59 +08:00
luoliwoshang
2974b23f26 llcppsigfetch:refine file handling, remove curFile field 2024-09-13 16:01:59 +08:00
luoliwoshang
697c21b120 llcppsigfetch:typedecl name 2024-09-13 16:01:59 +08:00
luoliwoshang
1f72a52015 llcppsigfetch:free token 2024-09-13 16:01:59 +08:00
luoliwoshang
43bcf1051d llcppsigfetch:union 2024-09-13 16:01:59 +08:00
luoliwoshang
bf8aa502f9 llcppsigfetch:marco tokens & refine test 2024-09-13 16:01:59 +08:00
luoliwoshang
f0e92343cb llcppsigfetch:complex 2024-09-13 16:01:59 +08:00
luoliwoshang
48efd6689e llcppsigfetch:conveter config 2024-09-13 16:01:59 +08:00
luoliwoshang
090e689689 llcppsigfetch:basic enum 2024-09-13 16:01:59 +08:00
luoliwoshang
9d16df5f25 llcppsigfetch:include 2024-09-13 16:01:59 +08:00
luoliwoshang
02651c93a7 llcppsigfetch:basic marco process 2024-09-13 16:01:59 +08:00
luoliwoshang
2b1d4b6672 llcppsigfetch:output result 2024-09-13 16:01:59 +08:00
luoliwoshang
9087dac6fe llcppsigfetch:basic class & struct 's process 2024-09-13 16:01:59 +08:00
luoliwoshang
762ed994c1 llcppsigfetch:Decl Comment 2024-09-13 16:01:59 +08:00
luoliwoshang
2c8a9d1160 llcppsigfetch:Scope Context 2024-09-13 16:01:59 +08:00
luoliwoshang
f613316046 chore:remove the capital of Path 2024-09-13 16:01:59 +08:00
luoliwoshang
6b1bc15f37 llcppsigfetch:Constant & Incomplete Array 2024-09-13 16:01:59 +08:00
luoliwoshang
9a77a0c201 llcppsigfetch:move type test 2024-09-13 16:01:59 +08:00
luoliwoshang
755cdbb238 llcppsigfetch:collect func param name 2024-09-13 16:01:59 +08:00
luoliwoshang
1996db4b95 llcppsigfetch:refine cjson dump logic 2024-09-13 16:01:59 +08:00
luoliwoshang
6297f69e70 llcppsigfetch:basic cjson dump for ast.File 2024-09-13 16:01:59 +08:00
luoliwoshang
a796f9f8a8 llcppsigfetch:tempfile converter option 2024-09-13 16:01:59 +08:00
luoliwoshang
0de9c57ade llcppsigfetch:builtin type convert 2024-09-13 16:01:59 +08:00
luoliwoshang
95dc01cdcb llcppsigfetch:basic fileset 2024-09-13 16:01:59 +08:00
luoliwoshang
364d3996f4 llcppsigfetch:basic process type 2024-09-13 16:01:59 +08:00
luoliwoshang
33af9e878b llcppsigfech:basic struct
llcppsigfetch:basic parse converter

llcppsigfetch:converter top decl

llcppg:converter test
2024-09-13 16:01:59 +08:00
xushiwei
9f8b9ea806 Merge pull request #784 from luoliwoshang/c/clang/displayname
c/clang:displayname & comment range
2024-09-13 15:37:57 +08:00
xushiwei
d53876ee1b Merge pull request #782 from visualfc/runtimetypes
cl: processPkg check runtimeTypes for generic method
2024-09-12 12:47:53 +08:00
xushiwei
4f654e81c8 Merge pull request #792 from visualfc/selects
runtime: fix multi chan recv/send select
2024-09-12 12:46:22 +08:00
visualfc
aa33ddcf19 runtime: fix multi chan recv/send select 2024-09-11 16:09:15 +08:00
xushiwei
c8a57676b4 Merge pull request #783 from cpunion/builtin-llgo-tag
llgen: builtin llgo tag
2024-09-11 11:00:08 +08:00
luoliwoshang
d0d2bc1996 llcppsymg:filter public method 2024-09-10 14:36:26 +08:00
luoliwoshang
2b8d2b0026 c/clang:comment range 2024-09-09 18:35:52 +08:00
luoliwoshang
735953a262 c/clang:displayname 2024-09-09 15:45:09 +08:00
Li Jie
1c686f10a1 llgen: builtin llgo tag 2024-09-09 13:52:15 +08:00
visualfc
b7088510c5 cl: remove checkInstanceNamed 2024-09-09 11:36:39 +08:00
visualfc
3bdb921ee5 cl: processPkg check runtimeTypes for generic method 2024-09-09 11:22:03 +08:00
xushiwei
74b48ff56b Merge pull request #771 from luoliwoshang/chore/llcppsymg/config
llcppsymg:language config
2024-09-08 17:25:49 +08:00
xushiwei
9410370cc5 Merge pull request #777 from luoliwoshang/c/lua/thread
c/lua:thread
2024-09-08 17:22:01 +08:00
luoliwoshang
743ddf83c1 c/lua:thread 2024-09-07 18:55:24 +08:00
luoliwoshang
caa707325a llcppsymg:language config 2024-09-06 09:05:35 +08:00
xushiwei
3c588e67b8 Merge pull request #767 from tsingbx/cjson
Improve the llgo cjson library
2024-09-06 06:56:49 +08:00
xushiwei
6c26dad048 Merge pull request #770 from visualfc/tpfunc
ssa: fix llgo:type c for typeparam named
2024-09-06 06:51:30 +08:00
xushiwei
393e2c125e Merge pull request #772 from luoliwoshang/castdump/typedef
castdump:use UnderlyingType instead CanonicalType in typedef
2024-09-06 06:48:12 +08:00
luoliwoshang
e56dc2ed6a castdump:use UnderlyingType instead CanonicalType 2024-09-05 15:45:36 +08:00
tsingbx
4a449ed85e change comment cBool to cJSON_Bool 2024-09-05 11:01:34 +08:00
tsingbx
88dbe90075 Revert "change comment cBool to Bool"
This reverts commit a6f6451434.
2024-09-05 11:00:20 +08:00
tsingbx
a6f6451434 change comment cBool to Bool 2024-09-05 10:58:40 +08:00
tsingbx
8a4370c1f6 change ParseBytes and ParseString, change JSON_bool to Bool, remove Bool() 2024-09-05 10:55:49 +08:00
xushiwei
7a068450b3 Merge pull request #764 from cpunion/ssa-error-exit
cl: exit 1 when SSA build error
2024-09-05 08:42:21 +08:00
xushiwei
ae3222e4c2 Merge pull request #761 from visualfc/abiname
internal/abi: fix splitName
2024-09-05 08:34:27 +08:00
xushiwei
27b4bfa3fa Merge pull request #758 from luoliwoshang/llcppg/language
llcppg/config:language
2024-09-05 08:32:49 +08:00
xushiwei
8af229947f Merge pull request #765 from cpunion/builtin-llgo-tag
cl: builtin llgo tag
2024-09-05 08:32:06 +08:00
xushiwei
f235a2f539 Merge pull request #763 from luoliwoshang/c/clang/usr
c/clang:usr & range
2024-09-05 08:31:37 +08:00
visualfc
b0ebb479f6 ssa: fix llgo:type c for typeparam named 2024-09-04 21:53:50 +08:00
tsingbx
df92e21520 fix error 2024-09-04 20:31:45 +08:00
tsingbx
a1a25cc57f complete cjson 2024-09-04 20:23:47 +08:00
Li Jie
e9aaf8e0af cl: builtin llgo tag 2024-09-04 10:07:22 +08:00
Li Jie
7a80e407af cl: exit 1 when SSA build error 2024-09-04 09:55:56 +08:00
luoliwoshang
57f8d535fb c/clang:usr & range 2024-09-03 18:33:40 +08:00
visualfc
fcc444a100 internal/abi: fix splitName 2024-09-03 15:24:08 +08:00
luoliwoshang
8ccb3c21e1 llcppg/config:language 2024-09-03 15:17:03 +08:00
luoliwoshang
0484d4bb77 llcppg/ast:func mangle name 2024-09-03 15:16:36 +08:00
xushiwei
3ce9567f62 Merge pull request #760 from visualfc/cvtnamed
ssa: cvtNamed check typeargs
2024-09-03 15:05:39 +08:00
visualfc
765e812b77 ssa: cvtNamed check typeargs 2024-09-03 11:37:31 +08:00
xushiwei
1a63c9296b Merge pull request #750 from luoliwoshang/llcppg/ast/access
llcppg/ast:field access & static
2024-09-01 05:56:23 +08:00
xushiwei
9510b5aea5 Merge pull request #755 from luoliwoshang/c/lua/dump
c/lua:dump & load
2024-09-01 05:55:47 +08:00
xushiwei
490e859fbf Merge pull request #756 from luoliwoshang/c/fread
c:fread
2024-09-01 05:55:10 +08:00
luoliwoshang
85c4a2fdc2 c/lua:dump & load demo use go file operate 2024-09-01 00:33:00 +08:00
luoliwoshang
3b9c9f6a97 c:fread 2024-08-31 20:49:23 +08:00
luoliwoshang
d1f64d3059 c/lua:dump & load 2024-08-31 20:45:19 +08:00
luoliwoshang
f62bcdc803 llcppg/ast:field access & static 2024-08-30 10:11:23 +08:00
xushiwei
2434fd778f Merge pull request #751 from hackerchai/fix/c-libuv-error-eof
fix(c/libuv): Fix EOF error value
2024-08-30 09:01:53 +08:00
xushiwei
1a38726fb7 Merge pull request #752 from spongehah/c/libuv
feature(c/libuv): Add Idle and Check
2024-08-30 09:01:34 +08:00
赵英杰
24cffb2a69 feature(c/libuv): Add idle and check 2024-08-29 17:52:18 +08:00
hackerchai
527918545e fix(c/libuv): Fix EOF error value
Signed-off-by: hackerchai <i@hackerchai.com>
2024-08-28 17:12:38 +08:00
xushiwei
4d268f67ae Merge pull request #749 from luoliwoshang/c/clang/variadic
c/clang:variadic
2024-08-28 06:23:31 +08:00
luoliwoshang
a65c2f4312 c/clang:variadic 2024-08-27 18:54:41 +08:00
xushiwei
c490f2b849 Merge pull request #692 from spongehah/refactor/c-libuv-remove-go-wrapper
fix(c/libuv): Change the request calling method of echo_server
2024-08-27 05:23:28 +08:00
xushiwei
282f7fc2e3 Merge pull request #747 from luoliwoshang/llcppg/ast/variadic
llcppg/ast:variadic func
2024-08-27 05:21:36 +08:00
xushiwei
52348af8ec Merge pull request #748 from luoliwoshang/c/clang/cursor
c/clang:cursor
2024-08-27 05:20:20 +08:00
luoliwoshang
39d15ead6f c/clang:cursor 2024-08-26 18:47:56 +08:00
luoliwoshang
d232109fce llcppg/ast:variadic func 2024-08-26 15:11:31 +08:00
xushiwei
8e9c43610d Merge pull request #746 from luoliwoshang/c/lua/corroutine
c:lua:coroutine continuation
2024-08-25 17:52:36 +08:00
xushiwei
53a8c20cb9 Merge pull request #743 from luoliwoshang/c/clang/class
c/clang:class & method
2024-08-25 17:51:15 +08:00
xushiwei
333f60a2a6 Merge pull request #744 from aisk/py-set
feat(py): add set type
2024-08-25 17:49:55 +08:00
xushiwei
0bacc20a58 Merge pull request #745 from luoliwoshang/c/lua/userdata
c/lua:userdata
2024-08-25 17:49:14 +08:00
luoliwoshang
3e932c9bdf c/lua:coroutine continuation 2024-08-25 15:31:10 +08:00
luoliwoshang
cf8a170133 c/lua:register 2024-08-25 12:32:31 +08:00
AN Long
67a89d4b6b feat(py): add set discard 2024-08-25 00:05:00 +08:00
luoliwoshang
85c2cda7b6 c/lua:userdata 2024-08-24 15:24:47 +08:00
AN Long
61757a6518 feat(py): add set type 2024-08-24 01:10:31 +08:00
luoliwoshang
e245d08e54 c/clang:func,class,method attr 2024-08-23 23:01:39 +08:00
luoliwoshang
29f797dc24 c/clang:correct order 2024-08-23 22:50:26 +08:00
xushiwei
54ce1d8d2f Merge pull request #738 from luoliwoshang/llcppg/ast/exprnode
llcppg/ast:expr node
2024-08-22 22:33:59 +08:00
xushiwei
8e47f70066 Merge pull request #740 from luoliwoshang/c/clang/nonref
c/clang:noref type
2024-08-22 22:33:30 +08:00
xushiwei
01548089ee Merge pull request #739 from luoliwoshang/llcppg/ast/enumtype
llcppg/ast:enum type
2024-08-22 22:33:07 +08:00
xushiwei
de8d598f46 Merge pull request #741 from luoliwoshang/llcppg/ast/scoping
llcppg/ast:scoping for Tagexpr
2024-08-22 22:32:07 +08:00
luoliwoshang
63aad4b9bf llcppg/ast:scoping for Tagexpr 2024-08-22 17:17:51 +08:00
luoliwoshang
33cdb7a541 c/clang:noref type 2024-08-22 12:18:38 +08:00
luoliwoshang
7c2f769a9a llcppg/ast:enum type 2024-08-22 10:25:02 +08:00
luoliwoshang
e084550390 llcppg/ast:expr 2024-08-22 10:00:19 +08:00
xushiwei
3c282e8cf9 Merge pull request #735 from visualfc/linkname
[wip] ssa: prog.linkname; abi llvm.LinkOnceAnyLinkage always
2024-08-22 05:44:16 +08:00
xushiwei
3c4fbdb50e Merge pull request #733 from luoliwoshang/llcppg/ast/refertype
llcppg/ast:rvalue reference
2024-08-22 05:40:39 +08:00
xushiwei
18cdc28963 Merge pull request #734 from luoliwoshang/llcppg/ast/func
llcppg/ast:func decl
2024-08-22 05:40:05 +08:00
xushiwei
5f004e7167 Merge pull request #736 from luoliwoshang/c/clang/anonymous
c/clang:anonymous record & underlying type
2024-08-22 05:37:00 +08:00
xushiwei
96489607ab Merge pull request #737 from luoliwoshang/llcppg/ast/typeexpr
llcppg/ast:record type
2024-08-22 05:35:55 +08:00
luoliwoshang
7436e44416 llcppg/ast:record type 2024-08-21 20:49:59 +08:00
luoliwoshang
8d30e51603 c/clang:typedef 2024-08-21 18:34:12 +08:00
luoliwoshang
64b582e397 c/clang:anonymous record 2024-08-21 14:55:43 +08:00
luoliwoshang
8b86d07bfc llcppg/ast:func decl 2024-08-21 14:12:24 +08:00
luoliwoshang
e3fefdebe1 llcppg/ast:value reference 2024-08-21 10:39:02 +08:00
xushiwei
46aec4a593 Merge pull request #731 from luoliwoshang/llcppg/ast/tagexpr
llcppg/ast:TagExpr
2024-08-21 06:30:19 +08:00
visualfc
2feb3e1d7a ssa: prog.linkname; abi llvm.LinkOnceAnyLinkage always 2024-08-20 21:11:27 +08:00
luoliwoshang
2609f45799 llcppg/ast:TagExpr 2024-08-20 12:03:21 +08:00
xushiwei
9053cbb90f Merge pull request #732 from luoliwoshang/c/clang/freetoken
c/clang:free tokens
2024-08-20 11:44:32 +08:00
luoliwoshang
3794d7ab65 c/clang:free tokens 2024-08-20 11:10:29 +08:00
xushiwei
7eeca21a05 Merge pull request #730 from xushiwei/q
llgocppg ast/token
2024-08-20 09:05:48 +08:00
xushiwei
70464154c7 Merge pull request #691 from luoliwoshang/llcppg/builtin
llcppg/ast:builtin type
2024-08-20 09:05:34 +08:00
xushiwei
1b29078fad Merge pull request #729 from luoliwoshang/c/clang/elementtype
c/clang:element type
2024-08-20 08:59:29 +08:00
xushiwei
864b078610 llgocppg ast/token 2024-08-20 08:58:43 +08:00
xushiwei
1a8b319ce2 Merge pull request #727 from luoliwoshang/llcppg/ast/marco
llcppg/ast:marco & token
2024-08-20 08:50:28 +08:00
luoliwoshang
a353514fc8 c/clang:element type 2024-08-19 18:07:36 +08:00
luoliwoshang
06e294fb3e llcppg/ast:builtin type 2024-08-19 11:25:47 +08:00
luoliwoshang
961d4c4a3a llcppg/ast:marco & token 2024-08-19 11:25:18 +08:00
xushiwei
876aea39e5 Merge pull request #728 from luoliwoshang/c/clang/tokenkind
c/clang:token kind
2024-08-17 22:37:19 +08:00
luoliwoshang
67be2ba95b c/clang:token kind 2024-08-16 18:46:36 +08:00
xushiwei
53d2d080f4 Merge pull request #726 from visualfc/fixmap
ssa: fix map zero
2024-08-16 16:52:29 +08:00
xushiwei
998fbeb381 Merge pull request #724 from visualfc/gc
build: check -tags nogc
2024-08-16 16:45:59 +08:00
xushiwei
1c6e4b7750 Merge pull request #725 from luoliwoshang/os/tomode
lib/os:fix error fileMode to ModeT
2024-08-16 16:42:28 +08:00
visualfc
8fbe21c79c ssa: fix map zero 2024-08-16 14:51:52 +08:00
visualfc
d6d0faac6e build: check -tags nogc 2024-08-16 11:34:58 +08:00
luoliwoshang
2d4f01e6cb lib/os:fix error fileMode to ModeT 2024-08-16 09:38:00 +08:00
xushiwei
b42ad3170e Merge pull request #722 from xushiwei/q
README: net/textproto
2024-08-15 22:08:48 +08:00
xushiwei
a8dddc81f1 README: net/textproto 2024-08-15 22:08:21 +08:00
xushiwei
2e1e6f784b Merge pull request #714 from luoliwoshang/llcppg/ast/basiclit
llcppg/ast:basiclit
2024-08-15 22:02:47 +08:00
xushiwei
2af9b95c7a Merge pull request #707 from spongehah/golib/net/textproto
lib/net/textproto: patch Dial
2024-08-15 20:58:14 +08:00
xushiwei
90be010c2b Merge pull request #721 from aofei/os
c/os: fix `Execl`, `Execle`, and `Execlp` func signatures
2024-08-15 20:53:31 +08:00
xushiwei
3b6b16cf77 Merge pull request #720 from xushiwei/q
c/pthread: nogc
2024-08-15 20:53:16 +08:00
xushiwei
c0c5c87c29 mv _pthread => _wrap 2024-08-15 20:47:42 +08:00
xushiwei
f5bbf4b515 c/pthread: nogc 2024-08-15 20:43:52 +08:00
Aofei Sheng
c7465608a7 c/os: fix Execl, Execle, and Execlp func signatures 2024-08-15 20:32:54 +08:00
xushiwei
03f0a4289b Merge pull request #719 from aofei/bdwgc
gc: fix missing pthread registration causing unknown thread error
2024-08-15 20:06:21 +08:00
xushiwei
bb2a6b73fe Merge pull request #518 from visualfc/ptrsize
runtime: init abi.Type.PtrBytes
2024-08-15 19:56:56 +08:00
Aofei Sheng
8e66091dd2 gc: fix missing pthread registration causing unknown thread error
- Use `GC_pthread_create` instead of `pthread_create` when GC is
  enabled.
2024-08-15 19:55:05 +08:00
xushiwei
a5c114a848 Merge pull request #693 from luoliwoshang/llcppsymg/unuse-comment
llcppsymg:remove unused bug-fix loop
2024-08-15 19:52:08 +08:00
xushiwei
254b2c27ac Merge pull request #700 from hackerchai/fix/c-net-byte-order-conv-func
refactor(c/net): Use c link instead of manual implement func
2024-08-15 19:45:57 +08:00
xushiwei
29fcb4504c Merge pull request #712 from luoliwoshang/os/mkdirdemo
lib/os:mkdir demo
2024-08-15 19:30:53 +08:00
xushiwei
ec7402b80a Merge pull request #715 from luoliwoshang/c/clang/arraysize
c/clang:array size & raw comment
2024-08-15 19:30:10 +08:00
xushiwei
4501519c4f Merge pull request #716 from aisk/py-tuple-helper
feat(py): Add Python tuple constructor helper
2024-08-15 18:21:51 +08:00
xushiwei
58ad7dab1b Merge pull request #718 from spongehah/c/libuv
refactor(c/libuv): Add multiple struct size
2024-08-15 18:18:58 +08:00
xushiwei
4da26a2f8d Merge pull request #717 from visualfc/funcdecl
ssa: makeInterface check funcdecl => closure
2024-08-15 18:18:28 +08:00
visualfc
9e6aed0760 runtime: init abi.Type.PtrBytes 2024-08-15 15:40:43 +08:00
luoliwoshang
7033f11d56 c/clang:array size & raw comment 2024-08-15 15:29:26 +08:00
赵英杰
8fcac42f34 c/libuv: Add multiple struct size 2024-08-15 10:57:29 +08:00
赵英杰
4a6a97ee75 lib/net/textproto: patch Dial 2024-08-15 10:43:57 +08:00
visualfc
2174d8fe8c ssa: makeInterface check funcdecl => closure 2024-08-15 10:12:18 +08:00
AN Long
eb6f487e2a fix: typo in document 2024-08-14 22:40:55 +08:00
AN Long
6bbe68dfcb test: Add py.Tuple test 2024-08-14 22:07:00 +08:00
AN Long
bbeceae42e feat(py): Add Python tuple constructor helper 2024-08-14 21:45:46 +08:00
luoliwoshang
cfe785762d llcppg/ast:basiclit 2024-08-14 18:27:15 +08:00
luoliwoshang
fdbb329fb6 lib/os:mkdir demo 2024-08-14 15:22:11 +08:00
xushiwei
9f1100b967 Merge pull request #710 from visualfc/sigsegv
[wip] runtime: signal SIGSEGV
2024-08-14 15:09:10 +08:00
xushiwei
94706d6139 Merge pull request #711 from luoliwoshang/os/filemode
lib/os:fileMode to ModeT , `Mkdir` run normally
2024-08-14 15:07:56 +08:00
xushiwei
b63609e2fa Merge pull request #695 from visualfc/instance_abi
cl: makeInterface check instance named
2024-08-14 15:06:07 +08:00
luoliwoshang
84c420139d lib/os:fileMode to ModeT 2024-08-14 14:24:15 +08:00
visualfc
027d21035e runtime: signal SIGSEGV 2024-08-14 11:30:24 +08:00
xushiwei
cc9de01c99 Merge pull request #705 from luoliwoshang/os/mkdir
[wip] lib/os: patch MkdirAll
2024-08-14 10:29:48 +08:00
xushiwei
61c6f240e9 Merge pull request #708 from xushiwei/q
llgo cmptest -gen
2024-08-14 10:27:33 +08:00
luoliwoshang
997d673b83 lib/os:MkdirAll use 1.21.13 2024-08-14 10:22:54 +08:00
xushiwei
6c72846d63 llgo cmptest -gen 2024-08-14 09:47:40 +08:00
luoliwoshang
8bd6e1d119 lib/os: patch MkdirAll 2024-08-14 09:41:16 +08:00
xushiwei
6484a8e6a4 Merge pull request #706 from hackerchai/fix/c-libuv-struct-size
fix(c/libuv): Add multiple struct size
2024-08-14 08:57:54 +08:00
xushiwei
0e8e108680 Merge pull request #701 from aofei/cmptest
cmptest: add support for comparison with `llgo.expect` files
2024-08-14 08:57:20 +08:00
visualfc
3435b6c4a4 cl: makeInterface check instance named 2024-08-13 21:59:19 +08:00
xushiwei
d4af6af594 Merge pull request #703 from visualfc/constuptr
ssa: const support unsafe.pointer
2024-08-13 17:22:12 +08:00
xushiwei
b834abd293 Merge pull request #702 from aofei/os.CreateTemp
lib/os: patch `TempDir`, `MkdirTemp`, `CreateTemp`
2024-08-13 17:13:07 +08:00
xushiwei
01a6dd79c4 Merge pull request #704 from aisk/py-uintptr-to-int
fix(py): Change uintptr to int in container types
2024-08-13 17:10:37 +08:00
hackerchai
948b6cf7e7 fix(c/libuv): Add multiple struct size
Signed-off-by: hackerchai <i@hackerchai.com>
2024-08-13 16:51:42 +08:00
visualfc
b1718f329e ssa: const support unsafe.pointer 2024-08-12 22:01:15 +08:00
AN Long
7237f549a6 fix(py): Change uintptr to int in container types 2024-08-12 21:56:57 +08:00
Aofei Sheng
30b1660005 lib/os: patch TempDir, MkdirTemp, CreateTemp 2024-08-12 18:20:22 +08:00
Aofei Sheng
200fe07473 cmptest: add support for comparison with llgo.expect files
Fixes #671
2024-08-12 13:52:20 +08:00
hackerchai
86cb22d8c9 refactor(c/net): Use c link instead of manual implement func
Signed-off-by: hackerchai <i@hackerchai.com>
2024-08-12 10:53:18 +08:00
xushiwei
321766fd46 Merge pull request #699 from aisk/py-tuple
feat(py): Add more method to tuple object
2024-08-12 09:38:47 +08:00
xushiwei
3eedad96ed Merge pull request #696 from luoliwoshang/c/lua/custom-panic
c/lua:custom panic
2024-08-12 09:36:42 +08:00
AN Long
4b26dac08a feat(py): Add more method to tuple object 2024-08-11 20:40:06 +08:00
luoliwoshang
04ef069a20 c/lua:custom panic 2024-08-10 20:18:31 +08:00
luoliwoshang
b925ed60e3 llcppsymg:remove unused bug-fix loop 2024-08-09 14:20:33 +08:00
xushiwei
dfd85a7c53 Merge pull request #643 from visualfc/defernext
ssa: fix defer move block[0] index
2024-08-09 12:54:46 +08:00
visualfc
6ca63d4c68 ssa: fix defer move block[0] index 2024-08-09 12:07:07 +08:00
赵英杰
2325b547fd fix(c/libuv): Change the request calling method of echo_server 2024-08-09 10:35:14 +08:00
xushiwei
34e454c054 Merge pull request #689 from visualfc/slicetoarray
ssa: SliceToArrayPointer
2024-08-09 09:44:46 +08:00
visualfc
302386d22c ssa: SliceToArrayPointer 2024-08-09 09:02:57 +08:00
xushiwei
210c483635 Merge pull request #687 from xushiwei/q
library syscall: linux fix
2024-08-09 00:33:09 +08:00
xushiwei
8ca4212650 library syscall: linux fix 2024-08-09 00:22:29 +08:00
xushiwei
c91dba5ed6 Merge pull request #686 from xushiwei/q
rollback golang.org/x/tools v0.22.0 => v0.19.0
2024-08-08 23:58:31 +08:00
xushiwei
c8de05f101 rollback golang.org/x/tools v0.22.0 => v0.19.0 2024-08-08 23:52:29 +08:00
xushiwei
0ac7cde498 Merge pull request #684 from visualfc/initafter
cl: build initAfter
2024-08-08 23:05:02 +08:00
visualfc
108829ad9c cl: build initAfter 2024-08-08 21:36:18 +08:00
xushiwei
c5b96f4e9c Merge pull request #681 from luoliwoshang/llcppsymg/refine
llcppsymg:improve parse symbol
2024-08-08 16:26:24 +08:00
luoliwoshang
4c2099d33e llcppg:remove unuse types 2024-08-08 15:18:16 +08:00
luoliwoshang
fe5de95008 llcppsymg:improve parsing process 2024-08-08 15:17:10 +08:00
xushiwei
4b0cfc0751 Merge pull request #677 from tsingbx/bigInt
llgo support big.Int
2024-08-08 14:23:32 +08:00
tsingbx
c2bf05942e add openssl BIGNUM support 2024-08-08 13:34:04 +08:00
tsingbx
df37f80c8e add big.Int Lsh and Rsh and test it 2024-08-08 13:33:14 +08:00
xushiwei
2c19d7218d Merge pull request #680 from xushiwei/q
llcppg design
2024-08-08 11:57:20 +08:00
xushiwei
34899e8d36 llcppg design 2024-08-08 11:49:55 +08:00
xushiwei
bf8c10ed25 Merge pull request #678 from spongehah/refactor/c-libuv-remove-go-wrapper
fix(c/libuv): Adjust comment errors and demo code
2024-08-08 11:33:10 +08:00
xushiwei
93c33e08c2 Merge pull request #679 from xushiwei/hmac
llcppg/ast: ppdNode
2024-08-08 11:31:01 +08:00
xushiwei
3992dd1dd0 Merge pull request #675 from hackerchai/feature/c-net-add-missing-funcs
feat(c/net): Add SockaddrStorage func, Ntohs func & SetSockOpt func
2024-08-08 11:30:48 +08:00
xushiwei
cab29c2be7 llcppg/ast: ppdNode 2024-08-08 11:21:56 +08:00
hackerchai
f582657ffd fix(c/net): Remove unused implicit import
Signed-off-by: hackerchai <i@hackerchai.com>
2024-08-08 10:12:47 +08:00
赵英杰
2823ac1aee fix(c/libuv): Adjust comment errors and demo code 2024-08-08 10:04:20 +08:00
tsingbx
289caa7cc2 add BN_CTX Start, Get, End and Add big.Int Mul and test it 2024-08-08 09:10:31 +08:00
tsingbx
0a8bad46b5 add big.Int Set, Abs, Neg and add test it 2024-08-08 08:31:03 +08:00
xushiwei
aa4f518262 Merge pull request #673 from cpunion/libuv-async
Add libuv async
2024-08-07 21:43:50 +08:00
xushiwei
f76fa879fc Merge pull request #676 from luoliwoshang/xtool/ast/funcproto
castdump:funcproto type & computed enum value
2024-08-07 21:42:47 +08:00
luoliwoshang
8d70aba1f5 castdump:funcproto type & enum value 2024-08-07 20:33:35 +08:00
Li Jie
a44bb35aec libuv: add async 2024-08-07 20:24:43 +08:00
xushiwei
4fda2b656f Merge pull request #672 from luoliwoshang/c/clang/type-tree
castdump:array,typedef,pointer,funcproto,enum & builtin type
2024-08-07 19:15:37 +08:00
xushiwei
e626d00fdf Merge pull request #674 from hackerchai/feature/c-calloc
feat(c): Add Calloc func
2024-08-07 18:39:35 +08:00
hackerchai
bf09e3c3ae feat(c/net): Add SockaddrStorage func, Ntohs func & SetSockOpt func 2024-08-07 18:04:04 +08:00
hackerchai
753dcd3301 feat(c): Add Calloc func 2024-08-07 16:45:17 +08:00
Li Jie
8b5dee510e libuv: add uv_stop 2024-08-07 16:21:12 +08:00
luoliwoshang
9cb73fbf78 castdump:array,typedef,pointer & builtin type 2024-08-07 15:52:26 +08:00
xushiwei
e6b4deb5c4 Merge pull request #657 from hackerchai/fix/c-libuv-missing-func
feat(c/libuv): Add libuv missing funcs & refactor go func style
2024-08-07 15:04:52 +08:00
hackerchai
8848222728 feat(c/libuv): Add GetIoWatcherFd func using LLGoFiles 2024-08-07 14:49:21 +08:00
hackerchai
3cd62994c7 Revert "refactor(c/libuv): Use cgo alias replace struct assertion in fs"
This reverts commit 45ba5b8dc50a13223e05ad673f4e57d7277d3f24.

# Conflicts:
#	c/libuv/net.go
2024-08-07 14:49:20 +08:00
hackerchai
dd93a97790 Revert "feat(c/libuv): Add GetIoWatcherFd func"
This reverts commit 1ce16727b1195a65c8f2c9de07a864ed5e3902ef.

Signed-off-by: hackerchai <i@hackerchai.com>
2024-08-07 14:49:19 +08:00
hackerchai
e40e2d2d14 style(c/libuv): Use go type funcs & update demo(syanc_fs, echo_server) 2024-08-07 14:49:18 +08:00
hackerchai
26f8ce7b5a refactor(c/libuv): Use cgo alias replace struct assertion in fs
refactro(c/libuv): Use cgo alias avoid implicit struct member declaration
2024-08-07 14:49:17 +08:00
hackerchai
9a61e374b5 refactor(c/libuv): Move some func due to libuv doc
doc: https://docs.libuv.org/en/v1.x/
2024-08-07 14:49:16 +08:00
hackerchai
9b12e9819c fix(c/libuv/demo): Fix echo_server stream convert 2024-08-07 14:49:15 +08:00
hackerchai
5d0a91239c feat(c/libuv): Add GetIoWatcherFd func 2024-08-07 14:49:14 +08:00
hackerchai
c848278690 feat(c/libuv): Add uv_close & uv_signal func
Signed-off-by: hackerchai <i@hackerchai.com>

feat(c/libuv): Add uv_signal_stop func

Signed-off-by: hackerchai <i@hackerchai.com>

feat(c/libuv): Add GetIoWatcher, GetFd func & add Io srtuct

Signed-off-by: hackerchai <i@hackerchai.com>

refactor(c/libuv):  Rename some func

refactor(c/libuv): Remove net go wrapper

refactor(c/libuv):  Add GetIoWatcherFd func
2024-08-07 14:49:13 +08:00
luoliwoshang
2ebb929e2c castdump:accessMap 2024-08-07 10:59:27 +08:00
xushiwei
b34334ba93 Merge pull request #669 from visualfc/abimap
ssa: fix abi map init
2024-08-07 07:54:27 +08:00
visualfc
05a01cd803 ssa: fix abi map init 2024-08-06 22:24:21 +08:00
xushiwei
9ac0c06f26 Merge pull request #667 from luoliwoshang/c/clang/type
c/clang:cursor enum & type kind
2024-08-06 22:00:27 +08:00
xushiwei
52af22b0e8 Merge pull request #660 from luoliwoshang/c/clang/fullast
c/clang:full ast dump
2024-08-06 21:56:06 +08:00
luoliwoshang
81cfc73b48 castdump:full ast dump 2024-08-06 21:37:00 +08:00
xushiwei
f892bfccdf Merge pull request #665 from xushiwei/hmac
library: crypto/hmac, internal/fmtsort
2024-08-06 18:56:37 +08:00
xushiwei
dbed8fefac library: crypto/hmac 2024-08-06 18:49:24 +08:00
luoliwoshang
ca14637909 c/clang:type kind 2024-08-06 18:23:31 +08:00
luoliwoshang
7db618fba5 c/clang:cursor enum & access pecifier 2024-08-06 18:23:19 +08:00
xushiwei
29c74c09ce library/README: crypto/hmac, crypto/subtle 2024-08-06 17:19:31 +08:00
xushiwei
a2b5b9f97e library (todo): crypto/hmac, internal/fmtsort 2024-08-06 17:03:22 +08:00
tsingbx
6a05aa4e53 llgo support crypto hmac (#663)
* llgo support crypto/hmac
2024-08-06 16:47:51 +08:00
xushiwei
43fd5d233a Merge pull request #662 from xushiwei/cast
TypedefDecl
2024-08-06 15:10:15 +08:00
xushiwei
0bd39ed035 TypedefDecl 2024-08-06 15:09:39 +08:00
xushiwei
1db8aad039 Merge pull request #661 from xushiwei/cast
llcppg: c/c++ ast
2024-08-06 11:00:51 +08:00
xushiwei
fb2d4267f5 llcppg: c/c++ ast 2024-08-06 11:00:13 +08:00
xushiwei
d7b203ae08 Merge pull request #655 from tsingbx/hmac2
add openssl hmac
2024-08-05 23:21:19 +08:00
xushiwei
3e07f2e3bc Merge pull request #656 from spongehah/golib/net-url
library: net/url
2024-08-05 20:11:31 +08:00
xushiwei
94cf6f6640 Merge pull request #658 from luoliwoshang/c/clang/marco
c/clang:marco content
2024-08-05 20:10:10 +08:00
luoliwoshang
6da5fe4317 c/clang:marco content 2024-08-05 19:38:29 +08:00
赵英杰
3a68dee850 library: net/url 2024-08-05 18:00:27 +08:00
tsingbx
2ccfa6a2e8 add EVP_sha1, EVP_sha224.... 2024-08-05 17:38:01 +08:00
tsingbx
f7bf671050 add openssl hmac
delete GetMD and HMAC function

delete macro

tidy code

add hmac
2024-08-05 16:57:47 +08:00
xushiwei
4bff9cc3df Merge pull request #653 from luoliwoshang/c/clang/marco
[wip] c/clang:marco info
2024-08-05 12:53:23 +08:00
xushiwei
13c68a0184 Merge pull request #654 from visualfc/fixstd
cpp/std: fix std::string def
2024-08-05 12:48:33 +08:00
visualfc
6d92949715 cpp/std: fix std::string def 2024-08-05 11:17:42 +08:00
luoliwoshang
5cf31bd3f3 c/clang:marco info 2024-08-04 17:35:15 +08:00
xushiwei
929d4c8d61 Merge pull request #647 from aofei/ssa-llgolink
ssa: add `llgo:link` support to `Builder.abiMthd`
2024-08-04 12:08:52 +08:00
Aofei Sheng
482f796bad ssa: add llgo:link support to Builder.abiMthd 2024-08-04 11:00:31 +08:00
xushiwei
d85f532ab1 Merge pull request #652 from xushiwei/q
c/os: llgoClearenv
2024-08-04 10:55:03 +08:00
xushiwei
b1654f7807 c/os: llgoClearenv 2024-08-04 10:54:41 +08:00
xushiwei
4f8526e527 Merge pull request #649 from aofei/clearenv
fix(c/os): add missing `clearenv` for macOS
2024-08-04 10:50:18 +08:00
Aofei Sheng
4b568fc469 fix(c/os): add missing clearenv for macOS 2024-08-04 09:58:01 +08:00
xushiwei
d06146ed97 Merge pull request #645 from spongehah/refactor/c-libuv-remove-go-wrapper
refactor(c-libuv): Added TODO(uid) comment & adjusted the position of Handle, Stream, Req, Write, Connect
2024-08-04 07:35:21 +08:00
xushiwei
8e0e809733 Merge pull request #648 from aofei/sync
perf(lib/sync): avoid using `defer`
2024-08-04 07:31:49 +08:00
Aofei Sheng
d1f33a6c4c perf(lib/sync): avoid using defer 2024-08-03 09:05:43 +08:00
赵英杰
b3e1b6fdbf refactor(c-libuv): Added TODO(uid) comment & adjusted the position of Handle, Stream, Req, Write, Connect 2024-08-03 00:25:14 +08:00
xushiwei
0bd259403c Merge pull request #644 from xushiwei/q
library: io/ioutil
2024-08-02 14:35:23 +08:00
xushiwei
c186846463 README: io/ioutil 2024-08-02 14:27:10 +08:00
xushiwei
5f92c3b3fc library: io/ioutil 2024-08-02 14:26:13 +08:00
xushiwei
0665091cef Merge pull request #641 from xushiwei/q
c/openssl: bio, pem, rsa
2024-08-01 23:03:48 +08:00
xushiwei
688d153427 c/openssl: bio, pem, rsa 2024-08-01 22:55:17 +08:00
xushiwei
bec5ba7a73 Merge pull request #638 from luoliwoshang/doc/c/visibile
doc/c:refine symbol visibility desc
2024-08-01 17:17:39 +08:00
xushiwei
acedf4d6a3 Merge pull request #613 from hackerchai/fix/c-libuv-struct
fix(c/libuv): Add libuv fs struct new func & fix async_fs demo
2024-08-01 17:13:51 +08:00
hackerchai
5dd5494f93 refactor(c/libuv): Adapt libuv.Fs struct 2024-08-01 10:57:59 +08:00
hackerchai
f253e4fabe Revert "fix(c/libuv): Add libuv fs struct new func"
This reverts commit 5fdb0a9634b5ecc29ddd50b6e5cce9938bcb7934.

# Conflicts:
#	c/libuv/_wrap/fs.c
#	c/libuv/fs.go
2024-08-01 10:57:58 +08:00
hackerchai
acd09d24d5 fix(c/libuv): Fix async_fs demo return 255 error & pointer not allocated error
Signed-off-by: hackerchai <i@hackerchai.com>

fix(c/libuv): Mv LLGoFiles declaration

Signed-off-by: hackerchai <i@hackerchai.com>

fix(c/libuv/demo): Fix return 255 error & pointer not allocated error

Signed-off-by: hackerchai <i@hackerchai.com>

refactor(c/libuv): Rewrite FsNew() logic

Signed-off-by: hackerchai <i@hackerchai.com>
2024-08-01 10:57:57 +08:00
hackerchai
ceac95c81a fix(c/libuv): Add libuv fs struct new func
Signed-off-by: hackerchai <i@hackerchai.com>
2024-08-01 10:54:01 +08:00
luoliwoshang
47a05d0ea2 doc/c:refine symbol visibility description 2024-08-01 09:54:48 +08:00
xushiwei
d2975479f2 Merge pull request #637 from xushiwei/q
README: math/big
2024-08-01 08:52:27 +08:00
xushiwei
3c238ffae7 Merge pull request #629 from luoliwoshang/doc/c
doc/c: fix incorrect Constructor and Destructor usage in bindings
2024-08-01 08:51:38 +08:00
xushiwei
69f8d1b717 README: math/big 2024-08-01 08:46:37 +08:00
xushiwei
45cd9e65d3 Merge pull request #634 from xushiwei/q
library: math/big.Int (mini-impl for _cmptest/bigintdemo)
2024-08-01 00:38:24 +08:00
xushiwei
2e4b1d8c2b library: math/big.Int (mini-impl for _cmptest/bigintdemo) 2024-08-01 00:32:21 +08:00
luoliwoshang
4e3b65188d doc/c:update implicit destructors description 2024-08-01 00:10:03 +08:00
xushiwei
0ab32e066b Merge pull request #633 from xushiwei/q
c/openssl: bignum, rsa
2024-07-31 23:21:25 +08:00
xushiwei
79d8b00b27 c/openssl: bignum, rsa 2024-07-31 22:34:13 +08:00
xushiwei
eb02c5a451 Merge pull request #631 from xushiwei/q
library: crypto, crypto/{sha1, sha256, sha512}
2024-07-31 19:04:24 +08:00
xushiwei
85509c777d library: crypto 2024-07-31 18:59:25 +08:00
xushiwei
27677f86e4 library: crypto/{sha1, sha256, sha512} 2024-07-31 18:55:46 +08:00
xushiwei
16174ca874 Merge pull request #627 from tsingbx/main
add crypto sha1,sha256,sha512
2024-07-31 18:39:54 +08:00
luoliwoshang
a4e9233231 doc/c:fix incorrect usage in construtors 2024-07-31 15:24:31 +08:00
luoliwoshang
4fdfafa17f doc/c:update destructor usage 2024-07-31 15:10:50 +08:00
tsingbx
c9a7dab419 delete sum 2024-07-31 14:56:03 +08:00
tsingbx
8882d75132 fix test error 2024-07-31 14:36:42 +08:00
tsingbx
f67b15b926 fix test fail 2024-07-31 14:28:15 +08:00
tsingbx
2d7958f726 add crypto sha1, sha256, sha512 2024-07-31 13:56:42 +08:00
xushiwei
36072584d0 Merge pull request #626 from aofei/goreleaser
fix(.goreleaser.yaml): correct ldflags for build version and time
2024-07-31 13:38:40 +08:00
Aofei Sheng
2119e52f55 fix(.goreleaser.yaml): correct ldflags for build version and time 2024-07-31 13:27:54 +08:00
xushiwei
ca1aa6b663 Merge pull request #625 from aofei/opt-deps
ci: install further optional dependencies for demos
2024-07-31 13:00:34 +08:00
xushiwei
10af671b76 Merge pull request #624 from xushiwei/q
library: go/parser (todo)
2024-07-31 13:00:09 +08:00
Aofei Sheng
a4ec6cce96 ci: install further optional dependencies for demos
Achieved 100% pass rate for demo tests, at least on macOS.
2024-07-31 12:34:51 +08:00
xushiwei
5082ba7102 library: go/parser (todo) 2024-07-31 12:29:09 +08:00
xushiwei
7405e7001b Merge pull request #623 from xushiwei/q
library: encoding, go/{token, scanner}
2024-07-31 11:56:09 +08:00
xushiwei
4c70651b81 library: go/{token, scanner} 2024-07-31 11:33:15 +08:00
xushiwei
21b5b60278 Merge pull request #622 from xushiwei/q
library: crypto/rand
2024-07-31 10:30:20 +08:00
xushiwei
0abc5ec452 README: crypto/rand 2024-07-31 10:30:04 +08:00
xushiwei
b1d2d620fa Merge pull request #621 from aofei/deps
deps: require zlib 1.2+
2024-07-31 10:27:47 +08:00
xushiwei
af6e4abe84 library: crypto/rand 2024-07-31 10:26:18 +08:00
Aofei Sheng
45b4315842 deps: require zlib 1.2+ 2024-07-31 09:52:48 +08:00
xushiwei
d2cb96a9e5 Merge pull request #620 from xushiwei/q
c/openssl: rand
2024-07-31 01:33:10 +08:00
xushiwei
a3ff845a14 c/openssl: rand 2024-07-31 01:27:08 +08:00
361 changed files with 32244 additions and 19920 deletions

74
.github/workflows/doc.yml vendored Normal file
View File

@@ -0,0 +1,74 @@
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.20'
- 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
- name: Test doc code blocks
run: |
set -e
set -x
source doc/_readme/scripts/run.sh

View File

@@ -5,11 +5,27 @@ name: Go
on:
push:
branches: [ "*" ]
branches: [ "**" ]
pull_request:
branches: [ "*" ]
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.20'
- name: Check formatting
run: |
if [ -n "$(go fmt ./...)" ]; then
echo "Some files are not properly formatted. Please run 'go fmt ./...'"
exit 1
fi
test:
strategy:
@@ -26,18 +42,48 @@ jobs:
if: startsWith(matrix.os, 'macos')
run: |
brew update
brew install llvm@${{ matrix.llvm }} pkg-config bdw-gc openssl cjson sqlite python@3.12
brew install llvm@${{matrix.llvm}} bdw-gc openssl libffi
brew link --force libffi
echo "$(brew --prefix llvm@${{matrix.llvm}})/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 dependencies
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 libssl-dev libcjson-dev libsqlite3-dev python3.12-dev
sudo apt-get install -y llvm-${{matrix.llvm}}-dev clang-${{matrix.llvm}} libclang-${{matrix.llvm}}-dev lld-${{matrix.llvm}} pkg-config libgc-dev libssl-dev zlib1g-dev libffi-dev libcjson-dev
echo "/usr/lib/llvm-${{matrix.llvm}}/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[@]}"
- 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: Clang information
run: |
echo $PATH
@@ -52,41 +98,59 @@ jobs:
- name: Build
run: go build -v ./...
- name: Test
if: matrix.os != 'macos-latest'
run: go test -v ./...
- name: Test with coverage
if: matrix.os == 'macos-latest'
run: go test -v -coverprofile="coverage.txt" -covermode=atomic ./...
- name: Install
run: go install ./...
- name: Test
if: ${{!startsWith(matrix.os, 'macos')}}
run: go test -v ./...
- name: Test with coverage
if: startsWith(matrix.os, 'macos')
run: go test -v -coverprofile="coverage.txt" -covermode=atomic ./...
- name: LLGO tests
if: matrix.os != 'ubuntu-latest'
if: ${{!startsWith(matrix.os, 'ubuntu')}}
run: |
echo "Test result on ${{matrix.os}} with LLVM ${{matrix.llvm}}" > result.md
LLGOROOT=$PWD bash .github/workflows/test_llgo.sh
bash .github/workflows/test_llgo.sh
- name: Test _demo and _pydemo
- name: chore/_xtool build tests
run: |
set +e
LLGOROOT=$PWD bash .github/workflows/test_demo.sh
exit 0
cd chore/_xtool
llgo build -v ./...
- name: LLDB tests
if: ${{startsWith(matrix.os, 'macos')}}
run: |
echo "Test lldb with llgo plugin on ${{matrix.os}} with LLVM ${{matrix.llvm}}"
bash _lldb/runtest.sh -v
- 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: PR comment with test result
uses: thollander/actions-comment-pull-request@v2
uses: thollander/actions-comment-pull-request@v3
if: false
with:
filePath: result.md
comment_tag: test-result-on-${{matrix.os}}-with-llvm-${{matrix.llvm}}
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v4
uses: codecov/codecov-action@v5
with:
token: ${{secrets.CODECOV_TOKEN}}
slug: goplus/llgo

View File

@@ -1,14 +1,15 @@
#!/bin/bash
set -e
# llgo run subdirectories under _demo and _pydemo
# llgo run subdirectories under _demo and _pydemo that contain *.go files
total=0
failed=0
failed_cases=""
for d in ./_demo/* ./_pydemo/*; do
if [ -d "$d" ] && [ -n "$(ls "$d"/*.go 2>/dev/null)" ]; then
total=$((total+1))
if [ -d "$d" ]; then
echo "Testing $d"
if ! llgo run "$d"; then
if ! (cd "$d" && llgo run .); then
echo "FAIL"
failed=$((failed+1))
failed_cases="$failed_cases\n* :x: $d"

View File

@@ -1,8 +1,6 @@
#!/bin/bash
set -e
export LLGOROOT=$PWD
testcmd=/tmp/test
llgo build -o $testcmd ./c/bdwgc/_test
cases=$($testcmd)

3
.gitignore vendored
View File

@@ -26,6 +26,9 @@ build.dir/
# Test binary, built with `go test -c`
*.test
# Debug symbols
*.dSYM
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
*.swp

View File

@@ -20,8 +20,8 @@ builds:
flags:
- -tags=darwin,amd64,byollvm
ldflags:
- -X github.com/goplus/llgo/xtool/env.buildVersion=v{{.Version}}
- -X github.com/goplus/llgo/xtool/env.buildDate={{.Date}}
- -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
@@ -36,8 +36,8 @@ builds:
flags:
- -tags=darwin,arm64,byollvm
ldflags:
- -X github.com/goplus/llgo/xtool/env.buildVersion=v{{.Version}}
- -X github.com/goplus/llgo/xtool/env.buildDate={{.Date}}
- -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
@@ -52,8 +52,8 @@ builds:
flags:
- -tags=linux,amd64,byollvm
ldflags:
- -X github.com/goplus/llgo/xtool/env.buildVersion=v{{.Version}}
- -X github.com/goplus/llgo/xtool/env.buildDate={{.Date}}
- -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
@@ -68,8 +68,8 @@ builds:
flags:
- -tags=linux,arm64,byollvm
ldflags:
- -X github.com/goplus/llgo/xtool/env.buildVersion=v{{.Version}}
- -X github.com/goplus/llgo/xtool/env.buildDate={{.Date}}
- -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

View File

@@ -47,6 +47,8 @@ You can import a C/C++ standard library in LLGo!
Here is a simple example:
<!-- embedme doc/_readme/llgo_simple/simple.go -->
```go
package main
@@ -77,6 +79,8 @@ llgo run .
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
@@ -86,6 +90,8 @@ 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
@@ -101,6 +107,8 @@ func main() {
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
@@ -135,6 +143,8 @@ Note: For third-party libraries (such as pandas and pytorch), you still need to
Here is an example:
<!-- embedme doc/_readme/llgo_call_py/call_py.go -->
```go
package main
@@ -152,6 +162,8 @@ func main() {
It is equivalent to the following Python code:
<!-- embedme doc/_readme/llgo_call_py/call_math.py -->
```py
import math
@@ -163,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:
<!-- embedme doc/_readme/llgo_py_list/py_list.go -->
```go
package main
@@ -269,13 +283,16 @@ Here are the Go packages that can be imported correctly:
* [unicode/utf8](https://pkg.go.dev/unicode/utf8)
* [unicode/utf16](https://pkg.go.dev/unicode/utf16)
* [math](https://pkg.go.dev/math)
* [math/big](https://pkg.go.dev/math/big) (partially)
* [math/bits](https://pkg.go.dev/math/bits)
* [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)
@@ -294,18 +311,29 @@ Here are the Go packages that can be imported correctly:
* [fmt](https://pkg.go.dev/fmt) (partially)
* [reflect](https://pkg.go.dev/reflect) (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
@@ -317,8 +345,7 @@ Here are the Go packages that can be imported correctly:
- [pkg-config 0.29+](https://www.freedesktop.org/wiki/Software/pkg-config/)
- [bdwgc/libgc 8.0+](https://www.hboehm.info/gc/)
- [OpenSSL 3.0+](https://www.openssl.org/)
- [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))
- [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.12+](https://www.python.org) (optional, for [github.com/goplus/llgo/py](https://pkg.go.dev/github.com/goplus/llgo/py))
## How to install
@@ -327,23 +354,27 @@ Follow these steps to generate the `llgo` command (its usage is the same as the
### on macOS
<!-- embedme doc/_readme/scripts/install_macos.sh#L2-L1000 -->
```sh
brew update # execute if needed
brew install llvm@18 pkg-config bdw-gc openssl
brew install cjson sqlite 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 update
brew install llvm@18 bdw-gc openssl cjson libffi
brew install python@3.12 # optional
brew link --force libffi
go install -v github.com/goplus/llgo/cmd/llgo@latest
```
### on Linux (Debian/Ubuntu)
<!-- embedme doc/_readme/scripts/install_ubuntu.sh#L2-L1000 -->
```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
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
sudo apt-get update # execute if needed
sudo apt-get install -y llvm-18-dev clang-18 lld-18 pkg-config libgc-dev libssl-dev
sudo apt-get install -y libcjson-dev libsqlite3-dev 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
sudo apt-get update
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
sudo apt-get install -y python3.12-dev # optional
go install -v github.com/goplus/llgo/cmd/llgo@latest
```
@@ -362,9 +393,12 @@ TODO
How do I generate these tools?
<!-- embedme doc/_readme/scripts/install_llgo.sh#L2-L1000 -->
```sh
git clone https://github.com/goplus/llgo.git
cd llgo
go install -v ./cmd/...
go install -v ./chore/... # compile all tools except pydump
cd chore/_xtool
llgo install ./... # compile pydump

View 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)
}
}

View 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()
}

View 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
View 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))
}

View 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)
}

View File

@@ -1,6 +1,7 @@
package main
import (
"crypto"
"crypto/md5"
"fmt"
"io"
@@ -10,5 +11,10 @@ func main() {
h := md5.New()
io.WriteString(h, "The fog is getting thicker!")
io.WriteString(h, "And Leon's getting laaarger!")
fmt.Printf("%x", h.Sum(nil))
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))
}

14
_cmptest/sha1demo/sha1.go Normal file
View 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))
}

View 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))
}

View 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))
}

20
_cmptest/urldemo/url.go Normal file
View 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)
}

View 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
View 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{})
}))
}

View 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{})
}()
})
}

View File

@@ -0,0 +1,55 @@
package main
/*
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
*/
import "C"
import (
"fmt"
"unsafe"
)
func main() {
// C.CString example
cstr := C.CString("Hello, World!")
C.puts(cstr)
// C.CBytes example
bytes := []byte{65, 66, 67, 68} // ABCD
cbytes := C.CBytes(bytes)
// C.GoString example
gostr := C.GoString(cstr)
println("Converted back to Go string: ", gostr)
// C.GoStringN example (with length limit)
gostringN := C.GoStringN(cstr, 5) // only take first 5 characters
println("Length-limited string: ", gostringN)
// C.GoBytes example
gobytes := C.GoBytes(cbytes, 4) // 4 is the length
println("Converted back to Go byte slice: ", gobytes)
// C math library examples
x := 2.0
// Calculate square root
sqrtResult := C.sqrt(C.double(x))
fmt.Printf("sqrt(%v) = %v\n", x, float64(sqrtResult))
// Calculate sine
sinResult := C.sin(C.double(x))
fmt.Printf("sin(%v) = %v\n", x, float64(sinResult))
// Calculate cosine
cosResult := C.cos(C.double(x))
fmt.Printf("cos(%v) = %v\n", x, float64(cosResult))
// Calculate natural logarithm
logResult := C.log(C.double(x))
fmt.Printf("log(%v) = %v\n", x, float64(logResult))
C.free(unsafe.Pointer(cstr))
C.free(cbytes)
}

View File

@@ -0,0 +1,15 @@
package main
/*
#include "in.h"
*/
import "C"
import "fmt"
func main() {
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")
}
}

12
_demo/cgocfiles/in.c Normal file
View File

@@ -0,0 +1,12 @@
#include <stdio.h>
#include "in.h"
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;
}

33
_demo/cgocfiles/in.h Normal file
View File

@@ -0,0 +1,33 @@
#pragma once
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;
extern int test_structs(s4* s4, s8* s8, s12* s12, s16* s16, s20* s20);

View File

@@ -0,0 +1,11 @@
package main
/*
#include <stdlib.h>
*/
import "C"
func main() {
p := C.malloc(1024)
defer C.free(p)
}

16
_demo/cgofull/bar.go Normal file
View 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)
}

95
_demo/cgofull/cgofull.go Normal file
View File

@@ -0,0 +1,95 @@
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
#include <stdio.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
}
*/
import "C"
import "fmt"
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")
}
}
func runPy() {
Initialize()
defer Finalize()
Run("print('Hello, Python!')")
}

6
_demo/cgofull/foo.c Normal file
View File

@@ -0,0 +1,6 @@
#include <stdio.h>
#include "foo.h"
void print_foo(Foo* f) {
printf("print_foo: %d\n", f->a);
}

16
_demo/cgofull/foo.go Normal file
View 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
View 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
View 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
}

View File

@@ -0,0 +1,13 @@
package main
/*
#cgo pkg-config: python3-embed
#include <Python.h>
*/
import "C"
func main() {
C.Py_Initialize()
defer C.Py_Finalize()
C.PyRun_SimpleString(C.CString("print('Hello, Python!')"))
}

28
_demo/checkfile/demo.go Normal file
View 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())
}
}
}

View 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
View 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)
}

18
_demo/randcrypt/rand.go Normal file
View 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)
}

View File

@@ -0,0 +1,41 @@
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))
}
}
}

View 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()
}

115
_lldb/README.md Normal file
View File

@@ -0,0 +1,115 @@
## LLGo Plugin of LLDB
### Build with debug info
```shell
LLGO_DEBUG=1 llgo build -o cl/_testdata/debug/out ./cl/_testdata/debug
```
### Debug with lldb
```shell
_lldb/runlldb.sh ./cl/_testdata/debug/out
```
or
```shell
/opt/homebrew/bin/lldb -O "command script import _lldb/llgo_plugin.py" ./cl/_testdata/debug/out
# github.com/goplus/llgo/cl/_testdata/debug
Breakpoint 1: no locations (pending).
Breakpoint set in dummy target, will get copied into future targets.
(lldb) command script import _lldb/llgo_plugin.py
(lldb) target create "./cl/_testdata/debug/out"
Current executable set to '/Users/lijie/source/goplus/llgo/cl/_testdata/debug/out' (arm64).
(lldb) r
Process 21992 launched: '/Users/lijie/source/goplus/llgo/cl/_testdata/debug/out' (arm64)
globalInt: 301
s: 0x100123e40
0x100123be0
5 8
called function with struct
1 2 3 4 5 6 7 8 9 10 +1.100000e+01 +1.200000e+01 true (+1.300000e+01+1.400000e+01i) (+1.500000e+01+1.600000e+01i) [3/3]0x1001129a0 [3/3]0x100112920 hello 0x1001149b0 0x100123ab0 0x100123d10 0x1001149e0 (0x100116810,0x1001149d0) 0x10011bf00 0x10010fa80 (0x100116840,0x100112940) 0x10001b4a4
9
1 (0x1001167e0,0x100112900)
called function with types
0x100123e40
0x1000343d0
Process 21992 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
frame #0: 0x000000010001b3b4 out`main at in.go:225:12
222 // s.i8: '\x01'
223 // s.i16: 2
224 s.i8 = 0x12
-> 225 println(s.i8)
226 // Expected:
227 // all variables: globalInt globalStruct globalStructPtr s i err
228 // s.i8: '\x12'
(lldb) v
var i int = <variable not available>
var s github.com/goplus/llgo/cl/_testdata/debug.StructWithAllTypeFields = {
i8 = '\x12',
i16 = 2,
i32 = 3,
i64 = 4,
i = 5,
u8 = '\x06',
u16 = 7,
u32 = 8,
u64 = 9,
u = 10,
f32 = 11,
f64 = 12,
b = true,
c64 = {real = 13, imag = 14},
c128 = {real = 15, imag = 16},
slice = []int{21, 22, 23},
arr = [3]int{24, 25, 26},
arr2 = [3]github.com/goplus/llgo/cl/_testdata/debug.E{{i = 27}, {i = 28}, {i = 29}},
s = "hello",
e = {i = 30},
pf = 0x0000000100123d10,
pi = 0x00000001001149e0,
intr = {type = 0x0000000100116810, data = 0x00000001001149d0},
m = {count = 4296130304},
c = {},
err = {type = 0x0000000100116840, data = 0x0000000100112940},
fn = {f = 0x000000010001b4a4, data = 0x00000001001149c0},
pad1 = 100,
pad2 = 200
}
var globalStructPtr *github.com/goplus/llgo/cl/_testdata/debug.StructWithAllTypeFields = <variable not available>
var globalStruct github.com/goplus/llgo/cl/_testdata/debug.StructWithAllTypeFields = {
i8 = '\x01',
i16 = 2,
i32 = 3,
i64 = 4,
i = 5,
u8 = '\x06',
u16 = 7,
u32 = 8,
u64 = 9,
u = 10,
f32 = 11,
f64 = 12,
b = true,
c64 = {real = 13, imag = 14},
c128 = {real = 15, imag = 16},
slice = []int{21, 22, 23},
arr = [3]int{24, 25, 26},
arr2 = [3]github.com/goplus/llgo/cl/_testdata/debug.E{{i = 27}, {i = 28}, {i = 29}},
s = "hello",
e = {i = 30},
pf = 0x0000000100123d10,
pi = 0x00000001001149e0,
intr = {type = 0x0000000100116810, data = 0x00000001001149d0},
m = {count = 4296130304},
c = {},
err = {type = 0x0000000100116840, data = 0x0000000100112940},
fn = {f = 0x000000010001b4a4, data = 0x00000001001149c0},
pad1 = 100,
pad2 = 200
}
var globalInt int = 301
var err error = {type = 0x0000000100112900, data = 0x000000000000001a}
```

40
_lldb/common.sh Normal file
View File

@@ -0,0 +1,40 @@
#!/bin/bash
# Function to find LLDB 18+
find_lldb() {
local lldb_paths=(
"/opt/homebrew/bin/lldb"
"/usr/local/bin/lldb"
"/usr/bin/lldb"
"lldb" # This will use the system PATH
)
for lldb_path in "${lldb_paths[@]}"; do
if command -v "$lldb_path" >/dev/null 2>&1; then
local version
version=$("$lldb_path" --version | grep -oE '[0-9]+' | head -1)
if [ "$version" -ge 18 ]; then
echo "$lldb_path"
return 0
fi
fi
done
echo "Error: LLDB 18 or higher not found" >&2
exit 1
}
# Find LLDB 18+
LLDB_PATH=$(find_lldb)
echo "LLDB_PATH: $LLDB_PATH"
$LLDB_PATH --version
export LLDB_PATH
# Default package path
export DEFAULT_PACKAGE_PATH="./cl/_testdata/debug"
# Function to build the project
build_project() {
local package_path="$1"
LLGO_DEBUG=1 go run ./cmd/llgo build -o "${package_path}/debug.out" "${package_path}"
}

297
_lldb/llgo_plugin.py Normal file
View File

@@ -0,0 +1,297 @@
# pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring
from typing import List, Optional, Dict, Any, Tuple
import re
import lldb
def log(*args: Any, **kwargs: Any) -> None:
print(*args, **kwargs, flush=True)
def __lldb_init_module(debugger: lldb.SBDebugger, _: Dict[str, Any]) -> None:
debugger.HandleCommand(
'command script add -f llgo_plugin.print_go_expression p')
debugger.HandleCommand(
'command script add -f llgo_plugin.print_all_variables v')
def is_llgo_compiler(_target: lldb.SBTarget) -> bool:
return True
def get_indexed_value(value: lldb.SBValue, index: int) -> Optional[lldb.SBValue]:
if not value or not value.IsValid():
return None
type_name = value.GetType().GetName()
if type_name.startswith('[]'): # Slice
data_ptr = value.GetChildMemberWithName('data')
element_type = data_ptr.GetType().GetPointeeType()
element_size = element_type.GetByteSize()
ptr_value = int(data_ptr.GetValue(), 16)
element_address = ptr_value + index * element_size
target = value.GetTarget()
return target.CreateValueFromAddress(
f"element_{index}", lldb.SBAddress(element_address, target), element_type)
elif value.GetType().IsArrayType(): # Array
return value.GetChildAtIndex(index)
else:
return None
def evaluate_expression(frame: lldb.SBFrame, expression: str) -> Optional[lldb.SBValue]:
parts = re.findall(r'\*|\w+|\(|\)|\[.*?\]|\.', expression)
def evaluate_part(i: int) -> Tuple[Optional[lldb.SBValue], int]:
nonlocal parts
value: Optional[lldb.SBValue] = None
while i < len(parts):
part = parts[i]
if part == '*':
sub_value, i = evaluate_part(i + 1)
if sub_value and sub_value.IsValid():
value = sub_value.Dereference()
else:
return None, i
elif part == '(':
depth = 1
j = i + 1
while j < len(parts) and depth > 0:
if parts[j] == '(':
depth += 1
elif parts[j] == ')':
depth -= 1
j += 1
value, i = evaluate_part(i + 1)
i = j - 1
elif part == ')':
return value, i + 1
elif part == '.':
if value is None:
value = frame.FindVariable(parts[i+1])
else:
value = value.GetChildMemberWithName(parts[i+1])
i += 2
elif part.startswith('['):
index = int(part[1:-1])
value = get_indexed_value(value, index)
i += 1
else:
if value is None:
value = frame.FindVariable(part)
else:
value = value.GetChildMemberWithName(part)
i += 1
if not value or not value.IsValid():
return None, i
return value, i
value, _ = evaluate_part(0)
return value
def print_go_expression(debugger: lldb.SBDebugger, command: str, result: lldb.SBCommandReturnObject, _internal_dict: Dict[str, Any]) -> None:
frame = debugger.GetSelectedTarget().GetProcess(
).GetSelectedThread().GetSelectedFrame()
value = evaluate_expression(frame, command)
if value and value.IsValid():
result.AppendMessage(format_value(value, debugger))
else:
result.AppendMessage(
f"Error: Unable to evaluate expression '{command}'")
def print_all_variables(debugger: lldb.SBDebugger, _command: str, result: lldb.SBCommandReturnObject, _internal_dict: Dict[str, Any]) -> None:
target = debugger.GetSelectedTarget()
if not is_llgo_compiler(target):
result.AppendMessage("Not a LLGo compiled binary.")
return
frame = debugger.GetSelectedTarget().GetProcess(
).GetSelectedThread().GetSelectedFrame()
variables = frame.GetVariables(True, True, True, True)
output: List[str] = []
for var in variables:
type_name = map_type_name(var.GetType().GetName())
formatted = format_value(var, debugger, include_type=False, indent=0)
output.append(f"var {var.GetName()} {type_name} = {formatted}")
result.AppendMessage("\n".join(output))
def is_pointer(frame: lldb.SBFrame, var_name: str) -> bool:
var = frame.FindVariable(var_name)
return var.IsValid() and var.GetType().IsPointerType()
def format_value(var: lldb.SBValue, debugger: lldb.SBDebugger, include_type: bool = True, indent: int = 0) -> str:
if not var.IsValid():
return "<variable not available>"
var_type = var.GetType()
type_class = var_type.GetTypeClass()
type_name = map_type_name(var_type.GetName())
# Handle typedef types
original_type_name = type_name
while var_type.IsTypedefType():
var_type = var_type.GetTypedefedType()
type_name = map_type_name(var_type.GetName())
type_class = var_type.GetTypeClass()
if var_type.IsPointerType():
return format_pointer(var, debugger, indent, original_type_name)
if type_name.startswith('[]'): # Slice
return format_slice(var, debugger, indent)
elif var_type.IsArrayType():
return format_array(var, debugger, indent)
elif type_name == 'string': # String
return format_string(var)
elif type_class in [lldb.eTypeClassStruct, lldb.eTypeClassClass]:
return format_struct(var, debugger, include_type, indent, original_type_name)
else:
value = var.GetValue()
summary = var.GetSummary()
if value is not None:
return f"{value}" if include_type else str(value)
elif summary is not None:
return f"{summary}" if include_type else summary
else:
return "<variable not available>"
def format_slice(var: lldb.SBValue, debugger: lldb.SBDebugger, indent: int) -> str:
length = var.GetChildMemberWithName('len').GetValue()
if length is None:
return "<variable not available>"
length = int(length)
data_ptr = var.GetChildMemberWithName('data')
elements: List[str] = []
ptr_value = int(data_ptr.GetValue(), 16)
element_type = data_ptr.GetType().GetPointeeType()
element_size = element_type.GetByteSize()
target = debugger.GetSelectedTarget()
indent_str = ' ' * indent
next_indent_str = ' ' * (indent + 1)
for i in range(length):
element_address = ptr_value + i * element_size
element = target.CreateValueFromAddress(
f"element_{i}", lldb.SBAddress(element_address, target), element_type)
value = format_value(
element, debugger, include_type=False, indent=indent+1)
elements.append(value)
type_name = var.GetType().GetName()
if len(elements) > 5: # 如果元素数量大于5则进行折行显示
result = f"{type_name}{{\n{next_indent_str}" + \
f",\n{next_indent_str}".join(elements) + f"\n{indent_str}}}"
else:
result = f"{type_name}{{{', '.join(elements)}}}"
return result
def format_array(var: lldb.SBValue, debugger: lldb.SBDebugger, indent: int) -> str:
elements: List[str] = []
indent_str = ' ' * indent
next_indent_str = ' ' * (indent + 1)
for i in range(var.GetNumChildren()):
value = format_value(var.GetChildAtIndex(
i), debugger, include_type=False, indent=indent+1)
elements.append(value)
array_size = var.GetNumChildren()
element_type = map_type_name(var.GetType().GetArrayElementType().GetName())
type_name = f"[{array_size}]{element_type}"
if len(elements) > 5: # wrap line if too many elements
return f"{type_name}{{\n{next_indent_str}" + f",\n{next_indent_str}".join(elements) + f"\n{indent_str}}}"
else:
return f"{type_name}{{{', '.join(elements)}}}"
def format_string(var: lldb.SBValue) -> str:
summary = var.GetSummary()
if summary is not None:
return summary # Keep the quotes
else:
data = var.GetChildMemberWithName('data').GetValue()
length = var.GetChildMemberWithName('len').GetValue()
if data and length:
length = int(length)
error = lldb.SBError()
return '"%s"' % var.process.ReadCStringFromMemory(int(data, 16), length + 1, error)
return "<variable not available>"
def format_struct(var: lldb.SBValue, debugger: lldb.SBDebugger, include_type: bool = True, indent: int = 0, type_name: str = "") -> str:
children: List[str] = []
indent_str = ' ' * indent
next_indent_str = ' ' * (indent + 1)
for i in range(var.GetNumChildren()):
child = var.GetChildAtIndex(i)
child_name = child.GetName()
child_value = format_value(
child, debugger, include_type=False, indent=indent+1)
children.append(f"{child_name} = {child_value}")
if len(children) > 5: # 如果字段数量大于5则进行折行显示
struct_content = "{\n" + ",\n".join(
[f"{next_indent_str}{child}" for child in children]) + f"\n{indent_str}}}"
else:
struct_content = f"{{{', '.join(children)}}}"
if include_type:
return f"{type_name}{struct_content}"
else:
return struct_content
def format_pointer(var: lldb.SBValue, _debugger: lldb.SBDebugger, _indent: int, _type_name: str) -> str:
if not var.IsValid() or var.GetValueAsUnsigned() == 0:
return "<variable not available>"
return var.GetValue() # Return the address as a string
def map_type_name(type_name: str) -> str:
# Handle pointer types
if type_name.endswith('*'):
base_type = type_name[:-1].strip()
mapped_base_type = map_type_name(base_type)
return f"*{mapped_base_type}"
# Map other types
type_mapping: Dict[str, str] = {
'long': 'int',
'void': 'unsafe.Pointer',
'char': 'byte',
'short': 'int16',
'int': 'int32',
'long long': 'int64',
'unsigned char': 'uint8',
'unsigned short': 'uint16',
'unsigned int': 'uint32',
'unsigned long': 'uint',
'unsigned long long': 'uint64',
'float': 'float32',
'double': 'float64',
}
for c_type, go_type in type_mapping.items():
if type_name.startswith(c_type):
return type_name.replace(c_type, go_type, 1)
return type_name

15
_lldb/runlldb.sh Executable file
View File

@@ -0,0 +1,15 @@
#!/bin/bash
set -e
# Source common functions and variables
# shellcheck source=./_lldb/common.sh
source "$(dirname "$0")/common.sh"
executable="$1"
# Get the directory of the current script
script_dir="$(dirname "$0")"
# Run LLDB with the LLGO plugin
"$LLDB_PATH" -O "command script import ${script_dir}/llgo_plugin.py" "$executable"

69
_lldb/runtest.sh Executable file
View File

@@ -0,0 +1,69 @@
#!/bin/bash
set -e
# Source common functions and variables
# shellcheck source=./_lldb/common.sh
# shellcheck disable=SC1091
source "$(dirname "$0")/common.sh" || exit 1
# Parse command-line arguments
package_path="$DEFAULT_PACKAGE_PATH"
verbose=False
interactive=False
plugin_path=None
while [[ $# -gt 0 ]]; do
case $1 in
-v|--verbose)
verbose=True
shift
;;
-i|--interactive)
interactive=True
shift
;;
-p|--plugin)
plugin_path="\"$2\""
shift 2
;;
*)
package_path="$1"
shift
;;
esac
done
# Build the project
build_project "$package_path" || exit 1
# Set up the result file path
result_file="/tmp/lldb_exit_code"
# Prepare LLDB commands
lldb_commands=(
"command script import _lldb/llgo_plugin.py"
"command script import _lldb/test.py"
"script test.run_tests_with_result('${package_path}/debug.out', ['${package_path}/in.go'], $verbose, $interactive, $plugin_path, '$result_file')"
"quit"
)
# Run LLDB with prepared commands
lldb_command_string=""
for cmd in "${lldb_commands[@]}"; do
lldb_command_string+=" -o \"$cmd\""
done
# Run LLDB with the test script
eval "$LLDB_PATH $lldb_command_string"
# Read the exit code from the result file
if [ -f "$result_file" ]; then
exit_code=$(cat "$result_file")
rm "$result_file"
exit "$exit_code"
else
echo "Error: Could not find exit code file"
exit 1
fi

402
_lldb/test.py Normal file
View File

@@ -0,0 +1,402 @@
# pylint: disable=missing-module-docstring,missing-class-docstring,missing-function-docstring
import os
import sys
import argparse
import signal
from dataclasses import dataclass, field
from typing import List, Optional, Set, Dict, Any
import lldb
import llgo_plugin
from llgo_plugin import log
class LLDBTestException(Exception):
pass
@dataclass
class Test:
source_file: str
line_number: int
variable: str
expected_value: str
@dataclass
class TestResult:
test: Test
status: str
actual: Optional[str] = None
message: Optional[str] = None
missing: Optional[Set[str]] = None
extra: Optional[Set[str]] = None
@dataclass
class TestCase:
source_file: str
start_line: int
end_line: int
tests: List[Test]
@dataclass
class CaseResult:
test_case: TestCase
function: str
results: List[TestResult]
@dataclass
class TestResults:
total: int = 0
passed: int = 0
failed: int = 0
case_results: List[CaseResult] = field(default_factory=list)
class LLDBDebugger:
def __init__(self, executable_path: str, plugin_path: Optional[str] = None) -> None:
self.executable_path: str = executable_path
self.plugin_path: Optional[str] = plugin_path
self.debugger: lldb.SBDebugger = lldb.SBDebugger.Create()
self.debugger.SetAsync(False)
self.target: Optional[lldb.SBTarget] = None
self.process: Optional[lldb.SBProcess] = None
self.type_mapping: Dict[str, str] = {
'long': 'int',
'unsigned long': 'uint',
}
def setup(self) -> None:
if self.plugin_path:
self.debugger.HandleCommand(
f'command script import "{self.plugin_path}"')
self.target = self.debugger.CreateTarget(self.executable_path)
if not self.target:
raise LLDBTestException(
f"Failed to create target for {self.executable_path}")
self.debugger.HandleCommand(
'command script add -f llgo_plugin.print_go_expression p')
self.debugger.HandleCommand(
'command script add -f llgo_plugin.print_all_variables v')
def set_breakpoint(self, file_spec: str, line_number: int) -> lldb.SBBreakpoint:
bp = self.target.BreakpointCreateByLocation(file_spec, line_number)
if not bp.IsValid():
raise LLDBTestException(
f"Failed to set breakpoint at {file_spec}: {line_number}")
return bp
def run_to_breakpoint(self) -> None:
if not self.process:
self.process = self.target.LaunchSimple(None, None, os.getcwd())
else:
self.process.Continue()
if self.process.GetState() != lldb.eStateStopped:
raise LLDBTestException("Process didn't stop at breakpoint")
def get_variable_value(self, var_expression: str) -> Optional[str]:
frame = self.process.GetSelectedThread().GetFrameAtIndex(0)
value = llgo_plugin.evaluate_expression(frame, var_expression)
if value and value.IsValid():
return llgo_plugin.format_value(value, self.debugger)
return None
def get_all_variable_names(self) -> Set[str]:
frame = self.process.GetSelectedThread().GetFrameAtIndex(0)
return set(var.GetName() for var in frame.GetVariables(True, True, True, True))
def get_current_function_name(self) -> str:
frame = self.process.GetSelectedThread().GetFrameAtIndex(0)
return frame.GetFunctionName()
def cleanup(self) -> None:
if self.process and self.process.IsValid():
self.process.Kill()
lldb.SBDebugger.Destroy(self.debugger)
def run_console(self) -> bool:
log("\nEntering LLDB interactive mode.")
log("Type 'quit' to exit and continue with the next test case.")
log("Use Ctrl+D to exit and continue, or Ctrl+C to abort all tests.")
old_stdin, old_stdout, old_stderr = sys.stdin, sys.stdout, sys.stderr
sys.stdin, sys.stdout, sys.stderr = sys.__stdin__, sys.__stdout__, sys.__stderr__
self.debugger.SetAsync(True)
self.debugger.HandleCommand("settings set auto-confirm true")
self.debugger.HandleCommand("command script import lldb")
interpreter = self.debugger.GetCommandInterpreter()
continue_tests = True
def keyboard_interrupt_handler(_sig: Any, _frame: Any) -> None:
nonlocal continue_tests
log("\nTest execution aborted by user.")
continue_tests = False
raise KeyboardInterrupt
original_handler = signal.signal(
signal.SIGINT, keyboard_interrupt_handler)
try:
while continue_tests:
log("\n(lldb) ", end="")
try:
command = input().strip()
except EOFError:
log("\nExiting LLDB interactive mode. Continuing with next test case.")
break
except KeyboardInterrupt:
break
if command.lower() == 'quit':
log("\nExiting LLDB interactive mode. Continuing with next test case.")
break
result = lldb.SBCommandReturnObject()
interpreter.HandleCommand(command, result)
log(result.GetOutput().rstrip() if result.Succeeded()
else result.GetError().rstrip())
finally:
signal.signal(signal.SIGINT, original_handler)
sys.stdin, sys.stdout, sys.stderr = old_stdin, old_stdout, old_stderr
return continue_tests
def parse_expected_values(source_files: List[str]) -> List[TestCase]:
test_cases: List[TestCase] = []
for source_file in source_files:
with open(source_file, 'r', encoding='utf-8') as f:
content = f.readlines()
i = 0
while i < len(content):
line = content[i].strip()
if line.startswith('// Expected:'):
start_line = i + 1
tests: List[Test] = []
i += 1
while i < len(content):
line = content[i].strip()
if not line.startswith('//'):
break
parts = line.lstrip('//').strip().split(':', 1)
if len(parts) == 2:
var, value = map(str.strip, parts)
tests.append(Test(source_file, i + 1, var, value))
i += 1
end_line = i
test_cases.append(
TestCase(source_file, start_line, end_line, tests))
else:
i += 1
return test_cases
def execute_tests(executable_path: str, test_cases: List[TestCase], verbose: bool, interactive: bool, plugin_path: Optional[str]) -> TestResults:
results = TestResults()
for test_case in test_cases:
debugger = LLDBDebugger(executable_path, plugin_path)
try:
if verbose:
log(
f"\nSetting breakpoint at {test_case.source_file}:{test_case.end_line}")
debugger.setup()
debugger.set_breakpoint(test_case.source_file, test_case.end_line)
debugger.run_to_breakpoint()
all_variable_names = debugger.get_all_variable_names()
case_result = execute_test_case(
debugger, test_case, all_variable_names)
results.total += len(case_result.results)
results.passed += sum(1 for r in case_result.results if r.status == 'pass')
results.failed += sum(1 for r in case_result.results if r.status != 'pass')
results.case_results.append(case_result)
case = case_result.test_case
loc = f"{case.source_file}:{case.start_line}-{case.end_line}"
if verbose or interactive or any(r.status != 'pass' for r in case_result.results):
log(f"\nTest case: {loc} in function '{case_result.function}'")
for result in case_result.results:
print_test_result(result, verbose=verbose)
if interactive and any(r.status != 'pass' for r in case_result.results):
log("\nTest case failed. Entering LLDB interactive mode.")
continue_tests = debugger.run_console()
if not continue_tests:
log("Aborting all tests.")
break
finally:
debugger.cleanup()
return results
def run_tests(executable_path: str, source_files: List[str], verbose: bool, interactive: bool, plugin_path: Optional[str]) -> int:
test_cases = parse_expected_values(source_files)
if verbose:
log(f"Running tests for {', '.join(source_files)} with {executable_path}")
log(f"Found {len(test_cases)} test cases")
results = execute_tests(executable_path, test_cases,
verbose, interactive, plugin_path)
print_test_results(results)
# Return 0 if all tests passed, 1 otherwise
return 0 if results.failed == 0 else 1
def execute_test_case(debugger: LLDBDebugger, test_case: TestCase, all_variable_names: Set[str]) -> CaseResult:
results: List[TestResult] = []
for test in test_case.tests:
if test.variable == "all variables":
result = execute_all_variables_test(test, all_variable_names)
else:
result = execute_single_variable_test(debugger, test)
results.append(result)
return CaseResult(test_case, debugger.get_current_function_name(), results)
def execute_all_variables_test(test: Test, all_variable_names: Set[str]) -> TestResult:
expected_vars = set(test.expected_value.split())
if expected_vars == all_variable_names:
return TestResult(
test=test,
status='pass',
actual=all_variable_names
)
else:
return TestResult(
test=test,
status='fail',
actual=all_variable_names,
missing=expected_vars - all_variable_names,
extra=all_variable_names - expected_vars
)
def execute_single_variable_test(debugger: LLDBDebugger, test: Test) -> TestResult:
actual_value = debugger.get_variable_value(test.variable)
if actual_value is None:
return TestResult(
test=test,
status='error',
message=f'Unable to fetch value for {test.variable}'
)
actual_value = actual_value.strip()
expected_value = test.expected_value.strip()
if actual_value == expected_value:
return TestResult(
test=test,
status='pass',
actual=actual_value
)
else:
return TestResult(
test=test,
status='fail',
actual=actual_value
)
def print_test_results(results: TestResults) -> None:
log("\nTest results:")
log(f" Total tests: {results.total}")
log(f" Passed tests: {results.passed}")
log(f" Failed tests: {results.failed}")
if results.total == results.passed:
log("All tests passed!")
else:
log("Some tests failed")
def print_test_result(result: TestResult, verbose: bool) -> None:
status_symbol = "" if result.status == 'pass' else ""
status_text = "Pass" if result.status == 'pass' else "Fail"
test = result.test
if result.status == 'pass':
if verbose:
log(f"{status_symbol} Line {test.line_number}, {test.variable}: {status_text}")
if test.variable == 'all variables':
log(f" Variables: {', '.join(sorted(result.actual))}")
else: # fail or error
log(f"{status_symbol} Line {test.line_number}, {test.variable}: {status_text}")
if test.variable == 'all variables':
if result.missing:
log(f" Missing variables: {', '.join(sorted(result.missing))}")
if result.extra:
log(f" Extra variables: {', '.join(sorted(result.extra))}")
log(f" Expected: {', '.join(sorted(test.expected_value.split()))}")
log(f" Actual: {', '.join(sorted(result.actual))}")
elif result.status == 'error':
log(f" Error: {result.message}")
else:
log(f" Expected: {test.expected_value}")
log(f" Actual: {result.actual}")
def run_tests_with_result(executable_path: str, source_files: List[str], verbose: bool, interactive: bool, plugin_path: Optional[str], result_path: str) -> int:
try:
exit_code = run_tests(executable_path, source_files,
verbose, interactive, plugin_path)
except Exception as e:
log(f"An error occurred during test execution: {str(e)}")
exit_code = 2 # Use a different exit code for unexpected errors
try:
with open(result_path, 'w', encoding='utf-8') as f:
f.write(str(exit_code))
except IOError as e:
log(f"Error writing result to file {result_path}: {str(e)}")
# If we can't write to the file, we should still return the exit code
return exit_code
def main() -> None:
log(sys.argv)
parser = argparse.ArgumentParser(
description="LLDB 18 Debug Script with DWARF 5 Support")
parser.add_argument("executable", help="Path to the executable")
parser.add_argument("sources", nargs='+', help="Paths to the source files")
parser.add_argument("-v", "--verbose", action="store_true",
help="Enable verbose output")
parser.add_argument("-i", "--interactive", action="store_true",
help="Enable interactive mode on test failure")
parser.add_argument("--plugin", help="Path to the LLDB plugin")
parser.add_argument("--result-path", help="Path to write the result")
args = parser.parse_args()
plugin_path = args.plugin or os.path.join(os.path.dirname(
os.path.realpath(__file__)), "go_lldb_plugin.py")
try:
if args.result_path:
exit_code = run_tests_with_result(args.executable, args.sources,
args.verbose, args.interactive, plugin_path, args.result_path)
else:
exit_code = run_tests(args.executable, args.sources,
args.verbose, args.interactive, plugin_path)
except Exception as e:
log(f"An unexpected error occurred: {str(e)}")
exit_code = 2 # Use a different exit code for unexpected errors
sys.exit(exit_code)
if __name__ == "__main__":
main()

12
c/c.go
View File

@@ -79,9 +79,15 @@ func AllocaNew[T any]() *T { return nil }
//go:linkname Malloc C.malloc
func Malloc(size uintptr) Pointer
//go:linkname Calloc C.calloc
func Calloc(num uintptr, size uintptr) Pointer
//go:linkname Free C.free
func Free(ptr Pointer)
//go:linkname Realloc C.realloc
func Realloc(ptr Pointer, size uintptr) Pointer
//go:linkname Memcpy C.memcpy
func Memcpy(dst, src Pointer, n uintptr) Pointer
@@ -213,6 +219,9 @@ func Fputc(c Int, fp FilePtr) Int
//go:linkname Fputs C.fputs
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
func Fflush(fp FilePtr) Int
@@ -267,3 +276,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
// -----------------------------------------------------------------------------
//go:linkname Sysconf C.sysconf
func Sysconf(name Int) Long

View File

@@ -26,87 +26,25 @@ const (
LLGoPackage = "link: $(pkg-config --libs libcjson); -lcjson"
)
type Bool c.Int
// llgo:type C
type JSON struct {
Unused [0]byte
}
//go:linkname Parse C.cJSON_Parse
func Parse(value *c.Char) *JSON
//go:linkname ParseWithLength C.cJSON_ParseWithLength
func ParseWithLength(value *byte, valueLength uintptr) *JSON
func ParseBytes(value []byte) *JSON {
return ParseWithLength(unsafe.SliceData(value), uintptr(len(value)))
return ParseWithLength((*c.Char)(unsafe.Pointer(unsafe.SliceData(value))), uintptr(len(value)))
}
func ParseString(value string) *JSON {
return ParseWithLength(unsafe.StringData(value), uintptr(len(value)))
return ParseWithLength((*c.Char)(unsafe.Pointer(unsafe.StringData(value))), uintptr(len(value)))
}
//go:linkname Null C.cJSON_CreateNull
func Null() *JSON
//go:linkname True C.cJSON_CreateTrue
func True() *JSON
//go:linkname False C.cJSON_CreateFalse
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
// CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item);
//
//go:linkname Raw C.cJSON_CreateRaw
func Raw(raw *c.Char) *JSON
// Create a string where valuestring references a string so
// it will not be freed by Delete
// Render a cJSON entity to text for transfer/storage without any formatting.
//
//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
func (o *JSON) CStr() *c.Char { return nil }
@@ -115,39 +53,618 @@ func (o *JSON) CStr() *c.Char { return nil }
// llgo:link (*JSON).Cstr C.cJSON_PrintUnformatted
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.
//
// llgo:link (*JSON).Print C.cJSON_Print
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.
//
// llgo:link (*JSON).PrintUnformatted C.cJSON_PrintUnformatted
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.
//
// prebuffer is a guess at the final size. guessing well reduces reallocation.
//
// fmt=0 gives unformatted, =1 gives formatted.
//
// 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 }
// llgo:link (*JSON).GetObjectItemCaseSensitive C.cJSON_GetObjectItemCaseSensitive
func (o *JSON) GetObjectItemCaseSensitive(key *c.Char) *JSON { 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)
//go:linkname FreeCStr C.cJSON_free
func FreeCStr(*c.Char)

View File

@@ -1,61 +0,0 @@
package main
import (
"fmt"
"os"
"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() {
if c.Argc != 2 {
fmt.Fprintln(os.Stderr, "Usage: castdump <headerFile>")
return
}
sourceFile := *c.Advance(c.Argv, 1)
index := clang.CreateIndex(0, 0)
unit := index.ParseTranslationUnit(
sourceFile,
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()
}

View File

@@ -0,0 +1,35 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/clang"
"github.com/goplus/llgo/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)
}

View File

@@ -12,6 +12,7 @@ import (
type Context struct {
namespaceName string
className string
unit *clang.TranslationUnit
}
func newContext() *Context {
@@ -26,23 +27,51 @@ func (c *Context) setClassName(name string) {
c.className = name
}
func (c *Context) setUnit(unit *clang.TranslationUnit) {
c.unit = unit
}
var context = newContext()
func print_cursor_info(cursor clang.Cursor) {
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()
defer filename.Dispose()
if context.namespaceName != "" && context.className != "" {
fmt.Printf("%s:%s:", context.namespaceName, context.className)
@@ -51,7 +80,7 @@ func print_cursor_info(cursor clang.Cursor) {
}
c.Printf(c.Str("%s\n"), cursorStr.CStr())
if cursor.Kind == clang.CXXMethod || cursor.Kind == clang.FunctionDecl {
if cursor.Kind == clang.CursorCXXMethod || cursor.Kind == clang.CursorFunctionDecl {
c.Printf(c.Str("symbol:%s\n"), symbol.CStr())
typeStr := cursor.ResultType().String()
@@ -78,18 +107,20 @@ func print_cursor_info(cursor clang.Cursor) {
}
func visit(cursor, parent clang.Cursor, clientData c.Pointer) clang.ChildVisitResult {
if cursor.Kind == clang.Namespace {
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.ClassDecl {
} 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.CXXMethod || cursor.Kind == clang.FunctionDecl {
print_cursor_info(cursor)
} else if cursor.Kind == clang.CursorCXXMethod || cursor.Kind == clang.CursorFunctionDecl {
printFuncInfo(cursor)
}
return clang.ChildVisit_Continue
@@ -105,7 +136,7 @@ func parse(filename *c.Char) {
filename,
unsafe.SliceData(args), 3,
nil, 0,
clang.TranslationUnit_None,
clang.DetailedPreprocessingRecord,
)
if unit == nil {
@@ -113,6 +144,7 @@ func parse(filename *c.Char) {
c.Exit(1)
}
context.setUnit(unit)
cursor := unit.Cursor()
clang.VisitChildren(cursor, visit, nil)

View File

@@ -15,9 +15,51 @@ CXChildVisitResult wrap_visitor(CXCursor cursor, CXCursor parent, CXClientData d
extern "C" {
CXString wrap_clang_getCursorSpelling(CXCursor *cur) { return clang_getCursorSpelling(*cur); }
void wrap_clang_getLocation(CXTranslationUnit tu, CXFile file, unsigned line, unsigned column, CXSourceLocation *loc) {
*loc = clang_getLocation(tu, file, line, column);
}
CXString wrap_clang_Cursor_getMangling(CXCursor *cur) { return clang_Cursor_getMangling(*cur); }
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_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); }
@@ -25,21 +67,134 @@ void wrap_clang_Cursor_getArgument(CXCursor *C, unsigned i, CXCursor *argCur) {
*argCur = clang_Cursor_getArgument(*C, i);
}
void wrap_clang_getTranslationUnitCursor(CXTranslationUnit uint, CXCursor *cur) {
*cur = clang_getTranslationUnitCursor(uint);
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_getCursorType(CXCursor *cur, CXType *typ) { *typ = clang_getCursorType(*cur); }
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); }
CXString wrap_clang_getTypeSpelling(CXType *typ) { return clang_getTypeSpelling(*typ); }
void wrap_clang_getElementType(CXType *Typ, CXType *elemTyp) { *elemTyp = clang_getElementType(*Typ); }
void wrap_clang_getCursorLocation(CXCursor *cur, CXSourceLocation *loc) { *loc = clang_getCursorLocation(*cur); }
void wrap_clang_getArrayElementType(CXType *arrayTyp, CXType *elemTyp) {
*elemTyp = clang_getArrayElementType(*arrayTyp);
}
void wrap_clang_getSpellingLocation(CXSourceLocation *loc, CXFile *file, unsigned *line, unsigned *column,
unsigned *offset) {
clang_getSpellingLocation(*loc, file, line, column, offset);
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); }
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) {
@@ -47,4 +202,15 @@ unsigned wrap_clang_visitChildren(CXCursor *parent, wrap_CXCursorVisitor 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"

File diff suppressed because it is too large Load Diff

25
c/ffi/_demo/_wrap/wrap.c Normal file
View File

@@ -0,0 +1,25 @@
#include <stdio.h>
struct array
{
int x;
int y;
int z;
int k;
};
int demo1(struct array a)
{
printf("c.demo1: %d %d %d %d\n",a.x,a.y,a.z,a.k);
return a.x+a.y+a.z+a.k;
}
int demo2( int (*fn)(struct array)) {
printf("c.demo2: %p\n",fn);
struct array a;
a.x = 1;
a.y = 2;
a.z = 3;
a.k = 4;
return (*fn)(a);
}

65
c/ffi/_demo/cfunc/main.go Normal file
View File

@@ -0,0 +1,65 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/ffi"
)
const (
LLGoPackage = "link"
LLGoFiles = "../_wrap/wrap.c"
)
//llgo:type C
type Callback func(array) c.Int
//go:linkname demo1 C.demo1
func demo1(array) c.Int
//go:linkname demo2 C.demo2
func demo2(fn Callback) c.Int
//llgo:type C
type array struct {
x c.Int
y c.Int
z c.Int
k c.Int
}
var (
typeInt32 = &ffi.Type{4, 4, ffi.Sint32, nil}
typePointer = &ffi.Type{unsafe.Sizeof(0), uint16(unsafe.Alignof(0)), ffi.Pointer, nil}
)
func main() {
cdemo1()
cdemo2()
}
func cdemo1() {
var cif ffi.Cif
tarray := &ffi.Type{0, 0, ffi.Struct, &[]*ffi.Type{typeInt32, typeInt32, typeInt32, typeInt32, nil}[0]}
status := ffi.PrepCif(&cif, ffi.DefaultAbi, 1, typeInt32, &[]*ffi.Type{tarray}[0])
if status != ffi.OK {
panic(status)
}
ar := array{1, 2, 3, 4}
var ret int32
ffi.Call(&cif, c.Func(demo1), unsafe.Pointer(&ret), &[]unsafe.Pointer{unsafe.Pointer(&ar)}[0])
c.Printf(c.Str("ret: %d\n"), ret)
}
func cdemo2() {
var cif ffi.Cif
status := ffi.PrepCif(&cif, ffi.DefaultAbi, 1, typeInt32, &[]*ffi.Type{typePointer}[0])
if status != ffi.OK {
panic(status)
}
var ret int32
fn := c.Func(demo1)
ffi.Call(&cif, c.Func(demo2), unsafe.Pointer(&ret), &[]unsafe.Pointer{unsafe.Pointer(&fn)}[0])
c.Printf(c.Str("ret: %d\n"), ret)
}

View File

@@ -0,0 +1,93 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/ffi"
)
const (
LLGoPackage = "link"
LLGoFiles = "../_wrap/wrap.c"
)
//llgo:type C
type Callback func(array) c.Int
//go:linkname demo1 C.demo1
func demo1(array) c.Int
//go:linkname demo2 C.demo2
func demo2(fn Callback) c.Int
//llgo:type C
type array struct {
x c.Int
y c.Int
z c.Int
k c.Int
}
func demo(a array) c.Int {
c.Printf(c.Str("go.demo %d %d %d %d\n"), a.x, a.y, a.z, a.k)
return a.x + a.y + a.z + a.k
}
var (
typeInt32 = &ffi.Type{4, 4, ffi.Sint32, nil}
typePointer = &ffi.Type{unsafe.Sizeof(0), uint16(unsafe.Alignof(0)), ffi.Pointer, nil}
)
func main() {
gofn()
c.Printf(c.Str("\n"))
goclosure()
}
func gofn() {
var cif ffi.Cif
status := ffi.PrepCif(&cif, ffi.DefaultAbi, 1, typeInt32, &[]*ffi.Type{typePointer}[0])
if status != ffi.OK {
panic(status)
}
var fncode unsafe.Pointer
closure := ffi.ClosureAlloc(&fncode)
defer ffi.ClosureFree(closure)
status = ffi.PreClosureLoc(closure, &cif, func(cif *ffi.Cif, ret unsafe.Pointer, args *unsafe.Pointer, userdata unsafe.Pointer) {
ar := *(*array)(ffi.Index(args, 0))
*(*c.Int)(ret) = demo(ar)
}, nil, fncode)
if status != ffi.OK {
panic(status)
}
var ret int32
ffi.Call(&cif, c.Func(demo2), unsafe.Pointer(&ret), &[]unsafe.Pointer{unsafe.Pointer(&fncode)}[0])
c.Printf(c.Str("ret: %d\n"), ret)
}
func goclosure() {
var cif ffi.Cif
status := ffi.PrepCif(&cif, ffi.DefaultAbi, 1, typeInt32, &[]*ffi.Type{typePointer}[0])
if status != ffi.OK {
panic(status)
}
fn := func(ar array) c.Int {
c.Printf(c.Str("call closure %d\n"), cif.NArgs)
return demo(ar)
}
var fncode unsafe.Pointer
closure := ffi.ClosureAlloc(&fncode)
defer ffi.ClosureFree(closure)
status = ffi.PreClosureLoc(closure, &cif, func(cif *ffi.Cif, ret unsafe.Pointer, args *unsafe.Pointer, userdata unsafe.Pointer) {
ar := *(*array)(ffi.Index(args, 0))
fn := *(*func(array) c.Int)(userdata)
*(*c.Int)(ret) = fn(ar)
}, unsafe.Pointer(&fn), fncode)
if status != ffi.OK {
panic(status)
}
var ret int32
ffi.Call(&cif, c.Func(demo2), unsafe.Pointer(&ret), &[]unsafe.Pointer{unsafe.Pointer(&fncode)}[0])
c.Printf(c.Str("ret: %d\n"), ret)
}

View File

@@ -0,0 +1,26 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/ffi"
)
var (
typeInt32 = &ffi.Type{4, 4, ffi.Sint32, nil}
typePointer = &ffi.Type{unsafe.Sizeof(0), uint16(unsafe.Alignof(0)), ffi.Pointer, nil}
)
func main() {
var cif ffi.Cif
status := ffi.PrepCifVar(&cif, ffi.DefaultAbi, 1, 2, typeInt32, &[]*ffi.Type{typePointer, typeInt32}[0])
if status != ffi.OK {
panic(status)
}
var ret int32
text := c.Str("hello world: %d\n")
var n int32 = 100
ffi.Call(&cif, c.Func(c.Printf), unsafe.Pointer(&ret), &[]unsafe.Pointer{unsafe.Pointer(&text), unsafe.Pointer(&n)}[0])
c.Printf(c.Str("ret: %d\n"), ret)
}

5
c/ffi/_wrap/libffi.c Normal file
View File

@@ -0,0 +1,5 @@
#include <ffi.h>
void *llog_ffi_closure_alloc(void **code) {
return ffi_closure_alloc(sizeof(ffi_closure), code);
}

7
c/ffi/abi.go Normal file
View File

@@ -0,0 +1,7 @@
//go:build ((freebsd || linux || darwin) && arm64) || (windows && (amd64 || arm64))
package ffi
const (
DefaultAbi = 1
)

7
c/ffi/abi_amd64.go Normal file
View File

@@ -0,0 +1,7 @@
//go:build freebsd || linux || darwin
package ffi
const (
DefaultAbi = 2
)

132
c/ffi/ffi.go Normal file
View File

@@ -0,0 +1,132 @@
package ffi
import (
"unsafe"
"github.com/goplus/llgo/c"
)
const (
LLGoPackage = "link: $(pkg-config --libs libffi); -lffi"
LLGoFiles = "$(pkg-config --cflags libffi): _wrap/libffi.c"
)
const (
Void = iota
Int
Float
Double
LongDouble
Uint8
Sint8
Uint16
Sint16
Uint32
Sint32
Uint64
Sint64
Struct
Pointer
Complex
)
const (
OK = iota
BAD_TYPEDEF
BAD_ABI
BAD_ARGTYPE
)
type Type struct {
Size uintptr
Alignment uint16
Type uint16
Elements **Type
}
/*typedef struct {
ffi_abi abi;
unsigned nargs;
ffi_type **arg_types;
ffi_type *rtype;
unsigned bytes;
unsigned flags;
#ifdef FFI_EXTRA_CIF_FIELDS
FFI_EXTRA_CIF_FIELDS;
#endif
} ffi_cif;
*/
type Cif struct {
Abi c.Uint
NArgs c.Uint
ArgTypes **Type
RType *Type
Bytes c.Uint
Flags c.Uint
//Extra c.Uint
}
/*
ffi_status
ffi_prep_cif(ffi_cif *cif,
ffi_abi abi,
unsigned int nargs,
ffi_type *rtype,
ffi_type **atypes);
*/
//go:linkname PrepCif C.ffi_prep_cif
func PrepCif(cif *Cif, abi c.Uint, nargs c.Uint, rtype *Type, atype **Type) c.Uint
/*
ffi_status ffi_prep_cif_var(ffi_cif *cif,
ffi_abi abi,
unsigned int nfixedargs,
unsigned int ntotalargs,
ffi_type *rtype,
ffi_type **atypes);
*/
//go:linkname PrepCifVar C.ffi_prep_cif_var
func PrepCifVar(cif *Cif, abi c.Uint, nfixedargs c.Uint, ntotalargs c.Uint, rtype *Type, atype **Type) c.Uint
/*
void ffi_call(ffi_cif *cif,
void (*fn)(void),
void *rvalue,
void **avalue);
*/
//go:linkname Call C.ffi_call
func Call(cif *Cif, fn unsafe.Pointer, rvalue unsafe.Pointer, avalue *unsafe.Pointer)
// void *ffi_closure_alloc (size_t size, void **code);
//
//go:linkname ClosureAlloc C.llog_ffi_closure_alloc
func ClosureAlloc(code *unsafe.Pointer) unsafe.Pointer
// void ffi_closure_free (void *);
//
//go:linkname ClosureFree C.ffi_closure_free
func ClosureFree(unsafe.Pointer)
/*
ffi_status
ffi_prep_closure_loc (ffi_closure*,
ffi_cif *,
void (*fun)(ffi_cif*,void*,void**,void*),
void *user_data,
void *codeloc);
*/
//llgo:type C
type ClosureFunc func(cif *Cif, ret unsafe.Pointer, args *unsafe.Pointer, userdata unsafe.Pointer)
//go:linkname PreClosureLoc C.ffi_prep_closure_loc
func PreClosureLoc(closure unsafe.Pointer, cif *Cif, fn ClosureFunc, userdata unsafe.Pointer, codeloc unsafe.Pointer) c.Uint
func add(ptr unsafe.Pointer, offset uintptr) unsafe.Pointer {
return unsafe.Pointer(uintptr(ptr) + offset)
}
func Index(args *unsafe.Pointer, i uintptr) unsafe.Pointer {
return (*(*unsafe.Pointer)(add(unsafe.Pointer(args), i*unsafe.Sizeof(0))))
}

View File

@@ -0,0 +1,41 @@
package main
import (
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/libuv"
)
func ensure(b bool, msg string) {
if !b {
panic(msg)
}
}
func main() {
loop := libuv.LoopNew()
defer loop.Close()
a := &libuv.Async{}
r := loop.Async(a, func(a *libuv.Async) {
println("async callback")
a.Close(nil) // or loop.Stop()
})
ensure(r == 0, "Async failed")
go func() {
println("begin async task")
c.Usleep(100 * 1000)
println("send async event")
ensure(a.Send() == 0, "Send failed")
}()
loop.Run(libuv.RUN_DEFAULT)
println("done")
}
/*Expected Output:
begin async task
send async event
async callback
done
*/

View File

@@ -13,11 +13,11 @@ const BUFFER_SIZE = 1024
var (
loop *libuv.Loop
openReq libuv.Fs
readReq libuv.Fs
closeReq libuv.Fs
buffer [BUFFER_SIZE]c.Char
iov libuv.Buf
file libuv.File
)
func main() {
@@ -31,7 +31,11 @@ func main() {
libuv.FsOpen(loop, &openReq, c.Str("example.txt"), os.O_RDONLY, 0, onOpen)
// Run the loop
libuv.Run(loop, libuv.RUN_DEFAULT)
result := loop.Run(libuv.RUN_DEFAULT)
if result != 0 {
c.Fprintf(c.Stderr, c.Str("Error in Run: %s\n"), libuv.Strerror(libuv.Errno(result)))
}
// Cleanup
defer cleanup()
@@ -39,59 +43,74 @@ func main() {
func onOpen(req *libuv.Fs) {
// Check for errors
if libuv.FsGetResult(req) < 0 {
c.Fprintf(c.Stderr, c.Str("Error opening file: %s\n"), libuv.Strerror(libuv.Errno(libuv.LoopClose(loop))))
libuv.LoopClose(loop)
if req.GetResult() < 0 {
c.Fprintf(c.Stderr, c.Str("Error opening file: %s\n"), libuv.Strerror(libuv.Errno(req.GetResult())))
loop.Close()
return
}
// Store the file descriptor
file = libuv.File(req.GetResult())
// Init buffer
iov = libuv.InitBuf((*c.Char)(unsafe.Pointer(&buffer[0])), c.Uint(unsafe.Sizeof(buffer)))
// Read the file
readRes := libuv.FsRead(loop, &readReq, libuv.File(libuv.FsGetResult(req)), &iov, 1, -1, onRead)
readFile()
}
func readFile() {
// Initialize the request every time
var readReq libuv.Fs
// Read the file
readRes := libuv.FsRead(loop, &readReq, file, &iov, 1, -1, onRead)
if readRes != 0 {
c.Printf(c.Str("Error in FsRead: %s (code: %d)\n"), libuv.Strerror(libuv.Errno(readRes)), readRes)
libuv.LoopClose(loop)
return
readReq.ReqCleanup()
loop.Close()
}
}
func onRead(req *libuv.Fs) {
// Cleanup the request
defer req.ReqCleanup()
// Check for errors
if libuv.FsGetResult(req) < 0 {
c.Fprintf(c.Stderr, c.Str("Read error: %s\n"), libuv.Strerror(libuv.Errno(libuv.FsGetResult(req))))
libuv.LoopClose(loop)
} else if libuv.FsGetResult(req) == 0 {
c.Printf(c.Str("EOF\n"))
if req.GetResult() < 0 {
c.Fprintf(c.Stderr, c.Str("Read error: %s\n"), libuv.Strerror(libuv.Errno(req.GetResult())))
} else if req.GetResult() == 0 {
// Close the file
closeRes := libuv.FsClose(loop, &closeReq, libuv.File(libuv.FsGetResult(&openReq)), onClose)
closeRes := libuv.FsClose(loop, &closeReq, libuv.File(openReq.GetResult()), onClose)
if closeRes != 0 {
// Print the content
c.Printf(c.Str("Error in FsClose: %s (code: %d)\n"), libuv.Strerror(libuv.Errno(closeRes)), closeRes)
libuv.LoopClose(loop)
loop.Close()
return
}
} else {
c.Printf(c.Str("Read %d bytes\n"), libuv.FsGetResult(req))
c.Printf(c.Str("Read content: %.*s\n"), libuv.FsGetResult(req), (*c.Char)(unsafe.Pointer(&buffer[0])))
libuv.LoopClose(loop)
c.Printf(c.Str("Read %d bytes\n"), req.GetResult())
c.Printf(c.Str("Read content: %.*s\n"), req.GetResult(), (*c.Char)(unsafe.Pointer(&buffer[0])))
// Read the file again
readFile()
}
}
func onClose(req *libuv.Fs) {
// Check for errors
if libuv.FsGetResult(req) < 0 {
c.Fprintf(c.Stderr, c.Str("Error closing file: %s\n"), libuv.Strerror(libuv.Errno(libuv.FsGetResult(req))))
if req.GetResult() < 0 {
c.Fprintf(c.Stderr, c.Str("Error closing file: %s\n"), libuv.Strerror(libuv.Errno(req.GetResult())))
} else {
c.Printf(c.Str("\nFile closed successfully.\n"))
}
libuv.LoopClose(loop)
}
func cleanup() {
// Cleanup the requests
libuv.FsReqCleanup(&openReq)
libuv.FsReqCleanup(&readReq)
libuv.FsReqCleanup(&closeReq)
openReq.ReqCleanup()
closeReq.ReqCleanup()
// Close the loop
libuv.LoopClose(loop)
result := loop.Close()
if result != 0 {
c.Fprintf(c.Stderr, c.Str("Error in LoopClose: %s\n"), libuv.Strerror(libuv.Errno(result)))
}
}

View File

@@ -1,8 +1,6 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/libuv"
"github.com/goplus/llgo/c/net"
@@ -11,8 +9,6 @@ import (
var DEFAULT_PORT c.Int = 8080
var DEFAULT_BACKLOG c.Int = 128
var loop *libuv.Loop
type WriteReq struct {
Req libuv.Write
Buf libuv.Buf
@@ -20,11 +16,11 @@ type WriteReq struct {
func main() {
// Initialize the default event loop
loop = libuv.DefaultLoop()
var loop = libuv.DefaultLoop()
// Initialize a TCP server
var server libuv.Tcp
libuv.InitTcp(loop, &server)
server := &libuv.Tcp{}
libuv.InitTcp(loop, server)
// Set up the address to bind the server to
var addr net.SockaddrIn
@@ -32,22 +28,24 @@ func main() {
c.Printf(c.Str("Listening on %s:%d\n"), c.Str("0.0.0.0"), DEFAULT_PORT)
// Bind the server to the specified address and port
(&server).Bind((*net.SockAddr)(c.Pointer(&addr)), 0)
res := (*libuv.Stream)(&server).Listen(DEFAULT_BACKLOG, OnNewConnection)
server.Bind((*net.SockAddr)(c.Pointer(&addr)), 0)
res := (*libuv.Stream)(server).Listen(DEFAULT_BACKLOG, OnNewConnection)
if res != 0 {
c.Fprintf(c.Stderr, c.Str("Listen error: %s\n"), libuv.Strerror((libuv.Errno(res))))
c.Fprintf(c.Stderr, c.Str("Listen error: %s\n"), libuv.Strerror(libuv.Errno(res)))
return
}
// Start listening for incoming connections
libuv.Run(loop, libuv.RUN_DEFAULT)
loop.Run(libuv.RUN_DEFAULT)
}
func FreeWriteReq(req *libuv.Write) {
wr := (*WriteReq)(c.Pointer(req))
// Free the buffer base and the WriteReq itself.
// Free the buffer base.
if wr.Buf.Base != nil {
c.Free(c.Pointer(wr.Buf.Base))
c.Free(c.Pointer(wr))
wr.Buf.Base = nil
}
}
func AllocBuffer(handle *libuv.Handle, suggestedSize uintptr, buf *libuv.Buf) {
@@ -58,29 +56,24 @@ func AllocBuffer(handle *libuv.Handle, suggestedSize uintptr, buf *libuv.Buf) {
func EchoWrite(req *libuv.Write, status c.Int) {
if status != 0 {
c.Fprintf(c.Stderr, c.Str("Write error: %s\n"), libuv.Strerror((libuv.Errno(status))))
c.Fprintf(c.Stderr, c.Str("Write error: %s\n"), libuv.Strerror(libuv.Errno(status)))
}
FreeWriteReq(req)
}
func EchoRead(client *libuv.Stream, nread c.Long, buf *libuv.Buf) {
if nread > 0 {
req := (*WriteReq)(c.Malloc(unsafe.Sizeof(WriteReq{})))
if req == nil {
c.Fprintf(c.Stderr, c.Str("Failed to allocate memory for write request\n"))
c.Free(c.Pointer(buf.Base))
return
}
req := new(WriteReq)
// Initialize the buffer with the data read.
req.Buf = libuv.InitBuf(buf.Base, c.Uint(nread))
// Write the data back to the client.
(&req.Req).Write(client, &req.Buf, 1, EchoWrite)
req.Req.Write(client, &req.Buf, 1, EchoWrite)
return
}
if nread < 0 {
// Handle read errors and EOF.
if (libuv.Errno)(nread) != libuv.EOF {
c.Fprintf(c.Stderr, c.Str("Read error: %s\n"), libuv.Strerror((libuv.Errno)(nread)))
c.Fprintf(c.Stderr, c.Str("Read error: %s\n"), libuv.Strerror(libuv.Errno(nread)))
}
(*libuv.Handle)(c.Pointer(client)).Close(nil)
}
@@ -97,7 +90,7 @@ func OnNewConnection(server *libuv.Stream, status c.Int) {
}
// Allocate memory for a new client.
client := (*libuv.Tcp)(c.Malloc(unsafe.Sizeof(libuv.Tcp{})))
client := &libuv.Tcp{}
if client == nil {
c.Fprintf(c.Stderr, c.Str("Failed to allocate memory for client\n"))
@@ -105,9 +98,8 @@ func OnNewConnection(server *libuv.Stream, status c.Int) {
}
// Initialize the client TCP handle.
if libuv.InitTcp(loop, client) < 0 {
if libuv.InitTcp(libuv.DefaultLoop(), client) < 0 {
c.Fprintf(c.Stderr, c.Str("Failed to initialize client\n"))
c.Free(c.Pointer(client))
return
}

5
c/libuv/_wrap/libuv.c Normal file
View File

@@ -0,0 +1,5 @@
#include <uv.h>
int uv_tcp_get_io_watcher_fd (uv_tcp_t* handle) {
return handle->io_watcher.fd;
}

50
c/libuv/async.go Normal file
View File

@@ -0,0 +1,50 @@
/*
* Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package libuv
import (
_ "unsafe"
"github.com/goplus/llgo/c"
)
// struct uv_async_t
type Async struct {
Handle
// On macOS arm64, sizeof uv_async_t is 128 bytes.
// Handle is 92 bytes, so we need 36 bytes to fill the gap.
// Maybe reserve more for future use.
Unused [36]byte
}
// typedef void (*uv_async_cb)(uv_async_t* handle);
// llgo:type C
type AsyncCb func(*Async)
// int uv_async_init(uv_loop_t*, uv_async_t* async, uv_async_cb async_cb);
//
// llgo:link (*Loop).Async C.uv_async_init
func (loop *Loop) Async(a *Async, cb AsyncCb) c.Int {
return 0
}
// int uv_async_send(uv_async_t* async);
//
// llgo:link (*Async).Send C.uv_async_send
func (a *Async) Send() c.Int {
return 0
}

27
c/libuv/check.go Normal file
View File

@@ -0,0 +1,27 @@
package libuv
import (
_ "unsafe"
"github.com/goplus/llgo/c"
)
/* Handle types. */
type Check struct {
Unused [120]byte
}
/* Function type */
// llgo:type C
type CheckCb func(Check *Check)
//go:linkname InitCheck C.uv_check_init
func InitCheck(loop *Loop, Check *Check) c.Int
// llgo:link (*Check).Start C.uv_check_start
func (Check *Check) Start(CheckCb CheckCb) c.Int { return 0 }
// llgo:link (*Check).Stop C.uv_check_stop
func (Check *Check) Stop() c.Int { return 0 }

View File

@@ -95,7 +95,7 @@ const (
ECHARSET Errno = -4080
ENONET Errno = -4056
UNKNOWN Errno = -4094
EOF Errno = -1
EOF Errno = -4095
EREMOTEIO Errno = -4030
ERRNO_MAX Errno = EOF - 1
)

View File

@@ -69,7 +69,7 @@ type File c.Int
/* Handle types. */
type Fs struct {
Unused [0]byte
Unused [440]byte
}
type FsEvent struct {
@@ -106,29 +106,40 @@ type FsPollCb func(handle *FsPoll, status c.Int, events c.Int)
/* Fs related function and method */
//go:linkname FsGetType C.uv_fs_get_type
func FsGetType(req *Fs) FsType
// llgo:link (*Fs).GetType C.uv_fs_get_type
func (req *Fs) GetType() FsType {
return 0
}
//go:linkname FsGetPath C.uv_fs_get_path
func FsGetPath(req *Fs) *c.Char
// llgo:link (*Fs).GetPath C.uv_fs_get_path
func (req *Fs) GetPath() *c.Char {
return nil
}
//go:linkname FsGetResult C.uv_fs_get_result
func FsGetResult(req *Fs) c.Int
// llgo:link (*Fs).GetResult C.uv_fs_get_result
func (req *Fs) GetResult() c.Int {
return 0
}
//go:linkname FsGetPtr C.uv_fs_get_ptr
func FsGetPtr(req *Fs) c.Pointer
// llgo:link (*Fs).GetPtr C.uv_fs_get_ptr
func (req *Fs) GetPtr() c.Pointer {
return nil
}
//go:linkname FsGetSystemError C.uv_fs_get_system_error
func FsGetSystemError(req *Fs) c.Int
// llgo:link (*Fs).GetSystemError C.uv_fs_get_system_error
func (req *Fs) GetSystemError() c.Int {
return 0
}
//go:linkname FsGetStatBuf C.uv_fs_get_statbuf
func FsGetStatBuf(req *Fs) *Stat
// llgo:link (*Fs).GetStatBuf C.uv_fs_get_statbuf
func (req *Fs) GetStatBuf() *Stat {
return nil
}
//go:linkname FsReqCleanup C.uv_fs_req_cleanup
func FsReqCleanup(req *Fs)
//go:linkname DefaultLoop C.uv_default_loop
func DefaultLoop() *Loop
// llgo:link (*Fs).ReqCleanup C.uv_fs_req_cleanup
func (req *Fs) ReqCleanup() {
// No return value needed for this method
}
//go:linkname FsOpen C.uv_fs_open
func FsOpen(loop *Loop, req *Fs, path *c.Char, flags c.Int, mode c.Int, cb FsCb) c.Int
@@ -241,32 +252,56 @@ func FsLchown(loop *Loop, req *Fs, path *c.Char, uid c.Int, gid c.Int, cb FsCb)
//go:linkname FsLstat C.uv_fs_lstat
func FsLstat(loop *Loop, req *Fs, path *c.Char, cb FsCb) c.Int
// ----------------------------------------------
/* FsEvent related function and method */
//go:linkname FsEventInit C.uv_fs_event_init
func FsEventInit(loop *Loop, handle *FsEvent) c.Int
//go:linkname FsEventStart C.uv_fs_event_start
func FsEventStart(handle *FsEvent, cb FsEventCb, path *c.Char, flags c.Int) c.Int
// llgo:link (*FsEvent).Start C.uv_fs_event_start
func (handle *FsEvent) Start(cb FsEventCb, path *c.Char, flags c.Int) c.Int {
return 0
}
//go:linkname FsEventStop C.uv_fs_event_stop
func FsEventStop(handle *FsEvent) c.Int
// llgo:link (*FsEvent).Stop C.uv_fs_event_stop
func (handle *FsEvent) Stop() c.Int {
return 0
}
//go:linkname FsEventClose C.uv_fs_event_close
func FsEventClose(handle *FsEvent) c.Int
// llgo:link (*FsEvent).Close C.uv_fs_event_close
func (handle *FsEvent) Close() c.Int {
return 0
}
//go:linkname FsEventGetpath C.uv_fs_event_getpath
func FsEventGetpath(handle *FsEvent) *c.Char
// llgo:link (*FsEvent).Getpath C.uv_fs_event_getpath
func (handle *FsEvent) Getpath() *c.Char {
return nil
}
// ----------------------------------------------
/* FsPoll related function and method */
//go:linkname FsPollInit C.uv_fs_poll_init
func FsPollInit(loop *Loop, handle *FsPoll) c.Int
//go:linkname FsPollStart C.uv_fs_poll_start
func FsPollStart(handle *FsPoll, cb FsPollCb, path *c.Char, interval uint) c.Int
// llgo:link (*FsPoll).Start C.uv_fs_poll_start
func (handle *FsPoll) Start(cb FsPollCb, path *c.Char, interval uint) c.Int {
return 0
}
//go:linkname FsPollStop C.uv_fs_poll_stop
func FsPollStop(handle *FsPoll) c.Int
// llgo:link (*FsPoll).Stop C.uv_fs_poll_stop
func (handle *FsPoll) Stop() c.Int {
return 0
}
//go:linkname FsPollClose C.uv_fs_poll_close
func FsPollClose(handle *FsPoll) c.Int
// llgo:link (*FsPoll).Close C.uv_fs_poll_close
func (handle *FsPoll) Close() c.Int {
return 0
}
//go:linkname FsPollGetPath C.uv_fs_poll_getpath
func FsPollGetPath(handle *FsPoll) *c.Char
// llgo:link (*FsPoll).GetPath C.uv_fs_poll_getpath
func (handle *FsPoll) GetPath() *c.Char {
return nil
}

27
c/libuv/idle.go Normal file
View File

@@ -0,0 +1,27 @@
package libuv
import (
_ "unsafe"
"github.com/goplus/llgo/c"
)
/* Handle types. */
type Idle struct {
Unused [120]byte
}
/* Function type */
// llgo:type C
type IdleCb func(idle *Idle)
//go:linkname InitIdle C.uv_idle_init
func InitIdle(loop *Loop, idle *Idle) c.Int
// llgo:link (*Idle).Start C.uv_idle_start
func (idle *Idle) Start(idleCb IdleCb) c.Int { return 0 }
// llgo:link (*Idle).Stop C.uv_idle_stop
func (idle *Idle) Stop() c.Int { return 0 }

View File

@@ -9,6 +9,7 @@ import (
const (
LLGoPackage = "link: $(pkg-config --libs libuv); -luv"
LLGoFiles = "$(pkg-config --cflags libuv): _wrap/libuv.c"
)
// ----------------------------------------------
@@ -97,44 +98,13 @@ type Loop struct {
Unused [0]byte
}
type Handle struct {
Unused [96]byte
}
type Stream struct {
Unused [264]byte
}
type Poll struct {
Unused [0]byte
Data c.Pointer
Unused [160]byte
}
/* Request types. */
type Req struct {
Unused [0]byte
}
type GetAddrInfo struct {
Unused [0]byte
}
type GetNameInfo struct {
Unused [0]byte
}
type Shutdown struct {
Unused [0]byte
}
type Write struct {
Unused [192]byte
}
type Connect struct {
Unused [0]byte
}
type Buf struct {
Base *c.Char
Len uintptr
@@ -157,24 +127,12 @@ type FreeFunc func(ptr c.Pointer)
// llgo:type C
type AllocCb func(handle *Handle, suggestedSize uintptr, buf *Buf)
// llgo:type C
type ReadCb func(stream *Stream, nread c.Long, buf *Buf)
// llgo:type C
type WriteCb func(req *Write, status c.Int)
// llgo:type C
type GetaddrinfoCb func(req *GetAddrInfo, status c.Int, res *net.AddrInfo)
// llgo:type C
type GetnameinfoCb func(req *GetNameInfo, status c.Int, hostname *c.Char, service *c.Char)
// llgo:type C
type ConnectionCb func(server *Stream, status c.Int)
// llgo:type C
type ShutdownCb func(req *Shutdown, status c.Int)
// llgo:type C
type WalkCb func(handle *Handle, arg c.Pointer)
@@ -197,223 +155,98 @@ func ReplaceAllocator(mallocFunc MallocFunc, reallocFunc ReallocFunc, callocFunc
// ----------------------------------------------
// llgo:link (*Shutdown).Shutdown C.uv_shutdown
func (shutdown *Shutdown) Shutdown(stream *Stream, shutdownCb ShutdownCb) c.Int {
return 0
}
// ----------------------------------------------
/* Handle related function and method */
// llgo:link (*Handle).Ref C.uv_ref
func (handle *Handle) Ref() {}
// llgo:link (*Handle).Unref C.uv_unref
func (handle *Handle) Unref() {}
// llgo:link (*Handle).HasRef C.uv_has_ref
func (handle *Handle) HasRef() c.Int {
return 0
}
//go:linkname HandleSize C.uv_handle_size
func HandleSize(handleType HandleType) uintptr
// llgo:link (*Handle).GetType C.uv_handle_get_type
func (handle *Handle) GetType() HandleType {
return 0
}
//go:linkname HandleTypeName C.uv_handle_type_name
func HandleTypeName(handleType HandleType) *c.Char
// llgo:link (*Handle).GetData C.uv_handle_get_data
func (handle *Handle) GetData() c.Pointer {
return nil
}
// llgo:link (*Handle).GetLoop C.uv_handle_get_loop
func (handle *Handle) GetLoop() *Loop {
return nil
}
// llgo:link (*Handle).SetData C.uv_handle_set_data
func (handle *Handle) SetData(data c.Pointer) {}
// llgo:link (*Handle).IsActive C.uv_is_active
func (handle *Handle) IsActive() c.Int {
return 0
}
// llgo:link (*Handle).Close C.uv_close
func (handle *Handle) Close(closeCb CloseCb) {}
// llgo:link (*Handle).SendBufferSize C.uv_send_buffer_size
func (handle *Handle) SendBufferSize(value *c.Int) c.Int {
return 0
}
// llgo:link (*Handle).RecvBufferSize C.uv_recv_buffer_size
func (handle *Handle) RecvBufferSize(value *c.Int) c.Int {
return 0
}
// llgo:link (*Handle).Fileno C.uv_fileno
func (handle *Handle) Fileno(fd *OsFd) c.Int {
return 0
}
//go:linkname Pipe C.uv_pipe
func Pipe(fds [2]File, readFlags c.Int, writeFlags c.Int) c.Int {
return 0
}
//go:linkname Socketpair C.uv_socketpair
func Socketpair(_type c.Int, protocol c.Int, socketVector [2]OsSock, flag0 c.Int, flag1 c.Int) c.Int {
return 0
}
// llgo:link (*Handle).IsClosing C.uv_is_closing
func (handle *Handle) IsClosing() c.Int {
return 0
}
// ----------------------------------------------
/* Req related function and method */
//go:linkname ReqSize C.uv_req_size
func ReqSize(reqType ReqType) uintptr
// llgo:link (*Req).GetData C.uv_req_get_data
func (req *Req) GetData() c.Pointer {
return nil
}
// llgo:link (*Req).SetData C.uv_handle_set_data
func (req *Req) SetData(data c.Pointer) {}
// llgo:link (*Req).GetType C.uv_req_get_type
func (req *Req) GetType() ReqType {
return 0
}
//go:linkname TypeName C.uv_req_type_name
func TypeName(reqType ReqType) *c.Char
// ----------------------------------------------
/* Stream related function and method */
// llgo:link (*Stream).GetWriteQueueSize C.uv_stream_get_write_queue_size
func (stream *Stream) GetWriteQueueSize() uintptr {
return 0
}
// llgo:link (*Stream).Listen C.uv_listen
func (stream *Stream) Listen(backlog c.Int, connectionCb ConnectionCb) c.Int {
return 0
}
// llgo:link (*Stream).Accept C.uv_accept
func (server *Stream) Accept(client *Stream) c.Int {
return 0
}
// llgo:link (*Stream).StartRead C.uv_read_start
func (stream *Stream) StartRead(allocCb AllocCb, readCb ReadCb) c.Int {
return 0
}
// llgo:link (*Stream).StopRead C.uv_read_stop
func (stream *Stream) StopRead() c.Int {
return 0
}
// llgo:link (*Write).Write C.uv_write
func (req *Write) Write(stream *Stream, bufs *Buf, nbufs c.Uint, writeCb WriteCb) c.Int {
return 0
}
// llgo:link (*Write).Write2 C.uv_write2
func (req *Write) Write2(stream *Stream, bufs *Buf, nbufs c.Uint, sendStream *Stream, writeCb WriteCb) c.Int {
return 0
}
// llgo:link (*Stream).TryWrite C.uv_try_write
func (stream *Stream) TryWrite(bufs *Buf, nbufs c.Uint) c.Int {
return 0
}
// llgo:link (*Stream).TryWrite2 C.uv_try_write2
func (stream *Stream) TryWrite2(bufs *Buf, nbufs c.Uint, sendStream *Stream) c.Int {
return 0
}
// llgo:link (*Stream).IsReadable C.uv_is_readable
func (stream *Stream) IsReadable() c.Int {
return 0
}
// llgo:link (*Stream).IsWritable C.uv_is_writable
func (stream *Stream) IsWritable() c.Int {
return 0
}
// llgo:link (*Stream).SetBlocking C.uv_stream_set_blocking
func (stream *Stream) SetBlocking(blocking c.Int) c.Int {
return 0
}
// ----------------------------------------------
/* Loop related functions and method. */
//go:linkname DefaultLoop C.uv_default_loop
func DefaultLoop() *Loop
//go:linkname LoopSize C.uv_loop_size
func LoopSize() uintptr
//go:linkname Run C.uv_run
func Run(loop *Loop, mode RunMode) c.Int
// llgo:link (*Loop).Run C.uv_run
func (loop *Loop) Run(mode RunMode) c.Int {
return 0
}
//go:linkname LoopAlive C.uv_loop_alive
func LoopAlive(loop *Loop) c.Int
// llgo:link (*Loop).Alive C.uv_loop_alive
func (loop *Loop) Alive() c.Int {
return 0
}
//go:linkname LoopClose C.uv_loop_close
func LoopClose(loop *Loop) c.Int
// void uv_stop(uv_loop_t *loop)
//
// llgo:link (*Loop).Stop C.uv_stop
func (loop *Loop) Stop() {}
//go:linkname LoopConfigure C.uv_loop_configure
func LoopConfigure(loop *Loop, option LoopOption, arg c.Int) c.Int
// llgo:link (*Loop).Close C.uv_loop_close
func (loop *Loop) Close() c.Int {
return 0
}
//go:linkname LoopDefault C.uv_default_loop
func LoopDefault() *Loop
// llgo:link (*Loop).Configure C.uv_loop_configure
func (loop *Loop) Configure(option LoopOption, arg c.Int) c.Int {
return 0
}
//go:linkname LoopDelete C.uv_loop_delete
func LoopDelete(loop *Loop) c.Int
// llgo:link LoopDefault C.uv_default_loop
func LoopDefault() *Loop {
return nil
}
//go:linkname LoopFork C.uv_loop_fork
func LoopFork(loop *Loop) c.Int
// llgo:link (*Loop).Delete C.uv_loop_delete
func (loop *Loop) Delete() c.Int {
return 0
}
//go:linkname LoopInit C.uv_loop_init
func LoopInit(loop *Loop) c.Int
// llgo:link (*Loop).Fork C.uv_loop_fork
func (loop *Loop) Fork() c.Int {
return 0
}
//go:linkname LoopNew C.uv_loop_new
func LoopNew() *Loop
// llgo:link (*Loop).Init C.uv_loop_init
func (loop *Loop) Init() c.Int {
return 0
}
//go:linkname LoopNow C.uv_now
func LoopNow(loop *Loop) c.UlongLong
// llgo:link LoopNew C.uv_loop_new
func LoopNew() *Loop {
return nil
}
//go:linkname LoopUpdateTime C.uv_update_time
func LoopUpdateTime(loop *Loop)
// llgo:link (*Loop).SetData C.uv_loop_set_data
func (loop *Loop) SetData(data c.Pointer) {
return
}
//go:linkname LoopBackendFd C.uv_backend_fd
func LoopBackendFd(loop *Loop) c.Int
// llgo:link (*Loop).GetData C.uv_loop_get_data
func (loop *Loop) GetData() c.Pointer {
return nil
}
//go:linkname LoopBackendTimeout C.uv_backend_timeout
func LoopBackendTimeout(loop *Loop) c.Int
// llgo:link (*Loop).Now C.uv_now
func (loop *Loop) Now() c.UlongLong {
return 0
}
//go:linkname LoopWalk C.uv_walk
func LoopWalk(loop *Loop, walkCb WalkCb, arg c.Pointer)
// llgo:link (*Loop).UpdateTime C.uv_update_time
func (loop *Loop) UpdateTime() {
// No return value needed for this method
}
// llgo:link (*Loop).BackendFd C.uv_backend_fd
func (loop *Loop) BackendFd() c.Int {
return 0
}
// llgo:link (*Loop).BackendTimeout C.uv_backend_timeout
func (loop *Loop) BackendTimeout() c.Int {
return 0
}
// llgo:link (*Loop).Walk C.uv_walk
func (loop *Loop) Walk(walkCb WalkCb, arg c.Pointer) {
// No return value needed for this method
}
// ----------------------------------------------
@@ -429,28 +262,15 @@ func InitBuf(base *c.Char, len c.Uint) Buf
//go:linkname PollInit C.uv_poll_init
func PollInit(loop *Loop, handle *Poll, fd OsFd) c.Int
//go:linkname PollStart C.uv_poll_start
func PollStart(handle *Poll, events c.Int, cb PollCb) c.Int
//go:linkname PollStop C.uv_poll_stop
func PollStop(handle *Poll) c.Int
//go:linkname PollInitSocket C.uv_poll_init_socket
func PollInitSocket(loop *Loop, handle *Poll, socket c.Int) c.Int
// ----------------------------------------------
// llgo:link (*Poll).Start C.uv_poll_start
func (handle *Poll) Start(events c.Int, cb PollCb) c.Int {
return 0
}
/* Getaddrinfo related function and method */
//go:linkname Getaddrinfo C.uv_getaddrinfo
func Getaddrinfo(loop *Loop, req *GetAddrInfo, getaddrinfoCb GetaddrinfoCb, node *c.Char, service *c.Char, hints *net.AddrInfo) c.Int
//go:linkname Freeaddrinfo C.uv_freeaddrinfo
func Freeaddrinfo(addrInfo *net.AddrInfo)
// ----------------------------------------------
/* Getnameinfo related function and method */
//go:linkname Getnameinfo C.uv_getnameinfo
func Getnameinfo(loop *Loop, req *GetNameInfo, getnameinfoCb GetnameinfoCb, addr *net.SockAddr, flags c.Int) c.Int
// llgo:link (*Poll).Stop C.uv_poll_stop
func (handle *Poll) Stop() c.Int {
return 0
}

View File

@@ -65,18 +65,66 @@ type UdpFlags c.Int
/* Handle types. */
type Tcp struct {
Unused [264]byte
// TODO(spongehah): Handle
type Handle struct {
Data c.Pointer
Unused [88]byte
}
// TODO(spongehah): Stream
type Stream struct {
Data c.Pointer
Unused [256]byte
}
// TODO(spongehah): Tcp
type Tcp struct {
Data c.Pointer
Unused [256]byte
}
// TODO(spongehah): Udp
type Udp struct {
Unused [0]byte
Unused [224]byte
}
/* Request types. */
// TODO(spongehah): Req
type Req struct {
Unused [64]byte
}
// TODO(spongehah): UdpSend
type UdpSend struct {
Unused [0]byte
Unused [320]byte
}
// TODO(spongehah): Write
type Write struct {
Data c.Pointer
Unused [184]byte
}
// TODO(spongehah): Connect
type Connect struct {
Data c.Pointer
Unused [88]byte
}
// TODO(spongehah): GetAddrInfo
type GetAddrInfo struct {
Unused [160]byte
}
// TODO(spongehah): GetNameInfo
type GetNameInfo struct {
Unused [1320]byte
}
// TODO(spongehah): Shutdown
type Shutdown struct {
Unused [80]byte
}
// ----------------------------------------------
@@ -95,6 +143,202 @@ type UdpSendCb func(req *UdpSend, status c.Int)
// llgo:type C
type UdpRecvCb func(handle *Udp, nread c.Long, buf *Buf, addr *net.SockAddr, flags c.Uint)
// llgo:type C
type ReadCb func(stream *Stream, nread c.Long, buf *Buf)
// llgo:type C
type WriteCb func(req *Write, status c.Int)
// llgo:type C
type ConnectionCb func(server *Stream, status c.Int)
// llgo:type C
type ShutdownCb func(req *Shutdown, status c.Int)
// ----------------------------------------------
/* Handle related function and method */
//go:linkname HandleSize C.uv_handle_size
func HandleSize(handleType HandleType) uintptr
//go:linkname HandleTypeName C.uv_handle_type_name
func HandleTypeName(handleType HandleType) *c.Char
// llgo:link (*Handle).Ref C.uv_ref
func (handle *Handle) Ref() {}
// llgo:link (*Handle).Unref C.uv_unref
func (handle *Handle) Unref() {}
// llgo:link (*Handle).HasRef C.uv_has_ref
func (handle *Handle) HasRef() c.Int {
return 0
}
// llgo:link (*Handle).GetType C.uv_handle_get_type
func (handle *Handle) GetType() HandleType {
return 0
}
// llgo:link (*Handle).GetData C.uv_handle_get_data
func (handle *Handle) GetData() c.Pointer {
return nil
}
// llgo:link (*Handle).GetLoop C.uv_handle_get_loop
func (handle *Handle) GetLoop() *Loop {
return nil
}
// llgo:link (*Handle).SetData C.uv_handle_set_data
func (handle *Handle) SetData(data c.Pointer) {}
// llgo:link (*Handle).IsActive C.uv_is_active
func (handle *Handle) IsActive() c.Int {
return 0
}
// llgo:link (*Handle).Close C.uv_close
func (handle *Handle) Close(closeCb CloseCb) {}
// llgo:link (*Handle).SendBufferSize C.uv_send_buffer_size
func (handle *Handle) SendBufferSize(value *c.Int) c.Int {
return 0
}
// llgo:link (*Handle).RecvBufferSize C.uv_recv_buffer_size
func (handle *Handle) RecvBufferSize(value *c.Int) c.Int {
return 0
}
// llgo:link (*Handle).Fileno C.uv_fileno
func (handle *Handle) Fileno(fd *OsFd) c.Int {
return 0
}
// llgo:link (*Handle).IsClosing C.uv_is_closing
func (handle *Handle) IsClosing() c.Int {
return 0
}
// llgo:link (*Handle).IsReadable C.uv_is_readable
func (handle *Handle) IsReadable() c.Int {
return 0
}
// llgo:link (*Handle).IsWritable C.uv_is_writable
func (handle *Handle) IsWritable() c.Int {
return 0
}
//go:linkname Pipe C.uv_pipe
func Pipe(fds [2]File, readFlags c.Int, writeFlags c.Int) c.Int {
return 0
}
//go:linkname Socketpair C.uv_socketpair
func Socketpair(_type c.Int, protocol c.Int, socketVector [2]OsSock, flag0 c.Int, flag1 c.Int) c.Int {
return 0
}
// ----------------------------------------------
/* Req related function and method */
//go:linkname ReqSize C.uv_req_size
func ReqSize(reqType ReqType) uintptr
//go:linkname TypeName C.uv_req_type_name
func TypeName(reqType ReqType) *c.Char
// llgo:link (*Req).GetData C.uv_req_get_data
func (req *Req) GetData() c.Pointer {
return nil
}
// llgo:link (*Req).SetData C.uv_req_set_data
func (req *Req) SetData(data c.Pointer) {}
// llgo:link (*Req).GetType C.uv_req_get_type
func (req *Req) GetType() ReqType {
return 0
}
// llgo:link (*Req).Cancel C.uv_cancel
func (req *Req) Cancel() c.Int {
return 0
}
// ----------------------------------------------
/* Stream related function and method */
// llgo:link (*Stream).GetWriteQueueSize C.uv_stream_get_write_queue_size
func (stream *Stream) GetWriteQueueSize() uintptr {
return 0
}
// llgo:link (*Stream).Listen C.uv_listen
func (stream *Stream) Listen(backlog c.Int, connectionCb ConnectionCb) c.Int {
return 0
}
// llgo:link (*Stream).Accept C.uv_accept
func (server *Stream) Accept(client *Stream) c.Int {
return 0
}
// llgo:link (*Stream).StartRead C.uv_read_start
func (stream *Stream) StartRead(allocCb AllocCb, readCb ReadCb) c.Int {
return 0
}
// llgo:link (*Stream).StopRead C.uv_read_stop
func (stream *Stream) StopRead() c.Int {
return 0
}
// llgo:link (*Write).Write C.uv_write
func (req *Write) Write(stream *Stream, bufs *Buf, nbufs c.Uint, writeCb WriteCb) c.Int {
return 0
}
// llgo:link (*Write).Write2 C.uv_write2
func (req *Write) Write2(stream *Stream, bufs *Buf, nbufs c.Uint, sendStream *Stream, writeCb WriteCb) c.Int {
return 0
}
// llgo:link (*Stream).TryWrite C.uv_try_write
func (stream *Stream) TryWrite(bufs *Buf, nbufs c.Uint) c.Int {
return 0
}
// llgo:link (*Stream).TryWrite2 C.uv_try_write2
func (stream *Stream) TryWrite2(bufs *Buf, nbufs c.Uint, sendStream *Stream) c.Int {
return 0
}
// llgo:link (*Stream).IsReadable C.uv_is_readable
func (stream *Stream) IsReadable() c.Int {
return 0
}
// llgo:link (*Stream).IsWritable C.uv_is_writable
func (stream *Stream) IsWritable() c.Int {
return 0
}
// llgo:link (*Stream).SetBlocking C.uv_stream_set_blocking
func (stream *Stream) SetBlocking(blocking c.Int) c.Int {
return 0
}
//go:linkname StreamShutdown C.uv_shutdown
func StreamShutdown(shutdown *Shutdown, stream *Stream, shutdownCb ShutdownCb) c.Int {
return 0
}
// ----------------------------------------------
/* Tcp related function and method */
@@ -145,6 +389,11 @@ func (tcp *Tcp) CloseReset(closeCb CloseCb) c.Int {
return 0
}
// llgo:link (*Tcp).GetIoWatcherFd C.uv_tcp_get_io_watcher_fd
func (tcp *Tcp) GetIoWatcherFd() c.Int {
return 0
}
//go:linkname TcpConnect C.uv_tcp_connect
func TcpConnect(req *Connect, tcp *Tcp, addr *net.SockAddr, connectCb ConnectCb) c.Int
@@ -218,9 +467,6 @@ func (udp *Udp) SetTTL(ttl c.Int) c.Int {
return 0
}
//go:linkname Send C.uv_udp_send
func Send(req *UdpSend, udp *Udp, bufs *Buf, nbufs c.Uint, addr *net.SockAddr, sendCb UdpSendCb) c.Int
// llgo:link (*Udp).TrySend C.uv_udp_try_send
func (udp *Udp) TrySend(bufs *Buf, nbufs c.Uint, addr *net.SockAddr) c.Int {
return 0
@@ -251,8 +497,13 @@ func (udp *Udp) GetSendQueueCount() uintptr {
return 0
}
//go:linkname Send C.uv_udp_send
func Send(req *UdpSend, udp *Udp, bufs *Buf, nbufs c.Uint, addr *net.SockAddr, sendCb UdpSendCb) c.Int
// ----------------------------------------------
/* DNS related function and method */
//go:linkname Ip4Addr C.uv_ip4_addr
func Ip4Addr(ip *c.Char, port c.Int, addr *net.SockaddrIn) c.Int
@@ -273,3 +524,20 @@ func InetNtop(af c.Int, src c.Pointer, dst *c.Char, size uintptr) c.Int
//go:linkname InetPton C.uv_inet_pton
func InetPton(af c.Int, src *c.Char, dst c.Pointer) c.Int
// ----------------------------------------------
/* Getaddrinfo related function and method */
//go:linkname Getaddrinfo C.uv_getaddrinfo
func Getaddrinfo(loop *Loop, req *GetAddrInfo, getaddrinfoCb GetaddrinfoCb, node *c.Char, service *c.Char, hints *net.AddrInfo) c.Int
//go:linkname Freeaddrinfo C.uv_freeaddrinfo
func Freeaddrinfo(addrInfo *net.AddrInfo)
// ----------------------------------------------
/* Getnameinfo related function and method */
//go:linkname Getnameinfo C.uv_getnameinfo
func Getnameinfo(loop *Loop, req *GetNameInfo, getnameinfoCb GetnameinfoCb, addr *net.SockAddr, flags c.Int) c.Int

View File

@@ -9,7 +9,7 @@ import (
/* Handle types. */
type Signal struct {
Unused [0]byte
Unused [152]byte
}
// ----------------------------------------------
@@ -26,8 +26,17 @@ type SignalCb func(handle *Signal, sigNum c.Int)
//go:linkname SignalInit C.uv_signal_init
func SignalInit(loop *Loop, handle *Signal) c.Int
//go:linkname SignalStart C.uv_signal_start
func SignalStart(handle *Signal, cb SignalCb, signum c.Int) c.Int
// llgo:link (*Signal).Start C.uv_signal_start
func (handle *Signal) Start(cb SignalCb, signum c.Int) c.Int {
return 0
}
//go:linkname SignalStartOneshot C.uv_signal_start_oneshot
func SignalStartOneshot(handle *Signal, cb SignalCb, signum c.Int) c.Int
// llgo:link (*Signal).StartOneshot C.uv_signal_start_oneshot
func (handle *Signal) StartOneshot(cb SignalCb, signum c.Int) c.Int {
return 0
}
// llgo:link (*Signal).Stop C.uv_signal_stop
func (handle *Signal) Stop() c.Int {
return 0
}

78
c/libuv/thread.go Normal file
View File

@@ -0,0 +1,78 @@
package libuv
import (
_ "unsafe"
"github.com/goplus/llgo/c"
)
type Thread struct {
Unused [8]byte
}
type ThreadOptions struct {
flags c.Uint
stackSize uintptr
}
type Work struct {
Unused [128]byte
}
// ----------------------------------------------
/* Function type */
// llgo:type C
type ThreadCb func(arg c.Pointer)
//llgo:type C
type WorkCb func(req *Work)
//llgo:type C
type AfterWorkCb func(req *Work, status c.Int)
// ----------------------------------------------
/* Thread related functions and method. */
//go:linkname ThreadEqual C.uv_thread_equal
func ThreadEqual(t1 *Thread, t2 *Thread) c.Int
//go:linkname ThreadGetCPU C.uv_thread_getcpu
func ThreadGetCPU() c.Int
//go:linkname ThreadSelf C.uv_thread_self
func ThreadSelf() Thread
// llgo:link (*Thread).Create C.uv_thread_create
func (t *Thread) Create(entry ThreadCb, arg c.Pointer) c.Int {
return 0
}
// llgo:link (*Thread).CreateEx C.uv_thread_create_ex
func (t *Thread) CreateEx(entry ThreadCb, params *ThreadOptions, arg c.Pointer) c.Int {
return 0
}
// llgo:link (*Thread).Join C.uv_thread_join
func (t *Thread) Join() c.Int {
return 0
}
// llgo:link (*Thread).SetAffinity C.uv_thread_set_affinity
func (t *Thread) SetAffinity(cpuMask *c.Char, oldMask *c.Char, maskSize uintptr) c.Int {
return 0
}
// llgo:link (*Thread).GetAffinity C.uv_thread_get_affinity
func (t *Thread) GetAffinity(cpuMask *c.Char, maskSize uintptr) c.Int {
return 0
}
// ----------------------------------------------
/* Work related functions and method. */
//go:linkname QueueWork C.uv_queue_work
func QueueWork(loop *Loop, req *Work, workCb WorkCb, afterWorkCb AfterWorkCb) c.Int

View File

@@ -10,13 +10,14 @@ import (
/* Handle types. */
// TODO(spongehah): Timer
type Timer struct {
Unused [0]byte
Unused [152]byte
}
// ----------------------------------------------
// llgo:type Cgit
// llgo:type C
type TimerCb func(timer *Timer)
// ----------------------------------------------
@@ -27,7 +28,7 @@ type TimerCb func(timer *Timer)
func InitTimer(loop *Loop, timer *Timer) c.Int
// llgo:link (*Timer).Start C.uv_timer_start
func (timer *Timer) Start(cb TimerCb, timeout uint64, repeat uint64) c.Int {
func (timer *Timer) Start(cb TimerCb, timeoutMs uint64, repeat uint64) c.Int {
return 0
}

View File

@@ -13,7 +13,7 @@ func coroutineFunc(L *lua.State) c.Int {
}
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -18,7 +18,7 @@ func coroutineFunc(L *lua.State) {
}
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -0,0 +1,72 @@
package main
import (
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func countdownContinue(L *lua.State, status c.Int, ctx lua.KContext) c.Int {
return countdown(L)
}
func countdown(L *lua.State) c.Int {
arg := L.Tointeger(lua.Upvalueindex(1))
c.Printf(c.Str("resume called with %d\n"), arg)
if arg > 0 {
L.Pushinteger(arg - 1)
L.Replace(lua.Upvalueindex(1))
L.Pushinteger(arg)
return L.Yieldk(1, c.Pointer(uintptr(0)), countdownContinue)
}
return 0
}
func createCountdown(L *lua.State) c.Int {
max := L.Checkinteger(1)
L.Pushinteger(max)
L.Pushcclosure(countdown, 1)
return 1
}
func main() {
L := lua.Newstate__1()
L.Openlibs()
defer L.Close()
L.Register(c.Str("create_countdown"), createCountdown)
testcode := c.Str(`
local countdown = create_countdown(5)
local co = coroutine.create(countdown)
while true do
local success, value = coroutine.resume(co)
if not success then
print('Error:', value)
break
end
if value == nil then break end
print('Lua received:', value)
end
print('Countdown finished');
`)
if L.Dostring(testcode) != lua.OK {
c.Printf(c.Str("Error: %s\n"), L.Tostring(-1))
}
L.Openlibs()
}
/* Expected output:
resume called with 5
Lua received: 5
resume called with 4
Lua received: 4
resume called with 3
Lua received: 3
resume called with 2
Lua received: 2
resume called with 1
Lua received: 1
resume called with 0
Countdown finished
*/

View File

@@ -0,0 +1,64 @@
package main
import (
"os"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func triggerError(L *lua.State) c.Int {
L.Pushstring(c.Str("This is an error triggered"))
return L.Error()
}
func triggerFormatError(L *lua.State) c.Int {
return L.LError(c.Str("This is an error code:(%d)"), 42)
}
func customPanic(L *lua.State) c.Int {
msg := L.Tostring(-1)
c.Printf(c.Str("Pani'c: %s\n"), msg)
os.Exit(1)
return 0
}
func main() {
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
L.Atpanic(customPanic)
L.Register(c.Str("trigger_error"), triggerError)
L.Register(c.Str("trigger_format_error"), triggerFormatError)
c.Printf(c.Str("1. error (protected):\n"))
L.Getglobal(c.Str("trigger_error"))
if L.Pcall(0, 0, 0) != lua.OK {
c.Printf(c.Str("Error: %s\n"), L.Tostring(-1))
L.Pop(1)
}
c.Printf(c.Str("2. format_error (protected):\n"))
L.Getglobal(c.Str("trigger_format_error"))
if L.Pcall(0, 0, 0) != lua.OK {
c.Printf(c.Str("Error: %s\n"), L.Tostring(-1))
L.Pop(1)
}
c.Printf(c.Str("3. Unprotected call (panic):\n"))
L.Getglobal(c.Str("trigger_error"))
// This will trigger unprotected panic and catch by customPanic
L.Call(0, 0)
}
/* Expected output:
1. error (protected):
Error: This is an error triggered
2. format_error (protected):
Error: This is an error code:(42)
3. Unprotected call (panic):
Panic: This is an error triggered
*/

View File

@@ -0,0 +1,48 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func Hook(L *lua.State, ar *lua.Debug) {
L.Getinfo(c.Str("nSl"), ar)
c.Printf(c.Str("Hook called:"))
if name := ar.Name; name != nil {
c.Printf(c.Str("name: %s,"), name)
}
if what := ar.What; what != nil {
c.Printf(c.Str("what: %s,"), what)
}
c.Printf(c.Str("source: %s,"), c.Pointer(unsafe.SliceData(ar.ShortSrc[:])))
c.Printf(c.Str("line: %d\n"), ar.Currentline)
}
func main() {
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
L.Sethook(Hook, lua.MASKLINE, 0)
code :=
`function hello(name)
print('Hello, ' .. name .. '!')
end
hello('llgo')`
if res := L.Dostring(c.Str(code)); res != lua.OK {
c.Printf(c.Str("error: %s\n"), L.Tostring(-1))
}
}
/* Expected output:
Hook called:what: main,source: [string "function hello(name) ..."],line: 3
Hook called:what: main,source: [string "function hello(name) ..."],line: 1
Hook called:what: main,source: [string "function hello(name) ..."],line: 4
Hook called:name: hello,what: Lua,source: [string "function hello(name) ..."],line: 2
Hello, llgo!
Hook called:name: hello,what: Lua,source: [string "function hello(name) ..."],line: 3
*/

View File

@@ -0,0 +1,68 @@
package main
import (
"os"
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func reader(L *lua.State, data c.Pointer, size *c.Ulong) *c.Char {
file := (*os.File)(data)
fileInfo, err := file.Stat()
if err != nil {
return nil
}
fileSize := fileInfo.Size()
buffer := make([]byte, fileSize)
bytesRead, err := file.Read(buffer)
if err != nil {
return nil
}
*size = c.Ulong(bytesRead)
if bytesRead > 0 {
return (*c.Char)(unsafe.Pointer(unsafe.SliceData(buffer)))
}
return nil
}
func main() {
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
file, err := os.Open("../llgofunc.luac")
if err != nil {
c.Printf(c.Str("Failed to open file for reading\n"))
return
}
defer file.Close()
if L.Load(reader, c.Pointer(file), c.Str("greet"), nil) != lua.OK {
c.Printf(c.Str("Failed to dump Lua function\n"))
}
c.Printf(c.Str("Stack size before call: %d\n"), L.Gettop())
c.Printf(c.Str("Top element type after call: %s\n"), L.Typename(L.Type(-1)))
L.Pushstring(c.Str("World"))
if L.Pcall(1, 1, 0) != lua.OK {
c.Printf(c.Str("Failed to call function: %s\n"))
}
if L.Isstring(-1) != 0 {
c.Printf(c.Str("Result: %s\n"), L.Tostring(-1))
}
}
/* Expected output:
Stack size before call: 1
Top element type after call: function
Result: Hello, World!
*/

View File

@@ -0,0 +1,56 @@
package main
import (
"os"
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func writer(L *lua.State, p c.Pointer, sz c.Ulong, ud c.Pointer) c.Int {
file := (*os.File)(ud)
data := unsafe.Slice((*byte)(p), sz)
n, err := file.Write(data)
if err != nil || n != int(sz) {
return 1
}
return lua.OK
}
func main() {
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
if res := L.Loadstring(c.Str(`
function greet(name)
return 'Hello, ' .. name .. '!'
end
return greet
`)); res != lua.OK {
c.Printf(c.Str("error: %s\n"), L.Tostring(-1))
}
if res := L.Pcall(0, 1, 0); res != lua.OK {
c.Printf(c.Str("error: %s\n"), L.Tostring(-1))
}
if !L.Isfunction(-1) {
c.Printf(c.Str("Expected a function, but got %s"), L.Typename(L.Type(-1)))
}
file, err := os.Create("../llgofunc.luac")
if err != nil {
c.Printf(c.Str("Failed to open file for writing\n"))
return
}
defer file.Close()
if L.Dump(writer, c.Pointer(file), 0) != lua.OK {
c.Printf(c.Str("Failed to dump Lua function\n"))
}
}

View File

@@ -8,7 +8,7 @@ import (
)
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
if res := L.Loadstring(c.Str("function doubleNumber(x) ! return x * 2 end")); res != lua.OK {

View File

@@ -0,0 +1,42 @@
package main
import (
"unsafe"
_ "unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func GetData(L *lua.State) c.Int {
extra := (*int)(L.Getextraspace())
L.Pushfstring(c.Str("Stored integer is: %d"), *extra)
return 1
}
func main() {
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
extra := (*int)(L.Getextraspace())
*extra = 42
difference := uintptr(unsafe.Pointer(L)) - uintptr(L.Getextraspace())
if difference == unsafe.Sizeof(uintptr(0)) {
c.Printf(c.Str("Extra space is pointer size\n"), unsafe.Sizeof(uintptr(0)))
}
L.Pushcfunction(GetData)
L.Setglobal(c.Str("GetData"))
if L.Dostring(c.Str("print(GetData())")) != lua.OK {
c.Printf(c.Str("Error: %s\n"), L.Tostring(-1))
}
}
/* Expected output:
Extra space is pointer size
Stored integer is: 42
*/

View File

@@ -8,7 +8,7 @@ import (
)
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -8,7 +8,7 @@ import (
)
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -8,7 +8,7 @@ import (
)
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -8,7 +8,7 @@ import (
)
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
if res := L.Dostring(c.Str("print('hello world')")); res != lua.OK {

View File

@@ -8,7 +8,7 @@ import (
)
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -29,7 +29,7 @@ func printStack(L *lua.State, message string) {
}
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()

View File

@@ -17,7 +17,7 @@ func printStack(L *lua.State, stateName *c.Char) {
func main() {
// Create a new Lua state and open libraries
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
@@ -68,7 +68,7 @@ func main() {
printStack(L, c.Str("L1"))
// Create a second Lua state
L1 := lua.Newstate()
L1 := lua.Newstate__1()
defer L1.Close()
// Move two elements to the new state

View File

@@ -0,0 +1,36 @@
package main
import (
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func alloc(ud c.Pointer, ptr c.Pointer, osize c.Ulong, nsize c.Ulong) c.Pointer {
if nsize == 0 {
c.Free(ptr)
return nil
} else {
return c.Realloc(ptr, uintptr(nsize))
}
}
func main() {
L := lua.Newstate__0(alloc, nil)
defer L.Close()
L.Openlibs()
if res := L.Dostring(c.Str("print('new state success')")); res != lua.OK {
println("newstate error")
}
allocf := L.Getallocf(nil)
L.Setallocf(allocf, nil)
if res := L.Dostring(c.Str("print('set newstate success')")); res != lua.OK {
println("set newstate error")
}
}
/* Expected output:
new state success
set newstate success
*/

View File

@@ -1,6 +1,8 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
@@ -8,53 +10,91 @@ import (
func printTable(L *lua.State) {
L.Pushnil()
for L.Next(-2) != 0 {
key := L.Tostring(-2)
value := L.Tostring(-1)
switch L.Type(-2) {
case lua.STRING:
key := L.Tostring(-2)
c.Printf(c.Str("%s - %s\n"), key, value)
case lua.NUMBER:
key := L.Tonumber(-2)
c.Printf(c.Str("[%.0f] - %s\n"), key, value)
case lua.LIGHTUSERDATA:
c.Printf(c.Str("[pointer] - %s\n"), value)
default:
c.Printf(c.Str("unknown key type %s %d\n"), L.Typename(-2), L.Type(-2))
}
L.Pop(1)
}
L.Pop(1)
}
func main() {
L := lua.Newstate()
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
L.Newtable()
// set table name:John
L.Pushstring(c.Str("name"))
L.Pushstring(c.Str("John"))
L.Settable(-3)
// set table age:30
L.Pushstring(c.Str("age"))
L.Pushnumber(30)
L.Settable(-3)
// set table field fullname:John Doe
L.Pushstring(c.Str("John Doe"))
L.Setfield(-2, c.Str("fullname"))
// set index field
L.Pushinteger(123)
L.Seti(-2, c.Int(1))
// set pointer key field
pointerKey := c.AllocaCStr("pointer key")
L.Pushstring(c.Str("pointer value"))
L.Rawsetp(-2, unsafe.Pointer(pointerKey))
// get field by Getfield
L.Getfield(-1, c.Str("name"))
c.Printf(c.Str("%s\n"), L.Tostring(-1))
c.Printf(c.Str("name: %s\n"), L.Tostring(-1))
L.Pop(1)
// get field by Rawget
L.Pushstring(c.Str("fullname"))
L.Rawget(-2)
c.Printf(c.Str("fullname: %s\n"), L.Tostring(-1))
L.Pop(1)
// get field by Gettable
L.Pushstring(c.Str("age"))
L.Gettable(-2)
age := int(L.Tonumber(-1))
c.Printf(c.Str("Age: %d\n"), age)
L.Pop(1)
// get index field
L.Geti(-1, c.Int(1))
c.Printf(c.Str("Index[%d] value: %d\n"), 1, L.Tointeger(-1))
L.Pop(1)
c.Printf(c.Str("All entries in the table:\n"))
printTable(L)
}
/* Expected output:
John
name: John
fullname: John Doe
Age: 30
Index[1] value: 123
All entries in the table:
age - 30.0
fullname - John Doe
[1] - 123
name - John
[pointer] - pointer value
fullname - John Doe
age - 30.0
*/

View File

@@ -0,0 +1,44 @@
package main
import (
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func pushThread(state *lua.State, name string) {
isMain := state.Pushthread()
if isMain != 0 {
c.Printf(c.Str("%s Thread is main\n"), c.AllocaCStr(name))
} else {
c.Printf(c.Str("%s Thread is not main\n"), c.AllocaCStr(name))
}
}
func main() {
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
pushThread(L, "main")
L.Pop(1)
newThread := L.Newthread()
pushThread(newThread, "newthread")
state := newThread.Tothread(-1)
if newThread == state {
c.Printf(c.Str("Successfully retrieved thread from stack\n"))
}
status := state.Status()
c.Printf(c.Str("New thread status: %d"), status)
if L.Closethread(newThread) != lua.OK {
println("Failed to close thread status %d", state.Status())
}
}
/* Expected output:
main Thread is main
newthread Thread is not main
Successfully retrieved thread from stack
New thread status: 0
*/

View File

@@ -0,0 +1,43 @@
package main
import (
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
type lightdata struct {
value int
}
func main() {
L := lua.Newstate__1()
defer L.Close()
L.Openlibs()
data := L.Newuserdata(unsafe.Sizeof(0))
*((*int)(data)) = 42
L.Setglobal(c.Str("data"))
light := &lightdata{value: 24}
L.Pushlightuserdata(unsafe.Pointer(light))
L.Setglobal(c.Str("lightdata"))
L.Getglobal(c.Str("data"))
if L.Isuserdata(-1) != 0 {
data := L.Touserdata(-1)
c.Printf(c.Str("userdata %d\n"), *(*int)(data))
}
L.Getglobal(c.Str("lightdata"))
if L.Islightuserdata(-1) {
light := (*lightdata)(L.Touserdata(-1))
c.Printf(c.Str("lightdata %d\n"), light.value)
}
}
/* Expected output:
userdata 42
lightdata 24
*/

View File

@@ -14,6 +14,15 @@ import (
// /* key, in the registry, for table of preloaded loaders */
// llgo:link (*State).Checkinteger C.luaL_checkinteger
func (L *State) Checkinteger(arg c.Int) Integer { return 0 }
// llgo:link (*State).Checknumber C.luaL_checknumber
func (L *State) Checknumber(arg c.Int) Number { return 0 }
// llgo:link (*State).LError C.luaL_error
func (L *State) LError(format *c.Char, __llgo_va_list ...any) c.Int { return 0 }
// /* predefined references */
// llgo:link (*State).Loadfilex C.luaL_loadfilex
@@ -24,8 +33,8 @@ func (L *State) Loadfile(filename *c.Char) c.Int { return L.Loadfilex(filename,
// llgo:link (*State).Loadstring C.luaL_loadstring
func (L *State) Loadstring(s *c.Char) c.Int { return 0 }
//go:linkname Newstate C.luaL_newstate
func Newstate() *State
//go:linkname Newstate__1 C.luaL_newstate
func Newstate__1() *State
// /*
// ** ===============================================================

View File

@@ -10,20 +10,28 @@ const (
LLGoPackage = "link: $(pkg-config --libs lua); -llua -lm"
)
// /* mark for precompiled code ('<esc>Lua') */
/* mark for precompiled code ('<esc>Lua') */
// /* option for multiple returns in 'lua_pcall' and 'lua_call' */
/* option for multiple returns in 'lua_pcall' and 'lua_call' */
const (
MULTRET = -1
)
// /*
// ** Pseudo-indices
// ** (-LUAI_MAXSTACK is the minimum valid index; we keep some free empty
// ** space after that to help overflow detection)
// */
/*
* Pseudo-indices
* (-LUAI_MAXSTACK is the minimum valid index; we keep some free empty
* space after that to help overflow detection)
*/
// /* thread status */
const (
REGISTRYINDEX = -MAXSTACK - 1000
)
func Upvalueindex(i c.Int) c.Int {
return c.Int(REGISTRYINDEX) - i
}
/* thread status */
const (
OK = 0
YIELD = 1
@@ -37,9 +45,9 @@ type State struct {
Unused [8]byte
}
// /*
// ** basic types
// */
/*
* basic types
*/
const (
NONE c.Int = -1
NIL c.Int = 0
@@ -51,113 +59,112 @@ const (
FUNCTION c.Int = 6
USERDATA c.Int = 7
THREAD c.Int = 8
UMTYPES c.Int = 9
NUMTYPES c.Int = 9
)
// /* minimum Lua stack available to a C function */
/* minimum Lua stack available to a C function */
const (
MINSTACK = 20
)
// /* predefined values in the registry */
/* predefined values in the registry */
const (
RIDX_MAINTHREAD = 1
RIDX_GLOBALS = 2
RIDX_LAST = RIDX_GLOBALS
)
// /* type of numbers in Lua */
/* type of numbers in Lua */
type Number = c.Double
// /* type for integer functions */
// TODO(zzy):consider dynamic size
/* type for integer functions */
type Integer = c.Int
// /* unsigned integer type */
/* unsigned integer type */
type Unsigned = c.Uint
// /* type for continuation-function contexts */
/* type for continuation-function contexts */
type KContext = c.Pointer
// /*
// ** Type for C functions registered with Lua
// */
/*
* Type for C functions registered with Lua
*/
// llgo:type C
type CFunction func(L *State) c.Int
// /*
// ** Type for continuation functions
// */
/*
* Type for continuation functions
*/
// TODO(zzy): KFunction does not currently support
// llgo:type C
type KFunction func(L *State, status c.Int, ctx KContext) c.Int
// /*
// ** Type for functions that read/write blocks when loading/dumping Lua chunks
// */
/*
* Type for functions that read/write blocks when loading/dumping Lua chunks
*/
// typedef const char * (*lua_Reader) (State *L, void *ud, size_t *sz);
// typedef int (*lua_Writer) (State *L, const void *p, size_t sz, void *ud);
// llgo:type C
type Reader func(L *State, ud c.Pointer, sz *c.Ulong) *c.Char
// /*
// ** Type for memory-allocation functions
// */
// llgo:type C
type Writer func(L *State, p c.Pointer, sz c.Ulong, ud c.Pointer) c.Int
// typedef void * (*lua_Alloc) (void *ud, void *ptr, size_t osize, size_t nsize);
/*
* Type for memory-allocation functions
*/
// /*
// ** Type for warning functions
// */
// llgo:type C
type Alloc func(ud c.Pointer, ptr c.Pointer, osize c.Ulong, nsize c.Ulong) c.Pointer
// typedef void (*lua_WarnFunction) (void *ud, const char *msg, int tocont);
/*
* Type for warning functions
*/
// /*
// ** Type used by the debug API to collect debug information
// */
// llgo:type C
type WarnFunction func(ud c.Pointer, msg c.Char, tocont c.Int)
// typedef struct lua_Debug lua_Debug;
/*
* Functions to be called by the debugger in specific events
*/
// /*
// ** Functions to be called by the debugger in specific events
// */
// llgo:type C
type Hook func(L *State, ar *Debug)
// typedef void (*lua_Hook) (State *L, lua_Debug *ar);
// /*
// ** generic extra include file
// */
// #if defined(LUA_USER_H)
// #include LUA_USER_H
// #endif
// /*
// ** RCS ident string
// */
/*
* RCS ident string
*/
// extern const char lua_ident[];
// /*
// ** state manipulation
// */
/*
** state manipulation
*/
// llgo:link (*State).Close C.lua_close
func (L *State) Close() {}
// State *(lua_newstate) (lua_Alloc f, void *ud);
// llgo:link Newstate__0 C.lua_newstate
func Newstate__0(f Alloc, ud c.Pointer) *State { return nil }
// llgo:link (*State).Newthread C.lua_newthread
func (L *State) Newthread() *State { return nil }
// int (lua_closethread) (State *L, State *from);
// int (lua_resetthread) (State *L); /* Deprecated! */
// lua_CFunction (lua_atpanic) (State *L, lua_CFunction panicf);
// lua_Number (lua_version) (State *L);
// llgo:link (*State).Closethread C.lua_closethread
func (L *State) Closethread(from *State) c.Int { return 0 }
// /*
// ** basic stack manipulation
// */
// llgo:link (*State).Resetthread C.lua_resetthread
func (L *State) Resetthread(from *State) c.Int { return 0 }
// llgo:link (*State).Atpanic C.lua_atpanic
func (L *State) Atpanic(panicf CFunction) CFunction { return nil }
// llgo:link (*State).Version C.lua_version
func (L *State) Version() Number { return 0 }
/*
* basic stack manipulation
*/
// llgo:link (*State).Absindex C.lua_absindex
func (L *State) Absindex(idx c.Int) c.Int { return 0 }
@@ -183,9 +190,9 @@ func (L *State) Checkstack(n c.Int) c.Int { return 0 }
// llgo:link (*State).Xmove C.lua_xmove
func (L *State) Xmove(to *State, n c.Int) {}
// /*
// ** access functions (stack -> C)
// */
/*
* access functions (stack -> C)
*/
// llgo:link (*State).Isnumber C.lua_isnumber
func (L *State) Isnumber(idx c.Int) c.Int { return 0 }
@@ -199,7 +206,8 @@ func (L *State) Iscfunction(idx c.Int) c.Int { return 0 }
// llgo:link (*State).Isinteger C.lua_isinteger
func (L *State) Isinteger(idx c.Int) c.Int { return 0 }
// LUA_API int (lua_isuserdata) (State *L, int idx);
// llgo:link (*State).Isuserdata C.lua_isuserdata
func (L *State) Isuserdata(idx c.Int) c.Int { return 0 }
// llgo:link (*State).Type C.lua_type
func (L *State) Type(idx c.Int) c.Int { return 0 }
@@ -224,17 +232,23 @@ func (L *State) Tolstring(idx c.Int, len *c.Ulong) *c.Char { return nil }
// llgo:link (*State).Tocfunction C.lua_tocfunction
func (L *State) Tocfunction(idx c.Int) CFunction { return nil }
// LUA_API void *(lua_touserdata) (State *L, int idx);
// LUA_API State *(lua_tothread) (State *L, int idx);
// LUA_API const void *(lua_topointer) (State *L, int idx);
// llgo:link (*State).Touserdata C.lua_touserdata
func (L *State) Touserdata(idx c.Int) c.Pointer { return nil }
// /*
// ** Comparison and arithmetic functions
// */
// llgo:link (*State).Tothread C.lua_tothread
func (L *State) Tothread(idx c.Int) *State { return nil }
// llgo:link (*State).Topointer C.lua_topointer
func (L *State) Topointer(idx c.Int) c.Pointer { return nil }
/*
* Comparison and arithmetic functions
*/
/*
* push functions (C -> stack)
*/
// /*
// ** push functions (C -> stack)
// */
// llgo:link (*State).Pushnil C.lua_pushnil
func (L *State) Pushnil() {}
@@ -259,12 +273,15 @@ func (L *State) Pushcclosure(fn CFunction, n c.Int) {}
// llgo:link (*State).Pushboolean C.lua_pushboolean
func (L *State) Pushboolean(b c.Int) {}
//void (lua_pushlightuserdata) (State *L, void *p);
//int (lua_pushthread) (State *L);
// llgo:link (*State).Pushlightuserdata C.lua_pushlightuserdata
func (L *State) Pushlightuserdata(p c.Pointer) {}
// /*
// ** get functions (Lua -> stack)
// */
// llgo:link (*State).Pushthread C.lua_pushthread
func (L *State) Pushthread() c.Int { return 0 }
/*
* get functions (Lua -> stack)
*/
// llgo:link (*State).Getglobal C.lua_getglobal
func (L *State) Getglobal(name *c.Char) c.Int { return 0 }
@@ -275,24 +292,33 @@ func (L *State) Gettable(idx c.Int) c.Int { return 0 }
// llgo:link (*State).Getfield C.lua_getfield
func (L *State) Getfield(idx c.Int, k *c.Char) c.Int { return 0 }
// LUA_API int (lua_geti) (State *L, int idx, lua_Integer n);
// LUA_API int (lua_rawget) (State *L, int idx);
// LUA_API int (lua_rawgeti) (State *L, int idx, lua_Integer n);
// LUA_API int (lua_rawgetp) (State *L, int idx, const void *p);
// llgo:link (*State).Geti C.lua_geti
func (L *State) Geti(idx c.Int, n Integer) c.Int { return 0 }
// llgo:link (*State).Rawget C.lua_rawget
func (L *State) Rawget(idx c.Int) c.Int { return 0 }
// llgo:link (*State).Rawgeti C.lua_rawgeti
func (L *State) Rawgeti(idx c.Int, n Integer) c.Int { return 0 }
// llgo:link (*State).Rawgetp C.lua_rawgetp
func (L *State) Rawgetp(idx c.Int, p c.Pointer) c.Int { return 0 }
// llgo:link (*State).Createtable C.lua_createtable
func (L *State) Createtable(narr c.Int, nrec c.Int) {}
// LUA_API void *(lua_newuserdatauv) (State *L, size_t sz, int nuvalue);
// llgo:link (*State).Newuserdatauv C.lua_newuserdatauv
func (L *State) Newuserdatauv(sz uintptr, nuvalue c.Int) c.Pointer { return nil }
// llgo:link (*State).Getmetatable C.lua_getmetatable
func (L *State) Getmetatable(objindex c.Int) c.Int { return 0 }
// LUA_API int (lua_getiuservalue) (State *L, int idx, int n);
// llgo:link (*State).Getiuservalue C.lua_getiuservalue
func (L *State) Getiuservalue(idx c.Int, n c.Int) c.Int { return 0 }
// /*
// ** set functions (stack -> Lua)
// */
/*
* set functions (stack -> Lua)
*/
// llgo:link (*State).Setglobal C.lua_setglobal
func (L *State) Setglobal(name *c.Char) {}
@@ -303,19 +329,27 @@ func (L *State) Settable(idx c.Int) {}
// llgo:link (*State).Setfield C.lua_setfield
func (L *State) Setfield(idx c.Int, k *c.Char) {}
//void (lua_seti) (State *L, int idx, lua_Integer n);
//void (lua_rawset) (State *L, int idx);
//void (lua_rawseti) (State *L, int idx, lua_Integer n);
//void (lua_rawsetp) (State *L, int idx, const void *p);
// llgo:link (*State).Seti C.lua_seti
func (L *State) Seti(idx c.Int, n Integer) {}
// llgo:link (*State).Rawset C.lua_rawset
func (L *State) Rawset(idx c.Int) {}
// llgo:link (*State).Rawseti C.lua_rawseti
func (L *State) Rawseti(idx c.Int, n Integer) {}
// llgo:link (*State).Rawsetp C.lua_rawsetp
func (L *State) Rawsetp(idx c.Int, p c.Pointer) {}
// llgo:link (*State).Setmetatable C.lua_setmetatable
func (L *State) Setmetatable(objindex c.Int) c.Int { return 0 }
//int (lua_setiuservalue) (State *L, int idx, int n);
// llgo:link (*State).Setiuservalue C.lua_setiuservalue
func (L *State) Setiuservalue(idx c.Int, n c.Int) c.Int { return 0 }
// /*
// ** 'load' and 'call' functions (load and run Lua code)
// */
/*
* 'load' and 'call' functions (load and run Lua code)
*/
// llgo:link (*State).Callk C.lua_callk
func (L *State) Callk(nargs c.Int, nresults c.Int, ctx KContext, k KFunction) c.Int {
@@ -335,13 +369,15 @@ func (L *State) Pcall(nargs c.Int, nresults c.Int, errfunc c.Int) c.Int {
return L.Pcallk(nargs, nresults, errfunc, nil, nil)
}
// int (lua_load) (State *L, lua_Reader reader, void *dt, const char *chunkname, const char *mode);
// llgo:link (*State).Load C.lua_load
func (L *State) Load(reader Reader, dt c.Pointer, chunkname *c.Char, mode *c.Char) c.Int { return 0 }
// int (lua_dump) (State *L, lua_Writer writer, void *data, int strip);
// llgo:link (*State).Dump C.lua_dump
func (L *State) Dump(writer Writer, data c.Pointer, strip c.Int) c.Int { return 0 }
// /*
// ** coroutine functions
// */
/*
* coroutine functions
*/
// llgo:link (*State).Resume C.lua_resume
func (L *State) Resume(from *State, narg c.Int, nres *c.Int) c.Int { return 0 }
@@ -356,16 +392,19 @@ func (L *State) Isyieldable() c.Int { return 0 }
func (L *State) Yieldk(nresults c.Int, ctx KContext, k KFunction) c.Int { return 0 }
func (L *State) Yield(nresults c.Int) c.Int { return L.Yieldk(nresults, nil, nil) }
// /*
// ** Warning-related functions
// */
/*
* Warning-related functions
*/
//void (lua_setwarnf) (State *L, lua_WarnFunction f, void *ud);
//void (lua_warning) (State *L, const char *msg, int tocont);
// llgo:link (*State).Setwarnf C.lua_setwarnf
func (L *State) Setwarnf(f WarnFunction, ud c.Pointer) {}
// /*
// ** garbage-collection function and options
// */
// llgo:link (*State).Warning C.lua_warning
func (L *State) Warning(msg *c.Char, tocont c.Int) {}
/*
* garbage-collection function and options
*/
const (
GCSTOP = 0
@@ -381,42 +420,59 @@ const (
GCINC = 11
)
// LUA_API int (lua_gc) (State *L, int what, ...);
// llgo:link (*State).Gc C.lua_gc
func (L *State) Gc(what c.Int, __llgo_va_list ...any) c.Int { return 0 }
/*
* miscellaneous functions
*/
// /*
// ** miscellaneous functions
// */
// llgo:link (*State).Next C.lua_next
func (L *State) Next(idx c.Int) c.Int { return 0 }
// LUA_API int (lua_error) (State *L);
// llgo:link (*State).Error C.lua_error
func (L *State) Error() c.Int { return 0 }
// LUA_API void (lua_concat) (State *L, int n);
// LUA_API void (lua_len) (State *L, int idx);
// llgo:link (*State).Concat C.lua_concat
func (L *State) Concat(n c.Int) {}
// LUA_API size_t (lua_stringtonumber) (State *L, const char *s);
// llgo:link (*State).Len C.lua_len
func (L *State) Len(idx c.Int) {}
// LUA_API lua_Alloc (lua_getallocf) (State *L, void **ud);
// LUA_API void (lua_setallocf) (State *L, lua_Alloc f, void *ud);
// llgo:link (*State).Stringtonumber C.lua_stringtonumber
func (L *State) Stringtonumber(s *c.Char) c.Ulong { return 0 }
// LUA_API void (lua_toclose) (State *L, int idx);
// LUA_API void (lua_closeslot) (State *L, int idx);
// llgo:link (*State).Getallocf C.lua_getallocf
func (L *State) Getallocf(ud *c.Pointer) Alloc { return nil }
// /*
// ** {==============================================================
// ** some useful macros
// ** ===============================================================
// */
// llgo:link (*State).Setallocf C.lua_setallocf
func (L *State) Setallocf(f Alloc, ud c.Pointer) Alloc { return nil }
// #define lua_getextraspace(L) ((void *)((char *)(L) - LUA_EXTRASPACE))
// llgo:link (*State).Toclose C.lua_toclose
func (L *State) Toclose(idx c.Int) {}
// llgo:link (*State).Closeslot C.lua_closeslot
func (L *State) Closeslot(idx c.Int) {}
/*
** {==============================================================
** some useful macros
** ===============================================================
*/
func (L *State) Getextraspace() c.Pointer {
return c.Pointer(uintptr(c.Pointer(L)) - EXTRASPACE)
}
func (L *State) Tonumber(idx c.Int) Number { return L.Tonumberx(idx, nil) }
func (L *State) Tostring(idx c.Int) *c.Char { return L.Tolstring(idx, nil) }
func (L *State) Tointeger(idx c.Int) Integer { return L.Tointegerx(idx, nil) }
func (L *State) Pop(n c.Int) { L.Settop(-(n) - 1) }
func (L *State) Newtable() { L.Createtable(0, 0) }
// #define lua_register(L,n,f) (lua_pushcfunction(L, (f)), lua_setglobal(L, (n)))
func (L *State) Register(name *c.Char, f CFunction) {
L.Pushcfunction(f)
L.Setglobal(name)
}
func (L *State) Pushcfunction(f CFunction) { L.Pushcclosure(f, 0) }
func (L *State) Isfunction(n c.Int) bool { return L.Type(n) == c.Int(FUNCTION) }
@@ -427,38 +483,63 @@ func (L *State) Isboolean(n c.Int) bool { return L.Type(n) == c.Int(BOOLEA
func (L *State) Isthread(n c.Int) bool { return L.Type(n) == c.Int(THREAD) }
func (L *State) Isnone(n c.Int) bool { return L.Type(n) == c.Int(NONE) }
func (L *State) Isnoneornil(n c.Int) bool { return L.Type(n) <= 0 }
func (L *State) Pushliteral(s *c.Char) *c.Char {
return L.Pushstring(s)
}
// #define lua_pushliteral(L, s) lua_pushstring(L, "" s)
// #define lua_pushglobaltable(L) ((void)lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_GLOBALS))
func (L *State) Pushglobaltable() c.Int {
return L.Rawgeti(REGISTRYINDEX, RIDX_GLOBALS)
}
// #define lua_insert(L,idx) lua_rotate(L, (idx), 1)
// #define lua_remove(L,idx) (lua_rotate(L, (idx), -1), lua_pop(L, 1))
// #define lua_replace(L,idx) (lua_copy(L, -1, (idx)), lua_pop(L, 1))
func (L *State) Insert(idx c.Int) {
L.Rotate(idx, 1)
}
// /* }============================================================== */
func (L *State) Remove(idx c.Int) {
L.Rotate(idx, -1)
L.Pop(1)
}
// /*
// ** {==============================================================
// ** compatibility macros
// ** ===============================================================
// */
func (L *State) Replace(idx c.Int) {
L.Copy(-1, idx)
L.Pop(1)
}
// #define lua_newuserdata(L,s) lua_newuserdatauv(L,s,1)
// #define lua_getuservalue(L,idx) lua_getiuservalue(L,idx,1)
// #define lua_setuservalue(L,idx) lua_setiuservalue(L,idx,1)
/* }============================================================== */
// #define LUA_NUMTAGS LUA_NUMTYPES
/*
** {==============================================================
** compatibility macros
** ===============================================================
*/
// /* }============================================================== */
func (L *State) Newuserdata(sz uintptr) c.Pointer {
return L.Newuserdatauv(sz, 1)
}
// /*
// ** {======================================================================
// ** Debug API
// ** =======================================================================
// */
// /*
// ** Event codes
// */
func (L *State) Getuservalue(idx c.Int) c.Int {
return L.Getiuservalue(idx, 1)
}
func (L *State) Setuservalue(idx c.Int) c.Int {
return L.Setiuservalue(idx, 1)
}
const (
NUMTAGS = NUMTYPES
)
/* }============================================================== */
/*
** {======================================================================
** Debug API
** =======================================================================
*/
/*
* Event codes
*/
const (
HOOKCALL = 0
@@ -468,13 +549,9 @@ const (
HOOKTAILCALL = 4
)
// /*
// ** Event masks
// */
// #define LUA_MASKCALL (1 << LUA_HOOKCALL)
// #define LUA_MASKRET (1 << LUA_HOOKRET)
// #define LUA_MASKLINE (1 << LUA_HOOKLINE)
// #define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT)
/*
* Event masks
*/
const (
MASKCALL = 1 << HOOKCOUNT
@@ -483,22 +560,68 @@ const (
MASKCOUNT = 1 << HOOKCOUNT
)
// LUA_API int (lua_getstack) (State *L, int level, lua_Debug *ar);
// LUA_API int (lua_getinfo) (State *L, const char *what, lua_Debug *ar);
// LUA_API const char *(lua_getlocal) (State *L, const lua_Debug *ar, int n);
// LUA_API const char *(lua_setlocal) (State *L, const lua_Debug *ar, int n);
// LUA_API const char *(lua_getupvalue) (State *L, int funcindex, int n);
// LUA_API const char *(lua_setupvalue) (State *L, int funcindex, int n);
// llgo:link (*State).Getstack C.lua_getstack
func (L *State) Getstack(level c.Int, ar *Debug) c.Int { return 0 }
// LUA_API void *(lua_upvalueid) (State *L, int fidx, int n);
// LUA_API void (lua_upvaluejoin) (State *L, int fidx1, int n1, int fidx2, int n2);
// llgo:link (*State).Getinfo C.lua_getinfo
func (L *State) Getinfo(what *c.Char, ar *Debug) c.Int { return 0 }
// LUA_API void (lua_sethook) (State *L, lua_Hook func, int mask, int count);
// LUA_API lua_Hook (lua_gethook) (State *L);
// LUA_API int (lua_gethookmask) (State *L);
// LUA_API int (lua_gethookcount) (State *L);
// llgo:link (*State).Getlocal C.lua_getlocal
func (L *State) Getlocal(ar *Debug, n c.Int) *c.Char { return nil }
// LUA_API int (lua_setcstacklimit) (State *L, unsigned int limit);
// llgo:link (*State).Setlocal C.lua_setlocal
func (L *State) Setlocal(ar *Debug, n c.Int) *c.Char { return nil }
// struct lua_Debug
// /* }====================================================================== */
// llgo:link (*State).Getupvalue C.lua_getupvalue
func (L *State) Getupvalue(funcindex c.Int, n c.Int) *c.Char { return nil }
// llgo:link (*State).Setupvalue C.lua_setupvalue
func (L *State) Setupvalue(funcindex c.Int, n c.Int) *c.Char { return nil }
// llgo:link (*State).Upvalueid C.lua_upvalueid
func (L *State) Upvalueid(fidx c.Int, n c.Int) c.Pointer { return nil }
// llgo:link (*State).Upvaluejoin C.lua_upvaluejoin
func (L *State) Upvaluejoin(fidx1 c.Int, n1 c.Int, fidx2 c.Int, n2 c.Int) {}
// llgo:link (*State).Sethook C.lua_sethook
func (L *State) Sethook(fn Hook, mask c.Int, count c.Int) {}
// llgo:link (*State).Gethook C.lua_gethook
func (L *State) Gethook() Hook { return nil }
// llgo:link (*State).Gethookmask C.lua_gethookmask
func (L *State) Gethookmask() c.Int { return 0 }
// llgo:link (*State).Gethookcount C.lua_gethookcount
func (L *State) Gethookcount() c.Int { return 0 }
// llgo:link (*State).Setcstacklimit C.lua_setcstacklimit
func (L *State) Setcstacklimit(limit c.Uint) c.Int { return 0 }
type CallInfo struct {
Unused [8]byte
}
type Debug struct {
Event c.Int
Name *c.Char /* (n) */
Namewhat *c.Char /* (n) 'global', 'local', 'field', 'method' */
What *c.Char /* (S) 'Lua', 'C', 'main', 'tail' */
Source *c.Char /* (S) */
Srclen uintptr /* (S) */
Currentline c.Int /* (l) */
Linedefined c.Int /* (S) */
Lastlinedefined c.Int /* (S) */
Nups byte /* (u) number of upvalues */
Nparams byte /* (u) number of parameters */
Isvararg c.Char /* (u) */
Istailcall c.Char /* (t) */
Ftransfer uint16 /* (r) index of first value transferred */
Ntransfer uint16 /* (r) number of transferred values */
ShortSrc [IDSIZE]c.Char /* (S) */
/* private part */
ICi *CallInfo
}
/* }====================================================================== */

41
c/lua/luaconf.go Normal file
View File

@@ -0,0 +1,41 @@
package lua
import "unsafe"
/*
** {==================================================================
** Macros that affect the API and must be stable (that is, must be the
** same when you compile Lua and when you compile code that links to
** Lua).
** =====================================================================
*/
/*
@@ LUAI_MAXSTACK limits the size of the Lua stack.
** CHANGE it if you need a different limit. This limit is arbitrary;
** its only purpose is to stop Lua from consuming unlimited stack
** space (and to reserve some numbers for pseudo-indices).
** (It must fit into max(size_t)/32 and max(int)/2.)
*/
const (
MAXSTACK = 1000000
)
/*
@@ LUA_EXTRASPACE defines the size of a raw memory area associated with
** a Lua state with very fast access.
** CHANGE it if you need a different size.
*/
const (
EXTRASPACE = unsafe.Sizeof(uintptr(0))
)
/*
@@ LUA_IDSIZE gives the maximum size for the description of the source
** of a function in debug information.
** CHANGE it if you want a different size.
*/
const (
IDSIZE = 60
)

View File

@@ -17,7 +17,7 @@
package net
import (
_ "unsafe"
"unsafe"
"github.com/goplus/llgo/c"
)
@@ -97,6 +97,13 @@ const (
EAI_OVERFLOW /* argument buffer overflow */
)
const (
ALIGNSIZE = unsafe.Sizeof(c.LongLong(0))
MAXSIZE = 128
PAD1_SIZE = ALIGNSIZE - unsafe.Sizeof(byte(0)) - unsafe.Sizeof(byte(0))
PAD2_SIZE = MAXSIZE - unsafe.Sizeof(byte(0)) - unsafe.Sizeof(byte(0)) - PAD1_SIZE - ALIGNSIZE
)
// (TODO) merge to inet
const INET_ADDRSTRLEN = 16
@@ -117,6 +124,14 @@ type SockaddrIn6 struct {
ScopeId c.Uint
}
type SockaddrStorage struct {
Len uint8
Family uint8
pad1 [PAD1_SIZE]c.Char
align c.LongLong
pad2 [PAD2_SIZE]c.Char
}
type InAddr struct {
Addr c.Uint
}
@@ -171,6 +186,21 @@ func Send(c.Int, c.Pointer, uintptr, c.Int) c.Long
//go:linkname Recv C.recv
func Recv(c.Int, c.Pointer, uintptr, c.Int) c.Long
//go:linkname SetSockOpt C.setsockopt
func SetSockOpt(socket c.Int, level c.Int, optionName c.Int, optionValue c.Pointer, sockLen c.Uint) c.Int
//go:linkname Ntohs C.ntohs
func Ntohs(x uint16) uint16
//go:linkname Htons C.htons
func Htons(x uint16) uint16
//go:linkname Ntohl C.ntohl
func Ntohl(x c.Uint) c.Uint
//go:linkname Htonl C.htonl
func Htonl(x c.Uint) c.Uint
// -----------------------------------------------------------------------------
type AddrInfo struct {
@@ -191,13 +221,3 @@ func Getaddrinfo(host *c.Char, port *c.Char, addrInfo *AddrInfo, result **AddrIn
func Freeaddrinfo(addrInfo *AddrInfo) c.Int
// -----------------------------------------------------------------------------
func swapInt16(data uint16) uint16 {
return (data << 8) | (data >> 8)
}
func Htons(x uint16) uint16 {
return swapInt16(x)
}
// -----------------------------------------------------------------------------

View File

@@ -0,0 +1,44 @@
package main
import (
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/openssl"
)
func newInt(n openssl.BN_ULONG) *openssl.BIGNUM {
ret := openssl.BNNew()
ret.SetWord(n)
return ret
}
func main() {
ctx := openssl.BN_CTXNew()
defer ctx.Free()
// Initialize two big ints with the first two numbers in the sequence.
a := newInt(0)
b := newInt(1)
defer a.Free()
defer b.Free()
// Initialize limit as 10^99, the smallest integer with 100 digits.
v10, v99 := newInt(10), newInt(99)
defer v10.Free()
defer v99.Free()
limit := openssl.BNNew()
defer limit.Free()
limit.Exp(v10, v99, ctx)
// 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
}
cstr := a.CStr()
c.Printf(c.Str("%s\n"), cstr) // 100-digit Fibonacci number
openssl.FreeCStr(cstr)
}

View File

@@ -0,0 +1,40 @@
package main
import (
"fmt"
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/openssl"
)
func main() {
str := "Hello, World!"
key := "123456"
var lenKey = len(key)
var digest = make([]byte, openssl.EVP_MAX_MD_SIZE)
var digestLen c.Uint
ctx := openssl.NewHMAC_CTX()
if ctx == nil {
c.Fprintf(c.Stderr, c.Str("%s\n"), c.Str("Error creating HMAC_CTX"))
return
}
defer ctx.Free()
var ret c.Int = ctx.InitEx(unsafe.Pointer(unsafe.StringData(key)), c.Int(lenKey), openssl.EVP_sha256(), nil)
if ret == 0 {
c.Fprintf(c.Stderr, c.Str("%s\n"), c.Str("Error initializing HMAC_CTX"))
return
}
ret = ctx.UpdateString(str)
if ret == 0 {
c.Fprintf(c.Stderr, c.Str("%s\n"), c.Str("Error updating HMAC_CTX"))
return
}
ret = ctx.Final(unsafe.SliceData(digest), &digestLen)
if ret == 0 {
c.Fprintf(c.Stderr, c.Str("%s\n"), c.Str("Error finalizing HMAC_CTX"))
return
}
fmt.Printf("HMAC:%x\n", digest[:digestLen])
}

Some files were not shown because too many files have changed in this diff Show More