From aef01bf6637f782479b289dfa555e2e3ac1e845b Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Wed, 16 Nov 2022 00:40:12 +0300 Subject: [PATCH] vm: fix istack marshaling, fix #2799 --- pkg/vm/context.go | 18 ++++++++++++++++++ pkg/vm/vm.go | 3 ++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/pkg/vm/context.go b/pkg/vm/context.go index 6c086249f..cc16ac867 100644 --- a/pkg/vm/context.go +++ b/pkg/vm/context.go @@ -72,6 +72,13 @@ type Context struct { retCount int } +type contextAux struct { + Script string + IP int + NextIP int + Caller string +} + // ContextUnloadCallback is a callback method used on context unloading from istack. type ContextUnloadCallback func(ctx *Context, commit bool) error @@ -357,3 +364,14 @@ func (c *Context) HasTryBlock() bool { } return false } + +// MarshalJSON implements the JSON marshalling interface. +func (c *Context) MarshalJSON() ([]byte, error) { + var aux = contextAux{ + Script: c.ScriptHash().StringLE(), + IP: c.ip, + NextIP: c.nextip, + Caller: c.sc.callingScriptHash.StringLE(), + } + return json.Marshal(aux) +} diff --git a/pkg/vm/vm.go b/pkg/vm/vm.go index 5e672ccd5..7cc768d0f 100644 --- a/pkg/vm/vm.go +++ b/pkg/vm/vm.go @@ -382,7 +382,8 @@ func (v *VM) PopResult() interface{} { // DumpIStack returns json formatted representation of the invocation stack. func (v *VM) DumpIStack() string { - return dumpStack(&v.istack) + b, _ := json.MarshalIndent(v.istack.ToArray(), "", " ") + return string(b) } // DumpEStack returns json formatted representation of the execution stack.