Skip to content

Commit e5faeac

Browse files
author
emmanue1
committed
Update object type maker
1 parent 85f35bb commit e5faeac

28 files changed

+488
-465
lines changed

src/main/java/org/jd/core/v1/model/classfile/attribute/Annotation.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2008-2019 Emmanuel Dupuy.
2+
* Copyright (c) 2008, 2019 Emmanuel Dupuy.
33
* This project is distributed under the GPLv3 license.
44
* This is a Copyleft license that gives the user the right to use,
55
* copy and modify the code freely for non-commercial purposes.
@@ -8,16 +8,16 @@
88
package org.jd.core.v1.model.classfile.attribute;
99

1010
public class Annotation {
11-
protected String typeName;
11+
protected String descriptor;
1212
protected ElementValuePair[] elementValuePairs;
1313

14-
public Annotation(String typeName, ElementValuePair[] elementValuePairs) {
15-
this.typeName = typeName;
14+
public Annotation(String descriptor, ElementValuePair[] elementValuePairs) {
15+
this.descriptor = descriptor;
1616
this.elementValuePairs = elementValuePairs;
1717
}
1818

19-
public String getTypeName() {
20-
return typeName;
19+
public String getDescriptor() {
20+
return descriptor;
2121
}
2222

2323
public ElementValuePair[] getElementValuePairs() {

src/main/java/org/jd/core/v1/model/classfile/attribute/ElementValueEnumConstValue.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2008-2019 Emmanuel Dupuy.
2+
* Copyright (c) 2008, 2019 Emmanuel Dupuy.
33
* This project is distributed under the GPLv3 license.
44
* This is a Copyleft license that gives the user the right to use,
55
* copy and modify the code freely for non-commercial purposes.
@@ -8,16 +8,16 @@
88
package org.jd.core.v1.model.classfile.attribute;
99

1010
public class ElementValueEnumConstValue implements ElementValue {
11-
protected String typeName;
11+
protected String descriptor;
1212
protected String constName;
1313

14-
public ElementValueEnumConstValue(String typeName, String constName) {
15-
this.typeName = typeName;
14+
public ElementValueEnumConstValue(String descriptor, String constName) {
15+
this.descriptor = descriptor;
1616
this.constName = constName;
1717
}
1818

19-
public String getTypeName() {
20-
return typeName;
19+
public String getDescriptor() {
20+
return descriptor;
2121
}
2222

2323
public String getConstName() {

src/main/java/org/jd/core/v1/model/javasyntax/expression/ArrayExpression.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2008-2019 Emmanuel Dupuy.
2+
* Copyright (c) 2008, 2019 Emmanuel Dupuy.
33
* This project is distributed under the GPLv3 license.
44
* This is a Copyleft license that gives the user the right to use,
55
* copy and modify the code freely for non-commercial purposes.
@@ -9,6 +9,8 @@
99

1010
import org.jd.core.v1.model.javasyntax.type.Type;
1111

12+
import static org.jd.core.v1.model.javasyntax.type.ObjectType.TYPE_UNDEFINED_OBJECT;
13+
1214
public class ArrayExpression extends AbstractLineNumberTypeExpression {
1315
protected Expression expression;
1416
protected Expression index;
@@ -50,7 +52,7 @@ protected static Type createItemType(Expression expression) {
5052
Type type = expression.getType();
5153
int dimension = type.getDimension();
5254

53-
assert dimension > 0 : "createItemType : negative dimension";
55+
assert (type == TYPE_UNDEFINED_OBJECT) || (dimension > 0) : "ArrayExpression.createItemType(exp) : zero or negative dimension";
5456

5557
return type.createType((dimension > 0) ? dimension-1 : 0);
5658
}

src/main/java/org/jd/core/v1/model/javasyntax/expression/IntegerConstantExpression.java

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2008-2019 Emmanuel Dupuy.
2+
* Copyright (c) 2008, 2019 Emmanuel Dupuy.
33
* This project is distributed under the GPLv3 license.
44
* This is a Copyleft license that gives the user the right to use,
55
* copy and modify the code freely for non-commercial purposes.
@@ -35,24 +35,14 @@ public int getValue() {
3535

3636
@Override
3737
public void setType(Type type) {
38-
assert type.isPrimitive() && checkType(type) : "setType : incompatible types";
38+
assert checkType(type) : "IntegerConstantExpression.setType(type) : incompatible types";
3939
super.setType(type);
4040
}
4141

4242
protected boolean checkType(Type type) {
4343
if (type.isPrimitive()) {
44-
switch (PrimitiveTypeUtil.getStandardPrimitiveTypeFlags(((PrimitiveType)type).getFlags())) {
45-
case FLAG_BYTE:
46-
return (Byte.MIN_VALUE <= value) && (value <= Byte.MAX_VALUE);
47-
case FLAG_CHAR:
48-
return (Character.MIN_VALUE <= (char)value) && ((char)value <= Character.MAX_VALUE);
49-
case FLAG_SHORT:
50-
return (Short.MIN_VALUE <= value) && (value <= Short.MAX_VALUE);
51-
case FLAG_BOOLEAN:
52-
return (0 <= value) && (value <= 1);
53-
default:
54-
return (Integer.MIN_VALUE <= value) && (value <= Integer.MAX_VALUE);
55-
}
44+
PrimitiveType valueType = PrimitiveTypeUtil.getPrimitiveTypeFromValue(value);
45+
return (((PrimitiveType)type).getFlags() & valueType.getFlags()) != 0;
5646
}
5747

5848
return false;

src/main/java/org/jd/core/v1/model/javasyntax/type/ObjectType.java

Lines changed: 60 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,35 @@
88
package org.jd.core.v1.model.javasyntax.type;
99

1010
public class ObjectType implements Type {
11-
public static final ObjectType TYPE_BOOLEAN = new ObjectType("java/lang/Boolean", "java.lang.Boolean", "Boolean");
12-
public static final ObjectType TYPE_BYTE = new ObjectType("java/lang/Byte", "java.lang.Byte", "Byte");
13-
public static final ObjectType TYPE_CHARACTER = new ObjectType("java/lang/Character", "java.lang.Character", "Character");
14-
public static final ObjectType TYPE_CLASS = new ObjectType("java/lang/Class", "java.lang.Class", "Class");
15-
public static final ObjectType TYPE_DOUBLE = new ObjectType("java/lang/Double", "java.lang.Double", "Double");
16-
public static final ObjectType TYPE_FLOAT = new ObjectType("java/lang/Float", "java.lang.Float", "Float");
17-
public static final ObjectType TYPE_INTEGER = new ObjectType("java/lang/Integer", "java.lang.Integer", "Integer");
18-
public static final ObjectType TYPE_LONG = new ObjectType("java/lang/Long", "java.lang.Long", "Long");
19-
public static final ObjectType TYPE_MATH = new ObjectType("java/lang/Math", "java.lang.Math", "Math");
20-
public static final ObjectType TYPE_OBJECT = new ObjectType("java/lang/Object", "java.lang.Object", "Object");
21-
public static final ObjectType TYPE_SHORT = new ObjectType("java/lang/Short", "java.lang.Short", "Short");
22-
public static final ObjectType TYPE_STRING = new ObjectType("java/lang/String", "java.lang.String", "String");
23-
public static final ObjectType TYPE_THROWABLE = new ObjectType("java/lang/Throwable", "java.lang.Throwable", "Throwable");
11+
public static final ObjectType TYPE_BOOLEAN = new ObjectType("java/lang/Boolean", "java.lang.Boolean", "Boolean");
12+
public static final ObjectType TYPE_BYTE = new ObjectType("java/lang/Byte", "java.lang.Byte", "Byte");
13+
public static final ObjectType TYPE_CHARACTER = new ObjectType("java/lang/Character", "java.lang.Character", "Character");
14+
public static final ObjectType TYPE_CLASS = new ObjectType("java/lang/Class", "java.lang.Class", "Class");
15+
public static final ObjectType TYPE_DOUBLE = new ObjectType("java/lang/Double", "java.lang.Double", "Double");
16+
public static final ObjectType TYPE_EXCEPTION = new ObjectType("java/lang/Exception", "java.lang.Exception", "Exception");
17+
public static final ObjectType TYPE_FLOAT = new ObjectType("java/lang/Float", "java.lang.Float", "Float");
18+
public static final ObjectType TYPE_INTEGER = new ObjectType("java/lang/Integer", "java.lang.Integer", "Integer");
19+
public static final ObjectType TYPE_LONG = new ObjectType("java/lang/Long", "java.lang.Long", "Long");
20+
public static final ObjectType TYPE_MATH = new ObjectType("java/lang/Math", "java.lang.Math", "Math");
21+
public static final ObjectType TYPE_OBJECT = new ObjectType("java/lang/Object", "java.lang.Object", "Object");
22+
public static final ObjectType TYPE_RUNTIME_EXCEPTION = new ObjectType("java/lang/RuntimeException", "java.lang.RuntimeException", "RuntimeException");
23+
public static final ObjectType TYPE_SHORT = new ObjectType("java/lang/Short", "java.lang.Short", "Short");
24+
public static final ObjectType TYPE_STRING = new ObjectType("java/lang/String", "java.lang.String", "String");
25+
public static final ObjectType TYPE_STRING_BUFFER = new ObjectType("java/lang/StringBuffer", "java.lang.StringBuffer", "StringBuffer");
26+
public static final ObjectType TYPE_STRING_BUILDER = new ObjectType("java/lang/StringBuilder", "java.lang.StringBuilder", "StringBuilder");
27+
public static final ObjectType TYPE_SYSTEM = new ObjectType("java/lang/System", "java.lang.System", "System");
28+
public static final ObjectType TYPE_THREAD = new ObjectType("java/lang/Thread", "java.lang.Thread", "Thread");
29+
public static final ObjectType TYPE_THROWABLE = new ObjectType("java/lang/Throwable", "java.lang.Throwable", "Throwable");
30+
31+
public static final ObjectType TYPE_PRIMITIVE_BOOLEAN = new ObjectType("Z");
32+
public static final ObjectType TYPE_PRIMITIVE_BYTE = new ObjectType("B");
33+
public static final ObjectType TYPE_PRIMITIVE_CHAR = new ObjectType("C");
34+
public static final ObjectType TYPE_PRIMITIVE_DOUBLE = new ObjectType("D");
35+
public static final ObjectType TYPE_PRIMITIVE_FLOAT = new ObjectType("F");
36+
public static final ObjectType TYPE_PRIMITIVE_INT = new ObjectType("I");
37+
public static final ObjectType TYPE_PRIMITIVE_LONG = new ObjectType("J");
38+
public static final ObjectType TYPE_PRIMITIVE_SHORT = new ObjectType("S");
39+
public static final ObjectType TYPE_PRIMITIVE_VOID = new ObjectType("V");
2440

2541
public static final ObjectType TYPE_UNDEFINED_OBJECT = new ObjectType("java/lang/Object", "java.lang.Object", "Object") {
2642
@Override public String toString() { return "UndefinedObjectType"; }
@@ -52,22 +68,32 @@ public ObjectType(String internalName, String qualifiedName, String name, BaseTy
5268
this.name = name;
5369
this.typeArguments = typeArguments;
5470
this.dimension = dimension;
71+
this.descriptor = createDescriptor("L" + internalName + ';', dimension);
5572

5673
assert (internalName != null) && !internalName.endsWith(";");
74+
}
75+
76+
public ObjectType(String primitiveDescriptor) {
77+
this(primitiveDescriptor, 0);
78+
}
79+
80+
public ObjectType(String primitiveDescriptor, int dimension) {
81+
this.internalName = primitiveDescriptor;
82+
this.qualifiedName = this.name = PrimitiveType.getPrimitiveType(primitiveDescriptor.charAt(0)).getName();
83+
this.dimension = dimension;
84+
this.descriptor = createDescriptor(primitiveDescriptor, dimension);
85+
}
5786

87+
protected static String createDescriptor(String descriptor, int dimension) {
5888
switch (dimension) {
5989
case 0:
60-
this.descriptor = "L" + internalName + ';';
61-
break;
90+
return descriptor;
6291
case 1:
63-
this.descriptor = "[L" + internalName + ';';
64-
break;
92+
return "[" + descriptor;
6593
case 2:
66-
this.descriptor = "[[L" + internalName + ';';
67-
break;
94+
return "[[" + descriptor;
6895
default:
69-
this.descriptor = new String(new char[dimension]).replaceAll("\0", "[") + 'L' + internalName + ';';
70-
break;
96+
return new String(new char[dimension]).replaceAll("\0", "[") + descriptor;
7197
}
7298
}
7399

@@ -109,11 +135,21 @@ public int getDimension() {
109135

110136
@Override
111137
public Type createType(int dimension) {
112-
assert dimension >= 0;
113-
if (this.dimension == dimension)
138+
assert dimension >= 0 : "ObjectType.createType(dim) : create type with zero or negative dimension";
139+
140+
if (this.dimension == dimension) {
114141
return this;
115-
else
142+
} else if (descriptor.charAt(descriptor.length()-1) != ';') {
143+
// Array of primitive types
144+
if (dimension == 0) {
145+
return PrimitiveType.getPrimitiveType(descriptor.charAt(this.dimension));
146+
} else {
147+
return new ObjectType(internalName, dimension);
148+
}
149+
} else {
150+
// Object type or array of object types
116151
return new ObjectType(internalName, qualifiedName, name, typeArguments, dimension);
152+
}
117153
}
118154

119155
public ObjectType createType(BaseTypeArgument typeArguments) {

src/main/java/org/jd/core/v1/model/javasyntax/type/PrimitiveType.java

Lines changed: 47 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -38,37 +38,38 @@ public class PrimitiveType implements Type {
3838
public static final PrimitiveType MAYBE_INT_TYPE = new PrimitiveType("maybe_int", FLAG_INT, FLAG_INT, FLAG_INT); // Otherwise
3939
public static final PrimitiveType MAYBE_NEGATIVE_BOOLEAN_TYPE = new PrimitiveType("maybe_negative_boolean", FLAG_BOOLEAN|FLAG_BYTE|FLAG_SHORT|FLAG_INT, FLAG_BOOLEAN|FLAG_BYTE|FLAG_SHORT|FLAG_INT, FLAG_BOOLEAN|FLAG_BYTE|FLAG_SHORT|FLAG_INT); // Boolean or negative
4040

41-
protected String name;
42-
protected int dimension;
43-
protected int flags;
44-
protected int leftFlags;
45-
protected int rightFlags;
46-
protected String descriptor;
47-
48-
protected PrimitiveType(String name, int flags, int leftFlags, int rightFlags) {
49-
this(name, flags, leftFlags, rightFlags, 0);
41+
protected static final PrimitiveType[] descriptorToType = new PrimitiveType['Z' - 'B' + 1];
42+
43+
static {
44+
descriptorToType['B' - 'B'] = TYPE_BYTE;
45+
descriptorToType['C' - 'B'] = TYPE_CHAR;
46+
descriptorToType['D' - 'B'] = TYPE_DOUBLE;
47+
descriptorToType['F' - 'B'] = TYPE_FLOAT;
48+
descriptorToType['I' - 'B'] = TYPE_INT;
49+
descriptorToType['J' - 'B'] = TYPE_LONG;
50+
descriptorToType['S' - 'B'] = TYPE_SHORT;
51+
descriptorToType['V' - 'B'] = TYPE_VOID;
52+
descriptorToType['Z' - 'B'] = TYPE_BOOLEAN;
5053
}
5154

52-
protected PrimitiveType(PrimitiveType primitiveType, int dimension) {
53-
this(primitiveType.name, primitiveType.flags, primitiveType.leftFlags, primitiveType.rightFlags, dimension);
55+
protected final String name;
56+
protected final int flags;
57+
protected final int leftFlags;
58+
protected final int rightFlags;
59+
protected final String descriptor;
60+
61+
protected PrimitiveType(PrimitiveType primitiveType) {
62+
this(primitiveType.name, primitiveType.flags, primitiveType.leftFlags, primitiveType.rightFlags);
5463
}
5564

56-
protected PrimitiveType(String name, int flags, int leftFlags, int rightFlags, int dimension) {
65+
protected PrimitiveType(String name, int flags, int leftFlags, int rightFlags) {
5766
this.name = name;
58-
this.dimension = dimension;
5967
this.flags = flags;
6068
this.leftFlags = leftFlags;
6169
this.rightFlags = rightFlags;
6270

6371
StringBuilder sb = new StringBuilder();
6472

65-
switch (dimension) {
66-
case 0: break;
67-
case 1: sb.append('['); break;
68-
case 2: sb.append("[["); break;
69-
default: for (int i=0; i<dimension; i++) sb.append('['); break;
70-
}
71-
7273
if ((flags & FLAG_DOUBLE) != 0)
7374
sb.append('D');
7475
else if ((flags & FLAG_FLOAT) != 0)
@@ -89,6 +90,10 @@ else if ((flags & FLAG_SHORT) != 0)
8990
this.descriptor = sb.toString();
9091
}
9192

93+
public static PrimitiveType getPrimitiveType(char primitiveDescriptor) {
94+
return descriptorToType[primitiveDescriptor - 'B'];
95+
}
96+
9297
@Override
9398
public String getName() {
9499
return name;
@@ -101,7 +106,7 @@ public String getDescriptor() {
101106

102107
@Override
103108
public int getDimension() {
104-
return dimension;
109+
return 0;
105110
}
106111

107112
public int getFlags() {
@@ -117,12 +122,13 @@ public int getRightFlags() {
117122
}
118123

119124
@Override
120-
public PrimitiveType createType(int dimension) {
121-
assert dimension >= 0;
122-
if (this.dimension == dimension)
125+
public Type createType(int dimension) {
126+
assert dimension >= 0 : "PrimitiveType.createType(dim) : create type with zero or negative dimension";
127+
if (dimension == 0) {
123128
return this;
124-
else
125-
return new PrimitiveType(this, dimension);
129+
} else {
130+
return new ObjectType(descriptor, dimension);
131+
}
126132
}
127133

128134
@Override
@@ -132,15 +138,14 @@ public boolean equals(Object o) {
132138

133139
PrimitiveType that = (PrimitiveType) o;
134140

135-
if (dimension != that.dimension) return false;
136141
if (flags != that.flags) return false;
137142

138143
return true;
139144
}
140145

141146
@Override
142147
public int hashCode() {
143-
return 31 * dimension + flags;
148+
return flags;
144149
}
145150

146151
@Override
@@ -155,9 +160,19 @@ public boolean isPrimitive() {
155160

156161
@Override
157162
public String toString() {
158-
if (dimension == 0)
159-
return "PrimitiveType{primitive=" + name + "}";
160-
else
161-
return "PrimitiveType{primitive=" + name + ", dimension=" + dimension + "}";
163+
return "PrimitiveType{primitive=" + name + "}";
164+
}
165+
166+
public int getJavaPrimitiveFlags() {
167+
if ((flags & FLAG_BOOLEAN) != 0)
168+
return FLAG_BOOLEAN;
169+
else if ((flags & FLAG_BYTE) != 0)
170+
return FLAG_BYTE;
171+
else if ((flags & FLAG_CHAR) != 0)
172+
return FLAG_CHAR;
173+
else if ((flags & FLAG_SHORT) != 0)
174+
return FLAG_SHORT;
175+
176+
return flags;
162177
}
163178
}

0 commit comments

Comments
 (0)