You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by su...@apache.org on 2026/07/22 18:51:57 UTC

(groovy) branch GROOVY-12185 updated (9c7a08faf5 -> c42badc1bd)

This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a change to branch GROOVY-12185
in repository https://gitbox.apache.org/repos/asf/groovy.git


 discard 9c7a08faf5 GROOVY-12185: Move classic call-site caching into optional groovy-callsite module
     new c42badc1bd GROOVY-12185: Move classic call-site caching into optional groovy-callsite module

This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version.  This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:

 * -- * -- B -- O -- O -- O   (9c7a08faf5)
            \
             N -- N -- N   refs/heads/GROOVY-12185 (c42badc1bd)

You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.

Any revisions marked "omit" are not gone; other references still
refer to them.  Any revisions marked "discard" are gone forever.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../src/main/groovy/org.apache.groovy-performance.gradle    | 13 +++++++++++--
 subprojects/performance/README.adoc                         |  4 ++++
 2 files changed, 15 insertions(+), 2 deletions(-)


(groovy) 01/01: GROOVY-12185: Move classic call-site caching into optional groovy-callsite module

Posted by su...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch GROOVY-12185
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit c42badc1bd2badd0363b06eff3b024245177c651
Author: Daniel Sun <su...@apache.org>
AuthorDate: Thu Jul 23 02:14:11 2026 +0900

    GROOVY-12185: Move classic call-site caching into optional groovy-callsite module
---
 COMPATIBILITY.md                                   |  32 ++
 .../groovy/org.apache.groovy-performance.gradle    |  13 +-
 build.gradle                                       |   2 +
 settings.gradle                                    |   1 +
 src/main/java/groovy/lang/ExpandoMetaClass.java    |  61 +---
 src/main/java/groovy/lang/MetaClassImpl.java       | 143 +++-----
 .../groovy/classgen/asm/CallSiteWriter.java        |  17 +-
 .../groovy/classgen/asm/WriterController.java      |  23 ++
 .../groovy/control/CompilerConfiguration.java      |   5 +-
 .../codehaus/groovy/reflection/CachedClass.java    |  20 -
 .../codehaus/groovy/reflection/CachedMethod.java   | 127 +------
 .../reflection/ClassLoaderForClassArtifacts.java   |  16 +-
 .../groovy/runtime/callsite/package-info.java      |  23 --
 .../groovy/runtime/dgmimpl/NumberNumberDiv.java    | 338 -----------------
 .../runtime/dgmimpl/NumberNumberMetaMethod.java    | 103 +-----
 .../groovy/runtime/dgmimpl/NumberNumberMinus.java  | 391 --------------------
 .../runtime/dgmimpl/NumberNumberMultiply.java      | 401 ---------------------
 .../groovy/runtime/dgmimpl/NumberNumberPlus.java   | 386 --------------------
 .../runtime/dgmimpl/arrays/ArrayMetaMethod.java    |   5 +-
 .../arrays/BooleanArrayGetAtMetaMethod.java        |  27 --
 .../arrays/BooleanArrayPutAtMetaMethod.java        |  44 ---
 .../dgmimpl/arrays/ByteArrayGetAtMetaMethod.java   |  27 --
 .../dgmimpl/arrays/ByteArrayPutAtMetaMethod.java   |  44 ---
 .../arrays/CharacterArrayGetAtMetaMethod.java      |  27 --
 .../arrays/CharacterArrayPutAtMetaMethod.java      |  44 ---
 .../dgmimpl/arrays/DoubleArrayGetAtMetaMethod.java |  27 --
 .../dgmimpl/arrays/DoubleArrayPutAtMetaMethod.java |  44 ---
 .../dgmimpl/arrays/FloatArrayGetAtMetaMethod.java  |  27 --
 .../dgmimpl/arrays/FloatArrayPutAtMetaMethod.java  |  44 ---
 .../arrays/IntegerArrayGetAtMetaMethod.java        |  27 --
 .../arrays/IntegerArrayPutAtMetaMethod.java        |  44 ---
 .../dgmimpl/arrays/LongArrayGetAtMetaMethod.java   |  27 --
 .../dgmimpl/arrays/LongArrayPutAtMetaMethod.java   |  44 ---
 .../dgmimpl/arrays/ObjectArrayGetAtMetaMethod.java |  33 --
 .../dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java |  30 --
 .../dgmimpl/arrays/ShortArrayGetAtMetaMethod.java  |  27 --
 .../dgmimpl/arrays/ShortArrayPutAtMetaMethod.java  |  44 ---
 .../groovy/runtime/metaclass/ClosureMetaClass.java |  44 ---
 src/test/groovy/bugs/Groovy12185.groovy            | 177 +++++++++
 .../groovy-callsite/build.gradle                   |  22 +-
 .../groovy/runtime/callsite/AbstractCallSite.java  |   1 +
 .../callsite/BooleanClosureForMapPredicate.java    |   0
 .../runtime/callsite/BooleanClosurePredicate.java  |   0
 .../runtime/callsite/BooleanClosureWrapper.java    |   0
 .../callsite/BooleanReturningMethodInvoker.java    |   0
 .../runtime/callsite/CachedMethodCallSites.java    | 152 ++++++++
 .../codehaus/groovy/runtime/callsite/CallSite.java |   1 +
 .../groovy/runtime/callsite/CallSiteArray.java     |  11 +-
 .../runtime/callsite/CallSiteClassLoader.java      |   1 +
 .../groovy/runtime/callsite/CallSiteGenerator.java |  33 +-
 .../callsite/ClassMetaClassGetPropertySite.java    |   0
 .../runtime/callsite/ConstructorMetaClassSite.java |   0
 .../callsite/ConstructorMetaMethodSite.java        |   0
 .../groovy/runtime/callsite/ConstructorSite.java   |   0
 .../callsite/GetEffectivePogoFieldSite.java        |   0
 .../callsite/GetEffectivePogoPropertySite.java     |   0
 .../callsite/GetEffectivePojoFieldSite.java        |   0
 .../callsite/GetEffectivePojoPropertySite.java     |   0
 .../runtime/callsite/MetaClassCallSites.java       | 181 ++++++++++
 .../runtime/callsite/MetaClassConstructorSite.java |   0
 .../groovy/runtime/callsite/MetaClassSite.java     |   0
 .../groovy/runtime/callsite/MetaMethodSite.java    |   0
 .../groovy/runtime/callsite/NullCallSite.java      |   0
 .../callsite/PerInstancePojoMetaClassSite.java     |   0
 .../callsite/PlainObjectMetaMethodSite.java        |   0
 .../runtime/callsite/PogoGetPropertySite.java      |   0
 .../runtime/callsite/PogoInterceptableSite.java    |   0
 .../callsite/PogoMetaClassGetPropertySite.java     |   0
 .../groovy/runtime/callsite/PogoMetaClassSite.java |   0
 .../runtime/callsite/PogoMetaMethodSite.java       |   2 +-
 .../callsite/PojoMetaClassGetPropertySite.java     |   0
 .../groovy/runtime/callsite/PojoMetaClassSite.java |   0
 .../runtime/callsite/PojoMetaMethodSite.java       |   8 +-
 .../runtime/callsite/StaticMetaClassSite.java      |   0
 .../runtime/callsite/StaticMetaMethodSite.java     |   2 +-
 .../groovy/runtime/callsite/package-info.java      |  43 +++
 .../callsite/CachedMethodCallSitesTest.groovy      |  63 ++++
 .../runtime/callsite/CallSiteArrayTest.groovy      | 114 ++++++
 .../runtime/callsite/MetaClassCallSitesTest.groovy | 128 +++++++
 subprojects/performance/README.adoc                |   4 +
 80 files changed, 1073 insertions(+), 2652 deletions(-)

diff --git a/COMPATIBILITY.md b/COMPATIBILITY.md
index 0463f16726..bc40f0d5de 100644
--- a/COMPATIBILITY.md
+++ b/COMPATIBILITY.md
@@ -167,6 +167,38 @@ When you need to remove or replace public API:
 - If a behavioural change is unavoidable in the same release as the
   deprecation (rare), call it out in the release notes.
 
+### Groovy 6 — classic call-site caching (GROOVY-12185)
+
+Classic (non-`invokedynamic`) call-site classes under
+`org.codehaus.groovy.runtime.callsite` were moved out of groovy-core
+into the optional, deprecated module `groovy-callsite`.
+
+**Primary purpose:** keep **runtime binary compatibility** for classes
+compiled by **Groovy 4 and Groovy 5** (and earlier releases that always
+used classic call sites). Those classes embed
+`$getCallSiteArray` / `CallSiteArray` / `CallSite` linkage. With
+`org.apache.groovy:groovy-callsite` on the runtime classpath, that
+bytecode must still **load and execute** on Groovy 6. The published
+module preserves the same public linkage surface that Groovy 4/5
+classic bytecode depends on (`CallSiteArray(Class, String[])`, public
+`array` / `owner` fields, and the full `CallSite` method set).
+
+Core does not depend on that module; runtime dispatch uses invokedynamic
+by default (as since Groovy 4). Related helpers that existed only to
+construct classic call sites (for example `MetaClassImpl#createPojoCallSite`,
+`CachedMethod#createPojoMetaMethodSite`, `CachedClass#getCallSiteLoader`)
+were removed from core in this major version. Public method-selection
+overloads remain on `MetaClassImpl` for the optional runtime without
+package-private coupling.
+
+To **compile** with `indy` disabled, or to **run** classic-mode classes
+from older releases, add `org.apache.groovy:groovy-callsite` to the
+classpath. Compiling with `indy=false` without that module fails fast
+with a clear error rather than emitting unloadable bytecode. Valuable
+helpers that used to live beside the call-site cache
+(`BooleanClosureWrapper` and related types) remain in core under
+`org.codehaus.groovy.runtime`.
+
 ## The binary-compatibility check
 
 The [`subprojects/binary-compatibility/`](subprojects/binary-compatibility)
diff --git a/build-logic/src/main/groovy/org.apache.groovy-performance.gradle b/build-logic/src/main/groovy/org.apache.groovy-performance.gradle
index 3bedde5a97..e37d9e48af 100644
--- a/build-logic/src/main/groovy/org.apache.groovy-performance.gradle
+++ b/build-logic/src/main/groovy/org.apache.groovy-performance.gradle
@@ -42,6 +42,12 @@ repositories {
     }
 }
 
