12270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom/* 22270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * ProGuard -- shrinking, optimization, obfuscation, and preverification 32270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * of Java bytecode. 42270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * 52270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu) 62270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * 72270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * This program is free software; you can redistribute it and/or modify it 82270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * under the terms of the GNU General Public License as published by the Free 92270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Software Foundation; either version 2 of the License, or (at your option) 102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * any later version. 112270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * 122270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * This program is distributed in the hope that it will be useful, but WITHOUT 132270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 152270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * more details. 162270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * 172270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * You should have received a copy of the GNU General Public License along 182270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * with this program; if not, write to the Free Software Foundation, Inc., 192270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */ 212270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrompackage proguard.classfile.util; 222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.*; 242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.visitor.*; 252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom/** 272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * This MemberVisitor lets a given parameter visitor visit all the parameters 282270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * of the methods that it visits. The parameters do not include or count the 292270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * 'this' parameter or the return value. 302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * 312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * @author Eric Lafortune 322270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */ 332270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrompublic class AllParameterVisitor 342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimplements MemberVisitor 352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom{ 362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom private final ParameterVisitor parameterVisitor; 372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom /** 402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Creates a new AllParameterVisitor for the given parameter 412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * visitor. 422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */ 432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public AllParameterVisitor(ParameterVisitor parameterVisitor) 442270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom this.parameterVisitor = parameterVisitor; 462270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Implementations for MemberVisitor. 502270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 512270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public void visitProgramField(ProgramClass programClass, ProgramField programField) 522270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 532270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom visitFieldType(programClass, 542270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom programField, 552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom programField.referencedClass); 562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 592270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) 602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom visitFieldType(libraryClass, 622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom libraryField, 632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom libraryField.referencedClass); 642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) 682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom visitParameters(programClass, 702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom programMethod, 712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom programMethod.referencedClasses); 722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) 762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom visitParameters(libraryClass, 782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom libraryMethod, 792270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom libraryMethod.referencedClasses); 802270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 812270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 822270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 832270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Small utility methods. 842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom /** 862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Lets the parameter visitor visit the type of the given field. 872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */ 882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom private void visitFieldType(Clazz clazz, 892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom Field field, 902270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom Clazz referencedClass) 912270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom String descriptor = field.getDescriptor(clazz); 932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom parameterVisitor.visitParameter(clazz, 942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom field, 952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 0, 962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1, 972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 0, 982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom ClassUtil.internalTypeSize(descriptor), 992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom descriptor, 1002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom referencedClass); 1012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 1022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom /** 1052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Lets the parameter visitor visit the parameters of the given method. 1062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */ 1072270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom private void visitParameters(Clazz clazz, 1082270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom Method method, 1092270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom Clazz[] referencedClasses) 1102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1112270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom String descriptor = method.getDescriptor(clazz); 1122270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1132270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Count the number of parameters and their total size. 1142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int parameterCount = 0; 1152270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int parameterSize = 0; 1162270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1172270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int index = 1; 1182270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1192270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom loop: while (true) 1202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1212270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom char c = descriptor.charAt(index++); 1222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom switch (c) 1232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.TYPE_LONG: 1252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.TYPE_DOUBLE: 1262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Long and double primitive types. 1282270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom parameterSize++; 1292270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 1302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 1312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom default: 1322270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1332270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // All other primitive types. 1342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 1352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 1362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.TYPE_CLASS_START: 1372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Class types. 1392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Skip the class name. 1402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom index = descriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; 1412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 1422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 1432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.TYPE_ARRAY: 1442270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Array types. 1462270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Skip all array characters. 1472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom while ((c = descriptor.charAt(index++)) == ClassConstants.TYPE_ARRAY) {} 1482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if (c == ClassConstants.TYPE_CLASS_START) 1502270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1512270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Skip the class type. 1522270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom index = descriptor.indexOf(ClassConstants.TYPE_CLASS_END, index) + 1; 1532270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 1542270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 1552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 1562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.METHOD_ARGUMENTS_CLOSE: 1572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break loop; 1592270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 1602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 1612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom parameterCount++; 1632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom parameterSize++; 1642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 1652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Visit the parameters. 1672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int parameterIndex = 0; 1682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int parameterOffset = 0; 1692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int referenceClassIndex = 0; 1702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom index = 1; 1722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom while (true) 1742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int newIndex = index + 1; 1762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int thisParameterSize = 1; 1772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom Clazz referencedClass = null; 1782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 1792270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom char c = descriptor.charAt(index); 1802270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom switch (c) 1812270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1822270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.TYPE_LONG: 1832270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.TYPE_DOUBLE: 1842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Long and double primitive types. 1862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom thisParameterSize = 2; 1872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 1882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 1892270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom default: 1902270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1912270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // All other primitive types. 1922270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 1932270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 1942270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.TYPE_CLASS_START: 1952270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 1962270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Class types. 1972270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Skip the class name. 1982270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom newIndex = descriptor.indexOf(ClassConstants.TYPE_CLASS_END, newIndex) + 1; 1992270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom referencedClass = referencedClasses == null ? null : 2002270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom referencedClasses[referenceClassIndex++]; 2012270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 2022270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 2032270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.TYPE_ARRAY: 2042270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 2052270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Array types. 2062270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Skip all array characters. 2072270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom while ((c = descriptor.charAt(newIndex++)) == ClassConstants.TYPE_ARRAY) {} 2082270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 2092270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if (c == ClassConstants.TYPE_CLASS_START) 2102270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 2112270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Skip the class type. 2122270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom newIndex = descriptor.indexOf(ClassConstants.TYPE_CLASS_END, newIndex) + 1; 2132270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom referencedClass = referencedClasses == null ? null : 2142270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom referencedClasses[referenceClassIndex++]; 2152270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 2162270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom break; 2172270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 2182270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom case ClassConstants.METHOD_ARGUMENTS_CLOSE: 2192270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 2202270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // End of the method parameters. 2212270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return; 2222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 2232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 2242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 2252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom parameterVisitor.visitParameter(clazz, 2262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom method, 2272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom parameterIndex++, 2282270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom parameterCount, 2292270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom parameterOffset, 2302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom parameterSize, 2312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom descriptor.substring(index, newIndex), 2322270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom referencedClass); 2332270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 2342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Continue with the next parameter. 2352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom index = newIndex; 2362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom parameterOffset += thisParameterSize; 2372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 2382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 2392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom} 240