xref: /aosp_15_r20/art/test/712-varhandle-invocations/util-src/generate_java.py (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker#!/usr/bin/python3
2*795d594fSAndroid Build Coastguard Worker#
3*795d594fSAndroid Build Coastguard Worker# Copyright (C) 2018 The Android Open Source Project
4*795d594fSAndroid Build Coastguard Worker#
5*795d594fSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*795d594fSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*795d594fSAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*795d594fSAndroid Build Coastguard Worker#
9*795d594fSAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
10*795d594fSAndroid Build Coastguard Worker#
11*795d594fSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*795d594fSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*795d594fSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*795d594fSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*795d594fSAndroid Build Coastguard Worker# limitations under the License.
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Worker"""
18*795d594fSAndroid Build Coastguard WorkerGenerate java test files for 712-varhandle-invocations
19*795d594fSAndroid Build Coastguard Worker"""
20*795d594fSAndroid Build Coastguard Worker
21*795d594fSAndroid Build Coastguard Workerfrom enum import Enum
22*795d594fSAndroid Build Coastguard Workerfrom pathlib import Path
23*795d594fSAndroid Build Coastguard Workerfrom random import Random
24*795d594fSAndroid Build Coastguard Workerfrom string import Template
25*795d594fSAndroid Build Coastguard Worker
26*795d594fSAndroid Build Coastguard Workerimport io
27*795d594fSAndroid Build Coastguard Workerimport re
28*795d594fSAndroid Build Coastguard Workerimport sys
29*795d594fSAndroid Build Coastguard Worker
30*795d594fSAndroid Build Coastguard Workerclass JavaType(object):
31*795d594fSAndroid Build Coastguard Worker    def __init__(self, name, examples, supports_bitwise=False, supports_numeric=False):
32*795d594fSAndroid Build Coastguard Worker        self.name=name
33*795d594fSAndroid Build Coastguard Worker        self.examples=examples
34*795d594fSAndroid Build Coastguard Worker        self.supports_bitwise=supports_bitwise
35*795d594fSAndroid Build Coastguard Worker        self.supports_numeric=supports_numeric
36*795d594fSAndroid Build Coastguard Worker
37*795d594fSAndroid Build Coastguard Worker    def is_value_type(self):
38*795d594fSAndroid Build Coastguard Worker        return False
39*795d594fSAndroid Build Coastguard Worker
40*795d594fSAndroid Build Coastguard Worker    def __repr__(self):
41*795d594fSAndroid Build Coastguard Worker        return self.name
42*795d594fSAndroid Build Coastguard Worker
43*795d594fSAndroid Build Coastguard Worker    def __str__(self):
44*795d594fSAndroid Build Coastguard Worker        return self.name
45*795d594fSAndroid Build Coastguard Worker
46*795d594fSAndroid Build Coastguard Workerclass ValueType(JavaType):
47*795d594fSAndroid Build Coastguard Worker    def __init__(self, name, boxed_type, examples, ordinal=-1, width=-1, supports_bitwise=True, supports_numeric=True):
48*795d594fSAndroid Build Coastguard Worker        JavaType.__init__(self, name, examples, supports_bitwise, supports_numeric)
49*795d594fSAndroid Build Coastguard Worker        self.ordinal=ordinal
50*795d594fSAndroid Build Coastguard Worker        self.width=width
51*795d594fSAndroid Build Coastguard Worker        self.boxed_type=boxed_type
52*795d594fSAndroid Build Coastguard Worker
53*795d594fSAndroid Build Coastguard Worker    def boxing_method(self):
54*795d594fSAndroid Build Coastguard Worker        return self.boxed_type + ".valueOf"
55*795d594fSAndroid Build Coastguard Worker
56*795d594fSAndroid Build Coastguard Worker    def unboxing_method(self):
57*795d594fSAndroid Build Coastguard Worker        return self.name + "Value"
58*795d594fSAndroid Build Coastguard Worker
59*795d594fSAndroid Build Coastguard Worker    def is_value_type(self):
60*795d594fSAndroid Build Coastguard Worker        return True
61*795d594fSAndroid Build Coastguard Worker
62*795d594fSAndroid Build Coastguard Worker    def __eq__(self, other):
63*795d594fSAndroid Build Coastguard Worker        return self.ordinal == other.ordinal
64*795d594fSAndroid Build Coastguard Worker
65*795d594fSAndroid Build Coastguard Worker    def __hash__(self):
66*795d594fSAndroid Build Coastguard Worker        return self.ordinal
67*795d594fSAndroid Build Coastguard Worker
68*795d594fSAndroid Build Coastguard Worker    def __le__(self, other):
69*795d594fSAndroid Build Coastguard Worker        return self.ordinal < other.ordinal
70*795d594fSAndroid Build Coastguard Worker
71*795d594fSAndroid Build Coastguard Worker    def __repr__(self):
72*795d594fSAndroid Build Coastguard Worker        return self.name
73*795d594fSAndroid Build Coastguard Worker
74*795d594fSAndroid Build Coastguard Worker    def __str__(self):
75*795d594fSAndroid Build Coastguard Worker        return self.name
76*795d594fSAndroid Build Coastguard Worker
77*795d594fSAndroid Build Coastguard WorkerBOOLEAN_TYPE = ValueType("boolean", "Boolean", [ "true", "false" ], ordinal = 0, width = 1, supports_numeric=False)
78*795d594fSAndroid Build Coastguard WorkerBYTE_TYPE=ValueType("byte", "Byte", [ "(byte) -128", "(byte) -61", "(byte) 7", "(byte) 127", "(byte) 33" ], ordinal=1, width=1)
79*795d594fSAndroid Build Coastguard WorkerSHORT_TYPE=ValueType("short", "Short", [ "(short) -32768", "(short) -384", "(short) 32767", "(short) 0xaa55" ], ordinal=2, width=2)
80*795d594fSAndroid Build Coastguard WorkerCHAR_TYPE=ValueType("char", "Character", [ r"'A'", r"'#'", r"'$'", r"'Z'", r"'t'", r"'c'",  r"Character.MAX_VALUE", r"Character.MIN_LOW_SURROGATE"], ordinal=3, width=2)
81*795d594fSAndroid Build Coastguard WorkerINT_TYPE=ValueType("int", "Integer", [ "-0x01234567", "0x7f6e5d4c", "0x12345678", "0x10215220", "42" ], ordinal=4, width=4)
82*795d594fSAndroid Build Coastguard WorkerLONG_TYPE=ValueType("long", "Long", [ "-0x0123456789abcdefl", "0x789abcdef0123456l", "0xfedcba9876543210l" ], ordinal=5, width=8)
83*795d594fSAndroid Build Coastguard WorkerFLOAT_TYPE=ValueType("float", "Float", [ "-7.77e23f", "1.234e-17f", "3.40e36f", "-8.888e3f", "4.442e11f" ], ordinal=6, width=4, supports_bitwise=False)
84*795d594fSAndroid Build Coastguard WorkerDOUBLE_TYPE=ValueType("double", "Double", [ "-1.0e-200", "1.11e200", "3.141", "1.1111", "6.022e23", "6.626e-34" ], ordinal=7, width=4, supports_bitwise=False)
85*795d594fSAndroid Build Coastguard Worker
86*795d594fSAndroid Build Coastguard WorkerVALUE_TYPES = { BOOLEAN_TYPE, BYTE_TYPE, SHORT_TYPE, CHAR_TYPE, INT_TYPE, LONG_TYPE, FLOAT_TYPE, DOUBLE_TYPE }
87*795d594fSAndroid Build Coastguard WorkerVIEW_SUPPORTED_TYPES = list(filter(lambda x : x.width >= 2, VALUE_TYPES))
88*795d594fSAndroid Build Coastguard WorkerVIEW_SUPPORTED_NARROW_TYPES = list(filter(lambda x : x.width == 2, VALUE_TYPES))
89*795d594fSAndroid Build Coastguard Worker
90*795d594fSAndroid Build Coastguard WorkerWIDENING_CONVERSIONS = {
91*795d594fSAndroid Build Coastguard Worker    BOOLEAN_TYPE : set(),
92*795d594fSAndroid Build Coastguard Worker    BYTE_TYPE : { SHORT_TYPE, INT_TYPE, LONG_TYPE, FLOAT_TYPE, DOUBLE_TYPE },
93*795d594fSAndroid Build Coastguard Worker    SHORT_TYPE : { INT_TYPE, LONG_TYPE, FLOAT_TYPE, DOUBLE_TYPE },
94*795d594fSAndroid Build Coastguard Worker    CHAR_TYPE : { INT_TYPE, LONG_TYPE, FLOAT_TYPE, DOUBLE_TYPE },
95*795d594fSAndroid Build Coastguard Worker    INT_TYPE : { LONG_TYPE, FLOAT_TYPE, DOUBLE_TYPE },
96*795d594fSAndroid Build Coastguard Worker    LONG_TYPE : { FLOAT_TYPE, DOUBLE_TYPE },
97*795d594fSAndroid Build Coastguard Worker    FLOAT_TYPE : { DOUBLE_TYPE },
98*795d594fSAndroid Build Coastguard Worker    DOUBLE_TYPE : set()
99*795d594fSAndroid Build Coastguard Worker}
100*795d594fSAndroid Build Coastguard Worker
101*795d594fSAndroid Build Coastguard Workerdef types_that_widen_to(var_type):
102*795d594fSAndroid Build Coastguard Worker    types_that_widen = { var_type }
103*795d594fSAndroid Build Coastguard Worker    for src_type in WIDENING_CONVERSIONS:
104*795d594fSAndroid Build Coastguard Worker        if var_type in WIDENING_CONVERSIONS[src_type]:
105*795d594fSAndroid Build Coastguard Worker            types_that_widen.add(src_type)
106*795d594fSAndroid Build Coastguard Worker    return types_that_widen
107*795d594fSAndroid Build Coastguard Worker
108*795d594fSAndroid Build Coastguard Workerclass VarHandleKind(object):
109*795d594fSAndroid Build Coastguard Worker    def __init__(self, name, supported_types=[], imports=[], declarations=[], lookup='', coordinates=[], get_value='', may_throw_read_only=False):
110*795d594fSAndroid Build Coastguard Worker        self.name = name
111*795d594fSAndroid Build Coastguard Worker        self.supported_types = supported_types
112*795d594fSAndroid Build Coastguard Worker        self.imports = imports
113*795d594fSAndroid Build Coastguard Worker        self.declarations = declarations
114*795d594fSAndroid Build Coastguard Worker        self.lookup = lookup
115*795d594fSAndroid Build Coastguard Worker        self.coordinates = coordinates
116*795d594fSAndroid Build Coastguard Worker        self.get_value_ = get_value
117*795d594fSAndroid Build Coastguard Worker        self.may_throw_read_only = may_throw_read_only
118*795d594fSAndroid Build Coastguard Worker
119*795d594fSAndroid Build Coastguard Worker    def get_name(self):
120*795d594fSAndroid Build Coastguard Worker        return self.name
121*795d594fSAndroid Build Coastguard Worker
122*795d594fSAndroid Build Coastguard Worker    def get_coordinates(self):
123*795d594fSAndroid Build Coastguard Worker        return self.coordinates
124*795d594fSAndroid Build Coastguard Worker
125*795d594fSAndroid Build Coastguard Worker    def get_field_declarations(self, dictionary):
126*795d594fSAndroid Build Coastguard Worker        return list(map(lambda d: Template(d).safe_substitute(dictionary), self.declarations))
127*795d594fSAndroid Build Coastguard Worker
128*795d594fSAndroid Build Coastguard Worker    def get_imports(self):
129*795d594fSAndroid Build Coastguard Worker        return self.imports
130*795d594fSAndroid Build Coastguard Worker
131*795d594fSAndroid Build Coastguard Worker    def get_lookup(self, dictionary):
132*795d594fSAndroid Build Coastguard Worker        return Template(self.lookup).safe_substitute(dictionary)
133*795d594fSAndroid Build Coastguard Worker
134*795d594fSAndroid Build Coastguard Worker    def get_supported_types(self):
135*795d594fSAndroid Build Coastguard Worker        return self.supported_types
136*795d594fSAndroid Build Coastguard Worker
137*795d594fSAndroid Build Coastguard Worker    def is_view(self):
138*795d594fSAndroid Build Coastguard Worker        return "View" in self.name
139*795d594fSAndroid Build Coastguard Worker
140*795d594fSAndroid Build Coastguard Worker    def get_value(self, dictionary):
141*795d594fSAndroid Build Coastguard Worker        return Template(self.get_value_).safe_substitute(dictionary)
142*795d594fSAndroid Build Coastguard Worker
143*795d594fSAndroid Build Coastguard WorkerFIELD_VAR_HANDLE = VarHandleKind("Field",
144*795d594fSAndroid Build Coastguard Worker                                 VALUE_TYPES,
145*795d594fSAndroid Build Coastguard Worker                                 [
146*795d594fSAndroid Build Coastguard Worker                                     'java.lang.invoke.MethodHandles',
147*795d594fSAndroid Build Coastguard Worker                                     'java.lang.invoke.VarHandle'
148*795d594fSAndroid Build Coastguard Worker                                 ],
149*795d594fSAndroid Build Coastguard Worker                                 [
150*795d594fSAndroid Build Coastguard Worker                                     "${var_type} field = ${initial_value}"
151*795d594fSAndroid Build Coastguard Worker                                 ],
152*795d594fSAndroid Build Coastguard Worker                                 'MethodHandles.lookup().findVarHandle(${test_class}.class, "field", ${var_type}.class)',
153*795d594fSAndroid Build Coastguard Worker                                 [
154*795d594fSAndroid Build Coastguard Worker                                     'this'
155*795d594fSAndroid Build Coastguard Worker                                 ],
156*795d594fSAndroid Build Coastguard Worker                                 'field',
157*795d594fSAndroid Build Coastguard Worker                                 may_throw_read_only = False)
158*795d594fSAndroid Build Coastguard Worker
159*795d594fSAndroid Build Coastguard WorkerFINAL_FIELD_VAR_HANDLE = VarHandleKind("FinalField",
160*795d594fSAndroid Build Coastguard Worker                                       VALUE_TYPES,
161*795d594fSAndroid Build Coastguard Worker                                       [
162*795d594fSAndroid Build Coastguard Worker                                           'java.lang.invoke.MethodHandles',
163*795d594fSAndroid Build Coastguard Worker                                           'java.lang.invoke.VarHandle'
164*795d594fSAndroid Build Coastguard Worker                                       ],
165*795d594fSAndroid Build Coastguard Worker                                       [
166*795d594fSAndroid Build Coastguard Worker                                           "${var_type} field = ${initial_value}"
167*795d594fSAndroid Build Coastguard Worker                                       ],
168*795d594fSAndroid Build Coastguard Worker                                       'MethodHandles.lookup().findVarHandle(${test_class}.class, "field", ${var_type}.class)',
169*795d594fSAndroid Build Coastguard Worker                                       [
170*795d594fSAndroid Build Coastguard Worker                                           'this'
171*795d594fSAndroid Build Coastguard Worker                                       ],
172*795d594fSAndroid Build Coastguard Worker                                       'field',
173*795d594fSAndroid Build Coastguard Worker                                       may_throw_read_only = False)
174*795d594fSAndroid Build Coastguard Worker
175*795d594fSAndroid Build Coastguard WorkerSTATIC_FIELD_VAR_HANDLE = VarHandleKind("StaticField",
176*795d594fSAndroid Build Coastguard Worker                                        VALUE_TYPES,
177*795d594fSAndroid Build Coastguard Worker                                        [
178*795d594fSAndroid Build Coastguard Worker                                            'java.lang.invoke.MethodHandles',
179*795d594fSAndroid Build Coastguard Worker                                            'java.lang.invoke.VarHandle'
180*795d594fSAndroid Build Coastguard Worker                                        ],
181*795d594fSAndroid Build Coastguard Worker                                        [
182*795d594fSAndroid Build Coastguard Worker                                            "static ${var_type} field = ${initial_value}"
183*795d594fSAndroid Build Coastguard Worker                                        ],
184*795d594fSAndroid Build Coastguard Worker                                        'MethodHandles.lookup().findStaticVarHandle(${test_class}.class, "field", ${var_type}.class)',
185*795d594fSAndroid Build Coastguard Worker                                        [],
186*795d594fSAndroid Build Coastguard Worker                                        'field',
187*795d594fSAndroid Build Coastguard Worker                                        may_throw_read_only = False)
188*795d594fSAndroid Build Coastguard Worker
189*795d594fSAndroid Build Coastguard WorkerSTATIC_FINAL_FIELD_VAR_HANDLE = VarHandleKind("StaticFinalField",
190*795d594fSAndroid Build Coastguard Worker                                              VALUE_TYPES,
191*795d594fSAndroid Build Coastguard Worker                                              [
192*795d594fSAndroid Build Coastguard Worker                                                  'java.lang.invoke.MethodHandles',
193*795d594fSAndroid Build Coastguard Worker                                                  'java.lang.invoke.VarHandle'
194*795d594fSAndroid Build Coastguard Worker                                              ],
195*795d594fSAndroid Build Coastguard Worker                                              [
196*795d594fSAndroid Build Coastguard Worker                                                  "static ${var_type} field = ${initial_value}"
197*795d594fSAndroid Build Coastguard Worker                                              ],
198*795d594fSAndroid Build Coastguard Worker                                              'MethodHandles.lookup().findStaticVarHandle(${test_class}.class, "field", ${var_type}.class)',
199*795d594fSAndroid Build Coastguard Worker                                              [],
200*795d594fSAndroid Build Coastguard Worker                                              'field',
201*795d594fSAndroid Build Coastguard Worker                                              may_throw_read_only = False)
202*795d594fSAndroid Build Coastguard Worker
203*795d594fSAndroid Build Coastguard WorkerARRAY_ELEMENT_VAR_HANDLE = VarHandleKind("ArrayElement",
204*795d594fSAndroid Build Coastguard Worker                                         VALUE_TYPES,
205*795d594fSAndroid Build Coastguard Worker                                         [
206*795d594fSAndroid Build Coastguard Worker                                             'java.lang.invoke.MethodHandles',
207*795d594fSAndroid Build Coastguard Worker                                             'java.lang.invoke.VarHandle'
208*795d594fSAndroid Build Coastguard Worker                                         ],
209*795d594fSAndroid Build Coastguard Worker                                         [
210*795d594fSAndroid Build Coastguard Worker                                             "${var_type}[] array = new ${var_type}[11]",
211*795d594fSAndroid Build Coastguard Worker                                             "int index = 3",
212*795d594fSAndroid Build Coastguard Worker                                             "{ array[index] = ${initial_value}; }"
213*795d594fSAndroid Build Coastguard Worker                                         ],
214*795d594fSAndroid Build Coastguard Worker                                         'MethodHandles.arrayElementVarHandle(${var_type}[].class)',
215*795d594fSAndroid Build Coastguard Worker                                         [ 'array', 'index'],
216*795d594fSAndroid Build Coastguard Worker                                         'array[index]',
217*795d594fSAndroid Build Coastguard Worker                                         may_throw_read_only = False)
218*795d594fSAndroid Build Coastguard Worker
219*795d594fSAndroid Build Coastguard WorkerBYTE_ARRAY_LE_VIEW_VAR_HANDLE = VarHandleKind("ByteArrayViewLE",
220*795d594fSAndroid Build Coastguard Worker                                              VIEW_SUPPORTED_TYPES,
221*795d594fSAndroid Build Coastguard Worker                                              [
222*795d594fSAndroid Build Coastguard Worker                                                  'java.lang.invoke.MethodHandles',
223*795d594fSAndroid Build Coastguard Worker                                                  'java.lang.invoke.VarHandle',
224*795d594fSAndroid Build Coastguard Worker                                                  'java.nio.ByteOrder'
225*795d594fSAndroid Build Coastguard Worker                                              ],
226*795d594fSAndroid Build Coastguard Worker                                              [
227*795d594fSAndroid Build Coastguard Worker                                                  "byte[] array = VarHandleUnitTestHelpers.createFilledByteArray(27)",
228*795d594fSAndroid Build Coastguard Worker                                                  "int index = 8",
229*795d594fSAndroid Build Coastguard Worker                                                  "{"
230*795d594fSAndroid Build Coastguard Worker                                                  "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(array, index);"
231*795d594fSAndroid Build Coastguard Worker                                                  "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(array, index, ${initial_value}, ByteOrder.LITTLE_ENDIAN);"
232*795d594fSAndroid Build Coastguard Worker                                                  "}"
233*795d594fSAndroid Build Coastguard Worker                                              ],
234*795d594fSAndroid Build Coastguard Worker                                              'MethodHandles.byteArrayViewVarHandle(${var_type}[].class, ByteOrder.LITTLE_ENDIAN)',
235*795d594fSAndroid Build Coastguard Worker                                              [
236*795d594fSAndroid Build Coastguard Worker                                                  'array',
237*795d594fSAndroid Build Coastguard Worker                                                  'index'
238*795d594fSAndroid Build Coastguard Worker                                              ],
239*795d594fSAndroid Build Coastguard Worker                                              'VarHandleUnitTestHelpers.getBytesAs_${var_type}(array, index, ByteOrder.LITTLE_ENDIAN)',
240*795d594fSAndroid Build Coastguard Worker                                              may_throw_read_only = False)
241*795d594fSAndroid Build Coastguard Worker
242*795d594fSAndroid Build Coastguard WorkerNARROW_BYTE_ARRAY_LE_VIEW_VAR_HANDLE = VarHandleKind("NarrowByteArrayViewLE",
243*795d594fSAndroid Build Coastguard Worker                                                     VIEW_SUPPORTED_NARROW_TYPES,
244*795d594fSAndroid Build Coastguard Worker                                                     [
245*795d594fSAndroid Build Coastguard Worker                                                         'java.lang.invoke.MethodHandles',
246*795d594fSAndroid Build Coastguard Worker                                                         'java.lang.invoke.VarHandle',
247*795d594fSAndroid Build Coastguard Worker                                                         'java.nio.ByteOrder'
248*795d594fSAndroid Build Coastguard Worker                                                     ],
249*795d594fSAndroid Build Coastguard Worker                                                     [
250*795d594fSAndroid Build Coastguard Worker                                                         "byte[] array = VarHandleUnitTestHelpers.createFilledByteArray(27)",
251*795d594fSAndroid Build Coastguard Worker                                                         "int index = 10",
252*795d594fSAndroid Build Coastguard Worker                                                         "{"
253*795d594fSAndroid Build Coastguard Worker                                                         "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(array, index);"
254*795d594fSAndroid Build Coastguard Worker                                                         "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(array, index, ${initial_value}, ByteOrder.LITTLE_ENDIAN);"
255*795d594fSAndroid Build Coastguard Worker                                                         "}"
256*795d594fSAndroid Build Coastguard Worker                                                     ],
257*795d594fSAndroid Build Coastguard Worker                                                     'MethodHandles.byteArrayViewVarHandle(${var_type}[].class, ByteOrder.LITTLE_ENDIAN)',
258*795d594fSAndroid Build Coastguard Worker                                                     [
259*795d594fSAndroid Build Coastguard Worker                                                         'array',
260*795d594fSAndroid Build Coastguard Worker                                                         'index'
261*795d594fSAndroid Build Coastguard Worker                                                     ],
262*795d594fSAndroid Build Coastguard Worker                                                     'VarHandleUnitTestHelpers.getBytesAs_${var_type}(array, index, ByteOrder.LITTLE_ENDIAN)',
263*795d594fSAndroid Build Coastguard Worker                                                     may_throw_read_only = False)
264*795d594fSAndroid Build Coastguard Worker
265*795d594fSAndroid Build Coastguard WorkerBYTE_ARRAY_BE_VIEW_VAR_HANDLE = VarHandleKind("ByteArrayViewBE",
266*795d594fSAndroid Build Coastguard Worker                                              VIEW_SUPPORTED_TYPES,
267*795d594fSAndroid Build Coastguard Worker                                              [
268*795d594fSAndroid Build Coastguard Worker                                                  'java.lang.invoke.MethodHandles',
269*795d594fSAndroid Build Coastguard Worker                                                  'java.lang.invoke.VarHandle',
270*795d594fSAndroid Build Coastguard Worker                                                  'java.nio.ByteOrder'
271*795d594fSAndroid Build Coastguard Worker                                              ],
272*795d594fSAndroid Build Coastguard Worker                                              [
273*795d594fSAndroid Build Coastguard Worker                                                  "byte[] array = VarHandleUnitTestHelpers.createFilledByteArray(27)",
274*795d594fSAndroid Build Coastguard Worker                                                  "int index = 8",
275*795d594fSAndroid Build Coastguard Worker                                                  "{"
276*795d594fSAndroid Build Coastguard Worker                                                  "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(array, index);"
277*795d594fSAndroid Build Coastguard Worker                                                  "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(array, index, ${initial_value}, ByteOrder.BIG_ENDIAN);"
278*795d594fSAndroid Build Coastguard Worker                                                  "}"
279*795d594fSAndroid Build Coastguard Worker                                              ],
280*795d594fSAndroid Build Coastguard Worker                                              'MethodHandles.byteArrayViewVarHandle(${var_type}[].class, ByteOrder.BIG_ENDIAN)',
281*795d594fSAndroid Build Coastguard Worker                                              [
282*795d594fSAndroid Build Coastguard Worker                                                  'array',
283*795d594fSAndroid Build Coastguard Worker                                                  'index'
284*795d594fSAndroid Build Coastguard Worker                                              ],
285*795d594fSAndroid Build Coastguard Worker                                              'VarHandleUnitTestHelpers.getBytesAs_${var_type}(array, index, ByteOrder.BIG_ENDIAN)',
286*795d594fSAndroid Build Coastguard Worker                                              may_throw_read_only = False)
287*795d594fSAndroid Build Coastguard Worker
288*795d594fSAndroid Build Coastguard WorkerNARROW_BYTE_ARRAY_BE_VIEW_VAR_HANDLE = VarHandleKind("NarrowByteArrayViewBE",
289*795d594fSAndroid Build Coastguard Worker                                                     VIEW_SUPPORTED_NARROW_TYPES,
290*795d594fSAndroid Build Coastguard Worker                                                     [
291*795d594fSAndroid Build Coastguard Worker                                                         'java.lang.invoke.MethodHandles',
292*795d594fSAndroid Build Coastguard Worker                                                         'java.lang.invoke.VarHandle',
293*795d594fSAndroid Build Coastguard Worker                                                         'java.nio.ByteOrder'
294*795d594fSAndroid Build Coastguard Worker                                                     ],
295*795d594fSAndroid Build Coastguard Worker                                                     [
296*795d594fSAndroid Build Coastguard Worker                                                         "byte[] array = VarHandleUnitTestHelpers.createFilledByteArray(27)",
297*795d594fSAndroid Build Coastguard Worker                                                         "int index = 10",
298*795d594fSAndroid Build Coastguard Worker                                                         "{"
299*795d594fSAndroid Build Coastguard Worker                                                         "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(array, index);"
300*795d594fSAndroid Build Coastguard Worker                                                         "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(array, index, ${initial_value}, ByteOrder.BIG_ENDIAN);"
301*795d594fSAndroid Build Coastguard Worker                                                         "}"
302*795d594fSAndroid Build Coastguard Worker                                                     ],
303*795d594fSAndroid Build Coastguard Worker                                                     'MethodHandles.byteArrayViewVarHandle(${var_type}[].class, ByteOrder.BIG_ENDIAN)',
304*795d594fSAndroid Build Coastguard Worker                                                     [
305*795d594fSAndroid Build Coastguard Worker                                                         'array',
306*795d594fSAndroid Build Coastguard Worker                                                         'index'
307*795d594fSAndroid Build Coastguard Worker                                                     ],
308*795d594fSAndroid Build Coastguard Worker                                                     'VarHandleUnitTestHelpers.getBytesAs_${var_type}(array, index, ByteOrder.BIG_ENDIAN)',
309*795d594fSAndroid Build Coastguard Worker                                                     may_throw_read_only = False)
310*795d594fSAndroid Build Coastguard Worker
311*795d594fSAndroid Build Coastguard WorkerDIRECT_BYTE_BUFFER_LE_VIEW_VAR_HANDLE = VarHandleKind("DirectByteBufferViewLE",
312*795d594fSAndroid Build Coastguard Worker                                                      VIEW_SUPPORTED_TYPES,
313*795d594fSAndroid Build Coastguard Worker                                                      [
314*795d594fSAndroid Build Coastguard Worker                                                          'java.lang.invoke.MethodHandles',
315*795d594fSAndroid Build Coastguard Worker                                                          'java.lang.invoke.VarHandle',
316*795d594fSAndroid Build Coastguard Worker                                                          'java.nio.ByteBuffer',
317*795d594fSAndroid Build Coastguard Worker                                                          'java.nio.ByteOrder'
318*795d594fSAndroid Build Coastguard Worker                                                      ],
319*795d594fSAndroid Build Coastguard Worker                                                      [
320*795d594fSAndroid Build Coastguard Worker                                                          "ByteBuffer bb = ByteBuffer.allocateDirect(31)",
321*795d594fSAndroid Build Coastguard Worker                                                          "int index = 8",
322*795d594fSAndroid Build Coastguard Worker                                                          "{"
323*795d594fSAndroid Build Coastguard Worker                                                          "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(bb, index);"
324*795d594fSAndroid Build Coastguard Worker                                                          "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(bb, index, ${initial_value}, ByteOrder.LITTLE_ENDIAN);"
325*795d594fSAndroid Build Coastguard Worker                                                          "}"
326*795d594fSAndroid Build Coastguard Worker                                                      ],
327*795d594fSAndroid Build Coastguard Worker                                                      'MethodHandles.byteBufferViewVarHandle(${var_type}[].class, ByteOrder.LITTLE_ENDIAN)',
328*795d594fSAndroid Build Coastguard Worker                                                      [
329*795d594fSAndroid Build Coastguard Worker                                                          'bb',
330*795d594fSAndroid Build Coastguard Worker                                                          'index'
331*795d594fSAndroid Build Coastguard Worker                                                      ],
332*795d594fSAndroid Build Coastguard Worker                                                      'VarHandleUnitTestHelpers.getBytesAs_${var_type}(bb, index, ByteOrder.LITTLE_ENDIAN)',
333*795d594fSAndroid Build Coastguard Worker                                                      may_throw_read_only = False)
334*795d594fSAndroid Build Coastguard Worker
335*795d594fSAndroid Build Coastguard WorkerNARROW_DIRECT_BYTE_BUFFER_LE_VIEW_VAR_HANDLE = VarHandleKind("NarrowDirectByteBufferViewLE",
336*795d594fSAndroid Build Coastguard Worker                                                             VIEW_SUPPORTED_NARROW_TYPES,
337*795d594fSAndroid Build Coastguard Worker                                                             [
338*795d594fSAndroid Build Coastguard Worker                                                                 'java.lang.invoke.MethodHandles',
339*795d594fSAndroid Build Coastguard Worker                                                                 'java.lang.invoke.VarHandle',
340*795d594fSAndroid Build Coastguard Worker                                                                 'java.nio.ByteBuffer',
341*795d594fSAndroid Build Coastguard Worker                                                                 'java.nio.ByteOrder'
342*795d594fSAndroid Build Coastguard Worker                                                             ],
343*795d594fSAndroid Build Coastguard Worker                                                             [
344*795d594fSAndroid Build Coastguard Worker                                                                 "ByteBuffer bb = ByteBuffer.allocateDirect(31)",
345*795d594fSAndroid Build Coastguard Worker                                                                 "int index = 10",
346*795d594fSAndroid Build Coastguard Worker                                                                 "{"
347*795d594fSAndroid Build Coastguard Worker                                                                 "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(bb, index);"
348*795d594fSAndroid Build Coastguard Worker                                                                 "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(bb, index, ${initial_value}, ByteOrder.LITTLE_ENDIAN);"
349*795d594fSAndroid Build Coastguard Worker                                                                 "}"
350*795d594fSAndroid Build Coastguard Worker                                                             ],
351*795d594fSAndroid Build Coastguard Worker                                                             'MethodHandles.byteBufferViewVarHandle(${var_type}[].class, ByteOrder.LITTLE_ENDIAN)',
352*795d594fSAndroid Build Coastguard Worker                                                             [
353*795d594fSAndroid Build Coastguard Worker                                                                 'bb',
354*795d594fSAndroid Build Coastguard Worker                                                                 'index'
355*795d594fSAndroid Build Coastguard Worker                                                             ],
356*795d594fSAndroid Build Coastguard Worker                                                             'VarHandleUnitTestHelpers.getBytesAs_${var_type}(bb, index, ByteOrder.LITTLE_ENDIAN)',
357*795d594fSAndroid Build Coastguard Worker                                                             may_throw_read_only = False)
358*795d594fSAndroid Build Coastguard Worker
359*795d594fSAndroid Build Coastguard WorkerDIRECT_BYTE_BUFFER_BE_VIEW_VAR_HANDLE = VarHandleKind("DirectByteBufferViewBE",
360*795d594fSAndroid Build Coastguard Worker                                                      VIEW_SUPPORTED_TYPES,
361*795d594fSAndroid Build Coastguard Worker                                                      [
362*795d594fSAndroid Build Coastguard Worker                                                          'java.lang.invoke.MethodHandles',
363*795d594fSAndroid Build Coastguard Worker                                                          'java.lang.invoke.VarHandle',
364*795d594fSAndroid Build Coastguard Worker                                                          'java.nio.ByteBuffer',
365*795d594fSAndroid Build Coastguard Worker                                                          'java.nio.ByteOrder'
366*795d594fSAndroid Build Coastguard Worker                                                      ],
367*795d594fSAndroid Build Coastguard Worker                                                      [
368*795d594fSAndroid Build Coastguard Worker                                                          "ByteBuffer bb = ByteBuffer.allocateDirect(31)",
369*795d594fSAndroid Build Coastguard Worker                                                          "int index = 8",
370*795d594fSAndroid Build Coastguard Worker                                                          "{"
371*795d594fSAndroid Build Coastguard Worker                                                          "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(bb, index);"
372*795d594fSAndroid Build Coastguard Worker                                                          "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(bb, index, ${initial_value}, ByteOrder.BIG_ENDIAN);"
373*795d594fSAndroid Build Coastguard Worker                                                          "}"
374*795d594fSAndroid Build Coastguard Worker                                                      ],
375*795d594fSAndroid Build Coastguard Worker                                                      'MethodHandles.byteBufferViewVarHandle(${var_type}[].class, ByteOrder.BIG_ENDIAN)',
376*795d594fSAndroid Build Coastguard Worker                                                      [
377*795d594fSAndroid Build Coastguard Worker                                                          'bb',
378*795d594fSAndroid Build Coastguard Worker                                                          'index'
379*795d594fSAndroid Build Coastguard Worker                                                      ],
380*795d594fSAndroid Build Coastguard Worker                                                      'VarHandleUnitTestHelpers.getBytesAs_${var_type}(bb, index, ByteOrder.BIG_ENDIAN)',
381*795d594fSAndroid Build Coastguard Worker                                                      may_throw_read_only = False)
382*795d594fSAndroid Build Coastguard Worker
383*795d594fSAndroid Build Coastguard WorkerNARROW_DIRECT_BYTE_BUFFER_BE_VIEW_VAR_HANDLE = VarHandleKind("NarrowDirectByteBufferViewBE",
384*795d594fSAndroid Build Coastguard Worker                                                             VIEW_SUPPORTED_NARROW_TYPES,
385*795d594fSAndroid Build Coastguard Worker                                                             [
386*795d594fSAndroid Build Coastguard Worker                                                                 'java.lang.invoke.MethodHandles',
387*795d594fSAndroid Build Coastguard Worker                                                                 'java.lang.invoke.VarHandle',
388*795d594fSAndroid Build Coastguard Worker                                                                 'java.nio.ByteBuffer',
389*795d594fSAndroid Build Coastguard Worker                                                                 'java.nio.ByteOrder'
390*795d594fSAndroid Build Coastguard Worker                                                             ],
391*795d594fSAndroid Build Coastguard Worker                                                             [
392*795d594fSAndroid Build Coastguard Worker                                                                 "ByteBuffer bb = ByteBuffer.allocateDirect(31)",
393*795d594fSAndroid Build Coastguard Worker                                                                 "int index = 10",
394*795d594fSAndroid Build Coastguard Worker                                                                 "{"
395*795d594fSAndroid Build Coastguard Worker                                                                 "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(bb, index);"
396*795d594fSAndroid Build Coastguard Worker                                                                 "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(bb, index, ${initial_value}, ByteOrder.BIG_ENDIAN);"
397*795d594fSAndroid Build Coastguard Worker                                                                 "}"
398*795d594fSAndroid Build Coastguard Worker                                                             ],
399*795d594fSAndroid Build Coastguard Worker                                                             'MethodHandles.byteBufferViewVarHandle(${var_type}[].class, ByteOrder.BIG_ENDIAN)',
400*795d594fSAndroid Build Coastguard Worker                                                             [
401*795d594fSAndroid Build Coastguard Worker                                                                 'bb',
402*795d594fSAndroid Build Coastguard Worker                                                                 'index'
403*795d594fSAndroid Build Coastguard Worker                                                             ],
404*795d594fSAndroid Build Coastguard Worker                                                             'VarHandleUnitTestHelpers.getBytesAs_${var_type}(bb, index, ByteOrder.BIG_ENDIAN)',
405*795d594fSAndroid Build Coastguard Worker                                                             may_throw_read_only = False)
406*795d594fSAndroid Build Coastguard Worker
407*795d594fSAndroid Build Coastguard WorkerHEAP_BYTE_BUFFER_LE_VIEW_VAR_HANDLE = VarHandleKind("HeapByteBufferViewLE",
408*795d594fSAndroid Build Coastguard Worker                                                    VIEW_SUPPORTED_TYPES,
409*795d594fSAndroid Build Coastguard Worker                                                    [
410*795d594fSAndroid Build Coastguard Worker                                                        'java.lang.invoke.MethodHandles',
411*795d594fSAndroid Build Coastguard Worker                                                        'java.lang.invoke.VarHandle',
412*795d594fSAndroid Build Coastguard Worker                                                        'java.nio.ByteBuffer',
413*795d594fSAndroid Build Coastguard Worker                                                        'java.nio.ByteOrder'
414*795d594fSAndroid Build Coastguard Worker                                                    ],
415*795d594fSAndroid Build Coastguard Worker                                                    [
416*795d594fSAndroid Build Coastguard Worker                                                        "byte[] array = VarHandleUnitTestHelpers.createFilledByteArray(36)",
417*795d594fSAndroid Build Coastguard Worker                                                        "int offset = 8",
418*795d594fSAndroid Build Coastguard Worker                                                        "ByteBuffer bb = ByteBuffer.wrap(array, offset, array.length - offset)",
419*795d594fSAndroid Build Coastguard Worker                                                        "int index = 8",
420*795d594fSAndroid Build Coastguard Worker                                                        "{"
421*795d594fSAndroid Build Coastguard Worker                                                        "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(bb, index);"
422*795d594fSAndroid Build Coastguard Worker                                                        "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(bb, index, ${initial_value}, ByteOrder.LITTLE_ENDIAN);"
423*795d594fSAndroid Build Coastguard Worker                                                        "}"
424*795d594fSAndroid Build Coastguard Worker                                                    ],
425*795d594fSAndroid Build Coastguard Worker                                                    'MethodHandles.byteBufferViewVarHandle(${var_type}[].class, ByteOrder.LITTLE_ENDIAN)',
426*795d594fSAndroid Build Coastguard Worker                                                    [
427*795d594fSAndroid Build Coastguard Worker                                                        'bb',
428*795d594fSAndroid Build Coastguard Worker                                                        'index'
429*795d594fSAndroid Build Coastguard Worker                                                    ],
430*795d594fSAndroid Build Coastguard Worker                                                    'VarHandleUnitTestHelpers.getBytesAs_${var_type}(bb, index, ByteOrder.LITTLE_ENDIAN)',
431*795d594fSAndroid Build Coastguard Worker                                                    may_throw_read_only = False)
432*795d594fSAndroid Build Coastguard Worker
433*795d594fSAndroid Build Coastguard WorkerNARROW_HEAP_BYTE_BUFFER_LE_VIEW_VAR_HANDLE = VarHandleKind("NarrowHeapByteBufferViewLE",
434*795d594fSAndroid Build Coastguard Worker                                                           VIEW_SUPPORTED_NARROW_TYPES,
435*795d594fSAndroid Build Coastguard Worker                                                           [
436*795d594fSAndroid Build Coastguard Worker                                                               'java.lang.invoke.MethodHandles',
437*795d594fSAndroid Build Coastguard Worker                                                               'java.lang.invoke.VarHandle',
438*795d594fSAndroid Build Coastguard Worker                                                               'java.nio.ByteBuffer',
439*795d594fSAndroid Build Coastguard Worker                                                               'java.nio.ByteOrder'
440*795d594fSAndroid Build Coastguard Worker                                                           ],
441*795d594fSAndroid Build Coastguard Worker                                                           [
442*795d594fSAndroid Build Coastguard Worker                                                               "byte[] array = VarHandleUnitTestHelpers.createFilledByteArray(36)",
443*795d594fSAndroid Build Coastguard Worker                                                               "int offset = 8",
444*795d594fSAndroid Build Coastguard Worker                                                               "ByteBuffer bb = ByteBuffer.wrap(array, offset, array.length - offset)",
445*795d594fSAndroid Build Coastguard Worker                                                               "int index = 10",
446*795d594fSAndroid Build Coastguard Worker                                                               "{"
447*795d594fSAndroid Build Coastguard Worker                                                               "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(bb, index);"
448*795d594fSAndroid Build Coastguard Worker                                                               "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(bb, index, ${initial_value}, ByteOrder.LITTLE_ENDIAN);"
449*795d594fSAndroid Build Coastguard Worker                                                               "}"
450*795d594fSAndroid Build Coastguard Worker                                                           ],
451*795d594fSAndroid Build Coastguard Worker                                                           'MethodHandles.byteBufferViewVarHandle(${var_type}[].class, ByteOrder.LITTLE_ENDIAN)',
452*795d594fSAndroid Build Coastguard Worker                                                           [
453*795d594fSAndroid Build Coastguard Worker                                                               'bb',
454*795d594fSAndroid Build Coastguard Worker                                                               'index'
455*795d594fSAndroid Build Coastguard Worker                                                           ],
456*795d594fSAndroid Build Coastguard Worker                                                           'VarHandleUnitTestHelpers.getBytesAs_${var_type}(bb, index, ByteOrder.LITTLE_ENDIAN)',
457*795d594fSAndroid Build Coastguard Worker                                                           may_throw_read_only = False)
458*795d594fSAndroid Build Coastguard Worker
459*795d594fSAndroid Build Coastguard WorkerHEAP_BYTE_BUFFER_BE_VIEW_VAR_HANDLE = VarHandleKind("HeapByteBufferViewBE",
460*795d594fSAndroid Build Coastguard Worker                                                    VIEW_SUPPORTED_TYPES,
461*795d594fSAndroid Build Coastguard Worker                                                    [
462*795d594fSAndroid Build Coastguard Worker                                                        'java.lang.invoke.MethodHandles',
463*795d594fSAndroid Build Coastguard Worker                                                        'java.lang.invoke.VarHandle',
464*795d594fSAndroid Build Coastguard Worker                                                        'java.nio.ByteBuffer',
465*795d594fSAndroid Build Coastguard Worker                                                        'java.nio.ByteOrder'
466*795d594fSAndroid Build Coastguard Worker                                                    ],
467*795d594fSAndroid Build Coastguard Worker                                                    [
468*795d594fSAndroid Build Coastguard Worker                                                        "byte[] array = VarHandleUnitTestHelpers.createFilledByteArray(47)",
469*795d594fSAndroid Build Coastguard Worker                                                        "int offset = 8",
470*795d594fSAndroid Build Coastguard Worker                                                        "ByteBuffer bb = ByteBuffer.wrap(array, offset, array.length - offset)",
471*795d594fSAndroid Build Coastguard Worker                                                        "int index = 8",
472*795d594fSAndroid Build Coastguard Worker                                                        "{"
473*795d594fSAndroid Build Coastguard Worker                                                        "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(bb, index);"
474*795d594fSAndroid Build Coastguard Worker                                                        "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(bb, index, ${initial_value}, ByteOrder.BIG_ENDIAN);"
475*795d594fSAndroid Build Coastguard Worker                                                        "}"
476*795d594fSAndroid Build Coastguard Worker                                                    ],
477*795d594fSAndroid Build Coastguard Worker                                                    'MethodHandles.byteBufferViewVarHandle(${var_type}[].class, ByteOrder.BIG_ENDIAN)',
478*795d594fSAndroid Build Coastguard Worker                                                    [
479*795d594fSAndroid Build Coastguard Worker                                                        'bb',
480*795d594fSAndroid Build Coastguard Worker                                                        'index'
481*795d594fSAndroid Build Coastguard Worker                                                    ],
482*795d594fSAndroid Build Coastguard Worker                                                    'VarHandleUnitTestHelpers.getBytesAs_${var_type}(bb, index, ByteOrder.BIG_ENDIAN)',
483*795d594fSAndroid Build Coastguard Worker                                                    may_throw_read_only = False)
484*795d594fSAndroid Build Coastguard Worker
485*795d594fSAndroid Build Coastguard WorkerNARROW_HEAP_BYTE_BUFFER_BE_VIEW_VAR_HANDLE = VarHandleKind("NarrowHeapByteBufferViewBE",
486*795d594fSAndroid Build Coastguard Worker                                                           VIEW_SUPPORTED_NARROW_TYPES,
487*795d594fSAndroid Build Coastguard Worker                                                           [
488*795d594fSAndroid Build Coastguard Worker                                                               'java.lang.invoke.MethodHandles',
489*795d594fSAndroid Build Coastguard Worker                                                               'java.lang.invoke.VarHandle',
490*795d594fSAndroid Build Coastguard Worker                                                               'java.nio.ByteBuffer',
491*795d594fSAndroid Build Coastguard Worker                                                               'java.nio.ByteOrder'
492*795d594fSAndroid Build Coastguard Worker                                                           ],
493*795d594fSAndroid Build Coastguard Worker                                                           [
494*795d594fSAndroid Build Coastguard Worker                                                               "byte[] array = VarHandleUnitTestHelpers.createFilledByteArray(47)",
495*795d594fSAndroid Build Coastguard Worker                                                               "int offset = 8",
496*795d594fSAndroid Build Coastguard Worker                                                               "ByteBuffer bb = ByteBuffer.wrap(array, offset, array.length - offset)",
497*795d594fSAndroid Build Coastguard Worker                                                               "int index = 10",
498*795d594fSAndroid Build Coastguard Worker                                                               "{"
499*795d594fSAndroid Build Coastguard Worker                                                               "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(bb, index);"
500*795d594fSAndroid Build Coastguard Worker                                                               "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(bb, index, ${initial_value}, ByteOrder.BIG_ENDIAN);"
501*795d594fSAndroid Build Coastguard Worker                                                               "}"
502*795d594fSAndroid Build Coastguard Worker                                                           ],
503*795d594fSAndroid Build Coastguard Worker                                                           'MethodHandles.byteBufferViewVarHandle(${var_type}[].class, ByteOrder.BIG_ENDIAN)',
504*795d594fSAndroid Build Coastguard Worker                                                           [
505*795d594fSAndroid Build Coastguard Worker                                                               'bb',
506*795d594fSAndroid Build Coastguard Worker                                                               'index'
507*795d594fSAndroid Build Coastguard Worker                                                           ],
508*795d594fSAndroid Build Coastguard Worker                                                           'VarHandleUnitTestHelpers.getBytesAs_${var_type}(bb, index, ByteOrder.BIG_ENDIAN)',
509*795d594fSAndroid Build Coastguard Worker                                                           may_throw_read_only = False)
510*795d594fSAndroid Build Coastguard Worker
511*795d594fSAndroid Build Coastguard WorkerHEAP_BYTE_BUFFER_RO_LE_VIEW_VAR_HANDLE = VarHandleKind("HeapByteBufferReadOnlyViewLE",
512*795d594fSAndroid Build Coastguard Worker                                                       VIEW_SUPPORTED_TYPES,
513*795d594fSAndroid Build Coastguard Worker                                                       [
514*795d594fSAndroid Build Coastguard Worker                                                           'java.lang.invoke.MethodHandles',
515*795d594fSAndroid Build Coastguard Worker                                                           'java.lang.invoke.VarHandle',
516*795d594fSAndroid Build Coastguard Worker                                                           'java.nio.ByteBuffer',
517*795d594fSAndroid Build Coastguard Worker                                                           'java.nio.ByteOrder',
518*795d594fSAndroid Build Coastguard Worker                                                           'java.nio.ReadOnlyBufferException'
519*795d594fSAndroid Build Coastguard Worker                                                       ],
520*795d594fSAndroid Build Coastguard Worker                                                       [
521*795d594fSAndroid Build Coastguard Worker                                                           "byte[] array = VarHandleUnitTestHelpers.createFilledByteArray(43)",
522*795d594fSAndroid Build Coastguard Worker                                                           "int index = 8",
523*795d594fSAndroid Build Coastguard Worker                                                           "ByteBuffer bb",
524*795d594fSAndroid Build Coastguard Worker                                                           "{"
525*795d594fSAndroid Build Coastguard Worker                                                           "  bb = ByteBuffer.wrap(array).asReadOnlyBuffer();"
526*795d594fSAndroid Build Coastguard Worker                                                           "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(bb, index);"
527*795d594fSAndroid Build Coastguard Worker                                                           "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(array, index, ${initial_value}, ByteOrder.LITTLE_ENDIAN);"
528*795d594fSAndroid Build Coastguard Worker                                                           "  bb = bb.asReadOnlyBuffer();"
529*795d594fSAndroid Build Coastguard Worker                                                           "}"
530*795d594fSAndroid Build Coastguard Worker                                                       ],
531*795d594fSAndroid Build Coastguard Worker                                                       'MethodHandles.byteBufferViewVarHandle(${var_type}[].class, ByteOrder.LITTLE_ENDIAN)',
532*795d594fSAndroid Build Coastguard Worker                                                       [
533*795d594fSAndroid Build Coastguard Worker                                                           'bb',
534*795d594fSAndroid Build Coastguard Worker                                                           'index'
535*795d594fSAndroid Build Coastguard Worker                                                       ],
536*795d594fSAndroid Build Coastguard Worker                                                       'VarHandleUnitTestHelpers.getBytesAs_${var_type}(bb, index, ByteOrder.LITTLE_ENDIAN)',
537*795d594fSAndroid Build Coastguard Worker                                                       may_throw_read_only = True)
538*795d594fSAndroid Build Coastguard Worker
539*795d594fSAndroid Build Coastguard WorkerNARROW_HEAP_BYTE_BUFFER_RO_LE_VIEW_VAR_HANDLE = VarHandleKind("NarrowHeapByteBufferReadOnlyViewLE",
540*795d594fSAndroid Build Coastguard Worker                                                              VIEW_SUPPORTED_NARROW_TYPES,
541*795d594fSAndroid Build Coastguard Worker                                                              [
542*795d594fSAndroid Build Coastguard Worker                                                                  'java.lang.invoke.MethodHandles',
543*795d594fSAndroid Build Coastguard Worker                                                                  'java.lang.invoke.VarHandle',
544*795d594fSAndroid Build Coastguard Worker                                                                  'java.nio.ByteBuffer',
545*795d594fSAndroid Build Coastguard Worker                                                                  'java.nio.ByteOrder',
546*795d594fSAndroid Build Coastguard Worker                                                                  'java.nio.ReadOnlyBufferException'
547*795d594fSAndroid Build Coastguard Worker                                                              ],
548*795d594fSAndroid Build Coastguard Worker                                                              [
549*795d594fSAndroid Build Coastguard Worker                                                                  "byte[] array = VarHandleUnitTestHelpers.createFilledByteArray(43)",
550*795d594fSAndroid Build Coastguard Worker                                                                  "int index = 10",
551*795d594fSAndroid Build Coastguard Worker                                                                  "ByteBuffer bb",
552*795d594fSAndroid Build Coastguard Worker                                                                  "{"
553*795d594fSAndroid Build Coastguard Worker                                                                  "  bb = ByteBuffer.wrap(array).asReadOnlyBuffer();"
554*795d594fSAndroid Build Coastguard Worker                                                                  "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(bb, index);"
555*795d594fSAndroid Build Coastguard Worker                                                                  "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(array, index, ${initial_value}, ByteOrder.LITTLE_ENDIAN);"
556*795d594fSAndroid Build Coastguard Worker                                                                  "  bb = bb.asReadOnlyBuffer();"
557*795d594fSAndroid Build Coastguard Worker                                                                  "}"
558*795d594fSAndroid Build Coastguard Worker                                                              ],
559*795d594fSAndroid Build Coastguard Worker                                                              'MethodHandles.byteBufferViewVarHandle(${var_type}[].class, ByteOrder.LITTLE_ENDIAN)',
560*795d594fSAndroid Build Coastguard Worker                                                              [
561*795d594fSAndroid Build Coastguard Worker                                                                  'bb',
562*795d594fSAndroid Build Coastguard Worker                                                                  'index'
563*795d594fSAndroid Build Coastguard Worker                                                              ],
564*795d594fSAndroid Build Coastguard Worker                                                              'VarHandleUnitTestHelpers.getBytesAs_${var_type}(bb, index, ByteOrder.LITTLE_ENDIAN)',
565*795d594fSAndroid Build Coastguard Worker                                                              may_throw_read_only = True)
566*795d594fSAndroid Build Coastguard Worker
567*795d594fSAndroid Build Coastguard WorkerHEAP_BYTE_BUFFER_RO_BE_VIEW_VAR_HANDLE = VarHandleKind("HeapByteBufferReadOnlyViewBE",
568*795d594fSAndroid Build Coastguard Worker                                                       VIEW_SUPPORTED_TYPES,
569*795d594fSAndroid Build Coastguard Worker                                                       [
570*795d594fSAndroid Build Coastguard Worker                                                           'java.lang.invoke.MethodHandles',
571*795d594fSAndroid Build Coastguard Worker                                                           'java.lang.invoke.VarHandle',
572*795d594fSAndroid Build Coastguard Worker                                                           'java.nio.ByteBuffer',
573*795d594fSAndroid Build Coastguard Worker                                                           'java.nio.ByteOrder',
574*795d594fSAndroid Build Coastguard Worker                                                           'java.nio.ReadOnlyBufferException'
575*795d594fSAndroid Build Coastguard Worker                                                       ],
576*795d594fSAndroid Build Coastguard Worker                                                       [
577*795d594fSAndroid Build Coastguard Worker                                                           "byte[] array = VarHandleUnitTestHelpers.createFilledByteArray(29)",
578*795d594fSAndroid Build Coastguard Worker                                                           "int index = 8",
579*795d594fSAndroid Build Coastguard Worker                                                           "ByteBuffer bb",
580*795d594fSAndroid Build Coastguard Worker                                                           "{"
581*795d594fSAndroid Build Coastguard Worker                                                           "  bb = ByteBuffer.wrap(array);"
582*795d594fSAndroid Build Coastguard Worker                                                           "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(bb, index);"
583*795d594fSAndroid Build Coastguard Worker                                                           "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(array, index, ${initial_value}, ByteOrder.BIG_ENDIAN);"
584*795d594fSAndroid Build Coastguard Worker                                                           "  bb = bb.asReadOnlyBuffer();"
585*795d594fSAndroid Build Coastguard Worker                                                           "}"
586*795d594fSAndroid Build Coastguard Worker                                                       ],
587*795d594fSAndroid Build Coastguard Worker                                                       'MethodHandles.byteBufferViewVarHandle(${var_type}[].class, ByteOrder.BIG_ENDIAN)',
588*795d594fSAndroid Build Coastguard Worker                                                       [
589*795d594fSAndroid Build Coastguard Worker                                                           'bb',
590*795d594fSAndroid Build Coastguard Worker                                                           'index'
591*795d594fSAndroid Build Coastguard Worker                                                       ],
592*795d594fSAndroid Build Coastguard Worker                                                       'VarHandleUnitTestHelpers.getBytesAs_${var_type}(bb, index, ByteOrder.BIG_ENDIAN)',
593*795d594fSAndroid Build Coastguard Worker                                                       may_throw_read_only = True)
594*795d594fSAndroid Build Coastguard Worker
595*795d594fSAndroid Build Coastguard WorkerNARROW_HEAP_BYTE_BUFFER_RO_BE_VIEW_VAR_HANDLE = VarHandleKind("NarrowHeapByteBufferReadOnlyViewBE",
596*795d594fSAndroid Build Coastguard Worker                                                              VIEW_SUPPORTED_NARROW_TYPES,
597*795d594fSAndroid Build Coastguard Worker                                                              [
598*795d594fSAndroid Build Coastguard Worker                                                                  'java.lang.invoke.MethodHandles',
599*795d594fSAndroid Build Coastguard Worker                                                                  'java.lang.invoke.VarHandle',
600*795d594fSAndroid Build Coastguard Worker                                                                  'java.nio.ByteBuffer',
601*795d594fSAndroid Build Coastguard Worker                                                                  'java.nio.ByteOrder',
602*795d594fSAndroid Build Coastguard Worker                                                                  'java.nio.ReadOnlyBufferException'
603*795d594fSAndroid Build Coastguard Worker                                                              ],
604*795d594fSAndroid Build Coastguard Worker                                                              [
605*795d594fSAndroid Build Coastguard Worker                                                                  "byte[] array = VarHandleUnitTestHelpers.createFilledByteArray(29)",
606*795d594fSAndroid Build Coastguard Worker                                                                  "int index = 10",
607*795d594fSAndroid Build Coastguard Worker                                                                  "ByteBuffer bb",
608*795d594fSAndroid Build Coastguard Worker                                                                  "{"
609*795d594fSAndroid Build Coastguard Worker                                                                  "  bb = ByteBuffer.wrap(array);"
610*795d594fSAndroid Build Coastguard Worker                                                                  "  index = VarHandleUnitTestHelpers.alignedOffset_${var_type}(bb, index);"
611*795d594fSAndroid Build Coastguard Worker                                                                  "  VarHandleUnitTestHelpers.setBytesAs_${var_type}(array, index, ${initial_value}, ByteOrder.BIG_ENDIAN);"
612*795d594fSAndroid Build Coastguard Worker                                                                  "  bb = bb.asReadOnlyBuffer();"
613*795d594fSAndroid Build Coastguard Worker                                                                  "}"
614*795d594fSAndroid Build Coastguard Worker                                                              ],
615*795d594fSAndroid Build Coastguard Worker                                                              'MethodHandles.byteBufferViewVarHandle(${var_type}[].class, ByteOrder.BIG_ENDIAN)',
616*795d594fSAndroid Build Coastguard Worker                                                              [
617*795d594fSAndroid Build Coastguard Worker                                                                  'bb',
618*795d594fSAndroid Build Coastguard Worker                                                                  'index'
619*795d594fSAndroid Build Coastguard Worker                                                              ],
620*795d594fSAndroid Build Coastguard Worker                                                              'VarHandleUnitTestHelpers.getBytesAs_${var_type}(bb, index, ByteOrder.BIG_ENDIAN)',
621*795d594fSAndroid Build Coastguard Worker                                                              may_throw_read_only = True)
622*795d594fSAndroid Build Coastguard Worker
623*795d594fSAndroid Build Coastguard WorkerALL_FIELD_VAR_HANDLE_KINDS = [
624*795d594fSAndroid Build Coastguard Worker    FIELD_VAR_HANDLE,
625*795d594fSAndroid Build Coastguard Worker    FINAL_FIELD_VAR_HANDLE,
626*795d594fSAndroid Build Coastguard Worker    STATIC_FIELD_VAR_HANDLE,
627*795d594fSAndroid Build Coastguard Worker    STATIC_FINAL_FIELD_VAR_HANDLE
628*795d594fSAndroid Build Coastguard Worker]
629*795d594fSAndroid Build Coastguard Worker
630*795d594fSAndroid Build Coastguard WorkerALL_BYTE_VIEW_VAR_HANDLE_KINDS = [
631*795d594fSAndroid Build Coastguard Worker    BYTE_ARRAY_LE_VIEW_VAR_HANDLE,
632*795d594fSAndroid Build Coastguard Worker    NARROW_BYTE_ARRAY_LE_VIEW_VAR_HANDLE,
633*795d594fSAndroid Build Coastguard Worker    BYTE_ARRAY_BE_VIEW_VAR_HANDLE,
634*795d594fSAndroid Build Coastguard Worker    NARROW_BYTE_ARRAY_BE_VIEW_VAR_HANDLE,
635*795d594fSAndroid Build Coastguard Worker    DIRECT_BYTE_BUFFER_LE_VIEW_VAR_HANDLE,
636*795d594fSAndroid Build Coastguard Worker    NARROW_DIRECT_BYTE_BUFFER_LE_VIEW_VAR_HANDLE,
637*795d594fSAndroid Build Coastguard Worker    DIRECT_BYTE_BUFFER_BE_VIEW_VAR_HANDLE,
638*795d594fSAndroid Build Coastguard Worker    NARROW_DIRECT_BYTE_BUFFER_BE_VIEW_VAR_HANDLE,
639*795d594fSAndroid Build Coastguard Worker    HEAP_BYTE_BUFFER_LE_VIEW_VAR_HANDLE,
640*795d594fSAndroid Build Coastguard Worker    NARROW_HEAP_BYTE_BUFFER_LE_VIEW_VAR_HANDLE,
641*795d594fSAndroid Build Coastguard Worker    HEAP_BYTE_BUFFER_BE_VIEW_VAR_HANDLE,
642*795d594fSAndroid Build Coastguard Worker    NARROW_HEAP_BYTE_BUFFER_BE_VIEW_VAR_HANDLE,
643*795d594fSAndroid Build Coastguard Worker    HEAP_BYTE_BUFFER_RO_LE_VIEW_VAR_HANDLE,
644*795d594fSAndroid Build Coastguard Worker    NARROW_HEAP_BYTE_BUFFER_RO_LE_VIEW_VAR_HANDLE,
645*795d594fSAndroid Build Coastguard Worker    HEAP_BYTE_BUFFER_RO_BE_VIEW_VAR_HANDLE,
646*795d594fSAndroid Build Coastguard Worker    NARROW_HEAP_BYTE_BUFFER_RO_BE_VIEW_VAR_HANDLE
647*795d594fSAndroid Build Coastguard Worker]
648*795d594fSAndroid Build Coastguard Worker
649*795d594fSAndroid Build Coastguard WorkerALL_VAR_HANDLE_KINDS = ALL_FIELD_VAR_HANDLE_KINDS + [ ARRAY_ELEMENT_VAR_HANDLE ] + ALL_BYTE_VIEW_VAR_HANDLE_KINDS
650*795d594fSAndroid Build Coastguard Worker
651*795d594fSAndroid Build Coastguard Workerclass AccessModeForm(Enum):
652*795d594fSAndroid Build Coastguard Worker    GET = 0
653*795d594fSAndroid Build Coastguard Worker    SET = 1
654*795d594fSAndroid Build Coastguard Worker    STRONG_COMPARE_AND_SET = 2
655*795d594fSAndroid Build Coastguard Worker    WEAK_COMPARE_AND_SET = 3
656*795d594fSAndroid Build Coastguard Worker    COMPARE_AND_EXCHANGE = 4
657*795d594fSAndroid Build Coastguard Worker    GET_AND_SET = 5
658*795d594fSAndroid Build Coastguard Worker    GET_AND_UPDATE_BITWISE = 6
659*795d594fSAndroid Build Coastguard Worker    GET_AND_UPDATE_NUMERIC = 7
660*795d594fSAndroid Build Coastguard Worker
661*795d594fSAndroid Build Coastguard Workerclass VarHandleAccessor:
662*795d594fSAndroid Build Coastguard Worker    def __init__(self, method_name):
663*795d594fSAndroid Build Coastguard Worker        self.method_name = method_name
664*795d594fSAndroid Build Coastguard Worker        self.access_mode = self.get_access_mode(method_name)
665*795d594fSAndroid Build Coastguard Worker        self.access_mode_form = self.get_access_mode_form(method_name)
666*795d594fSAndroid Build Coastguard Worker
667*795d594fSAndroid Build Coastguard Worker    def get_return_type(self, var_type):
668*795d594fSAndroid Build Coastguard Worker        if self.access_mode_form == AccessModeForm.SET:
669*795d594fSAndroid Build Coastguard Worker            return None
670*795d594fSAndroid Build Coastguard Worker        elif (self.access_mode_form == AccessModeForm.STRONG_COMPARE_AND_SET or
671*795d594fSAndroid Build Coastguard Worker              self.access_mode_form == AccessModeForm.WEAK_COMPARE_AND_SET):
672*795d594fSAndroid Build Coastguard Worker            return BOOLEAN_TYPE
673*795d594fSAndroid Build Coastguard Worker        else:
674*795d594fSAndroid Build Coastguard Worker            return var_type
675*795d594fSAndroid Build Coastguard Worker
676*795d594fSAndroid Build Coastguard Worker    def get_number_of_var_type_arguments(self):
677*795d594fSAndroid Build Coastguard Worker        if self.access_mode_form == AccessModeForm.GET:
678*795d594fSAndroid Build Coastguard Worker            return 0
679*795d594fSAndroid Build Coastguard Worker        elif (self.access_mode_form == AccessModeForm.SET or
680*795d594fSAndroid Build Coastguard Worker              self.access_mode_form == AccessModeForm.GET_AND_SET or
681*795d594fSAndroid Build Coastguard Worker              self.access_mode_form == AccessModeForm.GET_AND_UPDATE_BITWISE or
682*795d594fSAndroid Build Coastguard Worker              self.access_mode_form == AccessModeForm.GET_AND_UPDATE_NUMERIC):
683*795d594fSAndroid Build Coastguard Worker            return 1
684*795d594fSAndroid Build Coastguard Worker        elif (self.access_mode_form == AccessModeForm.STRONG_COMPARE_AND_SET or
685*795d594fSAndroid Build Coastguard Worker              self.access_mode_form == AccessModeForm.WEAK_COMPARE_AND_SET or
686*795d594fSAndroid Build Coastguard Worker              self.access_mode_form == AccessModeForm.COMPARE_AND_EXCHANGE):
687*795d594fSAndroid Build Coastguard Worker            return 2
688*795d594fSAndroid Build Coastguard Worker        else:
689*795d594fSAndroid Build Coastguard Worker            raise ValueError(self.access_mode_form)
690*795d594fSAndroid Build Coastguard Worker
691*795d594fSAndroid Build Coastguard Worker    def is_read_only(self):
692*795d594fSAndroid Build Coastguard Worker        return self.access_mode_form == AccessModeForm.GET
693*795d594fSAndroid Build Coastguard Worker
694*795d594fSAndroid Build Coastguard Worker    def get_java_bitwise_operator(self):
695*795d594fSAndroid Build Coastguard Worker        if "BitwiseAnd" in self.method_name:
696*795d594fSAndroid Build Coastguard Worker            return "&"
697*795d594fSAndroid Build Coastguard Worker        elif "BitwiseOr" in self.method_name:
698*795d594fSAndroid Build Coastguard Worker            return "|"
699*795d594fSAndroid Build Coastguard Worker        elif "BitwiseXor" in self.method_name:
700*795d594fSAndroid Build Coastguard Worker            return "^"
701*795d594fSAndroid Build Coastguard Worker        raise ValueError(self.method_name)
702*795d594fSAndroid Build Coastguard Worker
703*795d594fSAndroid Build Coastguard Worker    def get_java_numeric_operator(self):
704*795d594fSAndroid Build Coastguard Worker        if "Add" in self.method_name:
705*795d594fSAndroid Build Coastguard Worker            return "+"
706*795d594fSAndroid Build Coastguard Worker        raise ValueError(self.method_name)
707*795d594fSAndroid Build Coastguard Worker
708*795d594fSAndroid Build Coastguard Worker    @staticmethod
709*795d594fSAndroid Build Coastguard Worker    def get_access_mode(accessor_method):
710*795d594fSAndroid Build Coastguard Worker        """Converts an access method name to AccessMode value. For example, getAndSet becomes GET_AND_SET"""
711*795d594fSAndroid Build Coastguard Worker        return re.sub('([A-Z])', r'_\1', accessor_method).upper()
712*795d594fSAndroid Build Coastguard Worker
713*795d594fSAndroid Build Coastguard Worker    @staticmethod
714*795d594fSAndroid Build Coastguard Worker    def get_access_mode_form(accessor_method):
715*795d594fSAndroid Build Coastguard Worker        prefix_mode_list = [
716*795d594fSAndroid Build Coastguard Worker            ('getAndAdd', AccessModeForm.GET_AND_UPDATE_NUMERIC),
717*795d594fSAndroid Build Coastguard Worker            ('getAndBitwise', AccessModeForm.GET_AND_UPDATE_BITWISE),
718*795d594fSAndroid Build Coastguard Worker            ('getAndSet', AccessModeForm.GET_AND_SET),
719*795d594fSAndroid Build Coastguard Worker            ('get', AccessModeForm.GET),
720*795d594fSAndroid Build Coastguard Worker            ('set', AccessModeForm.SET),
721*795d594fSAndroid Build Coastguard Worker            ('compareAndSet', AccessModeForm.STRONG_COMPARE_AND_SET),
722*795d594fSAndroid Build Coastguard Worker            ('weakCompareAndSet', AccessModeForm.WEAK_COMPARE_AND_SET),
723*795d594fSAndroid Build Coastguard Worker            ('compareAndExchange', AccessModeForm.COMPARE_AND_EXCHANGE)]
724*795d594fSAndroid Build Coastguard Worker        for prefix, mode in prefix_mode_list:
725*795d594fSAndroid Build Coastguard Worker            if accessor_method.startswith(prefix):
726*795d594fSAndroid Build Coastguard Worker                return mode
727*795d594fSAndroid Build Coastguard Worker        raise ValueError(accessor_method)
728*795d594fSAndroid Build Coastguard Worker
729*795d594fSAndroid Build Coastguard WorkerVAR_HANDLE_ACCESSORS = [
730*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('get'),
731*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('set'),
732*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getVolatile'),
733*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('setVolatile'),
734*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAcquire'),
735*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('setRelease'),
736*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getOpaque'),
737*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('setOpaque'),
738*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('compareAndSet'),
739*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('compareAndExchange'),
740*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('compareAndExchangeAcquire'),
741*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('compareAndExchangeRelease'),
742*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('weakCompareAndSetPlain'),
743*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('weakCompareAndSet'),
744*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('weakCompareAndSetAcquire'),
745*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('weakCompareAndSetRelease'),
746*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndSet'),
747*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndSetAcquire'),
748*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndSetRelease'),
749*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndAdd'),
750*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndAddAcquire'),
751*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndAddRelease'),
752*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndBitwiseOr'),
753*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndBitwiseOrRelease'),
754*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndBitwiseOrAcquire'),
755*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndBitwiseAnd'),
756*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndBitwiseAndRelease'),
757*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndBitwiseAndAcquire'),
758*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndBitwiseXor'),
759*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndBitwiseXorRelease'),
760*795d594fSAndroid Build Coastguard Worker    VarHandleAccessor('getAndBitwiseXorAcquire')
761*795d594fSAndroid Build Coastguard Worker]
762*795d594fSAndroid Build Coastguard Worker
763*795d594fSAndroid Build Coastguard Worker# Pseudo-RNG used for arbitrary decisions
764*795d594fSAndroid Build Coastguard WorkerRANDOM = Random(0)
765*795d594fSAndroid Build Coastguard Worker
766*795d594fSAndroid Build Coastguard WorkerBANNER = '// This file is generated by util-src/generate_java.py do not directly modify!'
767*795d594fSAndroid Build Coastguard Worker
768*795d594fSAndroid Build Coastguard Worker# List of generated test classes
769*795d594fSAndroid Build Coastguard WorkerGENERATED_TEST_CLASSES = []
770*795d594fSAndroid Build Coastguard Worker
771*795d594fSAndroid Build Coastguard Workerdef java_file_for_class(class_name):
772*795d594fSAndroid Build Coastguard Worker    return class_name + ".java"
773*795d594fSAndroid Build Coastguard Worker
774*795d594fSAndroid Build Coastguard Workerdef capitalize_first(word):
775*795d594fSAndroid Build Coastguard Worker    return word[0].upper() + word[1:]
776*795d594fSAndroid Build Coastguard Worker
777*795d594fSAndroid Build Coastguard Workerdef indent_code(code):
778*795d594fSAndroid Build Coastguard Worker    """Applies rudimentary indentation to code"""
779*795d594fSAndroid Build Coastguard Worker    return code
780*795d594fSAndroid Build Coastguard Worker
781*795d594fSAndroid Build Coastguard Workerdef build_template_dictionary(test_class, var_handle_kind, accessor, var_type):
782*795d594fSAndroid Build Coastguard Worker    initial_value = RANDOM.choice(var_type.examples)
783*795d594fSAndroid Build Coastguard Worker    updated_value = RANDOM.choice(list(filter(lambda v : v != initial_value, var_type.examples)))
784*795d594fSAndroid Build Coastguard Worker    coordinates = ", ".join(var_handle_kind.get_coordinates())
785*795d594fSAndroid Build Coastguard Worker    if accessor.get_number_of_var_type_arguments() != 0 and coordinates != "":
786*795d594fSAndroid Build Coastguard Worker        coordinates += ", "
787*795d594fSAndroid Build Coastguard Worker    dictionary = {
788*795d594fSAndroid Build Coastguard Worker        'accessor_method' : accessor.method_name,
789*795d594fSAndroid Build Coastguard Worker        'access_mode' : accessor.access_mode,
790*795d594fSAndroid Build Coastguard Worker        'banner' : BANNER,
791*795d594fSAndroid Build Coastguard Worker        'coordinates' : coordinates,
792*795d594fSAndroid Build Coastguard Worker        'initial_value' : initial_value,
793*795d594fSAndroid Build Coastguard Worker        'test_class' : test_class,
794*795d594fSAndroid Build Coastguard Worker        'updated_value' : updated_value,
795*795d594fSAndroid Build Coastguard Worker        'var_type' : var_type,
796*795d594fSAndroid Build Coastguard Worker    }
797*795d594fSAndroid Build Coastguard Worker    dictionary['imports'] = ";\n".join(list(map(lambda x: "import " + x, var_handle_kind.get_imports())))
798*795d594fSAndroid Build Coastguard Worker    dictionary['lookup'] = var_handle_kind.get_lookup(dictionary)
799*795d594fSAndroid Build Coastguard Worker    dictionary['field_declarations'] = ";\n".join(var_handle_kind.get_field_declarations(dictionary))
800*795d594fSAndroid Build Coastguard Worker    dictionary['read_value'] = var_handle_kind.get_value(dictionary)
801*795d594fSAndroid Build Coastguard Worker
802*795d594fSAndroid Build Coastguard Worker    # For indexable types we need to check out-of-bounds access at negative index.
803*795d594fSAndroid Build Coastguard Worker    # We always generate the check, but comment it out for non-indexable types.
804*795d594fSAndroid Build Coastguard Worker    dictionary['coordinates_negative_index'] = coordinates.replace('index', '-16')
805*795d594fSAndroid Build Coastguard Worker    dictionary['indexable_only'] = "//" if not re.search('Array|ByteBuffer', var_handle_kind.name) else ""
806*795d594fSAndroid Build Coastguard Worker
807*795d594fSAndroid Build Coastguard Worker    return dictionary
808*795d594fSAndroid Build Coastguard Worker
809*795d594fSAndroid Build Coastguard Workerdef emit_accessor_test(var_handle_kind, accessor, var_type, output_path):
810*795d594fSAndroid Build Coastguard Worker    test_class = var_handle_kind.get_name() + capitalize_first(accessor.method_name) + capitalize_first(var_type.name)
811*795d594fSAndroid Build Coastguard Worker    GENERATED_TEST_CLASSES.append(test_class)
812*795d594fSAndroid Build Coastguard Worker    src_file_path = output_path / java_file_for_class(test_class)
813*795d594fSAndroid Build Coastguard Worker    expansions = build_template_dictionary(test_class, var_handle_kind, accessor, var_type)
814*795d594fSAndroid Build Coastguard Worker    # Compute test operation
815*795d594fSAndroid Build Coastguard Worker    if accessor.access_mode_form == AccessModeForm.GET:
816*795d594fSAndroid Build Coastguard Worker        test_template = Template("""
817*795d594fSAndroid Build Coastguard Worker        ${var_type} value = (${var_type}) vh.${accessor_method}(${coordinates});
818*795d594fSAndroid Build Coastguard Worker        assertEquals(${initial_value}, value);
819*795d594fSAndroid Build Coastguard Worker        // Check for out of bounds access (for indexable types only).
820*795d594fSAndroid Build Coastguard Worker        ${indexable_only} try {
821*795d594fSAndroid Build Coastguard Worker        ${indexable_only}   value = (${var_type}) vh.${accessor_method}(${coordinates_negative_index});
822*795d594fSAndroid Build Coastguard Worker        ${indexable_only}   failUnreachable();
823*795d594fSAndroid Build Coastguard Worker        ${indexable_only} } catch (IndexOutOfBoundsException ex) {}""")
824*795d594fSAndroid Build Coastguard Worker    elif accessor.access_mode_form == AccessModeForm.SET:
825*795d594fSAndroid Build Coastguard Worker        test_template = Template("""
826*795d594fSAndroid Build Coastguard Worker        vh.${accessor_method}(${coordinates}${updated_value});
827*795d594fSAndroid Build Coastguard Worker        assertEquals(${updated_value}, ${read_value});
828*795d594fSAndroid Build Coastguard Worker        // Check for out of bounds access (for indexable types only).
829*795d594fSAndroid Build Coastguard Worker        ${indexable_only} try {
830*795d594fSAndroid Build Coastguard Worker        ${indexable_only}   vh.${accessor_method}(${coordinates_negative_index}${updated_value});
831*795d594fSAndroid Build Coastguard Worker        ${indexable_only}   failUnreachable();
832*795d594fSAndroid Build Coastguard Worker        ${indexable_only} } catch (IndexOutOfBoundsException ex) {}""")
833*795d594fSAndroid Build Coastguard Worker    elif accessor.access_mode_form == AccessModeForm.STRONG_COMPARE_AND_SET:
834*795d594fSAndroid Build Coastguard Worker        test_template = Template("""
835*795d594fSAndroid Build Coastguard Worker        assertEquals(${initial_value}, ${read_value});
836*795d594fSAndroid Build Coastguard Worker        // Test an update that should succeed.
837*795d594fSAndroid Build Coastguard Worker        boolean applied = (boolean) vh.${accessor_method}(${coordinates}${initial_value}, ${updated_value});
838*795d594fSAndroid Build Coastguard Worker        assertEquals(${updated_value}, ${read_value});
839*795d594fSAndroid Build Coastguard Worker        assertTrue(applied);
840*795d594fSAndroid Build Coastguard Worker        // Test an update that should fail.
841*795d594fSAndroid Build Coastguard Worker        applied = (boolean) vh.${accessor_method}(${coordinates}${initial_value}, ${initial_value});
842*795d594fSAndroid Build Coastguard Worker        assertFalse(applied);
843*795d594fSAndroid Build Coastguard Worker        assertEquals(${updated_value}, ${read_value});
844*795d594fSAndroid Build Coastguard Worker        // Check for out of bounds access (for indexable types only).
845*795d594fSAndroid Build Coastguard Worker        ${indexable_only} try {
846*795d594fSAndroid Build Coastguard Worker        ${indexable_only}   applied = (boolean) vh.${accessor_method}(${coordinates_negative_index}${updated_value}, ${updated_value});
847*795d594fSAndroid Build Coastguard Worker        ${indexable_only}   failUnreachable();
848*795d594fSAndroid Build Coastguard Worker        ${indexable_only} } catch (IndexOutOfBoundsException ex) {}""")
849*795d594fSAndroid Build Coastguard Worker    elif accessor.access_mode_form == AccessModeForm.WEAK_COMPARE_AND_SET:
850*795d594fSAndroid Build Coastguard Worker        test_template = Template("""
851*795d594fSAndroid Build Coastguard Worker        assertEquals(${initial_value}, ${read_value});
852*795d594fSAndroid Build Coastguard Worker        // Test an update that should succeed.
853*795d594fSAndroid Build Coastguard Worker        int attempts = 10000;
854*795d594fSAndroid Build Coastguard Worker        boolean applied;
855*795d594fSAndroid Build Coastguard Worker        do {
856*795d594fSAndroid Build Coastguard Worker            applied = (boolean) vh.${accessor_method}(${coordinates}${initial_value}, ${updated_value});
857*795d594fSAndroid Build Coastguard Worker        } while (applied == false && attempts-- > 0);
858*795d594fSAndroid Build Coastguard Worker        assertEquals(${updated_value}, ${read_value});
859*795d594fSAndroid Build Coastguard Worker        assertTrue(attempts > 0);
860*795d594fSAndroid Build Coastguard Worker        // Test an update that should fail.
861*795d594fSAndroid Build Coastguard Worker        applied = (boolean) vh.${accessor_method}(${coordinates}${initial_value}, ${initial_value});
862*795d594fSAndroid Build Coastguard Worker        assertFalse(applied);
863*795d594fSAndroid Build Coastguard Worker        assertEquals(${updated_value}, ${read_value});
864*795d594fSAndroid Build Coastguard Worker        // Check for out of bounds access (for indexable types only).
865*795d594fSAndroid Build Coastguard Worker        ${indexable_only} try {
866*795d594fSAndroid Build Coastguard Worker        ${indexable_only}   applied = (boolean) vh.${accessor_method}(${coordinates_negative_index}${updated_value}, ${updated_value});
867*795d594fSAndroid Build Coastguard Worker        ${indexable_only}   failUnreachable();
868*795d594fSAndroid Build Coastguard Worker        ${indexable_only} } catch (IndexOutOfBoundsException ex) {}""")
869*795d594fSAndroid Build Coastguard Worker    elif accessor.access_mode_form == AccessModeForm.COMPARE_AND_EXCHANGE:
870*795d594fSAndroid Build Coastguard Worker        test_template = Template("""
871*795d594fSAndroid Build Coastguard Worker        // This update should succeed.
872*795d594fSAndroid Build Coastguard Worker        ${var_type} witness_value = (${var_type}) vh.${accessor_method}(${coordinates}${initial_value}, ${updated_value});
873*795d594fSAndroid Build Coastguard Worker        assertEquals(${initial_value}, witness_value);
874*795d594fSAndroid Build Coastguard Worker        assertEquals(${updated_value}, ${read_value});
875*795d594fSAndroid Build Coastguard Worker        // This update should fail.
876*795d594fSAndroid Build Coastguard Worker        witness_value = (${var_type}) vh.${accessor_method}(${coordinates}${initial_value}, ${initial_value});
877*795d594fSAndroid Build Coastguard Worker        assertEquals(${updated_value}, witness_value);
878*795d594fSAndroid Build Coastguard Worker        assertEquals(${updated_value}, ${read_value});
879*795d594fSAndroid Build Coastguard Worker        // Check for out of bounds access (for indexable types only).
880*795d594fSAndroid Build Coastguard Worker        ${indexable_only} try {
881*795d594fSAndroid Build Coastguard Worker        ${indexable_only}   witness_value = (${var_type}) vh.${accessor_method}(${coordinates_negative_index}${updated_value}, ${updated_value});
882*795d594fSAndroid Build Coastguard Worker        ${indexable_only}   failUnreachable();
883*795d594fSAndroid Build Coastguard Worker        ${indexable_only} } catch (IndexOutOfBoundsException ex) {}""")
884*795d594fSAndroid Build Coastguard Worker    elif accessor.access_mode_form == AccessModeForm.GET_AND_SET:
885*795d594fSAndroid Build Coastguard Worker        test_template = Template("""
886*795d594fSAndroid Build Coastguard Worker        ${var_type} old_value = (${var_type}) vh.${accessor_method}(${coordinates}${updated_value});
887*795d594fSAndroid Build Coastguard Worker        assertEquals(${initial_value}, old_value);
888*795d594fSAndroid Build Coastguard Worker        assertEquals(${updated_value}, ${read_value});
889*795d594fSAndroid Build Coastguard Worker        // Check for out of bounds access (for indexable types only).
890*795d594fSAndroid Build Coastguard Worker        ${indexable_only} try {
891*795d594fSAndroid Build Coastguard Worker        ${indexable_only}   old_value = (${var_type}) vh.${accessor_method}(${coordinates_negative_index}${updated_value});
892*795d594fSAndroid Build Coastguard Worker        ${indexable_only}   failUnreachable();
893*795d594fSAndroid Build Coastguard Worker        ${indexable_only} } catch (IndexOutOfBoundsException ex) {}""")
894*795d594fSAndroid Build Coastguard Worker    elif accessor.access_mode_form == AccessModeForm.GET_AND_UPDATE_BITWISE:
895*795d594fSAndroid Build Coastguard Worker        if var_type.supports_bitwise == True:
896*795d594fSAndroid Build Coastguard Worker            expansions['binop'] = accessor.get_java_bitwise_operator()
897*795d594fSAndroid Build Coastguard Worker            test_template = Template("""
898*795d594fSAndroid Build Coastguard Worker            ${var_type} old_value = (${var_type}) vh.${accessor_method}(${coordinates}${updated_value});
899*795d594fSAndroid Build Coastguard Worker            assertEquals(${initial_value}, old_value);
900*795d594fSAndroid Build Coastguard Worker            assertEquals(${initial_value} ${binop} ${updated_value}, ${read_value});
901*795d594fSAndroid Build Coastguard Worker            // Check for out of bounds access (for indexable types only).
902*795d594fSAndroid Build Coastguard Worker            ${indexable_only} try {
903*795d594fSAndroid Build Coastguard Worker            ${indexable_only}   old_value = (${var_type}) vh.${accessor_method}(${coordinates_negative_index}${updated_value});
904*795d594fSAndroid Build Coastguard Worker            ${indexable_only}   failUnreachable();
905*795d594fSAndroid Build Coastguard Worker            ${indexable_only} } catch (IndexOutOfBoundsException ex) {}""")
906*795d594fSAndroid Build Coastguard Worker        else:
907*795d594fSAndroid Build Coastguard Worker            test_template = Template("""
908*795d594fSAndroid Build Coastguard Worker            vh.${accessor_method}(${coordinates}${initial_value}, ${updated_value});
909*795d594fSAndroid Build Coastguard Worker            failUnreachable();
910*795d594fSAndroid Build Coastguard Worker            // Check for out of bounds access (for indexable types only).
911*795d594fSAndroid Build Coastguard Worker            ${indexable_only} try {
912*795d594fSAndroid Build Coastguard Worker            ${indexable_only}   vh.${accessor_method}(${coordinates_negative_index}${updated_value}, ${updated_value});
913*795d594fSAndroid Build Coastguard Worker            ${indexable_only}   failUnreachable();
914*795d594fSAndroid Build Coastguard Worker            ${indexable_only} } catch (IndexOutOfBoundsException ex) {}""")
915*795d594fSAndroid Build Coastguard Worker    elif accessor.access_mode_form == AccessModeForm.GET_AND_UPDATE_NUMERIC:
916*795d594fSAndroid Build Coastguard Worker        if var_type.supports_numeric == True:
917*795d594fSAndroid Build Coastguard Worker            expansions['binop'] = accessor.get_java_numeric_operator()
918*795d594fSAndroid Build Coastguard Worker            test_template = Template("""
919*795d594fSAndroid Build Coastguard Worker            ${var_type} unchanged = (${var_type}) vh.${accessor_method}(${coordinates}(${var_type}) 0);
920*795d594fSAndroid Build Coastguard Worker            assertEquals(${initial_value}, unchanged);
921*795d594fSAndroid Build Coastguard Worker            ${var_type} old_value = (${var_type}) vh.${accessor_method}(${coordinates}${updated_value});
922*795d594fSAndroid Build Coastguard Worker            assertEquals(${initial_value}, old_value);
923*795d594fSAndroid Build Coastguard Worker            ${var_type} expected_value = (${var_type}) (${initial_value} ${binop} ${updated_value});
924*795d594fSAndroid Build Coastguard Worker            assertEquals(expected_value, ${read_value});
925*795d594fSAndroid Build Coastguard Worker            // Check for out of bounds access (for indexable types only).
926*795d594fSAndroid Build Coastguard Worker            ${indexable_only} try {
927*795d594fSAndroid Build Coastguard Worker            ${indexable_only}   old_value = (${var_type}) vh.${accessor_method}(${coordinates_negative_index}${updated_value});
928*795d594fSAndroid Build Coastguard Worker            ${indexable_only}   failUnreachable();
929*795d594fSAndroid Build Coastguard Worker            ${indexable_only} } catch (IndexOutOfBoundsException ex) {}""")
930*795d594fSAndroid Build Coastguard Worker        else:
931*795d594fSAndroid Build Coastguard Worker            test_template = Template("""
932*795d594fSAndroid Build Coastguard Worker            vh.${accessor_method}(${coordinates}${initial_value}, ${updated_value});
933*795d594fSAndroid Build Coastguard Worker            failUnreachable();
934*795d594fSAndroid Build Coastguard Worker            // Check for out of bounds access (for indexable types only).
935*795d594fSAndroid Build Coastguard Worker            ${indexable_only} try {
936*795d594fSAndroid Build Coastguard Worker            ${indexable_only}   vh.${accessor_method}(${coordinates_negative_index}${updated_value}, ${updated_value});
937*795d594fSAndroid Build Coastguard Worker            ${indexable_only}   failUnreachable();
938*795d594fSAndroid Build Coastguard Worker            ${indexable_only} } catch (IndexOutOfBoundsException ex) {}""")
939*795d594fSAndroid Build Coastguard Worker    else:
940*795d594fSAndroid Build Coastguard Worker        raise ValueError(accessor.access_mode_form)
941*795d594fSAndroid Build Coastguard Worker
942*795d594fSAndroid Build Coastguard Worker    if var_handle_kind.may_throw_read_only and not accessor.is_read_only():
943*795d594fSAndroid Build Coastguard Worker        # ByteBufferViews can be read-only and dynamically raise ReadOnlyBufferException.
944*795d594fSAndroid Build Coastguard Worker        expansions['try_statement'] = "try {"
945*795d594fSAndroid Build Coastguard Worker        expansions['catch_statement'] = "failUnreachable();\n} catch (ReadOnlyBufferException ex) {}"
946*795d594fSAndroid Build Coastguard Worker    else:
947*795d594fSAndroid Build Coastguard Worker        expansions['try_statement'] = ""
948*795d594fSAndroid Build Coastguard Worker        expansions['catch_statement'] = ""
949*795d594fSAndroid Build Coastguard Worker
950*795d594fSAndroid Build Coastguard Worker    expansions['test_body'] = test_template.safe_substitute(expansions)
951*795d594fSAndroid Build Coastguard Worker
952*795d594fSAndroid Build Coastguard Worker    s = Template("""${banner}
953*795d594fSAndroid Build Coastguard Worker
954*795d594fSAndroid Build Coastguard Worker${imports};
955*795d594fSAndroid Build Coastguard Worker
956*795d594fSAndroid Build Coastguard Workerclass ${test_class} extends VarHandleUnitTest {
957*795d594fSAndroid Build Coastguard Worker    ${field_declarations};
958*795d594fSAndroid Build Coastguard Worker    static final VarHandle vh;
959*795d594fSAndroid Build Coastguard Worker    static {
960*795d594fSAndroid Build Coastguard Worker        try {
961*795d594fSAndroid Build Coastguard Worker            vh = ${lookup};
962*795d594fSAndroid Build Coastguard Worker        } catch (Exception e) {
963*795d594fSAndroid Build Coastguard Worker            throw new RuntimeException("Unexpected initialization exception", e);
964*795d594fSAndroid Build Coastguard Worker        }
965*795d594fSAndroid Build Coastguard Worker    }
966*795d594fSAndroid Build Coastguard Worker
967*795d594fSAndroid Build Coastguard Worker    @Override
968*795d594fSAndroid Build Coastguard Worker    public void doTest() throws Exception {
969*795d594fSAndroid Build Coastguard Worker        if (!vh.isAccessModeSupported(VarHandle.AccessMode.${access_mode})) {
970*795d594fSAndroid Build Coastguard Worker            try {
971*795d594fSAndroid Build Coastguard Worker                ${test_body}
972*795d594fSAndroid Build Coastguard Worker                failUnreachable();
973*795d594fSAndroid Build Coastguard Worker            } catch (UnsupportedOperationException ex) {}
974*795d594fSAndroid Build Coastguard Worker        } else {
975*795d594fSAndroid Build Coastguard Worker            ${try_statement}
976*795d594fSAndroid Build Coastguard Worker            ${test_body}
977*795d594fSAndroid Build Coastguard Worker            ${catch_statement}
978*795d594fSAndroid Build Coastguard Worker        }
979*795d594fSAndroid Build Coastguard Worker    }
980*795d594fSAndroid Build Coastguard Worker
981*795d594fSAndroid Build Coastguard Worker    public static void main(String[] args) {
982*795d594fSAndroid Build Coastguard Worker         new ${test_class}().run();
983*795d594fSAndroid Build Coastguard Worker    }
984*795d594fSAndroid Build Coastguard Worker}
985*795d594fSAndroid Build Coastguard Worker""").safe_substitute(expansions)
986*795d594fSAndroid Build Coastguard Worker    with src_file_path.open("w") as src_file:
987*795d594fSAndroid Build Coastguard Worker        print(s, file=src_file)
988*795d594fSAndroid Build Coastguard Worker
989*795d594fSAndroid Build Coastguard Workerdef emit_value_type_accessor_tests(output_path):
990*795d594fSAndroid Build Coastguard Worker    for var_handle_kind in ALL_VAR_HANDLE_KINDS:
991*795d594fSAndroid Build Coastguard Worker        for accessor in VAR_HANDLE_ACCESSORS:
992*795d594fSAndroid Build Coastguard Worker            for var_type in var_handle_kind.get_supported_types():
993*795d594fSAndroid Build Coastguard Worker                emit_accessor_test(var_handle_kind, accessor, var_type, output_path)
994*795d594fSAndroid Build Coastguard Worker
995*795d594fSAndroid Build Coastguard Workerdef emit_reference_accessor_tests(output_path):
996*795d594fSAndroid Build Coastguard Worker    ref_type = JavaType("Widget", [ "Widget.ONE", "Widget.TWO", "null" ])
997*795d594fSAndroid Build Coastguard Worker    for var_handle_kind in ALL_VAR_HANDLE_KINDS:
998*795d594fSAndroid Build Coastguard Worker        if var_handle_kind.is_view():
999*795d594fSAndroid Build Coastguard Worker            # Views as reference type arrays are not supported. They
1000*795d594fSAndroid Build Coastguard Worker            # fail instantiation. This is tested in 710-varhandle-creation.
1001*795d594fSAndroid Build Coastguard Worker            continue
1002*795d594fSAndroid Build Coastguard Worker        for accessor in VAR_HANDLE_ACCESSORS:
1003*795d594fSAndroid Build Coastguard Worker            emit_accessor_test(var_handle_kind, accessor, ref_type, output_path)
1004*795d594fSAndroid Build Coastguard Worker
1005*795d594fSAndroid Build Coastguard Workerdef emit_interface_accessor_tests(output_path):
1006*795d594fSAndroid Build Coastguard Worker    ref_type = JavaType("WidgetInterface", [ "Widget.ONE", "Widget.TWO", "null" ])
1007*795d594fSAndroid Build Coastguard Worker    for var_handle_kind in ALL_VAR_HANDLE_KINDS:
1008*795d594fSAndroid Build Coastguard Worker        if var_handle_kind.is_view():
1009*795d594fSAndroid Build Coastguard Worker            # Views as reference type arrays are not supported. They
1010*795d594fSAndroid Build Coastguard Worker            # fail instantiation. This is tested in 710-varhandle-creation.
1011*795d594fSAndroid Build Coastguard Worker            continue
1012*795d594fSAndroid Build Coastguard Worker        for accessor in VAR_HANDLE_ACCESSORS:
1013*795d594fSAndroid Build Coastguard Worker            emit_accessor_test(var_handle_kind, accessor, ref_type, output_path)
1014*795d594fSAndroid Build Coastguard Worker
1015*795d594fSAndroid Build Coastguard Workerdef emit_boxing_value_type_accessor_test(accessor, var_type, output_path):
1016*795d594fSAndroid Build Coastguard Worker    test_class = "Boxing" + capitalize_first(accessor.method_name) + capitalize_first(var_type.name)
1017*795d594fSAndroid Build Coastguard Worker    GENERATED_TEST_CLASSES.append(test_class)
1018*795d594fSAndroid Build Coastguard Worker    src_file_path = output_path / java_file_for_class(test_class)
1019*795d594fSAndroid Build Coastguard Worker    var_handle_kind = FIELD_VAR_HANDLE
1020*795d594fSAndroid Build Coastguard Worker    expansions = build_template_dictionary(test_class, var_handle_kind, accessor, var_type)
1021*795d594fSAndroid Build Coastguard Worker    template = Template("""
1022*795d594fSAndroid Build Coastguard Worker${banner}
1023*795d594fSAndroid Build Coastguard Worker
1024*795d594fSAndroid Build Coastguard Worker${imports};
1025*795d594fSAndroid Build Coastguard Workerimport java.lang.invoke.WrongMethodTypeException;
1026*795d594fSAndroid Build Coastguard Worker
1027*795d594fSAndroid Build Coastguard Workerpublic class ${test_class} extends VarHandleUnitTest {
1028*795d594fSAndroid Build Coastguard Worker    ${field_declarations};
1029*795d594fSAndroid Build Coastguard Worker    private static final VarHandle vh;
1030*795d594fSAndroid Build Coastguard Worker    static {
1031*795d594fSAndroid Build Coastguard Worker        try {
1032*795d594fSAndroid Build Coastguard Worker            vh = ${lookup};
1033*795d594fSAndroid Build Coastguard Worker        } catch (Exception e) {
1034*795d594fSAndroid Build Coastguard Worker            throw new RuntimeException("Unexpected initialization exception", e);
1035*795d594fSAndroid Build Coastguard Worker        }
1036*795d594fSAndroid Build Coastguard Worker    }
1037*795d594fSAndroid Build Coastguard Worker
1038*795d594fSAndroid Build Coastguard Worker    @Override
1039*795d594fSAndroid Build Coastguard Worker    public void doTest() throws Exception {
1040*795d594fSAndroid Build Coastguard Worker       ${body}
1041*795d594fSAndroid Build Coastguard Worker    }
1042*795d594fSAndroid Build Coastguard Worker
1043*795d594fSAndroid Build Coastguard Worker    public static void main(String[] args) {
1044*795d594fSAndroid Build Coastguard Worker         new ${test_class}().run();
1045*795d594fSAndroid Build Coastguard Worker    }
1046*795d594fSAndroid Build Coastguard Worker}
1047*795d594fSAndroid Build Coastguard Worker""")
1048*795d594fSAndroid Build Coastguard Worker    with io.StringIO() as body_text:
1049*795d594fSAndroid Build Coastguard Worker        compatible_types = types_that_widen_to(var_type)
1050*795d594fSAndroid Build Coastguard Worker        incompatible_types = { RANDOM.choice(list(VALUE_TYPES - compatible_types)) }
1051*795d594fSAndroid Build Coastguard Worker        test_types = compatible_types | incompatible_types
1052*795d594fSAndroid Build Coastguard Worker        for value_type in test_types:
1053*795d594fSAndroid Build Coastguard Worker            print("try {", file=body_text)
1054*795d594fSAndroid Build Coastguard Worker            return_type = accessor.get_return_type(var_type)
1055*795d594fSAndroid Build Coastguard Worker            if return_type:
1056*795d594fSAndroid Build Coastguard Worker                print("{0} result = ({0}) ".format(return_type), end="", file=body_text)
1057*795d594fSAndroid Build Coastguard Worker            print("vh.{0}(this".format(accessor.method_name), end="", file=body_text)
1058*795d594fSAndroid Build Coastguard Worker            num_args = accessor.get_number_of_var_type_arguments()
1059*795d594fSAndroid Build Coastguard Worker            for i in range(0, num_args):
1060*795d594fSAndroid Build Coastguard Worker                print(", SampleValues.get_{0}({1})".format(value_type.boxed_type, i), end="", file=body_text)
1061*795d594fSAndroid Build Coastguard Worker            print(");", file=body_text)
1062*795d594fSAndroid Build Coastguard Worker            if value_type in compatible_types:
1063*795d594fSAndroid Build Coastguard Worker                print("   assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.{0}));".format(accessor.access_mode),
1064*795d594fSAndroid Build Coastguard Worker                      file=body_text)
1065*795d594fSAndroid Build Coastguard Worker            else:
1066*795d594fSAndroid Build Coastguard Worker                print("failUnreachable();", file=body_text)
1067*795d594fSAndroid Build Coastguard Worker                print("} catch (WrongMethodTypeException e) {", file=body_text)
1068*795d594fSAndroid Build Coastguard Worker            print("} catch (UnsupportedOperationException e) {", file=body_text)
1069*795d594fSAndroid Build Coastguard Worker            print("   assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.{0}));".format(accessor.access_mode),
1070*795d594fSAndroid Build Coastguard Worker                  file=body_text)
1071*795d594fSAndroid Build Coastguard Worker            print("}", file=body_text)
1072*795d594fSAndroid Build Coastguard Worker        expansions['body'] = body_text.getvalue();
1073*795d594fSAndroid Build Coastguard Worker        with src_file_path.open("w") as src_file:
1074*795d594fSAndroid Build Coastguard Worker            print(template.safe_substitute(expansions), file=src_file)
1075*795d594fSAndroid Build Coastguard Worker
1076*795d594fSAndroid Build Coastguard Workerdef emit_boxing_return_value_type_test(accessor, var_type, output_path):
1077*795d594fSAndroid Build Coastguard Worker    test_class = "BoxingReturn" + capitalize_first(accessor.method_name) + capitalize_first(var_type.name)
1078*795d594fSAndroid Build Coastguard Worker    GENERATED_TEST_CLASSES.append(test_class)
1079*795d594fSAndroid Build Coastguard Worker    src_file_path = output_path / java_file_for_class(test_class)
1080*795d594fSAndroid Build Coastguard Worker    var_handle_kind = FIELD_VAR_HANDLE
1081*795d594fSAndroid Build Coastguard Worker    expansions = build_template_dictionary(test_class, var_handle_kind, accessor, var_type)
1082*795d594fSAndroid Build Coastguard Worker    template = Template("""
1083*795d594fSAndroid Build Coastguard Worker${banner}
1084*795d594fSAndroid Build Coastguard Worker
1085*795d594fSAndroid Build Coastguard Worker${imports};
1086*795d594fSAndroid Build Coastguard Workerimport java.lang.invoke.WrongMethodTypeException;
1087*795d594fSAndroid Build Coastguard Worker
1088*795d594fSAndroid Build Coastguard Workerpublic class ${test_class} extends VarHandleUnitTest {
1089*795d594fSAndroid Build Coastguard Worker    ${field_declarations};
1090*795d594fSAndroid Build Coastguard Worker    private static final VarHandle vh;
1091*795d594fSAndroid Build Coastguard Worker    static {
1092*795d594fSAndroid Build Coastguard Worker        try {
1093*795d594fSAndroid Build Coastguard Worker            vh = ${lookup};
1094*795d594fSAndroid Build Coastguard Worker        } catch (Exception e) {
1095*795d594fSAndroid Build Coastguard Worker            throw new RuntimeException("Unexpected initialization exception", e);
1096*795d594fSAndroid Build Coastguard Worker        }
1097*795d594fSAndroid Build Coastguard Worker    }
1098*795d594fSAndroid Build Coastguard Worker
1099*795d594fSAndroid Build Coastguard Worker    @Override
1100*795d594fSAndroid Build Coastguard Worker    public void doTest() throws Exception {
1101*795d594fSAndroid Build Coastguard Worker       ${body}
1102*795d594fSAndroid Build Coastguard Worker    }
1103*795d594fSAndroid Build Coastguard Worker
1104*795d594fSAndroid Build Coastguard Worker    public static void main(String[] args) {
1105*795d594fSAndroid Build Coastguard Worker         new ${test_class}().run();
1106*795d594fSAndroid Build Coastguard Worker    }
1107*795d594fSAndroid Build Coastguard Worker}
1108*795d594fSAndroid Build Coastguard Worker""")
1109*795d594fSAndroid Build Coastguard Worker    with io.StringIO() as body_text:
1110*795d594fSAndroid Build Coastguard Worker        return_type = accessor.get_return_type(var_type)
1111*795d594fSAndroid Build Coastguard Worker        compatible_types = { return_type }
1112*795d594fSAndroid Build Coastguard Worker        incompatible_types = { RANDOM.choice(list(VALUE_TYPES - compatible_types)) }
1113*795d594fSAndroid Build Coastguard Worker        test_types = compatible_types | incompatible_types
1114*795d594fSAndroid Build Coastguard Worker        for value_type in test_types:
1115*795d594fSAndroid Build Coastguard Worker            print("try {", file=body_text)
1116*795d594fSAndroid Build Coastguard Worker            print("{0} result = ({0}) ".format(value_type.boxed_type), end="", file=body_text)
1117*795d594fSAndroid Build Coastguard Worker            print("vh.{0}(this".format(accessor.method_name), end="", file=body_text)
1118*795d594fSAndroid Build Coastguard Worker            num_args = accessor.get_number_of_var_type_arguments()
1119*795d594fSAndroid Build Coastguard Worker            for i in range(0, num_args):
1120*795d594fSAndroid Build Coastguard Worker                print(", {0})".format(var_type.examples[i]), end="", file=body_text)
1121*795d594fSAndroid Build Coastguard Worker            print(");", file=body_text)
1122*795d594fSAndroid Build Coastguard Worker            if value_type in compatible_types:
1123*795d594fSAndroid Build Coastguard Worker                print("   assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.{0}));".format(accessor.access_mode),
1124*795d594fSAndroid Build Coastguard Worker                      file=body_text)
1125*795d594fSAndroid Build Coastguard Worker            else:
1126*795d594fSAndroid Build Coastguard Worker                print("failUnreachable();", file=body_text)
1127*795d594fSAndroid Build Coastguard Worker                print("} catch (WrongMethodTypeException e) {", file=body_text)
1128*795d594fSAndroid Build Coastguard Worker            print("} catch (UnsupportedOperationException e) {", file=body_text)
1129*795d594fSAndroid Build Coastguard Worker            print("   assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.{0}));".format(accessor.access_mode),
1130*795d594fSAndroid Build Coastguard Worker                  file=body_text)
1131*795d594fSAndroid Build Coastguard Worker            print("}", file=body_text)
1132*795d594fSAndroid Build Coastguard Worker        expansions['body'] = body_text.getvalue();
1133*795d594fSAndroid Build Coastguard Worker        with src_file_path.open("w") as src_file:
1134*795d594fSAndroid Build Coastguard Worker            print(template.safe_substitute(expansions), file=src_file)
1135*795d594fSAndroid Build Coastguard Worker
1136*795d594fSAndroid Build Coastguard Workerdef emit_boxing_value_type_accessor_tests(output_path):
1137*795d594fSAndroid Build Coastguard Worker    for var_type in VALUE_TYPES:
1138*795d594fSAndroid Build Coastguard Worker        for accessor in VAR_HANDLE_ACCESSORS:
1139*795d594fSAndroid Build Coastguard Worker            if accessor.get_number_of_var_type_arguments() > 0:
1140*795d594fSAndroid Build Coastguard Worker                emit_boxing_value_type_accessor_test(accessor, var_type, output_path)
1141*795d594fSAndroid Build Coastguard Worker            else:
1142*795d594fSAndroid Build Coastguard Worker                emit_boxing_return_value_type_test(accessor, var_type, output_path)
1143*795d594fSAndroid Build Coastguard Worker
1144*795d594fSAndroid Build Coastguard Workerdef emit_main(output_path, manual_test_classes):
1145*795d594fSAndroid Build Coastguard Worker    main_file_path = output_path / "Main.java"
1146*795d594fSAndroid Build Coastguard Worker    all_test_classes = GENERATED_TEST_CLASSES + manual_test_classes
1147*795d594fSAndroid Build Coastguard Worker    with main_file_path.open("w") as main_file:
1148*795d594fSAndroid Build Coastguard Worker        print("// " + BANNER, file=main_file)
1149*795d594fSAndroid Build Coastguard Worker        print("""
1150*795d594fSAndroid Build Coastguard Workerpublic class Main {
1151*795d594fSAndroid Build Coastguard Worker    public static void main(String[] args) {
1152*795d594fSAndroid Build Coastguard Worker""", file=main_file)
1153*795d594fSAndroid Build Coastguard Worker        for cls in all_test_classes:
1154*795d594fSAndroid Build Coastguard Worker            print("         " + cls + ".main(args);", file=main_file)
1155*795d594fSAndroid Build Coastguard Worker        print("        VarHandleUnitTest.DEFAULT_COLLECTOR.printSummary();", file=main_file)
1156*795d594fSAndroid Build Coastguard Worker        print("        System.exit(VarHandleUnitTest.DEFAULT_COLLECTOR.failuresOccurred() ? 1 : 0);", file=main_file)
1157*795d594fSAndroid Build Coastguard Worker        print("    }\n}", file=main_file)
1158*795d594fSAndroid Build Coastguard Worker
1159*795d594fSAndroid Build Coastguard Workerdef main(argv):
1160*795d594fSAndroid Build Coastguard Worker    final_java_dir = Path(argv[1])
1161*795d594fSAndroid Build Coastguard Worker    if not final_java_dir.exists() or not final_java_dir.is_dir():
1162*795d594fSAndroid Build Coastguard Worker        print("{} is not a valid java dir".format(final_java_dir), file=sys.stderr)
1163*795d594fSAndroid Build Coastguard Worker        sys.exit(1)
1164*795d594fSAndroid Build Coastguard Worker    emit_value_type_accessor_tests(final_java_dir)
1165*795d594fSAndroid Build Coastguard Worker    emit_reference_accessor_tests(final_java_dir)
1166*795d594fSAndroid Build Coastguard Worker    emit_interface_accessor_tests(final_java_dir)
1167*795d594fSAndroid Build Coastguard Worker    emit_boxing_value_type_accessor_tests(final_java_dir)
1168*795d594fSAndroid Build Coastguard Worker    emit_main(final_java_dir, argv[2:])
1169*795d594fSAndroid Build Coastguard Worker
1170*795d594fSAndroid Build Coastguard Workerif __name__ == '__main__':
1171*795d594fSAndroid Build Coastguard Worker    main(sys.argv)
1172