/* * 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.classgen.asm.indy.sc; import org.codehaus.groovy.classgen.asm.BinaryExpressionWriter; import org.codehaus.groovy.classgen.asm.MethodCaller; import org.codehaus.groovy.classgen.asm.WriterController; import org.codehaus.groovy.classgen.asm.sc.StaticTypesBinaryExpressionMultiTypeDispatcher; import org.codehaus.groovy.vmplugin.v7.IndyInterface; import org.objectweb.asm.Handle; import org.objectweb.asm.MethodVisitor; import java.lang.invoke.CallSite; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; /** * Multi type dispatcher for binary expression backend combining indy and static compilation * @author Jochen Theodorou * @since 2.5.0 */ public class IndyStaticTypesMultiTypeDispatcher extends StaticTypesBinaryExpressionMultiTypeDispatcher { public IndyStaticTypesMultiTypeDispatcher(WriterController wc) { super(wc); } private static final String INDY_INTERFACE_NAME = IndyInterface.class.getName().replace('.', '/'); private static final String BSM_METHOD_TYPE_DESCRIPTOR = MethodType.methodType( CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class ).toMethodDescriptorString(); private static final Handle BSM = new Handle( H_INVOKESTATIC, INDY_INTERFACE_NAME, "staticArrayAccess", BSM_METHOD_TYPE_DESCRIPTOR); private static class GenericArrayAccess extends MethodCaller { private final String name, signature; public GenericArrayAccess(String name, String signature) { this.name = name; this.signature = signature; } @Override public void call(MethodVisitor mv) { mv.visitInvokeDynamicInsn(name, signature, BSM); } } protected BinaryExpressionWriter[] initializeDelegateHelpers() { BinaryExpressionWriter[] bewArray = super.initializeDelegateHelpers(); /* 1: int */ bewArray[1].setArraySetAndGet( new GenericArrayAccess("set","([III)V"), new GenericArrayAccess("get","([II)I")); /* 2: long */ bewArray[2].setArraySetAndGet( new GenericArrayAccess("set","([JIJ)V"), new GenericArrayAccess("get","([JI)J")); /* 3: double */ bewArray[3].setArraySetAndGet( new GenericArrayAccess("set","([DID)V"), new GenericArrayAccess("get","([DI)D")); /* 4: char */ bewArray[4].setArraySetAndGet( new GenericArrayAccess("set","([CIC)V"), new GenericArrayAccess("get","([CI)C")); /* 5: byte */ bewArray[5].setArraySetAndGet( new GenericArrayAccess("set","([BIB)V"), new GenericArrayAccess("get","([BI)B")); /* 6: short */ bewArray[6].setArraySetAndGet( new GenericArrayAccess("set","([SIS)V"), new GenericArrayAccess("get","([SI)S")); /* 7: float */ bewArray[7].setArraySetAndGet( new GenericArrayAccess("get","([FIF)V"), new GenericArrayAccess("set","([FI)F")); /* 8: bool */ bewArray[8].setArraySetAndGet( new GenericArrayAccess("get","([ZIZ)V"), new GenericArrayAccess("set","([ZI)Z")); return bewArray; } }