New OPCODES
* EXT- CODECOPY, CODESIZE
This commit is contained in:
34
ethvm/vm.go
34
ethvm/vm.go
@@ -197,6 +197,10 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
||||
require(3)
|
||||
|
||||
newMemSize = stack.Peek().Uint64() + stack.data[stack.Len()-3].Uint64()
|
||||
case EXTCODECOPY:
|
||||
require(4)
|
||||
|
||||
newMemSize = stack.data[stack.Len()-1].Uint64() + stack.data[stack.Len()-4].Uint64()
|
||||
case CALL:
|
||||
require(7)
|
||||
gas.Set(GasCall)
|
||||
@@ -550,14 +554,32 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
||||
code := closure.Args[cOff : cOff+l]
|
||||
|
||||
mem.Set(mOff, l, code)
|
||||
case CODESIZE:
|
||||
l := big.NewInt(int64(len(closure.Code)))
|
||||
case CODESIZE, EXTCODESIZE:
|
||||
var code []byte
|
||||
if op == EXTCODECOPY {
|
||||
addr := stack.Pop().Bytes()
|
||||
|
||||
code = self.env.State().GetCode(addr)
|
||||
} else {
|
||||
code = closure.Code
|
||||
}
|
||||
|
||||
l := big.NewInt(int64(len(code)))
|
||||
stack.Push(l)
|
||||
|
||||
self.Printf(" => %d", l)
|
||||
case CODECOPY:
|
||||
case CODECOPY, EXTCODECOPY:
|
||||
var code []byte
|
||||
if op == EXTCODECOPY {
|
||||
addr := stack.Pop().Bytes()
|
||||
|
||||
code = self.env.State().GetCode(addr)
|
||||
} else {
|
||||
code = closure.Code
|
||||
}
|
||||
|
||||
var (
|
||||
size = int64(len(closure.Code))
|
||||
size = int64(len(code))
|
||||
mOff = stack.Pop().Int64()
|
||||
cOff = stack.Pop().Int64()
|
||||
l = stack.Pop().Int64()
|
||||
@@ -570,9 +592,9 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
|
||||
l = 0
|
||||
}
|
||||
|
||||
code := closure.Code[cOff : cOff+l]
|
||||
codeCopy := code[cOff : cOff+l]
|
||||
|
||||
mem.Set(mOff, l, code)
|
||||
mem.Set(mOff, l, codeCopy)
|
||||
case GASPRICE:
|
||||
stack.Push(closure.Price)
|
||||
|
||||
|
Reference in New Issue
Block a user