Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 14 additions & 16 deletions eth/tracers/tracer.go
Original file line number Diff line number Diff line change
Expand Up @@ -363,10 +363,9 @@ func (r *frameResult) pushObject(vm *duktape.Context) {
vm.PutPropString(obj, "getError")
}

// JsTracer provides an implementation of JsTracer that evaluates a Javascript
// jsTracer provides an implementation of jsTracer that evaluates a Javascript
// function for each VM execution step.
// TODO gerui rename to private func
type JsTracer struct {
type jsTracer struct {
vm *duktape.Context // Javascript VM instance

tracerObject int // Stack index of the tracer JavaScript object
Expand Down Expand Up @@ -410,9 +409,8 @@ type Context struct {
// New instantiates a new tracer instance. code specifies a Javascript snippet,
// which must evaluate to an expression returning an object with 'step', 'fault'
// and 'result' functions.
// TODO gerui rename to private func
func NewJsTracer(code string, ctx *Context) (*JsTracer, error) {
tracer := &JsTracer{
func newJsTracer(code string, ctx *Context) (*jsTracer, error) {
tracer := &jsTracer{
vm: duktape.New(),
ctx: make(map[string]interface{}),
opWrapper: new(opWrapper),
Expand Down Expand Up @@ -619,14 +617,14 @@ func NewJsTracer(code string, ctx *Context) (*JsTracer, error) {
}

// Stop terminates execution of the tracer at the first opportune moment.
func (jst *JsTracer) Stop(err error) {
func (jst *jsTracer) Stop(err error) {
jst.reason = err
atomic.StoreUint32(&jst.interrupt, 1)
}

// call executes a method on a JS object, catching any errors, formatting and
// returning them as error objects.
func (jst *JsTracer) call(noret bool, method string, args ...string) (json.RawMessage, error) {
func (jst *jsTracer) call(noret bool, method string, args ...string) (json.RawMessage, error) {
// Execute the JavaScript call and return any error
jst.vm.PushString(method)
for _, arg := range args {
Expand Down Expand Up @@ -662,7 +660,7 @@ func wrapError(context string, err error) error {
}

// CaptureStart implements the Tracer interface to initialize the tracing operation.
func (jst *JsTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) {
func (jst *jsTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Address, create bool, input []byte, gas uint64, value *big.Int) {
jst.ctx["type"] = "CALL"
if create {
jst.ctx["type"] = "CREATE"
Expand Down Expand Up @@ -695,7 +693,7 @@ func (jst *JsTracer) CaptureStart(env *vm.EVM, from common.Address, to common.Ad
}

// CaptureState implements the Tracer interface to trace a single step of VM execution.
func (jst *JsTracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) {
func (jst *jsTracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, rData []byte, depth int, err error) {
if !jst.traceSteps {
return
}
Expand Down Expand Up @@ -731,7 +729,7 @@ func (jst *JsTracer) CaptureState(env *vm.EVM, pc uint64, op vm.OpCode, gas, cos
}

// CaptureFault implements the Tracer interface to trace an execution fault
func (jst *JsTracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) {
func (jst *jsTracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cost uint64, scope *vm.ScopeContext, depth int, err error) {
if jst.err != nil {
return
}
Expand All @@ -745,7 +743,7 @@ func (jst *JsTracer) CaptureFault(env *vm.EVM, pc uint64, op vm.OpCode, gas, cos
}

// CaptureEnd is called after the call finishes to finalize the tracing.
func (jst *JsTracer) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) {
func (jst *jsTracer) CaptureEnd(output []byte, gasUsed uint64, t time.Duration, err error) {
jst.ctx["output"] = output
jst.ctx["time"] = t.String()
jst.ctx["gasUsed"] = gasUsed
Expand All @@ -756,7 +754,7 @@ func (jst *JsTracer) CaptureEnd(output []byte, gasUsed uint64, t time.Duration,
}

// CaptureEnter is called when EVM enters a new scope (via call, create or selfdestruct).
func (jst *JsTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) {
func (jst *jsTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int) {
if !jst.traceCallFrames {
return
}
Expand Down Expand Up @@ -786,7 +784,7 @@ func (jst *JsTracer) CaptureEnter(typ vm.OpCode, from common.Address, to common.

// CaptureExit is called when EVM exits a scope, even if the scope didn't
// execute any code.
func (jst *JsTracer) CaptureExit(output []byte, gasUsed uint64, err error) {
func (jst *jsTracer) CaptureExit(output []byte, gasUsed uint64, err error) {
if !jst.traceCallFrames {
return
}
Expand All @@ -810,7 +808,7 @@ func (jst *JsTracer) CaptureExit(output []byte, gasUsed uint64, err error) {
}

// GetResult calls the Javascript 'result' function and returns its value, or any accumulated error
func (jst *JsTracer) GetResult() (json.RawMessage, error) {
func (jst *jsTracer) GetResult() (json.RawMessage, error) {
// Transform the context into a JavaScript object and inject into the state
obj := jst.vm.PushObject()

Expand All @@ -832,7 +830,7 @@ func (jst *JsTracer) GetResult() (json.RawMessage, error) {
}

// addToObj pushes a field to a JS object.
func (jst *JsTracer) addToObj(obj int, key string, val interface{}) {
func (jst *jsTracer) addToObj(obj int, key string, val interface{}) {
pushValue(jst.vm, val)
jst.vm.PutPropString(obj, key)
}
Expand Down
3 changes: 1 addition & 2 deletions eth/tracers/tracers.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ func New(code string, ctx *Context, cfg json.RawMessage) (Tracer, error) {
if tracer, ok := jsTracers[code]; ok {
code = tracer
}
return NewJsTracer(code, ctx)
return newJsTracer(code, ctx)
}

// camel converts a snake cased input string into a camel cased output.
Expand All @@ -83,6 +83,5 @@ func init() {
for _, file := range tracers.AssetNames() {
name := camel(strings.TrimSuffix(file, ".js"))
jsTracers[name] = string(tracers.MustAsset(file))

}
}