import "bytes"
func opInvert(vm *virtualMachine) error {
- err := vm.applyCost(1)
- if err != nil {
+ if err := vm.applyCost(1); err != nil {
return err
}
+
top, err := vm.top()
if err != nil {
return err
}
- err = vm.applyCost(int64(len(top)))
- if err != nil {
+
+ if err = vm.applyCost(int64(len(top))); err != nil {
return err
}
// Could rewrite top in place but maybe it's a shared data
}
func opAnd(vm *virtualMachine) error {
- err := vm.applyCost(1)
- if err != nil {
+ if err := vm.applyCost(1); err != nil {
return err
}
+
b, err := vm.pop(true)
if err != nil {
return err
}
+
a, err := vm.pop(true)
if err != nil {
return err
}
+
min, max := len(a), len(b)
if min > max {
min, max = max, min
}
- err = vm.applyCost(int64(min))
- if err != nil {
+
+ if err = vm.applyCost(int64(min)); err != nil {
return err
}
+
res := make([]byte, 0, min)
for i := 0; i < min; i++ {
res = append(res, a[i]&b[i])
}
func doOr(vm *virtualMachine, xor bool) error {
- err := vm.applyCost(1)
- if err != nil {
+ if err := vm.applyCost(1); err != nil {
return err
}
+
b, err := vm.pop(true)
if err != nil {
return err
}
+
a, err := vm.pop(true)
if err != nil {
return err
}
+
min, max := len(a), len(b)
if min > max {
min, max = max, min
}
- err = vm.applyCost(int64(max))
- if err != nil {
+
+ if err = vm.applyCost(int64(max)); err != nil {
return err
}
+
res := make([]byte, 0, max)
for i := 0; i < max; i++ {
var aByte, bByte, resByte byte
if err != nil {
return err
}
+
return vm.pushBool(res, true)
}
if err != nil {
return err
}
+
if res {
return nil
}
}
func doEqual(vm *virtualMachine) (bool, error) {
- err := vm.applyCost(1)
- if err != nil {
+ if err := vm.applyCost(1); err != nil {
return false, err
}
+
b, err := vm.pop(true)
if err != nil {
return false, err
}
+
a, err := vm.pop(true)
if err != nil {
return false, err
}
+
min, max := len(a), len(b)
if min > max {
min, max = max, min
}
- err = vm.applyCost(int64(min))
- if err != nil {
+
+ if err = vm.applyCost(int64(min)); err != nil {
return false, err
}
return bytes.Equal(a, b), nil