MethodHandles.java 121.7 KB
Newer Older
1
/*
2
 * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
3 4 5 6
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
7
 * published by the Free Software Foundation.  Oracle designates this
8
 * particular file as subject to the "Classpath" exception as provided
9
 * by Oracle in the LICENSE file that accompanied this code.
10 11 12 13 14 15 16 17 18 19 20
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
21 22 23
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
24 25
 */

26
package java.lang.invoke;
27

28
import java.lang.reflect.*;
29 30 31 32
import sun.invoke.WrapperInstance;
import sun.invoke.util.ValueConversions;
import sun.invoke.util.VerifyAccess;
import sun.invoke.util.Wrapper;
33
import java.util.List;
34 35 36
import java.util.ArrayList;
import java.util.Arrays;
import sun.reflect.Reflection;
37
import static java.lang.invoke.MethodHandleStatics.*;
38 39

/**
40 41
 * This class consists exclusively of static methods that operate on or return
 * method handles. They fall into several categories:
42
 * <ul>
43 44 45
 * <li>Lookup methods which help create method handles for methods and fields.
 * <li>Combinator methods, which combine or transform pre-existing method handles into new ones.
 * <li>Other factory methods to create method handles that emulate other common JVM operations or control flow patterns.
46
 * <li>Wrapper methods which can convert between method handles and interface types.
47
 * </ul>
48 49 50 51 52 53 54
 * <p>
 * @author John Rose, JSR 292 EG
 */
public class MethodHandles {

    private MethodHandles() { }  // do not instantiate

55
    private static final MemberName.Factory IMPL_NAMES = MemberName.getFactory();
56 57 58 59 60
    static { MethodHandleImpl.initStatics(); }
    // See IMPL_LOOKUP below.

    //// Method handle creation from ordinary methods.

61
    /**
62
     * Returns a {@link Lookup lookup object} on the caller,
63 64 65 66
     * which has the capability to access any method handle that the caller has access to,
     * including direct method handles to private fields and methods.
     * This lookup object is a <em>capability</em> which may be delegated to trusted agents.
     * Do not store it in place where untrusted code can access it.
67
     */
68 69 70 71
    public static Lookup lookup() {
        return new Lookup();
    }

72
    /**
73
     * Returns a {@link Lookup lookup object} which is trusted minimally.
74 75
     * It can only be used to create method handles to
     * publicly accessible fields and methods.
76 77 78 79 80 81 82 83
     * <p>
     * As a matter of pure convention, the {@linkplain Lookup#lookupClass lookup class}
     * of this lookup object will be {@link java.lang.Object}.
     * <p>
     * The lookup class can be changed to any other class {@code C} using an expression of the form
     * {@linkplain Lookup#in <code>publicLookup().in(C.class)</code>}.
     * Since all classes have equal access to public names,
     * such a change would confer no new access rights.
84 85 86 87 88
     */
    public static Lookup publicLookup() {
        return Lookup.PUBLIC_LOOKUP;
    }

89
    /**
90 91 92
     * A <em>lookup object</em> is a factory for creating method handles,
     * when the creation requires access checking.
     * Method handles do not perform
93
     * access checks when they are called, but rather when they are created.
94 95
     * Therefore, method handle access
     * restrictions must be enforced when a method handle is created.
96
     * The caller class against which those restrictions are enforced
97
     * is known as the {@linkplain #lookupClass lookup class}.
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
     * <p>
     * A lookup class which needs to create method handles will call
     * {@link MethodHandles#lookup MethodHandles.lookup} to create a factory for itself.
     * When the {@code Lookup} factory object is created, the identity of the lookup class is
     * determined, and securely stored in the {@code Lookup} object.
     * The lookup class (or its delegates) may then use factory methods
     * on the {@code Lookup} object to create method handles for access-checked members.
     * This includes all methods, constructors, and fields which are allowed to the lookup class,
     * even private ones.
     * <p>
     * The factory methods on a {@code Lookup} object correspond to all major
     * use cases for methods, constructors, and fields.
     * Here is a summary of the correspondence between these factory methods and
     * the behavior the resulting method handles:
     * <code>
     * <table border=1 cellpadding=5 summary="lookup method behaviors">
     * <tr><th>lookup expression</th><th>member</th><th>behavior</th></tr>
     * <tr>
116
     *     <td>{@linkplain java.lang.invoke.MethodHandles.Lookup#findGetter lookup.findGetter(C.class,"f",FT.class)}</td>
117 118 119
     *     <td>FT f;</td><td>(T) this.f;</td>
     * </tr>
     * <tr>
120
     *     <td>{@linkplain java.lang.invoke.MethodHandles.Lookup#findStaticGetter lookup.findStaticGetter(C.class,"f",FT.class)}</td>
121 122 123
     *     <td>static<br>FT f;</td><td>(T) C.f;</td>
     * </tr>
     * <tr>
124
     *     <td>{@linkplain java.lang.invoke.MethodHandles.Lookup#findSetter lookup.findSetter(C.class,"f",FT.class)}</td>
125 126 127
     *     <td>FT f;</td><td>this.f = x;</td>
     * </tr>
     * <tr>
128
     *     <td>{@linkplain java.lang.invoke.MethodHandles.Lookup#findStaticSetter lookup.findStaticSetter(C.class,"f",FT.class)}</td>
129 130 131
     *     <td>static<br>FT f;</td><td>C.f = arg;</td>
     * </tr>
     * <tr>
132
     *     <td>{@linkplain java.lang.invoke.MethodHandles.Lookup#findVirtual lookup.findVirtual(C.class,"m",MT)}</td>
133 134 135
     *     <td>T m(A*);</td><td>(T) this.m(arg*);</td>
     * </tr>
     * <tr>
136
     *     <td>{@linkplain java.lang.invoke.MethodHandles.Lookup#findStatic lookup.findStatic(C.class,"m",MT)}</td>
137 138 139
     *     <td>static<br>T m(A*);</td><td>(T) C.m(arg*);</td>
     * </tr>
     * <tr>
140
     *     <td>{@linkplain java.lang.invoke.MethodHandles.Lookup#findSpecial lookup.findSpecial(C.class,"m",MT,this.class)}</td>
141 142 143
     *     <td>T m(A*);</td><td>(T) super.m(arg*);</td>
     * </tr>
     * <tr>
144
     *     <td>{@linkplain java.lang.invoke.MethodHandles.Lookup#findConstructor lookup.findConstructor(C.class,MT)}</td>
145 146 147
     *     <td>C(A*);</td><td>(T) new C(arg*);</td>
     * </tr>
     * <tr>
148
     *     <td>{@linkplain java.lang.invoke.MethodHandles.Lookup#unreflectGetter lookup.unreflectGetter(aField)}</td>
149 150 151
     *     <td>(static)?<br>FT f;</td><td>(FT) aField.get(thisOrNull);</td>
     * </tr>
     * <tr>
152
     *     <td>{@linkplain java.lang.invoke.MethodHandles.Lookup#unreflectSetter lookup.unreflectSetter(aField)}</td>
153 154 155
     *     <td>(static)?<br>FT f;</td><td>aField.set(thisOrNull, arg);</td>
     * </tr>
     * <tr>
156
     *     <td>{@linkplain java.lang.invoke.MethodHandles.Lookup#unreflect lookup.unreflect(aMethod)}</td>
157 158 159
     *     <td>(static)?<br>T m(A*);</td><td>(T) aMethod.invoke(thisOrNull, arg*);</td>
     * </tr>
     * <tr>
160
     *     <td>{@linkplain java.lang.invoke.MethodHandles.Lookup#unreflectConstructor lookup.unreflectConstructor(aConstructor)}</td>
161 162 163
     *     <td>C(A*);</td><td>(C) aConstructor.newInstance(arg*);</td>
     * </tr>
     * <tr>
164
     *     <td>{@linkplain java.lang.invoke.MethodHandles.Lookup#unreflect lookup.unreflect(aMethod)}</td>
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
     *     <td>(static)?<br>T m(A*);</td><td>(T) aMethod.invoke(thisOrNull, arg*);</td>
     * </tr>
     * </table>
     * </code>
     * Here, the type {@code C} is the class or interface being searched for a member,
     * documented as a parameter named {@code refc} in the lookup methods.
     * The method or constructor type {@code MT} is composed from the return type {@code T}
     * and the sequence of argument types {@code A*}.
     * Both {@code MT} and the field type {@code FT} are documented as a parameter named {@code type}.
     * The formal parameter {@code this} stands for the self-reference of type {@code C};
     * if it is present, it is always the leading argument to the method handle invocation.
     * The name {@code arg} stands for all the other method handle arguments.
     * In the code examples for the Core Reflection API, the name {@code thisOrNull}
     * stands for a null reference if the accessed method or field is static,
     * and {@code this} otherwise.
     * The names {@code aMethod}, {@code aField}, and {@code aConstructor} stand
     * for reflective objects corresponding to the given members.
     * <p>
     * The equivalence between looked-up method handles and underlying
     * class members can break down in a few ways:
     * <ul>
     * <li>If {@code C} is not symbolically accessible from the lookup class's loader,
     * the lookup can still succeed, even when there is no equivalent
     * Java expression or bytecoded constant.
     * <li>Likewise, if {@code T} or {@code MT}
     * is not symbolically accessible from the lookup class's loader,
     * the lookup can still succeed.
     * For example, lookups for {@code MethodHandle.invokeExact} and
193
     * {@code MethodHandle.invoke} will always succeed, regardless of requested type.
194 195 196 197
     * <li>If there is a security manager installed, it can forbid the lookup
     * on various grounds (<a href="#secmgr">see below</a>).
     * By contrast, the {@code ldc} instruction is not subject to
     * security manager checks.
198 199 200 201 202 203 204 205 206 207 208 209 210
     * </ul>
     *
     * <h3><a name="access"></a>Access checking</h3>
     * Access checks are applied in the factory methods of {@code Lookup},
     * when a method handle is created.
     * This is a key difference from the Core Reflection API, since
     * {@link java.lang.reflect.Method#invoke Method.invoke}
     * performs access checking against every caller, on every call.
     * <p>
     * All access checks start from a {@code Lookup} object, which
     * compares its recorded lookup class against all requests to
     * create method handles.
     * A single {@code Lookup} object can be used to create any number
211 212 213
     * of access-checked method handles, all checked against a single
     * lookup class.
     * <p>
214 215 216 217 218 219 220
     * A {@code Lookup} object can be shared with other trusted code,
     * such as a metaobject protocol.
     * A shared {@code Lookup} object delegates the capability
     * to create method handles on private members of the lookup class.
     * Even if privileged code uses the {@code Lookup} object,
     * the access checking is confined to the privileges of the
     * original lookup class.
221
     * <p>
222
     * A lookup can fail, because
223 224 225
     * the containing class is not accessible to the lookup class, or
     * because the desired class member is missing, or because the
     * desired class member is not accessible to the lookup class.
226 227 228 229 230 231 232 233
     * In any of these cases, a {@code ReflectiveOperationException} will be
     * thrown from the attempted lookup.  The exact class will be one of
     * the following:
     * <ul>
     * <li>NoSuchMethodException &mdash; if a method is requested but does not exist
     * <li>NoSuchFieldException &mdash; if a field is requested but does not exist
     * <li>IllegalAccessException &mdash; if the member exists but an access check fails
     * </ul>
234
     * <p>
235
     * In general, the conditions under which a method handle may be
236 237 238 239
     * looked up for a method {@code M} are exactly equivalent to the conditions
     * under which the lookup class could have compiled and resolved a call to {@code M}.
     * And the effect of invoking the method handle resulting from the lookup
     * is exactly equivalent to executing the compiled and resolved call to {@code M}.
240
     * The same point is true of fields and constructors.
241
     * <p>
242
     * In some cases, access between nested classes is obtained by the Java compiler by creating
243 244
     * an wrapper method to access a private method of another class
     * in the same top-level declaration.
245
     * For example, a nested class {@code C.D}
246
     * can access private members within other related classes such as
247 248 249 250 251 252 253
     * {@code C}, {@code C.D.E}, or {@code C.B},
     * but the Java compiler may need to generate wrapper methods in
     * those related classes.  In such cases, a {@code Lookup} object on
     * {@code C.E} would be unable to those private members.
     * A workaround for this limitation is the {@link Lookup#in Lookup.in} method,
     * which can transform a lookup on {@code C.E} into one on any of those other
     * classes, without special elevation of privilege.
254
     * <p>
255 256 257 258 259 260 261 262 263 264 265 266
     * Although bytecode instructions can only refer to classes in
     * a related class loader, this API can search for methods in any
     * class, as long as a reference to its {@code Class} object is
     * available.  Such cross-loader references are also possible with the
     * Core Reflection API, and are impossible to bytecode instructions
     * such as {@code invokestatic} or {@code getfield}.
     * There is a {@linkplain java.lang.SecurityManager security manager API}
     * to allow applications to check such cross-loader references.
     * These checks apply to both the {@code MethodHandles.Lookup} API
     * and the Core Reflection API
     * (as found on {@link java.lang.Class Class}).
     * <p>
267 268 269 270 271 272 273
     * Access checks only apply to named and reflected methods,
     * constructors, and fields.
     * Other method handle creation methods, such as
     * {@link #convertArguments MethodHandles.convertArguments},
     * do not require any access checks, and are done
     * with static methods of {@link MethodHandles},
     * independently of any {@code Lookup} object.
274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
     *
     * <h3>Security manager interactions</h3>
     * <a name="secmgr"></a>
     * If a security manager is present, member lookups are subject to
     * additional checks.
     * From one to four calls are made to the security manager.
     * Any of these calls can refuse access by throwing a
     * {@link java.lang.SecurityException SecurityException}.
     * Define {@code smgr} as the security manager,
     * {@code refc} as the containing class in which the member
     * is being sought, and {@code defc} as the class in which the
     * member is actually defined.
     * The calls are made according to the following rules:
     * <ul>
     * <li>In all cases, {@link SecurityManager#checkMemberAccess
     *     smgr.checkMemberAccess(refc, Member.PUBLIC)} is called.
     * <li>If the class loader of the lookup class is not
     *     the same as or an ancestor of the class loader of {@code refc},
     *     then {@link SecurityManager#checkPackageAccess
     *     smgr.checkPackageAccess(refcPkg)} is called,
     *     where {@code refcPkg} is the package of {@code refc}.
     * <li>If the retrieved member is not public,
     *     {@link SecurityManager#checkMemberAccess
     *     smgr.checkMemberAccess(defc, Member.DECLARED)} is called.
     *     (Note that {@code defc} might be the same as {@code refc}.)
     * <li>If the retrieved member is not public,
     *     and if {@code defc} and {@code refc} are in different class loaders,
     *     and if the class loader of the lookup class is not
     *     the same as or an ancestor of the class loader of {@code defc},
     *     then {@link SecurityManager#checkPackageAccess
     *     smgr.checkPackageAccess(defcPkg)} is called,
     *     where {@code defcPkg} is the package of {@code defc}.
     * </ul>
     * In all cases, the requesting class presented to the security
     * manager will be the lookup class from the current {@code Lookup} object.
309 310 311
     */
    public static final
    class Lookup {
312
        /** The class on behalf of whom the lookup is being performed. */
313 314
        private final Class<?> lookupClass;

315
        /** The allowed sorts of members which may be looked up (PUBLIC, etc.). */
316 317
        private final int allowedModes;

318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
        /** A single-bit mask representing {@code public} access,
         *  which may contribute to the result of {@link #lookupModes lookupModes}.
         *  The value, {@code 0x01}, happens to be the same as the value of the
         *  {@code public} {@linkplain java.lang.reflect.Modifier#PUBLIC modifier bit}.
         */
        public static final int PUBLIC = Modifier.PUBLIC;

