From 26ea34a7dd97e4ea3cc2bbbe61d5924c4edcb090 Mon Sep 17 00:00:00 2001 From: "Randall C. O'Reilly" Date: Sat, 27 Jun 2026 11:50:48 +0200 Subject: [PATCH 1/2] nocrash: guards for a few recent crashes --- core/tree.go | 8 ++++---- text/parse/lexer/line.go | 4 +++- yaegicore/basesymbols/log-slog.go | 2 ++ yaegicore/basesymbols/reflect.go | 9 +++++++++ 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/core/tree.go b/core/tree.go index fc9d232ed9..42d184df57 100644 --- a/core/tree.go +++ b/core/tree.go @@ -917,7 +917,7 @@ func (tr *Tree) UnselectEvent() { // using given select mode (from keyboard modifiers). // Returns newly selected node. func (tr *Tree) moveDown(selMode events.SelectModes) *Tree { - if tr.Parent == nil { + if tree.IsNil(tr) || tree.IsNil(tr.Parent) { return nil } if tr.Closed || !tr.HasChildren() { // next sibling @@ -949,7 +949,7 @@ func (tr *Tree) moveDownEvent(selMode events.SelectModes) *Tree { // moveDownSibling moves down only to siblings, not down into children, // using given select mode (from keyboard modifiers) func (tr *Tree) moveDownSibling(selMode events.SelectModes) *Tree { - if tr.Parent == nil { + if tree.IsNil(tr) || tree.IsNil(tr.Parent) { return nil } if tr == tr.Root { @@ -972,7 +972,7 @@ func (tr *Tree) moveDownSibling(selMode events.SelectModes) *Tree { // using given select mode (from keyboard modifiers). // Returns newly selected node func (tr *Tree) moveUp(selMode events.SelectModes) *Tree { - if tr.Parent == nil || tr == tr.Root { + if tree.IsNil(tr) || tree.IsNil(tr.Parent) || tr == tr.Root { return nil } myidx := tr.IndexInParent() @@ -1074,7 +1074,7 @@ func (tr *Tree) movePageDownEvent(selMode events.SelectModes) *Tree { // moveToLastChild moves to the last child under me, using given select mode // (from keyboard modifiers) func (tr *Tree) moveToLastChild(selMode events.SelectModes) *Tree { - if tr.Parent == nil || tr == tr.Root { + if tree.IsNil(tr) || tr.Parent == nil || tr == tr.Root { return nil } if !tr.Closed && tr.HasChildren() { diff --git a/text/parse/lexer/line.go b/text/parse/lexer/line.go index 58d684cffb..c39d651da1 100644 --- a/text/parse/lexer/line.go +++ b/text/parse/lexer/line.go @@ -176,7 +176,9 @@ func (ll *Line) NonCodeWords(src []rune) Line { for _, t := range *ll { // blank out code parts first if t.Token.Token.IsCode() { for i := t.Start; i < t.End; i++ { - wsrc[i] = ' ' + if i < len(wsrc) { + wsrc[i] = ' ' + } } } } diff --git a/yaegicore/basesymbols/log-slog.go b/yaegicore/basesymbols/log-slog.go index 7019e01077..9d4aa3fc2d 100644 --- a/yaegicore/basesymbols/log-slog.go +++ b/yaegicore/basesymbols/log-slog.go @@ -60,6 +60,7 @@ func init() { "New": reflect.ValueOf(slog.New), "NewJSONHandler": reflect.ValueOf(slog.NewJSONHandler), "NewLogLogger": reflect.ValueOf(slog.NewLogLogger), + "NewMultiHandler": reflect.ValueOf(slog.NewMultiHandler), "NewRecord": reflect.ValueOf(slog.NewRecord), "NewTextHandler": reflect.ValueOf(slog.NewTextHandler), "SetDefault": reflect.ValueOf(slog.SetDefault), @@ -87,6 +88,7 @@ func init() { "Leveler": reflect.ValueOf((*slog.Leveler)(nil)), "LogValuer": reflect.ValueOf((*slog.LogValuer)(nil)), "Logger": reflect.ValueOf((*slog.Logger)(nil)), + "MultiHandler": reflect.ValueOf((*slog.MultiHandler)(nil)), "Record": reflect.ValueOf((*slog.Record)(nil)), "Source": reflect.ValueOf((*slog.Source)(nil)), "TextHandler": reflect.ValueOf((*slog.TextHandler)(nil)), diff --git a/yaegicore/basesymbols/reflect.go b/yaegicore/basesymbols/reflect.go index 2f79073244..80cf9c2cbf 100644 --- a/yaegicore/basesymbols/reflect.go +++ b/yaegicore/basesymbols/reflect.go @@ -6,6 +6,7 @@ package basesymbols import ( + "iter" "reflect" ) @@ -111,20 +112,24 @@ type _reflect_Type struct { WFieldByIndex func(index []int) reflect.StructField WFieldByName func(name string) (reflect.StructField, bool) WFieldByNameFunc func(match func(string) bool) (reflect.StructField, bool) + WFields func() iter.Seq[reflect.StructField] WImplements func(u reflect.Type) bool WIn func(i int) reflect.Type + WIns func() iter.Seq[reflect.Type] WIsVariadic func() bool WKey func() reflect.Type WKind func() reflect.Kind WLen func() int WMethod func(a0 int) reflect.Method WMethodByName func(a0 string) (reflect.Method, bool) + WMethods func() iter.Seq[reflect.Method] WName func() string WNumField func() int WNumIn func() int WNumMethod func() int WNumOut func() int WOut func(i int) reflect.Type + WOuts func() iter.Seq[reflect.Type] WOverflowComplex func(x complex128) bool WOverflowFloat func(x float64) bool WOverflowInt func(x int64) bool @@ -152,20 +157,24 @@ func (W _reflect_Type) FieldByName(name string) (reflect.StructField, bool) { func (W _reflect_Type) FieldByNameFunc(match func(string) bool) (reflect.StructField, bool) { return W.WFieldByNameFunc(match) } +func (W _reflect_Type) Fields() iter.Seq[reflect.StructField] { return W.WFields() } func (W _reflect_Type) Implements(u reflect.Type) bool { return W.WImplements(u) } func (W _reflect_Type) In(i int) reflect.Type { return W.WIn(i) } +func (W _reflect_Type) Ins() iter.Seq[reflect.Type] { return W.WIns() } func (W _reflect_Type) IsVariadic() bool { return W.WIsVariadic() } func (W _reflect_Type) Key() reflect.Type { return W.WKey() } func (W _reflect_Type) Kind() reflect.Kind { return W.WKind() } func (W _reflect_Type) Len() int { return W.WLen() } func (W _reflect_Type) Method(a0 int) reflect.Method { return W.WMethod(a0) } func (W _reflect_Type) MethodByName(a0 string) (reflect.Method, bool) { return W.WMethodByName(a0) } +func (W _reflect_Type) Methods() iter.Seq[reflect.Method] { return W.WMethods() } func (W _reflect_Type) Name() string { return W.WName() } func (W _reflect_Type) NumField() int { return W.WNumField() } func (W _reflect_Type) NumIn() int { return W.WNumIn() } func (W _reflect_Type) NumMethod() int { return W.WNumMethod() } func (W _reflect_Type) NumOut() int { return W.WNumOut() } func (W _reflect_Type) Out(i int) reflect.Type { return W.WOut(i) } +func (W _reflect_Type) Outs() iter.Seq[reflect.Type] { return W.WOuts() } func (W _reflect_Type) OverflowComplex(x complex128) bool { return W.WOverflowComplex(x) } func (W _reflect_Type) OverflowFloat(x float64) bool { return W.WOverflowFloat(x) } func (W _reflect_Type) OverflowInt(x int64) bool { return W.WOverflowInt(x) } From d5ba319450f6e0eae36a9930c4bf0a55fb02579c Mon Sep 17 00:00:00 2001 From: "Randall C. O'Reilly" Date: Wed, 12 Aug 2026 19:43:15 +0200 Subject: [PATCH 2/2] nocrash: yaegi update --- yaegicore/coresymbols/cogentcore_org-core-core.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/yaegicore/coresymbols/cogentcore_org-core-core.go b/yaegicore/coresymbols/cogentcore_org-core-core.go index d19ad8360a..136359d752 100644 --- a/yaegicore/coresymbols/cogentcore_org-core-core.go +++ b/yaegicore/coresymbols/cogentcore_org-core-core.go @@ -358,6 +358,7 @@ func init() { "TreeButton": reflect.ValueOf((*core.TreeButton)(nil)), "Treer": reflect.ValueOf((*core.Treer)(nil)), "TypeChooser": reflect.ValueOf((*core.TypeChooser)(nil)), + "Updater": reflect.ValueOf((*core.Updater)(nil)), "User": reflect.ValueOf((*core.User)(nil)), "Validator": reflect.ValueOf((*core.Validator)(nil)), "Value": reflect.ValueOf((*core.Value)(nil)), @@ -381,6 +382,7 @@ func init() { "_TextFieldEmbedder": reflect.ValueOf((*_cogentcore_org_core_core_TextFieldEmbedder)(nil)), "_ToolbarMaker": reflect.ValueOf((*_cogentcore_org_core_core_ToolbarMaker)(nil)), "_Treer": reflect.ValueOf((*_cogentcore_org_core_core_Treer)(nil)), + "_Updater": reflect.ValueOf((*_cogentcore_org_core_core_Updater)(nil)), "_Validator": reflect.ValueOf((*_cogentcore_org_core_core_Validator)(nil)), "_Value": reflect.ValueOf((*_cogentcore_org_core_core_Value)(nil)), "_ValueSetter": reflect.ValueOf((*_cogentcore_org_core_core_ValueSetter)(nil)), @@ -781,6 +783,14 @@ func (W _cogentcore_org_core_core_Treer) WidgetTooltip(pos image.Point) (string, return W.WWidgetTooltip(pos) } +// _cogentcore_org_core_core_Updater is an interface wrapper for Updater type +type _cogentcore_org_core_core_Updater struct { + IValue interface{} + WUpdate func() +} + +func (W _cogentcore_org_core_core_Updater) Update() { W.WUpdate() } + // _cogentcore_org_core_core_Validator is an interface wrapper for Validator type type _cogentcore_org_core_core_Validator struct { IValue interface{}