summaryrefslogtreecommitdiff
path: root/src/proguard/classfile/editor/ConstantAdder.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/proguard/classfile/editor/ConstantAdder.java')
-rw-r--r--src/proguard/classfile/editor/ConstantAdder.java28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/proguard/classfile/editor/ConstantAdder.java b/src/proguard/classfile/editor/ConstantAdder.java
index 9d20199..9f326ad 100644
--- a/src/proguard/classfile/editor/ConstantAdder.java
+++ b/src/proguard/classfile/editor/ConstantAdder.java
@@ -2,7 +2,7 @@
* ProGuard -- shrinking, optimization, obfuscation, and preverification
* of Java bytecode.
*
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
@@ -21,20 +21,24 @@
package proguard.classfile.editor;
import proguard.classfile.*;
+import proguard.classfile.attribute.*;
import proguard.classfile.constant.*;
import proguard.classfile.constant.visitor.ConstantVisitor;
-import proguard.util.ListUtil;
/**
* This ConstantVisitor adds all constants that it visits to the constant pool
* of a given target class.
*
+ * Bootstrap methods attributes are automatically updated for invokedynamic
+ * constants.
+ *
* @author Eric Lafortune
*/
public class ConstantAdder
implements ConstantVisitor
{
- private final ConstantPoolEditor constantPoolEditor;
+ private final ConstantPoolEditor constantPoolEditor;
+ private final BootstrapMethodsAttributeAdder bootstrapMethodsAttributeAdder;
private int constantIndex;
@@ -45,7 +49,8 @@ implements ConstantVisitor
*/
public ConstantAdder(ProgramClass targetClass)
{
- constantPoolEditor = new ConstantPoolEditor(targetClass);
+ constantPoolEditor = new ConstantPoolEditor(targetClass);
+ bootstrapMethodsAttributeAdder = new BootstrapMethodsAttributeAdder(targetClass);
}
@@ -131,7 +136,14 @@ implements ConstantVisitor
public void visitInvokeDynamicConstant(Clazz clazz, InvokeDynamicConstant invokeDynamicConstant)
{
- // First add the name and type constant.
+ // Find the bootstrap methods attribute.
+ AttributesEditor attributesEditor =
+ new AttributesEditor((ProgramClass)clazz, false);
+
+ BootstrapMethodsAttribute bootstrapMethodsAttribute =
+ (BootstrapMethodsAttribute)attributesEditor.findAttribute(ClassConstants.ATTR_BootstrapMethods);
+
+ // Add the name and type constant.
clazz.constantPoolEntryAccept(invokeDynamicConstant.u2nameAndTypeIndex, this);
// Copy the referenced classes.
@@ -145,9 +157,13 @@ implements ConstantVisitor
referencedClasses.length);
}
+ bootstrapMethodsAttribute.bootstrapMethodEntryAccept(clazz,
+ invokeDynamicConstant.getBootstrapMethodAttributeIndex(),
+ bootstrapMethodsAttributeAdder);
+
// Then add the actual invoke dynamic constant.
constantIndex =
- constantPoolEditor.addInvokeDynamicConstant(invokeDynamicConstant.getBootstrapMethodAttributeIndex(),
+ constantPoolEditor.addInvokeDynamicConstant(bootstrapMethodsAttributeAdder.getBootstrapMethodIndex(),
constantIndex,
referencedClassesCopy);
}