View | Details | Raw Unified | Return to bug 162296 | Differences between
and this patch

Collapse All | Expand All

(-)compiler/org/eclipse/jdt/internal/compiler/ClassFile.java (-3 / +1 lines)
Lines 544-552 Link Here
544
				}
544
				}
545
				// access flag
545
				// access flag
546
				if (innerClass.isAnonymousType()) {
546
				if (innerClass.isAnonymousType()) {
547
					accessFlags |= ClassFileConstants.AccPrivate;
547
					accessFlags &= ~ClassFileConstants.AccFinal;
548
				} else if (innerClass.isLocalType() && !innerClass.isMemberType()) {
549
					accessFlags |= ClassFileConstants.AccPrivate;
550
				} else if (innerClass.isMemberType() && innerClass.isInterface()) {
548
				} else if (innerClass.isMemberType() && innerClass.isInterface()) {
551
					accessFlags |= ClassFileConstants.AccStatic; // implicitely static
549
					accessFlags |= ClassFileConstants.AccStatic; // implicitely static
552
				}
550
				}
(-)model/org/eclipse/jdt/internal/core/util/Disassembler.java (-244 / +202 lines)
Lines 27-32 Link Here
27
	private static final String EMPTY_OUTPUT = ""; //$NON-NLS-1$
27
	private static final String EMPTY_OUTPUT = ""; //$NON-NLS-1$
28
	private static final String VERSION_UNKNOWN = Messages.classfileformat_versionUnknown;
28
	private static final String VERSION_UNKNOWN = Messages.classfileformat_versionUnknown;
29
29
30
	private boolean appendModifier(StringBuffer buffer, int accessFlags, int modifierConstant, String modifier, boolean firstModifier) {
31
		if ((accessFlags & modifierConstant) != 0) {
32
			if (!firstModifier) {
33
				buffer.append(Messages.disassembler_space); 
34
			}
35
			if (firstModifier) {
36
				firstModifier = false;
37
			}
38
			buffer.append(modifier);
39
		}
40
		return firstModifier;
41
	}
42
	
43
	private void decodeModifiers(StringBuffer buffer, int accessFlags, int[] checkBits) {
44
		decodeModifiers(buffer, accessFlags, false, false, checkBits);
45
	}
46
	
47
	private void decodeModifiers(StringBuffer buffer, int accessFlags, boolean printDefault, boolean asBridge, int[] checkBits) {
48
		if (checkBits == null) return;
49
		boolean firstModifier = true;
50
		for (int i = 0, max = checkBits.length; i < max; i++) {
51
			switch(checkBits[i]) {
52
				case IModifierConstants.ACC_PUBLIC :
53
					firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PUBLIC, "public", firstModifier); //$NON-NLS-1$
54
					break;
55
				case IModifierConstants.ACC_PROTECTED :
56
					firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PROTECTED, "protected", firstModifier); //$NON-NLS-1$
57
					break;
58
				case IModifierConstants.ACC_PRIVATE :
59
					firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PRIVATE, "private", firstModifier); //$NON-NLS-1$
60
					break;
61
				case IModifierConstants.ACC_ABSTRACT :
62
					firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_ABSTRACT, "abstract", firstModifier); //$NON-NLS-1$
63
					break;
64
				case IModifierConstants.ACC_STATIC :
65
					firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_STATIC, "static", firstModifier); //$NON-NLS-1$
66
					break;
67
				case IModifierConstants.ACC_FINAL :
68
					firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_FINAL, "final", firstModifier); //$NON-NLS-1$
69
					break;
70
				case IModifierConstants.ACC_SYNCHRONIZED :
71
					firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_SYNCHRONIZED, "synchronized", firstModifier); //$NON-NLS-1$
72
					break;
73
				case IModifierConstants.ACC_NATIVE :
74
					firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_NATIVE, "native", firstModifier); //$NON-NLS-1$
75
					break;
76
				case IModifierConstants.ACC_STRICT :
77
					firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_STRICT, "strictfp", firstModifier); //$NON-NLS-1$
78
					break;
79
				case IModifierConstants.ACC_TRANSIENT :
80
					firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_TRANSIENT, "transient", firstModifier); //$NON-NLS-1$
81
					break;
82
				case IModifierConstants.ACC_VOLATILE :
83
				// case IModifierConstants.ACC_BRIDGE :
84
					if (asBridge) {
85
						firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_BRIDGE, "bridge", firstModifier); //$NON-NLS-1$
86
					} else {
87
						firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_VOLATILE, "volatile", firstModifier); //$NON-NLS-1$
88
					}
89
					break;
90
				case IModifierConstants.ACC_ENUM :
91
					firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_ENUM, "enum", firstModifier); //$NON-NLS-1$
92
					break;
93
			}
94
		}
95
		if (!firstModifier) {
96
			if (!printDefault) buffer.append(Messages.disassembler_space); 
97
		} else if (printDefault) {
98
			// no modifier: package default visibility
99
			buffer.append("default"); //$NON-NLS-1$
100
		}
101
	}
102
	
103
	private void decodeModifiersForField(StringBuffer buffer, int accessFlags) {
104
		decodeModifiers(buffer, accessFlags, new int[] {
105
				IModifierConstants.ACC_PUBLIC,
106
				IModifierConstants.ACC_PROTECTED,
107
				IModifierConstants.ACC_PRIVATE,
108
				IModifierConstants.ACC_STATIC,
109
				IModifierConstants.ACC_FINAL,
110
				IModifierConstants.ACC_TRANSIENT,
111
				IModifierConstants.ACC_VOLATILE,
112
				IModifierConstants.ACC_ENUM
113
		});
114
	}
