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
|