src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugins.java
--- a/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugins.java Fri Aug 17 11:56:59 2018 -0500
+++ b/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugins.java Fri Aug 17 13:20:53 2018 -0700
@@ -442,6 +442,7 @@
* {@code declaringClass}
*/
public void register(InvocationPlugin plugin, String name, Type... argumentTypes) {
+ assert plugins != null : String.format("Late registrations of invocation plugins for %s is already closed", declaringType);
boolean isStatic = argumentTypes.length == 0 || argumentTypes[0] != InvocationPlugin.Receiver.class;
if (!isStatic) {
argumentTypes[0] = declaringType;
@@ -567,7 +568,7 @@
/**
* Maps method names to binding lists.
*/
- private final EconomicMap<String, Binding> bindings = EconomicMap.create(Equivalence.DEFAULT);
+ final EconomicMap<String, Binding> bindings = EconomicMap.create(Equivalence.DEFAULT);
/**
* Gets the invocation plugin for a given method.
@@ -883,11 +884,33 @@
flushDeferrables();
}
+ /**
+ * Determines if this object currently contains any plugins (in any state of registration). If
+ * this object has any {@link #defer(Runnable) deferred registrations}, it is assumed that
+ * executing them will result in at least one plugin being registered.
+ */
public boolean isEmpty() {
- if (resolvedRegistrations != null) {
- return resolvedRegistrations.isEmpty();
+ if (parent != null && !parent.isEmpty()) {
+ return false;
+ }
+ UnmodifiableEconomicMap<ResolvedJavaMethod, InvocationPlugin> resolvedRegs = resolvedRegistrations;
+ if (resolvedRegs != null) {
+ if (!resolvedRegs.isEmpty()) {
+ return false;
+ }
}
- return registrations.size() == 0 && lateRegistrations == null;
+ List<Runnable> deferred = deferredRegistrations;
+ if (deferred != null) {
+ if (!deferred.isEmpty()) {
+ return false;
+ }
+ }
+ for (LateClassPlugins late = lateRegistrations; late != null; late = late.next) {
+ if (!late.bindings.isEmpty()) {
+ return false;
+ }
+ }
+ return registrations.size() == 0;
}
/**