        /** A single-bit mask representing {@code private} access,
         *  which may contribute to the result of {@link #lookupModes lookupModes}.
         *  The value, {@code 0x02}, happens to be the same as the value of the
         *  {@code private} {@linkplain java.lang.reflect.Modifier#PRIVATE modifier bit}.
         */
        public static final int PRIVATE = Modifier.PRIVATE;

        /** A single-bit mask representing {@code protected} access,
         *  which may contribute to the result of {@link #lookupModes lookupModes}.
         *  The value, {@code 0x04}, happens to be the same as the value of the
         *  {@code protected} {@linkplain java.lang.reflect.Modifier#PROTECTED modifier bit}.
         */
        public static final int PROTECTED = Modifier.PROTECTED;

        /** A single-bit mask representing {@code package} access (default access),
         *  which may contribute to the result of {@link #lookupModes lookupModes}.
         *  The value is {@code 0x08}, which does not correspond meaningfully to
         *  any particular {@linkplain java.lang.reflect.Modifier modifier bit}.
         */
        public static final int PACKAGE = Modifier.STATIC;

        private static final int ALL_MODES = (PUBLIC | PRIVATE | PROTECTED | PACKAGE);
        private static final int TRUSTED   = -1;
348 349 350 351 352 353

        private static int fixmods(int mods) {
            mods &= (ALL_MODES - PACKAGE);
            return (mods != 0) ? mods : PACKAGE;
        }

354
        /** Tells which class is performing the lookup.  It is this class against
355 356
         *  which checks are performed for visibility and access permissions.
         *  <p>
357 358
         *  The class implies a maximum level of access permission,
         *  but the permissions may be additionally limited by the bitmask
359
         *  {@link #lookupModes lookupModes}, which controls whether non-public members
360
         *  can be accessed.
361 362 363 364 365
         */
        public Class<?> lookupClass() {
            return lookupClass;
        }

366 367 368 369 370
        // This is just for calling out to MethodHandleImpl.
        private Class<?> lookupClassOrNull() {
            return (allowedModes == TRUSTED) ? null : lookupClass;
        }

371
        /** Tells which access-protection classes of members this lookup object can produce.
372 373 374 375 376
         *  The result is a bit-mask of the bits
         *  {@linkplain #PUBLIC PUBLIC (0x01)},
         *  {@linkplain #PRIVATE PRIVATE (0x02)},
         *  {@linkplain #PROTECTED PROTECTED (0x04)},
         *  and {@linkplain #PACKAGE PACKAGE (0x08)}.
377 378
         *  <p>
         *  A freshly-created lookup object
379
         *  on the {@linkplain java.lang.invoke.MethodHandles#lookup() caller's class}
380 381
         *  has all possible bits set, since the caller class can access all its own members.
         *  A lookup object on a new lookup class
382
         *  {@linkplain java.lang.invoke.MethodHandles.Lookup#in created from a previous lookup object}
383 384 385 386
         *  may have some mode bits set to zero.
         *  The purpose of this is to restrict access via the new lookup object,
         *  so that it can access only names which can be reached by the original
         *  lookup object, and also by the new lookup class.
387
         */
388
        public int lookupModes() {
389 390 391
            return allowedModes & ALL_MODES;
        }

392 393 394 395
        /** Embody the current class (the lookupClass) as a lookup class
         * for method handle creation.
         * Must be called by from a method in this package,
         * which in turn is called by a method not in this package.
396
         * <p>
397 398 399 400
         * Also, don't make it private, lest javac interpose
         * an access$N method.
         */
        Lookup() {
401 402 403
            this(getCallerClassAtEntryPoint(), ALL_MODES);
            // make sure we haven't accidentally picked up a privileged class:
            checkUnprivilegedlookupClass(lookupClass);
404 405
        }

406
        Lookup(Class<?> lookupClass) {
407 408 409 410
            this(lookupClass, ALL_MODES);
        }

        private Lookup(Class<?> lookupClass, int allowedModes) {
411
            this.lookupClass = lookupClass;
412
            this.allowedModes = allowedModes;
413 414 415
        }

        /**
416
         * Creates a lookup on the specified new lookup class.
417
         * The resulting object will report the specified
418
         * class as its own {@link #lookupClass lookupClass}.
419 420 421
         * <p>
         * However, the resulting {@code Lookup} object is guaranteed
         * to have no more access capabilities than the original.
422
         * In particular, access capabilities can be lost as follows:<ul>
423 424
         * <li>If the new lookup class differs from the old one,
         * protected members will not be accessible by virtue of inheritance.
425
         * (Protected members may continue to be accessible because of package sharing.)
426 427 428 429
         * <li>If the new lookup class is in a different package
         * than the old one, protected and default (package) members will not be accessible.
         * <li>If the new lookup class is not within the same package member
         * as the old one, private members will not be accessible.
430 431 432
         * <li>If the new lookup class is not accessible to the old lookup class,
         * then no members, not even public members, will be accessible.
         * (In all other cases, public members will continue to be accessible.)
433
         * </ul>
434 435 436 437
         *
         * @param requestedLookupClass the desired lookup class for the new lookup object
         * @return a lookup object which reports the desired lookup class
         * @throws NullPointerException if the argument is null
438
         */
439 440 441 442 443 444 445 446 447 448
        public Lookup in(Class<?> requestedLookupClass) {
            requestedLookupClass.getClass();  // null check
            if (allowedModes == TRUSTED)  // IMPL_LOOKUP can make any lookup at all
                return new Lookup(requestedLookupClass, ALL_MODES);
            if (requestedLookupClass == this.lookupClass)
                return this;  // keep same capabilities
            int newModes = (allowedModes & (ALL_MODES & ~PROTECTED));
            if ((newModes & PACKAGE) != 0
                && !VerifyAccess.isSamePackage(this.lookupClass, requestedLookupClass)) {
                newModes &= ~(PACKAGE|PRIVATE);
449
            }
450
            // Allow nestmate lookups to be created without special privilege:
451 452 453 454
            if ((newModes & PRIVATE) != 0
                && !VerifyAccess.isSamePackageMember(this.lookupClass, requestedLookupClass)) {
                newModes &= ~PRIVATE;
            }
455 456 457 458 459 460
            if (newModes == PUBLIC
                && !VerifyAccess.isClassAccessible(requestedLookupClass, this.lookupClass)) {
                // The requested class it not accessible from the lookup class.
                // No permissions.
                newModes = 0;
            }
461 462
            checkUnprivilegedlookupClass(requestedLookupClass);
            return new Lookup(requestedLookupClass, newModes);
463 464
        }

465
        // Make sure outer class is initialized first.
466
        static { IMPL_NAMES.getClass(); }
467

468 469 470 471
        /** Version of lookup which is trusted minimally.
         *  It can only be used to create method handles to
         *  publicly accessible members.
         */
472
        static final Lookup PUBLIC_LOOKUP = new Lookup(Object.class, PUBLIC);
473 474

        /** Package-private version of lookup which is trusted. */
475
        static final Lookup IMPL_LOOKUP = new Lookup(Object.class, TRUSTED);
476 477

        private static void checkUnprivilegedlookupClass(Class<?> lookupClass) {
478
            String name = lookupClass.getName();
479
            if (name.startsWith("java.lang.invoke."))
480 481 482
                throw newIllegalArgumentException("illegal lookupClass: "+lookupClass);
        }

483
        /**
484
         * Displays the name of the class from which lookups are to be made.
485 486 487
         * (The name is the one reported by {@link java.lang.Class#getName() Class.getName}.)
         * If there are restrictions on the access permitted to this lookup,
         * this is indicated by adding a suffix to the class name, consisting
488 489
         * of a slash and a keyword.  The keyword represents the strongest
         * allowed access, and is chosen as follows:
490 491 492 493 494 495 496 497 498 499
         * <ul>
         * <li>If no access is allowed, the suffix is "/noaccess".
         * <li>If only public access is allowed, the suffix is "/public".
         * <li>If only public and package access are allowed, the suffix is "/package".
         * <li>If only public, package, and private access are allowed, the suffix is "/private".
         * </ul>
         * If none of the above cases apply, it is the case that full
         * access (public, package, private, and protected) is allowed.
         * In this case, no suffix is added.
         * This is true only of an object obtained originally from
500 501
         * {@link java.lang.invoke.MethodHandles#lookup MethodHandles.lookup}.
         * Objects created by {@link java.lang.invoke.MethodHandles.Lookup#in Lookup.in}
502
         * always have restricted access, and will display a suffix.
503 504 505 506 507 508 509
         * <p>
         * (It may seem strange that protected access should be
         * stronger than private access.  Viewed independently from
         * package access, protected access is the first to be lost,
         * because it requires a direct subclass relationship between
         * caller and callee.)
         * @see #in
510
         */
511 512
        @Override
        public String toString() {
513 514
            String cname = lookupClass.getName();
            switch (allowedModes) {
515 516
            case 0:  // no privileges
                return cname + "/noaccess";
517
            case PUBLIC:
518
                return cname + "/public";
519 520
            case PUBLIC|PACKAGE:
                return cname + "/package";
521 522
            case ALL_MODES & ~PROTECTED:
                return cname + "/private";
523 524
            case ALL_MODES:
                return cname;
525 526 527 528 529 530
            case TRUSTED:
                return "/trusted";  // internal only; not exported
            default:  // Should not happen, but it's a bitfield...
                cname = cname + "/" + Integer.toHexString(allowedModes);
                assert(false) : cname;
                return cname;
531
            }
532 533 534 535 536 537 538 539
        }

        // call this from an entry point method in Lookup with extraFrames=0.
        private static Class<?> getCallerClassAtEntryPoint() {
            final int CALLER_DEPTH = 4;
            // 0: Reflection.getCC, 1: getCallerClassAtEntryPoint,
            // 2: Lookup.<init>, 3: MethodHandles.*, 4: caller
            // Note:  This should be the only use of getCallerClass in this file.
540
            assert(Reflection.getCallerClass(CALLER_DEPTH-1) == MethodHandles.class);
541 542 543 544
            return Reflection.getCallerClass(CALLER_DEPTH);
        }

        /**
545
         * Produces a method handle for a static method.
546
         * The type of the method handle will be that of the method.
547 548
         * (Since static methods do not take receivers, there is no
         * additional receiver argument inserted into the method handle type,
549
         * as there would be with {@link #findVirtual findVirtual} or {@link #findSpecial findSpecial}.)
550 551 552
         * The method and all its argument types must be accessible to the lookup class.
         * If the method's class has not yet been initialized, that is done
         * immediately, before the method handle is returned.
553 554 555 556
         * <p>
         * The returned method handle will have
         * {@linkplain MethodHandle#asVarargsCollector variable arity} if and only if
         * the method's variable arity modifier bit ({@code 0x0080}) is set.
557
         * @param refc the class from which the method is accessed
558 559 560
         * @param name the name of the method
         * @param type the type of the method
         * @return the desired method handle
561 562
         * @throws NoSuchMethodException if the method does not exist
         * @throws IllegalAccessException if access checking fails, or if the method is not {@code static}
563 564
         * @exception SecurityException if a security manager is present and it
         *                              <a href="MethodHandles.Lookup.html#secmgr">refuses access</a>
565
         * @throws NullPointerException if any argument is null
566 567
         */
        public
568
        MethodHandle findStatic(Class<?> refc, String name, MethodType type) throws NoSuchMethodException, IllegalAccessException {
569 570
            MemberName method = resolveOrFail(refc, name, type, true);
            checkMethod(refc, method, true);
571
            return MethodHandleImpl.findMethod(method, false, lookupClassOrNull());
572 573 574
        }

        /**
575
         * Produces a method handle for a virtual method.
576
         * The type of the method handle will be that of the method,
577
         * with the receiver type (usually {@code refc}) prepended.
578 579 580 581 582 583 584
         * The method and all its argument types must be accessible to the lookup class.
         * <p>
         * When called, the handle will treat the first argument as a receiver
         * and dispatch on the receiver's type to determine which method
         * implementation to enter.
         * (The dispatching action is identical with that performed by an
         * {@code invokevirtual} or {@code invokeinterface} instruction.)
585 586 587 588
         * <p>
         * The returned method handle will have
         * {@linkplain MethodHandle#asVarargsCollector variable arity} if and only if
         * the method's variable arity modifier bit ({@code 0x0080}) is set.
589 590 591 592
         * <p>
         * Because of the general equivalence between {@code invokevirtual}
         * instructions and method handles produced by {@code findVirtual},
         * if the class is {@code MethodHandle} and the name string is
593
         * {@code invokeExact} or {@code invoke}, the resulting
594
         * method handle is equivalent to one produced by
595
         * {@link java.lang.invoke.MethodHandles#exactInvoker MethodHandles.exactInvoker} or
596
         * {@link java.lang.invoke.MethodHandles#invoker MethodHandles.invoker}
597 598
         * with the same {@code type} argument.
         *
599
         * @param refc the class or interface from which the method is accessed
600 601 602
         * @param name the name of the method
         * @param type the type of the method, with the receiver argument omitted
         * @return the desired method handle
603 604
         * @throws NoSuchMethodException if the method does not exist
         * @throws IllegalAccessException if access checking fails, or if the method is {@code static}
605 606
         * @exception SecurityException if a security manager is present and it
         *                              <a href="MethodHandles.Lookup.html#secmgr">refuses access</a>
607
         * @throws NullPointerException if any argument is null
608
         */
609
        public MethodHandle findVirtual(Class<?> refc, String name, MethodType type) throws NoSuchMethodException, IllegalAccessException {
610 611
            MemberName method = resolveOrFail(refc, name, type, false);
            checkMethod(refc, method, false);
612
            MethodHandle mh = MethodHandleImpl.findMethod(method, true, lookupClassOrNull());
613 614 615 616
            return restrictProtectedReceiver(method, mh);
        }

