7 func opInvert(vm *virtualMachine) error {
16 err = vm.applyCost(int64(len(top)))
20 // Could rewrite top in place but maybe it's a shared data
22 newTop := make([]byte, 0, len(top))
23 for _, b := range top {
24 newTop = append(newTop, ^b)
26 vm.dataStack[len(vm.dataStack)-1] = newTop
30 func opAnd(vm *virtualMachine) error {
31 err := vm.applyCost(1)
35 b, err := vm.pop(true)
39 a, err := vm.pop(true)
43 min, max := len(a), len(b)
47 err = vm.applyCost(int64(min))
51 res := make([]byte, 0, min)
52 for i := 0; i < min; i++ {
53 res = append(res, a[i]&b[i])
55 return vm.push(res, true)
58 func opOr(vm *virtualMachine) error {
59 return doOr(vm, false)
62 func opXor(vm *virtualMachine) error {
66 func doOr(vm *virtualMachine, xor bool) error {
67 err := vm.applyCost(1)
71 b, err := vm.pop(true)
75 a, err := vm.pop(true)
79 min, max := len(a), len(b)
83 err = vm.applyCost(int64(max))
87 res := make([]byte, 0, max)
88 for i := 0; i < max; i++ {
89 var aByte, bByte, resByte byte
101 resByte = aByte ^ bByte
103 resByte = aByte | bByte
106 res = append(res, resByte)
108 return vm.push(res, true)
111 func opEqual(vm *virtualMachine) error {
112 res, err := doEqual(vm)
116 return vm.pushBool(res, true)
119 func opEqualVerify(vm *virtualMachine) error {
120 res, err := doEqual(vm)
127 return ErrVerifyFailed
130 func doEqual(vm *virtualMachine) (bool, error) {
131 err := vm.applyCost(1)
135 b, err := vm.pop(true)
139 a, err := vm.pop(true)
143 min, max := len(a), len(b)
147 err = vm.applyCost(int64(min))
151 return bytes.Equal(a, b), nil