Class SignaturePolymorphicMethods

java.lang.Object
sootup.callgraph.SignaturePolymorphicMethods

public final class SignaturePolymorphicMethods extends Object
Resolution of signature-polymorphic methods (JVMS 2.9.3, 5.4.3.3), e.g. MethodHandle.invokeExact, VarHandle.get, MethodHandle.linkToStatic.

Call site keeps its own descriptor, e.g. invokeExact(String,String,int)int; declared method is native varargs invokeExact(Object[])Object. Plain sub-signature lookup misses. Rule: declared in java.lang.invoke.MethodHandle or VarHandle, single Object[] param, ACC_VARARGS | ACC_NATIVE, and only method of that name in the class. Flags, not the package-private @PolymorphicSignature annotation.

Cost: callers ask only after a regular lookup missed. Non-holder classes rejected by two string compares on already-stored names (no FQN allocation).

  • Method Details

    • isHolder

      public static boolean isHolder(@NonNull ClassType type)
      java.lang.invoke.MethodHandle or java.lang.invoke.VarHandle.
    • isSignaturePolymorphic

      public static boolean isSignaturePolymorphic(@NonNull SootMethod method)
      Whether method is signature polymorphic per JVMS 2.9.3.
    • resolve

      public static @NonNull Optional<? extends SootMethod> resolve(@NonNull View view, @NonNull MethodSignature callSite)
      Resolves the declared signature-polymorphic method callSite refers to.
      Returns:
      declared method, or empty if callSite names no such method or the holder class is not in the view
    • resolveInHierarchy

      public static @NonNull Optional<? extends SootMethod> resolveInHierarchy(@NonNull View view, @NonNull SootClass start, @NonNull String name)
      Like resolve(SootClass, String), but walks superclasses from start (JVMS 5.4.3.3 step 3): call-site owner may be a JDK-internal subclass, e.g. BoundMethodHandle.invokeBasic.
    • resolve

      public static @NonNull Optional<? extends SootMethod> resolve(@NonNull SootClass holder, @NonNull String name)
      Resolves signature-polymorphic method name declared in holder.
      Returns:
      declared method, or empty if holder is no holder class or has no such method