        /**
617
         * Produces a method handle which creates an object and initializes it, using
618 619 620 621 622 623 624 625
         * the constructor of the specified type.
         * The parameter types of the method handle will be those of the constructor,
         * while the return type will be a reference to the constructor's class.
         * The constructor and all its argument types must be accessible to the lookup class.
         * If the constructor's class has not yet been initialized, that is done
         * immediately, before the method handle is returned.
         * <p>
         * Note:  The requested type must have a return type of {@code void}.
626
         * This is consistent with the JVM's treatment of constructor type descriptors.
627 628 629 630
         * <p>
         * The returned method handle will have
         * {@linkplain MethodHandle#asVarargsCollector variable arity} if and only if
         * the constructor's variable arity modifier bit ({@code 0x0080}) is set.
631 632 633
         * @param refc the class or interface from which the method is accessed
         * @param type the type of the method, with the receiver argument omitted, and a void return type
         * @return the desired method handle
634 635
         * @throws NoSuchMethodException if the constructor does not exist
         * @throws IllegalAccessException if access checking fails
636 637
         * @exception SecurityException if a security manager is present and it
         *                              <a href="MethodHandles.Lookup.html#secmgr">refuses access</a>
638
         * @throws NullPointerException if any argument is null
639
         */
640
        public MethodHandle findConstructor(Class<?> refc, MethodType type) throws NoSuchMethodException, IllegalAccessException {
641 642 643 644
            String name = "<init>";
            MemberName ctor = resolveOrFail(refc, name, type, false, false, lookupClassOrNull());
            assert(ctor.isConstructor());
            checkAccess(refc, ctor);
645 646
            MethodHandle rawMH = MethodHandleImpl.findMethod(ctor, false, lookupClassOrNull());
            MethodHandle allocMH = MethodHandleImpl.makeAllocator(rawMH);
647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662
            return fixVarargs(allocMH, rawMH);
        }

        /** Return a version of MH which matches matchMH w.r.t. isVarargsCollector. */
        private static MethodHandle fixVarargs(MethodHandle mh, MethodHandle matchMH) {
            boolean va1 = mh.isVarargsCollector();
            boolean va2 = matchMH.isVarargsCollector();
            if (va1 == va2) {
                return mh;
            } else if (va2) {
                MethodType type = mh.type();
                int arity = type.parameterCount();
                return mh.asVarargsCollector(type.parameterType(arity-1));
            } else {
                throw new InternalError("already varargs, but template is not: "+mh);
            }
663 664 665
        }

        /**
666
         * Produces an early-bound method handle for a virtual method,
667
         * as if called from an {@code invokespecial}
668
         * instruction from {@code caller}.
669
         * The type of the method handle will be that of the method,
670
         * with a suitably restricted receiver type (such as {@code caller}) prepended.
671
         * The method and all its argument types must be accessible
672 673 674 675 676 677 678 679
         * to the caller.
         * <p>
         * When called, the handle will treat the first argument as a receiver,
         * but will not dispatch on the receiver's type.
         * (This direct invocation action is identical with that performed by an
         * {@code invokespecial} instruction.)
         * <p>
         * If the explicitly specified caller class is not identical with the
680 681
         * lookup class, or if this lookup object does not have private access
         * privileges, the access fails.
682 683 684 685
         * <p>
         * The returned method handle will have
         * {@linkplain MethodHandle#asVarargsCollector variable arity} if and only if
         * the method's variable arity modifier bit ({@code 0x0080}) is set.
686 687
         * @param refc the class or interface from which the method is accessed
         * @param name the name of the method (which must not be "&lt;init&gt;")
688 689 690
         * @param type the type of the method, with the receiver argument omitted
         * @param specialCaller the proposed calling class to perform the {@code invokespecial}
         * @return the desired method handle
691 692
         * @throws NoSuchMethodException if the method does not exist
         * @throws IllegalAccessException if access checking fails
693 694
         * @exception SecurityException if a security manager is present and it
         *                              <a href="MethodHandles.Lookup.html#secmgr">refuses access</a>
695
         * @throws NullPointerException if any argument is null
696
         */
697
        public MethodHandle findSpecial(Class<?> refc, String name, MethodType type,
698
                                        Class<?> specialCaller) throws NoSuchMethodException, IllegalAccessException {
699 700 701
            checkSpecialCaller(specialCaller);
            MemberName method = resolveOrFail(refc, name, type, false, false, specialCaller);
            checkMethod(refc, method, false);
702
            MethodHandle mh = MethodHandleImpl.findMethod(method, false, specialCaller);
703 704 705 706
            return restrictReceiver(method, mh, specialCaller);
        }

        /**
707
         * Produces a method handle giving read access to a non-static field.
708 709
         * The type of the method handle will have a return type of the field's
         * value type.
710
         * The method handle's single argument will be the instance containing
711 712
         * the field.
         * Access checking is performed immediately on behalf of the lookup class.
713
         * @param refc the class or interface from which the method is accessed
714 715 716
         * @param name the field's name
         * @param type the field's type
         * @return a method handle which can load values from the field
717 718
         * @throws NoSuchFieldException if the field does not exist
         * @throws IllegalAccessException if access checking fails, or if the field is {@code static}
719 720
         * @exception SecurityException if a security manager is present and it
         *                              <a href="MethodHandles.Lookup.html#secmgr">refuses access</a>
721
         * @throws NullPointerException if any argument is null
722
         */
723
        public MethodHandle findGetter(Class<?> refc, String name, Class<?> type) throws NoSuchFieldException, IllegalAccessException {
724
            return makeAccessor(refc, name, type, false, false);
725 726 727
        }

        /**
728
         * Produces a method handle giving write access to a non-static field.
729
         * The type of the method handle will have a void return type.
730
         * The method handle will take two arguments, the instance containing
731
         * the field, and the value to be stored.
732 733
         * The second argument will be of the field's value type.
         * Access checking is performed immediately on behalf of the lookup class.
734
         * @param refc the class or interface from which the method is accessed
735 736 737
         * @param name the field's name
         * @param type the field's type
         * @return a method handle which can store values into the field
738 739
         * @throws NoSuchFieldException if the field does not exist
         * @throws IllegalAccessException if access checking fails, or if the field is {@code static}
740 741
         * @exception SecurityException if a security manager is present and it
         *                              <a href="MethodHandles.Lookup.html#secmgr">refuses access</a>
742
         * @throws NullPointerException if any argument is null
743
         */
744
        public MethodHandle findSetter(Class<?> refc, String name, Class<?> type) throws NoSuchFieldException, IllegalAccessException {
745 746 747 748
            return makeAccessor(refc, name, type, false, true);
        }

        /**
749
         * Produces a method handle giving read access to a static field.
750 751 752 753
         * The type of the method handle will have a return type of the field's
         * value type.
         * The method handle will take no arguments.
         * Access checking is performed immediately on behalf of the lookup class.
754
         * @param refc the class or interface from which the method is accessed
755 756 757
         * @param name the field's name
         * @param type the field's type
         * @return a method handle which can load values from the field
758 759
         * @throws NoSuchFieldException if the field does not exist
         * @throws IllegalAccessException if access checking fails, or if the field is not {@code static}
760 761
         * @exception SecurityException if a security manager is present and it
         *                              <a href="MethodHandles.Lookup.html#secmgr">refuses access</a>
762
         * @throws NullPointerException if any argument is null
763
         */
764
        public MethodHandle findStaticGetter(Class<?> refc, String name, Class<?> type) throws NoSuchFieldException, IllegalAccessException {
765 766 767 768
            return makeAccessor(refc, name, type, true, false);
        }

        /**
769
         * Produces a method handle giving write access to a static field.
770 771 772
         * The type of the method handle will have a void return type.
         * The method handle will take a single
         * argument, of the field's value type, the value to be stored.
773
         * Access checking is performed immediately on behalf of the lookup class.
774
         * @param refc the class or interface from which the method is accessed
775 776
         * @param name the field's name
         * @param type the field's type
777
         * @return a method handle which can store values into the field
778 779
         * @throws NoSuchFieldException if the field does not exist
         * @throws IllegalAccessException if access checking fails, or if the field is not {@code static}
780 781
         * @exception SecurityException if a security manager is present and it
         *                              <a href="MethodHandles.Lookup.html#secmgr">refuses access</a>
782
         * @throws NullPointerException if any argument is null
783
         */
784
        public MethodHandle findStaticSetter(Class<?> refc, String name, Class<?> type) throws NoSuchFieldException, IllegalAccessException {
785
            return makeAccessor(refc, name, type, true, true);
786 787 788
        }

        /**
789
         * Produces an early-bound method handle for a non-static method.
790 791 792
         * The receiver must have a supertype {@code defc} in which a method
         * of the given name and type is accessible to the lookup class.
         * The method and all its argument types must be accessible to the lookup class.
793 794 795 796 797
         * The type of the method handle will be that of the method,
         * without any insertion of an additional receiver parameter.
         * The given receiver will be bound into the method handle,
         * so that every call to the method handle will invoke the
         * requested method on the given receiver.
798
         * <p>
799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814
         * The returned method handle will have
         * {@linkplain MethodHandle#asVarargsCollector variable arity} if and only if
         * the method's variable arity modifier bit ({@code 0x0080}) is set
         * <em>and</em> the trailing array argument is not the only argument.
         * (If the trailing array argument is the only argument,
         * the given receiver value will be bound to it.)
         * <p>
         * This is equivalent to the following code:
         * <blockquote><pre>
MethodHandle mh0 = {@link #findVirtual findVirtual}(defc, name, type);
MethodHandle mh1 = mh0.{@link MethodHandle#bindTo bindTo}(receiver);
MethodType mt1 = mh1.type();
if (mh0.isVarargsCollector() && mt1.parameterCount() > 0) {
  mh1 = mh1.asVarargsCollector(mt1.parameterType(mt1.parameterCount()-1));
return mh1;
         * </pre></blockquote>
815 816 817
         * where {@code defc} is either {@code receiver.getClass()} or a super
         * type of that class, in which the requested method is accessible
         * to the lookup class.
818
         * (Note that {@code bindTo} does not preserve variable arity.)
819 820 821 822
         * @param receiver the object from which the method is accessed
         * @param name the name of the method
         * @param type the type of the method, with the receiver argument omitted
         * @return the desired method handle
823 824
         * @throws NoSuchMethodException if the method does not exist
         * @throws IllegalAccessException if access checking fails
825 826
         * @exception SecurityException if a security manager is present and it
         *                              <a href="MethodHandles.Lookup.html#secmgr">refuses access</a>
827
         * @throws NullPointerException if any argument is null
828
         */
829
        public MethodHandle bind(Object receiver, String name, MethodType type) throws NoSuchMethodException, IllegalAccessException {
830 831 832
            Class<? extends Object> refc = receiver.getClass(); // may get NPE
            MemberName method = resolveOrFail(refc, name, type, false);
            checkMethod(refc, method, false);
833 834
            MethodHandle dmh = MethodHandleImpl.findMethod(method, true, lookupClassOrNull());
            MethodHandle bmh = MethodHandleImpl.bindReceiver(dmh, receiver);
835
            if (bmh == null)
836
                throw method.makeAccessException("no access", this);
837 838 839
            if (dmh.type().parameterCount() == 0)
                return dmh;  // bound the trailing parameter; no varargs possible
            return fixVarargs(bmh, dmh);
840 841 842
        }

        /**
843
         * Makes a direct method handle to <i>m</i>, if the lookup class has permission.
844 845 846 847 848 849 850 851
         * If <i>m</i> is non-static, the receiver argument is treated as an initial argument.
         * If <i>m</i> is virtual, overriding is respected on every call.
         * Unlike the Core Reflection API, exceptions are <em>not</em> wrapped.
         * The type of the method handle will be that of the method,
         * with the receiver type prepended (but only if it is non-static).
         * If the method's {@code accessible} flag is not set,
         * access checking is performed immediately on behalf of the lookup class.
         * If <i>m</i> is not public, do not share the resulting handle with untrusted parties.
852 853 854 855
         * <p>
         * The returned method handle will have
         * {@linkplain MethodHandle#asVarargsCollector variable arity} if and only if
         * the method's variable arity modifier bit ({@code 0x0080}) is set.
856 857
         * @param m the reflected method
         * @return a method handle which can invoke the reflected method
858 859
         * @throws IllegalAccessException if access checking fails
         * @throws NullPointerException if the argument is null
860
         */
861
        public MethodHandle unreflect(Method m) throws IllegalAccessException {
862 863 864
            MemberName method = new MemberName(m);
            assert(method.isMethod());
            if (!m.isAccessible())  checkMethod(method.getDeclaringClass(), method, method.isStatic());
865
            MethodHandle mh = MethodHandleImpl.findMethod(method, true, lookupClassOrNull());
866 867
            if (!m.isAccessible())  mh = restrictProtectedReceiver(method, mh);
            return mh;
868 869 870
        }

        /**
871
         * Produces a method handle for a reflected method.
872
         * It will bypass checks for overriding methods on the receiver,
873
         * as if by a {@code invokespecial} instruction from within the {@code specialCaller}.
874
         * The type of the method handle will be that of the method,
875
         * with the special caller type prepended (and <em>not</em> the receiver of the method).
876 877 878
         * If the method's {@code accessible} flag is not set,
         * access checking is performed immediately on behalf of the lookup class,
         * as if {@code invokespecial} instruction were being linked.
879 880 881 882
         * <p>
         * The returned method handle will have
         * {@linkplain MethodHandle#asVarargsCollector variable arity} if and only if
         * the method's variable arity modifier bit ({@code 0x0080}) is set.
883
         * @param m the reflected method
884
         * @param specialCaller the class nominally calling the method
885
         * @return a method handle which can invoke the reflected method
886 887
         * @throws IllegalAccessException if access checking fails
         * @throws NullPointerException if any argument is null
888
         */
889
        public MethodHandle unreflectSpecial(Method m, Class<?> specialCaller) throws IllegalAccessException {
890 891 892 893 894
            checkSpecialCaller(specialCaller);
            MemberName method = new MemberName(m);
            assert(method.isMethod());
            // ignore m.isAccessible:  this is a new kind of access
            checkMethod(m.getDeclaringClass(), method, false);
895
            MethodHandle mh = MethodHandleImpl.findMethod(method, false, lookupClassOrNull());
896
            return restrictReceiver(method, mh, specialCaller);
897 898 899
        }

