Preconditions.java revision e636af49311605b8a00488f44fde7f45b78ab905
1e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver/* 2e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * Copyright 2012, Google Inc. 3e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * All rights reserved. 4e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * 5e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * Redistribution and use in source and binary forms, with or without 6e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * modification, are permitted provided that the following conditions are 7e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * met: 8e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * 9e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * * Redistributions of source code must retain the above copyright 10e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * notice, this list of conditions and the following disclaimer. 11e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * * Redistributions in binary form must reproduce the above 12e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * copyright notice, this list of conditions and the following disclaimer 13e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * in the documentation and/or other materials provided with the 14e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * distribution. 15e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * * Neither the name of Google Inc. nor the names of its 16e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * contributors may be used to endorse or promote products derived from 17e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * this software without specific prior written permission. 18e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * 19e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver */ 31e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 32e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverpackage org.jf.dexlib2.util; 33e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 34e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport org.jf.dexlib2.Format; 35e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverimport org.jf.dexlib2.Opcode; 3642627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport org.jf.dexlib2.ReferenceType; 37db7795ffaa2d8804d84623a79d406f8c8686c1b8Ben Gruverimport org.jf.dexlib2.VerificationError; 3842627b850c8f68a594f105e04b97c512b292b698Ben Gruverimport org.jf.dexlib2.iface.reference.*; 39e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 40e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruverpublic class Preconditions { 41e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver public static void checkFormat(Opcode opcode, Format expectedFormat) { 42e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver if (opcode.format != expectedFormat) { 43e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver throw new IllegalArgumentException( 44e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver String.format("Invalid opcode %s for %s", opcode.name, expectedFormat.name())); 45e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 46e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 47e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 48e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver public static int checkNibbleRegister(int register) { 49e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver if ((register & 0xFFFFFFF0) != 0) { 50e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver throw new IllegalArgumentException( 51e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver String.format("Invalid register: v%d. Must be between v0 and v15, inclusive.", register)); 52e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 53e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver return register; 54e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 55e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 56e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver public static int checkByteRegister(int register) { 57e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver if ((register & 0xFFFFFF00) != 0) { 58e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver throw new IllegalArgumentException( 59e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver String.format("Invalid register: v%d. Must be between v0 and v255, inclusive.", register)); 60e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 61e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver return register; 62e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 63e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 64e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver public static int checkShortRegister(int register) { 65e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver if ((register & 0xFFFF0000) != 0) { 66e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver throw new IllegalArgumentException( 67e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver String.format("Invalid register: v%d. Must be between v0 and v65535, inclusive.", register)); 68e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 69e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver return register; 70e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 71e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 72e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver public static int checkNibbleLiteral(int literal) { 73f8a63e41aa4efd84eabc31fd7a715d1ea0949cc0Ben Gruver if (literal < -8 || literal > 7) { 74e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver throw new IllegalArgumentException( 75e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver String.format("Invalid literal value: %d. Must be between -8 and 7, inclusive.", literal)); 76e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 77e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver return literal; 78e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 79e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 80e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver public static int checkByteLiteral(int literal) { 81f8a63e41aa4efd84eabc31fd7a715d1ea0949cc0Ben Gruver if (literal < -128 || literal > 127) { 82e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver throw new IllegalArgumentException( 83e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver String.format("Invalid literal value: %d. Must be between -128 and 127, inclusive.", literal)); 84e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 85e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver return literal; 86e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 87e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 88e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver public static int checkShortLiteral(int literal) { 89f8a63e41aa4efd84eabc31fd7a715d1ea0949cc0Ben Gruver if (literal < -32768 || literal > 32767) { 90e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver throw new IllegalArgumentException( 91e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver String.format("Invalid literal value: %d. Must be between -32768 and 32767, inclusive.", literal)); 92e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 93e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver return literal; 94e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 95e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 96e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver public static int checkIntegerHatLiteral(int literal) { 97e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver if ((literal & 0xFFFF) != 0) { 98e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver throw new IllegalArgumentException( 99e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver String.format("Invalid literal value: %d. Low 16 bits must be zeroed out.", literal)); 100e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 101e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver return literal; 102e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 103e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 104e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver public static long checkLongHatLiteral(long literal) { 105e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver if ((literal & 0xFFFFFFFFFFFFL) != 0) { 106e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver throw new IllegalArgumentException( 107f8a63e41aa4efd84eabc31fd7a715d1ea0949cc0Ben Gruver String.format("Invalid literal value: %d. Low 48 bits must be zeroed out.", literal)); 108e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 109e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver return literal; 110e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 111e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 112198e0816cfc1370b02ae2db497e1b352f6af2fd4Ben Gruver public static int checkByteCodeOffset(int offset) { 113198e0816cfc1370b02ae2db497e1b352f6af2fd4Ben Gruver if (offset < -128 || offset > 127) { 114e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver throw new IllegalArgumentException( 115198e0816cfc1370b02ae2db497e1b352f6af2fd4Ben Gruver String.format("Invalid code offset: %d. Must be between -128 and 127, inclusive.", offset)); 116e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 117198e0816cfc1370b02ae2db497e1b352f6af2fd4Ben Gruver return offset; 118e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 119e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 120198e0816cfc1370b02ae2db497e1b352f6af2fd4Ben Gruver public static int checkShortCodeOffset(int offset) { 121e636af49311605b8a00488f44fde7f45b78ab905Ben Gruver if (offset < -32768 || offset > 32767) { 122e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver throw new IllegalArgumentException( 123198e0816cfc1370b02ae2db497e1b352f6af2fd4Ben Gruver String.format("Invalid code offset: %d. Must be between -32768 and 32767, inclusive.", offset)); 124e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 125198e0816cfc1370b02ae2db497e1b352f6af2fd4Ben Gruver return offset; 126e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 127e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 128e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver public static int check35cRegisterCount(int registerCount) { 129e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver if (registerCount < 0 || registerCount > 5) { 130e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver throw new IllegalArgumentException( 131e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver String.format("Invalid register count: %d. Must be between 0 and 5, inclusive.", registerCount)); 132e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 133e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver return registerCount; 134e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 135e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver 13661277b50b39015efe38c9cc5c79b31f6dd35c1f6Ben Gruver public static int checkRegisterRangeCount(int registerCount) { 137d62490d669fb436c14c3387b16ff4a416cc7ad3bBen Gruver if ((registerCount & 0xFFFFFF00) != 0) { 138e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver throw new IllegalArgumentException( 139e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver String.format("Invalid register count: %d. Must be between 0 and 255, inclusive.", registerCount)); 140e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 141e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver return registerCount; 142e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver } 1437c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver 1447c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver public static void checkValueArg(int valueArg, int maxValue) { 1450aeaeecb11019bf52ea1ad46085b694159e666e1Ben Gruver if (valueArg > maxValue) { 14622c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver if (maxValue == 0) { 14722c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver throw new IllegalArgumentException( 14822c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver String.format("Invalid value_arg value %d for an encoded_value. Expecting 0", 14922c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver valueArg)); 15022c3185bb7c8618437eabe6c597549e0989ec4e6Ben Gruver } 1517c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver throw new IllegalArgumentException( 1527c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver String.format("Invalid value_arg value %d for an encoded_value. Expecting 0..%d, inclusive", 1537c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver valueArg, maxValue)); 1547c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver } 1557c71ad420dbdfe2e36f205d335a261435181a25bBen Gruver } 156e88723c666db87d414e126ac6d94d683d86ad28dBen Gruver 157e88723c666db87d414e126ac6d94d683d86ad28dBen Gruver public static int checkFieldOffset(int fieldOffset) { 158e88723c666db87d414e126ac6d94d683d86ad28dBen Gruver if (fieldOffset < 0 || fieldOffset > 65535) { 159e88723c666db87d414e126ac6d94d683d86ad28dBen Gruver throw new IllegalArgumentException( 160e88723c666db87d414e126ac6d94d683d86ad28dBen Gruver String.format("Invalid field offset: 0x%x. Must be between 0x0000 and 0xFFFF inclusive", 161e88723c666db87d414e126ac6d94d683d86ad28dBen Gruver fieldOffset)); 162e88723c666db87d414e126ac6d94d683d86ad28dBen Gruver } 163e88723c666db87d414e126ac6d94d683d86ad28dBen Gruver return fieldOffset; 164e88723c666db87d414e126ac6d94d683d86ad28dBen Gruver } 1658a151ae671f6d5c99d55779005580834b49187f0Ben Gruver 1668a151ae671f6d5c99d55779005580834b49187f0Ben Gruver public static int checkVtableIndex(int vtableIndex) { 1678a151ae671f6d5c99d55779005580834b49187f0Ben Gruver if (vtableIndex < 0 || vtableIndex > 65535) { 1688a151ae671f6d5c99d55779005580834b49187f0Ben Gruver throw new IllegalArgumentException( 1698a151ae671f6d5c99d55779005580834b49187f0Ben Gruver String.format("Invalid vtable index: %d. Must be between 0 and 65535, inclusive", vtableIndex)); 1708a151ae671f6d5c99d55779005580834b49187f0Ben Gruver } 1718a151ae671f6d5c99d55779005580834b49187f0Ben Gruver return vtableIndex; 1728a151ae671f6d5c99d55779005580834b49187f0Ben Gruver } 1732a91d72a1534dd8171d8296ce8312de4bd603451Ben Gruver 1742a91d72a1534dd8171d8296ce8312de4bd603451Ben Gruver public static int checkInlineIndex(int inlineIndex) { 1752a91d72a1534dd8171d8296ce8312de4bd603451Ben Gruver if (inlineIndex < 0 || inlineIndex > 65535) { 1762a91d72a1534dd8171d8296ce8312de4bd603451Ben Gruver throw new IllegalArgumentException( 1772a91d72a1534dd8171d8296ce8312de4bd603451Ben Gruver String.format("Invalid inline index: %d. Must be between 0 and 65535, inclusive", inlineIndex)); 1782a91d72a1534dd8171d8296ce8312de4bd603451Ben Gruver } 1792a91d72a1534dd8171d8296ce8312de4bd603451Ben Gruver return inlineIndex; 1802a91d72a1534dd8171d8296ce8312de4bd603451Ben Gruver } 181db7795ffaa2d8804d84623a79d406f8c8686c1b8Ben Gruver 182db7795ffaa2d8804d84623a79d406f8c8686c1b8Ben Gruver public static int checkVerificationError(int verificationError) { 183db7795ffaa2d8804d84623a79d406f8c8686c1b8Ben Gruver if (!VerificationError.isValidVerificationError(verificationError)) { 184db7795ffaa2d8804d84623a79d406f8c8686c1b8Ben Gruver throw new IllegalArgumentException( 185db7795ffaa2d8804d84623a79d406f8c8686c1b8Ben Gruver String.format("Invalid verification error value: %d. Must be between 1 and 9, inclusive", 186db7795ffaa2d8804d84623a79d406f8c8686c1b8Ben Gruver verificationError)); 187db7795ffaa2d8804d84623a79d406f8c8686c1b8Ben Gruver } 188db7795ffaa2d8804d84623a79d406f8c8686c1b8Ben Gruver return verificationError; 189db7795ffaa2d8804d84623a79d406f8c8686c1b8Ben Gruver } 19042627b850c8f68a594f105e04b97c512b292b698Ben Gruver 19142627b850c8f68a594f105e04b97c512b292b698Ben Gruver public static <T extends Reference> T checkReference(int referenceType, T reference) { 19242627b850c8f68a594f105e04b97c512b292b698Ben Gruver switch (referenceType) { 19342627b850c8f68a594f105e04b97c512b292b698Ben Gruver case ReferenceType.STRING: 19442627b850c8f68a594f105e04b97c512b292b698Ben Gruver if (!(reference instanceof StringReference)) { 19542627b850c8f68a594f105e04b97c512b292b698Ben Gruver throw new IllegalArgumentException("Invalid reference type, expecting a string reference"); 19642627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 19742627b850c8f68a594f105e04b97c512b292b698Ben Gruver break; 19842627b850c8f68a594f105e04b97c512b292b698Ben Gruver case ReferenceType.TYPE: 19942627b850c8f68a594f105e04b97c512b292b698Ben Gruver if (!(reference instanceof TypeReference)) { 20042627b850c8f68a594f105e04b97c512b292b698Ben Gruver throw new IllegalArgumentException("Invalid reference type, expecting a type reference"); 20142627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 20242627b850c8f68a594f105e04b97c512b292b698Ben Gruver break; 20342627b850c8f68a594f105e04b97c512b292b698Ben Gruver case ReferenceType.FIELD: 20442627b850c8f68a594f105e04b97c512b292b698Ben Gruver if (!(reference instanceof FieldReference)) { 20542627b850c8f68a594f105e04b97c512b292b698Ben Gruver throw new IllegalArgumentException("Invalid reference type, expecting a field reference"); 20642627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 20742627b850c8f68a594f105e04b97c512b292b698Ben Gruver break; 20842627b850c8f68a594f105e04b97c512b292b698Ben Gruver case ReferenceType.METHOD: 20942627b850c8f68a594f105e04b97c512b292b698Ben Gruver if (!(reference instanceof MethodReference)) { 21042627b850c8f68a594f105e04b97c512b292b698Ben Gruver throw new IllegalArgumentException("Invalid reference type, expecting a method reference"); 21142627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 21242627b850c8f68a594f105e04b97c512b292b698Ben Gruver break; 21342627b850c8f68a594f105e04b97c512b292b698Ben Gruver default: 21442627b850c8f68a594f105e04b97c512b292b698Ben Gruver throw new IllegalArgumentException(String.format("Not a valid reference type: %d", referenceType)); 21542627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 21642627b850c8f68a594f105e04b97c512b292b698Ben Gruver return reference; 21742627b850c8f68a594f105e04b97c512b292b698Ben Gruver } 218e2f00f0eba79723388f2152db7b68c64872d7eb3Ben Gruver} 219