blob: f18b7ff74111b3e4a773dcb597314eb11dd72fc3 [file] [log] [blame]
Igor Murashkin6918bf12015-09-27 19:19:06 -07001#
2# Copyright (C) 2015 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16.class public LCaptureVariables;
17.super Ljava/lang/Object;
18
19.method public constructor <init>()V
20.registers 1
21 invoke-direct {p0}, Ljava/lang/Object;-><init>()V
22 return-void
23.end method
24
25.method public static run()V
26.registers 8
27 # Test boolean capture
28 const v2, 1 # v2 = true
29 capture-variable v2, "Z"
30 create-lambda v0, LCaptureVariables;->printCapturedVariable_Z(J)V
31 # TODO: create-lambda should not write to both v0 and v1
32 invoke-lambda v0, {}
33
34 # Test byte capture
35 const v2, 82 # v2 = 82, 'R'
36 capture-variable v2, "B"
37 create-lambda v0, LCaptureVariables;->printCapturedVariable_B(J)V
38 # TODO: create-lambda should not write to both v0 and v1
39 invoke-lambda v0, {}
40
41 # Test char capture
42 const v2, 0x2202 # v2 = 0x2202, '∂'
43 capture-variable v2, "C"
44 create-lambda v0, LCaptureVariables;->printCapturedVariable_C(J)V
45 # TODO: create-lambda should not write to both v0 and v1
46 invoke-lambda v0, {}
47
48 # Test short capture
49 const v2, 1000 # v2 = 1000
50 capture-variable v2, "S"
51 create-lambda v0, LCaptureVariables;->printCapturedVariable_S(J)V
52 # TODO: create-lambda should not write to both v0 and v1
53 invoke-lambda v0, {}
54
55 # Test int capture
56 const v2, 12345678
57 capture-variable v2, "I"
58 create-lambda v0, LCaptureVariables;->printCapturedVariable_I(J)V
59 # TODO: create-lambda should not write to both v0 and v1
60 invoke-lambda v0, {}
61
62 # Test long capture
63 const-wide v2, 0x0badf00dc0ffeeL # v2 = 3287471278325742
64 capture-variable v2, "J"
65 create-lambda v0, LCaptureVariables;->printCapturedVariable_J(J)V
66 # TODO: create-lambda should not write to both v0 and v1
67 invoke-lambda v0, {}
68
69 # Test float capture
70 const v2, infinityf
71 capture-variable v2, "F"
72 create-lambda v0, LCaptureVariables;->printCapturedVariable_F(J)V
73 # TODO: create-lambda should not write to both v0 and v1
74 invoke-lambda v0, {}
75
76 # Test double capture
77 const-wide v2, -infinity
78 capture-variable v2, "D"
79 create-lambda v0, LCaptureVariables;->printCapturedVariable_D(J)V
80 # TODO: create-lambda should not write to both v0 and v1
81 invoke-lambda v0, {}
82
83 #TODO: capture objects and lambdas once we have support for it
84
85 # Test capturing multiple variables
86 invoke-static {}, LCaptureVariables;->testMultipleCaptures()V
87
88 # Test failures
89 invoke-static {}, LCaptureVariables;->testFailures()V
90
91 return-void
92.end method
93
94#TODO: should use a closure type instead of a long
95.method public static printCapturedVariable_Z(J)V
96 .registers 5 # 1 wide parameter, 3 locals
97
98 const-string v0, "(CaptureVariables) (0-args, 1 captured variable 'Z'): value is "
99
100 sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
101 invoke-virtual {v1, v0}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
102
103 liberate-variable v2, p0, "Z"
104 invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(Z)V
105
106 return-void
107.end method
108
109#TODO: should use a closure type instead of a long
110.method public static printCapturedVariable_B(J)V
111 .registers 5 # 1 wide parameter, 3 locals
112
113 const-string v0, "(CaptureVariables) (0-args, 1 captured variable 'B'): value is "
114
115 sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
116 invoke-virtual {v1, v0}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
117
118 liberate-variable v2, p0, "B"
119 invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(C)V # no println(B), use char instead.
120
121 return-void
122.end method
123
124#TODO: should use a closure type instead of a long
125.method public static printCapturedVariable_C(J)V
126 .registers 5 # 1 wide parameter, 3 locals
127
128 const-string v0, "(CaptureVariables) (0-args, 1 captured variable 'C'): value is "
129
130 sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
131 invoke-virtual {v1, v0}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
132
133 liberate-variable v2, p0, "C"
134 invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(C)V
135
136 return-void
137.end method
138
139#TODO: should use a closure type instead of a long
140.method public static printCapturedVariable_S(J)V
141 .registers 5 # 1 wide parameter, 3 locals
142
143 const-string v0, "(CaptureVariables) (0-args, 1 captured variable 'S'): value is "
144
145 sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
146 invoke-virtual {v1, v0}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
147
148 liberate-variable v2, p0, "S"
149 invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(I)V # no println(S), use int instead
150
151 return-void
152.end method
153
154#TODO: should use a closure type instead of a long
155.method public static printCapturedVariable_I(J)V
156 .registers 5 # 1 wide parameter, 3 locals
157
158 const-string v0, "(CaptureVariables) (0-args, 1 captured variable 'I'): value is "
159
160 sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
161 invoke-virtual {v1, v0}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
162
163 liberate-variable v2, p0, "I"
164 invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(I)V
165
166 return-void
167.end method
168
169#TODO: should use a closure type instead of a long
170.method public static printCapturedVariable_J(J)V
171 .registers 6 # 1 wide parameter, 4 locals
172
173 const-string v0, "(CaptureVariables) (0-args, 1 captured variable 'J'): value is "
174
175 sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
176 invoke-virtual {v1, v0}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
177
178 liberate-variable v2, p0, "J"
179 invoke-virtual {v1, v2, v3}, Ljava/io/PrintStream;->println(J)V
180
181 return-void
182.end method
183
184#TODO: should use a closure type instead of a long
185.method public static printCapturedVariable_F(J)V
186 .registers 5 # 1 parameter, 4 locals
187
188 const-string v0, "(CaptureVariables) (0-args, 1 captured variable 'F'): value is "
189
190 sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
191 invoke-virtual {v1, v0}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
192
193 liberate-variable v2, p0, "F"
194 invoke-virtual {v1, v2}, Ljava/io/PrintStream;->println(F)V
195
196 return-void
197.end method
198
199#TODO: should use a closure type instead of a long
200.method public static printCapturedVariable_D(J)V
201 .registers 6 # 1 wide parameter, 4 locals
202
203 const-string v0, "(CaptureVariables) (0-args, 1 captured variable 'D'): value is "
204
205 sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
206 invoke-virtual {v1, v0}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
207
208 liberate-variable v2, p0, "D"
209 invoke-virtual {v1, v2, v3}, Ljava/io/PrintStream;->println(D)V
210
211 return-void
212.end method
213
214# Test capturing more than one variable.
215.method private static testMultipleCaptures()V
216 .registers 4 # 0 parameters, 4 locals
217
218 const v2, 1 # v2 = true
219 capture-variable v2, "Z"
220
221 const v2, 82 # v2 = 82, 'R'
222 capture-variable v2, "B"
223
224 const v2, 0x2202 # v2 = 0x2202, '∂'
225 capture-variable v2, "C"
226
227 const v2, 1000 # v2 = 1000
228 capture-variable v2, "S"
229
230 const v2, 12345678
231 capture-variable v2, "I"
232
233 const-wide v2, 0x0badf00dc0ffeeL # v2 = 3287471278325742
234 capture-variable v2, "J"
235
236 const v2, infinityf
237 capture-variable v2, "F"
238
239 const-wide v2, -infinity
240 capture-variable v2, "D"
241
242 create-lambda v0, LCaptureVariables;->printCapturedVariable_ZBCSIJFD(J)V
243 # TODO: create-lambda should not write to both v0 and v1
244 invoke-lambda v0, {}
245
Igor Murashkin6918bf12015-09-27 19:19:06 -0700246.end method
247
248#TODO: should use a closure type instead of a long
249.method public static printCapturedVariable_ZBCSIJFD(J)V
250 .registers 7 # 1 wide parameter, 5 locals
251
252 const-string v0, "(CaptureVariables) (0-args, 8 captured variable 'ZBCSIJFD'): value is "
253 const-string v4, ","
254
255 sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
256 invoke-virtual {v1, v0}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
257
258 liberate-variable v2, p0, "Z"
259 invoke-virtual {v1, v2}, Ljava/io/PrintStream;->print(Z)V
260 invoke-virtual {v1, v4}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
261
262 liberate-variable v2, p0, "B"
263 invoke-virtual {v1, v2}, Ljava/io/PrintStream;->print(C)V
264 invoke-virtual {v1, v4}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
265
266 liberate-variable v2, p0, "C"
267 invoke-virtual {v1, v2}, Ljava/io/PrintStream;->print(C)V
268 invoke-virtual {v1, v4}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
269
270 liberate-variable v2, p0, "S"
271 invoke-virtual {v1, v2}, Ljava/io/PrintStream;->print(I)V
272 invoke-virtual {v1, v4}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
273
274 liberate-variable v2, p0, "I"
275 invoke-virtual {v1, v2}, Ljava/io/PrintStream;->print(I)V
276 invoke-virtual {v1, v4}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
277
278 liberate-variable v2, p0, "J"
279 invoke-virtual {v1, v2, v3}, Ljava/io/PrintStream;->print(J)V
280 invoke-virtual {v1, v4}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
281
282 liberate-variable v2, p0, "F"
283 invoke-virtual {v1, v2}, Ljava/io/PrintStream;->print(F)V
284 invoke-virtual {v1, v4}, Ljava/io/PrintStream;->print(Ljava/lang/String;)V
285
286 liberate-variable v2, p0, "D"
287 invoke-virtual {v1, v2, v3}, Ljava/io/PrintStream;->println(D)V
288
289 return-void
290.end method
291
292# Test exceptions are thrown as expected when used opcodes incorrectly
293.method private static testFailures()V
294 .registers 4 # 0 parameters, 4 locals
295
296 const v0, 0 # v0 = null
297 const v1, 0 # v1 = null
298:start
299 liberate-variable v0, v2, "Z" # invoking a null lambda shall raise an NPE
300:end
301 return-void
302
303:handler
304 const-string v2, "(CaptureVariables) Caught NPE"
305 sget-object v3, Ljava/lang/System;->out:Ljava/io/PrintStream;
306 invoke-virtual {v3, v2}, Ljava/io/PrintStream;->println(Ljava/lang/String;)V
307
308 return-void
309
310 .catch Ljava/lang/NullPointerException; {:start .. :end} :handler
311.end method