diff --git a/pkg/vm/opcode/isvalid_test.go b/pkg/vm/opcode/isvalid_test.go new file mode 100644 index 000000000..2361c4ee8 --- /dev/null +++ b/pkg/vm/opcode/isvalid_test.go @@ -0,0 +1,15 @@ +package opcode + +import ( + "testing" +) + +// IsValid() is called for every VM instruction. +func BenchmarkIsValid(t *testing.B) { + // Just so that we don't always test the same opcode. + script := []Opcode{NOP, ADD, SYSCALL, APPEND, 0xff, 0xf0} + l := len(script) + for n := 0; n < t.N; n++ { + _ = IsValid(script[n%l]) + } +} diff --git a/pkg/vm/opcode/opcode.go b/pkg/vm/opcode/opcode.go index 3d24b7ea7..93b62e5cd 100644 --- a/pkg/vm/opcode/opcode.go +++ b/pkg/vm/opcode/opcode.go @@ -222,8 +222,16 @@ const ( CONVERT Opcode = 0xDB ) +var validCodes [256]bool + +func init() { + // We rely on stringer here, it has a map anyway. + for op := range _Opcode_map { + validCodes[int(op)] = true + } +} + // IsValid returns true if the opcode passed is valid (defined in the VM). func IsValid(op Opcode) bool { - _, ok := _Opcode_map[op] // We rely on stringer here, it has a map anyway. - return ok + return validCodes[int(op)] }