< prev index next >

src/java.base/share/classes/java/lang/invoke/MethodHandle.java

Print this page
rev 59151 : imported patch viewAs


1623 
1624     // Other transforms to do:  convert, explicitCast, permute, drop, filter, fold, GWT, catch
1625 
1626     BoundMethodHandle bindArgumentL(int pos, Object value) {
1627         return rebind().bindArgumentL(pos, value);
1628     }
1629 
1630     /*non-public*/
1631     MethodHandle setVarargs(MemberName member) throws IllegalAccessException {
1632         if (!member.isVarargs())  return this;
1633         try {
1634             return this.withVarargs(true);
1635         } catch (IllegalArgumentException ex) {
1636             throw member.makeAccessException("cannot make variable arity", null);
1637         }
1638     }
1639 
1640     /*non-public*/
1641     MethodHandle viewAsType(MethodType newType, boolean strict) {
1642         // No actual conversions, just a new view of the same method.
1643         // Note that this operation must not produce a DirectMethodHandle,
1644         // because retyped DMHs, like any transformed MHs,
1645         // cannot be cracked into MethodHandleInfo.
1646         assert viewAsTypeChecks(newType, strict);
1647         BoundMethodHandle mh = rebind();
1648         return mh.copyWith(newType, mh.form);
1649     }
1650 
1651     /*non-public*/
1652     boolean viewAsTypeChecks(MethodType newType, boolean strict) {
1653         if (strict) {
1654             assert(type().isViewableAs(newType, true))
1655                 : Arrays.asList(this, newType);
1656         } else {
1657             assert(type().basicType().isViewableAs(newType.basicType(), true))
1658                 : Arrays.asList(this, newType);
1659         }
1660         return true;
1661     }
1662 
1663     // Decoding
1664 
1665     /*non-public*/
1666     LambdaForm internalForm() {
1667         return form;
1668     }


1684     }
1685 
1686     /*non-public*/
1687     MethodHandle withInternalMemberName(MemberName member, boolean isInvokeSpecial) {
1688         if (member != null) {
1689             return MethodHandleImpl.makeWrappedMember(this, member, isInvokeSpecial);
1690         } else if (internalMemberName() == null) {
1691             // The required internaMemberName is null, and this MH (like most) doesn't have one.
1692             return this;
1693         } else {
1694             // The following case is rare. Mask the internalMemberName by wrapping the MH in a BMH.
1695             MethodHandle result = rebind();
1696             assert (result.internalMemberName() == null);
1697             return result;
1698         }
1699     }
1700 
1701     /*non-public*/
1702     boolean isInvokeSpecial() {
1703         return false;  // DMH.Special returns true





1704     }
1705 
1706     /*non-public*/
1707     Object internalValues() {
1708         return null;
1709     }
1710 
1711     /*non-public*/
1712     Object internalProperties() {
1713         // Override to something to follow this.form, like "\n& FOO=bar"
1714         return "";
1715     }
1716 
1717     //// Method handle implementation methods.
1718     //// Sub-classes can override these default implementations.
1719     //// All these methods assume arguments are already validated.
1720 
1721     /*non-public*/
1722     abstract MethodHandle copyWith(MethodType mt, LambdaForm lf);
1723 




1623 
1624     // Other transforms to do:  convert, explicitCast, permute, drop, filter, fold, GWT, catch
1625 
1626     BoundMethodHandle bindArgumentL(int pos, Object value) {
1627         return rebind().bindArgumentL(pos, value);
1628     }
1629 
1630     /*non-public*/
1631     MethodHandle setVarargs(MemberName member) throws IllegalAccessException {
1632         if (!member.isVarargs())  return this;
1633         try {
1634             return this.withVarargs(true);
1635         } catch (IllegalArgumentException ex) {
1636             throw member.makeAccessException("cannot make variable arity", null);
1637         }
1638     }
1639 
1640     /*non-public*/
1641     MethodHandle viewAsType(MethodType newType, boolean strict) {
1642         // No actual conversions, just a new view of the same method.
1643         // Overridden in DMH, which has special rules


1644         assert viewAsTypeChecks(newType, strict);
1645         return copyWith(newType, form);

1646     }
1647 
1648     /*non-public*/
1649     boolean viewAsTypeChecks(MethodType newType, boolean strict) {
1650         if (strict) {
1651             assert(type().isViewableAs(newType, true))
1652                 : Arrays.asList(this, newType);
1653         } else {
1654             assert(type().basicType().isViewableAs(newType.basicType(), true))
1655                 : Arrays.asList(this, newType);
1656         }
1657         return true;
1658     }
1659 
1660     // Decoding
1661 
1662     /*non-public*/
1663     LambdaForm internalForm() {
1664         return form;
1665     }


1681     }
1682 
1683     /*non-public*/
1684     MethodHandle withInternalMemberName(MemberName member, boolean isInvokeSpecial) {
1685         if (member != null) {
1686             return MethodHandleImpl.makeWrappedMember(this, member, isInvokeSpecial);
1687         } else if (internalMemberName() == null) {
1688             // The required internaMemberName is null, and this MH (like most) doesn't have one.
1689             return this;
1690         } else {
1691             // The following case is rare. Mask the internalMemberName by wrapping the MH in a BMH.
1692             MethodHandle result = rebind();
1693             assert (result.internalMemberName() == null);
1694             return result;
1695         }
1696     }
1697 
1698     /*non-public*/
1699     boolean isInvokeSpecial() {
1700         return false;  // DMH.Special returns true
1701     }
1702 
1703     /*non-public*/
1704     boolean isCrackable() {
1705         return false;
1706     }
1707 
1708     /*non-public*/
1709     Object internalValues() {
1710         return null;
1711     }
1712 
1713     /*non-public*/
1714     Object internalProperties() {
1715         // Override to something to follow this.form, like "\n& FOO=bar"
1716         return "";
1717     }
1718 
1719     //// Method handle implementation methods.
1720     //// Sub-classes can override these default implementations.
1721     //// All these methods assume arguments are already validated.
1722 
1723     /*non-public*/
1724     abstract MethodHandle copyWith(MethodType mt, LambdaForm lf);
1725 


< prev index next >