aboutsummaryrefslogtreecommitdiffstats
path: root/vm/vm_debug.go
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-10-27 18:44:16 +0800
committerobscuren <geffobscura@gmail.com>2014-10-27 18:44:16 +0800
commit272d58662c885ab1cef8930e96fb832ae5377d96 (patch)
treee040eaec5c7e895dd6aaadedbbe30054aaa5e805 /vm/vm_debug.go
parent6623500c6b2e5fe9fa41a1ce75269955af6026e8 (diff)
downloadgo-tangerine-272d58662c885ab1cef8930e96fb832ae5377d96.tar.gz
go-tangerine-272d58662c885ab1cef8930e96fb832ae5377d96.tar.zst
go-tangerine-272d58662c885ab1cef8930e96fb832ae5377d96.zip
Implemented LOG. Closes #159
Diffstat (limited to 'vm/vm_debug.go')
-rw-r--r--vm/vm_debug.go33
1 files changed, 27 insertions, 6 deletions
diff --git a/vm/vm_debug.go b/vm/vm_debug.go
index a30339e2b..13446d6c0 100644
--- a/vm/vm_debug.go
+++ b/vm/vm_debug.go
@@ -141,7 +141,7 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
// Stack Check, memory resize & gas phase
switch op {
// Stack checks only
- case NOT, CALLDATALOAD, POP, JUMP, NEG: // 1
+ case NOT, CALLDATALOAD, POP, JUMP, BNOT: // 1
require(1)
case ADD, SUB, DIV, SDIV, MOD, SMOD, EXP, LT, GT, SLT, SGT, EQ, AND, OR, XOR, BYTE: // 2
require(2)
@@ -153,6 +153,14 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
case DUP1, DUP2, DUP3, DUP4, DUP5, DUP6, DUP7, DUP8, DUP9, DUP10, DUP11, DUP12, DUP13, DUP14, DUP15, DUP16:
n := int(op - DUP1 + 1)
require(n)
+ case LOG0, LOG1, LOG2, LOG3, LOG4:
+ n := int(op - LOG0)
+ require(n + 2)
+
+ mSize, mStart := stack.Peekn()
+ gas.Set(GasLog)
+ addStepGasUsage(new(big.Int).Mul(big.NewInt(int64(n)), GasLog))
+ addStepGasUsage(new(big.Int).Add(mSize, mStart))
// Gas only
case STOP:
gas.Set(ethutil.Big0)
@@ -168,13 +176,16 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
y, x := stack.Peekn()
val := closure.GetStorage(x)
if val.BigInt().Cmp(ethutil.Big0) == 0 && len(y.Bytes()) > 0 {
- mult = ethutil.Big2
+ // 0 => non 0
+ mult = ethutil.Big3
} else if val.BigInt().Cmp(ethutil.Big0) != 0 && len(y.Bytes()) == 0 {
+ //state.AddBalance(closure.caller.Address(), new(big.Int).Mul(big.NewInt(100), closure.Price))
mult = ethutil.Big0
} else {
+ // non 0 => non 0
mult = ethutil.Big1
}
- gas = new(big.Int).Mul(mult, GasSStore)
+ gas.Set(new(big.Int).Mul(mult, GasSStore))
case BALANCE:
require(1)
gas.Set(GasBalance)
@@ -375,10 +386,11 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
self.Printf(" = %v", base)
stack.Push(base)
- case NEG:
- base.Sub(Pow256, stack.Pop())
+ case BNOT:
+ base.Sub(Pow256, stack.Pop()).Sub(base, ethutil.Big1)
- base = U256(base)
+ // Not needed
+ //base = U256(base)
stack.Push(base)
case LT:
@@ -685,6 +697,15 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
x, y := stack.Swapn(n)
self.Printf(" => [%d] %x [0] %x", n, x.Bytes(), y.Bytes())
+ case LOG0, LOG1, LOG2, LOG3, LOG4:
+ n := int(op - LOG0)
+ topics := make([]*big.Int, n)
+ mSize, mStart := stack.Pop().Int64(), stack.Pop().Int64()
+ data := mem.Geti(mStart, mSize)
+ for i := 0; i < n; i++ {
+ topics[i] = stack.Pop()
+ }
+ self.env.AddLog(Log{closure.Address(), topics, data})
case MLOAD:
offset := stack.Pop()
val := ethutil.BigD(mem.Get(offset.Int64(), 32))