aboutsummaryrefslogtreecommitdiffstats
path: root/ethchain
diff options
context:
space:
mode:
Diffstat (limited to 'ethchain')
-rw-r--r--ethchain/vm.go23
1 files changed, 21 insertions, 2 deletions
diff --git a/ethchain/vm.go b/ethchain/vm.go
index fc3c37dc1..b9e8353fb 100644
--- a/ethchain/vm.go
+++ b/ethchain/vm.go
@@ -433,9 +433,28 @@ func (vm *Vm) RunClosure(closure *Closure, hook DebugHook) (ret []byte, err erro
vm.Printf(" => %d", l)
case CALLDATACOPY:
- panic("not implemented")
+ var (
+ size = int64(len(closure.Args))
+ mOff = stack.Pop().Int64()
+ cOff = stack.Pop().Int64()
+ l = stack.Pop().Int64()
+ )
+
+ if cOff > size {
+ cOff = 0
+ l = 0
+ } else if cOff+l > size {
+ l = 0
+ }
+
+ code := closure.Args[cOff : cOff+l]
+
+ mem.Set(mOff, l, code)
case CODESIZE:
- stack.Push(big.NewInt(int64(len(closure.Script))))
+ l := big.NewInt(int64(len(closure.Script)))
+ stack.Push(l)
+
+ vm.Printf(" => %d", l)
case CODECOPY:
var (
size = int64(len(closure.Script))