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.editor; 222270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 232270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.*; 242270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.attribute.*; 252270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.attribute.annotation.*; 262270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.attribute.annotation.visitor.*; 272270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.attribute.preverification.*; 282270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.attribute.preverification.visitor.*; 292270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.attribute.visitor.*; 302270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.constant.*; 312270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.constant.visitor.ConstantVisitor; 322270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.instruction.*; 332270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.instruction.visitor.InstructionVisitor; 342270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.util.SimplifiedVisitor; 352270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimport proguard.classfile.visitor.*; 362270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 372270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom/** 382270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * This ConstantVisitor remaps all possible indices of bootstrap methods 392270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * of the constants that it visits, based on a given index map. 402270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * 412270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * @author Eric Lafortune 422270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */ 432270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrompublic class BootstrapMethodRemapper 442270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromextends SimplifiedVisitor 452270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstromimplements ConstantVisitor 462270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom{ 472270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom private int[] constantIndexMap; 482270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 492270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 502270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom /** 512270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Sets the given mapping of old constant pool entry indexes to their new 522270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * indexes. 532270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */ 542270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public void setConstantIndexMap(int[] constantIndexMap) 552270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 562270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom this.constantIndexMap = constantIndexMap; 572270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 582270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 592270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 602270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Implementations for ConstantVisitor. 612270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 622270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public void visitAnyConstant(Clazz clazz, Constant constant) {} 632270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 642270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 652270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant) 662270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 672270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom invokeDynamicConstant.u2bootstrapMethodAttributeIndex = 682270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom remapConstantIndex(invokeDynamicConstant.u2bootstrapMethodAttributeIndex); 692270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 702270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 712270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 722270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom // Small utility methods. 732270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 742270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom /** 752270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * Returns the new bootstrap method index of the entry at the 762270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom * given index. 772270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom */ 782270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom private int remapConstantIndex(int constantIndex) 792270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 802270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom int remappedConstantIndex = constantIndexMap[constantIndex]; 812270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom if (remappedConstantIndex < 0) 822270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom { 832270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom throw new IllegalArgumentException("Can't remap constant index ["+constantIndex+"]"); 842270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 852270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom 862270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom return remappedConstantIndex; 872270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom } 882270795fbe0b277bfd49f40950ecaa78583175ccBrian Carlstrom} 89