src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/graphbuilderconf/InvocationPlugins.java
changeset 51436 091c0d22e735
parent 50858 2d3e99a72541
child 52910 583fd71c47d6
--- 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;
     }
 
     /**