115
116
	private void decodeModifiersForFieldForWorkingCopy(StringBuffer buffer, int accessFlags) {
117
		decodeModifiers(buffer, accessFlags, new int[] {
118
				IModifierConstants.ACC_PUBLIC,
119
				IModifierConstants.ACC_PROTECTED,
120
				IModifierConstants.ACC_PRIVATE,
121
				IModifierConstants.ACC_STATIC,
122
				IModifierConstants.ACC_FINAL,
123
				IModifierConstants.ACC_TRANSIENT,
124
				IModifierConstants.ACC_VOLATILE,
125
		});
126
	}	
127
	
128
	private final void decodeModifiersForInnerClasses(StringBuffer buffer, int accessFlags, boolean printDefault) {
129
		decodeModifiers(buffer, accessFlags, printDefault, false, new int[] {
130
				IModifierConstants.ACC_PUBLIC,
131
				IModifierConstants.ACC_PROTECTED,
132
				IModifierConstants.ACC_PRIVATE,
133
				IModifierConstants.ACC_ABSTRACT,
134
				IModifierConstants.ACC_STATIC,
135
				IModifierConstants.ACC_FINAL,
136
		});
137
	}
138
139
	private final void decodeModifiersForMethod(StringBuffer buffer, int accessFlags) {
140
		decodeModifiers(buffer, accessFlags, false, true, new int[] {
141
				IModifierConstants.ACC_PUBLIC,
142
				IModifierConstants.ACC_PROTECTED,
143
				IModifierConstants.ACC_PRIVATE,
144
				IModifierConstants.ACC_ABSTRACT,
145
				IModifierConstants.ACC_STATIC,
146
				IModifierConstants.ACC_FINAL,
147
				IModifierConstants.ACC_SYNCHRONIZED,
148
				IModifierConstants.ACC_NATIVE,
149
				IModifierConstants.ACC_STRICT,
150
				IModifierConstants.ACC_BRIDGE,
151
		});
152
	}
153
154
	private final void decodeModifiersForType(StringBuffer buffer, int accessFlags) {
155
		decodeModifiers(buffer, accessFlags, new int[] {
156
				IModifierConstants.ACC_PUBLIC,
157
				IModifierConstants.ACC_ABSTRACT,
158
				IModifierConstants.ACC_FINAL,
159
		});
160
	}
30
	public static String escapeString(String s) {
161
	public static String escapeString(String s) {
31
		StringBuffer buffer = new StringBuffer();
162
		StringBuffer buffer = new StringBuffer();
32
		for (int i = 0, max = s.length(); i < max; i++) {
163
		for (int i = 0, max = s.length(); i < max; i++) {
Lines 77-165 Link Here
77
		}
208
		}
78
		return buffer.toString();
209
		return buffer.toString();
79
	}
210
	}
80
	private boolean appendModifier(StringBuffer buffer, int accessFlags, int modifierConstant, String modifier, boolean firstModifier) {
81
		if ((accessFlags & modifierConstant) != 0) {		
82
			if (!firstModifier) {
83
				buffer.append(Messages.disassembler_space); 
84
			}
85
			if (firstModifier) {
86
				firstModifier = false;
87
			}
88
			buffer.append(modifier);
89
		}
90
		return firstModifier;
91
	}
92
	
93
	private void decodeModifiersForField(StringBuffer buffer, int accessFlags) {
94
		boolean firstModifier = true;
95
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PUBLIC, "public", firstModifier); //$NON-NLS-1$
96
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PROTECTED, "protected", firstModifier); //$NON-NLS-1$
97
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PRIVATE, "private", firstModifier); //$NON-NLS-1$
98
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_STATIC, "static", firstModifier); //$NON-NLS-1$
99
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_FINAL, "final", firstModifier); //$NON-NLS-1$
100
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_TRANSIENT, "transient", firstModifier); //$NON-NLS-1$
101
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_VOLATILE, "volatile", firstModifier); //$NON-NLS-1$
102
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_ENUM, "enum", firstModifier); //$NON-NLS-1$
103
		if (!firstModifier) {
104
			buffer.append(Messages.disassembler_space); 
105
		}
106
	}	
107
108
	private void decodeModifiersForFieldForWorkingCopy(StringBuffer buffer, int accessFlags) {
109
		boolean firstModifier = true;
110
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PUBLIC, "public", firstModifier); //$NON-NLS-1$
111
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PROTECTED, "protected", firstModifier); //$NON-NLS-1$
112
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PRIVATE, "private", firstModifier); //$NON-NLS-1$
113
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_STATIC, "static", firstModifier); //$NON-NLS-1$
114
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_FINAL, "final", firstModifier); //$NON-NLS-1$
115
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_TRANSIENT, "transient", firstModifier); //$NON-NLS-1$
116
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_VOLATILE, "volatile", firstModifier); //$NON-NLS-1$
117
		if (!firstModifier) {
118
			buffer.append(Messages.disassembler_space); 
119
		}
120
	}	
121
	
