3 import "github.com/vapor/math/checked"
5 func opCat(vm *virtualMachine) error {
10 b, err := vm.pop(true)
14 a, err := vm.pop(true)
18 lens := int64(len(a) + len(b))
19 err = vm.applyCost(lens)
24 err = vm.push(append(a, b...), true)
31 func opSubstr(vm *virtualMachine) error {
32 err := vm.applyCost(4)
36 size, err := vm.popInt64(true)
43 err = vm.applyCost(size)
48 offset, err := vm.popInt64(true)
55 str, err := vm.pop(true)
59 end, ok := checked.AddInt64(offset, size)
60 if !ok || end > int64(len(str)) {
63 err = vm.push(str[offset:end], true)
70 func opLeft(vm *virtualMachine) error {
71 err := vm.applyCost(4)
75 size, err := vm.popInt64(true)
82 err = vm.applyCost(size)
87 str, err := vm.pop(true)
91 if size > int64(len(str)) {
94 err = vm.push(str[:size], true)
101 func opRight(vm *virtualMachine) error {
102 err := vm.applyCost(4)
106 size, err := vm.popInt64(true)
113 err = vm.applyCost(size)
118 str, err := vm.pop(true)
122 lstr := int64(len(str))
126 err = vm.push(str[lstr-size:], true)
133 func opSize(vm *virtualMachine) error {
134 err := vm.applyCost(1)
142 err = vm.pushInt64(int64(len(str)), true)
149 func opCatpushdata(vm *virtualMachine) error {
150 err := vm.applyCost(4)
154 b, err := vm.pop(true)
158 a, err := vm.pop(true)
163 lens := int64(len(a) + lb)
164 err = vm.applyCost(lens)
169 return vm.push(append(a, PushdataBytes(b)...), true)