changeset 22678:f3ebbebef617

Allow overwriting of invocation plugins
author Christian Wimmer <christian.wimmer@oracle.com>
date Tue, 22 Sep 2015 17:35:52 -0700
parents ce2b71115ade
children 152f2a7c46d8
files graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/InvocationPlugin.java graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/InvocationPlugins.java
diffstat 2 files changed, 26 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/InvocationPlugin.java	Fri Aug 28 11:23:08 2015 -0700
+++ b/graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/InvocationPlugin.java	Tue Sep 22 17:35:52 2015 -0700
@@ -38,8 +38,8 @@
 
     /**
      * The receiver in a non-static method. The class literal for this interface must be used with
-     * {@link InvocationPlugins#put(InvocationPlugin, boolean, boolean, Class, String, Class...)} to
-     * denote the receiver argument for such a non-static method.
+     * {@link InvocationPlugins#put(InvocationPlugin, boolean, boolean, boolean, Class, String, Class...)}
+     * to denote the receiver argument for such a non-static method.
      */
     public interface Receiver {
         /**
--- a/graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/InvocationPlugins.java	Fri Aug 28 11:23:08 2015 -0700
+++ b/graal/com.oracle.graal.graphbuilderconf/src/com/oracle/graal/graphbuilderconf/InvocationPlugins.java	Tue Sep 22 17:35:52 2015 -0700
@@ -84,6 +84,7 @@
 
         private final InvocationPlugins plugins;
         private final Class<?> declaringClass;
+        private boolean allowOverwrite;
 
         /**
          * Creates an object for registering {@link InvocationPlugin}s for methods declared by a
@@ -99,13 +100,21 @@
         }
 
         /**
+         * Configures this registration to allow or disallow overwriting of invocation plugins.
+         */
+        public Registration setAllowOverwrite(boolean allowOverwrite) {
+            this.allowOverwrite = allowOverwrite;
+            return this;
+        }
+
+        /**
          * Registers a plugin for a method with no arguments.
          *
          * @param name the name of the method
          * @param plugin the plugin to be registered
          */
         public void register0(String name, InvocationPlugin plugin) {
-            plugins.register(plugin, declaringClass, name);
+            plugins.register(plugin, false, allowOverwrite, declaringClass, name);
         }
 
         /**
@@ -115,7 +124,7 @@
          * @param plugin the plugin to be registered
          */
         public void register1(String name, Class<?> arg, InvocationPlugin plugin) {
-            plugins.register(plugin, declaringClass, name, arg);
+            plugins.register(plugin, false, allowOverwrite, declaringClass, name, arg);
         }
 
         /**
@@ -125,7 +134,7 @@
          * @param plugin the plugin to be registered
          */
         public void register2(String name, Class<?> arg1, Class<?> arg2, InvocationPlugin plugin) {
-            plugins.register(plugin, declaringClass, name, arg1, arg2);
+            plugins.register(plugin, false, allowOverwrite, declaringClass, name, arg1, arg2);
         }
 
         /**
@@ -135,7 +144,7 @@
          * @param plugin the plugin to be registered
          */
         public void register3(String name, Class<?> arg1, Class<?> arg2, Class<?> arg3, InvocationPlugin plugin) {
-            plugins.register(plugin, declaringClass, name, arg1, arg2, arg3);
+            plugins.register(plugin, false, allowOverwrite, declaringClass, name, arg1, arg2, arg3);
         }
 
         /**
@@ -145,7 +154,7 @@
          * @param plugin the plugin to be registered
          */
         public void register4(String name, Class<?> arg1, Class<?> arg2, Class<?> arg3, Class<?> arg4, InvocationPlugin plugin) {
-            plugins.register(plugin, declaringClass, name, arg1, arg2, arg3, arg4);
+            plugins.register(plugin, false, allowOverwrite, declaringClass, name, arg1, arg2, arg3, arg4);
         }
 
         /**
@@ -155,7 +164,7 @@
          * @param plugin the plugin to be registered
          */
         public void register5(String name, Class<?> arg1, Class<?> arg2, Class<?> arg3, Class<?> arg4, Class<?> arg5, InvocationPlugin plugin) {
-            plugins.register(plugin, declaringClass, name, arg1, arg2, arg3, arg4, arg5);
+            plugins.register(plugin, false, allowOverwrite, declaringClass, name, arg1, arg2, arg3, arg4, arg5);
         }
 
         /**
@@ -165,7 +174,7 @@
          * @param plugin the plugin to be registered
          */
         public void registerOptional3(String name, Class<?> arg1, Class<?> arg2, Class<?> arg3, InvocationPlugin plugin) {
-            plugins.registerOptional(plugin, declaringClass, name, arg1, arg2, arg3);
+            plugins.register(plugin, true, allowOverwrite, declaringClass, name, arg1, arg2, arg3);
         }
 
         /**
@@ -175,7 +184,7 @@
          * @param plugin the plugin to be registered
          */
         public void registerOptional4(String name, Class<?> arg1, Class<?> arg2, Class<?> arg3, Class<?> arg4, InvocationPlugin plugin) {
-            plugins.registerOptional(plugin, declaringClass, name, arg1, arg2, arg3, arg4);
+            plugins.register(plugin, true, allowOverwrite, declaringClass, name, arg1, arg2, arg3, arg4);
         }
 
         /**
@@ -190,7 +199,7 @@
          */
         public void registerMethodSubstitution(Class<?> substituteDeclaringClass, String name, Class<?>... argumentTypes) {
             MethodSubstitutionPlugin plugin = new MethodSubstitutionPlugin(substituteDeclaringClass, name, argumentTypes);
-            plugins.register(plugin, declaringClass, name, argumentTypes);
+            plugins.register(plugin, false, allowOverwrite, declaringClass, name, argumentTypes);
         }
     }
 
