• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#
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
246.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
312