        /**
900
         * Produces a method handle for a reflected constructor.
901 902
         * The type of the method handle will be that of the constructor,
         * with the return type changed to the declaring class.
903 904 905 906 907
         * The method handle will perform a {@code newInstance} operation,
         * creating a new instance of the constructor's class on the
         * arguments passed to the method handle.
         * <p>
         * If the constructor's {@code accessible} flag is not set,
908
         * access checking is performed immediately on behalf of the lookup class.
909 910 911 912
         * <p>
         * The returned method handle will have
         * {@linkplain MethodHandle#asVarargsCollector variable arity} if and only if
         * the constructor's variable arity modifier bit ({@code 0x0080}) is set.
913
         * @param c the reflected constructor
914
         * @return a method handle which can invoke the reflected constructor
915 916
         * @throws IllegalAccessException if access checking fails
         * @throws NullPointerException if the argument is null
917
         */
918
        public MethodHandle unreflectConstructor(Constructor c) throws IllegalAccessException {
919 920 921
            MemberName ctor = new MemberName(c);
            assert(ctor.isConstructor());
            if (!c.isAccessible())  checkAccess(c.getDeclaringClass(), ctor);
922 923
            MethodHandle rawCtor = MethodHandleImpl.findMethod(ctor, false, lookupClassOrNull());
            MethodHandle allocator = MethodHandleImpl.makeAllocator(rawCtor);
924
            return fixVarargs(allocator, rawCtor);
925 926 927
        }

        /**
928
         * Produces a method handle giving read access to a reflected field.
929
         * The type of the method handle will have a return type of the field's
930 931 932 933
         * value type.
         * If the field is static, the method handle will take no arguments.
         * Otherwise, its single argument will be the instance containing
         * the field.
934
         * If the field's {@code accessible} flag is not set,
935 936 937
         * access checking is performed immediately on behalf of the lookup class.
         * @param f the reflected field
         * @return a method handle which can load values from the reflected field
938 939
         * @throws IllegalAccessException if access checking fails
         * @throws NullPointerException if the argument is null
940
         */
941
        public MethodHandle unreflectGetter(Field f) throws IllegalAccessException {
942
            return makeAccessor(f.getDeclaringClass(), new MemberName(f), f.isAccessible(), false);
943 944 945
        }

        /**
946
         * Produces a method handle giving write access to a reflected field.
947
         * The type of the method handle will have a void return type.
948 949 950 951
         * If the field is static, the method handle will take a single
         * argument, of the field's value type, the value to be stored.
         * Otherwise, the two arguments will be the instance containing
         * the field, and the value to be stored.
952
         * If the field's {@code accessible} flag is not set,
953 954 955
         * access checking is performed immediately on behalf of the lookup class.
         * @param f the reflected field
         * @return a method handle which can store values into the reflected field
956 957
         * @throws IllegalAccessException if access checking fails
         * @throws NullPointerException if the argument is null
958
         */
959
        public MethodHandle unreflectSetter(Field f) throws IllegalAccessException {
960
            return makeAccessor(f.getDeclaringClass(), new MemberName(f), f.isAccessible(), true);
961 962
        }

963
        /// Helper methods, all package-private.
964

965
        MemberName resolveOrFail(Class<?> refc, String name, Class<?> type, boolean isStatic) throws NoSuchFieldException, IllegalAccessException {
966
            checkSymbolicClass(refc);  // do this before attempting to resolve
967
            name.getClass(); type.getClass();  // NPE
968
            int mods = (isStatic ? Modifier.STATIC : 0);
969 970
            return IMPL_NAMES.resolveOrFail(new MemberName(refc, name, type, mods), true, lookupClassOrNull(),
                                            NoSuchFieldException.class);
971
        }
972

973
        MemberName resolveOrFail(Class<?> refc, String name, MethodType type, boolean isStatic) throws NoSuchMethodException, IllegalAccessException {
974
            checkSymbolicClass(refc);  // do this before attempting to resolve
975
            name.getClass(); type.getClass();  // NPE
976
            int mods = (isStatic ? Modifier.STATIC : 0);
977 978
            return IMPL_NAMES.resolveOrFail(new MemberName(refc, name, type, mods), true, lookupClassOrNull(),
                                            NoSuchMethodException.class);
979 980
        }

981
        MemberName resolveOrFail(Class<?> refc, String name, MethodType type, boolean isStatic,
982
                                 boolean searchSupers, Class<?> specialCaller) throws NoSuchMethodException, IllegalAccessException {
983
            checkSymbolicClass(refc);  // do this before attempting to resolve
984
            name.getClass(); type.getClass();  // NPE
985
            int mods = (isStatic ? Modifier.STATIC : 0);
986 987
            return IMPL_NAMES.resolveOrFail(new MemberName(refc, name, type, mods), searchSupers, specialCaller,
                                            NoSuchMethodException.class);
988
        }
989

990
        void checkSymbolicClass(Class<?> refc) throws IllegalAccessException {
991 992
            Class<?> caller = lookupClassOrNull();
            if (caller != null && !VerifyAccess.isClassAccessible(refc, caller))
993
                throw new MemberName(refc).makeAccessException("symbolic reference class is not public", this);
994 995
        }

996
        void checkMethod(Class<?> refc, MemberName m, boolean wantStatic) throws IllegalAccessException {
997 998 999 1000 1001 1002 1003 1004 1005
            String message;
            if (m.isConstructor())
                message = "expected a method, not a constructor";
            else if (!m.isMethod())
                message = "expected a method";
            else if (wantStatic != m.isStatic())
                message = wantStatic ? "expected a static method" : "expected a non-static method";
            else
                { checkAccess(refc, m); return; }
1006
            throw m.makeAccessException(message, this);
1007 1008
        }

1009
        void checkAccess(Class<?> refc, MemberName m) throws IllegalAccessException {
1010 1011 1012
            int allowedModes = this.allowedModes;
            if (allowedModes == TRUSTED)  return;
            int mods = m.getModifiers();
1013
            if (Modifier.isPublic(mods) && Modifier.isPublic(refc.getModifiers()) && allowedModes != 0)
1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
                return;  // common case
            int requestedModes = fixmods(mods);  // adjust 0 => PACKAGE
            if ((requestedModes & allowedModes) != 0
                && VerifyAccess.isMemberAccessible(refc, m.getDeclaringClass(),
                                                   mods, lookupClass()))
                return;
            if (((requestedModes & ~allowedModes) & PROTECTED) != 0
                && VerifyAccess.isSamePackage(m.getDeclaringClass(), lookupClass()))
                // Protected members can also be checked as if they were package-private.
                return;
1024
            throw m.makeAccessException(accessFailedMessage(refc, m), this);
1025 1026 1027 1028 1029
        }

        String accessFailedMessage(Class<?> refc, MemberName m) {
            Class<?> defc = m.getDeclaringClass();
            int mods = m.getModifiers();
1030 1031 1032 1033 1034 1035 1036 1037 1038 1039
            // check the class first:
            boolean classOK = (Modifier.isPublic(defc.getModifiers()) &&
                               (defc == refc ||
                                Modifier.isPublic(refc.getModifiers())));
            if (!classOK && (allowedModes & PACKAGE) != 0) {
                classOK = (VerifyAccess.isClassAccessible(defc, lookupClass()) &&
                           (defc == refc ||
                            VerifyAccess.isClassAccessible(refc, lookupClass())));
            }
            if (!classOK)
1040 1041 1042 1043 1044 1045 1046 1047 1048 1049
                return "class is not public";
            if (Modifier.isPublic(mods))
                return "access to public member failed";  // (how?)
            if (Modifier.isPrivate(mods))
                return "member is private";
            if (Modifier.isProtected(mods))
                return "member is protected";
            return "member is private to package";
        }

1050 1051
        private static final boolean ALLOW_NESTMATE_ACCESS = false;

1052
        void checkSpecialCaller(Class<?> specialCaller) throws IllegalAccessException {
1053
            if (allowedModes == TRUSTED)  return;
1054 1055 1056 1057
            if ((allowedModes & PRIVATE) == 0
                || (specialCaller != lookupClass()
                    && !(ALLOW_NESTMATE_ACCESS &&
                         VerifyAccess.isSamePackageMember(specialCaller, lookupClass()))))
1058 1059
                throw new MemberName(specialCaller).
                    makeAccessException("no private access for invokespecial", this);
1060 1061
        }

1062
        MethodHandle restrictProtectedReceiver(MemberName method, MethodHandle mh) throws IllegalAccessException {
1063 1064 1065 1066
            // The accessing class only has the right to use a protected member
            // on itself or a subclass.  Enforce that restriction, from JVMS 5.4.4, etc.
            if (!method.isProtected() || method.isStatic()
                || allowedModes == TRUSTED
1067
                || method.getDeclaringClass() == lookupClass()
1068
                || VerifyAccess.isSamePackage(method.getDeclaringClass(), lookupClass())
1069 1070
                || (ALLOW_NESTMATE_ACCESS &&
                    VerifyAccess.isSamePackageMember(method.getDeclaringClass(), lookupClass())))
1071 1072 1073 1074
                return mh;
            else
                return restrictReceiver(method, mh, lookupClass());
        }
1075
        MethodHandle restrictReceiver(MemberName method, MethodHandle mh, Class<?> caller) throws IllegalAccessException {
1076 1077 1078
            assert(!method.isStatic());
            Class<?> defc = method.getDeclaringClass();  // receiver type of mh is too wide
            if (defc.isInterface() || !defc.isAssignableFrom(caller)) {
1079
                throw method.makeAccessException("caller class must be a subclass below the method", caller);
1080
            }
1081 1082 1083
            MethodType rawType = mh.type();
            if (rawType.parameterType(0) == caller)  return mh;
            MethodType narrowType = rawType.changeParameterType(0, caller);
1084
            MethodHandle narrowMH = MethodHandleImpl.convertArguments(mh, narrowType, rawType, 0);
1085
            return fixVarargs(narrowMH, mh);
1086 1087 1088
        }

        MethodHandle makeAccessor(Class<?> refc, String name, Class<?> type,
1089
                                  boolean isStatic, boolean isSetter) throws NoSuchFieldException, IllegalAccessException {
1090 1091
            MemberName field = resolveOrFail(refc, name, type, isStatic);
            if (isStatic != field.isStatic())
1092 1093 1094
                throw field.makeAccessException(isStatic
                                                ? "expected a static field"
                                                : "expected a non-static field", this);
1095 1096 1097 1098
            return makeAccessor(refc, field, false, isSetter);
        }

        MethodHandle makeAccessor(Class<?> refc, MemberName field,
1099
                                  boolean trusted, boolean isSetter) throws IllegalAccessException {
1100 1101
            assert(field.isField());
            if (trusted)
1102
                return MethodHandleImpl.accessField(field, isSetter, lookupClassOrNull());
1103
            checkAccess(refc, field);
1104
            MethodHandle mh = MethodHandleImpl.accessField(field, isSetter, lookupClassOrNull());
1105
            return restrictProtectedReceiver(field, mh);
1106 1107 1108 1109
        }
    }

    /**
1110
     * Produces a method handle giving read access to elements of an array.
1111 1112 1113 1114 1115
     * The type of the method handle will have a return type of the array's
     * element type.  Its first argument will be the array type,
     * and the second will be {@code int}.
     * @param arrayClass an array type
     * @return a method handle which can load values from the given array type
1116
     * @throws NullPointerException if the argument is null
1117 1118 1119 1120
     * @throws  IllegalArgumentException if arrayClass is not an array type
     */
    public static
    MethodHandle arrayElementGetter(Class<?> arrayClass) throws IllegalArgumentException {
1121
        return MethodHandleImpl.accessArrayElement(arrayClass, false);
1122 1123 1124
    }

    /**
1125
     * Produces a method handle giving write access to elements of an array.
1126 1127 1128 1129
     * The type of the method handle will have a void return type.
     * Its last argument will be the array's element type.
     * The first and second arguments will be the array type and int.
     * @return a method handle which can store values into the array type
1130
     * @throws NullPointerException if the argument is null
1131 1132 1133 1134
     * @throws IllegalArgumentException if arrayClass is not an array type
     */
    public static
    MethodHandle arrayElementSetter(Class<?> arrayClass) throws IllegalArgumentException {
1135
        return MethodHandleImpl.accessArrayElement(arrayClass, true);
1136 1137 1138 1139 1140
    }

    /// method handle invocation (reflective style)

    /**
1141
     * Produces a method handle which will invoke any method handle of the
1142
     * given {@code type} on a standard set of {@code Object} type arguments
1143 1144 1145 1146 1147 1148 1149 1150
     * and a single trailing {@code Object[]} array.
     * The resulting invoker will be a method handle with the following
     * arguments:
     * <ul>
     * <li>a single {@code MethodHandle} target
     * <li>zero or more {@code Object} values (counted by {@code objectArgCount})
     * <li>an {@code Object[]} array containing more arguments
     * </ul>
1151
     * <p>
1152
     * The invoker will behave like a call to {@link MethodHandle#invoke invoke} with
1153 1154
     * the indicated {@code type}.
     * That is, if the target is exactly of the given {@code type}, it will behave
1155
     * like {@code invokeExact}; otherwise it behave as if {@link MethodHandle#asType asType}
1156 1157 1158 1159 1160 1161 1162 1163
     * is used to convert the target to the required {@code type}.
     * <p>
     * The type of the returned invoker will not be the given {@code type}, but rather
     * will have all parameter and return types replaced by {@code Object}, except for
     * the last parameter type, which will be the array type {@code Object[]}.
     * <p>
     * Before invoking its target, the invoker will spread the varargs array, apply
     * reference casts as necessary, and unbox and widen primitive arguments.
1164 1165 1166 1167 1168 1169
     * The return value of the invoker will be an {@code Object} reference,
     * boxing a primitive value if the original type returns a primitive,
     * and always null if the original type returns void.
     * <p>
     * This method is equivalent to the following code (though it may be more efficient):
     * <p><blockquote><pre>
1170
MethodHandle invoker = MethodHandles.invoker(type);
1171 1172 1173
int spreadArgCount = type.parameterCount - objectArgCount;
invoker = invoker.asSpreader(Object[].class, spreadArgCount);
return invoker;
1174
     * </pre></blockquote>
1175 1176
     * <p>
     * This method throws no reflective or security exceptions.
1177 1178 1179 1180 1181
     * @param type the desired target type
     * @param objectArgCount number of fixed (non-varargs) {@code Object} arguments
     * @return a method handle suitable for invoking any method handle of the given type
     */
    static public
1182
    MethodHandle spreadInvoker(MethodType type, int objectArgCount) {
1183 1184
        if (objectArgCount < 0 || objectArgCount > type.parameterCount())
            throw new IllegalArgumentException("bad argument count "+objectArgCount);
1185
        return type.invokers().spreadInvoker(objectArgCount);
1186 1187 1188
    }

