compiler: do not log panic message

In NEO3 THROW accepts an argument and exceptions can be handled, so
there is no need to log it.
This commit is contained in:
Evgenii Stratonikov 2020-08-22 12:24:49 +03:00
parent 04f5fdefa0
commit 14ea3c2228
2 changed files with 1 additions and 37 deletions

View file

@ -12,7 +12,6 @@ import (
"sort" "sort"
"strings" "strings"
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
"github.com/nspcc-dev/neo-go/pkg/encoding/address" "github.com/nspcc-dev/neo-go/pkg/encoding/address"
"github.com/nspcc-dev/neo-go/pkg/io" "github.com/nspcc-dev/neo-go/pkg/io"
"github.com/nspcc-dev/neo-go/pkg/vm" "github.com/nspcc-dev/neo-go/pkg/vm"
@ -1464,17 +1463,7 @@ func (c *codegen) convertBuiltin(expr *ast.CallExpr) {
} }
} }
case "panic": case "panic":
arg := expr.Args[0] emit.Opcode(c.prog.BinWriter, opcode.THROW)
if isExprNil(arg) {
emit.Opcode(c.prog.BinWriter, opcode.DROP)
emit.Opcode(c.prog.BinWriter, opcode.THROW)
} else if isString(c.typeInfo.Types[arg].Type) {
ast.Walk(c, arg)
emit.Syscall(c.prog.BinWriter, interopnames.SystemRuntimeLog)
emit.Opcode(c.prog.BinWriter, opcode.THROW)
} else {
c.prog.Err = errors.New("panic should have string or nil argument")
}
case "ToInteger", "ToByteArray", "ToBool": case "ToInteger", "ToByteArray", "ToBool":
typ := stackitem.IntegerT typ := stackitem.IntegerT
switch name { switch name {
@ -1518,8 +1507,6 @@ func transformArgs(fun ast.Expr, args []ast.Expr) []ast.Expr {
} }
case *ast.Ident: case *ast.Ident:
switch f.Name { switch f.Name {
case "panic":
return args[1:]
case "make", "copy": case "make", "copy":
return nil return nil
} }

View file

@ -1,13 +1,10 @@
package compiler_test package compiler_test
import ( import (
"errors"
"fmt" "fmt"
"math/big" "math/big"
"testing" "testing"
"github.com/nspcc-dev/neo-go/pkg/core/interop/interopnames"
"github.com/nspcc-dev/neo-go/pkg/vm"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
@ -18,26 +15,19 @@ func TestPanic(t *testing.T) {
}) })
t.Run("panic with message", func(t *testing.T) { t.Run("panic with message", func(t *testing.T) {
var logs []string
src := getPanicSource(true, `"execution fault"`) src := getPanicSource(true, `"execution fault"`)
v := vmAndCompile(t, src) v := vmAndCompile(t, src)
v.SyscallHandler = getLogHandler(&logs)
require.Error(t, v.Run()) require.Error(t, v.Run())
require.True(t, v.HasFailed()) require.True(t, v.HasFailed())
require.Equal(t, 1, len(logs))
require.Equal(t, "execution fault", logs[0])
}) })
t.Run("panic with nil", func(t *testing.T) { t.Run("panic with nil", func(t *testing.T) {
var logs []string
src := getPanicSource(true, `nil`) src := getPanicSource(true, `nil`)
v := vmAndCompile(t, src) v := vmAndCompile(t, src)
v.SyscallHandler = getLogHandler(&logs)
require.Error(t, v.Run()) require.Error(t, v.Run())
require.True(t, v.HasFailed()) require.True(t, v.HasFailed())
require.Equal(t, 0, len(logs))
}) })
} }
@ -54,16 +44,3 @@ func getPanicSource(need bool, message string) string {
} }
`, need, message) `, need, message)
} }
func getLogHandler(logs *[]string) vm.SyscallHandler {
logID := interopnames.ToID([]byte(interopnames.SystemRuntimeLog))
return func(v *vm.VM, id uint32) error {
if id != logID {
return errors.New("syscall not found")
}
msg := v.Estack().Pop().String()
*logs = append(*logs, msg)
return nil
}
}