Skip to content

Commit 8586048

Browse files
committed
Merge branch 'post-java8-features' into v0.6-staging
2 parents d52716d + 2d8798b commit 8586048

File tree

178 files changed

+8047
-1825
lines changed

Some content is hidden

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

178 files changed

+8047
-1825
lines changed

.idea/inspectionProfiles/Project_Default.xml

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
+12
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>
+12
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/src/main/java/com/strobel/assembler/flowanalysis/ControlFlowGraph.java

+3-3
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

+3-3
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

+127-3
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,12 @@ public static ConstantPool read(final Buffer b) {
406406
case InvokeDynamicInfo:
407407
new InvokeDynamicInfoEntry(pool, b.readUnsignedShort(), b.readUnsignedShort());
408408
break;
409+
case Module:
410+
new ModuleEntry(pool, b.readUnsignedShort());
411+
break;
412+
case Package:
413+
new PackageEntry(pool, b.readUnsignedShort());
414+
break;
409415
}
410416
}
411417

@@ -520,7 +526,9 @@ public static enum Tag {
520526
NameAndTypeDescriptor(12),
521527
MethodHandle(15),
522528
MethodType(16),
523-
InvokeDynamicInfo(18);
529+
InvokeDynamicInfo(18),
530+
Module(19),
531+
Package(20);
524532

525533
public final int value;
526534

@@ -529,16 +537,20 @@ public static enum Tag {
529537
}
530538

531539
public static Tag fromValue(final int value) {
532-
VerifyArgument.inRange(Tag.Utf8StringConstant.value, Tag.InvokeDynamicInfo.value, value, "value");
540+
VerifyArgument.inRange(minTag.value, maxTag.value, value, "value");
533541
return lookup[value];
534542
}
535543

544+
private final static Tag minTag;
545+
private final static Tag maxTag;
536546
private final static Tag[] lookup;
537547

538548
static {
539549
final Tag[] values = Tag.values();
540550

541-
lookup = new Tag[Tag.InvokeDynamicInfo.value + 1];
551+
minTag = values[0];
552+
maxTag = values[values.length - 1];
553+
lookup = new Tag[maxTag.value + 1];
542554

543555
for (final Tag tag : values) {
544556
lookup[tag.value] = tag;
@@ -566,6 +578,8 @@ public interface Visitor {
566578
void visitMethodType(MethodTypeEntry info);
567579
void visitStringConstant(StringConstantEntry info);
568580
void visitUtf8StringConstant(Utf8StringConstantEntry info);
581+
void visitModule(ModuleEntry info);
582+
void visitPackage(PackageEntry info);
569583
void visitEnd();
570584

571585
// <editor-fold defaultstate="collapsed" desc="Empty Visitor (No-Op)">
@@ -631,6 +645,14 @@ public void visitStringConstant(final StringConstantEntry info) {
631645
public void visitUtf8StringConstant(final Utf8StringConstantEntry info) {
632646
}
633647

648+
@Override
649+
public void visitModule(final ModuleEntry info) {
650+
}
651+
652+
@Override
653+
public void visitPackage(final PackageEntry info) {
654+
}
655+
634656
@Override
635657
public void visitEnd() {
636658
}
@@ -745,6 +767,18 @@ public void visitUtf8StringConstant(final Utf8StringConstantEntry info) {
745767
codeStream.writeUtf8(info.value);
746768
}
747769

770+
@Override
771+
public void visitModule(final ModuleEntry info) {
772+
codeStream.writeByte(info.getTag().value);
773+
codeStream.writeShort(info.nameIndex);
774+
}
775+
776+
@Override
777+
public void visitPackage(final PackageEntry info) {
778+
codeStream.writeByte(info.getTag().value);
779+
codeStream.writeShort(info.nameIndex);
780+
}
781+
748782
@Override
749783
public void visitEnd() {
750784
}
@@ -1073,6 +1107,96 @@ public String toString() {
10731107
}
10741108
}
10751109

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

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

+9-8
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525

2626
import java.util.List;
2727

28+
import static com.strobel.core.CollectionUtilities.lastOrDefault;
29+
2830
/**
2931
* @author Mike Strobel
3032
*/
@@ -265,14 +267,13 @@ protected SourceAttribute readAttributeCore(final String name, final Buffer buff
265267
if (methodParameters != arguments.length + 3) {
266268
final MethodDefinition resolved = bootstrapMethod.resolve();
267269

268-
final int varArgsAdjustment;
269-
270-
if(resolved == null || !resolved.isVarArgs()) {
271-
varArgsAdjustment = 0;
272-
}
273-
else {
274-
varArgsAdjustment = 1;
275-
}
270+
ParameterDefinition lastParameter;
271+
272+
final boolean varArgs = resolved != null ? resolved.isVarArgs()
273+
: ((lastParameter = lastOrDefault(parameters)) != null &&
274+
lastParameter.getParameterType().isArray());
275+
276+
final int varArgsAdjustment = varArgs ? 1 : 0;
276277

277278
final int varArgsAdjustedMethodParameters = methodParameters - varArgsAdjustment;
278279

Procyon.CompilerTools/src/main/java/com/strobel/assembler/ir/attributes/AttributeNames.java

+6
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ public final class AttributeNames {
4141
public static final String RuntimeInvisibleParameterAnnotations = "RuntimeInvisibleParameterAnnotations";
4242
public static final String AnnotationDefault = "AnnotationDefault";
4343
public static final String MethodParameters = "MethodParameters";
44+
public static final String Record = "Record";
45+
public static final String Module = "Module";
46+
public static final String ModulePackages = "ModulePackages";
47+
public static final String ModuleMainClass = "ModuleMainClass";
48+
public static final String ModuleTarget = "ModuleTarget";
49+
public static final String PermittedSubclasses = "PermittedSubclasses";
4450

4551
private AttributeNames() {
4652
throw ContractUtils.unreachable();

0 commit comments

Comments
 (0)