    /**
1189
     * Produces a special <em>invoker method handle</em> which can be used to
1190
     * invoke any method handle of the given type, as if by {@link MethodHandle#invokeExact invokeExact}.
1191
     * The resulting invoker will have a type which is
1192 1193 1194
     * exactly equal to the desired type, except that it will accept
     * an additional leading argument of type {@code MethodHandle}.
     * <p>
1195 1196
     * This method is equivalent to the following code (though it may be more efficient):
     * <p><blockquote><pre>
1197
publicLookup().findVirtual(MethodHandle.class, "invokeExact", type)
1198
     * </pre></blockquote>
1199 1200 1201 1202 1203 1204 1205 1206
     *
     * <p style="font-size:smaller;">
     * <em>Discussion:</em>
     * Invoker method handles can be useful when working with variable method handles
     * of unknown types.
     * For example, to emulate an {@code invokeExact} call to a variable method
     * handle {@code M}, extract its type {@code T},
     * look up the invoker method {@code X} for {@code T},
1207
     * and call the invoker method, as {@code X.invoke(T, A...)}.
1208 1209 1210 1211 1212 1213 1214 1215
     * (It would not work to call {@code X.invokeExact}, since the type {@code T}
     * is unknown.)
     * If spreading, collecting, or other argument transformations are required,
     * they can be applied once to the invoker {@code X} and reused on many {@code M}
     * method handle values, as long as they are compatible with the type of {@code X}.
     * <p>
     * <em>(Note:  The invoker method is not available via the Core Reflection API.
     * An attempt to call {@linkplain java.lang.reflect.Method#invoke Method.invoke}
1216
     * on the declared {@code invokeExact} or {@code invoke} method will raise an
1217 1218 1219
     * {@link java.lang.UnsupportedOperationException UnsupportedOperationException}.)</em>
     * <p>
     * This method throws no reflective or security exceptions.
1220 1221 1222 1223 1224
     * @param type the desired target type
     * @return a method handle suitable for invoking any method handle of the given type
     */
    static public
    MethodHandle exactInvoker(MethodType type) {
1225
        return type.invokers().exactInvoker();
1226 1227
    }

1228 1229
    /**
     * Produces a special <em>invoker method handle</em> which can be used to
1230
     * invoke any method handle compatible with the given type, as if by {@link MethodHandle#invoke invoke}.
1231 1232 1233 1234 1235
     * The resulting invoker will have a type which is
     * exactly equal to the desired type, except that it will accept
     * an additional leading argument of type {@code MethodHandle}.
     * <p>
     * Before invoking its target, the invoker will apply reference casts as
1236 1237 1238 1239
     * necessary and box, unbox, or widen primitive values, as if by {@link MethodHandle#asType asType}.
     * Similarly, the return value will be converted as necessary.
     * If the target is a {@linkplain MethodHandle#asVarargsCollector variable arity method handle},
     * the required arity conversion will be made, again as if by {@link MethodHandle#asType asType}.
1240 1241 1242
     * <p>
     * This method is equivalent to the following code (though it may be more efficient):
     * <p><blockquote><pre>
1243
publicLookup().findVirtual(MethodHandle.class, "invoke", type)
1244 1245 1246 1247 1248 1249 1250
     * </pre></blockquote>
     * <p>
     * This method throws no reflective or security exceptions.
     * @param type the desired target type
     * @return a method handle suitable for invoking any method handle convertible to the given type
     */
    static public
1251 1252 1253 1254 1255 1256 1257 1258 1259
    MethodHandle invoker(MethodType type) {
        return type.invokers().generalInvoker();
    }

    /**
     * <em>Temporary alias</em> for {@link #invoker}, for backward compatibility with some versions of JSR 292.
     * @deprecated Will be removed for JSR 292 Proposed Final Draft.
     */
    public static
1260
    MethodHandle genericInvoker(MethodType type) {
1261
        return invoker(type);
1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300
    }

    /**
     * Perform value checking, exactly as if for an adapted method handle.
     * It is assumed that the given value is either null, of type T0,
     * or (if T0 is primitive) of the wrapper type corresponding to T0.
     * The following checks and conversions are made:
     * <ul>
     * <li>If T0 and T1 are references, then a cast to T1 is applied.
     *     (The types do not need to be related in any particular way.)
     * <li>If T0 and T1 are primitives, then a widening or narrowing
     *     conversion is applied, if one exists.
     * <li>If T0 is a primitive and T1 a reference, and
     *     T0 has a wrapper type TW, a boxing conversion to TW is applied,
     *     possibly followed by a reference conversion.
     *     T1 must be TW or a supertype.
     * <li>If T0 is a reference and T1 a primitive, and
     *     T1 has a wrapper type TW, an unboxing conversion is applied,
     *     possibly preceded by a reference conversion.
     *     T0 must be TW or a supertype.
     * <li>If T1 is void, the return value is discarded
     * <li>If T0 is void and T1 a reference, a null value is introduced.
     * <li>If T0 is void and T1 a primitive, a zero value is introduced.
     * </ul>
     * If the value is discarded, null will be returned.
     * @param valueType
     * @param value
     * @return the value, converted if necessary
     * @throws java.lang.ClassCastException if a cast fails
     */
    static
    <T0, T1> T1 checkValue(Class<T0> t0, Class<T1> t1, Object value)
       throws ClassCastException
    {
        if (t0 == t1) {
            // no conversion needed; just reassert the same type
            if (t0.isPrimitive())
                return Wrapper.asPrimitiveType(t1).cast(value);
            else
1301
                return Wrapper.OBJECT.convert(value, t1);
1302 1303 1304 1305
        }
        boolean prim0 = t0.isPrimitive(), prim1 = t1.isPrimitive();
        if (!prim0) {
            // check contract with caller
1306
            Wrapper.OBJECT.convert(value, t0);
1307
            if (!prim1) {
1308
                return Wrapper.OBJECT.convert(value, t1);
1309 1310 1311
            }
            // convert reference to primitive by unboxing
            Wrapper w1 = Wrapper.forPrimitiveType(t1);
1312
            return w1.convert(value, t1);
1313 1314 1315 1316
        }
        // check contract with caller:
        Wrapper.asWrapperType(t0).cast(value);
        Wrapper w1 = Wrapper.forPrimitiveType(t1);
1317
        return w1.convert(value, t1);
1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334
    }

    static
    Object checkValue(Class<?> T1, Object value)
       throws ClassCastException
    {
        Class<?> T0;
        if (value == null)
            T0 = Object.class;
        else
            T0 = value.getClass();
        return checkValue(T0, T1, value);
    }

    /// method handle modification (creation from other method handles)

    /**
1335
     * Produces a method handle which adapts the type of the
1336 1337
     * given method handle to a new type by pairwise argument conversion.
     * The original type and new type must have the same number of arguments.
1338
     * The resulting method handle is guaranteed to report a type
1339
     * which is equal to the desired new type.
1340 1341 1342 1343 1344 1345 1346 1347 1348 1349
     * <p>
     * If the original type and new type are equal, returns target.
     * <p>
     * The following conversions are applied as needed both to
     * arguments and return types.  Let T0 and T1 be the differing
     * new and old parameter types (or old and new return types)
     * for corresponding values passed by the new and old method types.
     * Given those types T0, T1, one of the following conversions is applied
     * if possible:
     * <ul>
1350
     * <li>If T0 and T1 are references, then a cast to T1 is applied.
1351
     *     (The types do not need to be related in any particular way.)
1352 1353
     * <li>If T0 and T1 are primitives, then a Java method invocation
     *     conversion (JLS 5.3) is applied, if one exists.
1354 1355
     * <li>If T0 is a primitive and T1 a reference, a boxing
     *     conversion is applied if one exists, possibly followed by
1356
     *     a reference conversion to a superclass.
1357 1358
     *     T1 must be a wrapper class or a supertype of one.
     * <li>If T0 is a reference and T1 a primitive, an unboxing
1359 1360 1361
     *     conversion will be applied at runtime, possibly followed
     *     by a Java method invocation conversion (JLS 5.3)
     *     on the primitive value.  (These are the widening conversions.)
1362
     *     T0 must be a wrapper class or a supertype of one.
1363 1364
     *     (In the case where T0 is Object, these are the conversions
     *     allowed by java.lang.reflect.Method.invoke.)
1365 1366 1367
     * <li>If the return type T1 is void, any returned value is discarded
     * <li>If the return type T0 is void and T1 a reference, a null value is introduced.
     * <li>If the return type T0 is void and T1 a primitive, a zero value is introduced.
1368 1369 1370 1371 1372 1373
     * </ul>
     * @param target the method handle to invoke after arguments are retyped
     * @param newType the expected type of the new method handle
     * @return a method handle which delegates to {@code target} after performing
     *           any necessary argument conversions, and arranges for any
     *           necessary return value conversions
1374
     * @throws NullPointerException if either argument is null
1375
     * @throws WrongMethodTypeException if the conversion cannot be made
1376
     * @see MethodHandle#asType
1377
     * @see MethodHandles#explicitCastArguments
1378 1379 1380
     */
    public static
    MethodHandle convertArguments(MethodHandle target, MethodType newType) {
1381 1382 1383
        if (!target.type().isConvertibleTo(newType)) {
            throw new WrongMethodTypeException("cannot convert "+target+" to "+newType);
        }
1384
        return MethodHandleImpl.convertArguments(target, newType, 1);
1385 1386 1387
    }

    /**
1388
     * Produces a method handle which adapts the type of the
1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419
     * given method handle to a new type by pairwise argument conversion.
     * The original type and new type must have the same number of arguments.
     * The resulting method handle is guaranteed to report a type
     * which is equal to the desired new type.
     * <p>
     * If the original type and new type are equal, returns target.
     * <p>
     * The same conversions are allowed as for {@link #convertArguments convertArguments},
     * and some additional conversions are also applied if those conversions fail.
     * Given types T0, T1, one of the following conversions is applied
     * in addition, if the conversions specified for {@code convertArguments}
     * would be insufficient:
     * <ul>
     * <li>If T0 and T1 are references, and T1 is an interface type,
     *     then the value of type T0 is passed as a T1 without a cast.
     *     (This treatment of interfaces follows the usage of the bytecode verifier.)
     * <li>If T0 and T1 are primitives and one is boolean,
     *     the boolean is treated as a one-bit unsigned integer.
     *     (This treatment follows the usage of the bytecode verifier.)
     *     A conversion from another primitive type behaves as if
     *     it first converts to byte, and then masks all but the low bit.
     * <li>If a primitive value would be converted by {@code convertArguments}
     *     using Java method invocation conversion (JLS 5.3),
     *     Java casting conversion (JLS 5.5) may be used also.
     *     This allows primitives to be narrowed as well as widened.
     * </ul>
     * @param target the method handle to invoke after arguments are retyped
     * @param newType the expected type of the new method handle
     * @return a method handle which delegates to {@code target} after performing
     *           any necessary argument conversions, and arranges for any
     *           necessary return value conversions
1420
     * @throws NullPointerException if either argument is null
1421 1422 1423 1424 1425 1426
     * @throws WrongMethodTypeException if the conversion cannot be made
     * @see MethodHandle#asType
     * @see MethodHandles#convertArguments
     */
    public static
    MethodHandle explicitCastArguments(MethodHandle target, MethodType newType) {
1427
        return MethodHandleImpl.convertArguments(target, newType, 2);
1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467
    }

    /*
      FIXME: Reconcile javadoc with 10/22/2010 EG notes on conversion:

      Both converters arrange for their method handles to convert arguments
      and return values.  The conversion rules are the same for arguments
      and return values, and depend only on source and target types, S and
      T.  The conversions allowed by castConvertArguments are a strict
      superset of those performed by convertArguments.

      In all cases, if S and T are references, a simple checkcast is done.
      If neither S nor T is a primitive, no attempt is made to unbox and
      box.  A failed conversion throws ClassCastException.

      If T is void, the value is dropped.

      For compatibility with reflection, if S is void and T is a reference,
      a null value is produced.

      For compatibility with reflection, if S is a reference and T is a
      primitive, S is first unboxed and then undergoes primitive conversion.
      In the case of 'convertArguments', only assignment conversion is
      performed (no narrowing primitive conversion).

      If S is a primitive, S is boxed, and then the above rules are applied.
      If S and T are both primitives, the boxing will be undetectable; only
      the primitive conversions will be apparent to the user.  The key point
      is that if S is a primitive type, the implementation may box it and
      treat is as Object, without loss of information, or it may use a "fast
      path" which does not use boxing.

      Notwithstanding the rules above, for compatibility with the verifier,
      if T is an interface, it is treated as if it were Object.  [KEEP THIS?]

      Also, for compatibility with the verifier, a boolean may be undergo
      widening or narrowing conversion to any other primitive type.  [KEEP THIS?]
    */

