vm: compare Array by reference in EQUAL

This commit is contained in:
Evgenii Stratonikov 2019-09-18 14:10:10 +03:00
parent 99f1d761ca
commit a88a8e13fc
2 changed files with 27 additions and 0 deletions

View file

@ -454,6 +454,12 @@ func (v *VM) execute(ctx *Context, op Instruction) {
if a == nil {
panic("no second-to-the-top element found")
}
if ta, ok := a.value.(*ArrayItem); ok {
if tb, ok := b.value.(*ArrayItem); ok {
v.estack.PushVal(ta == tb)
break
}
}
v.estack.PushVal(reflect.DeepEqual(a, b))
// Bit operations.

View file

@ -405,6 +405,27 @@ func TestEQUALGoodInteger(t *testing.T) {
assert.Equal(t, &BoolItem{true}, vm.estack.Pop().value)
}
func TestEQUALArrayTrue(t *testing.T) {
prog := makeProgram(DUP, EQUAL)
vm := load(prog)
vm.estack.PushVal([]StackItem{})
vm.Run()
assert.Equal(t, false, vm.state.HasFlag(faultState))
assert.Equal(t, 1, vm.estack.Len())
assert.Equal(t, &BoolItem{true}, vm.estack.Pop().value)
}
func TestEQUALArrayFalse(t *testing.T) {
prog := makeProgram(EQUAL)
vm := load(prog)
vm.estack.PushVal([]StackItem{})
vm.estack.PushVal([]StackItem{})
vm.Run()
assert.Equal(t, false, vm.state.HasFlag(faultState))
assert.Equal(t, 1, vm.estack.Len())
assert.Equal(t, &BoolItem{false}, vm.estack.Pop().value)
}
func TestNumEqual(t *testing.T) {
prog := makeProgram(NUMEQUAL)
vm := load(prog)