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