    /**
1468
     * Produces a method handle which adapts the calling sequence of the
1469
     * given method handle to a new type, by reordering the arguments.
1470
     * The resulting method handle is guaranteed to report a type
1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482
     * which is equal to the desired new type.
     * <p>
     * The given array controls the reordering.
     * Call {@code #I} the number of incoming parameters (the value
     * {@code newType.parameterCount()}, and call {@code #O} the number
     * of outgoing parameters (the value {@code target.type().parameterCount()}).
     * Then the length of the reordering array must be {@code #O},
     * and each element must be a non-negative number less than {@code #I}.
     * For every {@code N} less than {@code #O}, the {@code N}-th
     * outgoing argument will be taken from the {@code I}-th incoming
     * argument, where {@code I} is {@code reorder[N]}.
     * <p>
1483 1484 1485 1486 1487 1488 1489
     * No argument or return value conversions are applied.
     * The type of each incoming argument, as determined by {@code newType},
     * must be identical to the type of the corresponding outgoing argument
     * or arguments in the target method handle.
     * The return type of {@code newType} must be identical to the return
     * type of the original target.
     * <p>
1490 1491 1492 1493
     * The reordering array need not specify an actual permutation.
     * An incoming argument will be duplicated if its index appears
     * more than once in the array, and an incoming argument will be dropped
     * if its index does not appear in the array.
1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510
     * As in the case of {@link #dropArguments(MethodHandle,int,List) dropArguments},
     * incoming arguments which are not mentioned in the reordering array
     * are may be any type, as determined only by {@code newType}.
     * <blockquote><pre>
MethodType intfn1 = MethodType.methodType(int.class, int.class);
MethodType intfn2 = MethodType.methodType(int.class, int.class, int.class);
MethodHandle sub = ... {int x, int y => x-y} ...;
assert(sub.type().equals(intfn2));
MethodHandle sub1 = MethodHandles.permuteArguments(sub, intfn2, 0, 1);
MethodHandle rsub = MethodHandles.permuteArguments(sub, intfn2, 1, 0);
assert((int)rsub.invokeExact(1, 100) == 99);
MethodHandle add = ... {int x, int y => x+y} ...;
assert(add.type().equals(intfn2));
MethodHandle twice = MethodHandles.permuteArguments(add, intfn1, 0, 0);
assert(twice.type().equals(intfn1));
assert((int)twice.invokeExact(21) == 42);
     * </pre></blockquote>
1511 1512 1513
     * @param target the method handle to invoke after arguments are reordered
     * @param newType the expected type of the new method handle
     * @param reorder a string which controls the reordering
1514 1515
     * @return a method handle which delegates to {@code target} after it
     *           drops unused arguments and moves and/or duplicates the other arguments
1516
     * @throws NullPointerException if any argument is null
1517 1518
     */
    public static
1519
    MethodHandle permuteArguments(MethodHandle target, MethodType newType, int... reorder) {
1520 1521
        MethodType oldType = target.type();
        checkReorder(reorder, newType, oldType);
1522
        return MethodHandleImpl.permuteArguments(target,
1523 1524 1525 1526 1527
                                                 newType, oldType,
                                                 reorder);
    }

    private static void checkReorder(int[] reorder, MethodType newType, MethodType oldType) {
1528 1529 1530
        if (newType.returnType() != oldType.returnType())
            throw newIllegalArgumentException("return types do not match",
                    oldType, newType);
1531 1532 1533
        if (reorder.length == oldType.parameterCount()) {
            int limit = newType.parameterCount();
            boolean bad = false;
1534 1535
            for (int j = 0; j < reorder.length; j++) {
                int i = reorder[j];
1536 1537 1538
                if (i < 0 || i >= limit) {
                    bad = true; break;
                }
1539 1540 1541 1542 1543
                Class<?> src = newType.parameterType(i);
                Class<?> dst = oldType.parameterType(j);
                if (src != dst)
                    throw newIllegalArgumentException("parameter types do not match after reorder",
                            oldType, newType);
1544 1545 1546
            }
            if (!bad)  return;
        }
1547
        throw newIllegalArgumentException("bad reorder array: "+Arrays.toString(reorder));
1548 1549 1550
    }

    /**
1551 1552 1553
     * Equivalent to the following code:
     * <p><blockquote><pre>
     * int spreadPos = newType.parameterCount() - 1;
1554
     * Class&lt;?&gt; spreadType = newType.parameterType(spreadPos);
1555 1556 1557 1558 1559 1560
     * int spreadCount = target.type().parameterCount() - spreadPos;
     * MethodHandle adapter = target.asSpreader(spreadType, spreadCount);
     * adapter = adapter.asType(newType);
     * return adapter;
     * </pre></blockquote>
     * @param target the method handle to invoke after argument spreading
1561
     * @param newType the expected type of the new method handle
1562
     * @return a method handle which spreads its final argument,
1563 1564
     *         before calling the original method handle
     */
1565
    /*non-public*/ static
1566 1567 1568 1569 1570 1571 1572 1573
    MethodHandle spreadArguments(MethodHandle target, MethodType newType) {
        MethodType oldType = target.type();
        int inargs  = newType.parameterCount();
        int outargs = oldType.parameterCount();
        int spreadPos = inargs - 1;
        int numSpread = (outargs - spreadPos);
        MethodHandle res = null;
        if (spreadPos >= 0 && numSpread >= 0) {
1574
            res = MethodHandleImpl.spreadArgumentsFromPos(target, newType, spreadPos);
1575 1576 1577 1578 1579 1580 1581 1582
        }
        if (res == null) {
            throw newIllegalArgumentException("cannot spread "+newType+" to " +oldType);
        }
        return res;
    }

    /**
1583 1584 1585
     * Equivalent to the following code:
     * <p><blockquote><pre>
     * int collectPos = target.type().parameterCount() - 1;
1586
     * Class&lt;?&gt; collectType = target.type().parameterType(collectPos);
1587 1588 1589 1590 1591 1592 1593
     * if (!collectType.isArray())  collectType = Object[].class;
     * int collectCount = newType.parameterCount() - collectPos;
     * MethodHandle adapter = target.asCollector(collectType, collectCount);
     * adapter = adapter.asType(newType);
     * return adapter;
     * </pre></blockquote>
     * @param target the method handle to invoke after argument collection
1594
     * @param newType the expected type of the new method handle
1595
     * @return a method handle which collects some trailing argument
1596 1597
     *         into an array, before calling the original method handle
     */
1598
    /*non-public*/ static
1599 1600 1601 1602 1603 1604 1605 1606
    MethodHandle collectArguments(MethodHandle target, MethodType newType) {
        MethodType oldType = target.type();
        int inargs  = newType.parameterCount();
        int outargs = oldType.parameterCount();
        int collectPos = outargs - 1;
        int numCollect = (inargs - collectPos);
        if (collectPos < 0 || numCollect < 0)
            throw newIllegalArgumentException("wrong number of arguments");
1607
        MethodHandle res = MethodHandleImpl.collectArguments(target, newType, collectPos, null);
1608 1609 1610 1611
        if (res == null) {
            throw newIllegalArgumentException("cannot collect from "+newType+" to " +oldType);
        }
        return res;
1612 1613 1614
    }

    /**
1615
     * Produces a method handle of the requested return type which returns the given
1616 1617 1618 1619 1620 1621 1622 1623 1624 1625
     * constant value every time it is invoked.
     * <p>
     * Before the method handle is returned, the passed-in value is converted to the requested type.
     * If the requested type is primitive, widening primitive conversions are attempted,
     * else reference conversions are attempted.
     * <p>The returned method handle is equivalent to {@code identity(type).bindTo(value)},
     * unless the type is {@code void}, in which case it is {@code identity(type)}.
     * @param type the return type of the desired method handle
     * @param value the value to return
     * @return a method handle of the given return type and no arguments, which always returns the given value
1626 1627 1628
     * @throws NullPointerException if the {@code type} argument is null
     * @throws ClassCastException if the value cannot be converted to the required return type
     * @throws IllegalArgumentException if the given type is {@code void.class}
1629 1630 1631 1632
     */
    public static
    MethodHandle constant(Class<?> type, Object value) {
        if (type.isPrimitive()) {
1633 1634
            if (type == void.class)
                throw newIllegalArgumentException("void type");
1635
            Wrapper w = Wrapper.forPrimitiveType(type);
1636
            return insertArguments(identity(type), 0, w.convert(value, type));
1637 1638 1639 1640 1641 1642
        } else {
            return identity(type).bindTo(type.cast(value));
        }
    }

    /**
1643 1644 1645 1646 1647 1648
     * Produces a method handle which returns its sole argument when invoked.
     * <p>The identity function for {@code void} takes no arguments and returns no values.
     * @param type the type of the sole parameter and return value of the desired method handle
     * @return a unary method handle which accepts and returns the given type
     * @throws NullPointerException if the argument is null
     * @throws IllegalArgumentException if the given type is {@code void.class}
1649 1650 1651
     */
    public static
    MethodHandle identity(Class<?> type) {
1652 1653
        if (type == void.class)
            throw newIllegalArgumentException("void type");
1654 1655 1656 1657 1658 1659 1660
        else if (type == Object.class)
            return ValueConversions.identity();
        else if (type.isPrimitive())
            return ValueConversions.identity(Wrapper.forPrimitiveType(type));
        else
            return AdapterMethodHandle.makeRetypeRaw(
                    MethodType.methodType(type, type), ValueConversions.identity());
1661 1662 1663
    }

    /**
1664
     * Produces a method handle which calls the original method handle {@code target},
1665 1666 1667 1668 1669 1670 1671
     * after inserting the given argument(s) at the given position.
     * The formal parameters to {@code target} which will be supplied by those
     * arguments are called <em>bound parameters</em>, because the new method
     * will contain bindings for those parameters take from {@code values}.
     * The type of the new method handle will drop the types for the bound
     * parameters from the original target type, since the new method handle
     * will no longer require those arguments to be supplied by its callers.
1672
     * <p>
1673 1674 1675
     * Each given argument object must match the corresponding bound parameter type.
     * If a bound parameter type is a primitive, the argument object
     * must be a wrapper, and will be unboxed to produce the primitive value.
1676 1677
     * <p>
     * The  <i>pos</i> may range between zero and <i>N</i> (inclusively),
1678 1679
     * where <i>N</i> is the number of argument types in resulting method handle
     * (after bound parameter types are dropped).
1680 1681
     * @param target the method handle to invoke after the argument is inserted
     * @param pos where to insert the argument (zero for the first)
1682
     * @param values the series of arguments to insert
1683
     * @return a method handle which inserts an additional argument,
1684
     *         before calling the original method handle
1685
     * @throws NullPointerException if the {@code target} argument or the {@code values} array is null
1686
     * @see MethodHandle#bindTo
1687 1688
     */
    public static
1689 1690
    MethodHandle insertArguments(MethodHandle target, int pos, Object... values) {
        int insCount = values.length;
1691 1692
        MethodType oldType = target.type();
        int outargs = oldType.parameterCount();
1693 1694 1695 1696
        int inargs  = outargs - insCount;
        if (inargs < 0)
            throw newIllegalArgumentException("too many values to insert");
        if (pos < 0 || pos > inargs)
1697
            throw newIllegalArgumentException("no argument type to append");
1698 1699 1700 1701 1702 1703 1704
        MethodHandle result = target;
        for (int i = 0; i < insCount; i++) {
            Object value = values[i];
            Class<?> valueType = oldType.parameterType(pos+i);
            value = checkValue(valueType, value);
            if (pos == 0 && !valueType.isPrimitive()) {
                // At least for now, make bound method handles a special case.
1705
                MethodHandle bmh = MethodHandleImpl.bindReceiver(result, value);
1706 1707 1708 1709 1710 1711
                if (bmh != null) {
                    result = bmh;
                    continue;
                }
                // else fall through to general adapter machinery
            }
1712
            result = MethodHandleImpl.bindArgument(result, pos, value);
1713
        }
1714 1715 1716
        return result;
    }

1717
    /**
1718
     * Produces a method handle which calls the original method handle,
1719 1720 1721 1722
     * after dropping the given argument(s) at the given position.
     * The type of the new method handle will insert the given argument
     * type(s), at that position, into the original handle's type.
     * <p>
1723
     * The <i>pos</i> may range between zero and <i>N</i>,
1724 1725 1726
     * where <i>N</i> is the number of argument types in <i>target</i>,
     * meaning to drop the first or last argument (respectively),
     * or an argument somewhere in between.
1727 1728 1729
     * <p>
     * <b>Example:</b>
     * <p><blockquote><pre>
1730 1731
import static java.lang.invoke.MethodHandles.*;
import static java.lang.invoke.MethodType.*;
1732 1733 1734 1735
...
MethodHandle cat = lookup().findVirtual(String.class,
  "concat", methodType(String.class, String.class));
assertEquals("xy", (String) cat.invokeExact("x", "y"));
1736 1737 1738 1739 1740 1741 1742 1743 1744
MethodType bigType = cat.type().insertParameterTypes(0, int.class, String.class);
MethodHandle d0 = dropArguments(cat, 0, bigType.parameterList().subList(0,2));
assertEquals(bigType, d0.type());
assertEquals("yz", (String) d0.invokeExact(123, "x", "y", "z"));
     * </pre></blockquote>
     * <p>
     * This method is also equivalent to the following code:
     * <p><blockquote><pre>
     * {@link #dropArguments(MethodHandle,int,Class...) dropArguments}(target, pos, valueTypes.toArray(new Class[0]))
1745
     * </pre></blockquote>
1746 1747 1748 1749
     * @param target the method handle to invoke after the arguments are dropped
     * @param valueTypes the type(s) of the argument(s) to drop
     * @param pos position of first argument to drop (zero for the leftmost)
     * @return a method handle which drops arguments of the given types,
1750
     *         before calling the original method handle
1751 1752 1753
     * @throws NullPointerException if the {@code target} argument is null,
     *                              or if the {@code valueTypes} list or any of its elements is null
     * @throws IllegalArgumentException if any of the {@code valueTypes} is {@code void.class}
1754 1755
     */
    public static
1756 1757
    MethodHandle dropArguments(MethodHandle target, int pos, List<Class<?>> valueTypes) {
        if (valueTypes.size() == 0)  return target;
1758 1759
        MethodType oldType = target.type();
        int outargs = oldType.parameterCount();
1760
        int inargs  = outargs + valueTypes.size();
1761 1762 1763 1764
        if (pos < 0 || pos >= inargs)
            throw newIllegalArgumentException("no argument type to remove");
        ArrayList<Class<?>> ptypes =
                new ArrayList<Class<?>>(oldType.parameterList());
1765 1766
        ptypes.addAll(pos, valueTypes);
        MethodType newType = MethodType.methodType(oldType.returnType(), ptypes);
1767
        return MethodHandleImpl.dropArguments(target, newType, pos);
1768 1769
    }

1770
    /**
1771
     * Produces a method handle which calls the original method handle,
1772 1773 1774
     * after dropping the given argument(s) at the given position.
     * The type of the new method handle will insert the given argument
     * type(s), at that position, into the original handle's type.
1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800
     * <p>
     * The <i>pos</i> may range between zero and <i>N</i>,
     * where <i>N</i> is the number of argument types in <i>target</i>,
     * meaning to drop the first or last argument (respectively),
     * or an argument somewhere in between.
     * <p>
     * <b>Example:</b>
     * <p><blockquote><pre>
import static java.lang.invoke.MethodHandles.*;
import static java.lang.invoke.MethodType.*;
...
MethodHandle cat = lookup().findVirtual(String.class,
  "concat", methodType(String.class, String.class));
assertEquals("xy", (String) cat.invokeExact("x", "y"));
MethodHandle d0 = dropArguments(cat, 0, String.class);
assertEquals("yz", (String) d0.invokeExact("x", "y", "z"));
MethodHandle d1 = dropArguments(cat, 1, String.class);
assertEquals("xz", (String) d1.invokeExact("x", "y", "z"));
MethodHandle d2 = dropArguments(cat, 2, String.class);
assertEquals("xy", (String) d2.invokeExact("x", "y", "z"));
MethodHandle d12 = dropArguments(cat, 1, int.class, boolean.class);
assertEquals("xz", (String) d12.invokeExact("x", 12, true, "z"));
     * </pre></blockquote>
     * <p>
     * This method is also equivalent to the following code:
     * <p><blockquote><pre>
1801
     * {@link #dropArguments(MethodHandle,int,List) dropArguments}(target, pos, Arrays.asList(valueTypes))
1802
     * </pre></blockquote>
1803 1804 1805 1806 1807
     * @param target the method handle to invoke after the arguments are dropped
     * @param valueTypes the type(s) of the argument(s) to drop
     * @param pos position of first argument to drop (zero for the leftmost)
     * @return a method handle which drops arguments of the given types,
     *         before calling the original method handle
1808 1809 1810
     * @throws NullPointerException if the {@code target} argument is null,
     *                              or if the {@code valueTypes} array or any of its elements is null
     * @throws IllegalArgumentException if any of the {@code valueTypes} is {@code void.class}
1811
     */
1812 1813 1814 1815 1816 1817
    public static
    MethodHandle dropArguments(MethodHandle target, int pos, Class<?>... valueTypes) {
        return dropArguments(target, pos, Arrays.asList(valueTypes));
    }

