Skip to content

Commit 05ff703

Browse files
committed
Merge branch 'release/v0.6.0'
2 parents 0447413 + d6444f9 commit 05ff703

File tree

254 files changed

+11730
-3226
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

254 files changed

+11730
-3226
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
name: "Validate Gradle Wrapper"
2+
on: [push, pull_request]
3+
4+
jobs:
5+
validation:
6+
name: "Validation"
7+
runs-on: ubuntu-latest
8+
steps:
9+
- uses: actions/checkout@v2
10+
- uses: gradle/wrapper-validation-action@v1.0.3
11+

.gitignore

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ out/
1010
*.iml
1111
build/
1212
cache.txt
13-
gradlew.bat
14-
gradle/wrapper/gradle-wrapper.properties
15-
gradle/wrapper/gradle-wrapper.jar
16-
gradlew
13+
/.classpath
14+
/.project
15+
/.settings/

.idea/inspectionProfiles/Project_Default.xml

Lines changed: 3 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="Procyon.CompilerTools Tests" type="JUnit" factoryName="JUnit">
3+
<module name="Procyon.Procyon.CompilerTools.test" />
4+
<option name="PACKAGE_NAME" value="" />
5+
<option name="MAIN_CLASS_NAME" value="" />
6+
<option name="METHOD_NAME" value="" />
7+
<option name="TEST_OBJECT" value="package" />
8+
<method v="2">
9+
<option name="Make" enabled="true" />
10+
</method>
11+
</configuration>
12+
</component>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="Procyon.Expressions Tests" type="JUnit" factoryName="JUnit">
3+
<module name="Procyon.Procyon.Expressions.test" />
4+
<option name="PACKAGE_NAME" value="" />
5+
<option name="MAIN_CLASS_NAME" value="" />
6+
<option name="METHOD_NAME" value="" />
7+
<option name="TEST_OBJECT" value="package" />
8+
<method v="2">
9+
<option name="Make" enabled="true" />
10+
</method>
11+
</configuration>
12+
</component>

Procyon.CompilerTools/.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/.classpath
2+
/.project
3+
/bin/
4+
/.settings/

Procyon.CompilerTools/src/main/java/com/strobel/assembler/flowanalysis/ControlFlowGraph.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import com.strobel.core.ExceptionUtilities;
2222
import com.strobel.core.VerifyArgument;
2323
import com.strobel.decompiler.PlainTextOutput;
24-
import com.strobel.functions.Block;
24+
import com.strobel.functions.Consumer;
2525
import com.strobel.functions.Function;
2626

