aboutsummaryrefslogtreecommitdiffstats
path: root/ethvm/vm.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-09-08 06:49:25 +0800
committerobscuren <geffobscura@gmail.com>2014-09-08 06:49:25 +0800
commita63b74e345e83d08b7a85b0602c5087ca4b06075 (patch)
tree631d88702a66a91cb80baec5660e9804e6d49353 /ethvm/vm.go
parent0b6b6b52fe1518efef4bcfe9e224cf9209dd8e56 (diff)
downloaddexon-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.go34
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)