1b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/* 2b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * ProGuard -- shrinking, optimization, obfuscation, and preverification 3b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * of Java bytecode. 4b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 5b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu) 6b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 7b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This program is free software; you can redistribute it and/or modify it 8b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * under the terms of the GNU General Public License as published by the Free 9b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Software Foundation; either version 2 of the License, or (at your option) 10b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * any later version. 11b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 12b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * This program is distributed in the hope that it will be useful, but WITHOUT 13b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 14b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 15b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * more details. 16b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 17b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * You should have received a copy of the GNU General Public License along 18b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * with this program; if not, write to the Free Software Foundation, Inc., 19b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 20b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 21b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpackage proguard.classfile.attribute; 22b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 23b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.*; 24b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangimport proguard.classfile.constant.visitor.ConstantVisitor; 25b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 26b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang/** 27b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Representation of a bootstrap method. 28b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * 29b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * @author Eric Lafortune 30b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 31b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wangpublic class BootstrapMethodInfo implements VisitorAccepter 32b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang{ 33b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public int u2methodHandleIndex; 34b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public int u2methodArgumentCount; 35b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public int[] u2methodArguments; 36b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 37b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 38b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * An extra field in which visitors can store information. 39b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 40b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public Object visitorInfo; 41b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 42b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 43b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 44b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Creates an uninitialized BootstrapMethodInfo. 45b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 46b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public BootstrapMethodInfo() 47b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 48b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 49b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 50b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 51b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 52b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Creates an initialized BootstrapMethodInfo. 53b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 54b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public BootstrapMethodInfo(int u2methodHandleIndex, 55b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int u2methodArgumentCount, 56b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang int[] u2methodArguments) 57b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 58b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang this.u2methodHandleIndex = u2methodHandleIndex; 59b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang this.u2methodArgumentCount = u2methodArgumentCount; 60b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang this.u2methodArguments = u2methodArguments; 61b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 62b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 63b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 64b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang /** 65b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * Applies the given constant pool visitor to the argument constants of the 66b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang * bootstrap method. 67b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang */ 68b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public void methodArgumentsAccept(Clazz clazz, ConstantVisitor constantVisitor) 69b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 70b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang for (int index = 0; index < u2methodArgumentCount; index++) 71b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 72b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang clazz.constantPoolEntryAccept(u2methodArguments[index], 73b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang constantVisitor); 74b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 75b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 76b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 77b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 78b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang // Implementations for VisitorAccepter. 79b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 80b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public Object getVisitorInfo() 81b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 82b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang return visitorInfo; 83b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 84b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang 85b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang public void setVisitorInfo(Object visitorInfo) 86b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang { 87b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang this.visitorInfo = visitorInfo; 88b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang } 89b9cc48a43ed984587c939d02fba5316bf5c0df6eYing Wang} 90