    /**
1818
     * Adapts a target method handle {@code target} by pre-processing
1819 1820 1821 1822 1823
     * one or more of its arguments, each with its own unary filter function,
     * and then calling the target with each pre-processed argument
     * replaced by the result of its corresponding filter function.
     * <p>
     * The pre-processing is performed by one or more method handles,
1824
     * specified in the elements of the {@code filters} array.
1825 1826
     * Null arguments in the array are ignored, and the corresponding arguments left unchanged.
     * (If there are no non-null elements in the array, the original target is returned.)
1827
     * Each filter is applied to the corresponding argument of the adapter.
1828 1829 1830 1831 1832 1833 1834 1835 1836
     * <p>
     * If a filter {@code F} applies to the {@code N}th argument of
     * the method handle, then {@code F} must be a method handle which
     * takes exactly one argument.  The type of {@code F}'s sole argument
     * replaces the corresponding argument type of the target
     * in the resulting adapted method handle.
     * The return type of {@code F} must be identical to the corresponding
     * parameter type of the target.
     * <p>
1837
     * It is an error if there are elements of {@code filters}
1838
     * which do not correspond to argument positions in the target.
1839 1840
     * <b>Example:</b>
     * <p><blockquote><pre>
1841 1842
import static java.lang.invoke.MethodHandles.*;
import static java.lang.invoke.MethodType.*;
1843 1844 1845 1846 1847
...
MethodHandle cat = lookup().findVirtual(String.class,
  "concat", methodType(String.class, String.class));
MethodHandle upcase = lookup().findVirtual(String.class,
  "toUpperCase", methodType(String.class));
1848
assertEquals("xy", (String) cat.invokeExact("x", "y"));
1849
MethodHandle f0 = filterArguments(cat, 0, upcase);
1850
assertEquals("Xy", (String) f0.invokeExact("x", "y")); // Xy
1851
MethodHandle f1 = filterArguments(cat, 1, upcase);
1852
assertEquals("xY", (String) f1.invokeExact("x", "y")); // xY
1853
MethodHandle f2 = filterArguments(cat, 0, upcase, upcase);
1854
assertEquals("XY", (String) f2.invokeExact("x", "y")); // XY
1855
     * </pre></blockquote>
1856
     *
1857
     * @param target the method handle to invoke after arguments are filtered
1858
     * @param pos the position of the first argument to filter
1859 1860
     * @param filters method handles to call initially on filtered arguments
     * @return method handle which incorporates the specified argument filtering logic
1861 1862 1863 1864 1865
     * @throws NullPointerException if the {@code target} argument is null
     *                              or if the {@code filters} array is null
     * @throws IllegalArgumentException if a non-null element of {@code filters}
     *          does not match a corresponding argument type of {@code target} as described above,
     *          or if the {@code pos+filters.length} is greater than {@code target.type().parameterCount()}
1866 1867
     */
    public static
1868
    MethodHandle filterArguments(MethodHandle target, int pos, MethodHandle... filters) {
1869 1870
        MethodType targetType = target.type();
        MethodHandle adapter = target;
1871 1872
        MethodType adapterType = null;
        assert((adapterType = targetType) != null);
1873
        int maxPos = targetType.parameterCount();
1874 1875 1876
        if (pos + filters.length > maxPos)
            throw newIllegalArgumentException("too many filters");
        int curPos = pos-1;  // pre-incremented
1877
        for (MethodHandle filter : filters) {
1878 1879
            curPos += 1;
            if (filter == null)  continue;  // ignore null elements of filters
1880 1881
            adapter = filterArgument(adapter, curPos, filter);
            assert((adapterType = adapterType.changeParameterType(curPos, filter.type().parameterType(0))) != null);
1882
        }
1883
        assert(adapterType.equals(adapter.type()));
1884 1885 1886
        return adapter;
    }

1887 1888 1889 1890 1891 1892 1893 1894 1895 1896
    /*non-public*/ static
    MethodHandle filterArgument(MethodHandle target, int pos, MethodHandle filter) {
        MethodType targetType = target.type();
        MethodType filterType = filter.type();
        if (filterType.parameterCount() != 1
            || filterType.returnType() != targetType.parameterType(pos))
            throw newIllegalArgumentException("target and filter types do not match", targetType, filterType);
        return MethodHandleImpl.filterArgument(target, pos, filter);
    }

1897
    /**
1898
     * Adapts a target method handle {@code target} by post-processing
1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909
     * its return value with a unary filter function.
     * <p>
     * If a filter {@code F} applies to the return value of
     * the target method handle, then {@code F} must be a method handle which
     * takes exactly one argument.  The return type of {@code F}
     * replaces the return type of the target
     * in the resulting adapted method handle.
     * The argument type of {@code F} must be identical to the
     * return type of the target.
     * <b>Example:</b>
     * <p><blockquote><pre>
1910 1911
import static java.lang.invoke.MethodHandles.*;
import static java.lang.invoke.MethodType.*;
1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923
...
MethodHandle cat = lookup().findVirtual(String.class,
  "concat", methodType(String.class, String.class));
MethodHandle length = lookup().findVirtual(String.class,
  "length", methodType(int.class));
System.out.println((String) cat.invokeExact("x", "y")); // xy
MethodHandle f0 = filterReturnValue(cat, length);
System.out.println((int) f0.invokeExact("x", "y")); // 2
     * </pre></blockquote>
     * @param target the method handle to invoke before filtering the return value
     * @param filter method handle to call on the return value
     * @return method handle which incorporates the specified return value filtering logic
1924 1925
     * @throws NullPointerException if either argument is null
     * @throws IllegalArgumentException if {@code filter}
1926
     *          does not match the return type of {@code target} as described above
1927
     */
1928
    public static
1929 1930 1931
    MethodHandle filterReturnValue(MethodHandle target, MethodHandle filter) {
        MethodType targetType = target.type();
        MethodType filterType = filter.type();
1932 1933 1934 1935 1936 1937
        Class<?> rtype = targetType.returnType();
        int filterValues = filterType.parameterCount();
        if (filterValues == 0
                ? (rtype != void.class)
                : (rtype != filterType.parameterType(0)))
            throw newIllegalArgumentException("target and filter types do not match", target, filter);
1938 1939
        // result = fold( lambda(retval, arg...) { filter(retval) },
        //                lambda(        arg...) { target(arg...) } )
1940 1941 1942 1943 1944 1945
        MethodType newType = targetType.changeReturnType(filterType.returnType());
        MethodHandle result = null;
        if (AdapterMethodHandle.canCollectArguments(filterType, targetType, 0, false)) {
            result = AdapterMethodHandle.makeCollectArguments(filter, target, 0, false);
            if (result != null)  return result;
        }
1946
        // FIXME: Too many nodes here.
1947 1948 1949 1950 1951
        assert(MethodHandleNatives.workaroundWithoutRicochetFrames());  // this class is deprecated
        MethodHandle returner = dropArguments(filter, filterValues, targetType.parameterList());
        result = foldArguments(returner, target);
        assert(result.type().equals(newType));
        return result;
1952 1953
    }

1954
    /**
1955
     * Adapts a target method handle {@code target} by pre-processing
1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970
     * some of its arguments, and then calling the target with
     * the result of the pre-processing, plus all original arguments.
     * <p>
     * The pre-processing is performed by a second method handle, the {@code combiner}.
     * The first {@code N} arguments passed to the adapter,
     * are copied to the combiner, which then produces a result.
     * (Here, {@code N} is defined as the parameter count of the adapter.)
     * After this, control passes to the {@code target}, with both the result
     * of the combiner, and all the original incoming arguments.
     * <p>
     * The first argument type of the target must be identical with the
     * return type of the combiner.
     * The resulting adapter is the same type as the target, except that the
     * initial argument type of the target is dropped.
     * <p>
1971
     * (Note that {@link #dropArguments(MethodHandle,int,List) dropArguments} can be used to remove any arguments
1972 1973
     * that either the {@code combiner} or {@code target} does not wish to receive.
     * If some of the incoming arguments are destined only for the combiner,
1974
     * consider using {@link MethodHandle#asCollector asCollector} instead, since those
1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992
     * arguments will not need to be live on the stack on entry to the
     * target.)
     * <p>
     * The first argument of the target must be identical with the
     * return value of the combiner.
     * <p> Here is pseudocode for the resulting adapter:
     * <blockquote><pre>
     * // there are N arguments in the A sequence
     * T target(V, A[N]..., B...);
     * V combiner(A...);
     * T adapter(A... a, B... b) {
     *   V v = combiner(a...);
     *   return target(v, a..., b...);
     * }
     * </pre></blockquote>
     * @param target the method handle to invoke after arguments are combined
     * @param combiner method handle to call initially on the incoming arguments
     * @return method handle which incorporates the specified argument folding logic
1993
     * @throws NullPointerException if either argument is null
1994 1995
     * @throws IllegalArgumentException if the first argument type of
     *          {@code target} is not the same as {@code combiner}'s return type,
1996
     *          or if the following argument types of {@code target}
1997 1998 1999 2000 2001 2002
     *          are not identical with the argument types of {@code combiner}
     */
    public static
    MethodHandle foldArguments(MethodHandle target, MethodHandle combiner) {
        MethodType targetType = target.type();
        MethodType combinerType = combiner.type();
2003
        int foldPos = 0;  // always at the head, at present
2004
        int foldArgs = combinerType.parameterCount();
2005 2006 2007 2008 2009 2010
        int foldVals = combinerType.returnType() == void.class ? 0 : 1;
        int afterInsertPos = foldPos + foldVals;
        boolean ok = (targetType.parameterCount() >= afterInsertPos + foldArgs);
        if (ok && !(combinerType.parameterList()
                    .equals(targetType.parameterList().subList(afterInsertPos,
                                                               afterInsertPos + foldArgs))))
2011
            ok = false;
2012
        if (ok && foldVals != 0 && !combinerType.returnType().equals(targetType.parameterType(0)))
2013
            ok = false;
2014 2015
        if (!ok)
            throw misMatchedTypes("target and combiner types", targetType, combinerType);
2016 2017 2018 2019
        MethodType newType = targetType.dropParameterTypes(foldPos, afterInsertPos);
        MethodHandle res = MethodHandleImpl.foldArguments(target, newType, foldPos, combiner);
        if (res == null)  throw newIllegalArgumentException("cannot fold from "+newType+" to " +targetType);
        return res;
2020 2021
    }

2022
    /**
2023
     * Makes a method handle which adapts a target method handle,
2024 2025 2026 2027
     * by guarding it with a test, a boolean-valued method handle.
     * If the guard fails, a fallback handle is called instead.
     * All three method handles must have the same corresponding
     * argument and return types, except that the return type
2028 2029
     * of the test must be boolean, and the test is allowed
     * to have fewer arguments than the other two method handles.
2030 2031 2032
     * <p> Here is pseudocode for the resulting adapter:
     * <blockquote><pre>
     * boolean test(A...);
2033 2034 2035
     * T target(A...,B...);
     * T fallback(A...,B...);
     * T adapter(A... a,B... b) {
2036
     *   if (test(a...))
2037
     *     return target(a..., b...);
2038
     *   else
2039
     *     return fallback(a..., b...);
2040 2041
     * }
     * </pre></blockquote>
2042 2043 2044
     * Note that the test arguments ({@code a...} in the pseudocode) cannot
     * be modified by execution of the test, and so are passed unchanged
     * from the caller to the target or fallback as appropriate.
2045 2046 2047 2048
     * @param test method handle used for test, must return boolean
     * @param target method handle to call if test passes
     * @param fallback method handle to call if test fails
     * @return method handle which incorporates the specified if/then/else logic
2049
     * @throws NullPointerException if any argument is null
2050 2051 2052 2053 2054 2055 2056 2057
     * @throws IllegalArgumentException if {@code test} does not return boolean,
     *          or if all three method types do not match (with the return
     *          type of {@code test} changed to match that of {@code target}).
     */
    public static
    MethodHandle guardWithTest(MethodHandle test,
                               MethodHandle target,
                               MethodHandle fallback) {
2058 2059 2060
        MethodType gtype = test.type();
        MethodType ttype = target.type();
        MethodType ftype = fallback.type();
2061
        if (!ttype.equals(ftype))
2062
            throw misMatchedTypes("target and fallback types", ttype, ftype);
2063 2064 2065 2066 2067 2068 2069
        if (gtype.returnType() != boolean.class)
            throw newIllegalArgumentException("guard type is not a predicate "+gtype);
        List<Class<?>> targs = ttype.parameterList();
        List<Class<?>> gargs = gtype.parameterList();
        if (!targs.equals(gargs)) {
            int gpc = gargs.size(), tpc = targs.size();
            if (gpc >= tpc || !targs.subList(0, gpc).equals(gargs))
2070
                throw misMatchedTypes("target and test types", ttype, gtype);
2071 2072
            test = dropArguments(test, gpc, targs.subList(gpc, tpc));
            gtype = test.type();
2073
        }
2074
        return MethodHandleImpl.makeGuardWithTest(test, target, fallback);
2075 2076
    }

2077 2078 2079 2080
    static RuntimeException misMatchedTypes(String what, MethodType t1, MethodType t2) {
        return newIllegalArgumentException(what + " must match: " + t1 + " != " + t2);
    }

2081
    /**
2082
     * Makes a method handle which adapts a target method handle,
2083 2084 2085 2086
     * by running it inside an exception handler.
     * If the target returns normally, the adapter returns that value.
     * If an exception matching the specified type is thrown, the fallback
     * handle is called instead on the exception, plus the original arguments.
2087
     * <p>
2088 2089 2090 2091
     * The target and handler must have the same corresponding
     * argument and return types, except that handler may omit trailing arguments
     * (similarly to the predicate in {@link #guardWithTest guardWithTest}).
     * Also, the handler must have an extra leading parameter of {@code exType} or a supertype.
2092 2093
     * <p> Here is pseudocode for the resulting adapter:
     * <blockquote><pre>
2094
     * T target(A..., B...);
2095
     * T handler(ExType, A...);
2096
     * T adapter(A... a, B... b) {
2097
     *   try {
2098
     *     return target(a..., b...);
2099 2100 2101
     *   } catch (ExType ex) {
     *     return handler(ex, a...);
     *   }
2102 2103
     * }
     * </pre></blockquote>
2104 2105 2106 2107 2108 2109 2110 2111 2112 2113
     * Note that the saved arguments ({@code a...} in the pseudocode) cannot
     * be modified by execution of the target, and so are passed unchanged
     * from the caller to the handler, if the handler is invoked.
     * <p>
     * The target and handler must return the same type, even if the handler
     * always throws.  (This might happen, for instance, because the handler
     * is simulating a {@code finally} clause).
     * To create such a throwing handler, compose the handler creation logic
     * with {@link #throwException throwException},
     * in order to create a method handle of the correct return type.
2114 2115 2116 2117
     * @param target method handle to call
     * @param exType the type of exception which the handler will catch
     * @param handler method handle to call if a matching exception is thrown
     * @return method handle which incorporates the specified try/catch logic
2118
     * @throws NullPointerException if any argument is null
2119 2120 2121 2122
     * @throws IllegalArgumentException if {@code handler} does not accept
     *          the given exception type, or if the method handle types do
     *          not match in their return types and their
     *          corresponding parameters
2123 2124
     */
    public static
2125 2126 2127
    MethodHandle catchException(MethodHandle target,
                                Class<? extends Throwable> exType,
                                MethodHandle handler) {
2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141
        MethodType ttype = target.type();
        MethodType htype = handler.type();
        if (htype.parameterCount() < 1 ||
            !htype.parameterType(0).isAssignableFrom(exType))
            throw newIllegalArgumentException("handler does not accept exception type "+exType);
        if (htype.returnType() != ttype.returnType())
            throw misMatchedTypes("target and handler return types", ttype, htype);
        List<Class<?>> targs = ttype.parameterList();
        List<Class<?>> hargs = htype.parameterList();
        hargs = hargs.subList(1, hargs.size());  // omit leading parameter from handler
        if (!targs.equals(hargs)) {
            int hpc = hargs.size(), tpc = targs.size();
            if (hpc >= tpc || !targs.subList(0, hpc).equals(hargs))
                throw misMatchedTypes("target and handler types", ttype, htype);
2142
            handler = dropArguments(handler, 1+hpc, targs.subList(hpc, tpc));
2143 2144
            htype = handler.type();
        }
2145
        return MethodHandleImpl.makeGuardWithCatch(target, exType, handler);
2146 2147
    }

2148
    /**
2149
     * Produces a method handle which will throw exceptions of the given {@code exType}.
2150 2151 2152 2153 2154
     * The method handle will accept a single argument of {@code exType},
     * and immediately throw it as an exception.
     * The method type will nominally specify a return of {@code returnType}.
     * The return type may be anything convenient:  It doesn't matter to the
     * method handle's behavior, since it will never return normally.
2155 2156
     * @return method handle which can throw the given exceptions
     * @throws NullPointerException if either argument is null
2157 2158 2159
     */
    public static
    MethodHandle throwException(Class<?> returnType, Class<? extends Throwable> exType) {
2160
        return MethodHandleImpl.throwException(MethodType.methodType(returnType, exType));
2161
    }
2162 2163

