1*a03ca8b9SKrzysztof Kosiński# Tests invoke-polymorphic added in DEX version 38. 2*a03ca8b9SKrzysztof Kosiński# Disassembled from dexdump test files. 3*a03ca8b9SKrzysztof Kosiński# Repo: https://android.googlesource.com/platform/art/ 4*a03ca8b9SKrzysztof Kosiński# File: test/dexdump/invoke-polymorphic.dex 5*a03ca8b9SKrzysztof Kosiński 6*a03ca8b9SKrzysztof Kosiński# Compile using smali: https://github.com/JesusFreke/smali 7*a03ca8b9SKrzysztof Kosiński# java -jar smali.jar assemble invoke-polymorphic.smali --api 28 8*a03ca8b9SKrzysztof Kosiński 9*a03ca8b9SKrzysztof Kosiński.class public LMain; 10*a03ca8b9SKrzysztof Kosiński.super Ljava/lang/Object; 11*a03ca8b9SKrzysztof Kosiński.source "Main.java" 12*a03ca8b9SKrzysztof Kosiński 13*a03ca8b9SKrzysztof Kosiński 14*a03ca8b9SKrzysztof Kosiński# direct methods 15*a03ca8b9SKrzysztof Kosiński.method public constructor <init>()V 16*a03ca8b9SKrzysztof Kosiński .registers 1 17*a03ca8b9SKrzysztof Kosiński 18*a03ca8b9SKrzysztof Kosiński .prologue 19*a03ca8b9SKrzysztof Kosiński .line 9 20*a03ca8b9SKrzysztof Kosiński invoke-direct {p0}, Ljava/lang/Object;-><init>()V 21*a03ca8b9SKrzysztof Kosiński 22*a03ca8b9SKrzysztof Kosiński return-void 23*a03ca8b9SKrzysztof Kosiński.end method 24*a03ca8b9SKrzysztof Kosiński 25*a03ca8b9SKrzysztof Kosiński.method public static main([Ljava/lang/String;)V 26*a03ca8b9SKrzysztof Kosiński .registers 10 27*a03ca8b9SKrzysztof Kosiński .param p0, "args" # [Ljava/lang/String; 28*a03ca8b9SKrzysztof Kosiński .annotation system Ldalvik/annotation/Throws; 29*a03ca8b9SKrzysztof Kosiński value = { 30*a03ca8b9SKrzysztof Kosiński Ljava/lang/Throwable; 31*a03ca8b9SKrzysztof Kosiński } 32*a03ca8b9SKrzysztof Kosiński .end annotation 33*a03ca8b9SKrzysztof Kosiński 34*a03ca8b9SKrzysztof Kosiński .prologue 35*a03ca8b9SKrzysztof Kosiński const-wide v2, 0x400199999999999aL # 2.2 36*a03ca8b9SKrzysztof Kosiński 37*a03ca8b9SKrzysztof Kosiński const/4 v4, 0x1 38*a03ca8b9SKrzysztof Kosiński 39*a03ca8b9SKrzysztof Kosiński .line 31 40*a03ca8b9SKrzysztof Kosiński const/4 v0, 0x0 41*a03ca8b9SKrzysztof Kosiński 42*a03ca8b9SKrzysztof Kosiński .line 32 43*a03ca8b9SKrzysztof Kosiński .local v0, "handle":Ljava/lang/invoke/MethodHandle; 44*a03ca8b9SKrzysztof Kosiński const/4 v5, 0x0 45*a03ca8b9SKrzysztof Kosiński 46*a03ca8b9SKrzysztof Kosiński .line 33 47*a03ca8b9SKrzysztof Kosiński .local v5, "o":Ljava/lang/Object; 48*a03ca8b9SKrzysztof Kosiński const-string/jumbo v1, "a" 49*a03ca8b9SKrzysztof Kosiński 50*a03ca8b9SKrzysztof Kosiński move v6, v4 51*a03ca8b9SKrzysztof Kosiński 52*a03ca8b9SKrzysztof Kosiński invoke-polymorphic/range {v0 .. v6}, Ljava/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (Ljava/lang/String;DILjava/lang/Object;I)Ljava/lang/String; 53*a03ca8b9SKrzysztof Kosiński 54*a03ca8b9SKrzysztof Kosiński move-result-object v7 55*a03ca8b9SKrzysztof Kosiński 56*a03ca8b9SKrzysztof Kosiński .line 34 57*a03ca8b9SKrzysztof Kosiński .local v7, "s":Ljava/lang/String; 58*a03ca8b9SKrzysztof Kosiński invoke-polymorphic {v0, v2, v3, v4}, Ljava/lang/invoke/MethodHandle;->invokeExact([Ljava/lang/Object;)Ljava/lang/Object;, (DI)I 59*a03ca8b9SKrzysztof Kosiński 60*a03ca8b9SKrzysztof Kosiński move-result v8 61*a03ca8b9SKrzysztof Kosiński 62*a03ca8b9SKrzysztof Kosiński .line 35 63*a03ca8b9SKrzysztof Kosiński .local v8, "x":I 64*a03ca8b9SKrzysztof Kosiński const-string/jumbo v1, "a" 65*a03ca8b9SKrzysztof Kosiński 66*a03ca8b9SKrzysztof Kosiński invoke-polymorphic {v0, v1, v2, v3, v4}, Ljava/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (Ljava/lang/String;DI)V 67*a03ca8b9SKrzysztof Kosiński 68*a03ca8b9SKrzysztof Kosiński .line 56 69*a03ca8b9SKrzysztof Kosiński return-void 70*a03ca8b9SKrzysztof Kosiński.end method 71