neoneo-go/pkg/core/interop/callback/callback.go

38 lines
988 B
Go
Raw Normal View History

package callback
import (
"errors"
"github.com/nspcc-dev/neo-go/pkg/core/interop"
"github.com/nspcc-dev/neo-go/pkg/vm"
"github.com/nspcc-dev/neo-go/pkg/vm/emit"
"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
)
// Callback is an interface for arbitrary callbacks.
type Callback interface {
// ArgCount returns expected number of arguments.
ArgCount() int
// LoadContext loads context and arguments on stack.
LoadContext(*vm.VM, []stackitem.Item)
}
// Invoke invokes provided callback.
2020-08-07 11:37:49 +00:00
func Invoke(ic *interop.Context) error {
cb := ic.VM.Estack().Pop().Interop().Value().(Callback)
args := ic.VM.Estack().Pop().Array()
if cb.ArgCount() != len(args) {
return errors.New("invalid argument count")
}
2020-08-07 11:37:49 +00:00
cb.LoadContext(ic.VM, args)
switch t := cb.(type) {
case *MethodCallback:
id := emit.InteropNameToID([]byte("System.Contract.Call"))
2020-08-07 11:37:49 +00:00
return ic.SyscallHandler(ic.VM, id)
case *SyscallCallback:
2020-08-07 11:37:49 +00:00
return ic.SyscallHandler(ic.VM, t.desc.ID)
default:
return nil
}
}