    /**
2164
     * Produces an instance of the given single-method interface which redirects
2165
     * its calls to the given method handle.
2166
     * <p>
2167 2168
     * A single-method interface is an interface which declares a unique method.
     * When determining the unique method of a single-method interface,
2169
     * the public {@code Object} methods ({@code toString}, {@code equals}, {@code hashCode})
2170
     * are disregarded.  For example, {@link java.util.Comparator} is a single-method interface,
2171 2172 2173
     * even though it re-declares the {@code Object.equals} method.
     * <p>
     * The type must be public.  No additional access checks are performed.
2174
     * <p>
2175 2176
     * The resulting instance of the required type will respond to
     * invocation of the type's single abstract method by calling
2177 2178 2179
     * the given {@code target} on the incoming arguments,
     * and returning or throwing whatever the {@code target}
     * returns or throws.  The invocation will be as if by
2180
     * {@code target.invoke}.
2181
     * The target's type will be checked before the
2182 2183
     * instance is created, as if by a call to {@code asType},
     * which may result in a {@code WrongMethodTypeException}.
2184
     * <p>
2185 2186 2187
     * The wrapper instance will implement the requested interface
     * and its super-types, but no other single-method interfaces.
     * This means that the instance will not unexpectedly
2188 2189 2190
     * pass an {@code instanceof} test for any unrequested type.
     * <p style="font-size:smaller;">
     * <em>Implementation Note:</em>
2191
     * Therefore, each instance must implement a unique single-method interface.
2192
     * Implementations may not bundle together
2193
     * multiple single-method interfaces onto single implementation classes
2194 2195
     * in the style of {@link java.awt.AWTEventMulticaster}.
     * <p>
2196 2197
     * The method handle may throw an <em>undeclared exception</em>,
     * which means any checked exception (or other checked throwable)
2198
     * not declared by the requested type's single abstract method.
2199 2200 2201
     * If this happens, the throwable will be wrapped in an instance of
     * {@link java.lang.reflect.UndeclaredThrowableException UndeclaredThrowableException}
     * and thrown in that wrapped form.
2202
     * <p>
2203 2204 2205 2206
     * Like {@link java.lang.Integer#valueOf Integer.valueOf},
     * {@code asInstance} is a factory method whose results are defined
     * by their behavior.
     * It is not guaranteed to return a new instance for every call.
2207
     * <p>
2208 2209 2210 2211 2212 2213 2214 2215 2216
     * Because of the possibility of {@linkplain java.lang.reflect.Method#isBridge bridge methods}
     * and other corner cases, the interface may also have several abstract methods
     * with the same name but having distinct descriptors (types of returns and parameters).
     * In this case, all the methods are bound in common to the one given {@code target}.
     * The type check and effective {@code asType} conversion is applied to each
     * method type descriptor, and all abstract methods are bound to the {@code target} in common.
     * Beyond this type check, no further checks are made to determine that the
     * abstract methods are related in any way.
     * <p>
2217 2218
     * Future versions of this API may accept additional types,
     * such as abstract classes with single abstract methods.
2219 2220 2221
     * Future versions of this API may also equip wrapper instances
     * with one or more additional public "marker" interfaces.
     *
2222
     * @param target the method handle to invoke from the wrapper
2223
     * @param smType the desired type of the wrapper, a single-method interface
2224
     * @return a correctly-typed wrapper for the given {@code target}
2225
     * @throws NullPointerException if either argument is null
2226
     * @throws IllegalArgumentException if the {@code smType} is not a
2227 2228
     *         valid argument to this method
     * @throws WrongMethodTypeException if the {@code target} cannot
2229
     *         be converted to the type required by the requested interface
2230
     */
2231 2232
    // Other notes to implementors:
    // <p>
2233
    // No stable mapping is promised between the single-method interface and
2234
    // the implementation class C.  Over time, several implementation
2235
    // classes might be used for the same type.
2236 2237
    // <p>
    // If the implementation is able
2238
    // to prove that a wrapper of the required type
2239 2240 2241 2242 2243 2244 2245 2246
    // has already been created for a given
    // method handle, or for another method handle with the
    // same behavior, the implementation may return that wrapper in place of
    // a new wrapper.
    // <p>
    // This method is designed to apply to common use cases
    // where a single method handle must interoperate with
    // an interface that implements a function-like
2247
    // API.  Additional variations, such as single-abstract-method classes with
2248 2249 2250 2251
    // private constructors, or interfaces with multiple but related
    // entry points, must be covered by hand-written or automatically
    // generated adapter classes.
    //
2252
    public static
2253
    <T> T asInstance(final MethodHandle target, final Class<T> smType) {
2254
        // POC implementation only; violates the above contract several ways
2255 2256 2257 2258 2259
        final Method sm = getSingleMethod(smType);
        if (sm == null)
            throw new IllegalArgumentException("not a single-method interface: "+smType.getName());
        MethodType smMT = MethodType.methodType(sm.getReturnType(), sm.getParameterTypes());
        MethodHandle checkTarget = target.asType(smMT);  // make throw WMT
2260
        checkTarget = checkTarget.asType(checkTarget.type().changeReturnType(Object.class));
2261 2262 2263 2264
        final MethodHandle vaTarget = checkTarget.asSpreader(Object[].class, smMT.parameterCount());
        return smType.cast(Proxy.newProxyInstance(
                smType.getClassLoader(),
                new Class[]{ smType, WrapperInstance.class },
2265
                new InvocationHandler() {
2266
                    private Object getArg(String name) {
2267
                        if ((Object)name == "getWrapperInstanceTarget")  return target;
2268
                        if ((Object)name == "getWrapperInstanceType")    return smType;
2269 2270
                        throw new AssertionError();
                    }
2271
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
2272
                        if (method.getDeclaringClass() == WrapperInstance.class)
2273
                            return getArg(method.getName());
2274
                        if (method.equals(sm))
2275
                            return vaTarget.invokeExact(args);
2276 2277 2278
                        if (isObjectMethod(method))
                            return callObjectMethod(this, method, args);
                        throw new InternalError();
2279 2280 2281 2282
                    }
                }));
    }

2283
    /**
2284
     * Determines if the given object was produced by a call to {@link #asInstance asInstance}.
2285 2286
     * @param x any reference
     * @return true if the reference is not null and points to an object produced by {@code asInstance}
2287
     */
2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303
    public static
    boolean isWrapperInstance(Object x) {
        return x instanceof WrapperInstance;
    }

    private static WrapperInstance asWrapperInstance(Object x) {
        try {
            if (x != null)
                return (WrapperInstance) x;
        } catch (ClassCastException ex) {
        }
        throw new IllegalArgumentException("not a wrapper instance");
    }

    /**
     * Produces or recovers a target method handle which is behaviorally
2304
     * equivalent to the unique method of this wrapper instance.
2305 2306 2307
     * The object {@code x} must have been produced by a call to {@link #asInstance asInstance}.
     * This requirement may be tested via {@link #isWrapperInstance isWrapperInstance}.
     * @param x any reference
2308
     * @return a method handle implementing the unique method
2309 2310 2311 2312 2313 2314 2315 2316
     * @throws IllegalArgumentException if the reference x is not to a wrapper instance
     */
    public static
    MethodHandle wrapperInstanceTarget(Object x) {
        return asWrapperInstance(x).getWrapperInstanceTarget();
    }

    /**
2317
     * Recovers the unique single-method interface type for which this wrapper instance was created.
2318 2319 2320
     * The object {@code x} must have been produced by a call to {@link #asInstance asInstance}.
     * This requirement may be tested via {@link #isWrapperInstance isWrapperInstance}.
     * @param x any reference
2321
     * @return the single-method interface type for which the wrapper was created
2322 2323 2324 2325 2326
     * @throws IllegalArgumentException if the reference x is not to a wrapper instance
     */
    public static
    Class<?> wrapperInstanceType(Object x) {
        return asWrapperInstance(x).getWrapperInstanceType();
2327 2328
    }

2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359
    private static
    boolean isObjectMethod(Method m) {
        switch (m.getName()) {
        case "toString":
            return (m.getReturnType() == String.class
                    && m.getParameterTypes().length == 0);
        case "hashCode":
            return (m.getReturnType() == int.class
                    && m.getParameterTypes().length == 0);
        case "equals":
            return (m.getReturnType() == boolean.class
                    && m.getParameterTypes().length == 1
                    && m.getParameterTypes()[0] == Object.class);
        }
        return false;
    }

    private static
    Object callObjectMethod(Object self, Method m, Object[] args) {
        assert(isObjectMethod(m)) : m;
        switch (m.getName()) {
        case "toString":
            return self.getClass().getName() + "@" + Integer.toHexString(self.hashCode());
        case "hashCode":
            return System.identityHashCode(self);
        case "equals":
            return (self == args[0]);
        }
        return null;
    }

2360
    private static
2361 2362 2363
    Method getSingleMethod(Class<?> smType) {
        Method sm = null;
        for (Method m : smType.getMethods()) {
2364 2365
            int mod = m.getModifiers();
            if (Modifier.isAbstract(mod)) {
2366
                if (sm != null && !isObjectMethod(sm))
2367
                    return null;  // too many abstract methods
2368
                sm = m;
2369 2370
            }
        }
2371
        if (!smType.isInterface() && getSingleConstructor(smType) == null)
2372
            return null;  // wrong kind of constructor
2373
        return sm;
2374 2375 2376
    }

    private static
2377 2378
    Constructor getSingleConstructor(Class<?> smType) {
        for (Constructor c : smType.getDeclaredConstructors()) {
2379 2380 2381 2382 2383 2384 2385 2386
            if (c.getParameterTypes().length == 0) {
                int mod = c.getModifiers();
                if (Modifier.isPublic(mod) || Modifier.isProtected(mod))
                    return c;
            }
        }
        return null;
    }
2387
}