Merge pull request #975 from nspcc-dev/clone-struct-in-setitem-2.x

vm: clone struct item on SETITEM, close #972
This commit is contained in:
Roman Khimov 2020-05-21 18:02:06 +03:00 committed by GitHub
commit fb9b2ae982
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1038,6 +1038,7 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro
validateMapKey(key)
obj := v.estack.Pop()
val := cloneIfStruct(item)
switch t := obj.value.(type) {
// Struct and Array items have their underlying value as []StackItem.
@ -1048,7 +1049,7 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro
panic("SETITEM: invalid index")
}
v.estack.updateSizeRemove(arr[index])
arr[index] = item
arr[index] = val
v.estack.updateSizeAdd(arr[index])
case *MapItem:
if i := t.Index(key.value); i >= 0 {
@ -1056,8 +1057,8 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro
} else if len(t.value) >= MaxArraySize {
panic("too big map")
}
t.Add(key.value, item)
v.estack.updateSizeAdd(item)
t.Add(key.value, val)
v.estack.updateSizeAdd(val)
default:
panic(fmt.Sprintf("SETITEM: invalid item type %s", t))