diff options
author | obscuren <geffobscura@gmail.com> | 2014-09-08 06:49:25 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2014-09-08 06:49:25 +0800 |
commit | a63b74e345e83d08b7a85b0602c5087ca4b06075 (patch) | |
tree | 631d88702a66a91cb80baec5660e9804e6d49353 /ethvm/vm.go | |
parent | 0b6b6b52fe1518efef4bcfe9e224cf9209dd8e56 (diff) | |
download | dexon-a63b74e345e83d08b7a85b0602c5087ca4b06075.tar.gz dexon-a63b74e345e83d08b7a85b0602c5087ca4b06075.tar.zst dexon-a63b74e345e83d08b7a85b0602c5087ca4b06075.zip |
New OPCODES
* EXT- CODECOPY, CODESIZE
Diffstat (limited to 'ethvm/vm.go')
-rw-r--r-- | ethvm/vm.go | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/ethvm/vm.go b/ethvm/vm.go index 924a861ca..2acf52f92 100644 --- a/ethvm/vm.go +++ b/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) |