From 3dbe9b0cf1803bc45d41d436da7f2cc2c9732f65 Mon Sep 17 00:00:00 2001 From: visualfc Date: Wed, 1 Jul 2026 15:00:22 +0800 Subject: [PATCH 1/4] llgo build --- context.go | 14 -------------- go.mod | 6 +++--- go.sum | 12 ++++++------ runtime.go | 16 ++++++++++++++++ runtime_llgo.go | 14 ++++++++++++++ 5 files changed, 39 insertions(+), 23 deletions(-) create mode 100644 runtime_llgo.go diff --git a/context.go b/context.go index 98e9618d..c9f0a4f1 100644 --- a/context.go +++ b/context.go @@ -269,20 +269,6 @@ func (ctx *Context) SetPanic(fn func(*PanicInfo)) { type Frame = frame -func (fr *Frame) CallerFrames() (frames []runtime.Frame) { - rpc := make([]uintptr, 64) - n := runtimeCallers(fr, 1, rpc) - fs := runtime.CallersFrames(rpc[:n]) - for { - f, more := runtimeFramesNext(fr, fs) - frames = append(frames, f) - if !more { - break - } - } - return -} - type PanicInfo struct { funcInstr *Frame diff --git a/go.mod b/go.mod index 58a3f569..04d583f5 100644 --- a/go.mod +++ b/go.mod @@ -5,14 +5,14 @@ go 1.24.0 require ( github.com/goplus/gogen v1.23.3 github.com/goplus/mod v0.20.2 - github.com/goplus/reflectx v1.7.0 + github.com/goplus/reflectx v1.7.1-0.20260701065815-36c179f3d48f github.com/goplus/xgo v1.7.3 github.com/peterh/liner v1.2.2 github.com/qiniu/x v1.18.0 - github.com/visualfc/funcval v0.1.4 + github.com/visualfc/funcval v0.1.5 github.com/visualfc/gid v0.3.1 github.com/visualfc/goembed v0.3.4 - github.com/visualfc/xtype v0.3.0 + github.com/visualfc/xtype v0.3.1 golang.org/x/mod v0.32.0 golang.org/x/tools v0.41.0 ) diff --git a/go.sum b/go.sum index 46c9d584..2206d16d 100644 --- a/go.sum +++ b/go.sum @@ -9,8 +9,8 @@ github.com/goplus/gogen v1.23.3 h1:cyw16r8LYsqIeJUobTy/1mv9abUDxsR+ghh0dEZgaRw= github.com/goplus/gogen v1.23.3/go.mod h1:Y7ulYW3wonQ3d9er00b0uGFEV/IUZa6okWJZh892ACQ= github.com/goplus/mod v0.20.2 h1:YX72E6AhhRLvlkVnI9cBK6PZvUwtge2hwROh7w9N6Yk= github.com/goplus/mod v0.20.2/go.mod h1:lWW62tH7L3Vm42Lr6wlUMYHvsm5w3TkEpE2ulKTgmU8= -github.com/goplus/reflectx v1.7.0 h1:52l0Si+vDc6CvT7Y+h47h2QUs5HQp6qxPlmvLsMzo38= -github.com/goplus/reflectx v1.7.0/go.mod h1:EXX8KSPTmnb2W1PfyVkDC0Qwet0lYX2h2/S06Vhwrhw= +github.com/goplus/reflectx v1.7.1-0.20260701065815-36c179f3d48f h1:4upO/ye5DPg0NT9wp5NDRRdwrRiXnq9EwXSa2wxoOxo= +github.com/goplus/reflectx v1.7.1-0.20260701065815-36c179f3d48f/go.mod h1:EXX8KSPTmnb2W1PfyVkDC0Qwet0lYX2h2/S06Vhwrhw= github.com/goplus/xgo v1.7.3 h1:rG/dBjbld8r1O94m6qtIOsBvpF1kHPrd4+NtcCVOemU= github.com/goplus/xgo v1.7.3/go.mod h1:F/+bGBARd1rIyD5pl1BgqGViRKUh5w03pbk0sPHb9a8= github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= @@ -32,14 +32,14 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/timandy/routine v1.1.6 h1:cueNRVPutK8O6387LL7dmYPLNyS6aKlPCPi5qWCLdc8= github.com/timandy/routine v1.1.6/go.mod h1:kXslgIosdY8LW0byTyPnenDgn4/azt2euufAq9rK51w= -github.com/visualfc/funcval v0.1.4 h1:lAI88zQYfRzmC7mKF4+swXeCZvb8wb1f3lMSDRAY2mQ= -github.com/visualfc/funcval v0.1.4/go.mod h1:3Izv+irhArmrTvy+lmL6pIq16gSOzx73CIka51J9eR0= +github.com/visualfc/funcval v0.1.5 h1:jR21zdx0pFk4nUzmutrFZL6EiRuMYR/ZaD+KOzTwyEk= +github.com/visualfc/funcval v0.1.5/go.mod h1:3Izv+irhArmrTvy+lmL6pIq16gSOzx73CIka51J9eR0= github.com/visualfc/gid v0.3.1 h1:wWnU17tIBISc7sbbfRxNIg0rdfJUqANZYeX04KbbhlU= github.com/visualfc/gid v0.3.1/go.mod h1:vpt7mMzO6Mst8v6T4vCSTPKzrNwfVsaDZQ12T4eQT8o= github.com/visualfc/goembed v0.3.4 h1:foORJ0KT/pKwA23dStPFOtxaW7F96PnNSiLXHVXrfVk= github.com/visualfc/goembed v0.3.4/go.mod h1:jCVCz/yTJGyslo6Hta+pYxWWBuq9ADCcIVZBTQ0/iVI= -github.com/visualfc/xtype v0.3.0 h1:K0Oo5XMcSjv+ohqn8L6RjgOZ9dNwfzPv3/AIV1SXRfA= -github.com/visualfc/xtype v0.3.0/go.mod h1:VYIH9S2bmdWKlBb7c725ES6yKF9+pyHBU2SFNqGVMGM= +github.com/visualfc/xtype v0.3.1 h1:a6eEoil4AFwDqz403+5jzoVf2mRHycgS5nh4L7dly1w= +github.com/visualfc/xtype v0.3.1/go.mod h1:VYIH9S2bmdWKlBb7c725ES6yKF9+pyHBU2SFNqGVMGM= golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= golang.org/x/net v0.50.0 h1:ucWh9eiCGyDR3vtzso0WMQinm2Dnt8cFMuQa9K33J60= diff --git a/runtime.go b/runtime.go index 99e1ecb7..80d7622b 100644 --- a/runtime.go +++ b/runtime.go @@ -1,3 +1,5 @@ +//go:build !llgo + /* * Copyright (c) 2022 The GoPlus Authors (goplus.org). All rights reserved. * @@ -395,3 +397,17 @@ func inlineFunc(entry uintptr) *funcinl { func isInlineFunc(f *runtime.Func) bool { return (*funcinl)(unsafe.Pointer(f)).ones == ^uint32(0) } + +func (fr *Frame) CallerFrames() (frames []runtime.Frame) { + rpc := make([]uintptr, 64) + n := runtimeCallers(fr, 1, rpc) + fs := runtime.CallersFrames(rpc[:n]) + for { + f, more := runtimeFramesNext(fr, fs) + frames = append(frames, f) + if !more { + break + } + } + return +} diff --git a/runtime_llgo.go b/runtime_llgo.go new file mode 100644 index 00000000..0b7a196b --- /dev/null +++ b/runtime_llgo.go @@ -0,0 +1,14 @@ +//go:build llgo +// +build llgo + +package ixgo + +import "runtime" + +func runtimeGC(fr *frame) { + runtime.GC() +} + +func debugStack(fr *frame) []byte { + return nil +} From 9c409f485e04f7cf037823abab9537a6664336a1 Mon Sep 17 00:00:00 2001 From: visualfc Date: Wed, 8 Jul 2026 10:18:57 +0800 Subject: [PATCH 2/4] cmd/ixgo: llgo ignore icall --- cmd/ixgo/exec/icall.go | 8 ++++++++ cmd/ixgo/exec/main.go | 1 - 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 cmd/ixgo/exec/icall.go diff --git a/cmd/ixgo/exec/icall.go b/cmd/ixgo/exec/icall.go new file mode 100644 index 00000000..764a20b6 --- /dev/null +++ b/cmd/ixgo/exec/icall.go @@ -0,0 +1,8 @@ +//go:build !llgo +// +build !llgo + +package exec + +import ( + _ "github.com/goplus/reflectx/icall/icall8192" +) diff --git a/cmd/ixgo/exec/main.go b/cmd/ixgo/exec/main.go index 1faf2b02..024c81c1 100644 --- a/cmd/ixgo/exec/main.go +++ b/cmd/ixgo/exec/main.go @@ -29,7 +29,6 @@ import ( "github.com/goplus/ixgo/cmd/internal/version" _ "github.com/goplus/ixgo/pkg" - _ "github.com/goplus/reflectx/icall/icall8192" ) func mainUsage() { From 727caa27a856bb7336067c974f012c9ce7ea025d Mon Sep 17 00:00:00 2001 From: visualfc Date: Wed, 8 Jul 2026 10:19:38 +0800 Subject: [PATCH 3/4] llgo: os.Exit/runtime.Goexit --- cmd/internal/repl/repl.go | 1 - runtime.go | 1 + runtime_llgo.go | 27 ++++++++++++++++++++++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/cmd/internal/repl/repl.go b/cmd/internal/repl/repl.go index b1537e54..54773b73 100644 --- a/cmd/internal/repl/repl.go +++ b/cmd/internal/repl/repl.go @@ -25,7 +25,6 @@ import ( "github.com/goplus/ixgo" "github.com/goplus/ixgo/cmd/internal/base" - _ "github.com/goplus/ixgo/pkg" "github.com/goplus/ixgo/repl" "github.com/peterh/liner" ) diff --git a/runtime.go b/runtime.go index 80d7622b..22a6f8cb 100644 --- a/runtime.go +++ b/runtime.go @@ -1,4 +1,5 @@ //go:build !llgo +// +build !llgo /* * Copyright (c) 2022 The GoPlus Authors (goplus.org). All rights reserved. diff --git a/runtime_llgo.go b/runtime_llgo.go index 0b7a196b..2727f8af 100644 --- a/runtime_llgo.go +++ b/runtime_llgo.go @@ -3,7 +3,10 @@ package ixgo -import "runtime" +import ( + "runtime" + "sync/atomic" +) func runtimeGC(fr *frame) { runtime.GC() @@ -12,3 +15,25 @@ func runtimeGC(fr *frame) { func debugStack(fr *frame) []byte { return nil } + +func init() { + RegisterExternal("os.Exit", func(fr *frame, code int) { + interp := fr.interp + if atomic.LoadInt32(&interp.goexited) == 1 { + //os.Exit(code) + interp.chexit <- code + } else { + panic(exitPanic(code)) + } + }) + RegisterExternal("runtime.Goexit", func(fr *frame) { + interp := fr.interp + // main goroutine use panic + if goroutineID() == interp.mainid { + atomic.StoreInt32(&interp.goexited, 1) + panic(goexitPanic(0)) + } else { + runtime.Goexit() + } + }) +} From 3f2074104331eb905cc7cae0eaa35f943eb042bb Mon Sep 17 00:00:00 2001 From: visualfc Date: Wed, 8 Jul 2026 11:26:51 +0800 Subject: [PATCH 4/4] reflectx v1.7.1 --- go.mod | 2 +- go.sum | 6 ++++-- interp_test.go | 5 ++++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 04d583f5..e5fb9527 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.24.0 require ( github.com/goplus/gogen v1.23.3 github.com/goplus/mod v0.20.2 - github.com/goplus/reflectx v1.7.1-0.20260701065815-36c179f3d48f + github.com/goplus/reflectx v1.7.1 github.com/goplus/xgo v1.7.3 github.com/peterh/liner v1.2.2 github.com/qiniu/x v1.18.0 diff --git a/go.sum b/go.sum index 2206d16d..8541e919 100644 --- a/go.sum +++ b/go.sum @@ -9,8 +9,10 @@ github.com/goplus/gogen v1.23.3 h1:cyw16r8LYsqIeJUobTy/1mv9abUDxsR+ghh0dEZgaRw= github.com/goplus/gogen v1.23.3/go.mod h1:Y7ulYW3wonQ3d9er00b0uGFEV/IUZa6okWJZh892ACQ= github.com/goplus/mod v0.20.2 h1:YX72E6AhhRLvlkVnI9cBK6PZvUwtge2hwROh7w9N6Yk= github.com/goplus/mod v0.20.2/go.mod h1:lWW62tH7L3Vm42Lr6wlUMYHvsm5w3TkEpE2ulKTgmU8= -github.com/goplus/reflectx v1.7.1-0.20260701065815-36c179f3d48f h1:4upO/ye5DPg0NT9wp5NDRRdwrRiXnq9EwXSa2wxoOxo= -github.com/goplus/reflectx v1.7.1-0.20260701065815-36c179f3d48f/go.mod h1:EXX8KSPTmnb2W1PfyVkDC0Qwet0lYX2h2/S06Vhwrhw= +github.com/goplus/reflectx v1.7.0 h1:52l0Si+vDc6CvT7Y+h47h2QUs5HQp6qxPlmvLsMzo38= +github.com/goplus/reflectx v1.7.0/go.mod h1:EXX8KSPTmnb2W1PfyVkDC0Qwet0lYX2h2/S06Vhwrhw= +github.com/goplus/reflectx v1.7.1 h1:HRDtsBWtfmZBzmA1rvOgbw1Oek4hO0WfUDKO7BLvpVs= +github.com/goplus/reflectx v1.7.1/go.mod h1:EXX8KSPTmnb2W1PfyVkDC0Qwet0lYX2h2/S06Vhwrhw= github.com/goplus/xgo v1.7.3 h1:rG/dBjbld8r1O94m6qtIOsBvpF1kHPrd4+NtcCVOemU= github.com/goplus/xgo v1.7.3/go.mod h1:F/+bGBARd1rIyD5pl1BgqGViRKUh5w03pbk0sPHb9a8= github.com/mattn/go-runewidth v0.0.3 h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4= diff --git a/interp_test.go b/interp_test.go index 95bf5653..52fe35cb 100644 --- a/interp_test.go +++ b/interp_test.go @@ -3095,7 +3095,10 @@ func main() { t.Fatal(err) } - _, orgAllocate, _ := ixgo.IcallStat() + capacity, orgAllocate, _ := ixgo.IcallStat() + if capacity == 0 { + t.Skip("skip unused icall") + } orgCached := ixgo.IcallCached() defer func() { _, allocate, _ := ixgo.IcallStat()