122
	private final void decodeModifiersForInnerClasses(StringBuffer buffer, int accessFlags) {
123
		boolean firstModifier = true;
124
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PUBLIC, "public", firstModifier); //$NON-NLS-1$
125
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PROTECTED, "protected", firstModifier); //$NON-NLS-1$
126
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PRIVATE, "private", firstModifier); //$NON-NLS-1$
127
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_ABSTRACT, "abstract", firstModifier); //$NON-NLS-1$
128
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_STATIC, "static", firstModifier); //$NON-NLS-1$
129
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_FINAL, "final", firstModifier); //$NON-NLS-1$
130
		if (!firstModifier) {
131
			buffer.append(Messages.disassembler_space); 
132
		}
133
	}
134
211
135
	private final void decodeModifiersForMethod(StringBuffer buffer, int accessFlags) {
212
	static String decodeStringValue(char[] chars) {
136
		boolean firstModifier = true;
137
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PUBLIC, "public", firstModifier); //$NON-NLS-1$
138
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PROTECTED, "protected", firstModifier); //$NON-NLS-1$
139
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PRIVATE, "private", firstModifier); //$NON-NLS-1$
140
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_ABSTRACT, "abstract", firstModifier); //$NON-NLS-1$
141
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_STATIC, "static", firstModifier); //$NON-NLS-1$
142
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_FINAL, "final", firstModifier); //$NON-NLS-1$
143
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_SYNCHRONIZED, "synchronized", firstModifier); //$NON-NLS-1$
144
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_NATIVE, "native", firstModifier); //$NON-NLS-1$
145
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_STRICT, "strictfp", firstModifier); //$NON-NLS-1$
146
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_BRIDGE, "bridge", firstModifier); //$NON-NLS-1$
147
		if (!firstModifier) {
148
			buffer.append(Messages.disassembler_space); 
149
		}
150
	}
151
152
	private final void decodeModifiersForType(StringBuffer buffer, int accessFlags) {
153
		boolean firstModifier = true;
154
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_PUBLIC, "public", firstModifier); //$NON-NLS-1$
155
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_ABSTRACT, "abstract", firstModifier); //$NON-NLS-1$
156
		firstModifier = appendModifier(buffer, accessFlags, IModifierConstants.ACC_FINAL, "final", firstModifier); //$NON-NLS-1$
157
		if (!firstModifier) {
158
			buffer.append(Messages.disassembler_space); 
159
		}
160
	}
161
162
	private String decodeStringValue(char[] chars) {
163
		StringBuffer buffer = new StringBuffer();
213
		StringBuffer buffer = new StringBuffer();
164
		for (int i = 0, max = chars.length; i < max; i++) {
214
		for (int i = 0, max = chars.length; i < max; i++) {
165
			char c = chars[i];
215
			char c = chars[i];
Lines 179-193 Link Here
179
				case '\r' :
229
				case '\r' :
180
					buffer.append("\\r"); //$NON-NLS-1$
230
					buffer.append("\\r"); //$NON-NLS-1$
181
					break;
231
					break;
182
				case '\"':
183
					buffer.append("\\\""); //$NON-NLS-1$
184
					break;
185
				case '\'':
186
					buffer.append("\\\'"); //$NON-NLS-1$
187
					break;
188
				case '\\':
189
					buffer.append("\\\\"); //$NON-NLS-1$
190
					break;
191
				case '\0' :
232
				case '\0' :
192
					buffer.append("\\0"); //$NON-NLS-1$
233
					buffer.append("\\0"); //$NON-NLS-1$
193
					break;
234
					break;
Lines 219-225 Link Here
219
		return buffer.toString();
260
		return buffer.toString();
220
	}
261
	}
221
262
222
	private String decodeStringValue(String s) {
263
	static String decodeStringValue(String s) {
223
		return decodeStringValue(s.toCharArray());
264
		return decodeStringValue(s.toCharArray());
224
	}
265
	}
225
266
Lines 397-413 Link Here
397
			buffer.append(" throws "); //$NON-NLS-1$
438
			buffer.append(" throws "); //$NON-NLS-1$
398
			char[][] exceptionNames = exceptionAttribute.getExceptionNames();
439
			char[][] exceptionNames = exceptionAttribute.getExceptionNames();
399
			int length = exceptionNames.length;
440
			int length = exceptionNames.length;
400
			for (int i = 0; i < length - 1; i++) {
441
			for (int i = 0; i < length; i++) {
442
				if (i != 0) {
443
					buffer
444
    					.append(Messages.disassembler_comma)
445
    					.append(Messages.disassembler_space);
446
				}
401
				char[] exceptionName = exceptionNames[i];
447
				char[] exceptionName = exceptionNames[i];
402
				CharOperation.replace(exceptionName, '/', '.');
448
				CharOperation.replace(exceptionName, '/', '.');
403
				buffer
449
				buffer.append(returnClassName(exceptionName, '.', mode));
404
					.append(returnClassName(exceptionName, '.', mode))
450
			}
405
					.append(Messages.disassembler_comma)
406
					.append(Messages.disassembler_space); 
407
			}
408
			char[] exceptionName = exceptionNames[length - 1];
409
			CharOperation.replace(exceptionName, '/', '.');
410
			buffer.append(returnClassName(exceptionName, '.', mode));
411
		}
451
		}
