All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jruby.runtime.invokedynamic.SmartHandle Maven / Gradle / Ivy

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.jruby.runtime.invokedynamic;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodHandles.Lookup;
import java.util.Arrays;

/**
 * A tuple of a Signature and a java.lang.invoke.MethodHandle.
 * 
 * @author headius
 */
public class SmartHandle {
    private final Signature signature;
    private final MethodHandle handle;

    public SmartHandle(Signature signature, MethodHandle handle) {
        this.signature = signature;
        this.handle = handle;
    }

    public static SmartHandle findStaticQuiet(Lookup lookup, Class target, String name, Signature signature) {
        try {
            return new SmartHandle(signature, lookup.findStatic(target, name, signature.methodType()));
        } catch (NoSuchMethodException nsme) {
            throw new RuntimeException(nsme);
        } catch (IllegalAccessException nae) {
            throw new RuntimeException(nae);
        }
    }

    public Signature signature() {
        return signature;
    }

    public MethodHandle handle() {
        return handle;
    }
    
    public SmartHandle insert(int index, String name, Object arg) {
        return new SmartHandle(signature.insertArg(0, name, arg.getClass()), MethodHandles.insertArguments(handle, index, arg));
    }
    
    public SmartHandle insert(int index, String name, boolean arg) {
        return new SmartHandle(signature.insertArg(0, name, boolean.class), MethodHandles.insertArguments(handle, index, arg));
    }
    
    public SmartHandle insert(int index, String name, byte arg) {
        return new SmartHandle(signature.insertArg(0, name, byte.class), MethodHandles.insertArguments(handle, index, arg));
    }
    
    public SmartHandle insert(int index, String name, short arg) {
        return new SmartHandle(signature.insertArg(0, name, short.class), MethodHandles.insertArguments(handle, index, arg));
    }
    
    public SmartHandle insert(int index, String name, char arg) {
        return new SmartHandle(signature.insertArg(0, name, char.class), MethodHandles.insertArguments(handle, index, arg));
    }
    
    public SmartHandle insert(int index, String name, int arg) {
        return new SmartHandle(signature.insertArg(0, name, int.class), MethodHandles.insertArguments(handle, index, arg));
    }
    
    public SmartHandle insert(int index, String name, long arg) {
        return new SmartHandle(signature.insertArg(0, name, long.class), MethodHandles.insertArguments(handle, index, arg));
    }
    
    public SmartHandle insert(int index, String name, float arg) {
        return new SmartHandle(signature.insertArg(0, name, float.class), MethodHandles.insertArguments(handle, index, arg));
    }
    
    public SmartHandle insert(int index, String name, double arg) {
        return new SmartHandle(signature.insertArg(0, name, double.class), MethodHandles.insertArguments(handle, index, arg));
    }
    
    public MethodHandle guard(MethodHandle target, MethodHandle fallback) {
        return MethodHandles.guardWithTest(handle, target, fallback);
    }
    
    public SmartHandle guard(SmartHandle target, SmartHandle fallback) {
        return new SmartHandle(target.signature, MethodHandles.guardWithTest(handle, target.handle, fallback.handle));
    }
    
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy