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