@@ -311,11 +320,11 @@
      *            {@code declaringClass} iff the method is non-static.
      * @return an object representing the method
      */
-    MethodKey put(InvocationPlugin value, boolean isStatic, boolean isOptional, Class<?> declaringClass, String name, Class<?>... argumentTypes) {
+    MethodKey put(InvocationPlugin value, boolean isStatic, boolean isOptional, boolean allowOverwrite, Class<?> declaringClass, String name, Class<?>... argumentTypes) {
         assert isStatic || argumentTypes[0] == declaringClass;
         MethodKey methodKey = new MethodKey(value, isStatic, isOptional, declaringClass, name, argumentTypes);
         assert entries == null : "registration is closed";
-        assert !registrations.contains(methodKey) : "a value is already registered for " + methodKey;
+        assert allowOverwrite || !registrations.contains(methodKey) : "a value is already registered for " + methodKey;
         registrations.add(methodKey);
         return methodKey;
     }
@@ -393,12 +402,12 @@
         this(null, metaAccess);
     }
 
-    private void register(InvocationPlugin plugin, boolean isOptional, Class<?> declaringClass, String name, Class<?>... argumentTypes) {
+    private void register(InvocationPlugin plugin, boolean isOptional, boolean allowOverwrite, Class<?> declaringClass, String name, Class<?>... argumentTypes) {
         boolean isStatic = argumentTypes.length == 0 || argumentTypes[0] != InvocationPlugin.Receiver.class;
         if (!isStatic) {
             argumentTypes[0] = declaringClass;
         }
-        MethodKey methodInfo = put(plugin, isStatic, isOptional, declaringClass, name, argumentTypes);
+        MethodKey methodInfo = put(plugin, isStatic, isOptional, allowOverwrite, declaringClass, name, argumentTypes);
         assert Checker.check(this, methodInfo, plugin);
     }
 
@@ -412,7 +421,7 @@
      *            {@code declaringClass}
      */
     public void register(InvocationPlugin plugin, Class<?> declaringClass, String name, Class<?>... argumentTypes) {
-        register(plugin, false, declaringClass, name, argumentTypes);
+        register(plugin, false, false, declaringClass, name, argumentTypes);
     }
 
     /**
@@ -425,7 +434,7 @@
      *            {@code declaringClass}
      */
     public void registerOptional(InvocationPlugin plugin, Class<?> declaringClass, String name, Class<?>... argumentTypes) {
-        register(plugin, true, declaringClass, name, argumentTypes);
+        register(plugin, true, false, declaringClass, name, argumentTypes);
     }
 
     /**