Skip to content

Commit

Permalink
Improve categorization code by jumping over blocks of same types.
Browse files Browse the repository at this point in the history
  • Loading branch information
lahodaj committed Jul 28, 2022
1 parent 796eea4 commit cf5f4a0
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 18 deletions.
46 changes: 29 additions & 17 deletions src/java.base/share/classes/java/lang/runtime/SwitchBootstraps.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import java.security.PrivilegedAction;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
Expand Down Expand Up @@ -318,18 +319,27 @@ private static Class<?> generateInnerClass(MethodHandles.Lookup caller, Object[]
} else {
mv.visitVarInsn(ILOAD, 1);
Label dflt = new Label();
record Element(Label label, Class<?> clazz) {}
record Element(Label label, Class<?> clazz, Label falseTarget) {}
List<Element> cases = new ArrayList<Element>();
for (Object o : labels) {
cases.add(new Element(new Label(), (Class<?>) o));
Class<?> lastClass = null;
Label lastClassLabel = dflt;
for (int i = labels.length - 1; i >= 0; i--) {
Class<?> label = (Class<?>) labels[i];
Element currentElement = new Element(new Label(), label, lastClassLabel);
cases.add(currentElement);
if (lastClass != label) {
lastClassLabel = currentElement.label();
}
lastClass = label;
}
Collections.reverse(cases);
mv.visitTableSwitchInsn(0, labels.length - 1, dflt, cases.stream().map(e -> e.label()).toArray(s -> new Label[s]));
for (int idx = 0; idx < cases.size(); idx++) {
Element element = cases.get(idx);
mv.visitLabel(element.label());
mv.visitVarInsn(ALOAD, 0);
mv.visitTypeInsn(INSTANCEOF, element.clazz().getName().replace('.', '/'));
mv.visitJumpInsn(IFEQ, idx + 1 < cases.size() ? cases.get(idx + 1).label() : dflt);
mv.visitJumpInsn(IFEQ, element.falseTarget());
mv.iconst(idx);
mv.visitInsn(IRETURN);
}
Expand All @@ -347,19 +357,21 @@ record Element(Label label, Class<?> clazz) {}

final byte[] classBytes = cw.toByteArray();
// If requested, dump out to a file for debugging purposes
// var dumper = ProxyClassesDumper.getInstance("/tmp/classes/classes");
// if (dumper != null) {
// AccessController.doPrivileged(new PrivilegedAction<>() {
// @Override
// public Void run() {
// dumper.dumpClass("foobar", classBytes);
// return null;
// }
// }, null,
// new FilePermission("<<ALL FILES>>", "read, write"),
// // createDirectories may need it
// new PropertyPermission("user.dir", "read"));
// }
if (false) {
var dumper = ProxyClassesDumper.getInstance("/tmp/classes/classes");
if (dumper != null) {
AccessController.doPrivileged(new PrivilegedAction<>() {
@Override
public Void run() {
dumper.dumpClass("foobar", classBytes);
return null;
}
}, null,
new FilePermission("<<ALL FILES>>", "read, write"),
// createDirectories may need it
new PropertyPermission("user.dir", "read"));
}
}
try {
// this class is linked at the indy callsite; so define a hidden nestmate
MethodHandles.Lookup lookup;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -657,7 +657,7 @@ JCNewClass makeNewClass(Type ctype, List<JCExpression> args) {
return tree;
}

public List<JCCase> processCases(JCTree currentSwitch, List<JCCase> inputCases) {
protected List<JCCase> processCases(JCTree currentSwitch, List<JCCase> inputCases) {
interface AccummulatorResolver {
public void resolve(VarSymbol commonBinding, JCExpression commonNestedExpression, VarSymbol commonNestedBinding);
}
Expand Down

0 comments on commit cf5f4a0

Please sign in to comment.