412
		if (((accessFlags & IModifierConstants.ACC_NATIVE) == 0)
452
		if (((accessFlags & IModifierConstants.ACC_NATIVE) == 0)
413
				&& ((accessFlags & IModifierConstants.ACC_ABSTRACT) == 0)) {
453
				&& ((accessFlags & IModifierConstants.ACC_ABSTRACT) == 0)) {
Lines 530-546 Link Here
530
			buffer.append(" throws "); //$NON-NLS-1$
570
			buffer.append(" throws "); //$NON-NLS-1$
531
			char[][] exceptionNames = exceptionAttribute.getExceptionNames();
571
			char[][] exceptionNames = exceptionAttribute.getExceptionNames();
532
			int length = exceptionNames.length;
572
			int length = exceptionNames.length;
533
			for (int i = 0; i < length - 1; i++) {
573
			for (int i = 0; i < length; i++) {
574
				if (i != 0) {
575
					buffer
576
						.append(Messages.disassembler_comma)
577
						.append(Messages.disassembler_space);
578
				}
534
				char[] exceptionName = exceptionNames[i];
579
				char[] exceptionName = exceptionNames[i];
535
				CharOperation.replace(exceptionName, '/', '.');
580
				CharOperation.replace(exceptionName, '/', '.');
536
				buffer
581
				buffer.append(returnClassName(exceptionName, '.', mode));
537
					.append(returnClassName(exceptionName, '.', mode))
582
			}
538
					.append(Messages.disassembler_comma)
539
					.append(Messages.disassembler_space); 
540
			}
541
			char[] exceptionName = exceptionNames[length - 1];
542
			CharOperation.replace(exceptionName, '/', '.');
543
			buffer.append(returnClassName(exceptionName, '.', mode));
544
		}
583
		}
545
		if (checkMode(mode, DETAILED)) {
584
		if (checkMode(mode, DETAILED)) {
546
			if (annotationDefaultAttribute != null) {
585
			if (annotationDefaultAttribute != null) {
Lines 748-754 Link Here
748
					char[] innerClassName = entry.getInnerClassName();
787
					char[] innerClassName = entry.getInnerClassName();
749
					if (innerClassName != null) {
788
					if (innerClassName != null) {
750
						if (CharOperation.equals(classFileReader.getClassName(), innerClassName)) {
789
						if (CharOperation.equals(classFileReader.getClassName(), innerClassName)) {
751
							decodeModifiersForInnerClasses(buffer, entry.getAccessFlags());
790
							decodeModifiersForInnerClasses(buffer, entry.getAccessFlags(), false);
752
							decoded = true;
791
							decoded = true;
753
						}
792
						}
754
					}
793
					}
Lines 806-822 Link Here
806
				} else {
845
				} else {
807
					buffer.append(" implements "); //$NON-NLS-1$
846
					buffer.append(" implements "); //$NON-NLS-1$
808
				}
847
				}
809
				for (int i = 0; i < length - 1; i++) {
848
				for (int i = 0; i < length; i++) {
849
					if (i != 0) {
850
						buffer
851
							.append(Messages.disassembler_comma)
852
							.append(Messages.disassembler_space); 
853
					}
810
					char[] superinterface = superclassInterfaces[i];
854
					char[] superinterface = superclassInterfaces[i];
811
					CharOperation.replace(superinterface, '/', '.');
855
					CharOperation.replace(superinterface, '/', '.');
812
					buffer
856
					buffer
813
						.append(returnClassName(superinterface, '.', mode))
857
						.append(returnClassName(superinterface, '.', mode));
814
						.append(Messages.disassembler_comma)
815
						.append(Messages.disassembler_space); 
816
				}
858
				}
817
				char[] superinterface = superclassInterfaces[length - 1];
818
				CharOperation.replace(superinterface, '/', '.');
819
				buffer.append(returnClassName(superinterface, '.', mode));
820
			}
859
			}
821
		}
860
		}
822
		buffer.append(Messages.bind(Messages.disassembler_opentypedeclaration)); 
861
		buffer.append(Messages.bind(Messages.disassembler_opentypedeclaration)); 
Lines 886-891 Link Here
886
		if (typeParametersLength != 0) {
925
		if (typeParametersLength != 0) {
887
			buffer.append('<');
926
			buffer.append('<');
888
			for (int i = 0; i < typeParametersLength; i++) {
927
			for (int i = 0; i < typeParametersLength; i++) {
928
				if (i != 0) {
929
					buffer.append(Messages.disassembler_comma);
930
				}
889
				// extract the name
931
				// extract the name
890
				buffer.append(typeParameters[i], 0, CharOperation.indexOf(':', typeParameters[i]));
932
				buffer.append(typeParameters[i], 0, CharOperation.indexOf(':', typeParameters[i]));
891
				final char[][] bounds = Signature.getTypeParameterBounds(typeParameters[i]);
933
				final char[][] bounds = Signature.getTypeParameterBounds(typeParameters[i]);
Lines 900-914 Link Here
900
						}
942
						}
901
					} else {
943
					} else {
902
						buffer.append(" extends "); //$NON-NLS-1$
944
						buffer.append(" extends "); //$NON-NLS-1$
903
						for (int j= 0; j < boundsLength - 1; j++) {
945
						for (int j= 0; j < boundsLength; j++) {
904
							buffer.append(returnClassName(Signature.toCharArray(bounds[j]), '.', mode));
946
							if (j != 0) {
905
							buffer.append(" & "); //$NON-NLS-1$
947
								buffer.append(" & "); //$NON-NLS-1$
906
							}
948
							}
907
						buffer.append(returnClassName(Signature.toCharArray(bounds[boundsLength - 1]), '.', mode));
949
							buffer.append(returnClassName(Signature.toCharArray(bounds[j]), '.', mode));
950
						}
908
					}
951
					}
