From f3ed91a1f71590bc9297c8817a31ca5bf8712948 Mon Sep 17 00:00:00 2001 From: Roman Khimov Date: Tue, 26 Nov 2019 19:36:01 +0300 Subject: [PATCH] vm: properly convert arrays to stackItems They should be arrays of stackItems, not arrays of values. --- pkg/vm/output.go | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/pkg/vm/output.go b/pkg/vm/output.go index 14e83103b..d32965b8b 100644 --- a/pkg/vm/output.go +++ b/pkg/vm/output.go @@ -9,13 +9,34 @@ type stackItem struct { Type string `json:"type"` } +func appendToItems(items *[]stackItem, val StackItem, seen map[StackItem]bool) { + if arr, ok := val.Value().([]StackItem); ok { + if seen[val] { + return + } + seen[val] = true + intItems := make([]stackItem, 0, len(arr)) + for _, v := range arr { + appendToItems(&intItems, v, seen) + } + *items = append(*items, stackItem{ + Value: intItems, + Type: val.String(), + }) + + } else { + *items = append(*items, stackItem{ + Value: val, + Type: val.String(), + }) + } +} + func stackToArray(s *Stack) []stackItem { items := make([]stackItem, 0, s.Len()) + seen := make(map[StackItem]bool) s.Iter(func(e *Element) { - items = append(items, stackItem{ - Value: e.value, - Type: e.value.String(), - }) + appendToItems(&items, e.value, seen) }) return items }