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