Skip to content

I20190515-1800

@trancexpress trancexpress tagged this 15 May 16:07
The bug was observed under the following conditions:

1. Debug a snippet with a map variable on Java 9 or above JRE.
2. Enable "Show Logical Structure" in the variables view.
3. Expand a local variable or a parameter of type java.util.Map or
inheriting, either in the debug hover in the Java source editor or in
the Variables view.
4. Observe an error text instead of content.

The error is caused by JDT debug attempting to compile a snippet as
follows:

package java.util;
abstract class Map___ implements java.util.Map {
void ___run() throws Throwable {
return entrySet().toArray();
}
}

This snippet is constructed in order to validate whether the expression
"return entrySet().toArray();" compiles in the context of the current
breakpoint.

On Java 9 and above, this snippet is not legal. java.util is already
contained in the JRE libraries; its not possible to define a package
like this and compile it without extra compile arguments (in particular
--patch-module).

To fix this problem, we add a special compile mode to JDT core, used by
JDT debug. When in this mode, the JDT compiler will ignore split package
problems. The compiled expression "return entrySet().toArray();" is then
used for evaluation against the underlying java.util.Map, which does
work with JRE 9+.

Change-Id: Iaaf3edde97e5006aecc8792df9da789b8eddbfce
Signed-off-by: Simeon Andreev <simeon.danailov.andreev@gmail.com>
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
Assets 2
Loading