909
				}	
910
				if (i < typeParametersLength - 1) {
911
					buffer.append(',');
912
				}
952
				}
913
			}
953
			}
914
			buffer.append('>');
954
			buffer.append('>');
Lines 938-944 Link Here
938
			final IExceptionTableEntry[] exceptionTableEntries = codeAttribute.getExceptionTable();
978
			final IExceptionTableEntry[] exceptionTableEntries = codeAttribute.getExceptionTable();
939
			buffer.append(Messages.disassembler_exceptiontableheader); 
979
			buffer.append(Messages.disassembler_exceptiontableheader); 
940
			writeNewLine(buffer, lineSeparator, tabNumberForExceptionAttribute + 1);
980
			writeNewLine(buffer, lineSeparator, tabNumberForExceptionAttribute + 1);
941
			for (int i = 0; i < exceptionTableLength - 1; i++) {
981
			for (int i = 0; i < exceptionTableLength; i++) {
982
				if (i != 0) {
983
					writeNewLine(buffer, lineSeparator, tabNumberForExceptionAttribute + 1);
984
				}
942
				IExceptionTableEntry exceptionTableEntry = exceptionTableEntries[i];
985
				IExceptionTableEntry exceptionTableEntry = exceptionTableEntries[i];
943
				char[] catchType;
986
				char[] catchType;
944
				if (exceptionTableEntry.getCatchTypeIndex() != 0) {
987
				if (exceptionTableEntry.getCatchTypeIndex() != 0) {
Lines 955-978 Link Here
955
						Integer.toString(exceptionTableEntry.getHandlerPC()),
998
						Integer.toString(exceptionTableEntry.getHandlerPC()),
956
						new String(catchType)
999
						new String(catchType)
957
					}));
1000
					}));
958
				writeNewLine(buffer, lineSeparator, tabNumberForExceptionAttribute + 1);
959
			}
1001
			}
960
			IExceptionTableEntry exceptionTableEntry = exceptionTableEntries[exceptionTableLength - 1];
961
			char[] catchType;
962
			if (exceptionTableEntry.getCatchTypeIndex() != 0) {
963
				catchType = exceptionTableEntry.getCatchType();
964
				CharOperation.replace(catchType, '/', '.');
965
				catchType = returnClassName(catchType, '.', mode);
966
			} else {
967
				catchType = ANY_EXCEPTION;
968
			}
969
			buffer.append(Messages.bind(Messages.classfileformat_exceptiontableentry,
970
				new String[] {
971
					Integer.toString(exceptionTableEntry.getStartPC()),
972
					Integer.toString(exceptionTableEntry.getEndPC()),
973
					Integer.toString(exceptionTableEntry.getHandlerPC()),
974
					new String(catchType)
975
				}));
976
		}
1002
		}
977
		final ILineNumberAttribute lineNumberAttribute = codeAttribute.getLineNumberAttribute();
1003
		final ILineNumberAttribute lineNumberAttribute = codeAttribute.getLineNumberAttribute();
978
		final int lineAttributeLength = lineNumberAttribute == null ? 0 : lineNumberAttribute.getLineNumberTableLength();
1004
		final int lineAttributeLength = lineNumberAttribute == null ? 0 : lineNumberAttribute.getLineNumberTableLength();
Lines 987-1005 Link Here
987
			buffer.append(Messages.disassembler_linenumberattributeheader); 
1013
			buffer.append(Messages.disassembler_linenumberattributeheader); 
988
			writeNewLine(buffer, lineSeparator, tabNumberForLineAttribute + 1);
1014
			writeNewLine(buffer, lineSeparator, tabNumberForLineAttribute + 1);
989
			int[][] lineattributesEntries = lineNumberAttribute.getLineNumberTable();
1015
			int[][] lineattributesEntries = lineNumberAttribute.getLineNumberTable();
990
			for (int i = 0; i < lineAttributeLength - 1; i++) {
1016
			for (int i = 0; i < lineAttributeLength; i++) {
1017
				if (i != 0) {
1018
					writeNewLine(buffer, lineSeparator, tabNumberForLineAttribute + 1);
1019
				}
991
				buffer.append(Messages.bind(Messages.classfileformat_linenumbertableentry,
1020
				buffer.append(Messages.bind(Messages.classfileformat_linenumbertableentry,
992
					new String[] {
1021
					new String[] {
993
						Integer.toString(lineattributesEntries[i][0]),
1022
						Integer.toString(lineattributesEntries[i][0]),
994
						Integer.toString(lineattributesEntries[i][1])
1023
						Integer.toString(lineattributesEntries[i][1])
995
					}));
1024
					}));
996
				writeNewLine(buffer, lineSeparator, tabNumberForLineAttribute + 1);
997
			}
1025
			}
998
			buffer.append(Messages.bind(Messages.classfileformat_linenumbertableentry,
999
				new String[] {
1000
					Integer.toString(lineattributesEntries[lineAttributeLength - 1][0]),
1001
					Integer.toString(lineattributesEntries[lineAttributeLength - 1][1])
1002
				}));
1003
		} 
1026
		} 
1004
		final ILocalVariableAttribute localVariableAttribute = codeAttribute.getLocalVariableAttribute();
1027
		final ILocalVariableAttribute localVariableAttribute = codeAttribute.getLocalVariableAttribute();
1005
		final int localVariableAttributeLength = localVariableAttribute == null ? 0 : localVariableAttribute.getLocalVariableTableLength();
1028
		final int localVariableAttributeLength = localVariableAttribute == null ? 0 : localVariableAttribute.getLocalVariableTableLength();
Lines 1014-1020 Link Here
1014
			buffer.append(Messages.disassembler_localvariabletableattributeheader); 
1037
			buffer.append(Messages.disassembler_localvariabletableattributeheader); 
1015
			writeNewLine(buffer, lineSeparator, tabNumberForLocalVariableAttribute + 1);
1038
			writeNewLine(buffer, lineSeparator, tabNumberForLocalVariableAttribute + 1);
1016
			ILocalVariableTableEntry[] localVariableTableEntries = localVariableAttribute.getLocalVariableTable();
1039
			ILocalVariableTableEntry[] localVariableTableEntries = localVariableAttribute.getLocalVariableTable();
1017
			for (int i = 0; i < localVariableAttributeLength - 1; i++) {
1040
			for (int i = 0; i < localVariableAttributeLength; i++) {
1041
				if (i != 0) {
1042
					writeNewLine(buffer, lineSeparator, tabNumberForLocalVariableAttribute + 1);
1043
				}
1018
				ILocalVariableTableEntry localVariableTableEntry = localVariableTableEntries[i];
1044
				ILocalVariableTableEntry localVariableTableEntry = localVariableTableEntries[i];
1019
				int index= localVariableTableEntry.getIndex();
1045
				int index= localVariableTableEntry.getIndex();
1020
				int startPC = localVariableTableEntry.getStartPC();
1046
				int startPC = localVariableTableEntry.getStartPC();
Lines 1029-1050 Link Here
1029
						Integer.toString(index),
1055
						Integer.toString(index),
1030
						new String(returnClassName(typeName, '.', mode))
1056
						new String(returnClassName(typeName, '.', mode))
1031
					}));
1057
					}));
1032
				writeNewLine(buffer, lineSeparator, tabNumberForLocalVariableAttribute + 1);
1033
			}
1058
			}
1034
			ILocalVariableTableEntry localVariableTableEntry = localVariableTableEntries[localVariableAttributeLength - 1];
1035
			int index= localVariableTableEntry.getIndex();
1036
			int startPC = localVariableTableEntry.getStartPC();
1037
			int length  = localVariableTableEntry.getLength();
1038
			final char[] typeName = Signature.toCharArray(localVariableTableEntry.getDescriptor());
1039
			CharOperation.replace(typeName, '/', '.');
1040
			buffer.append(Messages.bind(Messages.classfileformat_localvariabletableentry,
1041
				new String[] {
1042
					Integer.toString(startPC),
1043
					Integer.toString(startPC + length),
1044
					new String(localVariableTableEntry.getName()),
1045
					Integer.toString(index),
1046
					new String(returnClassName(typeName, '.', mode))
1047
				}));
1048
		}
1059
		}
1049
		final ILocalVariableTypeTableAttribute localVariableTypeAttribute= (ILocalVariableTypeTableAttribute) getAttribute(IAttributeNamesConstants.LOCAL_VARIABLE_TYPE_TABLE, codeAttribute);
1060
		final ILocalVariableTypeTableAttribute localVariableTypeAttribute= (ILocalVariableTypeTableAttribute) getAttribute(IAttributeNamesConstants.LOCAL_VARIABLE_TYPE_TABLE, codeAttribute);
1050
		final int localVariableTypeTableLength = localVariableTypeAttribute == null ? 0 : localVariableTypeAttribute.getLocalVariableTypeTableLength();
1061
		final int localVariableTypeTableLength = localVariableTypeAttribute == null ? 0 : localVariableTypeAttribute.getLocalVariableTypeTableLength();
Lines 1059-1065 Link Here
1059
			buffer.append(Messages.disassembler_localvariabletypetableattributeheader); 
1070
			buffer.append(Messages.disassembler_localvariabletypetableattributeheader); 
1060
			writeNewLine(buffer, lineSeparator, tabNumberForLocalVariableAttribute + 1);
1071
			writeNewLine(buffer, lineSeparator, tabNumberForLocalVariableAttribute + 1);
1061
			ILocalVariableTypeTableEntry[] localVariableTypeTableEntries = localVariableTypeAttribute.getLocalVariableTypeTable();
1072
			ILocalVariableTypeTableEntry[] localVariableTypeTableEntries = localVariableTypeAttribute.getLocalVariableTypeTable();
1062
			for (int i = 0; i < localVariableTypeTableLength - 1; i++) {
1073
			for (int i = 0; i < localVariableTypeTableLength; i++) {
1074
				if (i != 0) {
1075
					writeNewLine(buffer, lineSeparator, tabNumberForLocalVariableAttribute + 1);
1076
				}
1063
				ILocalVariableTypeTableEntry localVariableTypeTableEntry = localVariableTypeTableEntries[i];
1077
				ILocalVariableTypeTableEntry localVariableTypeTableEntry = localVariableTypeTableEntries[i];
1064
				int index= localVariableTypeTableEntry.getIndex();
1078
				int index= localVariableTypeTableEntry.getIndex();
1065
				int startPC = localVariableTypeTableEntry.getStartPC();
1079
				int startPC = localVariableTypeTableEntry.getStartPC();
Lines 1074-1095 Link Here
1074
						Integer.toString(index),
1088
						Integer.toString(index),
1075
						new String(returnClassName(typeName, '.', mode))
1089
						new String(returnClassName(typeName, '.', mode))
1076
					}));
