mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2024-11-26 19:42:23 +00:00
core: move enumerator/iterator interops to a separate packages
This commit is contained in:
parent
7ffc6c0936
commit
30cc2c5783
5 changed files with 77 additions and 61 deletions
27
pkg/core/interop/enumerator/interop.go
Normal file
27
pkg/core/interop/enumerator/interop.go
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
package enumerator
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/vm"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Concat concatenates 2 enumerators into a single one.
|
||||||
|
func Concat(_ *interop.Context, v *vm.VM) error {
|
||||||
|
return vm.EnumeratorConcat(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create creates an enumerator from an array-like stack item.
|
||||||
|
func Create(_ *interop.Context, v *vm.VM) error {
|
||||||
|
return vm.EnumeratorCreate(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next advances the enumerator, pushes true if is it was successful
|
||||||
|
// and false otherwise.
|
||||||
|
func Next(_ *interop.Context, v *vm.VM) error {
|
||||||
|
return vm.EnumeratorNext(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the current value of the enumerator.
|
||||||
|
func Value(_ *interop.Context, v *vm.VM) error {
|
||||||
|
return vm.EnumeratorValue(v)
|
||||||
|
}
|
31
pkg/core/interop/iterator/interop.go
Normal file
31
pkg/core/interop/iterator/interop.go
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
package iterator
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/vm"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Concat concatenates 2 iterators into a single one.
|
||||||
|
func Concat(_ *interop.Context, v *vm.VM) error {
|
||||||
|
return vm.IteratorConcat(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create creates an iterator from array-like or map stack item.
|
||||||
|
func Create(_ *interop.Context, v *vm.VM) error {
|
||||||
|
return vm.IteratorCreate(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Key returns current iterator key.
|
||||||
|
func Key(_ *interop.Context, v *vm.VM) error {
|
||||||
|
return vm.IteratorKey(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keys returns keys of the iterator.
|
||||||
|
func Keys(_ *interop.Context, v *vm.VM) error {
|
||||||
|
return vm.IteratorKeys(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Values returns values of the iterator.
|
||||||
|
func Values(_ *interop.Context, v *vm.VM) error {
|
||||||
|
return vm.IteratorValues(v)
|
||||||
|
}
|
|
@ -799,49 +799,3 @@ func runtimeSerialize(_ *interop.Context, v *vm.VM) error {
|
||||||
func runtimeDeserialize(_ *interop.Context, v *vm.VM) error {
|
func runtimeDeserialize(_ *interop.Context, v *vm.VM) error {
|
||||||
return vm.RuntimeDeserialize(v)
|
return vm.RuntimeDeserialize(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
// enumeratorConcat concatenates 2 enumerators into a single one.
|
|
||||||
func enumeratorConcat(_ *interop.Context, v *vm.VM) error {
|
|
||||||
return vm.EnumeratorConcat(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// enumeratorCreate creates an enumerator from an array-like stack item.
|
|
||||||
func enumeratorCreate(_ *interop.Context, v *vm.VM) error {
|
|
||||||
return vm.EnumeratorCreate(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// enumeratorNext advances the enumerator, pushes true if is it was successful
|
|
||||||
// and false otherwise.
|
|
||||||
func enumeratorNext(_ *interop.Context, v *vm.VM) error {
|
|
||||||
return vm.EnumeratorNext(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// enumeratorValue returns the current value of the enumerator.
|
|
||||||
func enumeratorValue(_ *interop.Context, v *vm.VM) error {
|
|
||||||
return vm.EnumeratorValue(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// iteratorConcat concatenates 2 iterators into a single one.
|
|
||||||
func iteratorConcat(_ *interop.Context, v *vm.VM) error {
|
|
||||||
return vm.IteratorConcat(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// iteratorCreate creates an iterator from array-like or map stack item.
|
|
||||||
func iteratorCreate(_ *interop.Context, v *vm.VM) error {
|
|
||||||
return vm.IteratorCreate(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// iteratorKey returns current iterator key.
|
|
||||||
func iteratorKey(_ *interop.Context, v *vm.VM) error {
|
|
||||||
return vm.IteratorKey(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// iteratorKeys returns keys of the iterator.
|
|
||||||
func iteratorKeys(_ *interop.Context, v *vm.VM) error {
|
|
||||||
return vm.IteratorKeys(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
// iteratorValues returns values of the iterator.
|
|
||||||
func iteratorValues(_ *interop.Context, v *vm.VM) error {
|
|
||||||
return vm.IteratorValues(v)
|
|
||||||
}
|
|
||||||
|
|
|
@ -7,6 +7,8 @@ import (
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
"github.com/nspcc-dev/neo-go/pkg/core/block"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/dao"
|
"github.com/nspcc-dev/neo-go/pkg/core/dao"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/interop/enumerator"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/interop/iterator"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
"github.com/nspcc-dev/neo-go/pkg/core/state"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/storage"
|
"github.com/nspcc-dev/neo-go/pkg/core/storage"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
"github.com/nspcc-dev/neo-go/pkg/core/transaction"
|
||||||
|
@ -76,19 +78,19 @@ func TestStorageFind(t *testing.T) {
|
||||||
var iter *vm.InteropItem
|
var iter *vm.InteropItem
|
||||||
require.NotPanics(t, func() { iter = v.Estack().Top().Interop() })
|
require.NotPanics(t, func() { iter = v.Estack().Top().Interop() })
|
||||||
|
|
||||||
require.NoError(t, enumeratorNext(context, v))
|
require.NoError(t, enumerator.Next(context, v))
|
||||||
require.True(t, v.Estack().Pop().Bool())
|
require.True(t, v.Estack().Pop().Bool())
|
||||||
|
|
||||||
v.Estack().PushVal(iter)
|
v.Estack().PushVal(iter)
|
||||||
require.NoError(t, iteratorKey(context, v))
|
require.NoError(t, iterator.Key(context, v))
|
||||||
require.Equal(t, []byte{0x01, 0x02}, v.Estack().Pop().Bytes())
|
require.Equal(t, []byte{0x01, 0x02}, v.Estack().Pop().Bytes())
|
||||||
|
|
||||||
v.Estack().PushVal(iter)
|
v.Estack().PushVal(iter)
|
||||||
require.NoError(t, enumeratorValue(context, v))
|
require.NoError(t, enumerator.Value(context, v))
|
||||||
require.Equal(t, []byte{0x01, 0x02, 0x03, 0x04}, v.Estack().Pop().Bytes())
|
require.Equal(t, []byte{0x01, 0x02, 0x03, 0x04}, v.Estack().Pop().Bytes())
|
||||||
|
|
||||||
v.Estack().PushVal(iter)
|
v.Estack().PushVal(iter)
|
||||||
require.NoError(t, enumeratorNext(context, v))
|
require.NoError(t, enumerator.Next(context, v))
|
||||||
require.False(t, v.Estack().Pop().Bool())
|
require.False(t, v.Estack().Pop().Bool())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,8 @@ import (
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
"github.com/nspcc-dev/neo-go/pkg/core/interop"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/interop/enumerator"
|
||||||
|
"github.com/nspcc-dev/neo-go/pkg/core/interop/iterator"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
"github.com/nspcc-dev/neo-go/pkg/smartcontract"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/util"
|
"github.com/nspcc-dev/neo-go/pkg/util"
|
||||||
"github.com/nspcc-dev/neo-go/pkg/vm"
|
"github.com/nspcc-dev/neo-go/pkg/vm"
|
||||||
|
@ -135,10 +137,10 @@ var neoInterops = []interop.Function{
|
||||||
{Name: "Neo.Contract.GetStorageContext", Func: contractGetStorageContext, Price: 1},
|
{Name: "Neo.Contract.GetStorageContext", Func: contractGetStorageContext, Price: 1},
|
||||||
{Name: "Neo.Contract.IsPayable", Func: contractIsPayable, Price: 1},
|
{Name: "Neo.Contract.IsPayable", Func: contractIsPayable, Price: 1},
|
||||||
{Name: "Neo.Contract.Migrate", Func: contractMigrate, Price: 0},
|
{Name: "Neo.Contract.Migrate", Func: contractMigrate, Price: 0},
|
||||||
{Name: "Neo.Enumerator.Concat", Func: enumeratorConcat, Price: 1},
|
{Name: "Neo.Enumerator.Concat", Func: enumerator.Concat, Price: 1},
|
||||||
{Name: "Neo.Enumerator.Create", Func: enumeratorCreate, Price: 1},
|
{Name: "Neo.Enumerator.Create", Func: enumerator.Create, Price: 1},
|
||||||
{Name: "Neo.Enumerator.Next", Func: enumeratorNext, Price: 1},
|
{Name: "Neo.Enumerator.Next", Func: enumerator.Next, Price: 1},
|
||||||
{Name: "Neo.Enumerator.Value", Func: enumeratorValue, Price: 1},
|
{Name: "Neo.Enumerator.Value", Func: enumerator.Value, Price: 1},
|
||||||
{Name: "Neo.Header.GetConsensusData", Func: headerGetConsensusData, Price: 1},
|
{Name: "Neo.Header.GetConsensusData", Func: headerGetConsensusData, Price: 1},
|
||||||
{Name: "Neo.Header.GetHash", Func: headerGetHash, Price: 1},
|
{Name: "Neo.Header.GetHash", Func: headerGetHash, Price: 1},
|
||||||
{Name: "Neo.Header.GetIndex", Func: headerGetIndex, Price: 1},
|
{Name: "Neo.Header.GetIndex", Func: headerGetIndex, Price: 1},
|
||||||
|
@ -150,11 +152,11 @@ var neoInterops = []interop.Function{
|
||||||
{Name: "Neo.Input.GetHash", Func: inputGetHash, Price: 1},
|
{Name: "Neo.Input.GetHash", Func: inputGetHash, Price: 1},
|
||||||
{Name: "Neo.Input.GetIndex", Func: inputGetIndex, Price: 1},
|
{Name: "Neo.Input.GetIndex", Func: inputGetIndex, Price: 1},
|
||||||
{Name: "Neo.InvocationTransaction.GetScript", Func: invocationTxGetScript, Price: 1},
|
{Name: "Neo.InvocationTransaction.GetScript", Func: invocationTxGetScript, Price: 1},
|
||||||
{Name: "Neo.Iterator.Concat", Func: iteratorConcat, Price: 1},
|
{Name: "Neo.Iterator.Concat", Func: iterator.Concat, Price: 1},
|
||||||
{Name: "Neo.Iterator.Create", Func: iteratorCreate, Price: 1},
|
{Name: "Neo.Iterator.Create", Func: iterator.Create, Price: 1},
|
||||||
{Name: "Neo.Iterator.Key", Func: iteratorKey, Price: 1},
|
{Name: "Neo.Iterator.Key", Func: iterator.Key, Price: 1},
|
||||||
{Name: "Neo.Iterator.Keys", Func: iteratorKeys, Price: 1},
|
{Name: "Neo.Iterator.Keys", Func: iterator.Keys, Price: 1},
|
||||||
{Name: "Neo.Iterator.Values", Func: iteratorValues, Price: 1},
|
{Name: "Neo.Iterator.Values", Func: iterator.Values, Price: 1},
|
||||||
{Name: "Neo.Output.GetAssetId", Func: outputGetAssetID, Price: 1},
|
{Name: "Neo.Output.GetAssetId", Func: outputGetAssetID, Price: 1},
|
||||||
{Name: "Neo.Output.GetScriptHash", Func: outputGetScriptHash, Price: 1},
|
{Name: "Neo.Output.GetScriptHash", Func: outputGetScriptHash, Price: 1},
|
||||||
{Name: "Neo.Output.GetValue", Func: outputGetValue, Price: 1},
|
{Name: "Neo.Output.GetValue", Func: outputGetValue, Price: 1},
|
||||||
|
@ -183,8 +185,8 @@ var neoInterops = []interop.Function{
|
||||||
{Name: "Neo.Witness.GetVerificationScript", Func: witnessGetVerificationScript, Price: 100},
|
{Name: "Neo.Witness.GetVerificationScript", Func: witnessGetVerificationScript, Price: 100},
|
||||||
|
|
||||||
// Aliases.
|
// Aliases.
|
||||||
{Name: "Neo.Iterator.Next", Func: enumeratorNext, Price: 1},
|
{Name: "Neo.Iterator.Next", Func: enumerator.Next, Price: 1},
|
||||||
{Name: "Neo.Iterator.Value", Func: enumeratorValue, Price: 1},
|
{Name: "Neo.Iterator.Value", Func: enumerator.Value, Price: 1},
|
||||||
|
|
||||||
// Old compatibility APIs.
|
// Old compatibility APIs.
|
||||||
{Name: "AntShares.Account.GetBalance", Func: accountGetBalance, Price: 1},
|
{Name: "AntShares.Account.GetBalance", Func: accountGetBalance, Price: 1},
|
||||||
|
|
Loading…
Reference in a new issue