This is an automated email from the ASF dual-hosted git repository. jiriondrusek pushed a commit to branch camel-main in repository https://gitbox.apache.org/repos/asf/camel-quarkus.git
commit 24ed4c068262a96ed7b51510ef7cae32ec2edc03 Author: Nicolas Filotto <nfilo...@talend.com> AuthorDate: Wed Mar 8 11:57:15 2023 +0100 Ref #4624: Upgrade to Groovy 4.x --- .../groovy/runtime/graal/GroovySubstitutions.java | 130 ++++++++++++++++----- 1 file changed, 98 insertions(+), 32 deletions(-) diff --git a/extensions/groovy-dsl/runtime/src/main/java/org/apache/camel/quarkus/dsl/groovy/runtime/graal/GroovySubstitutions.java b/extensions/groovy-dsl/runtime/src/main/java/org/apache/camel/quarkus/dsl/groovy/runtime/graal/GroovySubstitutions.java index 3ddba6d540..927018517c 100644 --- a/extensions/groovy-dsl/runtime/src/main/java/org/apache/camel/quarkus/dsl/groovy/runtime/graal/GroovySubstitutions.java +++ b/extensions/groovy-dsl/runtime/src/main/java/org/apache/camel/quarkus/dsl/groovy/runtime/graal/GroovySubstitutions.java @@ -16,68 +16,134 @@ */ package org.apache.camel.quarkus.dsl.groovy.runtime.graal; -import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodHandle; import java.lang.invoke.MutableCallSite; -import java.lang.reflect.Constructor; +import java.util.function.BiFunction; -import com.oracle.svm.core.annotate.Delete; +import com.oracle.svm.core.annotate.Alias; import com.oracle.svm.core.annotate.Substitute; import com.oracle.svm.core.annotate.TargetClass; -import org.codehaus.groovy.control.ParserPluginFactory; +import org.codehaus.groovy.control.SourceUnit; +import org.codehaus.groovy.runtime.memoize.MemoizeCache; +import org.codehaus.groovy.vmplugin.v8.CacheableCallSite; +import org.codehaus.groovy.vmplugin.v8.IndyInterface; final class GroovySubstitutions { } -@TargetClass(className = "org.codehaus.groovy.vmplugin.v8.IndyInterface") +@TargetClass(className = "org.codehaus.groovy.vmplugin.v8.MethodHandleWrapper") +final class SubstituteMethodHandleWrapper { + + @Alias + public boolean isCanSetTarget() { + return false; + } + + @Alias + public MethodHandle getCachedMethodHandle() { + return null; + } +} + +@TargetClass(className = "org.codehaus.groovy.vmplugin.v8.IndyInterface$FallbackSupplier") +final class SubstituteIndyFallbackSupplier { + + @Alias + SubstituteIndyFallbackSupplier(MutableCallSite callSite, Class<?> sender, String methodName, int callID, + Boolean safeNavigation, Boolean thisCall, Boolean spreadCall, Object dummyReceiver, Object[] arguments) { + + } + + @Alias + SubstituteMethodHandleWrapper get() { + return null; + } +} + +@TargetClass(CacheableCallSite.class) +final class SubstituteCacheableCallSite { + + @Alias + public SubstituteMethodHandleWrapper getAndPut(String className, + MemoizeCache.ValueProvider<? super String, ? extends SubstituteMethodHandleWrapper> valueProvider) { + return null; + } +} + +@TargetClass(IndyInterface.class) final class SubstituteIndyInterface { + @Alias + private static SubstituteMethodHandleWrapper NULL_METHOD_HANDLE_WRAPPER; + @Substitute protected static void invalidateSwitchPoints() { throw new UnsupportedOperationException("invalidateSwitchPoints is not supported"); } - @Substitute - public static Object fromCache(MutableCallSite callSite, Class<?> sender, String methodName, int callID, - Boolean safeNavigation, Boolean thisCall, Boolean spreadCall, Object dummyReceiver, Object[] arguments) { - throw new UnsupportedOperationException("fromCache is not supported"); + @Alias + private static boolean bypassCache(Boolean spreadCall, Object[] arguments) { + return false; } -} -@TargetClass(className = "org.codehaus.groovy.control.SourceUnit") -final class SubstituteSourceUnit { + @Alias + private static <T> T doWithCallSite(MutableCallSite callSite, Object[] arguments, + BiFunction<? super SubstituteCacheableCallSite, ? super Object, ? extends T> f) { + return null; + } @Substitute - public void convert() { - throw new UnsupportedOperationException("convert is not supported"); + public static Object selectMethod(MutableCallSite callSite, Class<?> sender, String methodName, int callID, + Boolean safeNavigation, Boolean thisCall, Boolean spreadCall, Object dummyReceiver, Object[] arguments) + throws Throwable { + throw new UnsupportedOperationException("selectMethod is not supported"); } -} - -@TargetClass(className = "org.codehaus.groovy.vmplugin.v8.Java8") -final class SubstituteJava8 { @Substitute - private static Constructor<MethodHandles.Lookup> getLookupConstructor() { - throw new UnsupportedOperationException("getLookupConstructor is not supported"); + public static Object fromCache(MutableCallSite callSite, Class<?> sender, String methodName, int callID, + Boolean safeNavigation, Boolean thisCall, Boolean spreadCall, Object dummyReceiver, Object[] arguments) + throws Throwable { + SubstituteIndyFallbackSupplier fallbackSupplier = new SubstituteIndyFallbackSupplier(callSite, sender, methodName, + callID, safeNavigation, thisCall, spreadCall, dummyReceiver, arguments); + + SubstituteMethodHandleWrapper mhw = bypassCache(spreadCall, arguments) + ? NULL_METHOD_HANDLE_WRAPPER + : doWithCallSite( + callSite, arguments, + new FromCacheBiFunction(fallbackSupplier)); + + if (NULL_METHOD_HANDLE_WRAPPER == mhw) { + mhw = fallbackSupplier.get(); + } + + return mhw.getCachedMethodHandle().invokeExact(arguments); } -} -@TargetClass(className = "org.codehaus.groovy.antlr.AntlrParserPlugin") -@Delete -final class SubstituteAntlrParserPlugin { + static class FromCacheBiFunction implements BiFunction<SubstituteCacheableCallSite, Object, SubstituteMethodHandleWrapper> { -} + private final SubstituteIndyFallbackSupplier fallbackSupplier; -@TargetClass(className = "org.codehaus.groovy.antlr.AntlrParserPluginFactory") -@Delete -final class SubstituteAntlrParserPluginFactory { + FromCacheBiFunction(SubstituteIndyFallbackSupplier fallbackSupplier) { + this.fallbackSupplier = fallbackSupplier; + } + @Override + public SubstituteMethodHandleWrapper apply(SubstituteCacheableCallSite cs, Object receiver) { + return cs.getAndPut( + receiver.getClass().getName(), + c -> { + SubstituteMethodHandleWrapper fbMhw = fallbackSupplier.get(); + return fbMhw.isCanSetTarget() ? fbMhw : NULL_METHOD_HANDLE_WRAPPER; + }); + } + } } -@TargetClass(className = "org.codehaus.groovy.control.ParserPluginFactory") -final class SubstituteParserPluginFactory { +@TargetClass(SourceUnit.class) +final class SubstituteSourceUnit { @Substitute - public static ParserPluginFactory antlr2() { - throw new UnsupportedOperationException("antlr2 is not supported"); + public void convert() { + throw new UnsupportedOperationException("convert is not supported"); } }