Bug 390930 - [1.8] Update to ASM 5.x
Change-Id: I2a53eb4d4bb20b4f07a6e3dfa706ee71b41e2fd5
diff --git a/apitools/org.eclipse.pde.api.tools.generator/META-INF/MANIFEST.MF b/apitools/org.eclipse.pde.api.tools.generator/META-INF/MANIFEST.MF
index b80bc9e..22e912a 100644
--- a/apitools/org.eclipse.pde.api.tools.generator/META-INF/MANIFEST.MF
+++ b/apitools/org.eclipse.pde.api.tools.generator/META-INF/MANIFEST.MF
@@ -5,7 +5,7 @@
Bundle-Version: 1.0.200.qualifier
Bundle-Vendor: %providerName
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Require-Bundle: org.objectweb.asm;bundle-version="3.3.1",
+Require-Bundle: org.objectweb.asm;bundle-version="[5.0.0,6.0.0)",
org.eclipse.pde.api.tools;bundle-version="1.0.600",
org.eclipse.jdt.core;bundle-version="3.8.1",
org.eclipse.core.runtime;bundle-version="3.8.0"
diff --git a/apitools/org.eclipse.pde.api.tools.generator/src/org/eclipse/pde/api/tools/generator/EEGenerator.java b/apitools/org.eclipse.pde.api.tools.generator/src/org/eclipse/pde/api/tools/generator/EEGenerator.java
index 66a56a5..fa32d11 100644
--- a/apitools/org.eclipse.pde.api.tools.generator/src/org/eclipse/pde/api/tools/generator/EEGenerator.java
+++ b/apitools/org.eclipse.pde.api.tools.generator/src/org/eclipse/pde/api/tools/generator/EEGenerator.java
@@ -62,11 +62,10 @@
import org.eclipse.pde.api.tools.internal.provisional.ProfileModifiers;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Attribute;
-import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.MethodAdapter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.w3c.dom.DOMException;
@@ -1157,7 +1156,7 @@
/**
* Class adapter
*/
- static class StubClassAdapter extends ClassAdapter {
+ static class StubClassAdapter extends ClassVisitor {
static final int IGNORE_CLASS_FILE = 0x100;
int flags;
@@ -1170,7 +1169,7 @@
* @param stubtype
*/
public StubClassAdapter(Type stubtype) {
- super(new ClassWriter(0));
+ super(Opcodes.ASM5, new ClassWriter(0));
this.type = stubtype;
}
@@ -1261,7 +1260,7 @@
return null;
}
final StubMethod method = this.stub.addMethod(methodName, desc);
- return new MethodAdapter(super.visitMethod(access, methodName, desc, signature, exceptions)) {
+ return new MethodVisitor(Opcodes.ASM5, super.visitMethod(access, methodName, desc, signature, exceptions)) {
@Override
public AnnotationVisitor visitAnnotation(String sig, boolean visible) {
if (visible && "Ljava/lang/invoke/MethodHandle$PolymorphicSignature;".equals(sig)) { //$NON-NLS-1$
diff --git a/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF b/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF
index 6fc8aa5..5f6f25d 100644
--- a/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF
+++ b/apitools/org.eclipse.pde.api.tools.tests/META-INF/MANIFEST.MF
@@ -22,7 +22,7 @@
org.eclipse.jdt.core.tests.builder;bundle-version="[3.8.0,4.0.0)",
org.eclipse.jdt.core.tests.compiler;bundle-version="[3.8.0,4.0.0)",
org.eclipse.ant.core,
- org.objectweb.asm;bundle-version="[3.2.0,4.0.0)",
+ org.objectweb.asm;bundle-version="[5.0.0,6.0.0)",
org.eclipse.jface;bundle-version="3.8.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Export-Package: org.eclipse.pde.api.tools.anttasks.tests,
diff --git a/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF b/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF
index c19b26f..e7d7779 100644
--- a/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF
+++ b/apitools/org.eclipse.pde.api.tools/META-INF/MANIFEST.MF
@@ -14,7 +14,7 @@
org.eclipse.text;bundle-version="[3.4.0,4.0.0)",
org.eclipse.core.filebuffers;bundle-version="[3.4.0,4.0.0)",
org.eclipse.ant.core;bundle-version="[3.1.300,4.0.0)",
- org.objectweb.asm;bundle-version="[3.2.0,4.0.0)",
+ org.objectweb.asm;bundle-version="[5.0.0,6.0.0)",
org.eclipse.team.core;bundle-version="[3.4.0,4.0.0)",
org.eclipse.core.filesystem;bundle-version="[1.2.0,2.0.0)",
org.eclipse.equinox.frameworkadmin;bundle-version="[2.0.0,3.0.0)",
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java
index a706e0c..358df80 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/BaseApiAnalyzer.java
@@ -304,13 +304,19 @@
* current version of ASM. Checks the JDT core settings for class file +
* compiler options<br>
* <br>
- * Currently the unsupported bytecodes are Java 8 and greater
+ * For Luna there are no unsupported bytecodes, for Kepler, Java 8 is
+ * unsupported
*
* @return true if the backing project is configured to create bytecodes
* that are not supported
*/
private boolean unsupportedByteCodes() {
- return fJavaProject != null && JavaCore.VERSION_1_8.equals(fJavaProject.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, true)) && JavaCore.VERSION_1_8.equals(fJavaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true));
+ return false;
+ // fJavaProject != null &&
+ // JavaCore.VERSION_1_8.equals(fJavaProject.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM,
+ // true)) &&
+ // JavaCore.VERSION_1_8.equals(fJavaProject.getOption(JavaCore.COMPILER_COMPLIANCE,
+ // true));
}
/**
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceExtractor.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceExtractor.java
index 619d454..225758c 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceExtractor.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/ReferenceExtractor.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2013 IBM Corporation and others.
+ * Copyright (c) 2007, 2014 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -36,11 +36,10 @@
import org.eclipse.pde.api.tools.internal.util.Util;
import org.objectweb.asm.AnnotationVisitor;
import org.objectweb.asm.Attribute;
-import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodAdapter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
@@ -53,7 +52,7 @@
*
* @since 1.0.0
*/
-public class ReferenceExtractor extends ClassAdapter {
+public class ReferenceExtractor extends ClassVisitor {
/**
* A visitor for visiting java 5+ signatures
@@ -66,7 +65,7 @@
* visitArrayType | (visitClassType visitTypeArgument* (visitInnerClassType
* visitTypeArgument* )* visitEnd</tt> ) )
*/
- class ClassFileSignatureVisitor implements SignatureVisitor {
+ class ClassFileSignatureVisitor extends SignatureVisitor {
protected int kind = -1;
protected int originalkind = -1;
@@ -77,6 +76,7 @@
protected List<Reference> references;
public ClassFileSignatureVisitor() {
+ super(Opcodes.ASM5);
this.references = new ArrayList<Reference>();
}
@@ -288,7 +288,7 @@
* visit<i>X</i>Insn | visitLabel | visitTryCatchBlock | visitLocalVariable
* | visitLineNumber)* visitMaxs ] visitEnd
*/
- class ClassFileMethodVisitor extends MethodAdapter {
+ class ClassFileMethodVisitor extends MethodVisitor {
int argumentcount = 0;
LinePositionTracker linePositionTracker;
/**
@@ -309,7 +309,7 @@
* @param mv
*/
public ClassFileMethodVisitor(MethodVisitor mv, String name, int argumentcount) {
- super(mv);
+ super(Opcodes.ASM5, mv);
this.argumentcount = argumentcount;
this.linePositionTracker = new LinePositionTracker();
this.lastLineNumber = -1;
@@ -704,7 +704,11 @@
*
* @since 1.0.600
*/
- class ClassFileFieldVisitor implements FieldVisitor {
+ class ClassFileFieldVisitor extends FieldVisitor {
+
+ ClassFileFieldVisitor() {
+ super(Opcodes.ASM5);
+ }
/*
* (non-Javadoc)
@@ -1078,7 +1082,7 @@
* {@link ReferenceModifiers}
*/
public ReferenceExtractor(IApiType type, Set<Reference> collector, int referenceKinds) {
- super(new ClassNode());
+ super(Opcodes.ASM5, new ClassNode());
fType = type;
this.collector = collector;
fReferenceKinds = referenceKinds;
@@ -1095,7 +1099,7 @@
* @param tracker
*/
protected ReferenceExtractor(IApiType type, Set<Reference> collector, int referenceKinds, FieldTracker tracker) {
- super(new ClassNode());
+ super(Opcodes.ASM5, new ClassNode());
fType = type;
this.collector = collector;
fReferenceKinds = referenceKinds;
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/comparator/SignatureDecoder.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/comparator/SignatureDecoder.java
index 8b5f353..d33c6d7 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/comparator/SignatureDecoder.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/comparator/SignatureDecoder.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2013 IBM Corporation and others.
+ * Copyright (c) 2007, 2014 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -10,12 +10,13 @@
*******************************************************************************/
package org.eclipse.pde.api.tools.internal.comparator;
+import org.objectweb.asm.Opcodes;
import org.objectweb.asm.signature.SignatureVisitor;
/**
* This class is used to decode a generic signature for class or method
*/
-final class SignatureDecoder implements SignatureVisitor {
+final class SignatureDecoder extends SignatureVisitor {
static final int CLASS_BOUND = 1;
static final int DEFAULT = 0;
static final int INTERFACE_BOUND = 2;
@@ -28,6 +29,7 @@
SignatureDescriptor signatureDescriptor;
public SignatureDecoder(SignatureDescriptor signatureDescriptor) {
+ super(Opcodes.ASM5);
this.signatureDescriptor = signatureDescriptor;
}
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/TypeStructureBuilder.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/TypeStructureBuilder.java
index 41ba0de..42a019d 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/TypeStructureBuilder.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/model/TypeStructureBuilder.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2007, 2013 IBM Corporation and others.
+ * Copyright (c) 2007, 2014 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -14,8 +14,6 @@
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
@@ -30,21 +28,18 @@
import org.eclipse.pde.api.tools.internal.provisional.model.IApiType;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiTypeRoot;
import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodAdapter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.ClassNode;
-import org.objectweb.asm.util.TraceAnnotationVisitor;
/**
* Class adapter used to create an API type structure
*/
-public class TypeStructureBuilder extends ClassAdapter {
+public class TypeStructureBuilder extends ClassVisitor {
ApiType fType;
IApiComponent fComponent;
IApiTypeRoot fFile;
@@ -59,14 +54,15 @@
* unknown
*/
TypeStructureBuilder(ClassVisitor cv, IApiComponent component, IApiTypeRoot file) {
- super(cv);
+ super(Opcodes.ASM5, cv);
fComponent = component;
fFile = file;
}
- /**
- * @see org.objectweb.asm.ClassAdapter#visit(int, int, java.lang.String,
- * java.lang.String, java.lang.String, java.lang.String[])
+ /*
+ * (non-Javadoc)
+ * @see org.objectweb.asm.ClassVisitor#visit(int, int, java.lang.String,
+ * java.lang.String, java.lang.String, java.lang.String[])
*/
@Override
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
@@ -100,9 +96,10 @@
super.visit(version, laccess, name, signature, superName, interfaces);
}
- /**
- * @see org.objectweb.asm.ClassAdapter#visitInnerClass(java.lang.String,
- * java.lang.String, java.lang.String, int)
+ /*
+ * (non-Javadoc)
+ * @see org.objectweb.asm.ClassVisitor#visitInnerClass(java.lang.String,
+ * java.lang.String, java.lang.String, int)
*/
@Override
public void visitInnerClass(String name, String outerName, String innerName, int access) {
@@ -135,7 +132,7 @@
/*
* (non-Javadoc)
- * @see org.objectweb.asm.ClassAdapter#visitOuterClass(java.lang.String,
+ * @see org.objectweb.asm.ClassVisitor#visitOuterClass(java.lang.String,
* java.lang.String, java.lang.String)
*/
@Override
@@ -145,7 +142,7 @@
/*
* (non-Javadoc)
- * @see org.objectweb.asm.ClassAdapter#visitField(int, java.lang.String,
+ * @see org.objectweb.asm.ClassVisitor#visitField(int, java.lang.String,
* java.lang.String, java.lang.String, java.lang.Object)
*/
@Override
@@ -161,7 +158,7 @@
/*
* (non-Javadoc)
- * @see org.objectweb.asm.ClassAdapter#visitMethod(int, java.lang.String,
+ * @see org.objectweb.asm.ClassVisitor#visitMethod(int, java.lang.String,
* java.lang.String, java.lang.String, java.lang.String[])
*/
@Override
@@ -179,7 +176,7 @@
}
}
final ApiMethod method = fType.addMethod(name, desc, signature, laccess, names);
- return new MethodAdapter(super.visitMethod(laccess, name, desc, signature, exceptions)) {
+ return new MethodVisitor(Opcodes.ASM5, super.visitMethod(laccess, name, desc, signature, exceptions)) {
@Override
public AnnotationVisitor visitAnnotation(String sig, boolean visible) {
if (visible && "Ljava/lang/invoke/MethodHandle$PolymorphicSignature;".equals(sig)) { //$NON-NLS-1$
@@ -190,23 +187,88 @@
@Override
public AnnotationVisitor visitAnnotationDefault() {
- return new TraceAnnotationVisitor() {
- @Override
- public void visitEnd() {
- super.visitEnd();
- StringWriter stringWriter = new StringWriter();
- PrintWriter writer = new PrintWriter(stringWriter);
- print(writer);
- writer.flush();
- writer.close();
- String def = String.valueOf(stringWriter.getBuffer());
- method.setDefaultValue(def);
- }
- };
+ return new AnnotationDefaultVisitor(method);
}
};
}
+ private static IApiType logAndReturn(IApiTypeRoot file, Exception e) {
+ if (ApiPlugin.DEBUG_BUILDER) {
+ IStatus status = new Status(IStatus.ERROR, ApiPlugin.PLUGIN_ID, NLS.bind(Messages.TypeStructureBuilder_badClassFileEncountered, file.getTypeName()), e);
+ ApiPlugin.log(status);
+ }
+ return null;
+ }
+
+ /**
+ * Visit the default value for an annotation
+ */
+ static class AnnotationDefaultVisitor extends AnnotationVisitor {
+ ApiMethod method;
+ Object value;
+ StringBuffer buff = new StringBuffer();
+ boolean trace = false;
+ int traceCount = 0;
+
+ public AnnotationDefaultVisitor(ApiMethod method) {
+ super(Opcodes.ASM5);
+ this.method = method;
+ }
+
+ @Override
+ public void visit(String name, Object value) {
+ if (trace) {
+ appendValue(value);
+ traceCount++;
+ return;
+ }
+ this.value = value;
+ }
+
+ @Override
+ public AnnotationVisitor visitAnnotation(String name, String desc) {
+ trace = true;
+ return this;
+ }
+
+ @Override
+ public void visitEnum(String name, String desc, String value) {
+ if (trace) {
+ appendValue(value);
+ traceCount++;
+ return;
+ }
+ this.value = value;
+ }
+
+ @Override
+ public AnnotationVisitor visitArray(String name) {
+ trace = true;
+ return this;
+ }
+
+ @Override
+ public void visitEnd() {
+ if (trace) {
+ this.value = buff.toString();
+ traceCount--;
+ trace = traceCount != 0;
+ } else {
+ method.setDefaultValue(this.value == null ? null : this.value.toString());
+ }
+ }
+
+ void appendValue(Object val) {
+ if (val != null) {
+ if (buff.length() < 1) {
+ buff.append(val.toString());
+ } else {
+ buff.append(',').append(val.toString());
+ }
+ }
+ }
+ }
+
/**
* Builds a type structure with the given .class file bytes in the specified
* API component.
@@ -222,11 +284,11 @@
ClassReader classReader = new ClassReader(bytes);
classReader.accept(visitor, ClassReader.SKIP_CODE | ClassReader.SKIP_FRAMES);
} catch (ArrayIndexOutOfBoundsException e) {
- if (ApiPlugin.DEBUG_BUILDER) {
- IStatus status = new Status(IStatus.ERROR, ApiPlugin.PLUGIN_ID, NLS.bind(Messages.TypeStructureBuilder_badClassFileEncountered, file.getTypeName()), e);
- ApiPlugin.log(status);
- }
+ logAndReturn(file, e);
return null;
+ } catch (IllegalArgumentException iae) {
+ // thrown from ASM 5.0 for bad bytecodes
+ return logAndReturn(file, iae);
}
return visitor.fType;
}
@@ -260,14 +322,14 @@
}
}
- static class EnclosingMethodSetter extends ClassAdapter {
+ static class EnclosingMethodSetter extends ClassVisitor {
String name;
String signature;
boolean found = false;
String typeName;
public EnclosingMethodSetter(ClassVisitor cv, String typeName) {
- super(cv);
+ super(Opcodes.ASM5, cv);
this.typeName = typeName.replace('.', '/');
}
@@ -296,11 +358,11 @@
}
}
- static class TypeNameFinder extends MethodAdapter {
+ static class TypeNameFinder extends MethodVisitor {
protected EnclosingMethodSetter setter;
public TypeNameFinder(MethodVisitor mv, EnclosingMethodSetter enclosingMethodSetter) {
- super(mv);
+ super(Opcodes.ASM5, mv);
this.setter = enclosingMethodSetter;
}