xref: /aosp_15_r20/art/test/955-methodhandles-smali/smali/Main.smali (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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