From 781915f183c6e09474c6192d1aaba8e99c4990de Mon Sep 17 00:00:00 2001 From: Nick Johnson Date: Fri, 19 Aug 2016 15:19:51 +0100 Subject: core/vm: Refactor tracing to make Tracer the main interface This CL makes several refactors: - Define a Tracer interface, implementing the `CaptureState` method - Add the VM environment as the first argument of `Tracer.CaptureState` - Rename existing functionality `StructLogger` an make it an implementation of `Tracer` - Delete `StructLogCollector` and make `StructLogger` collect the logs directly - Change all callers to use the new `StructLogger` where necessary and extract logs from that. - Deletes the apparently obsolete and likely nonfunctional 'TraceCall' from the eth API. Callers that only wish accumulated logs can use the `StructLogger` implementation straightforwardly. Callers that wish to efficiently capture VM traces and operate on them without excessive copying can now implement the `Tracer` interface to receive VM state at each step and do with it as they wish. This CL also removes the accumulation of logs from the vm.Environment; this was necessary as part of the refactor, but also simplifies it by removing a responsibility that doesn't directly belong to the Environment. --- core/vm/stack.go | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) (limited to 'core/vm/stack.go') diff --git a/core/vm/stack.go b/core/vm/stack.go index 0046edec2..f6c1f76e4 100644 --- a/core/vm/stack.go +++ b/core/vm/stack.go @@ -24,58 +24,58 @@ import ( // stack is an object for basic stack operations. Items popped to the stack are // expected to be changed and modified. stack does not take care of adding newly // initialised objects. -type stack struct { +type Stack struct { data []*big.Int } -func newstack() *stack { - return &stack{} +func newstack() *Stack { + return &Stack{} } -func (st *stack) Data() []*big.Int { +func (st *Stack) Data() []*big.Int { return st.data } -func (st *stack) push(d *big.Int) { +func (st *Stack) push(d *big.Int) { // NOTE push limit (1024) is checked in baseCheck //stackItem := new(big.Int).Set(d) //st.data = append(st.data, stackItem) st.data = append(st.data, d) } -func (st *stack) pushN(ds ...*big.Int) { +func (st *Stack) pushN(ds ...*big.Int) { st.data = append(st.data, ds...) } -func (st *stack) pop() (ret *big.Int) { +func (st *Stack) pop() (ret *big.Int) { ret = st.data[len(st.data)-1] st.data = st.data[:len(st.data)-1] return } -func (st *stack) len() int { +func (st *Stack) len() int { return len(st.data) } -func (st *stack) swap(n int) { +func (st *Stack) swap(n int) { st.data[st.len()-n], st.data[st.len()-1] = st.data[st.len()-1], st.data[st.len()-n] } -func (st *stack) dup(n int) { +func (st *Stack) dup(n int) { st.push(new(big.Int).Set(st.data[st.len()-n])) } -func (st *stack) peek() *big.Int { +func (st *Stack) peek() *big.Int { return st.data[st.len()-1] } -func (st *stack) require(n int) error { +func (st *Stack) require(n int) error { if st.len() < n { return fmt.Errorf("stack underflow (%d <=> %d)", len(st.data), n) } return nil } -func (st *stack) Print() { +func (st *Stack) Print() { fmt.Println("### stack ###") if len(st.data) > 0 { for i, val := range st.data { -- cgit v1.2.3