forked from cerc-io/plugeth
OpCode select plugin hook and injection
This commit is contained in:
parent
c0210061c8
commit
63f8d10434
@ -95,6 +95,9 @@ func NewEVMInterpreter(evm *EVM) *EVMInterpreter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
evm.Config.ExtraEips = extraEips
|
evm.Config.ExtraEips = extraEips
|
||||||
|
// begin PluGeth injection
|
||||||
|
table = pluginOpCodeSelect(table)
|
||||||
|
// end PluGeth injection
|
||||||
return &EVMInterpreter{evm: evm, table: table}
|
return &EVMInterpreter{evm: evm, table: table}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,39 @@
|
|||||||
package vm
|
package vm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/ethereum/go-ethereum/log"
|
||||||
|
"github.com/ethereum/go-ethereum/plugins"
|
||||||
|
)
|
||||||
|
|
||||||
func (st *Stack) Len() int {
|
func (st *Stack) Len() int {
|
||||||
return len(st.data)
|
return len(st.data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func PluginOpCodeSelect(pl *plugins.PluginLoader, jt *JumpTable) *JumpTable {
|
||||||
|
var opCodes []int
|
||||||
|
fnList := pl.Lookup("OpCodeSelect", func(item interface{}) bool {
|
||||||
|
_, ok := item.(func() []int)
|
||||||
|
return ok
|
||||||
|
})
|
||||||
|
for _, fni := range fnList {
|
||||||
|
if fn, ok := fni.(func() []int); ok {
|
||||||
|
opCodes = append(opCodes, fn()...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(opCodes) > 0 {
|
||||||
|
jt = copyJumpTable(jt)
|
||||||
|
}
|
||||||
|
for _, idx := range opCodes {
|
||||||
|
(*jt)[idx] = nil
|
||||||
|
}
|
||||||
|
return jt
|
||||||
|
}
|
||||||
|
|
||||||
|
func pluginOpCodeSelect(jt *JumpTable) *JumpTable {
|
||||||
|
if plugins.DefaultPluginLoader == nil {
|
||||||
|
log.Warn("Attempting PluginOpCodeSelect, but default PluginLoader has not been initialized")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return PluginOpCodeSelect(plugins.DefaultPluginLoader, jt)
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user