stackitem: limit EQUAL for deeply nested structs
See neo-project/neo-vm#428.
This commit is contained in:
parent
f89f0300f6
commit
ee4a647934
3 changed files with 73 additions and 5 deletions
|
@ -172,6 +172,11 @@ var equalsTestCases = map[string][]struct {
|
|||
item2: NewStruct([]Item{NewBigInteger(big.NewInt(1))}),
|
||||
result: true,
|
||||
},
|
||||
{
|
||||
item1: NewStruct([]Item{NewBigInteger(big.NewInt(1)), NewStruct([]Item{})}),
|
||||
item2: NewStruct([]Item{NewBigInteger(big.NewInt(1)), NewStruct([]Item{})}),
|
||||
result: true,
|
||||
},
|
||||
},
|
||||
"bigint": {
|
||||
{
|
||||
|
@ -381,6 +386,41 @@ func TestEquals(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestEqualsDeepStructure(t *testing.T) {
|
||||
const perStruct = 4
|
||||
var items = []Item{}
|
||||
var num int
|
||||
for i := 0; i < perStruct; i++ {
|
||||
items = append(items, Make(0))
|
||||
num++
|
||||
}
|
||||
var layerUp = func(sa *Struct, num int) (*Struct, int) {
|
||||
items := []Item{}
|
||||
for i := 0; i < perStruct; i++ {
|
||||
clon, err := sa.Clone(100500)
|
||||
require.NoError(t, err)
|
||||
items = append(items, clon)
|
||||
}
|
||||
num *= perStruct
|
||||
num++
|
||||
return NewStruct(items), num
|
||||
}
|
||||
var sa = NewStruct(items)
|
||||
for i := 0; i < 4; i++ {
|
||||
sa, num = layerUp(sa, num)
|
||||
}
|
||||
require.Less(t, num, MaxComparableNumOfItems)
|
||||
sb, err := sa.Clone(num)
|
||||
require.NoError(t, err)
|
||||
require.True(t, sa.Equals(sb))
|
||||
sa, num = layerUp(sa, num)
|
||||
|
||||
require.Less(t, MaxComparableNumOfItems, num)
|
||||
sb, err = sa.Clone(num)
|
||||
require.NoError(t, err)
|
||||
require.Panics(t, func() { sa.Equals(sb) })
|
||||
}
|
||||
|
||||
var marshalJSONTestCases = []struct {
|
||||
input Item
|
||||
result []byte
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue