377096: fix for corrupt annotation creation
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ClassFile.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ClassFile.java
index 583eeaa..de217d5 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ClassFile.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ClassFile.java
@@ -20,6 +20,7 @@
* Bug 415399 - [1.8][compiler] Type annotations on constructor results dropped by the code generator
* Bug 415470 - [1.8][compiler] Type annotations on class declaration go vanishing
* Bug 405104 - [1.8][compiler][codegen] Implement support for serializeable lambdas
+ * Bug 434556 - Broken class file generated for incorrect annotation usage
*******************************************************************************/
package org.eclipse.jdt.internal.compiler;
@@ -2333,9 +2334,11 @@
NormalAnnotation normalAnnotation = (NormalAnnotation) annotation;
MemberValuePair[] memberValuePairs = normalAnnotation.memberValuePairs;
if (memberValuePairs != null) {
+ int memberValuePairsCount = 0;
+ int memberValuePairsLengthPosition = this.contentsOffset;
+ this.contentsOffset+=2; // leave space to fill in the pair count later
+ int resetPosition = this.contentsOffset;
final int memberValuePairsLength = memberValuePairs.length;
- this.contents[this.contentsOffset++] = (byte) (memberValuePairsLength >> 8);
- this.contents[this.contentsOffset++] = (byte) memberValuePairsLength;
for (int i = 0; i < memberValuePairsLength; i++) {
MemberValuePair memberValuePair = memberValuePairs[i];
if (this.contentsOffset + 2 >= this.contents.length) {
@@ -2346,17 +2349,21 @@
this.contents[this.contentsOffset++] = (byte) elementNameIndex;
MethodBinding methodBinding = memberValuePair.binding;
if (methodBinding == null) {
- this.contentsOffset = startingContentsOffset;
+ this.contentsOffset = resetPosition;
} else {
try {
generateElementValue(memberValuePair.value, methodBinding.returnType, startingContentsOffset);
+ memberValuePairsCount++;
+ resetPosition = this.contentsOffset;
} catch(ClassCastException e) {
- this.contentsOffset = startingContentsOffset;
+ this.contentsOffset = resetPosition;
} catch(ShouldNotImplement e) {
- this.contentsOffset = startingContentsOffset;
+ this.contentsOffset = resetPosition;
}
}
}
+ this.contents[memberValuePairsLengthPosition++] = (byte) (memberValuePairsCount >> 8);
+ this.contents[memberValuePairsLengthPosition++] = (byte) memberValuePairsCount;
} else {
this.contents[this.contentsOffset++] = 0;
this.contents[this.contentsOffset++] = 0;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java
index d10ce50..d041dec 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/LocalDeclaration.java
@@ -147,7 +147,7 @@
// if binding unused generate then discard the value
this.initialization.generateCode(currentScope, codeStream, true); // AspectJ: final param needs to be true (was false)
// new code:
- if ((binding.type == TypeBinding.LONG) || (binding.type == TypeBinding.DOUBLE)) {
+ if (TypeBinding.equalsEquals(this.binding.type,TypeBinding.LONG) || TypeBinding.equalsEquals(this.binding.type,TypeBinding.DOUBLE)) {
codeStream.pop2();
} else {
codeStream.pop();
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java
index f3de6bd..40a44be 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ParameterizedQualifiedTypeReference.java
@@ -227,7 +227,7 @@
}
ReferenceBinding currentType = (ReferenceBinding) this.resolvedType;
if (qualifyingType == null
- || (currentType.isMemberType() && qualifyingType!=currentType.enclosingType())) { // AspectJ Extension - pr235829
+ || (currentType.isMemberType() && TypeBinding.notEquals(qualifyingType,currentType.enclosingType()))) { // AspectJ Extension - pr235829
qualifyingType = currentType.enclosingType(); // if member type
if (qualifyingType != null) {
qualifyingType = currentType.isStatic()
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java
index 41b8a71..472e746 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/MethodBinding.java
@@ -334,7 +334,7 @@
// for protected we need to check based on the type of this
ReferenceBinding currentType = scope.enclosingSourceType(); //invocationType();// NewNew AspectJ Extension - was enclosingSourceType();
// MUST be in the same package as the invocationType though... (pr 71723)
- if (invocationType != currentType) {
+ if (TypeBinding.notEquals(invocationType,currentType)) {
// this MUST be an ITD
if (invocationType.fPackage != currentType.fPackage) return false;
}