-
Notifications
You must be signed in to change notification settings - Fork 381
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
fix: properly mark array elements when an realm slice is updated #1305
Merged
Merged
Changes from all commits
Commits
Show all changes
16 commits
Select commit
Hold shift + click to select a range
ef7601c
recurse on DidUpdate for all ArrayValue elements
deelawn 18f224e
undid incorrect simplification
deelawn 54a10f3
reworked solution
deelawn 833d627
Added txtar test
deelawn 36e4d65
alternate approach to saving nested reference values
deelawn b86e241
scoped back which types of values can be saved dynamically
deelawn 5903141
Revert "alternate approach to saving nested reference values"
deelawn bcddc78
handle nested slices when appending to slices under capacity
deelawn 20bc9e5
wrap new sanity check in debug
deelawn 06c731e
fixed up txtar test
deelawn 2124d5e
added XX annotation
deelawn ebd1005
reworked solution to avoid looping in DidUpdate
deelawn ba6e747
txtar test for 1167 test case
deelawn fcd8249
improved append test and added more append deep copies
deelawn f79703f
handle additional append cases
deelawn 5425504
DeepCopy -> unrefCopy
jaekwon File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,129 @@ | ||
# start a new node | ||
gnoland start | ||
|
||
gnokey maketx addpkg -pkgdir $WORK -pkgpath gno.land/r/append -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
|
||
# Call Append 1 | ||
gnokey maketx call -pkgpath gno.land/r/append -func Append -gas-fee 1000000ugnot -gas-wanted 2000000 -args '1' -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
|
||
gnokey maketx call -pkgpath gno.land/r/append -func AppendNil -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
|
||
# Call Append 2 | ||
gnokey maketx call -pkgpath gno.land/r/append -func Append -gas-fee 1000000ugnot -gas-wanted 2000000 -args '2' -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
|
||
# Call Append 3 | ||
gnokey maketx call -pkgpath gno.land/r/append -func Append -gas-fee 1000000ugnot -gas-wanted 2000000 -args '3' -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
|
||
# Call render | ||
gnokey maketx call -pkgpath gno.land/r/append -func Render -gas-fee 1000000ugnot -gas-wanted 2000000 -args '' -broadcast -chainid=tendermint_test test1 | ||
stdout '("1-2-3-" string)' | ||
stdout OK! | ||
|
||
# Call Pop | ||
gnokey maketx call -pkgpath gno.land/r/append -func Pop -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
|
||
# Call render | ||
gnokey maketx call -pkgpath gno.land/r/append -func Render -gas-fee 1000000ugnot -gas-wanted 2000000 -args '' -broadcast -chainid=tendermint_test test1 | ||
stdout '("2-3-" string)' | ||
stdout OK! | ||
|
||
# Call Append 42 | ||
gnokey maketx call -pkgpath gno.land/r/append -func Append -gas-fee 1000000ugnot -gas-wanted 2000000 -args '42' -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
|
||
# Call render | ||
gnokey maketx call -pkgpath gno.land/r/append -func Render -gas-fee 1000000ugnot -gas-wanted 2000000 -args '' -broadcast -chainid=tendermint_test test1 | ||
stdout '("2-3-42-" string)' | ||
stdout OK! | ||
|
||
gnokey maketx call -pkgpath gno.land/r/append -func CopyAppend -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
|
||
gnokey maketx call -pkgpath gno.land/r/append -func PopB -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
|
||
# Call render | ||
gnokey maketx call -pkgpath gno.land/r/append -func Render -gas-fee 1000000ugnot -gas-wanted 2000000 -args '' -broadcast -chainid=tendermint_test test1 | ||
stdout '("2-3-42-" string)' | ||
stdout OK! | ||
|
||
gnokey maketx call -pkgpath gno.land/r/append -func AppendMoreAndC -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
|
||
gnokey maketx call -pkgpath gno.land/r/append -func ReassignC -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
|
||
gnokey maketx call -pkgpath gno.land/r/append -func Render -gas-fee 1000000ugnot -gas-wanted 2000000 -args '' -broadcast -chainid=tendermint_test test1 | ||
stdout '("2-3-42-70-100-" string)' | ||
stdout OK! | ||
|
||
gnokey maketx call -pkgpath gno.land/r/append -func Render -gas-fee 1000000ugnot -gas-wanted 2000000 -args 'd' -broadcast -chainid=tendermint_test test1 | ||
stdout '("1-" string)' | ||
stdout OK! | ||
|
||
-- append.gno -- | ||
package append | ||
|
||
import ( | ||
"gno.land/p/demo/ufmt" | ||
) | ||
|
||
type T struct{ i int } | ||
|
||
var a, b, d []T | ||
var c = []T{{i: 100}} | ||
|
||
|
||
func init() { | ||
a = make([]T, 0, 1) | ||
} | ||
|
||
func Pop() { | ||
a = append(a[:0], a[1:]...) | ||
} | ||
|
||
func Append(i int) { | ||
a = append(a, T{i: i}) | ||
} | ||
|
||
func CopyAppend() { | ||
b = append(a, T{i: 50}, T{i: 60}) | ||
} | ||
|
||
func PopB() { | ||
b = append(b[:0], b[1:]...) | ||
} | ||
|
||
func AppendMoreAndC() { | ||
// Fill to capacity | ||
a = append(a, T{i: 70}) | ||
// Above capacity; make new array | ||
a = append(a, c...) | ||
} | ||
|
||
func ReassignC() { | ||
c[0] = T{i: 200} | ||
} | ||
|
||
func AppendNil() { | ||
d = append(d, a...) | ||
} | ||
|
||
func Render(path string) string { | ||
source := a | ||
if path == "d" { | ||
source = d | ||
} | ||
|
||
var s string | ||
for i:=0;i<len(source);i++{ | ||
s+=ufmt.Sprintf("%d-", source[i].i) | ||
} | ||
return s | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
# Reproducible Test for https://github.com/gnolang/gno/issues/1167 | ||
|
||
gnoland start | ||
|
||
# add contract | ||
gnokey maketx addpkg -pkgdir $WORK -pkgpath gno.land/r/demo/xx -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
|
||
# execute New | ||
gnokey maketx call -pkgpath gno.land/r/demo/xx -func New -args X -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
|
||
# execute Delta for the first time | ||
gnokey maketx call -pkgpath gno.land/r/demo/xx -func Delta -args X -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
stdout '"1,1,1;" string' | ||
|
||
# execute Delta for the second time | ||
gnokey maketx call -pkgpath gno.land/r/demo/xx -func Delta -args X -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
stdout '1,1,1;2,2,2;" string' | ||
|
||
# execute Delta for the third time | ||
gnokey maketx call -pkgpath gno.land/r/demo/xx -func Delta -args X -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
stdout '1,1,1;2,2,2;3,3,3;" string' | ||
|
||
# execute Render | ||
gnokey maketx call -pkgpath gno.land/r/demo/xx -func Render -args X -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid=tendermint_test test1 | ||
stdout OK! | ||
stdout '1,1,1;2,2,2;3,3,3;" string' | ||
|
||
-- gno.mod -- | ||
module gno.land/r/demo/xx | ||
|
||
require ( | ||
gno.land/p/demo/avl v0.0.0-latest | ||
) | ||
|
||
-- realm.gno -- | ||
package xx | ||
|
||
import ( | ||
"strconv" | ||
|
||
"gno.land/p/demo/avl" | ||
) | ||
|
||
type Move struct { | ||
N1, N2, N3 byte | ||
} | ||
|
||
type Position struct { | ||
Moves []Move | ||
} | ||
|
||
func (p Position) clone() Position { | ||
mv := p.Moves | ||
return Position{Moves: mv} | ||
} | ||
|
||
func (oldp Position) update() Position { | ||
p := oldp.clone() | ||
|
||
counter++ | ||
// This is a workaround for the wrong behaviour (ie. uncomment this line): | ||
// p.Moves = append([]Move{}, p.Moves...) | ||
p.Moves = append(p.Moves, Move{counter, counter, counter}) | ||
return p | ||
} | ||
|
||
type Game struct { | ||
Position Position | ||
} | ||
|
||
var games avl.Tree // id -> *Game | ||
|
||
var counter byte | ||
|
||
func New(s string) string { | ||
// Bug shows if Moves has a cap > 0 when initialised. | ||
el := &Game{Position: Position{Moves: make([]Move, 0, 2)}} | ||
games.Set(s, el) | ||
return values(el.Position) | ||
} | ||
|
||
func Delta(s string) string { | ||
v, _ := games.Get(s) | ||
g, ok := v.(*Game) | ||
if !ok { | ||
panic("invalid game") | ||
} | ||
n := g.Position.update() | ||
g.Position = n | ||
ret := values(n) | ||
return ret | ||
} | ||
|
||
func Render(s string) string { | ||
v, _ := games.Get(s) | ||
g, ok := v.(*Game) | ||
if !ok { | ||
panic("invalid game") | ||
} | ||
return values(g.Position) | ||
} | ||
|
||
func values(x Position) string { | ||
s := "" | ||
for _, val := range x.Moves { | ||
s += strconv.Itoa(int(val.N1)) + "," + strconv.Itoa(int(val.N2)) + "," + strconv.Itoa(int(val.N3)) + ";" | ||
} | ||
return s | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
can't we do store.GetObject(cv.ObjectID) directly here?
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.
to me it seems a little strange to uise GetFirstObject outside of a realm-persistence context.
Maybe s/GetFirstObject/getFirstObject/g.