From 80261c803a82e51413608a3dc5273c982844d135 Mon Sep 17 00:00:00 2001
From: obscuren <geffobscura@gmail.com>
Date: Fri, 19 Sep 2014 13:19:19 +0200
Subject: [PATCH] Fixed deref ptr

---
 ethchain/block_chain.go |  8 ++++++--
 ethutil/rlp.go          |  4 ++++
 ethvm/vm.go             | 17 ++++++++++++++++-
 3 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/ethchain/block_chain.go b/ethchain/block_chain.go
index 1e29f1188..7c9b60fc5 100644
--- a/ethchain/block_chain.go
+++ b/ethchain/block_chain.go
@@ -164,6 +164,7 @@ func (bc *BlockChain) setLastBlock() {
 		bc.Add(bc.genesisBlock)
 		fk := append([]byte("bloom"), bc.genesisBlock.Hash()...)
 		bc.Ethereum.Db().Put(fk, make([]byte, 255))
+		bc.CurrentBlock = bc.genesisBlock
 	}
 
 	// Set the last know difficulty (might be 0x0 as initial value, Genesis)
@@ -201,10 +202,13 @@ func (bc *BlockChain) GetBlock(hash []byte) *Block {
 
 func (self *BlockChain) GetBlockByNumber(num uint64) *Block {
 	block := self.CurrentBlock
-	for ; block.Number.Uint64() != num; block = self.GetBlock(block.PrevHash) {
+	for ; block != nil; block = self.GetBlock(block.PrevHash) {
+		if block.Number.Uint64() == num {
+			break
+		}
 	}
 
-	if block.Number.Uint64() == 0 && num != 0 {
+	if block != nil && block.Number.Uint64() == 0 && num != 0 {
 		return nil
 	}
 
diff --git a/ethutil/rlp.go b/ethutil/rlp.go
index febfb78e1..55406133b 100644
--- a/ethutil/rlp.go
+++ b/ethutil/rlp.go
@@ -15,6 +15,10 @@ type RlpEncodeDecode interface {
 	RlpValue() []interface{}
 }
 
+func Rlp(encoder RlpEncode) []byte {
+	return encoder.RlpEncode()
+}
+
 type RlpEncoder struct {
 	rlpData []byte
 }
diff --git a/ethvm/vm.go b/ethvm/vm.go
index f1c23b370..7aff320f9 100644
--- a/ethvm/vm.go
+++ b/ethvm/vm.go
@@ -670,9 +670,13 @@ func (self *Vm) RunClosure(closure *Closure) (ret []byte, err error) {
 			stack.Pop()
 		case DUP1, DUP2, DUP3, DUP4, DUP5, DUP6, DUP7, DUP8, DUP9, DUP10, DUP11, DUP12, DUP13, DUP14, DUP15, DUP16:
 			n := int(op - DUP1 + 1)
-			stack.Dupn(n)
+			v := stack.Dupn(n)
 
 			self.Printf(" => [%d] 0x%x", n, stack.Peek().Bytes())
+
+			if OpCode(closure.Get(new(big.Int).Add(pc, ethutil.Big1)).Uint()) == POP && OpCode(closure.Get(new(big.Int).Add(pc, big.NewInt(2))).Uint()) == POP {
+				fmt.Println(toValue(v))
+			}
 		case SWAP1, SWAP2, SWAP3, SWAP4, SWAP5, SWAP6, SWAP7, SWAP8, SWAP9, SWAP10, SWAP11, SWAP12, SWAP13, SWAP14, SWAP15, SWAP16:
 			n := int(op - SWAP1 + 2)
 			x, y := stack.Swapn(n)
@@ -1004,3 +1008,14 @@ func (self *Message) Exec(codeAddr []byte, caller ClosureRef) (ret []byte, err e
 
 	return
 }
+
+// Mainly used for print variables and passing to Print*
+func toValue(val *big.Int) interface{} {
+	// Let's assume a string on right padded zero's
+	b := val.Bytes()
+	if b[0] != 0 && b[len(b)-1] == 0x0 && b[len(b)-2] == 0x0 {
+		return string(b)
+	}
+
+	return val
+}
-- 
GitLab