Skip to content

Commit 138f572

Browse files
jaskarthKroppeb
authored andcommitted
Start work on IR and IR tests
1 parent 9e7e264 commit 138f572

34 files changed

+1469
-46
lines changed

src/org/jetbrains/java/decompiler/modules/decompiler/StatEdge.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,41 @@ public int getType() {
9292
return type;
9393
}
9494

95+
public String makeEdgeTypeString() {
96+
switch (type) {
97+
case TYPE_REGULAR:
98+
return "Regular";
99+
case TYPE_EXCEPTION:
100+
return "Except";
101+
case TYPE_BREAK:
102+
return destination.type == Statement.StatementType.DUMMY_EXIT ? "BreakExit" : "Break";
103+
case TYPE_CONTINUE:
104+
return "Continue";
105+
case TYPE_FINALLYEXIT:
106+
return "FinExit";
107+
default:
108+
throw new RuntimeException("Invalid edge type");
109+
}
110+
}
111+
112+
public static int fromEdgeTypeString(String s) {
113+
switch (s) {
114+
case "Regular":
115+
return TYPE_REGULAR;
116+
case "Except":
117+
return TYPE_EXCEPTION;
118+
case "Break":
119+
case "BreakExit":
120+
return TYPE_BREAK;
121+
case "Continue":
122+
return TYPE_CONTINUE;
123+
case "FinExit":
124+
return TYPE_FINALLYEXIT;
125+
default:
126+
throw new RuntimeException("Invalid edge type");
127+
}
128+
}
129+
95130
public void setType(int type) {
96131
this.type = type;
97132
}

src/org/jetbrains/java/decompiler/modules/decompiler/exps/ArrayExprent.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import org.jetbrains.java.decompiler.modules.decompiler.ExprProcessor;
55
import org.jetbrains.java.decompiler.modules.decompiler.vars.CheckTypesResult;
6+
import org.jetbrains.java.decompiler.modules.serializer.ExprParser;
67
import org.jetbrains.java.decompiler.struct.gen.VarType;
78
import org.jetbrains.java.decompiler.util.InterpreterUtil;
89
import org.jetbrains.java.decompiler.util.TextBuffer;
@@ -51,6 +52,21 @@ public VarType getInferredExprType(VarType upperBound) {
5152
}
5253
}
5354

55+
@Override
56+
protected void addToTapestry(StringBuilder sb) {
57+
sb.append(hardType.toTapestryString());
58+
sb.append(" ");
59+
array.toTapestry(sb);
60+
index.toTapestry(sb);
61+
}
62+
63+
public static Exprent fromTapestry(ExprParser.Arg arg) {
64+
VarType hardType = VarType.fromTapestryString(arg.getNextString());
65+
Exprent array = arg.getNextExprent();
66+
Exprent index = arg.getNextExprent();
67+
return new ArrayExprent(array, index, hardType, null);
68+
}
69+
5470
@Override
5571
public int getExprentUse() {
5672
return array.getExprentUse() & index.getExprentUse() & Exprent.MULTIPLE_USES;

src/org/jetbrains/java/decompiler/modules/decompiler/exps/AssignmentExprent.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.jetbrains.java.decompiler.modules.decompiler.sforms.VarMapHolder;
1414
import org.jetbrains.java.decompiler.modules.decompiler.stats.Statement;
1515
import org.jetbrains.java.decompiler.modules.decompiler.vars.CheckTypesResult;
16+
import org.jetbrains.java.decompiler.modules.serializer.ExprParser;
1617
import org.jetbrains.java.decompiler.modules.decompiler.vars.VarVersionPair;
1718
import org.jetbrains.java.decompiler.struct.StructField;
1819
import org.jetbrains.java.decompiler.struct.StructMethod;
@@ -258,6 +259,31 @@ private void optimizeCastForAssign() {
258259
}
259260
}
260261