+// -Pindy=false selects classic (non-invokedynamic) call-site bytecode for
+// compileGroovy / compileJmhGroovy. After GROOVY-12185 that runtime lives in
+// the optional groovy-callsite module and must be on the compile + runtime
+// classpaths (WriterController fails fast otherwise — see GROOVY-11158).
+var indy = (project.findProperty('indy') ?: 'true').toBoolean()
+
 dependencies {
     implementation project(':')
     jmh project(':')
@@ -51,6 +57,11 @@ dependencies {
     testRuntimeOnly "org.junit.platform:junit-platform-launcher:${versions.junit6}"
 
     stats "org.apache.commons:commons-math3:${versions.commonsMath3}"
+
+    if (!indy) {
+        implementation projects.groovyCallsite
+        jmh projects.groovyCallsite
+    }
 }
 
 jmh {
@@ -87,8 +98,6 @@ tasks.configureEach {
     }
 }
 
-var indy = (project.findProperty('indy') ?: 'true').toBoolean()
-
 tasks.named('compileJmhGroovy') {
     classpath += compileJmhJava.classpath
     groovyOptions.optimizationOptions.indy = indy
diff --git a/build.gradle b/build.gradle
index 87b5c3a3ad..6a5ba9ea22 100644
--- a/build.gradle
+++ b/build.gradle
@@ -90,6 +90,8 @@ afterEvaluate {
 */
 
 dependencies {
+    // Classic call-site runtime for tests that compile with indy=false (GROOVY-11158)
+    testRuntimeOnly projects.groovyCallsite
     // for internal CLI usage
     api "info.picocli:picocli:${versions.picocli}" // marked as api but manually excluded later in assemble.gradle - modules will use shaded version
     // for internal usage of things like Opcode
diff --git a/settings.gradle b/settings.gradle
index 261f630f25..bdad2fa221 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -65,6 +65,7 @@ def subprojects = [
         'groovy-jmx',
         'groovy-json',
         'groovy-jsr223',
+        'groovy-callsite',
         'groovy-logging-test',
         'groovy-ginq',
         'groovy-http-builder',
diff --git a/src/main/java/groovy/lang/ExpandoMetaClass.java b/src/main/java/groovy/lang/ExpandoMetaClass.java
index 5592b7e1fb..4ff62655f6 100644
--- a/src/main/java/groovy/lang/ExpandoMetaClass.java
+++ b/src/main/java/groovy/lang/ExpandoMetaClass.java
@@ -27,11 +27,6 @@ import org.codehaus.groovy.runtime.DefaultGroovyMethods;
 import org.codehaus.groovy.runtime.InvokerHelper;
 import org.codehaus.groovy.runtime.MetaClassHelper;
 import org.codehaus.groovy.runtime.MethodKey;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.ConstructorMetaMethodSite;
-import org.codehaus.groovy.runtime.callsite.PogoMetaClassSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaClassSite;
-import org.codehaus.groovy.runtime.callsite.StaticMetaClassSite;
 import org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod;
 import org.codehaus.groovy.runtime.metaclass.ClosureStaticMetaMethod;
 import org.codehaus.groovy.runtime.metaclass.DefaultMetaClassInfo;
@@ -1189,7 +1184,6 @@ public class ExpandoMetaClass extends MetaClassImpl implements GroovyObject {
         }
     }
 
-
     /**
      * Returns a list of expando MetaMethod instances added to this ExpandoMetaClass
      *
@@ -1414,49 +1408,18 @@ public class ExpandoMetaClass extends MetaClassImpl implements GroovyObject {
         return false;
     }
 
-    /** {@inheritDoc} */
-    @Override
-    public CallSite createPojoCallSite(CallSite site, Object receiver, Object[] args) {
-        if (invokeMethodMethod != null)
-            return new PojoMetaClassSite(site, this);
-
-        return super.createPojoCallSite(site, receiver, args);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public CallSite createStaticSite(CallSite site, Object[] args) {
-        if (invokeStaticMethodMethod != null)
-            return new StaticMetaClassSite(site, this);
-
-        return super.createStaticSite(site, args);
-    }
-
     /** {@inheritDoc} */
     @Override
     public boolean hasCustomStaticInvokeMethod() {return invokeStaticMethodMethod!=null; }
 
-    /** {@inheritDoc} */
-    @Override
-    public CallSite createPogoCallSite(CallSite site, Object[] args) {
-        if (invokeMethodMethod != null)
-            return new PogoMetaClassSite(site, this);
-        return super.createPogoCallSite(site, args);
-    }
-
     /**
-     * Creates a call site for current-scope POGO dispatch that honours expando {@code invokeMethod}.
+     * Whether this metaclass has a custom {@code invokeMethod} registration.
      *
-     * @param site the original call site
-     * @param sender the calling class
-     * @param name the method name being invoked
-     * @param args the invocation arguments
-     * @return the adapted call site
+     * @return {@code true} if a custom invokeMethod is registered
+     * @since 6.0.0
      */
-    public CallSite createPogoCallCurrentSite(CallSite site, Class sender, String name, Object[] args) {
-        if (invokeMethodMethod != null)
-            return new PogoMetaClassSite(site, this);
-        return super.createPogoCallCurrentSite(site, sender, args);
+    public boolean hasCustomInvokeMethod() {
+        return invokeMethodMethod != null;
     }
 
     /** {@inheritDoc} */
@@ -1468,20 +1431,6 @@ public class ExpandoMetaClass extends MetaClassImpl implements GroovyObject {
         return super.retrieveConstructor(args);
     }
 
-    /** {@inheritDoc} */
-    @Override
-    public CallSite createConstructorSite(CallSite site, Object[] args) {
-        Class<?>[] params = MetaClassHelper.convertToTypeArray(args);
-        MetaMethod method = pickMethod(GROOVY_CONSTRUCTOR, params);
-        if (method != null && method.getParameterTypes().length == args.length) {
-            if (method.getDeclaringClass().getTheClass().equals(getTheClass())) {
-                return new ConstructorMetaMethodSite(site, this, method, params);
-            }
-        }
-
-        return super.createConstructorSite(site, args);
-    }
-
     private class SubClassDefiningClosure extends GroovyObjectSupport {
         private final Class<?> klazz;
 
diff --git a/src/main/java/groovy/lang/MetaClassImpl.java b/src/main/java/groovy/lang/MetaClassImpl.java
index aa575dee39..c70f14fee3 100644
--- a/src/main/java/groovy/lang/MetaClassImpl.java
+++ b/src/main/java/groovy/lang/MetaClassImpl.java
@@ -48,16 +48,6 @@ import org.codehaus.groovy.runtime.InvokerHelper;
 import org.codehaus.groovy.runtime.InvokerInvocationException;
 import org.codehaus.groovy.runtime.MetaClassHelper;
 import org.codehaus.groovy.runtime.MethodClosure;
-import org.codehaus.groovy.runtime.callsite.AbstractCallSite;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.ConstructorSite;
-import org.codehaus.groovy.runtime.callsite.MetaClassConstructorSite;
-import org.codehaus.groovy.runtime.callsite.PogoMetaClassSite;
-import org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaClassSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
-import org.codehaus.groovy.runtime.callsite.StaticMetaClassSite;
-import org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite;
 import org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod;
 import org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl;
 import org.codehaus.groovy.runtime.metaclass.MetaMethodIndex;
@@ -1537,12 +1527,26 @@ public class MetaClassImpl implements MetaClass, MutableMetaClass {
         return true;
     }
 
-    // This method should be called by CallSite only
-    private MetaMethod getMethodWithCachingInternal(final Class sender, final CallSite site, final Class<?>[] params) {
+    /**
+     * Selects a method using pre-converted parameter types and the call-site
+     * style method cache (keyed by {@code Class[]}).
+     * <p>
+     * Prefer {@link #getMethodWithCaching(Class, String, Object[], boolean)}
+     * when only runtime argument values are available. This overload exists so
+     * optional runtime modules (e.g. classic call-site dispatch) can share the
+     * same selection path without depending on package-private state.
+     *
+     * @param sender the class whose meta-method index is consulted
+     * @param methodName the method name
+     * @param params the argument types (must not be {@code null})
+     * @return the selected meta method, or {@code null} if none matches
+     * @since 6.0.0
+     */
+    public MetaMethod getMethodWithCaching(final Class sender, final String methodName, final Class<?>[] params) {
         if (GroovyCategorySupport.hasCategoryInCurrentThread())
-            return getMethodWithoutCaching(sender, site.getName(), params, false);
+            return getMethodWithoutCaching(sender, methodName, params, false);
 
-        MetaMethodIndex.Cache e = metaMethodIndex.getMethods(sender, site.getName());
+        MetaMethodIndex.Cache e = metaMethodIndex.getMethods(sender, methodName);
         if (e == null || e.methods == null)
             return null;
 
@@ -1556,6 +1560,31 @@ public class MetaClassImpl implements MetaClass, MutableMetaClass {
         return cacheEntry.method;
     }
 
+    /**
+     * Selects a constructor matching the given parameter types.
+     *
+     * @param argTypes the constructor argument types
+     * @return the matching cached constructor, or {@code null}
+     * @since 6.0.0
+     */
+    public CachedConstructor chooseConstructor(final Class<?>[] argTypes) {
+        return (CachedConstructor) chooseMethod(CONSTRUCTOR_NAME, constructors, argTypes);
+    }
+
+    /**
+     * Selects a no-arg (or outer-instance) constructor used for named-argument
+     * construction, after a direct map-style match has already failed.
+     *
+     * @param argTypes the original argument types including the trailing map
+     * @param args the original arguments including the trailing map
+     * @return the matching constructor as a {@link CachedConstructor}, or
+     *         another {@link ParameterTypes} result from method selection
+     * @since 6.0.0
+     */
+    public Object chooseNamedArgCompatibleConstructor(final Class<?>[] argTypes, final Object[] args) {
+        return retrieveNamedArgCompatibleConstructor(argTypes, args);
+    }
+
     private MetaMethod getSuperMethodWithCaching(final Object[] arguments, final MetaMethodIndex.Cache e) {
         if (e.methodsForSuper == null)
             return null;
@@ -3782,92 +3811,6 @@ public class MetaClassImpl implements MetaClass, MutableMetaClass {
         metaMethodIndex.clearCaches(name);
     }
 
-    /**
-     * Create a CallSite
-     */
-    public CallSite createPojoCallSite(CallSite site, Object receiver, Object[] args) {
-        if (!(this instanceof AdaptingMetaClass)) {
-            Class[] params = MetaClassHelper.convertToTypeArray(args);
-            MetaMethod metaMethod = getMethodWithCachingInternal(getTheClass(), site, params);
-            if (metaMethod != null)
-                return PojoMetaMethodSite.createPojoMetaMethodSite(site, this, metaMethod, params, receiver, args);
-        }
-        return new PojoMetaClassSite(site, this);
-    }
-
-    /**
-     * Create a CallSite
-     */
-    public CallSite createStaticSite(CallSite site, Object[] args) {
-        if (!(this instanceof AdaptingMetaClass)) {
-            Class[] params = MetaClassHelper.convertToTypeArray(args);
-            MetaMethod metaMethod = retrieveStaticMethod(site.getName(), args);
-            if (metaMethod != null)
-                return StaticMetaMethodSite.createStaticMetaMethodSite(site, this, metaMethod, params, args);
-        }
-        return new StaticMetaClassSite(site, this);
-    }
-
-    /**
-     * Create a CallSite
-     */
-    public CallSite createPogoCallSite(CallSite site, Object[] args) {
-        if (!GroovyCategorySupport.hasCategoryInCurrentThread() && !(this instanceof AdaptingMetaClass)) {
-            Class[] params = MetaClassHelper.convertToTypeArray(args);
-            CallSite tempSite = site;
-            if (site.getName().equals(CALL_METHOD) && isGroovyFunctor()) {
-                // here, we want to point to a method named "doCall" instead of "call"
-                // but we don't want to replace the original call site name, otherwise
-                // we lose the fact that the original method name was "call" so instead
-                // we will point to a metamethod called "doCall"
-                // see GROOVY-5806 for details
-                tempSite = new AbstractCallSite(site.getArray(), site.getIndex(), DO_CALL_METHOD);
-            }
-            MetaMethod metaMethod = getMethodWithCachingInternal(theClass, tempSite, params);
-            if (metaMethod != null)
-                return PogoMetaMethodSite.createPogoMetaMethodSite(site, this, metaMethod, params, args);
-        }
-        return new PogoMetaClassSite(site, this);
-    }
-
-    /**
-     * Create a CallSite
-     */
-    public CallSite createPogoCallCurrentSite(CallSite site, Class sender, Object[] args) {
-        if (!GroovyCategorySupport.hasCategoryInCurrentThread() && !(this instanceof AdaptingMetaClass)) {
-            Class[] params = MetaClassHelper.convertToTypeArray(args);
-            MetaMethod metaMethod = getMethodWithCachingInternal(sender, site, params);
-            if (metaMethod != null)
-                return PogoMetaMethodSite.createPogoMetaMethodSite(site, this, metaMethod, params, args);
-        }
-        return new PogoMetaClassSite(site, this);
-    }
-
-    /**
-     * Create a CallSite
-     */
-    public CallSite createConstructorSite(CallSite site, Object[] args) {
-        if (!(this instanceof AdaptingMetaClass)) {
-            Class[] argTypes = MetaClassHelper.convertToTypeArray(args);
-            CachedConstructor constructor = (CachedConstructor) chooseMethod(CONSTRUCTOR_NAME, constructors, argTypes);
-            if (constructor != null) {
-                return ConstructorSite.createConstructorSite(site, this, constructor, argTypes, args);
-            }
-            if ((args.length == 1 && args[0] instanceof Map) ||
-                    (args.length == 2 && args[1] instanceof Map &&
-                            theClass.getEnclosingClass() != null &&
-                            theClass.getEnclosingClass().isAssignableFrom(argTypes[0]))) {
-                constructor = (CachedConstructor) retrieveNamedArgCompatibleConstructor(argTypes, args);
-                if (constructor != null) {
-                    return args.length == 1
-                            ? new ConstructorSite.NoParamSite(site, this, constructor, argTypes)
-                            : new ConstructorSite.NoParamSiteInnerClass(site, this, constructor, argTypes);
-                }
-            }
-        }
-        return new MetaClassConstructorSite(site, this);
-    }
-
     /**
      * Returns the ClassInfo for the contained Class
      *
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/CallSiteWriter.java b/src/main/java/org/codehaus/groovy/classgen/asm/CallSiteWriter.java
index 8196cb0030..f5950dbd8e 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/CallSiteWriter.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/CallSiteWriter.java
@@ -29,7 +29,6 @@ import org.codehaus.groovy.ast.expr.MethodCallExpression;
 import org.codehaus.groovy.ast.expr.PropertyExpression;
 import org.codehaus.groovy.ast.expr.TupleExpression;
 import org.codehaus.groovy.classgen.AsmClassGenerator;
-import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
 
@@ -64,8 +63,18 @@ import static org.objectweb.asm.Opcodes.PUTSTATIC;
 import static org.objectweb.asm.Opcodes.RETURN;
 
 /**
- * This class represents non-public API used by AsmClassGenerator. Don't
- * use this class in your code
+ * Bytecode writer for classic (non-{@code invokedynamic}) call sites.
+ * <p>
+ * Non-public API used by {@code AsmClassGenerator}. Do not use this class
+ * in application code. Groovy 6 defaults to invokedynamic
+ * ({@link org.codehaus.groovy.classgen.asm.indy.IndyCallSiteWriter});
+ * this writer is selected only when {@code indy} is disabled. The generated
+ * bytecode references {@code org.codehaus.groovy.runtime.callsite.*}, which
+ * lives in the optional {@code groovy-callsite} module — that module must be
+ * on the classpath both to emit and to execute such classes
+ * ({@code WriterController} fails fast if it is missing when {@code indy} is off).
+ *
+ * @see org.codehaus.groovy.classgen.asm.indy.IndyCallSiteWriter
  */
 public class CallSiteWriter {
     private static final int SIG_ARRAY_LENGTH = 255;
@@ -85,7 +94,7 @@ public class CallSiteWriter {
     private static final int
         MOD_PRIVSS = ACC_PRIVATE+ACC_STATIC+ACC_SYNTHETIC,
         MOD_PUBSS  = ACC_PUBLIC+ACC_STATIC+ACC_SYNTHETIC;
-    private static final ClassNode CALLSITE_ARRAY_TYPE = ClassHelper.make(CallSite[].class);
+    private static final ClassNode CALLSITE_ARRAY_TYPE = ClassHelper.make("org.codehaus.groovy.runtime.callsite.CallSite").makeArray();
     private static final String
         GET_CALLSITE_METHOD     = "$getCallSiteArray",
         CALLSITE_CLASS          = "org/codehaus/groovy/runtime/callsite/CallSite",
diff --git a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
index d69cb00d61..5e0538fbd1 100644
--- a/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
+++ b/src/main/java/org/codehaus/groovy/classgen/asm/WriterController.java
@@ -126,6 +126,10 @@ public class WriterController {
             this.callSiteWriter = new IndyCallSiteWriter(this);
             this.binaryExpHelper = new IndyBinHelper(this);
         } else {
+            // Classic call-site bytecode references org.codehaus.groovy.runtime.callsite.*
+            // (optional groovy-callsite module). Fail fast at compile time rather than
+            // producing classes that blow up with NoClassDefFoundError at first invoke.
+            requireClassicCallSiteRuntime(cn);
             this.callSiteWriter = new CallSiteWriter(this);
             this.invocationWriter = new InvocationWriter(this);
             this.binaryExpHelper = new BinaryExpressionHelper(this);
@@ -167,6 +171,25 @@ public class WriterController {
         return new LoggableClassVisitor(cv, config);
     }
 
+    /**
+     * Ensures the optional classic call-site runtime is visible to the compilation
+     * class loader before emitting non-indy call-site bytecode (GROOVY-11158).
+     */
+    private static void requireClassicCallSiteRuntime(final ClassNode cn) {
+        ClassLoader loader = cn.getCompileUnit() != null
+                ? cn.getCompileUnit().getClassLoader()
+                : WriterController.class.getClassLoader();
+        try {
+            Class.forName("org.codehaus.groovy.runtime.callsite.CallSiteArray", false, loader);
+        } catch (ClassNotFoundException e) {
+            throw new GroovyBugError(
+                    "Classic call-site bytecode generation requires the optional "
+                            + "org.apache.groovy:groovy-callsite module on the classpath. "
+                            + "Either leave invokedynamic enabled (the default since Groovy 4) "
+                            + "or add groovy-callsite. See GROOVY-11158.", e);
+        }
+    }
+
     //--------------------------------------------------------------------------
 
     /**
diff --git a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
index 95c2a98e19..30b30e9159 100644
--- a/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
+++ b/src/main/java/org/codehaus/groovy/control/CompilerConfiguration.java
@@ -1350,7 +1350,10 @@ public class CompilerConfiguration {
      * Enabled by default since Groovy 4.0. Can be disabled by setting
      * the system property {@code groovy.target.indy} to {@code false}
      * or by setting the {@code indy} optimization option to {@code false}.
-     * The ability to disable may be removed in a future version.
+     * Disabling indy emits classic call-site bytecode that requires the
+     * optional {@code groovy-callsite} module on the compile and runtime
+     * classpaths (see GROOVY-11158). The ability to disable may be removed
+     * in a future version.
      */
     public boolean isIndyEnabled() {
         return !Boolean.FALSE.equals(getOptimizationOptions().get(INVOKEDYNAMIC));
diff --git a/src/main/java/org/codehaus/groovy/reflection/CachedClass.java b/src/main/java/org/codehaus/groovy/reflection/CachedClass.java
index 3bc0e2dd4d..d5d37f3297 100644
--- a/src/main/java/org/codehaus/groovy/reflection/CachedClass.java
+++ b/src/main/java/org/codehaus/groovy/reflection/CachedClass.java
@@ -25,7 +25,6 @@ import groovy.lang.MetaClass;
 import groovy.lang.MetaClassImpl;
 import groovy.lang.MetaMethod;
 import org.codehaus.groovy.classgen.asm.BytecodeHelper;
-import org.codehaus.groovy.runtime.callsite.CallSiteClassLoader;
 import org.codehaus.groovy.runtime.metaclass.ClosureMetaClass;
 import org.codehaus.groovy.util.FastArray;
 import org.codehaus.groovy.util.LazyReference;
@@ -142,16 +141,6 @@ public class CachedClass {
         }
     };
 
-    private final LazyReference<CallSiteClassLoader> callSiteClassLoader = new LazyReference<CallSiteClassLoader>(softBundle) {
-        @Serial
-        private static final long serialVersionUID = 4410385968428074090L;
-
-        @Override
-        public CallSiteClassLoader initValue() {
-            return new CallSiteClassLoader(CachedClass.this.cachedClass);
-        }
-    };
-
     private final LazyReference<Collection<ClassInfo>> hierarchy = new LazyReference<Collection<ClassInfo>>(softBundle) {
         @Serial
         private static final long serialVersionUID = 7166687623678851596L;
@@ -660,15 +649,6 @@ public class CachedClass {
         return getTheClass().isAssignableFrom(argument.getClass());
     }
 
-    /**
-     * Returns the class loader used for generating call site classes for this cached class.
-     *
-     * @return a call site class loader
-     */
-    public CallSiteClassLoader getCallSiteLoader() {
-        return callSiteClassLoader.get();
-    }
-
     /**
      * Returns the complete type hierarchy for this class, including superclasses and interfaces.
      *
diff --git a/src/main/java/org/codehaus/groovy/reflection/CachedMethod.java b/src/main/java/org/codehaus/groovy/reflection/CachedMethod.java
index 7f5663592b..8c5d5c4571 100644
--- a/src/main/java/org/codehaus/groovy/reflection/CachedMethod.java
+++ b/src/main/java/org/codehaus/groovy/reflection/CachedMethod.java
@@ -18,21 +18,13 @@
  */
 package org.codehaus.groovy.reflection;
 
-import groovy.lang.MetaClassImpl;
 import groovy.lang.MetaMethod;
 import groovy.lang.MissingMethodException;
 import org.codehaus.groovy.classgen.asm.BytecodeHelper;
 import org.codehaus.groovy.runtime.InvokerInvocationException;
 import org.codehaus.groovy.runtime.MetaClassHelper;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.CallSiteGenerator;
-import org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
-import org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite;
 
 import java.lang.annotation.Annotation;
-import java.lang.ref.SoftReference;
-import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Arrays;
@@ -41,7 +33,7 @@ import java.util.Arrays;
  * Caches reflection information about a single method for fast lookup and invocation.
  * <p>
  * Extends {@link MetaMethod} and implements {@link Comparable} for method sorting.
- * Provides efficient access to method metadata and supports call site optimization.
+ * Provides efficient access to method metadata for MOP and invokedynamic dispatch.
  */
 @SuppressWarnings("rawtypes")
 public class CachedMethod extends MetaMethod implements Comparable {
@@ -81,12 +73,10 @@ public class CachedMethod extends MetaMethod implements Comparable {
     private final Method cachedMethod;
 
     private int hashCode;
-    private boolean skipCompiled;
     private Boolean callerSensitive;
 
     private boolean makeAccessibleDone;
     private CachedMethod transformedMethod;
-    private SoftReference<Constructor<CallSite>> pogoCallSiteConstructor, pojoCallSiteConstructor, staticCallSiteConstructor;
 
     /**
      * Constructs a {@code CachedMethod} for the given method within a cached class.
@@ -371,121 +361,6 @@ public class CachedMethod extends MetaMethod implements Comparable {
 
     //--------------------------------------------------------------------------
 
-    /**
-     * Creates an optimized call site for invoking this method on POGO (Groovy) objects.
-     * Attempts to compile the method for maximum performance.
-     *
-     * @param site the call site being created
-     * @param metaClass the metaclass of the target object's class
-     * @param params the parameter types of the call
-     * @return a call site optimized for POGO invocation
-     */
-    public CallSite createPogoMetaMethodSite(final CallSite site, final MetaClassImpl metaClass, final Class[] params) {
-        if (!skipCompiled) {
-            Constructor<CallSite> ctor = deref(pogoCallSiteConstructor);
-            if (ctor == null) {
-                if (CallSiteGenerator.isCompilable(this)) {
-                    ctor = CallSiteGenerator.compilePogoMethod(this);
-                }
-                if (ctor != null) {
-                    pogoCallSiteConstructor = new SoftReference<>(ctor);
-                } else {
-                    skipCompiled = true;
-                }
-            }
-
-            if (ctor != null) {
-                try {
-                    return ctor.newInstance(site, metaClass, this, params, ctor);
-                } catch (Error e) {
-                    skipCompiled = true;
-                    throw e;
-                } catch (Throwable e) {
-                    skipCompiled = true;
-                }
-            }
-        }
-        return new PogoMetaMethodSite.PogoCachedMethodSiteNoUnwrapNoCoerce(site, metaClass, this, params);
-    }
-
-    /**
-     * Creates an optimized call site for invoking this method on POJO (plain Java) objects.
-     * Attempts to compile the method for maximum performance.
-     *
-     * @param site the call site being created
-     * @param metaClass the metaclass of the target object's class
-     * @param params the parameter types of the call
-     * @return a call site optimized for POJO invocation
-     */
-    public CallSite createPojoMetaMethodSite(final CallSite site, final MetaClassImpl metaClass, final Class[] params) {
-        if (!skipCompiled) {
-            Constructor<CallSite> ctor = deref(pojoCallSiteConstructor);
-            if (ctor == null) {
-                if (CallSiteGenerator.isCompilable(this)) {
-                    ctor = CallSiteGenerator.compilePojoMethod(this);
-                }
-                if (ctor != null) {
-                    pojoCallSiteConstructor = new SoftReference<>(ctor);
-                } else {
-                    skipCompiled = true;
-                }
-            }
-
-            if (ctor != null) {
-                try {
-                    return ctor.newInstance(site, metaClass, this, params, ctor);
-                } catch (Error e) {
-                    skipCompiled = true;
-                    throw e;
-                } catch (Throwable e) {
-                    skipCompiled = true;
-                }
-            }
-        }
-        return new PojoMetaMethodSite.PojoCachedMethodSiteNoUnwrapNoCoerce(site, metaClass, this, params);
-    }
-
-    /**
-     * Creates an optimized call site for invoking this static method.
-     * Attempts to compile the method for maximum performance.
-     *
-     * @param site the call site being created
-     * @param metaClass the metaclass associated with the static method
-     * @param params the parameter types of the call
-     * @return a call site optimized for static method invocation
-     */
-    public CallSite createStaticMetaMethodSite(final CallSite site, final MetaClassImpl metaClass, final Class[] params) {
-        if (!skipCompiled) {
-            Constructor<CallSite> ctor = deref(staticCallSiteConstructor);
-            if (ctor == null) {
-                if (CallSiteGenerator.isCompilable(this)) {
-                    ctor = CallSiteGenerator.compileStaticMethod(this);
-                }
-                if (ctor != null) {
-                    staticCallSiteConstructor = new SoftReference<>(ctor);
-                } else {
-                    skipCompiled = true;
-                }
-            }
-
-            if (ctor != null) {
-                try {
-                    return ctor.newInstance(site, metaClass, this, params, ctor);
-                } catch (Error e) {
-                    skipCompiled = true;
-                    throw e;
-                } catch (Throwable e) {
-                    skipCompiled = true;
-                }
-            }
-        }
-        return new StaticMetaMethodSite.StaticMetaMethodSiteNoUnwrapNoCoerce(site, metaClass, this, params);
-    }
-
-    private static <T> Constructor<T> deref(final SoftReference<Constructor<T>> ref) {
-        return (ref != null ? ref.get() : null);
-    }
-
     /**
      * Invokes this method on the given object with the specified arguments.
      * Handles accessibility, exception wrapping, and method invocation.
diff --git a/src/main/java/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java b/src/main/java/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
index 8e34d5c75c..874495f64b 100644
--- a/src/main/java/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
+++ b/src/main/java/org/codehaus/groovy/reflection/ClassLoaderForClassArtifacts.java
@@ -18,10 +18,6 @@
  */
 package org.codehaus.groovy.reflection;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-
 import java.lang.ref.SoftReference;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
@@ -66,12 +62,20 @@ public class ClassLoaderForClassArtifacts extends ClassLoader {
         return suffix == -1 ? name : name + "$" + suffix;
     }
 
-    public Constructor defineClassAndGetConstructor(final String name, final byte[] bytes) {
+    /**
+     * Defines a class from bytecode and returns a constructor matching {@code parameterTypes}.
+     *
+     * @param name the binary name of the class to define
+     * @param bytes the class file bytes
+     * @param parameterTypes the constructor parameter types to look up
+     * @return the matching constructor, or {@code null} if definition or lookup fails
+     */
+    public Constructor defineClassAndGetConstructor(final String name, final byte[] bytes, final Class<?>... parameterTypes) {
         final Class cls = definePrivileged(name, bytes);
 
         if (cls != null) {
             try {
-                return cls.getConstructor(CallSite.class, MetaClassImpl.class, MetaMethod.class, Class[].class, Constructor.class);
+                return cls.getConstructor(parameterTypes);
             } catch (NoSuchMethodException e) { //
             }
         }
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/package-info.java b/src/main/java/org/codehaus/groovy/runtime/callsite/package-info.java
deleted file mode 100644
index 7faaf1c925..0000000000
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/package-info.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-/**
- * Call site caching and optimization. Implements method call site caching for improved performance.
- */
-package org.codehaus.groovy.runtime.callsite;
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberDiv.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberDiv.java
index c431f9b843..5a76e244d3 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberDiv.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberDiv.java
@@ -18,9 +18,6 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
-import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.typehandling.NumberMath;
 
 public final class NumberNumberDiv extends NumberNumberMetaMethod {
@@ -47,339 +44,4 @@ public final class NumberNumberDiv extends NumberNumberMetaMethod {
     public static Number div(Number left, Number right) {
         return NumberMath.divide(left, right);
     }
-
-
-    @Override
-    public CallSite createIntegerInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return createNumberNumber(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createIntegerLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return createNumberNumber(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createIntegerFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new IntegerFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createIntegerDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new IntegerDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return createNumberNumber(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return createNumberNumber(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new LongFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new LongDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatInteger(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatLong(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleInteger(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleLong(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createNumberNumber(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new NumberNumber(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    private static class IntegerFloat extends NumberNumberCallSite {
-        public IntegerFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Integer) receiver).doubleValue() / ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class IntegerDouble extends NumberNumberCallSite {
-        public IntegerDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Integer) receiver / (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class LongFloat extends NumberNumberCallSite {
-        public LongFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Long) receiver).doubleValue() / ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class LongDouble extends NumberNumberCallSite {
-        public LongDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Long) receiver).doubleValue() / (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatInteger extends NumberNumberCallSite {
-        public FloatInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() / ((Integer) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatLong extends NumberNumberCallSite {
-        public FloatLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() / ((Long) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatFloat extends NumberNumberCallSite {
-        public FloatFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() / ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-
-        @Override
-        public final Object invoke(Object receiver, Object[] args) {
-            return ((Float) receiver).doubleValue() / ((Float) args[0]).doubleValue();
-        }
-
-        public final Object invoke(Object receiver, Object arg) {
-            return ((Float) receiver).doubleValue() / ((Float) arg).doubleValue();
-        }
-    }
-
-    private static class FloatDouble extends NumberNumberCallSite {
-        public FloatDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() / (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class DoubleInteger extends NumberNumberCallSite {
-        public DoubleInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver / ((Integer) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-
-        @Override
-        public final Object invoke(Object receiver, Object[] args) {
-            return (Double) receiver / ((Integer) args[0]).doubleValue();
-        }
-
-        public final Object invoke(Object receiver, Object arg) {
-            return (Double) receiver / ((Integer) arg).doubleValue();
-        }
-    }
-
-    private static class DoubleLong extends NumberNumberCallSite {
-        public DoubleLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver / ((Long) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class DoubleFloat extends NumberNumberCallSite {
-        public DoubleFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver / ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class DoubleDouble extends NumberNumberCallSite {
-        public DoubleDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver / (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class NumberNumber extends NumberNumberCallSite {
-        public NumberNumber(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object invoke(Object receiver, Object[] args) {
-            return math.divideImpl((Number)receiver,(Number)args[0]);
-        }
-
-        public final Object invoke(Object receiver, Object arg) {
-            return math.divideImpl((Number)receiver,(Number)arg);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMetaMethod.java
index f9073aa38e..503b3e7a91 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMetaMethod.java
@@ -18,18 +18,18 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl;
 
-import groovy.lang.MetaClassImpl;
 import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.CallSiteAwareMetaMethod;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
-import org.codehaus.groovy.runtime.typehandling.NumberMath;
 
 import java.lang.reflect.Modifier;
 
-public abstract class NumberNumberMetaMethod extends CallSiteAwareMetaMethod {
+/**
+ * Base class for number-operator meta methods registered with the MOP.
+ * Classic call-site specializations formerly lived here and now reside only
+ * via generic call sites when the optional {@code groovy-callsite} module is used.
+ */
+public abstract class NumberNumberMetaMethod extends MetaMethod {
     private static final CachedClass   NUMBER_CLASS = ReflectionCache.getCachedClass(Number.class);
     private static final CachedClass[] NUMBER_CLASS_ARR = {NUMBER_CLASS};
 
@@ -51,95 +51,4 @@ public abstract class NumberNumberMetaMethod extends CallSiteAwareMetaMethod {
     public final CachedClass getDeclaringClass() {
         return NUMBER_CLASS;
     }
-
-    public abstract static class NumberNumberCallSite extends PojoMetaMethodSite {
-
-        final NumberMath math;
-
-        public NumberNumberCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Number receiver, Number arg) {
-            super(site, metaClass, metaMethod, params);
-            math = NumberMath.getMath(receiver,arg);
-        }
-    }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        Object firstArg = args[0];
-
-        if (receiver instanceof Integer) {
-            if (firstArg instanceof Integer)
-                return createIntegerInteger(site, metaClass, metaMethod, params, receiver, args);
-
-            if (firstArg instanceof Long)
-                return createIntegerLong(site, metaClass, metaMethod, params, receiver, args);
-
-            if (firstArg instanceof Float)
-                return createIntegerFloat(site, metaClass, metaMethod, params, receiver, args);
-
-            if (firstArg instanceof Double)
-                return createIntegerDouble(site, metaClass, metaMethod, params, receiver, args);
-        }
-
-        if (receiver instanceof Long) {
-            if (firstArg instanceof Integer)
-                return createLongInteger(site, metaClass, metaMethod, params, receiver, args);
-
-            if (firstArg instanceof Long)
-                return createLongLong(site, metaClass, metaMethod, params, receiver, args);
-
-            if (firstArg instanceof Float)
-                return createLongFloat(site, metaClass, metaMethod, params, receiver, args);
-
-            if (firstArg instanceof Double)
-                return createLongDouble(site, metaClass, metaMethod, params, receiver, args);
-        }
-
-        if (receiver instanceof Float) {
-            if (firstArg instanceof Integer)
-                return createFloatInteger(site, metaClass, metaMethod, params, receiver, args);
-
-            if (firstArg instanceof Long)
-                return createFloatLong(site, metaClass, metaMethod, params, receiver, args);
-
-            if (firstArg instanceof Float)
-                return createFloatFloat(site, metaClass, metaMethod, params, receiver, args);
-
-            if (firstArg instanceof Double)
-                return createFloatDouble(site, metaClass, metaMethod, params, receiver, args);
-        }
-
-        if (receiver instanceof Double) {
-            if (firstArg instanceof Integer)
-                return createDoubleInteger(site, metaClass, metaMethod, params, receiver, args);
-
-            if (firstArg instanceof Long)
-                return createDoubleLong(site, metaClass, metaMethod, params, receiver, args);
-
-            if (firstArg instanceof Float)
-                return createDoubleFloat(site, metaClass, metaMethod, params, receiver, args);
-
-            if (firstArg instanceof Double)
-                return createDoubleDouble(site, metaClass, metaMethod, params, receiver, args);
-        }
-
-        return createNumberNumber(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    public abstract CallSite createIntegerInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createIntegerLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createIntegerFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createIntegerDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createLongInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createLongLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createLongFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createLongDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createFloatInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createFloatLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createFloatFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createFloatDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createDoubleInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createDoubleLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createDoubleFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createDoubleDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
-    public abstract CallSite createNumberNumber(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMinus.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMinus.java
index 6e54576cb8..b0301b0335 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMinus.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMinus.java
@@ -18,9 +18,6 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
-import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.typehandling.NumberMath;
 
 public final class NumberNumberMinus extends NumberNumberMetaMethod {
@@ -44,392 +41,4 @@ public final class NumberNumberMinus extends NumberNumberMetaMethod {
     public static Number minus(Number left, Number right) {
         return NumberMath.subtract(left, right);
     }
-
-    @Override
-    public CallSite createIntegerInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new IntegerInteger(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createIntegerLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new IntegerLong(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createIntegerFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new IntegerFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createIntegerDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new IntegerDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new LongInteger(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new LongLong(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new LongFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new LongDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatInteger(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatLong(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleInteger(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleLong(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createNumberNumber(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new NumberNumber(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    private static class DoubleDouble extends NumberNumberCallSite {
-        public DoubleDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver - (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class DoubleFloat extends NumberNumberCallSite {
-        public DoubleFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver - ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class DoubleLong extends NumberNumberCallSite {
-        public DoubleLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver - ((Long) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class DoubleInteger extends NumberNumberCallSite {
-        public DoubleInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver - (Integer) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatDouble extends NumberNumberCallSite {
-        public FloatDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() - (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatFloat extends NumberNumberCallSite {
-        public FloatFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() - ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatLong extends NumberNumberCallSite {
-        public FloatLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() - ((Long) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatInteger extends NumberNumberCallSite {
-        public FloatInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() - ((Integer) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class LongDouble extends NumberNumberCallSite {
-        public LongDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Long) receiver).doubleValue() - (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class LongFloat extends NumberNumberCallSite {
-        public LongFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Long) receiver).doubleValue() - ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class LongLong extends NumberNumberCallSite {
-        public LongLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Long) receiver - (Long) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class LongInteger extends NumberNumberCallSite {
-        public LongInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Long) receiver - ((Integer) arg).longValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class IntegerDouble extends NumberNumberCallSite {
-        public IntegerDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Integer) receiver).doubleValue() - (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class IntegerFloat extends NumberNumberCallSite {
-        public IntegerFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Integer) receiver).doubleValue() - ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class IntegerLong extends NumberNumberCallSite {
-        public IntegerLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Integer) receiver).longValue() - (Long) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class IntegerInteger extends NumberNumberCallSite {
-        public IntegerInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                  return (Integer) receiver - (Integer) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class NumberNumber extends NumberNumberCallSite {
-        public NumberNumber(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object invoke(Object receiver, Object[] args) {
-            return math.subtractImpl((Number)receiver,(Number)args[0]);
-        }
-
-        public final Object invoke(Object receiver, Object arg) {
-            return math.subtractImpl((Number)receiver,(Number)arg);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMultiply.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMultiply.java
index 2adae511d7..a040743db0 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMultiply.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberMultiply.java
@@ -18,9 +18,6 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
-import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.typehandling.NumberMath;
 
 public final class NumberNumberMultiply extends NumberNumberMetaMethod {
@@ -34,405 +31,7 @@ public final class NumberNumberMultiply extends NumberNumberMetaMethod {
         return NumberMath.multiply((Number) object, (Number) arguments[0]);
     }
 
-    /**
-     * Multiply two Numbers.
-     *
-     * @param left  a Number
-     * @param right another Number
-     * @return the multiplication of both
-     */
-    //Note:  This method is NOT called if left AND right are both BigIntegers or BigDecimals because
-    //those classes implement a method with a better exact match.
     public static Number multiply(Number left, Number right) {
         return NumberMath.multiply(left, right);
     }
-
-
-    @Override
-    public CallSite createIntegerInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new IntegerInteger(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createIntegerLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new IntegerLong(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createIntegerFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new IntegerFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createIntegerDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new IntegerDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new LongInteger(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new LongLong(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new LongFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new LongDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatInteger(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatLong(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleInteger(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleLong(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createNumberNumber(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new NumberNumber(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    private static class DoubleDouble extends NumberNumberCallSite {
-        public DoubleDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver * (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class DoubleFloat extends NumberNumberCallSite {
-        public DoubleFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver * ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class DoubleLong extends NumberNumberCallSite {
-        public DoubleLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver * ((Long) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class DoubleInteger extends NumberNumberCallSite {
-        public DoubleInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver * (Integer) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatDouble extends NumberNumberCallSite {
-        public FloatDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() * (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatFloat extends NumberNumberCallSite {
-        public FloatFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() * ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatLong extends NumberNumberCallSite {
-        public FloatLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() * ((Long) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatInteger extends NumberNumberCallSite {
-        public FloatInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() * ((Integer) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class LongDouble extends NumberNumberCallSite {
-        public LongDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Long) receiver).doubleValue() * (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class LongFloat extends NumberNumberCallSite {
-        public LongFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Long) receiver).doubleValue() * ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class LongLong extends NumberNumberCallSite {
-        public LongLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Long) receiver * (Long) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class LongInteger extends NumberNumberCallSite {
-        public LongInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Long) receiver * ((Integer) arg).longValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class IntegerDouble extends NumberNumberCallSite {
-        public IntegerDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Integer) receiver).doubleValue() * (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class IntegerFloat extends NumberNumberCallSite {
-        public IntegerFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Integer) receiver).doubleValue() * ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class IntegerLong extends NumberNumberCallSite {
-        public IntegerLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Integer) receiver).longValue() * (Long) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class IntegerInteger extends NumberNumberCallSite {
-        public IntegerInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                  return (Integer) receiver * (Integer) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class NumberNumber extends NumberNumberCallSite {
-        public NumberNumber(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object invoke(Object receiver, Object[] args) {
-            return math.multiplyImpl((Number)receiver,(Number)args[0]);
-        }
-
-        public final Object invoke(Object receiver, Object arg) {
-            return math.multiplyImpl((Number)receiver,(Number)arg);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberPlus.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberPlus.java
index 605c61efc1..51b2877af4 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberPlus.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/NumberNumberPlus.java
@@ -18,9 +18,6 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
-import org.codehaus.groovy.runtime.callsite.CallSite;
 import org.codehaus.groovy.runtime.typehandling.NumberMath;
 
 public final class NumberNumberPlus extends NumberNumberMetaMethod {
@@ -44,387 +41,4 @@ public final class NumberNumberPlus extends NumberNumberMetaMethod {
     public static Number plus(Number left, Number right) {
         return NumberMath.add(left, right);
     }
-
-    @Override
-    public CallSite createIntegerInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new IntegerInteger(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createIntegerLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new IntegerLong(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createIntegerFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new IntegerFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createIntegerDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new IntegerDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new LongInteger(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new LongLong(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new LongFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createLongDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new LongDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatInteger(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatLong(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createFloatDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new FloatDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleInteger(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleLong(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleFloat(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createDoubleDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new DoubleDouble(site, metaClass, metaMethod, params, receiver, args);
-    }
-
-    @Override
-    public CallSite createNumberNumber(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        return new NumberNumberCallSite(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]) {
-            @Override
-            public Object invoke(Object receiver, Object[] args) {
-                return math.addImpl((Number) receiver, (Number) args[0]);
-            }
-
-            public Object invoke(Object receiver, Object arg) {
-                return math.addImpl((Number) receiver, (Number) arg);
-            }
-        };
-    }
-
-
-    private static class DoubleDouble extends NumberNumberCallSite {
-        public DoubleDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver + (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class DoubleFloat extends NumberNumberCallSite {
-        public DoubleFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver + ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class DoubleLong extends NumberNumberCallSite {
-        public DoubleLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver + ((Long) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class DoubleInteger extends NumberNumberCallSite {
-        public DoubleInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Double) receiver + (Integer) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatDouble extends NumberNumberCallSite {
-        public FloatDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() + (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatFloat extends NumberNumberCallSite {
-        public FloatFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() + ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatLong extends NumberNumberCallSite {
-        public FloatLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() + ((Long) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class FloatInteger extends NumberNumberCallSite {
-        public FloatInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Float) receiver).doubleValue() + ((Integer) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class LongDouble extends NumberNumberCallSite {
-        public LongDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Long) receiver).doubleValue() + (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class LongFloat extends NumberNumberCallSite {
-        public LongFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Long) receiver).doubleValue() + ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class LongLong extends NumberNumberCallSite {
-        public LongLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Long) receiver + (Long) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class LongInteger extends NumberNumberCallSite {
-        public LongInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Long) receiver + ((Integer) arg).longValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class IntegerDouble extends NumberNumberCallSite {
-        public IntegerDouble(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Integer) receiver).doubleValue() + (Double) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class IntegerFloat extends NumberNumberCallSite {
-        public IntegerFloat(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Integer) receiver).doubleValue() + ((Float) arg).doubleValue();
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class IntegerLong extends NumberNumberCallSite {
-        public IntegerLong(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return ((Integer) receiver).longValue() + (Long) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
-
-    private static class IntegerInteger extends NumberNumberCallSite {
-        public IntegerInteger(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-            super(site, metaClass, metaMethod, params, (Number) receiver, (Number) args[0]);
-        }
-
-        @Override
-        public final Object call(Object receiver, Object arg) throws Throwable {
-            try {
-                if (checkCall(receiver, arg)) {
-                    return (Integer) receiver + (Integer) arg;
-                }
-            }
-            catch (ClassCastException e) {//
-            }
-            return super.call(receiver, arg);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayMetaMethod.java
index c5cf781a65..c501cbea97 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ArrayMetaMethod.java
@@ -18,13 +18,14 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
+import groovy.lang.MetaMethod;
+
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSiteAwareMetaMethod;
 
 import java.lang.reflect.Modifier;
 
-public abstract class ArrayMetaMethod extends CallSiteAwareMetaMethod {
+public abstract class ArrayMetaMethod extends MetaMethod {
     protected static final CachedClass   INTEGER_CLASS = ReflectionCache.getCachedClass(Integer.class);
     protected static final CachedClass[] INTEGER_CLASS_ARR = {INTEGER_CLASS};
 
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayGetAtMetaMethod.java
index b54c508daf..ef0c84f2c4 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayGetAtMetaMethod.java
@@ -18,12 +18,8 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class BooleanArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
     private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(boolean[].class);
@@ -43,27 +39,4 @@ public class BooleanArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
         final boolean[] objects = (boolean[]) object;
         return objects[normaliseIndex((Integer) args[0], objects.length)];
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg) throws Throwable {
-            if ((receiver instanceof boolean[] objects && arg instanceof Integer)
-                    && checkPojoMetaClass()) {
-                return objects[normaliseIndex((Integer) arg, objects.length)];
-            } else
-                return super.call(receiver, arg);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayPutAtMetaMethod.java
index 354fc0646f..c58be9a22e 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/BooleanArrayPutAtMetaMethod.java
@@ -18,12 +18,8 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class BooleanArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
     private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(boolean[].class);
@@ -40,44 +36,4 @@ public class BooleanArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
         objects[index] = (Boolean) args[1];
         return null;
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer) || !(args[1] instanceof Boolean))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object[] args) throws Throwable {
-            if ((receiver instanceof boolean[] objects && args[0] instanceof Integer && args[1] instanceof Boolean)
-                    && checkPojoMetaClass()) {
-                objects[normaliseIndex((Integer) args[0], objects.length)] = (Boolean) args[1];
-                return null;
-            } else
-                return super.call(receiver, args);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg1, Object arg2) throws Throwable {
-            if (checkPojoMetaClass()) {
-                try {
-                    final boolean[] objects = (boolean[]) receiver;
-                    objects[normaliseIndex((Integer) arg1, objects.length)] = (Boolean) arg2;
-                    return null;
-                }
-                catch (ClassCastException e) {
-                    if ((receiver instanceof boolean[]) && (arg1 instanceof Integer))
-                        throw e;
-                }
-            }
-            return super.call(receiver, arg1, arg2);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayGetAtMetaMethod.java
index 745655e7fb..dd22693d6b 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayGetAtMetaMethod.java
@@ -18,12 +18,8 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class ByteArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
     private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(byte[].class);
@@ -43,27 +39,4 @@ public class ByteArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
         final byte[] objects = (byte[]) object;
         return objects[normaliseIndex((Integer) args[0], objects.length)];
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg) throws Throwable {
-            if ((receiver instanceof byte[] objects && arg instanceof Integer)
-                    && checkPojoMetaClass()) {
-                return objects[normaliseIndex((Integer) arg, objects.length)];
-            } else
-                return super.call(receiver, arg);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayPutAtMetaMethod.java
index df45a3c903..c79bf0cd21 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ByteArrayPutAtMetaMethod.java
@@ -18,12 +18,8 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class ByteArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
     private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(byte[].class);
@@ -44,44 +40,4 @@ public class ByteArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
             objects[index] = (Byte) args[1];
         return null;
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer) || !(args[1] instanceof Byte))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object[] args) throws Throwable {
-            if ((receiver instanceof byte[] objects && args[0] instanceof Integer && args[1] instanceof Byte)
-                    && checkPojoMetaClass()) {
-                objects[normaliseIndex((Integer) args[0], objects.length)] = (Byte) args[1];
-                return null;
-            } else
-                return super.call(receiver, args);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg1, Object arg2) throws Throwable {
-            if (checkPojoMetaClass()) {
-                try {
-                    final byte[] objects = (byte[]) receiver;
-                    objects[normaliseIndex((Integer) arg1, objects.length)] = (Byte) arg2;
-                    return null;
-                }
-                catch (ClassCastException e) {
-                    if ((receiver instanceof byte[]) && (arg1 instanceof Integer))
-                        throw e;
-                }
-            }
-            return super.call(receiver, arg1, arg2);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayGetAtMetaMethod.java
index ae58933352..19bc20d43a 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayGetAtMetaMethod.java
@@ -18,12 +18,8 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class CharacterArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
     private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(char[].class);
@@ -43,27 +39,4 @@ public class CharacterArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
         final char[] objects = (char[]) object;
         return objects[normaliseIndex((Integer) args[0], objects.length)];
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg) throws Throwable {
-            if ((receiver instanceof char[] objects && arg instanceof Integer)
-                    && checkPojoMetaClass()) {
-                return objects[normaliseIndex((Integer) arg, objects.length)];
-            } else
-                return super.call(receiver, arg);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayPutAtMetaMethod.java
index 7e3eee262c..d003d753ec 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/CharacterArrayPutAtMetaMethod.java
@@ -18,12 +18,8 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 import org.codehaus.groovy.runtime.typehandling.ShortTypeHandling;
 
 public class CharacterArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
@@ -41,44 +37,4 @@ public class CharacterArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
         objects[index] = ShortTypeHandling.castToChar(args[1]);
         return null;
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer) || !(args[1] instanceof Character))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object[] args) throws Throwable {
-            if ((receiver instanceof char[] objects && args[0] instanceof Integer && args[1] instanceof Character)
-                    && checkPojoMetaClass()) {
-                objects[normaliseIndex((Integer) args[0], objects.length)] = (Character) args[1];
-                return null;
-            } else
-                return super.call(receiver, args);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg1, Object arg2) throws Throwable {
-            if (checkPojoMetaClass()) {
-                try {
-                    final char[] objects = (char[]) receiver;
-                    objects[normaliseIndex((Integer) arg1, objects.length)] = (Character) arg2;
-                    return null;
-                }
-                catch (ClassCastException e) {
-                    if ((receiver instanceof char[]) && (arg1 instanceof Integer))
-                        throw e;
-                }
-            }
-            return super.call(receiver, arg1, arg2);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayGetAtMetaMethod.java
index 4ae556f940..ad8444d9df 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayGetAtMetaMethod.java
@@ -18,12 +18,8 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class DoubleArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
     private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(double[].class);
@@ -43,27 +39,4 @@ public class DoubleArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
         final double[] objects = (double[]) object;
         return objects[normaliseIndex((Integer) args[0], objects.length)];
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg) throws Throwable {
-            if ((receiver instanceof double[] objects && arg instanceof Integer)
-                    && checkPojoMetaClass()) {
-                return objects[normaliseIndex((Integer) arg, objects.length)];
-            } else
-                return super.call(receiver, arg);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayPutAtMetaMethod.java
index 469a3912fa..556b0767ff 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/DoubleArrayPutAtMetaMethod.java
@@ -19,12 +19,8 @@
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
 import groovy.lang.GString;
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 import org.codehaus.groovy.runtime.typehandling.ShortTypeHandling;
 
@@ -52,44 +48,4 @@ public class DoubleArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
             objects[index] = (Double) args[1];
         return null;
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer) || !(args[1] instanceof Double))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object[] args) throws Throwable {
-            if ((receiver instanceof double[] objects && args[0] instanceof Integer && args[1] instanceof Double)
-                    && checkPojoMetaClass()) {
-                objects[normaliseIndex((Integer) args[0], objects.length)] = (Double) args[1];
-                return null;
-            } else
-                return super.call(receiver, args);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg1, Object arg2) throws Throwable {
-            if (checkPojoMetaClass()) {
-                try {
-                    final double[] objects = (double[]) receiver;
-                    objects[normaliseIndex((Integer) arg1, objects.length)] = (Double) arg2;
-                    return null;
-                }
-                catch (ClassCastException e) {
-                    if ((receiver instanceof double[]) && (arg1 instanceof Integer))
-                        throw e;
-                }
-            }
-            return super.call(receiver, arg1, arg2);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayGetAtMetaMethod.java
index 64df6517a0..d3fa657a76 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayGetAtMetaMethod.java
@@ -18,12 +18,8 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class FloatArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
     private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(float[].class);
@@ -43,27 +39,4 @@ public class FloatArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
         final float[] objects = (float[]) object;
         return objects[normaliseIndex((Integer) args[0], objects.length)];
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg) throws Throwable {
-            if ((receiver instanceof float[] objects && arg instanceof Integer)
-                    && checkPojoMetaClass()) {
-                return objects[normaliseIndex((Integer) arg, objects.length)];
-            } else
-                return super.call(receiver, arg);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayPutAtMetaMethod.java
index 97bbfe2569..0d61d41678 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/FloatArrayPutAtMetaMethod.java
@@ -19,12 +19,8 @@
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
 import groovy.lang.GString;
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 import org.codehaus.groovy.runtime.typehandling.ShortTypeHandling;
 
@@ -52,44 +48,4 @@ public class FloatArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
             objects[index] = (Float) args[1];
         return null;
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer) || !(args[1] instanceof Float))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object[] args) throws Throwable {
-            if ((receiver instanceof float[] objects && args[0] instanceof Integer && args[1] instanceof Float)
-                    && checkPojoMetaClass()) {
-                objects[normaliseIndex((Integer) args[0], objects.length)] = (Float) args[1];
-                return null;
-            } else
-                return super.call(receiver, args);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg1, Object arg2) throws Throwable {
-            if (checkPojoMetaClass()) {
-                try {
-                    final float[] objects = (float[]) receiver;
-                    objects[normaliseIndex((Integer) arg1, objects.length)] = (Float) arg2;
-                    return null;
-                }
-                catch (ClassCastException e) {
-                    if ((receiver instanceof float[]) && (arg1 instanceof Integer))
-                        throw e;
-                }
-            }
-            return super.call(receiver, arg1, arg2);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayGetAtMetaMethod.java
index 07e6f01445..fbef45a255 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayGetAtMetaMethod.java
@@ -18,12 +18,8 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class IntegerArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
     private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(int[].class);
@@ -43,27 +39,4 @@ public class IntegerArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
         final int[] objects = (int[]) object;
         return objects[normaliseIndex((Integer) args[0], objects.length)];
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg) throws Throwable {
-            if ((receiver instanceof int[] objects && arg instanceof Integer)
-                    && checkPojoMetaClass()) {
-                return objects[normaliseIndex((Integer) arg, objects.length)];
-            } else
-                return super.call(receiver, arg);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayPutAtMetaMethod.java
index 144f386153..fe382a3f22 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/IntegerArrayPutAtMetaMethod.java
@@ -19,12 +19,8 @@
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
 import groovy.lang.GString;
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 import org.codehaus.groovy.runtime.typehandling.ShortTypeHandling;
 
@@ -52,44 +48,4 @@ public class IntegerArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
             objects[index] = (Integer) args[1];
         return null;
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer) || !(args[1] instanceof Integer))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object[] args) throws Throwable {
-            if ((receiver instanceof int[] objects && args[0] instanceof Integer && args[1] instanceof Integer)
-                    && checkPojoMetaClass()) {
-                objects[normaliseIndex((Integer) args[0], objects.length)] = (Integer) args[1];
-                return null;
-            } else
-                return super.call(receiver, args);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg1, Object arg2) throws Throwable {
-            if (checkPojoMetaClass()) {
-                try {
-                    final int[] objects = (int[]) receiver;
-                    objects[normaliseIndex((Integer) arg1, objects.length)] = (Integer) arg2;
-                    return null;
-                }
-                catch (ClassCastException e) {
-                    if ((receiver instanceof int[]) && (arg1 instanceof Integer))
-                        throw e;
-                }
-            }
-            return super.call(receiver, arg1, arg2);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayGetAtMetaMethod.java
index 9ab8194e95..18f673d873 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayGetAtMetaMethod.java
@@ -18,12 +18,8 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class LongArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
     private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(long[].class);
@@ -43,27 +39,4 @@ public class LongArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
         final long[] objects = (long[]) object;
         return objects[normaliseIndex((Integer) args[0], objects.length)];
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg) throws Throwable {
-            if ((receiver instanceof long[] objects && arg instanceof Integer)
-                    && checkPojoMetaClass()) {
-                return objects[normaliseIndex((Integer) arg, objects.length)];
-            } else
-                return super.call(receiver, arg);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayPutAtMetaMethod.java
index 350b2bb304..9722946e4b 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/LongArrayPutAtMetaMethod.java
@@ -19,12 +19,8 @@
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
 import groovy.lang.GString;
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 import org.codehaus.groovy.runtime.typehandling.ShortTypeHandling;
 
@@ -52,44 +48,4 @@ public class LongArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
             objects[index] = (Long) args[1];
         return null;
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer) || !(args[1] instanceof Long))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object[] args) throws Throwable {
-            if ((receiver instanceof long[] objects && args[0] instanceof Integer && args[1] instanceof Long)
-                    && checkPojoMetaClass()) {
-                objects[normaliseIndex((Integer) args[0], objects.length)] = (Long) args[1];
-                return null;
-            } else
-                return super.call(receiver, args);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg1, Object arg2) throws Throwable {
-            if (checkPojoMetaClass()) {
-                try {
-                    final long[] objects = (long[]) receiver;
-                    objects[normaliseIndex((Integer) arg1, objects.length)] = (Long) arg2;
-                    return null;
-                }
-                catch (ClassCastException e) {
-                    if ((receiver instanceof long[]) && (arg1 instanceof Integer))
-                        throw e;
-                }
-            }
-            return super.call(receiver, arg1, arg2);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayGetAtMetaMethod.java
index e2e9fc8464..bb82680ac8 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayGetAtMetaMethod.java
@@ -18,11 +18,7 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 import static org.codehaus.groovy.reflection.ReflectionCache.OBJECT_ARRAY_CLASS;
 
@@ -43,33 +39,4 @@ public class ObjectArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
         final Object[] objects = (Object[]) object;
         return objects[normaliseIndex((Integer) arguments[0], objects.length)];
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg) throws Throwable {
-            if (checkPojoMetaClass()) {
-                try {
-                    final Object[] objects = (Object[]) receiver;
-                    return objects[normaliseIndex((Integer) arg, objects.length)];
-                }
-                catch (ClassCastException e) {
-                    if ((receiver instanceof Object[]) && (arg instanceof Integer))
-                        throw e;
-                }
-            }
-            return super.call(receiver, arg);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java
index 538624c5f2..60ed8b9a6a 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ObjectArrayPutAtMetaMethod.java
@@ -19,11 +19,7 @@
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
 import groovy.lang.GString;
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 import org.codehaus.groovy.runtime.typehandling.ShortTypeHandling;
 
@@ -65,30 +61,4 @@ public class ObjectArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
         }
         return adjustedNewVal;
     }
-
-    @Override
-    public CallSite createPojoCallSite(final CallSite site, final MetaClassImpl metaClass, final MetaMethod metaMethod, final Class[] params, final Object receiver, final Object[] args) {
-        if (!(args[0] instanceof Integer)) {
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        } else {
-            return new PojoMetaMethodSite(site, metaClass, metaMethod, params) {
-                @Override
-                public Object call(final Object receiver, final Object index, final Object value) throws Throwable {
-                    if (checkPojoMetaClass()) {
-                        try {
-                            Object[] array = (Object[]) receiver;
-                            array[normaliseIndex((Integer) index, array.length)] = adjustNewValue(array, value);
-                            return null;
-                        }
-                        catch (ClassCastException e) {
-                            if ((receiver instanceof Object[]) && (index instanceof Integer)) {
-                                throw e;
-                            }
-                        }
-                    }
-                    return super.call(receiver, index, value);
-                }
-            };
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayGetAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayGetAtMetaMethod.java
index ee80bbbdc8..1acb5e4fe1 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayGetAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayGetAtMetaMethod.java
@@ -18,12 +18,8 @@
  */
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 
 public class ShortArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
     private static final CachedClass ARRAY_CLASS = ReflectionCache.getCachedClass(short[].class);
@@ -43,27 +39,4 @@ public class ShortArrayGetAtMetaMethod extends ArrayGetAtMetaMethod {
         final short[] objects = (short[]) object;
         return objects[normaliseIndex((Integer) args[0], objects.length)];
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg) throws Throwable {
-            if ((receiver instanceof short[] objects && arg instanceof Integer)
-                    && checkPojoMetaClass()) {
-                return objects[normaliseIndex((Integer) arg, objects.length)];
-            } else
-                return super.call(receiver, arg);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayPutAtMetaMethod.java b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayPutAtMetaMethod.java
index bb3bdc9965..7815499baa 100644
--- a/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayPutAtMetaMethod.java
+++ b/src/main/java/org/codehaus/groovy/runtime/dgmimpl/arrays/ShortArrayPutAtMetaMethod.java
@@ -19,12 +19,8 @@
 package org.codehaus.groovy.runtime.dgmimpl.arrays;
 
 import groovy.lang.GString;
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.ReflectionCache;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite;
 import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
 import org.codehaus.groovy.runtime.typehandling.ShortTypeHandling;
 
@@ -52,44 +48,4 @@ public class ShortArrayPutAtMetaMethod extends ArrayPutAtMetaMethod {
             objects[index] = (Short) args[1];
         return null;
     }
-
-    @Override
-    public CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (!(args[0] instanceof Integer) || !(args[1] instanceof Short))
-            return PojoMetaMethodSite.createNonAwareCallSite(site, metaClass, metaMethod, params, args);
-        else
-            return new MyPojoMetaMethodSite(site, metaClass, metaMethod, params);
-    }
-
-    private static class MyPojoMetaMethodSite extends PojoMetaMethodSite {
-        public MyPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params) {
-            super(site, metaClass, metaMethod, params);
-        }
-
-        @Override
-        public Object call(Object receiver, Object[] args) throws Throwable {
-            if ((receiver instanceof short[] objects && args[0] instanceof Integer && args[1] instanceof Short)
-                    && checkPojoMetaClass()) {
-                objects[normaliseIndex((Integer) args[0], objects.length)] = (Short) args[1];
-                return null;
-            } else
-                return super.call(receiver, args);
-        }
-
-        @Override
-        public Object call(Object receiver, Object arg1, Object arg2) throws Throwable {
-            if (checkPojoMetaClass()) {
-                try {
-                    final short[] objects = (short[]) receiver;
-                    objects[normaliseIndex((Integer) arg1, objects.length)] = (Short) arg2;
-                    return null;
-                }
-                catch (ClassCastException e) {
-                    if ((receiver instanceof short[]) && (arg1 instanceof Integer))
-                        throw e;
-                }
-            }
-            return super.call(receiver, arg1, arg2);
-        }
-    }
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/metaclass/ClosureMetaClass.java b/src/main/java/org/codehaus/groovy/runtime/metaclass/ClosureMetaClass.java
index b4ca706435..0be44ccece 100644
--- a/src/main/java/org/codehaus/groovy/runtime/metaclass/ClosureMetaClass.java
+++ b/src/main/java/org/codehaus/groovy/runtime/metaclass/ClosureMetaClass.java
@@ -38,8 +38,6 @@ import org.codehaus.groovy.reflection.ParameterTypes;
 import org.codehaus.groovy.runtime.GeneratedClosure;
 import org.codehaus.groovy.runtime.InvokerHelper;
 import org.codehaus.groovy.runtime.MetaClassHelper;
-import org.codehaus.groovy.runtime.callsite.CallSite;
-import org.codehaus.groovy.runtime.callsite.PogoMetaClassSite;
 import org.codehaus.groovy.runtime.wrappers.Wrapper;
 import org.codehaus.groovy.util.FastArray;
 
@@ -813,48 +811,6 @@ public final class ClosureMetaClass extends MetaClassImpl {
         throw new UnsupportedOperationException();
     }
 
-    /**
-     * Creates a POJO (Plain Old Java Object) call site for this metaclass.
-     * This operation is not supported for ClosureMetaClass.
-     *
-     * @param site the call site
-     * @param receiver the receiver object
-     * @param args the arguments
-     * @return never returns; always throws UnsupportedOperationException
-     * @throws UnsupportedOperationException this method is not supported for closures
-     */
-    @Override
-    public CallSite createPojoCallSite(final CallSite site, final Object receiver, final Object[] args) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * Creates a POGO (Plain Old Groovy Object) call site for this metaclass.
-     * Provides optimized method invocation for POGO objects.
-     *
-     * @param site the call site
-     * @param args the arguments
-     * @return a POGO-specific call site
-     */
-    @Override
-    public CallSite createPogoCallSite(final CallSite site, final Object[] args) {
-        return new PogoMetaClassSite(site, this);
-    }
-
-    /**
-     * Creates a POGO call site for the current class context.
-     * Provides optimized method invocation for POGO objects within a specific class context.
-     *
-     * @param site the call site
-     * @param sender the class sending the call
-     * @param args the arguments
-     * @return a POGO-specific call site
-     */
-    @Override
-    public CallSite createPogoCallCurrentSite(final CallSite site, final Class sender, final Object[] args) {
-        return new PogoMetaClassSite(site, this);
-    }
-
     /**
      * Checks if this metaclass responds to the given method name with the specified argument types.
      * Returns a list of methods that match the given name and signature.
diff --git a/src/test/groovy/bugs/Groovy12185.groovy b/src/test/groovy/bugs/Groovy12185.groovy
new file mode 100644
index 0000000000..53392690f0
--- /dev/null
+++ b/src/test/groovy/bugs/Groovy12185.groovy
@@ -0,0 +1,177 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package bugs
+
+
+import org.codehaus.groovy.control.CompilationFailedException
+import org.codehaus.groovy.control.CompilerConfiguration
+import org.codehaus.groovy.runtime.BooleanClosureWrapper
+import org.codehaus.groovy.runtime.dgmimpl.NumberNumberPlus
+import org.codehaus.groovy.runtime.dgmimpl.arrays.IntegerArrayGetAtMetaMethod
+import org.junit.jupiter.api.Test
+
+/**
+ * GROOVY-12185: classic call-site runtime lives in optional groovy-callsite;
+ * core uses invokedynamic by default and keeps DGM invoke() paths.
+ */
+final class Groovy12185 {
+
+    @Test
+    void testIndyIsDefaultAndDoesNotReferenceCallSiteArray() {
+        def config = new CompilerConfiguration()
+        assert config.isIndyEnabled()
+        def gcl = new GroovyClassLoader(Thread.currentThread().contextClassLoader, config)
+        def clazz = gcl.parseClass('class C { def m(x) { x.toString() } }')
+        assert !clazz.declaredMethods*.name.contains('$getCallSiteArray')
+        assert clazz.newInstance().m(123) == '123'
+    }
+
+    @Test
+    void testClassicCompilationUsesCallSiteArrayWhenIndyDisabled() {
+        def config = new CompilerConfiguration(optimizationOptions: [indy: false])
+        assert !config.isIndyEnabled()
+        def gcl = new GroovyClassLoader(Thread.currentThread().contextClassLoader, config)
+        def clazz = gcl.parseClass('class ClassicC { def m(x) { x.toString() } }')
+        assert clazz.declaredMethods*.name.contains('$getCallSiteArray')
+        // Requires groovy-callsite on test runtime classpath
+        assert clazz.newInstance().m(99) == '99'
+    }
+
+    /**
+     * Primary purpose of groovy-callsite: classes compiled in classic mode
+     * (the shape emitted by Groovy 4/5 with indy disabled, and by pre-indy
+     * releases) must load and execute against Groovy 6 core + groovy-callsite.
+     * Covers POGO / POJO / static / ctor / property / safe-nav / numbers /
+     * arrays / closures, including a second pass that uses warmed call sites.
+     */
+    @Test
+    void testClassicBytecodeSurfaceCompatibleWithGroovy4And5Shape() {
+        def config = new CompilerConfiguration(optimizationOptions: [indy: false])
+        def gcl = new GroovyClassLoader(Thread.currentThread().contextClassLoader, config)
+        def clazz = gcl.parseClass('''
+            class ClassicCompat {
+                String name
+                int n
+                ClassicCompat(String name, int n) { this.name = name; this.n = n }
+                def greet(String who) { "hello $who from $name" }
+                def selfCall() { greet('self') }
+                static String tag(String s) { "TAG:$s" }
+                def runAll() {
+                    def list = []
+                    list << greet('world')
+                    list << selfCall()
+                    list << tag('x')
+                    def other = new ClassicCompat('other', 7)
+                    list << other.name
+                    list << this.name
+                    list << 42.toString()
+                    list << (1 + 2)
+                    int[] arr = [10, 20, 30] as int[]
+                    list << arr[1]
+                    ClassicCompat nil = null
+                    list << nil?.greet('z')
+                    def c = { a, b -> a + b }
+                    list << c(3, 4)
+                    list << ('ab' * 2)
+                    list << [9, 8, 7][0]
+                    return list
+                }
+            }
+        ''')
+        assert clazz.declaredMethods*.name.contains('$getCallSiteArray')
+        def instance = clazz.getConstructor(String, int).newInstance('main', 1)
+        2.times {
+            def result = instance.runAll()
+            assert result[0] == 'hello world from main'
+            assert result[1] == 'hello self from main'
+            assert result[2] == 'TAG:x'
+            assert result[3] == 'other'
+            assert result[4] == 'main'
+            assert result[5] == '42'
+            assert result[6] == 3
+            assert result[7] == 20
+            assert result[8] == null
+            assert result[9] == 7
+            assert result[10] == 'abab'
+            assert result[11] == 9
+        }
+    }
+
+    @Test
+    void testClassicCompilationFailsFastWithoutCallSiteRuntime() {
+        def config = new CompilerConfiguration(optimizationOptions: [indy: false])
+        // Hide classic call-site types from the compilation class loader so
+        // WriterController's classpath check fails before bytecode is emitted.
+        def gcl = new GroovyClassLoader(Thread.currentThread().contextClassLoader, config) {
+            @Override
+            Class loadClass(String name, boolean lookupScriptFiles, boolean preferClassOverScript, boolean resolve)
+                    throws ClassNotFoundException, CompilationFailedException {
+                if (name.startsWith('org.codehaus.groovy.runtime.callsite.')) {
+                    throw new ClassNotFoundException(name)
+                }
+                return super.loadClass(name, lookupScriptFiles, preferClassOverScript, resolve)
+            }
+        }
+        try {
+            gcl.parseClass('class X { def m() { 1 } }')
+            assert false: 'expected failure when classic call-site runtime is missing'
+        } catch (Throwable t) {
+            def msg = rootMessage(t)
+            assert msg.contains('groovy-callsite') || msg.contains('CallSiteArray') || msg.contains('Classic call-site'):
+                    "unexpected failure: $msg"
+        }
+    }
+
+    @Test
+    void testNumberAndArrayMetaMethodsInvokePathsRemainInCore() {
+        def plus = new NumberNumberPlus()
+        assert plus.invoke(1, [2] as Object[]) == 3
+
+        def getAt = new IntegerArrayGetAtMetaMethod()
+        int[] arr = [10, 20, 30] as int[]
+        assert getAt.invoke(arr, [1] as Object[]) == 20
+    }
+
+    @Test
+    void testBooleanClosureWrapperRemainsInCore() {
+        def bcw = new BooleanClosureWrapper({ it > 0 })
+        assert bcw.call(1)
+        assert !bcw.call(-1)
+    }
+
+    @Test
+    void testMetaClassImplPublicSelectionApi() {
+        def mc = (MetaClassImpl) GroovySystem.metaClassRegistry.getMetaClass(String)
+        def method = mc.getMethodWithCaching(String, 'length', [] as Class[])
+        assert method != null
+        assert method.name == 'length'
+
+        def ctor = mc.chooseConstructor([String] as Class[])
+        assert ctor != null
+        assert ctor.doConstructorInvoke(['hi'] as Object[]).toString() == 'hi'
+    }
+
+    private static String rootMessage(Throwable t) {
+        def cur = t
+        while (cur.cause != null && !cur.cause.is(cur)) {
+            cur = cur.cause
+        }
+        return (t.message ?: '') + ' / ' + (cur.message ?: '') + ' / ' + t.toString()
+    }
+}
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteAwareMetaMethod.java b/subprojects/groovy-callsite/build.gradle
similarity index 57%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteAwareMetaMethod.java
rename to subprojects/groovy-callsite/build.gradle
index 42fa7641a1..6c366a4282 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteAwareMetaMethod.java
+++ b/subprojects/groovy-callsite/build.gradle
@@ -16,12 +16,24 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.codehaus.groovy.runtime.callsite;
+plugins {
+    id 'org.apache.groovy-library'
+}
 
-import groovy.lang.MetaClassImpl;
-import groovy.lang.MetaMethod;
+dependencies {
+    // Classic call-site caching runtime; depends on core, never the reverse.
+    api rootProject
+    testImplementation projects.groovyTest
+}
 
-public abstract class CallSiteAwareMetaMethod extends MetaMethod{
+groovyLibrary {
+    // Optional / deprecated compatibility module — not part of groovy-all.
+    optionalModule()
+    // Classes lived in core before Groovy 6; japicmp against 5.x is not applicable.
+    withoutBinaryCompatibilityChecks()
+}
 
-    public abstract CallSite createPojoCallSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args);
+// The whole module is deprecated; avoid noisy self-deprecation compile warnings.
+tasks.withType(JavaCompile).configureEach {
+    options.compilerArgs << '-Xlint:-deprecation'
 }
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/AbstractCallSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/AbstractCallSite.java
similarity index 99%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/AbstractCallSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/AbstractCallSite.java
index e191fdd6e0..141b64c433 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/AbstractCallSite.java
+++ b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/AbstractCallSite.java
@@ -39,6 +39,7 @@ import java.lang.reflect.Method;
 /**
  * Base class for all call sites.
  */
+@Deprecated
 public class AbstractCallSite implements CallSite {
 
     protected final int index;
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/BooleanClosureForMapPredicate.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/BooleanClosureForMapPredicate.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/BooleanClosureForMapPredicate.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/BooleanClosureForMapPredicate.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/BooleanClosurePredicate.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/BooleanClosurePredicate.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/BooleanClosurePredicate.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/BooleanClosurePredicate.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/BooleanClosureWrapper.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/BooleanClosureWrapper.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/BooleanClosureWrapper.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/BooleanClosureWrapper.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/BooleanReturningMethodInvoker.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/BooleanReturningMethodInvoker.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/BooleanReturningMethodInvoker.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/BooleanReturningMethodInvoker.java
diff --git a/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CachedMethodCallSites.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CachedMethodCallSites.java
new file mode 100644
index 0000000000..0062d92087
--- /dev/null
+++ b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CachedMethodCallSites.java
@@ -0,0 +1,152 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.codehaus.groovy.runtime.callsite;
+
+import groovy.lang.MetaClassImpl;
+import org.codehaus.groovy.reflection.CachedMethod;
+
+import java.lang.ref.SoftReference;
+import java.lang.reflect.Constructor;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
+
+/**
+ * Creates optimized call sites for {@link CachedMethod} instances.
+ * Logic formerly lived on {@link CachedMethod} in groovy-core.
+ * <p>
+ * Per-method compile state is held in a side map (not on {@code CachedMethod})
+ * so groovy-core reflection metadata stays free of classic call-site concerns.
+ * State mutations for a given method are synchronized on that method's state
+ * object.
+ *
+ * @since 6.0.0
+ * @deprecated Classic call-site caching is deprecated; prefer invokedynamic.
+ */
+@Deprecated
+public final class CachedMethodCallSites {
+
+    private static final ConcurrentHashMap<CachedMethod, State> STATES = new ConcurrentHashMap<>();
+
+    private CachedMethodCallSites() {
+    }
+
+    private static State state(final CachedMethod method) {
+        return STATES.computeIfAbsent(method, m -> new State());
+    }
+
+    /**
+     * Creates an optimized POGO call site, compiling a specialized site class when possible.
+     */
+    public static CallSite createPogoMetaMethodSite(final CachedMethod method, final CallSite site,
+                                                    final MetaClassImpl metaClass, final Class[] params) {
+        return create(method, site, metaClass, params,
+                CallSiteGenerator::compilePogoMethod,
+                PogoMetaMethodSite.PogoCachedMethodSiteNoUnwrapNoCoerce::new,
+                Kind.POGO);
+    }
+
+    /**
+     * Creates an optimized POJO call site, compiling a specialized site class when possible.
+     */
+    public static CallSite createPojoMetaMethodSite(final CachedMethod method, final CallSite site,
+                                                    final MetaClassImpl metaClass, final Class[] params) {
+        return create(method, site, metaClass, params,
+                CallSiteGenerator::compilePojoMethod,
+                PojoMetaMethodSite.PojoCachedMethodSiteNoUnwrapNoCoerce::new,
+                Kind.POJO);
+    }
+
+    /**
+     * Creates an optimized static call site, compiling a specialized site class when possible.
+     */
+    public static CallSite createStaticMetaMethodSite(final CachedMethod method, final CallSite site,
+                                                      final MetaClassImpl metaClass, final Class[] params) {
+        return create(method, site, metaClass, params,
+                CallSiteGenerator::compileStaticMethod,
+                StaticMetaMethodSite.StaticMetaMethodSiteNoUnwrapNoCoerce::new,
+                Kind.STATIC);
+    }
+
+    private static CallSite create(final CachedMethod method, final CallSite site,
+                                   final MetaClassImpl metaClass, final Class[] params,
+                                   final Function<CachedMethod, Constructor> compiler,
+                                   final FallbackSiteFactory fallback, final Kind kind) {
+        State st = state(method);
+        synchronized (st) {
+            if (!st.skipCompiled) {
+                Constructor<CallSite> ctor = st.get(kind);
+                if (ctor == null) {
+                    if (CallSiteGenerator.isCompilable(method)) {
+                        @SuppressWarnings("unchecked")
+                        Constructor<CallSite> compiled = compiler.apply(method);
+                        ctor = compiled;
+                    }
+                    if (ctor != null) {
+                        st.set(kind, ctor);
+                    } else {
+                        st.skipCompiled = true;
+                    }
+                }
+                if (ctor != null) {
+                    try {
+                        return ctor.newInstance(site, metaClass, method, params, ctor);
+                    } catch (Error e) {
+                        st.skipCompiled = true;
+                        throw e;
+                    } catch (Throwable e) {
+                        st.skipCompiled = true;
+                    }
+                }
+            }
+        }
+        return fallback.create(site, metaClass, method, params);
+    }
+
+    private enum Kind { POGO, POJO, STATIC }
+
+    @FunctionalInterface
+    private interface FallbackSiteFactory {
+        CallSite create(CallSite site, MetaClassImpl metaClass, CachedMethod method, Class[] params);
+    }
+
+    private static final class State {
+        private SoftReference<Constructor<CallSite>> pogo;
+        private SoftReference<Constructor<CallSite>> pojo;
+        private SoftReference<Constructor<CallSite>> staticCtor;
+        boolean skipCompiled;
+
+        Constructor<CallSite> get(final Kind kind) {
+            SoftReference<Constructor<CallSite>> ref = switch (kind) {
+                case POGO -> pogo;
+                case POJO -> pojo;
+                case STATIC -> staticCtor;
+            };
+            return ref != null ? ref.get() : null;
+        }
+
+        void set(final Kind kind, final Constructor<CallSite> ctor) {
+            SoftReference<Constructor<CallSite>> ref = new SoftReference<>(ctor);
+            switch (kind) {
+                case POGO -> pogo = ref;
+                case POJO -> pojo = ref;
+                case STATIC -> staticCtor = ref;
+            }
+        }
+    }
+}
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSite.java
similarity index 99%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/CallSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSite.java
index 7382dad9f2..012f6b0f77 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSite.java
+++ b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSite.java
@@ -21,6 +21,7 @@ package org.codehaus.groovy.runtime.callsite;
 import groovy.lang.GroovyObject;
 
 
+@Deprecated
 public interface CallSite {
     CallSiteArray getArray();
     int getIndex();
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteArray.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteArray.java
similarity index 92%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteArray.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteArray.java
index b411a5ecdc..0bdf0f1d07 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteArray.java
+++ b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteArray.java
@@ -28,6 +28,7 @@ import org.codehaus.groovy.runtime.InvokerHelper;
 
 import java.util.stream.IntStream;
 
+@Deprecated
 public final class CallSiteArray {
     public static final Object[] NOPARAM = new Object[0];
     public final CallSite[] array;
@@ -65,7 +66,7 @@ public final class CallSiteArray {
         MetaClass metaClass = InvokerHelper.getMetaClass(receiver);
         CallSite site =
                 metaClass instanceof MetaClassImpl
-                        ? ((MetaClassImpl) metaClass).createStaticSite(callSite, args)
+                        ? MetaClassCallSites.createStaticSite((MetaClassImpl) metaClass, callSite, args)
                         : new StaticMetaClassSite(callSite, metaClass);
 
         replaceCallSite(callSite, site);
@@ -76,7 +77,7 @@ public final class CallSiteArray {
         MetaClass metaClass = InvokerHelper.getMetaClass(receiver);
         CallSite site =
                 metaClass instanceof MetaClassImpl
-                        ? ((MetaClassImpl) metaClass).createConstructorSite(callSite, args)
+                        ? MetaClassCallSites.createConstructorSite((MetaClassImpl) metaClass, callSite, args)
                         : new MetaClassConstructorSite(callSite, metaClass);
 
         replaceCallSite(callSite, site);
@@ -93,7 +94,7 @@ public final class CallSiteArray {
             if (receiver.getClass() != theClass && !theClass.isInterface()) {
                 site = new PogoInterceptableSite(callSite);
             } else if (metaClass instanceof MetaClassImpl) {
-                site = ((MetaClassImpl) metaClass).createPogoCallCurrentSite(callSite, sender, args);
+                site = MetaClassCallSites.createPogoCallCurrentSite((MetaClassImpl) metaClass, callSite, sender, args);
             } else {
                 site = new PogoMetaClassSite(callSite, metaClass);
             }
@@ -113,7 +114,7 @@ public final class CallSiteArray {
             if (info.hasPerInstanceMetaClasses()) {
                 return new PerInstancePojoMetaClassSite(callSite, info);
             } else {
-                return mci.createPojoCallSite(callSite, receiver, args);
+                return MetaClassCallSites.createPojoCallSite(mci, callSite, receiver, args);
             }
         }
 
@@ -133,7 +134,7 @@ public final class CallSiteArray {
         MetaClass metaClass = ((GroovyObject)receiver).getMetaClass();
 
         if (metaClass instanceof MetaClassImpl) {
-            return ((MetaClassImpl)metaClass).createPogoCallSite(callSite, args);
+            return MetaClassCallSites.createPogoCallSite((MetaClassImpl) metaClass, callSite, args);
         }
 
         return new PogoMetaClassSite(callSite, metaClass);
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteClassLoader.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteClassLoader.java
similarity index 99%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteClassLoader.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteClassLoader.java
index dcf9a07195..5573038b8f 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteClassLoader.java
+++ b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteClassLoader.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
+@Deprecated
 public class CallSiteClassLoader extends ClassLoaderForClassArtifacts {
 
     private static final Set<String> KNOWN_CLASSES = new HashSet<String>();
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
similarity index 91%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
index e91e51387d..b51f1bbd3e 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
+++ b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/CallSiteGenerator.java
@@ -22,6 +22,8 @@ import org.codehaus.groovy.classgen.GeneratorContext;
 import org.codehaus.groovy.classgen.asm.BytecodeHelper;
 import org.codehaus.groovy.classgen.asm.util.TypeUtil;
 import org.codehaus.groovy.control.CompilerConfiguration;
+import groovy.lang.MetaClassImpl;
+import groovy.lang.MetaMethod;
 import org.codehaus.groovy.reflection.CachedClass;
 import org.codehaus.groovy.reflection.CachedMethod;
 import org.codehaus.groovy.reflection.android.AndroidSupport;
@@ -32,12 +34,28 @@ import org.objectweb.asm.Opcodes;
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Modifier;
+import java.util.Collections;
+import java.util.Map;
+import java.util.WeakHashMap;
 
+/**
+ * Generates specialized call-site classes for the classic (non-indy) call-site cache.
+ *
+ * @deprecated Classic call-site caching is deprecated; prefer invokedynamic.
+ */
+@Deprecated
 public class CallSiteGenerator {
 
+    private static final Map<Class<?>, CallSiteClassLoader> LOADERS =
+            Collections.synchronizedMap(new WeakHashMap<>());
+
     private CallSiteGenerator() {
     }
 
+    private static CallSiteClassLoader loaderFor(final CachedClass declClass) {
+        return LOADERS.computeIfAbsent(declClass.getTheClass(), CallSiteClassLoader::new);
+    }
+
     private static MethodVisitor writeMethod(ClassWriter cw, String name, int argumentCount, final String superClass, CachedMethod cachedMethod, String receiverType, String parameterDescription, boolean useArray) {
         MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "call" + name, "(L" + receiverType + ";" + parameterDescription + ")Ljava/lang/Object;", null, null);
         mv.visitCode();
@@ -219,36 +237,39 @@ public class CallSiteGenerator {
         ClassWriter cw = makeClassWriter();
 
         final CachedClass declClass = cachedMethod.getDeclaringClass();
-        final CallSiteClassLoader callSiteLoader = declClass.getCallSiteLoader();
+        final CallSiteClassLoader callSiteLoader = loaderFor(declClass);
         final String name = callSiteLoader.createClassName(cachedMethod.getName());
 
         final byte[] bytes = genPogoMetaMethodSite(cachedMethod, cw, name);
 
-        return callSiteLoader.defineClassAndGetConstructor(name, bytes);
+        return callSiteLoader.defineClassAndGetConstructor(name, bytes,
+                CallSite.class, MetaClassImpl.class, MetaMethod.class, Class[].class, Constructor.class);
     }
 
     public static Constructor compilePojoMethod(CachedMethod cachedMethod) {
         ClassWriter cw = makeClassWriter();
 
         final CachedClass declClass = cachedMethod.getDeclaringClass();
-        final CallSiteClassLoader callSiteLoader = declClass.getCallSiteLoader();
+        final CallSiteClassLoader callSiteLoader = loaderFor(declClass);
         final String name = callSiteLoader.createClassName(cachedMethod.getName());
 
         final byte[] bytes = genPojoMetaMethodSite(cachedMethod, cw, name);
 
-        return callSiteLoader.defineClassAndGetConstructor(name, bytes);
+        return callSiteLoader.defineClassAndGetConstructor(name, bytes,
+                CallSite.class, MetaClassImpl.class, MetaMethod.class, Class[].class, Constructor.class);
     }
 
     public static Constructor compileStaticMethod(CachedMethod cachedMethod) {
         ClassWriter cw = makeClassWriter();
 
         final CachedClass declClass = cachedMethod.getDeclaringClass();
-        final CallSiteClassLoader callSiteLoader = declClass.getCallSiteLoader();
+        final CallSiteClassLoader callSiteLoader = loaderFor(declClass);
         final String name = callSiteLoader.createClassName(cachedMethod.getName());
 
         final byte[] bytes = genStaticMetaMethodSite(cachedMethod, cw, name);
 
-        return callSiteLoader.defineClassAndGetConstructor(name, bytes);
+        return callSiteLoader.defineClassAndGetConstructor(name, bytes,
+                CallSite.class, MetaClassImpl.class, MetaMethod.class, Class[].class, Constructor.class);
     }
 
     public static boolean isCompilable (CachedMethod method) {
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/ClassMetaClassGetPropertySite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/ClassMetaClassGetPropertySite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/ClassMetaClassGetPropertySite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/ClassMetaClassGetPropertySite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/ConstructorMetaClassSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/ConstructorMetaClassSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/ConstructorMetaClassSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/ConstructorMetaClassSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/ConstructorMetaMethodSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/ConstructorMetaMethodSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/ConstructorMetaMethodSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/ConstructorMetaMethodSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/ConstructorSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/ConstructorSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/ConstructorSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/ConstructorSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePogoFieldSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePogoFieldSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePogoFieldSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePogoFieldSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePogoPropertySite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePogoPropertySite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePogoPropertySite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePogoPropertySite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePojoFieldSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePojoFieldSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePojoFieldSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePojoFieldSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePojoPropertySite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePojoPropertySite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePojoPropertySite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/GetEffectivePojoPropertySite.java
diff --git a/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/MetaClassCallSites.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/MetaClassCallSites.java
new file mode 100644
index 0000000000..e261a7a94d
--- /dev/null
+++ b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/MetaClassCallSites.java
@@ -0,0 +1,181 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.codehaus.groovy.runtime.callsite;
+
+import groovy.lang.AdaptingMetaClass;
+import groovy.lang.ExpandoMetaClass;
+import groovy.lang.MetaClassImpl;
+import groovy.lang.MetaMethod;
+import org.codehaus.groovy.reflection.CachedConstructor;
+import org.codehaus.groovy.runtime.GeneratedClosure;
+import org.codehaus.groovy.runtime.GroovyCategorySupport;
+import org.codehaus.groovy.runtime.MetaClassHelper;
+import org.codehaus.groovy.runtime.metaclass.ClosureMetaClass;
+
+import java.util.Map;
+
+/**
+ * Builds classic (non-indy) call sites for a {@link MetaClassImpl}.
+ * <p>
+ * Logic formerly lived as {@code create*CallSite} methods on
+ * {@link MetaClassImpl} / {@link ExpandoMetaClass} / {@link ClosureMetaClass}.
+ * It uses only public MetaClass APIs so this class can live with the rest of
+ * the classic call-site runtime without a split-package on {@code groovy.lang}.
+ *
+ * @since 6.0.0
+ * @deprecated Prefer invokedynamic call sites; this class will be removed in a future major version.
+ */
+@Deprecated
+public final class MetaClassCallSites {
+
+    private static final String CALL_METHOD = "call";
+    private static final String DO_CALL_METHOD = "doCall";
+    private static final String CONSTRUCTOR_NAME = "<init>";
+
+    private MetaClassCallSites() {
+    }
+
+    /**
+     * Creates a POJO call site for the given metaclass.
+     */
+    public static CallSite createPojoCallSite(final MetaClassImpl metaClass, final CallSite site,
+                                              final Object receiver, final Object[] args) {
+        if (usesCustomInvokeMethod(metaClass)) {
+            return new PojoMetaClassSite(site, metaClass);
+        }
+        if (metaClass instanceof ClosureMetaClass) {
+            throw new UnsupportedOperationException();
+        }
+        if (isAdapting(metaClass)) {
+            return new PojoMetaClassSite(site, metaClass);
+        }
+        Class[] params = MetaClassHelper.convertToTypeArray(args);
+        MetaMethod metaMethod = metaClass.getMethodWithCaching(metaClass.getTheClass(), site.getName(), params);
+        if (metaMethod != null) {
+            return PojoMetaMethodSite.createPojoMetaMethodSite(site, metaClass, metaMethod, params, receiver, args);
+        }
+        return new PojoMetaClassSite(site, metaClass);
+    }
+
+    /**
+     * Creates a static call site for the given metaclass.
+     */
+    public static CallSite createStaticSite(final MetaClassImpl metaClass, final CallSite site, final Object[] args) {
+        if (metaClass instanceof ExpandoMetaClass emc && emc.hasCustomStaticInvokeMethod()) {
+            return new StaticMetaClassSite(site, metaClass);
+        }
+        if (isAdapting(metaClass)) {
+            return new StaticMetaClassSite(site, metaClass);
+        }
+        Class[] params = MetaClassHelper.convertToTypeArray(args);
+        MetaMethod metaMethod = metaClass.retrieveStaticMethod(site.getName(), args);
+        if (metaMethod != null) {
+            return StaticMetaMethodSite.createStaticMetaMethodSite(site, metaClass, metaMethod, params, args);
+        }
+        return new StaticMetaClassSite(site, metaClass);
+    }
+
+    /**
+     * Creates a POGO call site for the given metaclass.
+     */
+    public static CallSite createPogoCallSite(final MetaClassImpl metaClass, final CallSite site, final Object[] args) {
+        if (usesCustomInvokeMethod(metaClass) || metaClass instanceof ClosureMetaClass) {
+            return new PogoMetaClassSite(site, metaClass);
+        }
+        if (GroovyCategorySupport.hasCategoryInCurrentThread() || isAdapting(metaClass)) {
+            return new PogoMetaClassSite(site, metaClass);
+        }
+        Class[] params = MetaClassHelper.convertToTypeArray(args);
+        String methodName = site.getName();
+        // GROOVY-5806: select doCall but keep the original call-site name
+        if (CALL_METHOD.equals(methodName) && isGroovyFunctor(metaClass)) {
+            methodName = DO_CALL_METHOD;
+        }
+        MetaMethod metaMethod = metaClass.getMethodWithCaching(metaClass.getTheClass(), methodName, params);
+        if (metaMethod != null) {
+            return PogoMetaMethodSite.createPogoMetaMethodSite(site, metaClass, metaMethod, params, args);
+        }
+        return new PogoMetaClassSite(site, metaClass);
+    }
+
+    /**
+     * Creates a current-scope POGO call site for the given metaclass.
+     */
+    public static CallSite createPogoCallCurrentSite(final MetaClassImpl metaClass, final CallSite site,
+                                                     final Class sender, final Object[] args) {
+        if (usesCustomInvokeMethod(metaClass) || metaClass instanceof ClosureMetaClass) {
+            return new PogoMetaClassSite(site, metaClass);
+        }
+        if (GroovyCategorySupport.hasCategoryInCurrentThread() || isAdapting(metaClass)) {
+            return new PogoMetaClassSite(site, metaClass);
+        }
+        Class[] params = MetaClassHelper.convertToTypeArray(args);
+        MetaMethod metaMethod = metaClass.getMethodWithCaching(sender, site.getName(), params);
+        if (metaMethod != null) {
+            return PogoMetaMethodSite.createPogoMetaMethodSite(site, metaClass, metaMethod, params, args);
+        }
+        return new PogoMetaClassSite(site, metaClass);
+    }
+
+    /**
+     * Creates a constructor call site for the given metaclass.
+     */
+    public static CallSite createConstructorSite(final MetaClassImpl metaClass, final CallSite site, final Object[] args) {
+        if (metaClass instanceof ExpandoMetaClass emc) {
+            Class<?>[] params = MetaClassHelper.convertToTypeArray(args);
+            MetaMethod method = emc.pickMethod(CONSTRUCTOR_NAME, params);
+            if (method != null && method.getParameterTypes().length == args.length
+                    && method.getDeclaringClass().getTheClass().equals(emc.getTheClass())) {
+                return new ConstructorMetaMethodSite(site, emc, method, params);
+            }
+        }
+        if (isAdapting(metaClass)) {
+            return new MetaClassConstructorSite(site, metaClass);
+        }
+        Class[] argTypes = MetaClassHelper.convertToTypeArray(args);
+        CachedConstructor constructor = metaClass.chooseConstructor(argTypes);
+        if (constructor != null) {
+            return ConstructorSite.createConstructorSite(site, metaClass, constructor, argTypes, args);
+        }
+        if ((args.length == 1 && args[0] instanceof Map)
+                || (args.length == 2 && args[1] instanceof Map
+                && metaClass.getTheClass().getEnclosingClass() != null
+                && metaClass.getTheClass().getEnclosingClass().isAssignableFrom(argTypes[0]))) {
+            Object selected = metaClass.chooseNamedArgCompatibleConstructor(argTypes, args);
+            if (selected instanceof CachedConstructor namedArgCtor) {
+                return args.length == 1
+                        ? new ConstructorSite.NoParamSite(site, metaClass, namedArgCtor, argTypes)
+                        : new ConstructorSite.NoParamSiteInnerClass(site, metaClass, namedArgCtor, argTypes);
+            }
+        }
+        return new MetaClassConstructorSite(site, metaClass);
+    }
+
+    private static boolean usesCustomInvokeMethod(final MetaClassImpl metaClass) {
+        return metaClass instanceof ExpandoMetaClass emc && emc.hasCustomInvokeMethod();
+    }
+
+    private static boolean isAdapting(final MetaClassImpl metaClass) {
+        return metaClass instanceof AdaptingMetaClass;
+    }
+
+    private static boolean isGroovyFunctor(final MetaClassImpl metaClass) {
+        return GeneratedClosure.class.isAssignableFrom(metaClass.getTheClass());
+    }
+}
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/MetaClassConstructorSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/MetaClassConstructorSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/MetaClassConstructorSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/MetaClassConstructorSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/MetaClassSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/MetaClassSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/MetaClassSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/MetaClassSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/MetaMethodSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/MetaMethodSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/MetaMethodSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/MetaMethodSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/NullCallSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/NullCallSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/NullCallSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/NullCallSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/PerInstancePojoMetaClassSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PerInstancePojoMetaClassSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/PerInstancePojoMetaClassSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PerInstancePojoMetaClassSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/PlainObjectMetaMethodSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PlainObjectMetaMethodSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/PlainObjectMetaMethodSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PlainObjectMetaMethodSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/PogoGetPropertySite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PogoGetPropertySite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/PogoGetPropertySite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PogoGetPropertySite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/PogoInterceptableSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PogoInterceptableSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/PogoInterceptableSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PogoInterceptableSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/PogoMetaClassGetPropertySite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PogoMetaClassGetPropertySite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/PogoMetaClassGetPropertySite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PogoMetaClassGetPropertySite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/PogoMetaClassSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PogoMetaClassSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/PogoMetaClassSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PogoMetaClassSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite.java
similarity index 98%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite.java
index 04ca90d804..814b13c472 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite.java
+++ b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PogoMetaMethodSite.java
@@ -151,7 +151,7 @@ public class PogoMetaMethodSite extends PlainObjectMetaMethodSite {
                 if (noCoerce(metaMethod,args))
                     return new PogoCachedMethodSiteNoUnwrap(site, metaClass, metaMethod, params);
                 else {
-                    return metaMethod.createPogoMetaMethodSite(site, metaClass, params);
+                    return CachedMethodCallSites.createPogoMetaMethodSite(metaMethod, site, metaClass, params);
                 }
             }
         }
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/PojoMetaClassGetPropertySite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PojoMetaClassGetPropertySite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/PojoMetaClassGetPropertySite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PojoMetaClassGetPropertySite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/PojoMetaClassSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PojoMetaClassSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/PojoMetaClassSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PojoMetaClassSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/PojoMetaMethodSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PojoMetaMethodSite.java
similarity index 96%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/PojoMetaMethodSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PojoMetaMethodSite.java
index 3bf972f957..8173604f3c 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/PojoMetaMethodSite.java
+++ b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/PojoMetaMethodSite.java
@@ -144,12 +144,8 @@ public class PojoMetaMethodSite extends PlainObjectMetaMethodSite {
     }
 
     public static CallSite createPojoMetaMethodSite(CallSite site, MetaClassImpl metaClass, MetaMethod metaMethod, Class[] params, Object receiver, Object[] args) {
-        if (metaMethod instanceof CallSiteAwareMetaMethod) {
-            return ((CallSiteAwareMetaMethod)metaMethod).createPojoCallSite(site, metaClass, metaMethod, params, receiver, args);
-        }
-
         if (metaMethod.getClass() == CachedMethod.class)
-          return createCachedMethodSite (site, metaClass, (CachedMethod) metaMethod, params, args);
+          return createCachedMethodSite(site, metaClass, (CachedMethod) metaMethod, params, args);
 
         return createNonAwareCallSite(site, metaClass, metaMethod, params, args);
     }
@@ -160,7 +156,7 @@ public class PojoMetaMethodSite extends PlainObjectMetaMethodSite {
                 if (noCoerce(metaMethod,args))
                     return new PojoCachedMethodSiteNoUnwrap(site, metaClass, metaMethod, params);
                 else
-                    return metaMethod.createPojoMetaMethodSite(site, metaClass, params);
+                    return CachedMethodCallSites.createPojoMetaMethodSite(metaMethod, site, metaClass, params);
             }
         }
         return new PojoCachedMethodSite(site, metaClass, metaMethod, params);
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/StaticMetaClassSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/StaticMetaClassSite.java
similarity index 100%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/StaticMetaClassSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/StaticMetaClassSite.java
diff --git a/src/main/java/org/codehaus/groovy/runtime/callsite/StaticMetaMethodSite.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/StaticMetaMethodSite.java
similarity index 98%
rename from src/main/java/org/codehaus/groovy/runtime/callsite/StaticMetaMethodSite.java
rename to subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/StaticMetaMethodSite.java
index 2af8e69d3b..db6778e3bd 100644
--- a/src/main/java/org/codehaus/groovy/runtime/callsite/StaticMetaMethodSite.java
+++ b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/StaticMetaMethodSite.java
@@ -111,7 +111,7 @@ public class StaticMetaMethodSite extends MetaMethodSite {
                     return new StaticMetaMethodSiteNoUnwrap(site, metaClass, metaMethod, params);
                 else
                     if (metaMethod.getClass() == CachedMethod.class)
-                      return ((CachedMethod)metaMethod).createStaticMetaMethodSite(site, metaClass, params);
+                      return CachedMethodCallSites.createStaticMetaMethodSite((CachedMethod) metaMethod, site, metaClass, params);
                     else
                       return new StaticMetaMethodSiteNoUnwrapNoCoerce (site, metaClass, metaMethod, params);
             }
diff --git a/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/package-info.java b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/package-info.java
new file mode 100644
index 0000000000..d6878242c2
--- /dev/null
+++ b/subprojects/groovy-callsite/src/main/java/org/codehaus/groovy/runtime/callsite/package-info.java
@@ -0,0 +1,43 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+/**
+ * Classic (non-{@code invokedynamic}) call-site caching.
+ * <p>
+ * <b>Primary purpose (GROOVY-11158):</b> preserve runtime binary
+ * compatibility for classes compiled by Groovy 4 and Groovy 5 (and by
+ * earlier releases that always used classic call sites). Those classes
+ * link against {@link CallSiteArray} and {@link CallSite}; with this
+ * optional module on the classpath they must still load and execute on
+ * Groovy 6. The public linkage surface of those types is stable for that
+ * reason.
+ * <p>
+ * The same types also support compiling with {@code indy} disabled.
+ * Groovy 6 core uses invokedynamic for new compilation by default and
+ * does not depend on this package. Add {@code groovy-callsite} only when
+ * classic bytecode must still be produced or executed.
+ * <p>
+ * This entire package is deprecated and planned for removal in a future
+ * major version.
+ *
+ * @deprecated Prefer invokedynamic call sites; do not use for new code.
+ * @since 1.5 (relocated to the {@code groovy-callsite} module in 6.0)
+ */
+@Deprecated
+package org.codehaus.groovy.runtime.callsite;
diff --git a/subprojects/groovy-callsite/src/test/groovy/org/codehaus/groovy/runtime/callsite/CachedMethodCallSitesTest.groovy b/subprojects/groovy-callsite/src/test/groovy/org/codehaus/groovy/runtime/callsite/CachedMethodCallSitesTest.groovy
new file mode 100644
index 0000000000..f44a6aca01
--- /dev/null
+++ b/subprojects/groovy-callsite/src/test/groovy/org/codehaus/groovy/runtime/callsite/CachedMethodCallSitesTest.groovy
@@ -0,0 +1,63 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.codehaus.groovy.runtime.callsite
+
+import groovy.lang.MetaClassImpl
+import org.codehaus.groovy.reflection.CachedMethod
+import org.codehaus.groovy.reflection.ReflectionCache
+import org.junit.jupiter.api.Test
+
+/**
+ * GROOVY-11158: CachedMethodCallSites (logic moved out of CachedMethod).
+ */
+final class CachedMethodCallSitesTest {
+
+    @Test
+    void testCreatePojoMetaMethodSite() {
+        def cachedClass = ReflectionCache.getCachedClass(String)
+        CachedMethod method = cachedClass.methods.find { it.name == 'length' && it.paramsCount == 0 }
+        assert method != null
+        def mc = (MetaClassImpl) groovy.lang.GroovySystem.metaClassRegistry.getMetaClass(String)
+        def site0 = new CallSiteArray(CachedMethodCallSitesTest, ['length'] as String[]).array[0]
+        def site = CachedMethodCallSites.createPojoMetaMethodSite(method, site0, mc, [] as Class[])
+        assert site != null
+        assert site.call('abcd', CallSiteArray.NOPARAM) == 4
+    }
+
+    @Test
+    void testCreateStaticMetaMethodSite() {
+        def cachedClass = ReflectionCache.getCachedClass(String)
+        CachedMethod method = cachedClass.methods.find {
+            it.name == 'valueOf' && it.paramsCount == 1 && it.nativeParameterTypes[0] == Object
+        }
+        assert method != null
+        def mc = (MetaClassImpl) groovy.lang.GroovySystem.metaClassRegistry.getMetaClass(String)
+        def site0 = new CallSiteArray(CachedMethodCallSitesTest, ['valueOf'] as String[]).array[0]
+        def site = CachedMethodCallSites.createStaticMetaMethodSite(method, site0, mc, [Object] as Class[])
+        assert site != null
+        assert site.callStatic(String, 99) == '99'
+    }
+
+    @Test
+    void testIsCompilablePublicMethod() {
+        def cachedClass = ReflectionCache.getCachedClass(String)
+        CachedMethod method = cachedClass.methods.find { it.name == 'length' && it.paramsCount == 0 }
+        assert CallSiteGenerator.isCompilable(method)
+    }
+}
diff --git a/subprojects/groovy-callsite/src/test/groovy/org/codehaus/groovy/runtime/callsite/CallSiteArrayTest.groovy b/subprojects/groovy-callsite/src/test/groovy/org/codehaus/groovy/runtime/callsite/CallSiteArrayTest.groovy
new file mode 100644
index 0000000000..a5dc7f17a3
--- /dev/null
+++ b/subprojects/groovy-callsite/src/test/groovy/org/codehaus/groovy/runtime/callsite/CallSiteArrayTest.groovy
@@ -0,0 +1,114 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.codehaus.groovy.runtime.callsite
+
+import org.junit.jupiter.api.Test
+
+/**
+ * GROOVY-11158: classic CallSiteArray behaviour after the move to groovy-callsite.
+ */
+final class CallSiteArrayTest {
+
+    @Test
+    void testDefaultCallInvokesInstanceMethod() {
+        def csa = new CallSiteArray(CallSiteArrayTest, ['toString'] as String[])
+        def site = csa.array[0]
+        def result = site.call(42, CallSiteArray.NOPARAM)
+        assert result == '42'
+    }
+
+    @Test
+    void testDefaultCallStatic() {
+        def csa = new CallSiteArray(CallSiteArrayTest, ['valueOf'] as String[])
+        def site = csa.array[0]
+        def result = site.callStatic(String, 'hello')
+        assert result == 'hello'
+    }
+
+    @Test
+    void testDefaultCallConstructor() {
+        def csa = new CallSiteArray(CallSiteArrayTest, ['<init>'] as String[])
+        def site = csa.array[0]
+        def result = site.callConstructor(StringBuilder, 'x')
+        assert result instanceof StringBuilder
+        assert result.toString() == 'x'
+    }
+
+    @Test
+    void testNullReceiverUsesNullCallSite() {
+        def csa = new CallSiteArray(CallSiteArrayTest, ['toString'] as String[])
+        def site = csa.array[0]
+        // null.toString() via NullObject
+        def result = site.call(null, CallSiteArray.NOPARAM)
+        assert result == 'null'
+    }
+
+    @Test
+    void testCallSiteArrayConstruction() {
+        def names = ['a', 'b', 'c'] as String[]
+        def csa = new CallSiteArray(String, names)
+        assert csa.owner == String
+        assert csa.array.length == 3
+        assert csa.array[0].name == 'a'
+        assert csa.array[1].name == 'b'
+        assert csa.array[2].name == 'c'
+        assert csa.array[0].index == 0
+        assert csa.array[0].array.is(csa)
+    }
+
+    @Test
+    void testPogoCallCurrent() {
+        def script = new GroovyShell().evaluate('''
+            class C {
+                def m() { 'ok' }
+                def run() {
+                    def csa = new org.codehaus.groovy.runtime.callsite.CallSiteArray(C, ['m'] as String[])
+                    csa.array[0].callCurrent(this, org.codehaus.groovy.runtime.callsite.CallSiteArray.NOPARAM)
+                }
+            }
+            new C().run()
+        ''')
+        assert script == 'ok'
+    }
+
+    /**
+     * Linkage surface that Groovy 4/5 classic bytecode depends on.
+     * Keep constructor, public fields, and CallSite method names/signatures
+     * binary-compatible so precompiled classes keep working with this module.
+     */
+    @Test
+    void testPublicLinkageSurfaceStableForPrecompiledClassicBytecode() {
+        def csa = new CallSiteArray(String, ['length', 'valueOf', '<init>', 'name'] as String[])
+        assert csa.owner == String
+        assert csa.array instanceof CallSite[]
+        assert csa.array.length == 4
+        assert CallSiteArray.NOPARAM.length == 0
+
+        // Instance / static / constructor / property paths used by CallSiteWriter
+        assert csa.array[0].call('hi', CallSiteArray.NOPARAM) == 2
+        assert csa.array[1].callStatic(String, 99) == '99'
+        def sb = csa.array[2].callConstructor(StringBuilder, 'z')
+        assert sb instanceof StringBuilder && sb.toString() == 'z'
+        assert csa.array[3].callGetProperty([name: 'via-prop']) == 'via-prop'
+
+        // Warmed sites (second hit) must keep working
+        assert csa.array[0].call('ab', CallSiteArray.NOPARAM) == 2
+        assert csa.array[1].callStatic(String, 100) == '100'
+    }
+}
diff --git a/subprojects/groovy-callsite/src/test/groovy/org/codehaus/groovy/runtime/callsite/MetaClassCallSitesTest.groovy b/subprojects/groovy-callsite/src/test/groovy/org/codehaus/groovy/runtime/callsite/MetaClassCallSitesTest.groovy
new file mode 100644
index 0000000000..226128412c
--- /dev/null
+++ b/subprojects/groovy-callsite/src/test/groovy/org/codehaus/groovy/runtime/callsite/MetaClassCallSitesTest.groovy
@@ -0,0 +1,128 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.codehaus.groovy.runtime.callsite
+
+import groovy.lang.ExpandoMetaClass
+import groovy.lang.GroovySystem
+import groovy.lang.MetaClassImpl
+import org.codehaus.groovy.runtime.metaclass.ClosureMetaClass
+import org.junit.jupiter.api.Test
+
+/**
+ * GROOVY-11158: MetaClassCallSites factory fidelity after extraction from MetaClassImpl.
+ */
+final class MetaClassCallSitesTest {
+
+    private static CallSite dummySite(String name = 'toString') {
+        new CallSiteArray(MetaClassCallSitesTest, [name] as String[]).array[0]
+    }
+
+    @Test
+    void testCreatePojoCallSite() {
+        def mc = (MetaClassImpl) GroovySystem.metaClassRegistry.getMetaClass(Integer)
+        def site = MetaClassCallSites.createPojoCallSite(mc, dummySite('toString'), 7, CallSiteArray.NOPARAM)
+        assert site.call(7, CallSiteArray.NOPARAM) == '7'
+    }
+
+    @Test
+    void testCreateStaticSite() {
+        def mc = (MetaClassImpl) GroovySystem.metaClassRegistry.getMetaClass(String)
+        def site = MetaClassCallSites.createStaticSite(mc, dummySite('valueOf'), ['z'] as Object[])
+        assert site.callStatic(String, 'z') == 'z'
+    }
+
+    @Test
+    void testCreateConstructorSite() {
+        def mc = (MetaClassImpl) GroovySystem.metaClassRegistry.getMetaClass(StringBuilder)
+        def site = MetaClassCallSites.createConstructorSite(mc, dummySite('<init>'), ['ab'] as Object[])
+        def sb = site.callConstructor(StringBuilder, 'ab')
+        assert sb instanceof StringBuilder
+        assert sb.toString() == 'ab'
+    }
+
+    @Test
+    void testCreatePogoCallSite() {
+        def obj = new GroovyShell().evaluate('''
+            class P { def hi() { 'hi' } }
+            new P()
+        ''')
+        def mc = (MetaClassImpl) GroovySystem.metaClassRegistry.getMetaClass(obj.getClass())
+        def site = MetaClassCallSites.createPogoCallSite(mc, dummySite('hi'), CallSiteArray.NOPARAM)
+        assert site.call(obj, CallSiteArray.NOPARAM) == 'hi'
+    }
+
+    @Test
+    void testExpandoCustomInvokeMethodUsesMetaClassSite() {
+        def mc = new ExpandoMetaClass(String, true, true)
+        mc.initialize()
+        mc.invokeMethod = { String name, Object args -> "x-$name" }
+        try {
+            assert mc.hasCustomInvokeMethod()
+            def site = MetaClassCallSites.createPojoCallSite(mc, dummySite('foo'), 'recv', CallSiteArray.NOPARAM)
+            assert site instanceof PojoMetaClassSite
+            assert site.call('recv', CallSiteArray.NOPARAM) == 'x-foo'
+        } finally {
+            GroovySystem.metaClassRegistry.removeMetaClass(String)
+        }
+    }
+
+    @Test
+    void testClosureMetaClassPogoSiteDoesNotSpecialize() {
+        def closure = { -> 'ok' }
+        def mc = (MetaClassImpl) closure.metaClass
+        // Groovy may wrap; force ClosureMetaClass path when present
+        if (mc instanceof ClosureMetaClass || mc.getClass().name.contains('Closure')) {
+            def site = MetaClassCallSites.createPogoCallSite(mc, dummySite('call'), CallSiteArray.NOPARAM)
+            assert site instanceof PogoMetaClassSite
+            assert site.call(closure, CallSiteArray.NOPARAM) == 'ok'
+        } else {
+            // Fallback: ClosureMetaClass via registry after explicit set
+            def cmc = new ClosureMetaClass(GroovySystem.metaClassRegistry, closure.getClass())
+            cmc.initialize()
+            def site = MetaClassCallSites.createPogoCallSite(cmc, dummySite('call'), CallSiteArray.NOPARAM)
+            assert site instanceof PogoMetaClassSite
+        }
+    }
+
+    @Test
+    void testClosureMetaClassPojoSiteThrows() {
+        def cmc = new ClosureMetaClass(GroovySystem.metaClassRegistry, Object)
+        cmc.initialize()
+        try {
+            MetaClassCallSites.createPojoCallSite(cmc, dummySite('toString'), new Object(), CallSiteArray.NOPARAM)
+            assert false: 'expected UnsupportedOperationException'
+        } catch (UnsupportedOperationException expected) {
+            // ok
+        }
+    }
+
+    @Test
+    void testFunctorCallSelectsDoCall() {
+        def obj = new GroovyShell().evaluate('''
+            class F extends groovy.lang.Closure {
+                F() { super(null) }
+                def doCall() { 'from-doCall' }
+            }
+            new F()
+        ''')
+        def mc = (MetaClassImpl) GroovySystem.metaClassRegistry.getMetaClass(obj.getClass())
+        def site = MetaClassCallSites.createPogoCallSite(mc, dummySite('call'), CallSiteArray.NOPARAM)
+        assert site.call(obj, CallSiteArray.NOPARAM) == 'from-doCall'
+    }
+}
diff --git a/subprojects/performance/README.adoc b/subprojects/performance/README.adoc
index ad8ebc47ec..76a50d9c76 100644
--- a/subprojects/performance/README.adoc
+++ b/subprojects/performance/README.adoc
@@ -43,6 +43,10 @@ Groovy currently defaults to InvokeDynamic generated classes, but to get classic
 
     ./gradlew -Pindy=false :perf:jmh
 
+With `-Pindy=false`, the performance plugin automatically puts the optional
+`groovy-callsite` module on the compile and runtime classpaths (required since
+GROOVY-12185 moved classic call-site caching out of groovy-core).
+
 Groovy and Java sources placed in `src/test` will also be available to the
 benchmarks.