-
Notifications
You must be signed in to change notification settings - Fork 391
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(examples): add p/moul/cow #3325
Conversation
🛠 PR Checks SummaryAll Automated Checks passed. ✅ Manual Checks (for Reviewers):
Read More🤖 This bot helps streamline PR reviews by verifying automated checks and providing guidance for contributors and reviewers. ✅ Automated Checks (for Contributors):🟢 Maintainers must be able to edit this pull request (more info) ☑️ Contributor Actions:
☑️ Reviewer Actions:
📚 Resources:Debug
|
Codecov ReportAll modified and coverable lines are covered by tests ✅ 📢 Thoughts on this report? Let us know! |
Signed-off-by: moul <[email protected]>
3d09fd8
to
b8132c9
Compare
Signed-off-by: moul <[email protected]>
github bot skip: up to date |
Note that this pattern may be useful in at least two cases:
I would love to see some examples. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The pattern is indeed very cool and could be adapted to any similar type of data structure with the way gnolang stores things. 👍
// Verify that Tree implements avl.ITree | ||
// var _ avl.ITree = (*Tree)(nil) // TODO: fix gnovm bug: ./examples/gno.land/p/moul/cow: test pkg: panic: gno.land/p/moul/cow/tree_test.gno:166:5: name avl not defined in fileset with files [node.gno tree.gno node_test.gno tree_test.gno]: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like it's fixed now. I tested it locally by importing gno.land/p/demo/avl
for both the interface and the type IterCbFn
, and the tests are running without any error. ;)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
not for me :/
./examples/gno.land/p/moul/cow: test pkg: panic: gno.land/p/moul/cow/tree_test.gno:166:5: name avl not defined in fileset with files [node.gno tree.gno node_test.gno tree_test.gno]:
--- preprocess stack ---
stack 0: file{ package cow; import testing testing; func TestNewTree(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); if tree<VPUverse(0)>.node != nil<VPUverse(0)> { t<VPUverse(0)>.Error("Expected tree.node to be nil") } }; func TestTreeSize(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); if tree<VPUverse(0)>.Size() != 0 { t<VPUverse(0)>.Error("Expected empty tree size to be 0") }; tree<VPUverse(0)>.Set("key1", "value1"); tree<VPUverse(0)>.Set("key2", "value2"); if tree<VPUverse(0)>.Size() != 2 { t<VPUverse(0)>.Error("Expected tree size to be 2") } }; func TestTreeHas(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); if !tree<VPUverse(0)>.Has("key1") { t<VPUverse(0)>.Error("Expected tree to have key1") }; if tree<VPUverse(0)>.Has("key2") { t<VPUverse(0)>.Error("Expected tree to not have key2") } }; func TestTreeGet(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); value<!VPUverse(0)>, exists<!VPUverse(0)> := tree<VPUverse(0)>.Get("key1"); if !exists<VPUverse(0)> || value<VPUverse(0)> != "value1" { t<VPUverse(0)>.Error("Expected Get to return value1 and true") }; _<VPUverse(0)>, exists<VPUverse(0)> = tree<VPUverse(0)>.Get("key2"); if exists<VPUverse(0)> { t<VPUverse(0)>.Error("Expected Get to return false for non-existent key") } }; func TestTreeGetByIndex(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); tree<VPUverse(0)>.Set("key2", "value2"); key<!VPUverse(0)>, value<!VPUverse(0)> := tree<VPUverse(0)>.GetByIndex(0); if key<VPUverse(0)> != "key1" || value<VPUverse(0)> != "value1" { t<VPUverse(0)>.Error("Expected GetByIndex(0) to return key1 and value1") }; key<VPUverse(0)>, value<VPUverse(0)> = tree<VPUverse(0)>.GetByIndex(1); if key<VPUverse(0)> != "key2" || value<VPUverse(0)> != "value2" { t<VPUverse(0)>.Error("Expected GetByIndex(1) to return key2 and value2") }; defer func func(){ if r<!VPUverse(0)> := recover<VPUverse(0)>(); r<VPUverse(0)> == nil<VPUverse(0)> { t<VPUverse(0)>.Error("Expected GetByIndex to panic for out-of-range index") } }(); tree<VPUverse(0)>.GetByIndex(2) }; func TestTreeRemove(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); value<!VPUverse(0)>, removed<!VPUverse(0)> := tree<VPUverse(0)>.Remove("key1"); if !removed<VPUverse(0)> || value<VPUverse(0)> != "value1" || tree<VPUverse(0)>.Size() != 0 { t<VPUverse(0)>.Error("Expected Remove to remove key-value pair") }; _<VPUverse(0)>, removed<VPUverse(0)> = tree<VPUverse(0)>.Remove("key2"); if removed<VPUverse(0)> { t<VPUverse(0)>.Error("Expected Remove to return false for non-existent key") } }; func TestTreeIterate(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); tree<VPUverse(0)>.Set("key2", "value2"); tree<VPUverse(0)>.Set("key3", "value3"); var keys<!VPUverse(0)> []string<VPUverse(0)>; tree<VPUverse(0)>.Iterate("", "", func func(key string<VPUverse(0)>, value interface { }) bool<VPUverse(0)>{ keys<VPUverse(0)> = append<VPUverse(0)>(keys<VPUverse(0)>, key<VPUverse(0)>); return false<VPUverse(0)> }); expectedKeys<!VPUverse(0)> := []string<VPUverse(0)>{"key1", "key2", "key3"}; if !slicesEqual<VPUverse(0)>(keys<VPUverse(0)>, expectedKeys<VPUverse(0)>) { t<VPUverse(0)>.Errorf("Expected keys %v, got %v", expectedKeys<VPUverse(0)>, keys<VPUverse(0)>) } }; func TestTreeReverseIterate(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); tree<VPUverse(0)>.Set("key2", "value2"); tree<VPUverse(0)>.Set("key3", "value3"); var keys<!VPUverse(0)> []string<VPUverse(0)>; tree<VPUverse(0)>.ReverseIterate("", "", func func(key string<VPUverse(0)>, value interface { }) bool<VPUverse(0)>{ keys<VPUverse(0)> = append<VPUverse(0)>(keys<VPUverse(0)>, key<VPUverse(0)>); return false<VPUverse(0)> }); expectedKeys<!VPUverse(0)> := []string<VPUverse(0)>{"key3", "key2", "key1"}; if !slicesEqual<VPUverse(0)>(keys<VPUverse(0)>, expectedKeys<VPUverse(0)>) { t<VPUverse(0)>.Errorf("Expected keys %v, got %v", expectedKeys<VPUverse(0)>, keys<VPUverse(0)>) } }; func TestTreeIterateByOffset(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); tree<VPUverse(0)>.Set("key2", "value2"); tree<VPUverse(0)>.Set("key3", "value3"); var keys<!VPUverse(0)> []string<VPUverse(0)>; tree<VPUverse(0)>.IterateByOffset(1, 2, func func(key string<VPUverse(0)>, value interface { }) bool<VPUverse(0)>{ keys<VPUverse(0)> = append<VPUverse(0)>(keys<VPUverse(0)>, key<VPUverse(0)>); return false<VPUverse(0)> }); expectedKeys<!VPUverse(0)> := []string<VPUverse(0)>{"key2", "key3"}; if !slicesEqual<VPUverse(0)>(keys<VPUverse(0)>, expectedKeys<VPUverse(0)>) { t<VPUverse(0)>.Errorf("Expected keys %v, got %v", expectedKeys<VPUverse(0)>, keys<VPUverse(0)>) } }; func TestTreeReverseIterateByOffset(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); tree<VPUverse(0)>.Set("key2", "value2"); tree<VPUverse(0)>.Set("key3", "value3"); var keys<!VPUverse(0)> []string<VPUverse(0)>; tree<VPUverse(0)>.ReverseIterateByOffset(1, 2, func func(key string<VPUverse(0)>, value interface { }) bool<VPUverse(0)>{ keys<VPUverse(0)> = append<VPUverse(0)>(keys<VPUverse(0)>, key<VPUverse(0)>); return false<VPUverse(0)> }); expectedKeys<!VPUverse(0)> := []string<VPUverse(0)>{"key2", "key1"}; if !slicesEqual<VPUverse(0)>(keys<VPUverse(0)>, expectedKeys<VPUverse(0)>) { t<VPUverse(0)>.Errorf("Expected keys %v, got %v", expectedKeys<VPUverse(0)>, keys<VPUverse(0)>) } }; var _<VPUverse(0)> avl<VPUverse(0)>.ITree = *(Tree<VPUverse(0)>)(nil<VPUverse(0)>); func TestCopyOnWrite(t *(testing<VPBlock(1,0)>.T)) { original<!VPUverse(0)> := NewTree<VPUverse(0)>(); original<VPUverse(0)>.Set("A", 1); original<VPUverse(0)>.Set("B", 2); original<VPUverse(0)>.Set("C", 3); clone<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone<VPUverse(0)>.Set("B", 20); clone<VPUverse(0)>.Set("D", 4); if val<!VPUverse(0)>, _<VPUverse(0)> := original<VPUverse(0)>.Get("B"); val<VPUverse(0)> != 2 { t<VPUverse(0)>.Errorf("Original tree was modified: expected B=2, got B=%v", val<VPUverse(0)>) }; if original<VPUverse(0)>.Has("D") { t<VPUverse(0)>.Error("Original tree was modified: found key D") }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone<VPUverse(0)>.Get("B"); val<VPUverse(0)> != 20 { t<VPUverse(0)>.Errorf("Clone not updated: expected B=20, got B=%v", val<VPUverse(0)>) }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone<VPUverse(0)>.Get("D"); val<VPUverse(0)> != 4 { t<VPUverse(0)>.Errorf("Clone not updated: expected D=4, got D=%v", val<VPUverse(0)>) } }; func TestCopyOnWriteEdgeCases(t *(testing<VPBlock(1,0)>.T)) { t<VPUverse(0)>.Run("nil tree clone", func func(t *(testing<VPUverse(0)>.T)){ var original<!VPUverse(0)> *(Tree<VPUverse(0)>); clone<!VPUverse(0)> := original<VPUverse(0)>.Clone(); if clone<VPUverse(0)> != nil<VPUverse(0)> { t<VPUverse(0)>.Error("Expected nil clone from nil tree") } }); t<VPUverse(0)>.Run("empty tree clone", func func(t *(testing<VPUverse(0)>.T)){ original<!VPUverse(0)> := NewTree<VPUverse(0)>(); clone<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone<VPUverse(0)>.Set("A", 1); if original<VPUverse(0)>.Size() != 0 { t<VPUverse(0)>.Error("Original empty tree was modified") }; if clone<VPUverse(0)>.Size() != 1 { t<VPUverse(0)>.Error("Clone was not modified") } }); t<VPUverse(0)>.Run("multiple clones", func func(t *(testing<VPUverse(0)>.T)){ original<!VPUverse(0)> := NewTree<VPUverse(0)>(); original<VPUverse(0)>.Set("A", 1); original<VPUverse(0)>.Set("B", 2); clone1<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone2<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone3<!VPUverse(0)> := clone1<VPUverse(0)>.Clone(); clone1<VPUverse(0)>.Set("A", 10); clone2<VPUverse(0)>.Set("B", 20); clone3<VPUverse(0)>.Set("C", 30); if val<!VPUverse(0)>, _<VPUverse(0)> := original<VPUverse(0)>.Get("A"); val<VPUverse(0)> != 1 { t<VPUverse(0)>.Errorf("Original modified: expected A=1, got A=%v", val<VPUverse(0)>) }; if val<!VPUverse(0)>, _<VPUverse(0)> := original<VPUverse(0)>.Get("B"); val<VPUverse(0)> != 2 { t<VPUverse(0)>.Errorf("Original modified: expected B=2, got B=%v", val<VPUverse(0)>) }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone1<VPUverse(0)>.Get("A"); val<VPUverse(0)> != 10 { t<VPUverse(0)>.Errorf("Clone1 incorrect: expected A=10, got A=%v", val<VPUverse(0)>) }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone2<VPUverse(0)>.Get("B"); val<VPUverse(0)> != 20 { t<VPUverse(0)>.Errorf("Clone2 incorrect: expected B=20, got B=%v", val<VPUverse(0)>) }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone3<VPUverse(0)>.Get("C"); val<VPUverse(0)> != 30 { t<VPUverse(0)>.Errorf("Clone3 incorrect: expected C=30, got C=%v", val<VPUverse(0)>) } }); t<VPUverse(0)>.Run("clone after removal", func func(t *(testing<VPUverse(0)>.T)){ original<!VPUverse(0)> := NewTree<VPUverse(0)>(); original<VPUverse(0)>.Set("A", 1); original<VPUverse(0)>.Set("B", 2); original<VPUverse(0)>.Set("C", 3); original<VPUverse(0)>.Remove("B"); clone<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone<VPUverse(0)>.Set("B", 20); if original<VPUverse(0)>.Has("B") { t<VPUverse(0)>.Error("Original tree should not have key B") }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone<VPUverse(0)>.Get("B"); val<VPUverse(0)> != 20 { t<VPUverse(0)>.Errorf("Clone incorrect: expected B=20, got B=%v", val<VPUverse(0)>) } }); t<VPUverse(0)>.Run("concurrent modifications", func func(t *(testing<VPUverse(0)>.T)){ original<!VPUverse(0)> := NewTree<VPUverse(0)>(); original<VPUverse(0)>.Set("A", 1); original<VPUverse(0)>.Set("B", 2); clone1<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone2<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone1<VPUverse(0)>.Set("B", 20); clone2<VPUverse(0)>.Set("B", 30); if val<!VPUverse(0)>, _<VPUverse(0)> := clone1<VPUverse(0)>.Get("B"); val<VPUverse(0)> != 20 { t<VPUverse(0)>.Errorf("Clone1 incorrect: expected B=20, got B=%v", val<VPUverse(0)>) }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone2<VPUverse(0)>.Get("B"); val<VPUverse(0)> != 30 { t<VPUverse(0)>.Errorf("Clone2 incorrect: expected B=30, got B=%v", val<VPUverse(0)>) } }); t<VPUverse(0)>.Run("deep tree modifications", func func(t *(testing<VPUverse(0)>.T)){ original<!VPUverse(0)> := NewTree<VPUverse(0)>(); keys<!VPUverse(0)> := []string<VPUverse(0)>{"M", "F", "T", "B", "H", "P", "Z"}; for _<VPUverse(0)>, k<VPUverse(0)> := range keys<VPUverse(0)> { original<VPUverse(0)>.Set(k<VPUverse(0)>, k<VPUverse(0)>) }; clone<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone<VPUverse(0)>.Set("H", "modified"); if val<!VPUverse(0)>, _<VPUverse(0)> := original<VPUverse(0)>.Get("H"); val<VPUverse(0)> != "H" { t<VPUverse(0)>.Errorf("Original modified: expected H='H', got H=%v", val<VPUverse(0)>) }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone<VPUverse(0)>.Get("H"); val<VPUverse(0)> != "modified" { t<VPUverse(0)>.Errorf("Clone incorrect: expected H='modified', got H=%v", val<VPUverse(0)>) } }); t<VPUverse(0)>.Run("rebalancing test", func func(t *(testing<VPUverse(0)>.T)){ original<!VPUverse(0)> := NewTree<VPUverse(0)>(); keys<!VPUverse(0)> := []string<VPUverse(0)>{"A", "B", "C", "D", "E"}; for _<VPUverse(0)>, k<VPUverse(0)> := range keys<VPUverse(0)> { original<VPUverse(0)>.Set(k<VPUverse(0)>, k<VPUverse(0)>) }; clone<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone<VPUverse(0)>.Set("F", "F"); clone<VPUverse(0)>.Set("G", "G"); originalKeys<!VPUverse(0)> := collectKeys<VPUverse(0)>(original<VPUverse(0)>); expectedOriginal<!VPUverse(0)> := []string<VPUverse(0)>{"A", "B", "C", "D", "E"}; if !slicesEqual<VPUverse(0)>(originalKeys<VPUverse(0)>, expectedOriginal<VPUverse(0)>) { t<VPUverse(0)>.Errorf("Original tree structure changed: got %v, want %v", originalKeys<VPUverse(0)>, expectedOriginal<VPUverse(0)>) }; cloneKeys<!VPUverse(0)> := collectKeys<VPUverse(0)>(clone<VPUverse(0)>); expectedClone<!VPUverse(0)> := []string<VPUverse(0)>{"A", "B", "C", "D", "E", "F", "G"}; if !slicesEqual<VPUverse(0)>(cloneKeys<VPUverse(0)>, expectedClone<VPUverse(0)>) { t<VPUverse(0)>.Errorf("Clone tree structure incorrect: got %v, want %v", cloneKeys<VPUverse(0)>, expectedClone<VPUverse(0)>) } }); t<VPUverse(0)>.Run("value mutation test", func func(t *(testing<VPUverse(0)>.T)){ type MutableValue struct { Data string<VPUverse(0)> }; original<!VPUverse(0)> := NewTree<VPUverse(0)>(); mutable<!VPUverse(0)> := &(MutableValue<VPUverse(0)>{Data<VPUverse(0)>: "original"}); original<VPUverse(0)>.Set("key", mutable<VPUverse(0)>); clone<!VPUverse(0)> := original<VPUverse(0)>.Clone(); mutable<VPUverse(0)>.Data = "modified"; origVal<!VPUverse(0)>, _<VPUverse(0)> := original<VPUverse(0)>.Get("key"); cloneVal<!VPUverse(0)>, _<VPUverse(0)> := clone<VPUverse(0)>.Get("key"); if origVal<VPUverse(0)>.(*(MutableValue<VPUverse(0)>)).Data != "modified" { t<VPUverse(0)>.Error("Original value not modified as expected") }; if cloneVal<VPUverse(0)>.(*(MutableValue<VPUverse(0)>)).Data != "modified" { t<VPUverse(0)>.Error("Clone value not modified as expected") } }) }; func collectKeys(tree *(Tree<VPBlock(2,4)>)) [](const-type string) { var keys<!VPUverse(0)> []string<VPUverse(0)>; tree<VPUverse(0)>.Iterate("", "", func func(key string<VPUverse(0)>, .arg_1 interface { }) bool<VPUverse(0)>{ keys<VPUverse(0)> = append<VPUverse(0)>(keys<VPUverse(0)>, key<VPUverse(0)>); return false<VPUverse(0)> }); return keys<VPUverse(0)> } }
------------------------
go stacktrace:
goroutine 1 [running]:
runtime/debug.Stack()
/nix/store/bva4mymi5b2lhvvbccx8ipws89rar1d8-go-1.23.4/share/go/src/runtime/debug/stack.go:26 +0x64
github.com/gnolang/gno/gnovm/pkg/test.(*TestOptions).runTestFiles.func1()
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/test/test.go:280 +0xe0
panic({0x1059beda0?, 0x1400742a180?})
/nix/store/bva4mymi5b2lhvvbccx8ipws89rar1d8-go-1.23.4/share/go/src/runtime/panic.go:785 +0x124
github.com/gnolang/gno/gnovm/pkg/gnolang.doRecover({0x140037875b0, 0x1, 0x1}, {0x105ad2f40, 0x14005efc070})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/gnolang/preprocess.go:392 +0x2ac
panic({0x105942b20?, 0x140037875a0?})
/nix/store/bva4mymi5b2lhvvbccx8ipws89rar1d8-go-1.23.4/share/go/src/runtime/panic.go:785 +0x124
github.com/gnolang/gno/gnovm/pkg/gnolang.(*FileSet).GetDeclFor(0x14004992018, {0x1400432c050, 0x3})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/gnolang/nodes.go:1410 +0x140
github.com/gnolang/gno/gnovm/pkg/gnolang.predefineNow2({0x1067df708, 0x1400578b2c0}, {0x105adfa00, 0x14005f80708}, {0x105ad7b10, 0x14005efc070}, 0x14007f332b0)
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/gnolang/preprocess.go:4649 +0x1dc
github.com/gnolang/gno/gnovm/pkg/gnolang.predefineNow({0x1067df708?, 0x1400578b2c0?}, {0x105adfa00?, 0x14005f80708?}, {0x105ad7b10?, 0x14005efc070?})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/gnolang/preprocess.go:4618 +0xb4
github.com/gnolang/gno/gnovm/pkg/gnolang.PredefineFileSet({0x1067df708, 0x1400578b2c0}, 0x1400611b808, 0x14006d90c48)
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/gnolang/preprocess.go:134 +0x2f8
github.com/gnolang/gno/gnovm/pkg/gnolang.(*Machine).runFileDecls(0x1400ac12008, {0x140001958e0, 0x2, 0x2})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/gnolang/machine.go:491 +0x1c8
github.com/gnolang/gno/gnovm/pkg/gnolang.(*Machine).RunFiles(0x1400ac12008, {0x140001958e0?, 0x105ac03a0?, 0x14000400d10?})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/gnolang/machine.go:453 +0x30
github.com/gnolang/gno/gnovm/pkg/test.(*TestOptions).runTestFiles(0x14000400c80, 0x1400048d880, 0x14000855d10, {0x105ad0138?, 0x14005e812f0?}, {0x105adea38, 0x1400578b2c0})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/test/test.go:306 +0x220
github.com/gnolang/gno/gnovm/pkg/test.Test(0x1400048d880, {0x16b0867cc, 0x1e}, 0x14000400c80)
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/test/test.go:204 +0x158
main.execTest.func2()
/Users/moul/go/src/github.com/gnolang/gno/gnovm/cmd/gno/test.go:218 +0x38
main.catchRuntimeError({0x140003de948?, 0x1e?}, {0x105ac4000?, 0x1400019a060?}, 0x105abf998?)
/Users/moul/go/src/github.com/gnolang/gno/gnovm/cmd/gno/tool_lint.go:298 +0x70
main.execTest(0x1400048cfc0, {0x1400004e470?, 0x1e?, 0x1?}, {0x105ad79f0, 0x14000461590})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/cmd/gno/test.go:217 +0x554
main.newTestCmd.func1({0x0?, 0x140001b8040?}, {0x1400004e470?, 0x14000696d80?, 0x0?})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/cmd/gno/test.go:92 +0x3c
github.com/gnolang/gno/tm2/pkg/commands.(*Command).Run(0x0?, {0x105ac92a0?, 0x1061bc3e0?})
/Users/moul/go/src/github.com/gnolang/gno/tm2/pkg/commands/command.go:255 +0x174
github.com/gnolang/gno/tm2/pkg/commands.(*Command).Run(0x140004313f0?, {0x105ac92a0?, 0x1061bc3e0?})
/Users/moul/go/src/github.com/gnolang/gno/tm2/pkg/commands/command.go:259 +0x124
github.com/gnolang/gno/tm2/pkg/commands.(*Command).ParseAndRun(0x140004313f0, {0x105ac92a0, 0x1061bc3e0}, {0x140001b8010?, 0x14000431550?, 0x14000431600?})
/Users/moul/go/src/github.com/gnolang/gno/tm2/pkg/commands/command.go:140 +0x4c
github.com/gnolang/gno/tm2/pkg/commands.(*Command).Execute(0x105ad79f0?, {0x105ac92a0?, 0x1061bc3e0?}, {0x140001b8010?, 0x106116028?, 0x140000021c0?})
/Users/moul/go/src/github.com/gnolang/gno/tm2/pkg/commands/command.go:117 +0x28
main.main()
/Users/moul/go/src/github.com/gnolang/gno/gnovm/cmd/gno/main.go:13 +0x6c
gno machine: Machine:
PreprocessorMode: false
Op: []
Values: (len: 0)
Exprs:
Stmts:
Blocks:
Blocks (other):
./examples/gno.land/p/moul/cow: test pkg: panic: gno.land/p/moul/cow/tree_test.gno:166:5: name avl not defined in fileset with files [node.gno tree.gno node_test.gno tree_test.gno]:
--- preprocess stack ---
stack 0: file{ package cow; import testing testing; func TestNewTree(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); if tree<VPUverse(0)>.node != nil<VPUverse(0)> { t<VPUverse(0)>.Error("Expected tree.node to be nil") } }; func TestTreeSize(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); if tree<VPUverse(0)>.Size() != 0 { t<VPUverse(0)>.Error("Expected empty tree size to be 0") }; tree<VPUverse(0)>.Set("key1", "value1"); tree<VPUverse(0)>.Set("key2", "value2"); if tree<VPUverse(0)>.Size() != 2 { t<VPUverse(0)>.Error("Expected tree size to be 2") } }; func TestTreeHas(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); if !tree<VPUverse(0)>.Has("key1") { t<VPUverse(0)>.Error("Expected tree to have key1") }; if tree<VPUverse(0)>.Has("key2") { t<VPUverse(0)>.Error("Expected tree to not have key2") } }; func TestTreeGet(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); value<!VPUverse(0)>, exists<!VPUverse(0)> := tree<VPUverse(0)>.Get("key1"); if !exists<VPUverse(0)> || value<VPUverse(0)> != "value1" { t<VPUverse(0)>.Error("Expected Get to return value1 and true") }; _<VPUverse(0)>, exists<VPUverse(0)> = tree<VPUverse(0)>.Get("key2"); if exists<VPUverse(0)> { t<VPUverse(0)>.Error("Expected Get to return false for non-existent key") } }; func TestTreeGetByIndex(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); tree<VPUverse(0)>.Set("key2", "value2"); key<!VPUverse(0)>, value<!VPUverse(0)> := tree<VPUverse(0)>.GetByIndex(0); if key<VPUverse(0)> != "key1" || value<VPUverse(0)> != "value1" { t<VPUverse(0)>.Error("Expected GetByIndex(0) to return key1 and value1") }; key<VPUverse(0)>, value<VPUverse(0)> = tree<VPUverse(0)>.GetByIndex(1); if key<VPUverse(0)> != "key2" || value<VPUverse(0)> != "value2" { t<VPUverse(0)>.Error("Expected GetByIndex(1) to return key2 and value2") }; defer func func(){ if r<!VPUverse(0)> := recover<VPUverse(0)>(); r<VPUverse(0)> == nil<VPUverse(0)> { t<VPUverse(0)>.Error("Expected GetByIndex to panic for out-of-range index") } }(); tree<VPUverse(0)>.GetByIndex(2) }; func TestTreeRemove(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); value<!VPUverse(0)>, removed<!VPUverse(0)> := tree<VPUverse(0)>.Remove("key1"); if !removed<VPUverse(0)> || value<VPUverse(0)> != "value1" || tree<VPUverse(0)>.Size() != 0 { t<VPUverse(0)>.Error("Expected Remove to remove key-value pair") }; _<VPUverse(0)>, removed<VPUverse(0)> = tree<VPUverse(0)>.Remove("key2"); if removed<VPUverse(0)> { t<VPUverse(0)>.Error("Expected Remove to return false for non-existent key") } }; func TestTreeIterate(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); tree<VPUverse(0)>.Set("key2", "value2"); tree<VPUverse(0)>.Set("key3", "value3"); var keys<!VPUverse(0)> []string<VPUverse(0)>; tree<VPUverse(0)>.Iterate("", "", func func(key string<VPUverse(0)>, value interface { }) bool<VPUverse(0)>{ keys<VPUverse(0)> = append<VPUverse(0)>(keys<VPUverse(0)>, key<VPUverse(0)>); return false<VPUverse(0)> }); expectedKeys<!VPUverse(0)> := []string<VPUverse(0)>{"key1", "key2", "key3"}; if !slicesEqual<VPUverse(0)>(keys<VPUverse(0)>, expectedKeys<VPUverse(0)>) { t<VPUverse(0)>.Errorf("Expected keys %v, got %v", expectedKeys<VPUverse(0)>, keys<VPUverse(0)>) } }; func TestTreeReverseIterate(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); tree<VPUverse(0)>.Set("key2", "value2"); tree<VPUverse(0)>.Set("key3", "value3"); var keys<!VPUverse(0)> []string<VPUverse(0)>; tree<VPUverse(0)>.ReverseIterate("", "", func func(key string<VPUverse(0)>, value interface { }) bool<VPUverse(0)>{ keys<VPUverse(0)> = append<VPUverse(0)>(keys<VPUverse(0)>, key<VPUverse(0)>); return false<VPUverse(0)> }); expectedKeys<!VPUverse(0)> := []string<VPUverse(0)>{"key3", "key2", "key1"}; if !slicesEqual<VPUverse(0)>(keys<VPUverse(0)>, expectedKeys<VPUverse(0)>) { t<VPUverse(0)>.Errorf("Expected keys %v, got %v", expectedKeys<VPUverse(0)>, keys<VPUverse(0)>) } }; func TestTreeIterateByOffset(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); tree<VPUverse(0)>.Set("key2", "value2"); tree<VPUverse(0)>.Set("key3", "value3"); var keys<!VPUverse(0)> []string<VPUverse(0)>; tree<VPUverse(0)>.IterateByOffset(1, 2, func func(key string<VPUverse(0)>, value interface { }) bool<VPUverse(0)>{ keys<VPUverse(0)> = append<VPUverse(0)>(keys<VPUverse(0)>, key<VPUverse(0)>); return false<VPUverse(0)> }); expectedKeys<!VPUverse(0)> := []string<VPUverse(0)>{"key2", "key3"}; if !slicesEqual<VPUverse(0)>(keys<VPUverse(0)>, expectedKeys<VPUverse(0)>) { t<VPUverse(0)>.Errorf("Expected keys %v, got %v", expectedKeys<VPUverse(0)>, keys<VPUverse(0)>) } }; func TestTreeReverseIterateByOffset(t *(testing<VPBlock(1,0)>.T)) { tree<!VPUverse(0)> := NewTree<VPUverse(0)>(); tree<VPUverse(0)>.Set("key1", "value1"); tree<VPUverse(0)>.Set("key2", "value2"); tree<VPUverse(0)>.Set("key3", "value3"); var keys<!VPUverse(0)> []string<VPUverse(0)>; tree<VPUverse(0)>.ReverseIterateByOffset(1, 2, func func(key string<VPUverse(0)>, value interface { }) bool<VPUverse(0)>{ keys<VPUverse(0)> = append<VPUverse(0)>(keys<VPUverse(0)>, key<VPUverse(0)>); return false<VPUverse(0)> }); expectedKeys<!VPUverse(0)> := []string<VPUverse(0)>{"key2", "key1"}; if !slicesEqual<VPUverse(0)>(keys<VPUverse(0)>, expectedKeys<VPUverse(0)>) { t<VPUverse(0)>.Errorf("Expected keys %v, got %v", expectedKeys<VPUverse(0)>, keys<VPUverse(0)>) } }; var _<VPUverse(0)> avl<VPUverse(0)>.ITree = *(Tree<VPUverse(0)>)(nil<VPUverse(0)>); func TestCopyOnWrite(t *(testing<VPBlock(1,0)>.T)) { original<!VPUverse(0)> := NewTree<VPUverse(0)>(); original<VPUverse(0)>.Set("A", 1); original<VPUverse(0)>.Set("B", 2); original<VPUverse(0)>.Set("C", 3); clone<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone<VPUverse(0)>.Set("B", 20); clone<VPUverse(0)>.Set("D", 4); if val<!VPUverse(0)>, _<VPUverse(0)> := original<VPUverse(0)>.Get("B"); val<VPUverse(0)> != 2 { t<VPUverse(0)>.Errorf("Original tree was modified: expected B=2, got B=%v", val<VPUverse(0)>) }; if original<VPUverse(0)>.Has("D") { t<VPUverse(0)>.Error("Original tree was modified: found key D") }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone<VPUverse(0)>.Get("B"); val<VPUverse(0)> != 20 { t<VPUverse(0)>.Errorf("Clone not updated: expected B=20, got B=%v", val<VPUverse(0)>) }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone<VPUverse(0)>.Get("D"); val<VPUverse(0)> != 4 { t<VPUverse(0)>.Errorf("Clone not updated: expected D=4, got D=%v", val<VPUverse(0)>) } }; func TestCopyOnWriteEdgeCases(t *(testing<VPBlock(1,0)>.T)) { t<VPUverse(0)>.Run("nil tree clone", func func(t *(testing<VPUverse(0)>.T)){ var original<!VPUverse(0)> *(Tree<VPUverse(0)>); clone<!VPUverse(0)> := original<VPUverse(0)>.Clone(); if clone<VPUverse(0)> != nil<VPUverse(0)> { t<VPUverse(0)>.Error("Expected nil clone from nil tree") } }); t<VPUverse(0)>.Run("empty tree clone", func func(t *(testing<VPUverse(0)>.T)){ original<!VPUverse(0)> := NewTree<VPUverse(0)>(); clone<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone<VPUverse(0)>.Set("A", 1); if original<VPUverse(0)>.Size() != 0 { t<VPUverse(0)>.Error("Original empty tree was modified") }; if clone<VPUverse(0)>.Size() != 1 { t<VPUverse(0)>.Error("Clone was not modified") } }); t<VPUverse(0)>.Run("multiple clones", func func(t *(testing<VPUverse(0)>.T)){ original<!VPUverse(0)> := NewTree<VPUverse(0)>(); original<VPUverse(0)>.Set("A", 1); original<VPUverse(0)>.Set("B", 2); clone1<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone2<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone3<!VPUverse(0)> := clone1<VPUverse(0)>.Clone(); clone1<VPUverse(0)>.Set("A", 10); clone2<VPUverse(0)>.Set("B", 20); clone3<VPUverse(0)>.Set("C", 30); if val<!VPUverse(0)>, _<VPUverse(0)> := original<VPUverse(0)>.Get("A"); val<VPUverse(0)> != 1 { t<VPUverse(0)>.Errorf("Original modified: expected A=1, got A=%v", val<VPUverse(0)>) }; if val<!VPUverse(0)>, _<VPUverse(0)> := original<VPUverse(0)>.Get("B"); val<VPUverse(0)> != 2 { t<VPUverse(0)>.Errorf("Original modified: expected B=2, got B=%v", val<VPUverse(0)>) }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone1<VPUverse(0)>.Get("A"); val<VPUverse(0)> != 10 { t<VPUverse(0)>.Errorf("Clone1 incorrect: expected A=10, got A=%v", val<VPUverse(0)>) }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone2<VPUverse(0)>.Get("B"); val<VPUverse(0)> != 20 { t<VPUverse(0)>.Errorf("Clone2 incorrect: expected B=20, got B=%v", val<VPUverse(0)>) }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone3<VPUverse(0)>.Get("C"); val<VPUverse(0)> != 30 { t<VPUverse(0)>.Errorf("Clone3 incorrect: expected C=30, got C=%v", val<VPUverse(0)>) } }); t<VPUverse(0)>.Run("clone after removal", func func(t *(testing<VPUverse(0)>.T)){ original<!VPUverse(0)> := NewTree<VPUverse(0)>(); original<VPUverse(0)>.Set("A", 1); original<VPUverse(0)>.Set("B", 2); original<VPUverse(0)>.Set("C", 3); original<VPUverse(0)>.Remove("B"); clone<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone<VPUverse(0)>.Set("B", 20); if original<VPUverse(0)>.Has("B") { t<VPUverse(0)>.Error("Original tree should not have key B") }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone<VPUverse(0)>.Get("B"); val<VPUverse(0)> != 20 { t<VPUverse(0)>.Errorf("Clone incorrect: expected B=20, got B=%v", val<VPUverse(0)>) } }); t<VPUverse(0)>.Run("concurrent modifications", func func(t *(testing<VPUverse(0)>.T)){ original<!VPUverse(0)> := NewTree<VPUverse(0)>(); original<VPUverse(0)>.Set("A", 1); original<VPUverse(0)>.Set("B", 2); clone1<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone2<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone1<VPUverse(0)>.Set("B", 20); clone2<VPUverse(0)>.Set("B", 30); if val<!VPUverse(0)>, _<VPUverse(0)> := clone1<VPUverse(0)>.Get("B"); val<VPUverse(0)> != 20 { t<VPUverse(0)>.Errorf("Clone1 incorrect: expected B=20, got B=%v", val<VPUverse(0)>) }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone2<VPUverse(0)>.Get("B"); val<VPUverse(0)> != 30 { t<VPUverse(0)>.Errorf("Clone2 incorrect: expected B=30, got B=%v", val<VPUverse(0)>) } }); t<VPUverse(0)>.Run("deep tree modifications", func func(t *(testing<VPUverse(0)>.T)){ original<!VPUverse(0)> := NewTree<VPUverse(0)>(); keys<!VPUverse(0)> := []string<VPUverse(0)>{"M", "F", "T", "B", "H", "P", "Z"}; for _<VPUverse(0)>, k<VPUverse(0)> := range keys<VPUverse(0)> { original<VPUverse(0)>.Set(k<VPUverse(0)>, k<VPUverse(0)>) }; clone<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone<VPUverse(0)>.Set("H", "modified"); if val<!VPUverse(0)>, _<VPUverse(0)> := original<VPUverse(0)>.Get("H"); val<VPUverse(0)> != "H" { t<VPUverse(0)>.Errorf("Original modified: expected H='H', got H=%v", val<VPUverse(0)>) }; if val<!VPUverse(0)>, _<VPUverse(0)> := clone<VPUverse(0)>.Get("H"); val<VPUverse(0)> != "modified" { t<VPUverse(0)>.Errorf("Clone incorrect: expected H='modified', got H=%v", val<VPUverse(0)>) } }); t<VPUverse(0)>.Run("rebalancing test", func func(t *(testing<VPUverse(0)>.T)){ original<!VPUverse(0)> := NewTree<VPUverse(0)>(); keys<!VPUverse(0)> := []string<VPUverse(0)>{"A", "B", "C", "D", "E"}; for _<VPUverse(0)>, k<VPUverse(0)> := range keys<VPUverse(0)> { original<VPUverse(0)>.Set(k<VPUverse(0)>, k<VPUverse(0)>) }; clone<!VPUverse(0)> := original<VPUverse(0)>.Clone(); clone<VPUverse(0)>.Set("F", "F"); clone<VPUverse(0)>.Set("G", "G"); originalKeys<!VPUverse(0)> := collectKeys<VPUverse(0)>(original<VPUverse(0)>); expectedOriginal<!VPUverse(0)> := []string<VPUverse(0)>{"A", "B", "C", "D", "E"}; if !slicesEqual<VPUverse(0)>(originalKeys<VPUverse(0)>, expectedOriginal<VPUverse(0)>) { t<VPUverse(0)>.Errorf("Original tree structure changed: got %v, want %v", originalKeys<VPUverse(0)>, expectedOriginal<VPUverse(0)>) }; cloneKeys<!VPUverse(0)> := collectKeys<VPUverse(0)>(clone<VPUverse(0)>); expectedClone<!VPUverse(0)> := []string<VPUverse(0)>{"A", "B", "C", "D", "E", "F", "G"}; if !slicesEqual<VPUverse(0)>(cloneKeys<VPUverse(0)>, expectedClone<VPUverse(0)>) { t<VPUverse(0)>.Errorf("Clone tree structure incorrect: got %v, want %v", cloneKeys<VPUverse(0)>, expectedClone<VPUverse(0)>) } }); t<VPUverse(0)>.Run("value mutation test", func func(t *(testing<VPUverse(0)>.T)){ type MutableValue struct { Data string<VPUverse(0)> }; original<!VPUverse(0)> := NewTree<VPUverse(0)>(); mutable<!VPUverse(0)> := &(MutableValue<VPUverse(0)>{Data<VPUverse(0)>: "original"}); original<VPUverse(0)>.Set("key", mutable<VPUverse(0)>); clone<!VPUverse(0)> := original<VPUverse(0)>.Clone(); mutable<VPUverse(0)>.Data = "modified"; origVal<!VPUverse(0)>, _<VPUverse(0)> := original<VPUverse(0)>.Get("key"); cloneVal<!VPUverse(0)>, _<VPUverse(0)> := clone<VPUverse(0)>.Get("key"); if origVal<VPUverse(0)>.(*(MutableValue<VPUverse(0)>)).Data != "modified" { t<VPUverse(0)>.Error("Original value not modified as expected") }; if cloneVal<VPUverse(0)>.(*(MutableValue<VPUverse(0)>)).Data != "modified" { t<VPUverse(0)>.Error("Clone value not modified as expected") } }) }; func collectKeys(tree *(Tree<VPBlock(2,4)>)) [](const-type string) { var keys<!VPUverse(0)> []string<VPUverse(0)>; tree<VPUverse(0)>.Iterate("", "", func func(key string<VPUverse(0)>, .arg_1 interface { }) bool<VPUverse(0)>{ keys<VPUverse(0)> = append<VPUverse(0)>(keys<VPUverse(0)>, key<VPUverse(0)>); return false<VPUverse(0)> }); return keys<VPUverse(0)> } }
------------------------
go stacktrace:
goroutine 1 [running]:
runtime/debug.Stack()
/nix/store/bva4mymi5b2lhvvbccx8ipws89rar1d8-go-1.23.4/share/go/src/runtime/debug/stack.go:26 +0x64
github.com/gnolang/gno/gnovm/pkg/test.(*TestOptions).runTestFiles.func1()
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/test/test.go:280 +0xe0
panic({0x10363eda0?, 0x14005d74f00?})
/nix/store/bva4mymi5b2lhvvbccx8ipws89rar1d8-go-1.23.4/share/go/src/runtime/panic.go:785 +0x124
github.com/gnolang/gno/gnovm/pkg/gnolang.doRecover({0x14002b3e520, 0x1, 0x1}, {0x103752f40, 0x14002d6d500})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/gnolang/preprocess.go:392 +0x2ac
panic({0x1035c2b20?, 0x14002b3e510?})
/nix/store/bva4mymi5b2lhvvbccx8ipws89rar1d8-go-1.23.4/share/go/src/runtime/panic.go:785 +0x124
github.com/gnolang/gno/gnovm/pkg/gnolang.(*FileSet).GetDeclFor(0x14003ca6ca8, {0x140054fb750, 0x3})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/gnolang/nodes.go:1410 +0x140
github.com/gnolang/gno/gnovm/pkg/gnolang.predefineNow2({0x10affb508, 0x14001ad74a0}, {0x10375fa00, 0x1400308a708}, {0x103757b10, 0x14002d6d500}, 0x140045c32b0)
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/gnolang/preprocess.go:4649 +0x1dc
github.com/gnolang/gno/gnovm/pkg/gnolang.predefineNow({0x10affb508?, 0x14001ad74a0?}, {0x10375fa00?, 0x1400308a708?}, {0x103757b10?, 0x14002d6d500?})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/gnolang/preprocess.go:4618 +0xb4
github.com/gnolang/gno/gnovm/pkg/gnolang.PredefineFileSet({0x10affb508, 0x14001ad74a0}, 0x1400369bb08, 0x1400534d638)
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/gnolang/preprocess.go:134 +0x2f8
github.com/gnolang/gno/gnovm/pkg/gnolang.(*Machine).runFileDecls(0x1400a414008, {0x1400418dc80, 0x2, 0x2})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/gnolang/machine.go:491 +0x1c8
github.com/gnolang/gno/gnovm/pkg/gnolang.(*Machine).RunFiles(0x1400a414008, {0x1400418dc80?, 0x1037403a0?, 0x14000408bd0?})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/gnolang/machine.go:453 +0x30
github.com/gnolang/gno/gnovm/pkg/test.(*TestOptions).runTestFiles(0x14000408b40, 0x14000493880, 0x1400561b3b0, {0x103750138?, 0x140030b40f0?}, {0x10375ea38, 0x14001ad74a0})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/test/test.go:306 +0x220
github.com/gnolang/gno/gnovm/pkg/test.Test(0x14000493880, {0x16d4067cc, 0x1e}, 0x14000408b40)
/Users/moul/go/src/github.com/gnolang/gno/gnovm/pkg/test/test.go:204 +0x158
main.execTest.func2()
/Users/moul/go/src/github.com/gnolang/gno/gnovm/cmd/gno/test.go:218 +0x38
main.catchRuntimeError({0x140003e8948?, 0x1e?}, {0x103744000?, 0x1400012c060?}, 0x10373f998?)
/Users/moul/go/src/github.com/gnolang/gno/gnovm/cmd/gno/tool_lint.go:298 +0x70
main.execTest(0x14000492fc0, {0x140004a6470?, 0x1e?, 0x1?}, {0x1037579f0, 0x14000465590})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/cmd/gno/test.go:217 +0x554
main.newTestCmd.func1({0x0?, 0x14000148040?}, {0x140004a6470?, 0x1400030ad80?, 0x0?})
/Users/moul/go/src/github.com/gnolang/gno/gnovm/cmd/gno/test.go:92 +0x3c
github.com/gnolang/gno/tm2/pkg/commands.(*Command).Run(0x0?, {0x1037492a0?, 0x103e3c3e0?})
/Users/moul/go/src/github.com/gnolang/gno/tm2/pkg/commands/command.go:255 +0x174
github.com/gnolang/gno/tm2/pkg/commands.(*Command).Run(0x140004393f0?, {0x1037492a0?, 0x103e3c3e0?})
/Users/moul/go/src/github.com/gnolang/gno/tm2/pkg/commands/command.go:259 +0x124
github.com/gnolang/gno/tm2/pkg/commands.(*Command).ParseAndRun(0x140004393f0, {0x1037492a0, 0x103e3c3e0}, {0x14000148010?, 0x14000439550?, 0x14000439600?})
/Users/moul/go/src/github.com/gnolang/gno/tm2/pkg/commands/command.go:140 +0x4c
github.com/gnolang/gno/tm2/pkg/commands.(*Command).Execute(0x1037579f0?, {0x1037492a0?, 0x103e3c3e0?}, {0x14000148010?, 0x103d96028?, 0x140000021c0?})
/Users/moul/go/src/github.com/gnolang/gno/tm2/pkg/commands/command.go:117 +0x28
main.main()
/Users/moul/go/src/github.com/gnolang/gno/gnovm/cmd/gno/main.go:13 +0x6c
gno machine: Machine:
PreprocessorMode: false
Op: []
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@moul The changes in this commit, based on the current master, work fine on my machine (it compiles and the tests pass): aeddi@66b166b
Maybe it's not what you want to do? But if so, I can open the PR.
Signed-off-by: moul <[email protected]>
Package
cow
provides a Copy-on-Write AVL tree implementation.I rebased my commits to make it easier to review the differences with the original
avl.Tree
. Here’s the commit with the changes: dd4e91c