1*795d594fSAndroid Build Coastguard Worker# Copyright 2016 The Android Open Source Project 2*795d594fSAndroid Build Coastguard Worker# 3*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*795d594fSAndroid Build Coastguard Worker# 7*795d594fSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*795d594fSAndroid Build Coastguard Worker# 9*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*795d594fSAndroid Build Coastguard Worker# limitations under the License. 14*795d594fSAndroid Build Coastguard Worker 15*795d594fSAndroid Build Coastguard Worker.class LMain; 16*795d594fSAndroid Build Coastguard Worker.super Ljava/lang/Object; 17*795d594fSAndroid Build Coastguard Worker 18*795d594fSAndroid Build Coastguard Worker# MethodHandle Main.getHandleForVirtual(Class<?> defc, String name, MethodType type); 19*795d594fSAndroid Build Coastguard Worker# 20*795d594fSAndroid Build Coastguard Worker# Returns a handle to a virtual method on |defc| named name with type |type| using 21*795d594fSAndroid Build Coastguard Worker# the public lookup object. 22*795d594fSAndroid Build Coastguard Worker.method public static getHandleForVirtual(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; 23*795d594fSAndroid Build Coastguard Worker.registers 5 24*795d594fSAndroid Build Coastguard Worker 25*795d594fSAndroid Build Coastguard Worker # Get a reference to the public lookup object (MethodHandles.publicLookup()). 26*795d594fSAndroid Build Coastguard Worker invoke-static {}, Ljava/lang/invoke/MethodHandles;->publicLookup()Ljava/lang/invoke/MethodHandles$Lookup; 27*795d594fSAndroid Build Coastguard Worker move-result-object v0 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker # Call Lookup.findVirtual(defc, name, type); 30*795d594fSAndroid Build Coastguard Worker invoke-virtual {v0, p0, p1, p2}, Ljava/lang/invoke/MethodHandles$Lookup;->findVirtual(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; 31*795d594fSAndroid Build Coastguard Worker move-result-object v1 32*795d594fSAndroid Build Coastguard Worker return-object v1 33*795d594fSAndroid Build Coastguard Worker.end method 34*795d594fSAndroid Build Coastguard Worker 35*795d594fSAndroid Build Coastguard Worker# MethodHandle Main.getHandleForStatic(Class<?> defc, String name, MethodType type); 36*795d594fSAndroid Build Coastguard Worker# 37*795d594fSAndroid Build Coastguard Worker# Returns a handle to a static method on |defc| named name with type |type| using 38*795d594fSAndroid Build Coastguard Worker# the public lookup object. 39*795d594fSAndroid Build Coastguard Worker.method public static getHandleForStatic(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; 40*795d594fSAndroid Build Coastguard Worker.registers 5 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Worker # Get a reference to the public lookup object (MethodHandles.publicLookup()). 43*795d594fSAndroid Build Coastguard Worker invoke-static {}, Ljava/lang/invoke/MethodHandles;->publicLookup()Ljava/lang/invoke/MethodHandles$Lookup; 44*795d594fSAndroid Build Coastguard Worker move-result-object v0 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Worker # Call Lookup.findStatic(defc, name, type); 47*795d594fSAndroid Build Coastguard Worker invoke-virtual {v0, p0, p1, p2}, Ljava/lang/invoke/MethodHandles$Lookup;->findStatic(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; 48*795d594fSAndroid Build Coastguard Worker move-result-object v1 49*795d594fSAndroid Build Coastguard Worker return-object v1 50*795d594fSAndroid Build Coastguard Worker.end method 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker# Returns a method handle to String java.lang.String.concat(String); 53*795d594fSAndroid Build Coastguard Worker.method public static getStringConcatHandle()Ljava/lang/invoke/MethodHandle; 54*795d594fSAndroid Build Coastguard Worker.registers 3 55*795d594fSAndroid Build Coastguard Worker const-string v0, "concat" 56*795d594fSAndroid Build Coastguard Worker invoke-virtual {v0}, Ljava/lang/Object;->getClass()Ljava/lang/Class; 57*795d594fSAndroid Build Coastguard Worker move-result-object v1 58*795d594fSAndroid Build Coastguard Worker 59*795d594fSAndroid Build Coastguard Worker # Call MethodType.methodType(rtype=String.class, ptype[0] = String.class) 60*795d594fSAndroid Build Coastguard Worker invoke-static {v1, v1}, Ljava/lang/invoke/MethodType;->methodType(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/invoke/MethodType; 61*795d594fSAndroid Build Coastguard Worker move-result-object v2 62*795d594fSAndroid Build Coastguard Worker 63*795d594fSAndroid Build Coastguard Worker # Call Main.getHandleForVirtual(String.class, "concat", methodType); 64*795d594fSAndroid Build Coastguard Worker invoke-static {v1, v0, v2}, LMain;->getHandleForVirtual(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; 65*795d594fSAndroid Build Coastguard Worker move-result-object v0 66*795d594fSAndroid Build Coastguard Worker return-object v0 67*795d594fSAndroid Build Coastguard Worker.end method 68*795d594fSAndroid Build Coastguard Worker 69*795d594fSAndroid Build Coastguard Worker# Returns a method handle to boolean java.lang.Long.compareTo(java.lang.Long other). 70*795d594fSAndroid Build Coastguard Worker.method public static getLongCompareToHandle()Ljava/lang/invoke/MethodHandle; 71*795d594fSAndroid Build Coastguard Worker.registers 4 72*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/Long; 73*795d594fSAndroid Build Coastguard Worker const-wide v1, 0 74*795d594fSAndroid Build Coastguard Worker invoke-direct {v0, v1, v2}, Ljava/lang/Long;-><init>(J)V 75*795d594fSAndroid Build Coastguard Worker invoke-virtual {v0}, Ljava/lang/Object;->getClass()Ljava/lang/Class; 76*795d594fSAndroid Build Coastguard Worker move-result-object v0 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Worker # set v0 to Integer.TYPE aka. int.class 79*795d594fSAndroid Build Coastguard Worker sget-object v1, Ljava/lang/Integer;->TYPE:Ljava/lang/Class; 80*795d594fSAndroid Build Coastguard Worker 81*795d594fSAndroid Build Coastguard Worker # Call MethodType.methodType(rtype=int.class, ptype[0] = Long.class) 82*795d594fSAndroid Build Coastguard Worker invoke-static {v1, v0}, Ljava/lang/invoke/MethodType;->methodType(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/invoke/MethodType; 83*795d594fSAndroid Build Coastguard Worker move-result-object v2 84*795d594fSAndroid Build Coastguard Worker 85*795d594fSAndroid Build Coastguard Worker const-string v3, "compareTo" 86*795d594fSAndroid Build Coastguard Worker # Call Main.getHandleForVirtual(Long.class, "compareTo", methodType); 87*795d594fSAndroid Build Coastguard Worker invoke-static {v0, v3, v2}, LMain;->getHandleForVirtual(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; 88*795d594fSAndroid Build Coastguard Worker move-result-object v0 89*795d594fSAndroid Build Coastguard Worker return-object v0 90*795d594fSAndroid Build Coastguard Worker.end method 91*795d594fSAndroid Build Coastguard Worker 92*795d594fSAndroid Build Coastguard Worker# Returns a method handle to static String java.lang.String.valueOf(Object); 93*795d594fSAndroid Build Coastguard Worker.method public static getStringValueOfObjectHandle()Ljava/lang/invoke/MethodHandle; 94*795d594fSAndroid Build Coastguard Worker.registers 4 95*795d594fSAndroid Build Coastguard Worker # set v0 to java.lang.Object.class 96*795d594fSAndroid Build Coastguard Worker new-instance v0, Ljava/lang/Object; 97*795d594fSAndroid Build Coastguard Worker invoke-direct {v0}, Ljava/lang/Object;-><init>()V 98*795d594fSAndroid Build Coastguard Worker invoke-virtual {v0}, Ljava/lang/Object;->getClass()Ljava/lang/Class; 99*795d594fSAndroid Build Coastguard Worker move-result-object v0 100*795d594fSAndroid Build Coastguard Worker 101*795d594fSAndroid Build Coastguard Worker # set v1 to the name of the method ("valueOf") and v2 to java.lang.String.class; 102*795d594fSAndroid Build Coastguard Worker const-string v1, "valueOf" 103*795d594fSAndroid Build Coastguard Worker invoke-virtual {v1}, Ljava/lang/Object;->getClass()Ljava/lang/Class; 104*795d594fSAndroid Build Coastguard Worker move-result-object v2 105*795d594fSAndroid Build Coastguard Worker 106*795d594fSAndroid Build Coastguard Worker # Call MethodType.methodType(rtype=String.class, ptype[0]=Object.class) 107*795d594fSAndroid Build Coastguard Worker invoke-static {v2, v0}, Ljava/lang/invoke/MethodType;->methodType(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/invoke/MethodType; 108*795d594fSAndroid Build Coastguard Worker move-result-object v3 109*795d594fSAndroid Build Coastguard Worker 110*795d594fSAndroid Build Coastguard Worker # Call Main.getHandleForStatic(String.class, "valueOf", methodType); 111*795d594fSAndroid Build Coastguard Worker invoke-static {v2, v1, v3}, LMain;->getHandleForStatic(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; 112*795d594fSAndroid Build Coastguard Worker move-result-object v0 113*795d594fSAndroid Build Coastguard Worker return-object v0 114*795d594fSAndroid Build Coastguard Worker.end method 115*795d594fSAndroid Build Coastguard Worker 116*795d594fSAndroid Build Coastguard Worker# Returns a method handle to static String java.lang.String.valueOf(String); 117*795d594fSAndroid Build Coastguard Worker.method public static getStringValueOfLongHandle()Ljava/lang/invoke/MethodHandle; 118*795d594fSAndroid Build Coastguard Worker.registers 4 119*795d594fSAndroid Build Coastguard Worker # set v0 to Long.TYPE aka. long.class 120*795d594fSAndroid Build Coastguard Worker sget-object v0, Ljava/lang/Long;->TYPE:Ljava/lang/Class; 121*795d594fSAndroid Build Coastguard Worker 122*795d594fSAndroid Build Coastguard Worker # set v1 to the name of the method ("valueOf") and v2 to java.lang.String.class; 123*795d594fSAndroid Build Coastguard Worker const-string v1, "valueOf" 124*795d594fSAndroid Build Coastguard Worker invoke-virtual {v1}, Ljava/lang/Object;->getClass()Ljava/lang/Class; 125*795d594fSAndroid Build Coastguard Worker move-result-object v2 126*795d594fSAndroid Build Coastguard Worker 127*795d594fSAndroid Build Coastguard Worker # Call MethodType.methodType(rtype=String.class, ptype[0]=Long.class) 128*795d594fSAndroid Build Coastguard Worker invoke-static {v2, v0}, Ljava/lang/invoke/MethodType;->methodType(Ljava/lang/Class;Ljava/lang/Class;)Ljava/lang/invoke/MethodType; 129*795d594fSAndroid Build Coastguard Worker move-result-object v3 130*795d594fSAndroid Build Coastguard Worker 131*795d594fSAndroid Build Coastguard Worker # Call Main.getHandleForStatic(String.class, "valueOf", methodType); 132*795d594fSAndroid Build Coastguard Worker invoke-static {v2, v1, v3}, LMain;->getHandleForStatic(Ljava/lang/Class;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/MethodHandle; 133*795d594fSAndroid Build Coastguard Worker move-result-object v0 134*795d594fSAndroid Build Coastguard Worker return-object v0 135*795d594fSAndroid Build Coastguard Worker.end method 136*795d594fSAndroid Build Coastguard Worker 137*795d594fSAndroid Build Coastguard Worker.method public static main([Ljava/lang/String;)V 138*795d594fSAndroid Build Coastguard Worker.registers 5 139*795d594fSAndroid Build Coastguard Worker 140*795d594fSAndroid Build Coastguard Worker # Test case 1: Exercise String.concat(String, String) which is a virtual method. 141*795d594fSAndroid Build Coastguard Worker invoke-static {}, LMain;->getStringConcatHandle()Ljava/lang/invoke/MethodHandle; 142*795d594fSAndroid Build Coastguard Worker move-result-object v0 143*795d594fSAndroid Build Coastguard Worker const-string v1, "[String1]" 144*795d594fSAndroid Build Coastguard Worker const-string v2, "+[String2]" 145*795d594fSAndroid Build Coastguard Worker invoke-polymorphic {v0, v1, v2}, Ljava/lang/invoke/MethodHandle;->invokeExact([Ljava/lang/Object;)Ljava/lang/Object;, (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; 146*795d594fSAndroid Build Coastguard Worker move-result-object v3 147*795d594fSAndroid Build Coastguard Worker sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream; 148*795d594fSAndroid Build Coastguard Worker invoke-virtual {v4, v3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 149*795d594fSAndroid Build Coastguard Worker 150*795d594fSAndroid Build Coastguard Worker # Test case 2: Exercise String.valueOf(Object); 151*795d594fSAndroid Build Coastguard Worker invoke-static {}, LMain;->getStringValueOfObjectHandle()Ljava/lang/invoke/MethodHandle; 152*795d594fSAndroid Build Coastguard Worker move-result-object v0 153*795d594fSAndroid Build Coastguard Worker const-string v1, "[String1]" 154*795d594fSAndroid Build Coastguard Worker invoke-polymorphic {v0, v1}, Ljava/lang/invoke/MethodHandle;->invokeExact([Ljava/lang/Object;)Ljava/lang/Object;, (Ljava/lang/Object;)Ljava/lang/String; 155*795d594fSAndroid Build Coastguard Worker move-result-object v3 156*795d594fSAndroid Build Coastguard Worker sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream; 157*795d594fSAndroid Build Coastguard Worker invoke-virtual {v4, v3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 158*795d594fSAndroid Build Coastguard Worker 159*795d594fSAndroid Build Coastguard Worker # Test case 3: Exercise String.concat(String, String) with an inexact invoke. 160*795d594fSAndroid Build Coastguard Worker # Note that the callsite type here is String type(Object, Object); so the runtime 161*795d594fSAndroid Build Coastguard Worker # will generate dynamic type checks for the input arguments. 162*795d594fSAndroid Build Coastguard Worker invoke-static {}, LMain;->getStringConcatHandle()Ljava/lang/invoke/MethodHandle; 163*795d594fSAndroid Build Coastguard Worker move-result-object v0 164*795d594fSAndroid Build Coastguard Worker const-string v1, "[String1]" 165*795d594fSAndroid Build Coastguard Worker const-string v2, "+[String2]" 166*795d594fSAndroid Build Coastguard Worker invoke-polymorphic {v0, v1, v2}, Ljava/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/String; 167*795d594fSAndroid Build Coastguard Worker move-result-object v3 168*795d594fSAndroid Build Coastguard Worker sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream; 169*795d594fSAndroid Build Coastguard Worker invoke-virtual {v4, v3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 170*795d594fSAndroid Build Coastguard Worker 171*795d594fSAndroid Build Coastguard Worker # Test case 4: Exercise String.valueOf(long); 172*795d594fSAndroid Build Coastguard Worker # 173*795d594fSAndroid Build Coastguard Worker # We exercise it with various types of unboxing / widening conversions 174*795d594fSAndroid Build Coastguard Worker invoke-static {}, LMain;->getStringValueOfLongHandle()Ljava/lang/invoke/MethodHandle; 175*795d594fSAndroid Build Coastguard Worker move-result-object v0 176*795d594fSAndroid Build Coastguard Worker 177*795d594fSAndroid Build Coastguard Worker # First use a long, this is an invokeExact because the callsite type matches 178*795d594fSAndroid Build Coastguard Worker # the function type precisely. 179*795d594fSAndroid Build Coastguard Worker const-wide v1, 42 180*795d594fSAndroid Build Coastguard Worker invoke-polymorphic {v0, v1, v2}, Ljava/lang/invoke/MethodHandle;->invokeExact([Ljava/lang/Object;)Ljava/lang/Object;, (J)Ljava/lang/String; 181*795d594fSAndroid Build Coastguard Worker move-result-object v3 182*795d594fSAndroid Build Coastguard Worker sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream; 183*795d594fSAndroid Build Coastguard Worker invoke-virtual {v4, v3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 184*795d594fSAndroid Build Coastguard Worker 185*795d594fSAndroid Build Coastguard Worker # Then use an int, should perform a widening conversion. 186*795d594fSAndroid Build Coastguard Worker const v1, 40 187*795d594fSAndroid Build Coastguard Worker invoke-polymorphic {v0, v1}, Ljava/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (I)Ljava/lang/String; 188*795d594fSAndroid Build Coastguard Worker move-result-object v3 189*795d594fSAndroid Build Coastguard Worker sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream; 190*795d594fSAndroid Build Coastguard Worker invoke-virtual {v4, v3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 191*795d594fSAndroid Build Coastguard Worker 192*795d594fSAndroid Build Coastguard Worker # Then use a java/lang/Long; - should perform an unboxing conversion. 193*795d594fSAndroid Build Coastguard Worker new-instance v1, Ljava/lang/Long; 194*795d594fSAndroid Build Coastguard Worker const-wide v2, 43 195*795d594fSAndroid Build Coastguard Worker invoke-direct {v1, v2, v3}, Ljava/lang/Long;-><init>(J)V 196*795d594fSAndroid Build Coastguard Worker invoke-polymorphic {v0, v1}, Ljava/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (Ljava/lang/Long;)Ljava/lang/String; 197*795d594fSAndroid Build Coastguard Worker move-result-object v3 198*795d594fSAndroid Build Coastguard Worker sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream; 199*795d594fSAndroid Build Coastguard Worker invoke-virtual {v4, v3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 200*795d594fSAndroid Build Coastguard Worker 201*795d594fSAndroid Build Coastguard Worker # Then use a java/lang/Integer; - should perform an unboxing in addition to a widening conversion. 202*795d594fSAndroid Build Coastguard Worker new-instance v1, Ljava/lang/Integer; 203*795d594fSAndroid Build Coastguard Worker const v2, 44 204*795d594fSAndroid Build Coastguard Worker invoke-direct {v1, v2}, Ljava/lang/Integer;-><init>(I)V 205*795d594fSAndroid Build Coastguard Worker invoke-polymorphic {v0, v1}, Ljava/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (Ljava/lang/Integer;)Ljava/lang/String; 206*795d594fSAndroid Build Coastguard Worker move-result-object v3 207*795d594fSAndroid Build Coastguard Worker sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream; 208*795d594fSAndroid Build Coastguard Worker invoke-virtual {v4, v3}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V 209*795d594fSAndroid Build Coastguard Worker 210*795d594fSAndroid Build Coastguard Worker # Test case 5: Exercise int Long.compareTo(Long) 211*795d594fSAndroid Build Coastguard Worker invoke-static {}, LMain;->getLongCompareToHandle()Ljava/lang/invoke/MethodHandle; 212*795d594fSAndroid Build Coastguard Worker move-result-object v0 213*795d594fSAndroid Build Coastguard Worker new-instance v1, Ljava/lang/Long; 214*795d594fSAndroid Build Coastguard Worker const-wide v2, 43 215*795d594fSAndroid Build Coastguard Worker invoke-direct {v1, v2, v3}, Ljava/lang/Long;-><init>(J)V 216*795d594fSAndroid Build Coastguard Worker 217*795d594fSAndroid Build Coastguard Worker # At this point, v0 is our MethodHandle and v1 is the instance we're going to call compareTo on. 218*795d594fSAndroid Build Coastguard Worker 219*795d594fSAndroid Build Coastguard Worker # Call compareTo(Long) - this is invokeExact semantics. 220*795d594fSAndroid Build Coastguard Worker invoke-polymorphic {v0, v1, v1}, Ljava/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (Ljava/lang/Long;Ljava/lang/Long;)I 221*795d594fSAndroid Build Coastguard Worker move-result v3 222*795d594fSAndroid Build Coastguard Worker sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream; 223*795d594fSAndroid Build Coastguard Worker invoke-virtual {v4, v3}, Ljava/io/PrintStream;->println(I)V 224*795d594fSAndroid Build Coastguard Worker 225*795d594fSAndroid Build Coastguard Worker # Call compareTo(long) - this is an implicit box. 226*795d594fSAndroid Build Coastguard Worker const-wide v2, 44 227*795d594fSAndroid Build Coastguard Worker invoke-polymorphic {v0, v1, v2, v3}, Ljava/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (Ljava/lang/Long;J)I 228*795d594fSAndroid Build Coastguard Worker move-result v3 229*795d594fSAndroid Build Coastguard Worker sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream; 230*795d594fSAndroid Build Coastguard Worker invoke-virtual {v4, v3}, Ljava/io/PrintStream;->println(I)V 231*795d594fSAndroid Build Coastguard Worker 232*795d594fSAndroid Build Coastguard Worker # Call compareTo(int) - this is an implicit box. 233*795d594fSAndroid Build Coastguard Worker# This throws WrongMethodTypeException as it's a two step conversion int->long->Long or int->Integer->Long. 234*795d594fSAndroid Build Coastguard Worker# const v2, 40 235*795d594fSAndroid Build Coastguard Worker# invoke-polymorphic {v0, v1, v2}, Ljava/lang/invoke/MethodHandle;->invoke([Ljava/lang/Object;)Ljava/lang/Object;, (Ljava/lang/Long;I)I 236*795d594fSAndroid Build Coastguard Worker# move-result v3 237*795d594fSAndroid Build Coastguard Worker# sget-object v4, Ljava/lang/System;->out:Ljava/io/PrintStream; 238*795d594fSAndroid Build Coastguard Worker# invoke-virtual {v4, v3}, Ljava/io/PrintStream;->print(I)V 239*795d594fSAndroid Build Coastguard Worker 240*795d594fSAndroid Build Coastguard Worker return-void 241*795d594fSAndroid Build Coastguard Worker.end method 242