1090
					}));
1077
				writeNewLine(buffer, lineSeparator, tabNumberForLocalVariableAttribute + 1);
1078
			}
1091
			}
1079
			ILocalVariableTypeTableEntry localVariableTypeTableEntry = localVariableTypeTableEntries[localVariableTypeTableLength - 1];
1080
			int index= localVariableTypeTableEntry.getIndex();
1081
			int startPC = localVariableTypeTableEntry.getStartPC();
1082
			int length  = localVariableTypeTableEntry.getLength();
1083
			final char[] typeName = Signature.toCharArray(localVariableTypeTableEntry.getSignature());
1084
			CharOperation.replace(typeName, '/', '.');
1085
			buffer.append(Messages.bind(Messages.classfileformat_localvariabletableentry,
1086
				new String[] {
1087
					Integer.toString(startPC),
1088
					Integer.toString(startPC + length),
1089
					new String(localVariableTypeTableEntry.getName()),
1090
					Integer.toString(index),
1091
					new String(returnClassName(typeName, '.', mode))
1092
				}));
1093
		}
1092
		}
1094
		final int length = codeAttribute.getAttributesCount();
1093
		final int length = codeAttribute.getAttributesCount();
1095
		if (length != 0) {
1094
		if (length != 0) {
Lines 1267-1272 Link Here
1267
		buffer.append(Messages.disassembler_constantpoolheader); 
1266
		buffer.append(Messages.disassembler_constantpoolheader); 
1268
		writeNewLine(buffer, lineSeparator, tabNumber + 1);
1267
		writeNewLine(buffer, lineSeparator, tabNumber + 1);
1269
		for (int i = 1; i < length; i++) {
1268
		for (int i = 1; i < length; i++) {
1269
			if (i != 1) {
1270
				writeNewLine(buffer, lineSeparator, tabNumber + 1);
1271
			}
1270
			IConstantPoolEntry constantPoolEntry = constantPool.decodeEntry(i);
1272
			IConstantPoolEntry constantPoolEntry = constantPool.decodeEntry(i);
1271
			switch (constantPool.getEntryKind(i)) {
1273
			switch (constantPool.getEntryKind(i)) {
1272
				case IConstantPoolConstant.CONSTANT_Class :
1274
				case IConstantPoolConstant.CONSTANT_Class :
Lines 1361-1379 Link Here
1361
							new String[] {
1363
							new String[] {
1362
								Integer.toString(i),
1364
								Integer.toString(i),
1363
								Integer.toString(constantPoolEntry.getStringIndex()),
1365
								Integer.toString(constantPoolEntry.getStringIndex()),
1364
								escapeString(constantPoolEntry.getStringValue())}));
1366
								decodeStringValue(constantPoolEntry.getStringValue())}));
1365
					break;
1367
					break;
1366
				case IConstantPoolConstant.CONSTANT_Utf8 :
1368
				case IConstantPoolConstant.CONSTANT_Utf8 :
1367
					buffer.append(
1369
					buffer.append(
1368
						Messages.bind(Messages.disassembler_constantpool_utf8,
1370
						Messages.bind(Messages.disassembler_constantpool_utf8,
1369
							new String[] {
1371
							new String[] {
1370
								Integer.toString(i),
1372
								Integer.toString(i),
1371
								escapeString(new String(constantPoolEntry.getUtf8Value()))}));
1373
								decodeStringValue(new String(constantPoolEntry.getUtf8Value()))}));
1372
					break;
1374
					break;
1373
			}
1375
			}
1374
			if (i < length - 1) {
1375
				writeNewLine(buffer, lineSeparator, tabNumber + 1);
1376
			}
1377
		}
1376
		}
1378
	}
1377
	}
1379
1378
Lines 1415-1420 Link Here
1415
		if (length != 0) {
1414
		if (length != 0) {
1416
			// insert default value for corresponding argument types
1415
			// insert default value for corresponding argument types
1417
			for (int i = 0; i < length; i++) {
1416
			for (int i = 0; i < length; i++) {
1417
				if (i != 0) {
1418
					buffer.append(Messages.disassembler_comma);
1419
				}
1418
				final char[] type = argumentTypes[i];
1420
				final char[] type = argumentTypes[i];
1419
				switch(type.length) {
1421
				switch(type.length) {
1420
					case 1 :
1422
					case 1 :
Lines 1438-1449 Link Here
1438
					default :
1440
					default :
1439
						buffer.append("null"); //$NON-NLS-1$
1441
						buffer.append("null"); //$NON-NLS-1$
1440
				}
1442
				}
1441
				if (i < length - 1) {
1442
					buffer.append(',');
1443
				}
1444
			}
1443
			}
1445
		}
1444
		}
1446
		buffer.append(')').append(',');
1445
		buffer.append(')').append(Messages.disassembler_comma);
1447
	}
1446
	}
1448
	
1447
	
