From 01933edb85884b06ba03cdc31d4cd7d2da270fef Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Wed, 23 Jul 2025 10:53:25 +0300 Subject: [PATCH 1/2] Add jandex-gizmo2 to quarkus-core-deployment --- core/deployment/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/deployment/pom.xml b/core/deployment/pom.xml index 284aa82e08df4..5fd7657d824ea 100644 --- a/core/deployment/pom.xml +++ b/core/deployment/pom.xml @@ -46,6 +46,10 @@ io.smallrye jandex + + io.smallrye + jandex-gizmo2 + io.smallrye.common smallrye-common-os From d2a72518133316416aaf9a97452e7d035d1889cd Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Wed, 23 Jul 2025 11:39:02 +0300 Subject: [PATCH 2/2] Start porting Quarkus REST to Gizmo2 --- .../deployment/QuarkusInvokerFactory.java | 66 +++++++++++-------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/extensions/resteasy-reactive/rest/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/QuarkusInvokerFactory.java b/extensions/resteasy-reactive/rest/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/QuarkusInvokerFactory.java index 88feb6d2dcd32..917a00265085a 100644 --- a/extensions/resteasy-reactive/rest/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/QuarkusInvokerFactory.java +++ b/extensions/resteasy-reactive/rest/deployment/src/main/java/io/quarkus/resteasy/reactive/server/deployment/QuarkusInvokerFactory.java @@ -1,7 +1,11 @@ package io.quarkus.resteasy.reactive.server.deployment; +import static org.jboss.jandex.gizmo2.Jandex2Gizmo.methodDescOf; + import java.lang.reflect.Modifier; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import java.util.function.Predicate; import java.util.function.Supplier; @@ -13,12 +17,13 @@ import org.jboss.resteasy.reactive.server.processor.EndpointInvokerFactory; import org.jboss.resteasy.reactive.server.spi.EndpointInvoker; -import io.quarkus.deployment.GeneratedClassGizmoAdaptor; +import io.quarkus.deployment.GeneratedClassGizmo2Adaptor; import io.quarkus.deployment.annotations.BuildProducer; import io.quarkus.deployment.builditem.GeneratedClassBuildItem; -import io.quarkus.gizmo.ClassCreator; -import io.quarkus.gizmo.MethodCreator; -import io.quarkus.gizmo.ResultHandle; +import io.quarkus.gizmo2.ClassOutput; +import io.quarkus.gizmo2.Expr; +import io.quarkus.gizmo2.Gizmo; +import io.quarkus.gizmo2.ParamVar; import io.quarkus.resteasy.reactive.server.runtime.ResteasyReactiveRecorder; public class QuarkusInvokerFactory implements EndpointInvokerFactory { @@ -46,29 +51,36 @@ public Supplier create(ResourceMethod method, ClassInfo current String baseName = currentClassInfo.name() + "$quarkusrestinvoker$" + method.getName() + "_" + HashUtil.sha1(endpointIdentifier); - try (ClassCreator classCreator = new ClassCreator( - new GeneratedClassGizmoAdaptor(generatedClassBuildItemBuildProducer, - applicationClassPredicate.test(currentClassInfo.name().toString())), - baseName, null, - Object.class.getName(), EndpointInvoker.class.getName())) { - MethodCreator mc = classCreator.getMethodCreator("invoke", Object.class, Object.class, Object[].class); - ResultHandle[] args = new ResultHandle[method.getParameters().length]; - ResultHandle array = mc.getMethodParam(1); - for (int i = 0; i < method.getParameters().length; ++i) { - args[i] = mc.readArrayValue(array, i); - } - ResultHandle res; - if (Modifier.isInterface(currentClassInfo.flags())) { - res = mc.invokeInterfaceMethod(info, mc.getMethodParam(0), args); - } else { - res = mc.invokeVirtualMethod(info, mc.getMethodParam(0), args); - } - if (info.returnType().kind() == Type.Kind.VOID) { - mc.returnValue(mc.loadNull()); - } else { - mc.returnValue(res); - } - } + ClassOutput classOutput = new GeneratedClassGizmo2Adaptor(generatedClassBuildItemBuildProducer, null, + applicationClassPredicate.test(currentClassInfo.name().toString())); + Gizmo g = Gizmo.create(classOutput); + g.class_(baseName, cc -> { + cc.defaultConstructor(); + cc.implements_(EndpointInvoker.class); + cc.method("invoke", mc -> { + ParamVar resourceParam = mc.parameter("resource", Object.class); + ParamVar resourceMethodArgsParam = mc.parameter("args", Object[].class); + mc.returning(Object.class); + mc.body(bc -> { + List args = new ArrayList<>(method.getParameters().length); + Expr res; + for (int i = 0; i < method.getParameters().length; ++i) { + args.add(resourceMethodArgsParam.elem(i)); + } + if (Modifier.isInterface(currentClassInfo.flags())) { + res = bc.invokeInterface(methodDescOf(info), resourceParam, args); + } else { + res = bc.invokeVirtual(methodDescOf(info), resourceParam, args); + } + if (info.returnType().kind() == Type.Kind.VOID) { + bc.returnNull(); + } else { + bc.return_(res); + } + }); + }); + }); return recorder.invoker(baseName); } + }