262+
263+
@Override
264+
protected void addToTapestry(StringBuilder sb) {
265+
if (condType != null) {
266+
sb.append(condType.name());
267+
}
268+
269+
sb.append(" ");
270+
left.toTapestry(sb);
271+
sb.append(" ");
272+
right.toTapestry(sb);
273+
}
274+
275+
public static Exprent fromTapestry(ExprParser.Arg arg) {
276+
FunctionExprent.FunctionType condType = null;
277+
if (arg.peekNext() == ExprParser.Type.STRING) {
278+
condType = FunctionExprent.FunctionType.valueOf(arg.getNextString());
279+
}
280+
281+
Exprent left = arg.getNextExprent();
282+
Exprent right = arg.getNextExprent();
283+
284+
return new AssignmentExprent(left, right, condType, null);
285+
}
286+
261287
@Override
262288
public void replaceExprent(Exprent oldExpr, Exprent newExpr) {
263289
if (oldExpr == left) {

src/org/jetbrains/java/decompiler/modules/decompiler/exps/ConstExprent.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.jetbrains.java.decompiler.main.DecompilerContext;
66
import org.jetbrains.java.decompiler.main.extern.IFernflowerPreferences;
77
import org.jetbrains.java.decompiler.struct.gen.CodeType;
8+
import org.jetbrains.java.decompiler.modules.serializer.ExprParser;
89
import org.jetbrains.java.decompiler.struct.gen.FieldDescriptor;
910
import org.jetbrains.java.decompiler.struct.gen.TypeFamily;
1011
import org.jetbrains.java.decompiler.struct.gen.VarType;
@@ -603,6 +604,35 @@ public VarType getConstType() {
603604
return constType;
604605
}
605606

607+
@Override
608+
protected void addToTapestry(StringBuilder sb) {
609+
sb.append(constType.toTapestryString()).append(" ").append(value);
610+
}
611+
612+
public static Exprent fromTapestry(ExprParser.Arg arg) {
613+
VarType type = VarType.fromTapestryString(arg.getNextString());
614+
String rawVal = arg.getNextString();
615+
Object val = rawVal;
616+
617+
if (type.typeFamily == TypeFamily.INTEGER) {
618+
val = Integer.parseInt(rawVal);
619+
} else if (type == VarType.VARTYPE_LONG) {
620+
val = Long.parseLong(rawVal);
621+
} else if (type == VarType.VARTYPE_FLOAT) {
622+
val = Float.parseFloat(rawVal);
623+
} else if (type == VarType.VARTYPE_DOUBLE) {
624+
val = Double.parseDouble(rawVal);
625+
} else if (type == VarType.VARTYPE_BOOLEAN) {
626+
val = Boolean.parseBoolean(rawVal);
627+
} else if (type == VarType.VARTYPE_CHAR) {
628+
val = rawVal.charAt(0);
629+
} else if (type == VarType.VARTYPE_NULL) {
630+
val = null;
631+
}
632+
633+
return new ConstExprent(type, val, null);
634+
}
635+
606636
public void setConstType(VarType constType) {
607637
this.constType = constType;
608638
}

src/org/jetbrains/java/decompiler/modules/decompiler/exps/ExitExprent.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.jetbrains.java.decompiler.modules.decompiler.ExprProcessor;
99
import org.jetbrains.java.decompiler.modules.decompiler.ValidationHelper;
1010
import org.jetbrains.java.decompiler.modules.decompiler.vars.CheckTypesResult;
11+
import org.jetbrains.java.decompiler.modules.serializer.ExprParser;
1112
import org.jetbrains.java.decompiler.struct.attr.StructExceptionsAttribute;
1213
import org.jetbrains.java.decompiler.struct.attr.StructGeneralAttribute;
1314
import org.jetbrains.java.decompiler.struct.gen.CodeType;
@@ -122,6 +123,30 @@ else if ("java/lang/Exception".equals(exClassName)) {
122123
}
123124
}
124125

126+
@Override
127+
protected void addToTapestry(StringBuilder sb) {
128+
sb.append(this.exitType.name());
129+
sb.append(" ");
130+
sb.append(this.retType.toTapestryString());
131+
132+
if (this.value != null) {
133+
sb.append(" ");
134+
this.value.toTapestry(sb);
135+
}
136+
}
137+
138+
public static Exprent fromTapestry(ExprParser.Arg arg) {
139+
Type type = Type.valueOf(arg.getNextString());
140+
VarType varType = VarType.fromTapestryString(arg.getNextString());
141+
142+
Exprent value = null;
143+
if (arg.peekNext() == ExprParser.Type.EXPRENT) {
144+
value = arg.getNextExprent();
145+
}
146+
147+
return new ExitExprent(type, value, varType, null, null);
148+
}
149+
125150
@Override
126151
public void replaceExprent(Exprent oldExpr, Exprent newExpr) {
127152
if (oldExpr == value) {

src/org/jetbrains/java/decompiler/modules/decompiler/exps/Exprent.java

Lines changed: 46 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,33 +23,45 @@
2323
import org.jetbrains.java.decompiler.util.TextBuffer;
2424

2525
import java.util.*;
26+
import java.util.Map.Entry;
27+
import java.util.function.Consumer;
2628

2729
public abstract class Exprent implements IMatchable {
2830
public static final int MULTIPLE_USES = 1;
2931
public static final int SIDE_EFFECTS_FREE = 2;
3032
public static final int BOTH_FLAGS = 3;
3133

3234
public enum Type {
33-
ANNOTATION,
34-
ARRAY,
35-
ASSERT,
36-
ASSIGNMENT,
37-
CONST,
38-
EXIT,
39-
FIELD,
40-
FUNCTION,
41-
IF,
42-
INVOCATION,
43-
MONITOR,
44-
NEW,
45-
PATTERN,
46-
SWITCH,
47-
SWITCH_HEAD,
48-
VAR,
49-
YIELD,
35+
ANNOTATION("Anno"),
36+
ARRAY("Array"),
37+
ASSERT("Assert"),
38+
ASSIGNMENT("Assign"),
39+
CONST("Const"),
40+
EXIT("Return"),
41+
FIELD("Field"),
42+
FUNCTION("Func"),
43+
IF("If"),
44+
INVOCATION("Invoke"),
45+
MONITOR("Monitor"),
46+
NEW("New"),
47+
PATTERN("Pattern"),
48+
SWITCH("SwitchExpr"),
49+
SWITCH_HEAD("SwitchHead"),
50+
VAR("Var"),
51+
YIELD("Yield"),
5052

5153
// Catch all for plugins
52-
OTHER
54+
OTHER("Other");
55+
56+
private final String prettyId;
57+
58+
Type(String prettyId) {
59+
this.prettyId = prettyId;
60+
}
61+
62+
public String getPrettyId() {
63+
return prettyId;
64+
}
5365
}
5466

5567
protected static ThreadLocal<Map<String, VarType>> inferredLambdaTypes = ThreadLocal.withInitial(HashMap::new);
@@ -309,6 +321,22 @@ public boolean allowNewlineAfterQualifier() {
309321
return true;
310322
}
311323

324+
public final void toTapestry(StringBuilder sb) {
325+
sb.append("[");
326+
sb.append(type.prettyId);
327+
StringBuilder child = new StringBuilder();
328+
addToTapestry(child);
329+
if (child.length() > 0) {
330+
sb.append(" ");
331+
sb.append(child);
332+
}
333+
sb.append("]");
334+
}
335+
336+
protected void addToTapestry(StringBuilder sb) {
337+
338+
}
339+
312340
// processes exprents, much like section 16.1. of the java language specifications
313341
// (Definite Assignment and Expressions).
314342
public void processSforms(SFormsConstructor sFormsConstructor, VarMapHolder varMaps, Statement stat, boolean calcLiveVars) {

src/org/jetbrains/java/decompiler/modules/decompiler/exps/FieldExprent.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.jetbrains.java.decompiler.modules.decompiler.sforms.VarMapHolder;
1313
import org.jetbrains.java.decompiler.modules.decompiler.stats.Statement;
1414
import org.jetbrains.java.decompiler.modules.decompiler.vars.VarVersionPair;
15+
import org.jetbrains.java.decompiler.modules.serializer.ExprParser;
1516
import org.jetbrains.java.decompiler.struct.StructClass;
1617
import org.jetbrains.java.decompiler.struct.StructField;
1718
import org.jetbrains.java.decompiler.struct.attr.StructLocalVariableTableAttribute;
@@ -114,6 +115,34 @@ public VarType getInferredExprType(VarType upperBound) {
114115
return getExprType();
115116
}
116117

118+
@Override
119+
protected void addToTapestry(StringBuilder sb) {
120+
sb.append(name);
121+
sb.append(" ");
122+
sb.append(classname);
123+
sb.append(" ");
124+
125+
sb.append(descriptor.descriptorString);
126+
127+
if (instance != null) {
128+
sb.append(" ");
129+
instance.toTapestry(sb);
130+
}
131+
}
132+
133+
public static Exprent fromTapestry(ExprParser.Arg arg) {
134+
String name = arg.getNextString();
135+
String classname = arg.getNextString();
136+
String descString = arg.getNextString();
137+
138+
Exprent value = null;
139+
if (arg.peekNext() == ExprParser.Type.EXPRENT) {
140+
value = arg.getNextExprent();
141+
}
142+
143+
return new FieldExprent(name, classname, value == null, value, FieldDescriptor.parseDescriptor(descString), null);
144+
}
145+
117146
@Override
118147
public int getExprentUse() {
119148
//Revert the following line it produces messy code as follows:

src/org/jetbrains/java/decompiler/modules/decompiler/exps/FunctionExprent.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.jetbrains.java.decompiler.modules.decompiler.stats.Statement;
1212
import org.jetbrains.java.decompiler.modules.decompiler.vars.CheckTypesResult;
1313
import org.jetbrains.java.decompiler.modules.decompiler.vars.VarVersionPair;
14+
import org.jetbrains.java.decompiler.modules.serializer.ExprParser;
1415
import org.jetbrains.java.decompiler.struct.gen.CodeType;
1516
import org.jetbrains.java.decompiler.struct.gen.VarType;
1617
import org.jetbrains.java.decompiler.struct.gen.generics.GenericType;
@@ -457,6 +458,42 @@ else if (type2.type == CodeType.BOOLEAN) {
457458
return result;
458459
}
459460

461+
@Override
462+
protected void addToTapestry(StringBuilder sb) {
463+
sb.append(this.funcType.name());
464+
465+
if (implicitType != null) {
466+
sb.append(" ");
467+
sb.append(this.implicitType.toTapestryString());
468+
}
469+
470+
List<Exprent> operands = this.getLstOperands();
471+
472+
for (Exprent operand : operands) {
473+
sb.append(" ");
474+
operand.toTapestry(sb);
475+
}
476+
}
477+
478+
public static Exprent fromTapestry(ExprParser.Arg arg) {
479+
FunctionType type = FunctionType.valueOf(arg.getNextString());
480+
481+
VarType implicitType = null;
482+
if (arg.peekNext() == ExprParser.Type.STRING) {
483+
implicitType = VarType.fromTapestryString(arg.getNextString());
484+
}
485+
486+
List<Exprent> exprents = new ArrayList<>();
487+
while (arg.peekNext() == ExprParser.Type.EXPRENT) {
488+
exprents.add(arg.getNextExprent());
489+
}
490+
491+
FunctionExprent func = new FunctionExprent(type, exprents, null);
492+
func.setImplicitType(implicitType);
493+
494+
return func;
495+
}
496+
460497
@Override
461498
public List<Exprent> getAllExprents(List<Exprent> lst) {
462499
lst.addAll(this.lstOperands);

src/org/jetbrains/java/decompiler/modules/decompiler/exps/IfExprent.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package org.jetbrains.java.decompiler.modules.decompiler.exps;
55

66
import org.jetbrains.java.decompiler.modules.decompiler.exps.FunctionExprent.FunctionType;
7+
import org.jetbrains.java.decompiler.modules.serializer.ExprParser;
78
import org.jetbrains.java.decompiler.modules.decompiler.sforms.SFormsConstructor;
89
import org.jetbrains.java.decompiler.modules.decompiler.sforms.VarMapHolder;
910
import org.jetbrains.java.decompiler.modules.decompiler.stats.Statement;
@@ -122,6 +123,15 @@ public IfExprent negateIf() {
122123
return this;
123124
}
124125

126+
@Override
127+
protected void addToTapestry(StringBuilder sb) {
128+
condition.toTapestry(sb);
129+
}
130+
131+
public static Exprent fromTapestry(ExprParser.Arg arg) {
132+
return new IfExprent(arg.getNextExprent(), null);
133+
}
134+
125135
public Exprent getCondition() {
126136
return condition;
127137
}

0 commit comments

Comments
 (0)