1449
	/**
1448
	/**
Lines 1579-1585 Link Here
1579
		int length = innerClassesAttributeEntries.length;
1578
		int length = innerClassesAttributeEntries.length;
1580
		int innerClassNameIndex, outerClassNameIndex, innerNameIndex, accessFlags;
1579
		int innerClassNameIndex, outerClassNameIndex, innerNameIndex, accessFlags;
1581
		IInnerClassesAttributeEntry innerClassesAttributeEntry;
1580
		IInnerClassesAttributeEntry innerClassesAttributeEntry;
1582
		for (int i = 0; i < length - 1; i++) {
1581
		for (int i = 0; i < length; i++) {
1582
			if (i != 0) {
1583
				buffer.append(Messages.disassembler_comma);
1584
				writeNewLine(buffer, lineSeparator, tabNumber + 1);				
1585
			}
1583
			innerClassesAttributeEntry = innerClassesAttributeEntries[i];
1586
			innerClassesAttributeEntry = innerClassesAttributeEntries[i];
1584
			innerClassNameIndex = innerClassesAttributeEntry.getInnerClassNameIndex();
1587
			innerClassNameIndex = innerClassesAttributeEntry.getInnerClassNameIndex();
1585
			outerClassNameIndex = innerClassesAttributeEntry.getOuterClassNameIndex();
1588
			outerClassNameIndex = innerClassesAttributeEntry.getOuterClassNameIndex();
Lines 1624-1682 Link Here
1624
				.append(Messages.disassembler_inner_accessflags) 
1627
				.append(Messages.disassembler_inner_accessflags) 
1625
				.append(accessFlags)
1628
				.append(accessFlags)
1626
				.append(Messages.disassembler_space); 
1629
				.append(Messages.disassembler_space); 
1627
			decodeModifiersForInnerClasses(buffer, accessFlags);
1630
			decodeModifiersForInnerClasses(buffer, accessFlags, true);
1628
			buffer
1631
			buffer
1629
				.append(Messages.disassembler_closeinnerclassentry) 
1632
				.append(Messages.disassembler_closeinnerclassentry);
1630
				.append(Messages.disassembler_comma); 
1631
			writeNewLine(buffer, lineSeparator, tabNumber + 1);
1632
		}
1633
		}
1633
		// last entry
1634
		innerClassesAttributeEntry = innerClassesAttributeEntries[length - 1];
1635
		innerClassNameIndex = innerClassesAttributeEntry.getInnerClassNameIndex();
1636
		outerClassNameIndex = innerClassesAttributeEntry.getOuterClassNameIndex();
1637
		innerNameIndex = innerClassesAttributeEntry.getInnerNameIndex();
1638
		accessFlags = innerClassesAttributeEntry.getAccessFlags();
1639
		buffer
1640
			.append(Messages.disassembler_openinnerclassentry) 
1641
			.append(Messages.disassembler_inner_class_info_name) 
1642
			.append(Messages.disassembler_constantpoolindex) 
1643
			.append(innerClassNameIndex);
1644
		if (innerClassNameIndex != 0) {
1645
			buffer
1646
				.append(Messages.disassembler_space) 
1647
				.append(innerClassesAttributeEntry.getInnerClassName());
1648
		}
1649
		buffer
1650
			.append(Messages.disassembler_comma) 
1651
			.append(Messages.disassembler_space) 
1652
			.append(Messages.disassembler_outer_class_info_name) 
1653
			.append(Messages.disassembler_constantpoolindex) 
1654
			.append(outerClassNameIndex);
1655
		if (outerClassNameIndex != 0) {
1656
			buffer	
1657
				.append(Messages.disassembler_space) 
1658
				.append(innerClassesAttributeEntry.getOuterClassName());
1659
		}
1660
		writeNewLine(buffer, lineSeparator, tabNumber);
1661
		dumpTab(tabNumber, buffer);
1662
		buffer.append(Messages.disassembler_space); 
1663
		buffer
1664
			.append(Messages.disassembler_inner_name) 
1665
			.append(Messages.disassembler_constantpoolindex) 
1666
			.append(innerNameIndex);
1667
		if (innerNameIndex != 0) {
1668
			buffer
1669
				.append(Messages.disassembler_space) 
1670
				.append(innerClassesAttributeEntry.getInnerName());
1671
		}
1672
		buffer
1673
			.append(Messages.disassembler_comma) 
1674
			.append(Messages.disassembler_space) 
1675
			.append(Messages.disassembler_inner_accessflags) 
1676
			.append(accessFlags)
1677
			.append(Messages.disassembler_space); 
1678
		decodeModifiersForInnerClasses(buffer, accessFlags);
1679
		buffer.append(Messages.disassembler_closeinnerclassentry); 
1680
	}
1634
	}
1681
1635
1682
	private void disassemble(int index, IParameterAnnotation parameterAnnotation, StringBuffer buffer, String lineSeparator, int tabNumber) {
1636
	private void disassemble(int index, IParameterAnnotation parameterAnnotation, StringBuffer buffer, String lineSeparator, int tabNumber) {
Lines 1729-1735 Link Here
1729
		StringBuffer buffer = new StringBuffer();
1683
		StringBuffer buffer = new StringBuffer();
1730
		buffer.append('{');
1684
		buffer.append('{');
1731
		for (int i = 0, max = infos.length; i < max; i++) {
1685
		for (int i = 0, max = infos.length; i < max; i++) {
1732
			if(i != 0) buffer.append(", "); //$NON-NLS-1$
1686
			if(i != 0) {
1687
				buffer
1688
						.append(Messages.disassembler_comma)
1689
						.append(Messages.disassembler_space);
1690
			}
1733
			switch(infos[i].getTag()) {
1691
			switch(infos[i].getTag()) {
1734
				case IVerificationTypeInfo.ITEM_DOUBLE :
1692
				case IVerificationTypeInfo.ITEM_DOUBLE :
1735
					buffer.append("double"); //$NON-NLS-1$
1693
					buffer.append("double"); //$NON-NLS-1$

Return to bug 162296