2727
import java.io.File;
@@ -94,7 +94,7 @@ public final Iterable<ControlFlowNode> apply(final ControlFlowNode input) {
9494
return input.getSuccessors();
9595
}
9696
},
97-
new Block<ControlFlowNode>() {
97+
new Consumer<ControlFlowNode>() {
9898
@Override
9999
public final void accept(final ControlFlowNode b) {
100100
if (b == entryPoint) {
@@ -150,7 +150,7 @@ public final Iterable<ControlFlowNode> apply(final ControlFlowNode input) {
150150
return input.getDominatorTreeChildren();
151151
}
152152
},
153-
new Block<ControlFlowNode>() {
153+
new Consumer<ControlFlowNode>() {
154154
@Override
155155
public void accept(final ControlFlowNode n) {
156156
final Set<ControlFlowNode> dominanceFrontier = n.getDominanceFrontier();

Procyon.CompilerTools/src/main/java/com/strobel/assembler/flowanalysis/ControlFlowNode.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import com.strobel.core.VerifyArgument;
2727
import com.strobel.decompiler.DecompilerHelpers;
2828
import com.strobel.decompiler.PlainTextOutput;
29-
import com.strobel.functions.Block;
29+
import com.strobel.functions.Consumer;
3030
import com.strobel.functions.Function;
3131
import com.strobel.util.ContractUtils;
3232

@@ -240,7 +240,7 @@ public final Iterator<Instruction> iterator() {
240240

241241
public final void traversePreOrder(
242242
final Function<ControlFlowNode, Iterable<ControlFlowNode>> children,
243-
final Block<ControlFlowNode> visitAction) {
243+
final Consumer<ControlFlowNode> visitAction) {
244244

245245
if (_visited) {
246246
return;
@@ -256,7 +256,7 @@ public final void traversePreOrder(
256256

257257
public final void traversePostOrder(
258258
final Function<ControlFlowNode, Iterable<ControlFlowNode>> children,
259-
final Block<ControlFlowNode> visitAction) {
259+
final Consumer<ControlFlowNode> visitAction) {
260260

261261
if (_visited) {
262262
return;

Procyon.CompilerTools/src/main/java/com/strobel/assembler/ir/ConstantPool.java

Lines changed: 129 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -403,9 +403,16 @@ public static ConstantPool read(final Buffer b) {
403403
case MethodType:
404404
new MethodTypeEntry(pool, b.readUnsignedShort());
405405
break;
406+
case DynamicConstant:
406407
case InvokeDynamicInfo:
407408
new InvokeDynamicInfoEntry(pool, b.readUnsignedShort(), b.readUnsignedShort());
408409
break;
410+
case Module:
411+
new ModuleEntry(pool, b.readUnsignedShort());
412+
break;
413+
case Package:
414+
new PackageEntry(pool, b.readUnsignedShort());
415+
break;
409416
}
410417
}
411418

@@ -520,7 +527,10 @@ public static enum Tag {
520527
NameAndTypeDescriptor(12),
521528
MethodHandle(15),
522529
MethodType(16),
523-
InvokeDynamicInfo(18);
530+
DynamicConstant(17),
531+
InvokeDynamicInfo(18),
532+
Module(19),
533+
Package(20);
524534

525535
public final int value;
526536

@@ -529,16 +539,20 @@ public static enum Tag {
529539
}
530540

531541
public static Tag fromValue(final int value) {
532-
VerifyArgument.inRange(Tag.Utf8StringConstant.value, Tag.InvokeDynamicInfo.value, value, "value");
542+
VerifyArgument.inRange(minTag.value, maxTag.value, value, "value");
533543
return lookup[value];
534544
}
535545

546+
private final static Tag minTag;
547+
private final static Tag maxTag;
536548
private final static Tag[] lookup;
537549

538550
static {
539551
final Tag[] values = Tag.values();
540552

541-
lookup = new Tag[Tag.InvokeDynamicInfo.value + 1];
553+
minTag = values[0];
554+
maxTag = values[values.length - 1];
555+
lookup = new Tag[maxTag.value + 1];
542556

543557
for (final Tag tag : values) {
544558
lookup[tag.value] = tag;
@@ -566,6 +580,8 @@ public interface Visitor {
566580
void visitMethodType(MethodTypeEntry info);
567581
void visitStringConstant(StringConstantEntry info);
568582
void visitUtf8StringConstant(Utf8StringConstantEntry info);
583+
void visitModule(ModuleEntry info);
584+
void visitPackage(PackageEntry info);
569585
void visitEnd();
570586

571587
// <editor-fold defaultstate="collapsed" desc="Empty Visitor (No-Op)">
@@ -631,6 +647,14 @@ public void visitStringConstant(final StringConstantEntry info) {
631647
public void visitUtf8StringConstant(final Utf8StringConstantEntry info) {
632648
}
633649

650+
@Override
651+
public void visitModule(final ModuleEntry info) {
652+
}
653+
654+
@Override
655+
public void visitPackage(final PackageEntry info) {
656+
}
657+
634658
@Override
635659
public void visitEnd() {
636660
}
@@ -745,6 +769,18 @@ public void visitUtf8StringConstant(final Utf8StringConstantEntry info) {
745769
codeStream.writeUtf8(info.value);
746770
}
747771

772+
@Override
773+
public void visitModule(final ModuleEntry info) {
774+
codeStream.writeByte(info.getTag().value);
775+
codeStream.writeShort(info.nameIndex);
776+
}
777+
778+
@Override
779+
public void visitPackage(final PackageEntry info) {
780+
codeStream.writeByte(info.getTag().value);
781+
codeStream.writeShort(info.nameIndex);
782+
}
783+
748784
@Override
749785
public void visitEnd() {
750786
}
@@ -1073,6 +1109,96 @@ public String toString() {
10731109
}
10741110
}
10751111

1112+
public static class ModuleEntry extends ConstantEntry {
1113+
1114+
public final int nameIndex;
1115+
1116+
public ModuleEntry(final ConstantPool owner, final int nameIndex) {
1117+
super(owner);
1118+
1119+
this.nameIndex = nameIndex;
1120+
owner._newKey.set(getTag(), nameIndex);
1121+
owner._entryMap.put(owner._newKey.clone(), this);
1122+
owner._newKey.clear();
1123+
}
1124+
1125+
@Override
1126+
void fixupKey(final Key key) {
1127+
key.set(Tag.Module, nameIndex);
1128+
}
1129+
1130+
public Tag getTag() {
1131+
return Tag.Module;
1132+
}
1133+
1134+
public int byteLength() {
1135+
return 3;
1136+
}
1137+
1138+
public String getName() {
1139+
return ((Utf8StringConstantEntry) owner.get(nameIndex, Tag.Utf8StringConstant)).value;
1140+
}
1141+
1142+
public void accept(final Visitor visitor) {
1143+
visitor.visitModule(this);
1144+
}
1145+
1146+
@Override
1147+
public String toString() {
1148+
return "ModuleEntry[nameIndex: " + nameIndex + "]";
1149+
}
1150+
1151+
@Override
1152+
public Object getConstantValue() {
1153+
return getName();
1154+
}
1155+
}
1156+
1157+
public static class PackageEntry extends ConstantEntry {
1158+
1159+
public final int nameIndex;
1160+
1161+
public PackageEntry(final ConstantPool owner, final int nameIndex) {
1162+
super(owner);
1163+
1164+
this.nameIndex = nameIndex;
1165+
owner._newKey.set(getTag(), nameIndex);
1166+
owner._entryMap.put(owner._newKey.clone(), this);
1167+
owner._newKey.clear();
1168+
}
1169+
1170+
@Override
1171+
void fixupKey(final Key key) {
1172+
key.set(Tag.Package, nameIndex);
1173+
}
1174+
1175+
public Tag getTag() {
1176+
return Tag.Package;
1177+
}
1178+
1179+
public int byteLength() {
1180+
return 3;
1181+
}
1182+
1183+
public String getName() {
1184+
return ((Utf8StringConstantEntry) owner.get(nameIndex, Tag.Utf8StringConstant)).value;
1185+
}
1186+
1187+
public void accept(final Visitor visitor) {
1188+
visitor.visitPackage(this);
1189+
}
1190+
1191+
@Override
1192+
public String toString() {
1193+
return "PackageEntry[nameIndex: " + nameIndex + "]";
1194+
}
1195+
1196+
@Override
1197+
public Object getConstantValue() {
1198+
return getName();
1199+
}
1200+
}
1201+
10761202
public static final class DoubleConstantEntry extends ConstantEntry {
10771203
public final double value;
10781204

Procyon.CompilerTools/src/main/java/com/strobel/assembler/ir/FrameValue.java

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

1717
package com.strobel.assembler.ir;
1818

19+
import com.strobel.assembler.metadata.MethodHandle;
1920
import com.strobel.assembler.metadata.TypeReference;
2021
import com.strobel.core.Comparer;
2122
import com.strobel.core.VerifyArgument;
@@ -96,6 +97,10 @@ public static FrameValue makeReference(final TypeReference type) {
9697
return new FrameValue(FrameValueType.Reference, VerifyArgument.notNull(type, "type"));
9798
}
9899

100+
public static FrameValue makeMethodHandle(final MethodHandle handle) {
101+
return new FrameValue(FrameValueType.Reference, VerifyArgument.notNull(handle, "handle"));
102+
}
103+
99104
public static FrameValue makeAddress(final Instruction target) {
100105
return new FrameValue(FrameValueType.Address, VerifyArgument.notNull(target, "target"));
101106
}

Procyon.CompilerTools/src/main/java/com/strobel/assembler/ir/Instruction.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,7 @@
1616

1717
package com.strobel.assembler.ir;
1818

19-
import com.strobel.assembler.metadata.DynamicCallSite;
20-
import com.strobel.assembler.metadata.FieldReference;
21-
import com.strobel.assembler.metadata.Label;
22-
import com.strobel.assembler.metadata.MethodReference;
23-
import com.strobel.assembler.metadata.SwitchInfo;
24-
import com.strobel.assembler.metadata.TypeReference;
25-
import com.strobel.assembler.metadata.VariableReference;
19+
import com.strobel.assembler.metadata.*;
2620
import com.strobel.core.ArrayUtilities;
2721
import com.strobel.core.VerifyArgument;
2822
import com.strobel.decompiler.DecompilerHelpers;
@@ -530,6 +524,9 @@ public void accept(final InstructionVisitor visitor) {
530524
else if (_operand instanceof TypeReference) {
531525
visitor.visitConstant(_opCode, (TypeReference) _operand);
532526
}
527+
else if (_operand instanceof MethodHandle) {
528+
visitor.visitConstant(_opCode, (MethodHandle) _operand);
529+
}
533530
else {
534531
final Number number = (Number) _operand;
535532

Procyon.CompilerTools/src/main/java/com/strobel/assembler/ir/InstructionVisitor.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public interface InstructionVisitor {
2828
void visit(final OpCode opCode);
2929

3030
void visitConstant(final OpCode opCode, final TypeReference value);
31+
void visitConstant(final OpCode opCode, final MethodHandle value);
3132
void visitConstant(final OpCode opCode, final int value);
3233
void visitConstant(final OpCode opCode, final long value);
3334
void visitConstant(final OpCode opCode, final float value);
@@ -63,6 +64,10 @@ public void visit(final OpCode opCode) {
6364
public void visitConstant(final OpCode opCode, final TypeReference value) {
6465
}
6566

67+
@Override
68+
public void visitConstant(final OpCode opCode, final MethodHandle value) {
69+
}
70+
6671
@Override
6772
public void visitConstant(final OpCode opCode, final int value) {
6873
}

0 commit comments

Comments
 (0)