vm: do not store items of scalar types in map

As they do not contain any other items,
they can be only accounted via total size.
This commit is contained in:
Evgenii Stratonikov 2019-12-17 11:00:40 +03:00
parent 735b937608
commit f957af35d4

View file

@ -214,8 +214,9 @@ func (s *Stack) insert(e, at *Element) *Element {
func (s *Stack) updateSizeAdd(item StackItem) { func (s *Stack) updateSizeAdd(item StackItem) {
*s.size++ *s.size++
s.itemCount[item]++ switch item.(type) {
if s.itemCount[item] > 1 { case *ArrayItem, *StructItem, *MapItem:
if s.itemCount[item]++; s.itemCount[item] > 1 {
return return
} }
@ -230,10 +231,13 @@ func (s *Stack) updateSizeAdd(item StackItem) {
} }
} }
} }
}
func (s *Stack) updateSizeRemove(item StackItem) { func (s *Stack) updateSizeRemove(item StackItem) {
*s.size-- *s.size--
switch item.(type) {
case *ArrayItem, *StructItem, *MapItem:
if s.itemCount[item] > 1 { if s.itemCount[item] > 1 {
s.itemCount[item]-- s.itemCount[item]--
return return
@ -252,6 +256,7 @@ func (s *Stack) updateSizeRemove(item StackItem) {
} }
} }
} }
}
// InsertAt inserts the given item (n) deep on the stack. // InsertAt inserts the given item (n) deep on the stack.
// Be very careful using it and _always_ check both e and n before invocation // Be very careful using it and _always_ check both e and n before invocation