You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Introduction of Debugger.pause() (see the pull request #153), revealed insufficient synchronization of code operating on roots map and bindings list. roots is a synchronized map, but there are several unsynchronized iterations over it's key set. This leads to ConcurrentModificationException.
Bindings can be added asynchronously at any time while a language is executed. This is the case for e.g. debugger breakpoints and debugger pause. That means that bindings list can be changed at any time. This makes the code in AbstractBindingsVisitor problematic, shouldVisit() might not use the same list of elements as visit(Node) and there is a risk of IndexOutOfBoundsException when e.g. breakpoint is removed - one binding is removed.
The similar lack of synchronization may apply to instrumenterMap map.
The text was updated successfully, but these errors were encountered:
Introduction of
Debugger.pause()
(see the pull request #153), revealed insufficient synchronization of code operating onroots
map andbindings
list.roots
is a synchronized map, but there are several unsynchronized iterations over it's key set. This leads toConcurrentModificationException
.Bindings can be added asynchronously at any time while a language is executed. This is the case for e.g. debugger breakpoints and debugger pause. That means that
bindings
list can be changed at any time. This makes the code inAbstractBindingsVisitor
problematic,shouldVisit()
might not use the same list of elements asvisit(Node)
and there is a risk ofIndexOutOfBoundsException
when e.g. breakpoint is removed - one binding is removed.The similar lack of synchronization may apply to
instrumenterMap
map.The text was updated successfully, but these errors were encountered: