5 func opInvert(vm *virtualMachine) error {
14 err = vm.applyCost(int64(len(top)))
18 // Could rewrite top in place but maybe it's a shared data
20 newTop := make([]byte, 0, len(top))
21 for _, b := range top {
22 newTop = append(newTop, ^b)
24 vm.dataStack[len(vm.dataStack)-1] = newTop
28 func opAnd(vm *virtualMachine) error {
29 err := vm.applyCost(1)
33 b, err := vm.pop(true)
37 a, err := vm.pop(true)
41 min, max := len(a), len(b)
45 err = vm.applyCost(int64(min))
49 res := make([]byte, 0, min)
50 for i := 0; i < min; i++ {
51 res = append(res, a[i]&b[i])
53 return vm.push(res, true)
56 func opOr(vm *virtualMachine) error {
57 return doOr(vm, false)
60 func opXor(vm *virtualMachine) error {
64 func doOr(vm *virtualMachine, xor bool) error {
65 err := vm.applyCost(1)
69 b, err := vm.pop(true)
73 a, err := vm.pop(true)
77 min, max := len(a), len(b)
81 err = vm.applyCost(int64(max))
85 res := make([]byte, 0, max)
86 for i := 0; i < max; i++ {
87 var aByte, bByte, resByte byte
99 resByte = aByte ^ bByte
101 resByte = aByte | bByte
104 res = append(res, resByte)
106 return vm.push(res, true)
109 func opEqual(vm *virtualMachine) error {
110 res, err := doEqual(vm)
114 return vm.pushBool(res, true)
117 func opEqualVerify(vm *virtualMachine) error {
118 res, err := doEqual(vm)
125 return ErrVerifyFailed
128 func doEqual(vm *virtualMachine) (bool, error) {
129 err := vm.applyCost(1)
133 b, err := vm.pop(true)
137 a, err := vm.pop(true)
141 min, max := len(a), len(b)
145 err = vm.applyCost(int64(min))
149 return bytes.Equal(a, b), nil