vm: panic in cloneIfStruct

It's internal, so we can deduplicate code a bit.
This commit is contained in:
Roman Khimov 2021-07-12 11:51:49 +03:00
parent 4000dd692c
commit fe3c68b92d

View file

@ -1056,10 +1056,7 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro
itemElem := v.estack.Pop() itemElem := v.estack.Pop()
arrElem := v.estack.Pop() arrElem := v.estack.Pop()
val, err := cloneIfStruct(itemElem.value, MaxStackSize-v.refs.size) val := cloneIfStruct(itemElem.value, MaxStackSize-v.refs.size)
if err != nil {
panic(err)
}
switch t := arrElem.value.(type) { switch t := arrElem.value.(type) {
case *stackitem.Array: case *stackitem.Array:
@ -1373,19 +1370,12 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro
src := t.Value().([]stackitem.Item) src := t.Value().([]stackitem.Item)
arr = make([]stackitem.Item, len(src)) arr = make([]stackitem.Item, len(src))
for i := range src { for i := range src {
arr[i], err = cloneIfStruct(src[i], MaxStackSize-v.refs.size) arr[i] = cloneIfStruct(src[i], MaxStackSize-v.refs.size)
if err != nil {
panic(err)
}
} }
case *stackitem.Map: case *stackitem.Map:
arr = make([]stackitem.Item, 0, t.Len()) arr = make([]stackitem.Item, 0, t.Len())
for k := range t.Value().([]stackitem.MapElement) { for k := range t.Value().([]stackitem.MapElement) {
elem, err := cloneIfStruct(t.Value().([]stackitem.MapElement)[k].Value, MaxStackSize-v.refs.size) arr = append(arr, cloneIfStruct(t.Value().([]stackitem.MapElement)[k].Value, MaxStackSize-v.refs.size))
if err != nil {
panic(err)
}
arr = append(arr, elem)
} }
default: default:
panic("not a Map, Array or Struct") panic("not a Map, Array or Struct")
@ -1751,12 +1741,16 @@ func checkMultisig1(v *VM, curve elliptic.Curve, h []byte, pkeys [][]byte, sig [
return false return false
} }
func cloneIfStruct(item stackitem.Item, limit int) (stackitem.Item, error) { func cloneIfStruct(item stackitem.Item, limit int) stackitem.Item {
switch it := item.(type) { switch it := item.(type) {
case *stackitem.Struct: case *stackitem.Struct:
return it.Clone(limit) ret, err := it.Clone(limit)
if err != nil {
panic(err)
}
return ret
default: default:
return it, nil return it
} }
} }