diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..8d97a063 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,19 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "gradle" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" + time: "17:00" + timezone: "Europe/Paris" + - package-ecosystem: "github-actions" + directory: "/" # Location of GitHub Actions workflows + schedule: + interval: "daily" + time: "17:00" + timezone: "Europe/Paris" diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 00000000..f1cf9adb --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,39 @@ +name: Coverage + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +permissions: + contents: read + +jobs: + test-and-coverage: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Set up Java + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: "8" + cache: gradle + + - name: Ensure Gradle wrapper is executable + run: chmod +x ./gradlew + + - name: Run tests and generate merged JaCoCo report + run: ./gradlew --no-daemon testCodeCoverageReport + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v5 + with: + fail_ci_if_error: true + verbose: true + files: build/reports/jacoco/testCodeCoverageReport/testCodeCoverageReport.xml + diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml index 3a8f311e..c7c435ce 100644 --- a/.github/workflows/gradle-wrapper-validation.yml +++ b/.github/workflows/gradle-wrapper-validation.yml @@ -6,6 +6,6 @@ jobs: name: "Validation" runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: gradle/wrapper-validation-action@v1.0.3 + - uses: actions/checkout@v6 + - uses: gradle/wrapper-validation-action@v3.5.0 diff --git a/.github/workflows/manual-release.yml b/.github/workflows/manual-release.yml new file mode 100644 index 00000000..5e6b0b69 --- /dev/null +++ b/.github/workflows/manual-release.yml @@ -0,0 +1,130 @@ +name: Manual Release + +on: + workflow_dispatch: + inputs: + next_snapshot_version: + description: "Optional. Next snapshot version in x.y.z-SNAPSHOT format (example: 0.6.3-SNAPSHOT). If empty, we bump the patch number." + required: false + default: "" + version_file: + description: "Path to the Java file that contains the VERSION constant." + required: false + default: "Procyon.Core/src/main/java/com/strobel/Procyon.java" + +permissions: + contents: write + +concurrency: + group: manual-release-${{ github.ref }} + cancel-in-progress: false + +jobs: + release: + if: ${{ github.ref_type == 'branch' }} + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + fetch-tags: true + ref: ${{ github.ref }} + + - name: Prepare release, tag, and next snapshot + env: + VERSION_FILE: ${{ github.event.inputs.version_file }} + NEXT_SNAPSHOT_INPUT: ${{ github.event.inputs.next_snapshot_version }} + BRANCH_NAME: ${{ github.ref_name }} + run: | + set -euo pipefail + + if [[ -z "${VERSION_FILE}" ]]; then + VERSION_FILE="Procyon.Core/src/main/java/com/strobel/Procyon.java" + fi + + if [[ ! -f "${VERSION_FILE}" ]]; then + echo "Version file not found: ${VERSION_FILE}" + exit 1 + fi + + if [[ -n "$(git status --porcelain)" ]]; then + echo "Working tree is not clean. Please run the workflow from a clean branch state." + git status --porcelain + exit 1 + fi + + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + + version_line="$(grep -E 'private[[:space:]]+static[[:space:]]+final[[:space:]]+String[[:space:]]+VERSION[[:space:]]*=' "${VERSION_FILE}" | head -n 1 || true)" + if [[ -z "${version_line}" ]]; then + echo "Could not find VERSION constant in: ${VERSION_FILE}" + exit 1 + fi + + current_version="$(echo "${version_line}" | sed -E 's/.*VERSION[[:space:]]*=[[:space:]]*"([^"]+)".*/\1/')" + if [[ -z "${current_version}" ]]; then + echo "Could not extract current version from VERSION constant in: ${VERSION_FILE}" + exit 1 + fi + + if [[ "${current_version}" != *-SNAPSHOT ]]; then + echo "Expected a -SNAPSHOT version, but found: ${current_version}" + exit 1 + fi + + release_version="${current_version%-SNAPSHOT}" + + if [[ ! "${release_version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "Release version must be in x.y.z format. Found: ${release_version}" + exit 1 + fi + + if [[ -n "${NEXT_SNAPSHOT_INPUT}" ]]; then + next_snapshot_version="${NEXT_SNAPSHOT_INPUT}" + else + IFS='.' read -r major minor patch <<< "${release_version}" + patch=$((patch + 1)) + next_snapshot_version="${major}.${minor}.${patch}-SNAPSHOT" + fi + + if [[ ! "${next_snapshot_version}" =~ ^[0-9]+\.[0-9]+\.[0-9]+-SNAPSHOT$ ]]; then + echo "Next snapshot version must be in x.y.z-SNAPSHOT format. Found: ${next_snapshot_version}" + exit 1 + fi + + release_sed_expr="s/(private[[:space:]]+static[[:space:]]+final[[:space:]]+String[[:space:]]+VERSION[[:space:]]*=[[:space:]]*\")[^\"]+(\")/\1${release_version}\2/" + next_sed_expr="s/(private[[:space:]]+static[[:space:]]+final[[:space:]]+String[[:space:]]+VERSION[[:space:]]*=[[:space:]]*\")[^\"]+(\")/\1${next_snapshot_version}\2/" + + # We set the version to the release version (remove -SNAPSHOT), then commit and push. + sed -i -E "${release_sed_expr}" "${VERSION_FILE}" + + if git diff --quiet; then + echo "No changes after setting release version. Refusing to continue." + exit 1 + fi + + git add "${VERSION_FILE}" + git commit -m "prepare release ${release_version}" + git push origin "HEAD:${BRANCH_NAME}" + + if git rev-parse -q --verify "refs/tags/${release_version}" >/dev/null; then + echo "Tag already exists: ${release_version}" + exit 1 + fi + + git tag "${release_version}" + git push origin "refs/tags/${release_version}" + + # We set the version to the next development snapshot, then commit and push. + sed -i -E "${next_sed_expr}" "${VERSION_FILE}" + + if git diff --quiet; then + echo "No changes after setting next snapshot version. Refusing to continue." + exit 1 + fi + + git add "${VERSION_FILE}" + git commit -m "prepare for next development iteration ${next_snapshot_version}" + git push origin "HEAD:${BRANCH_NAME}" diff --git a/Procyon.CompilerTools/build.gradle b/Procyon.CompilerTools/build.gradle index 89e8578f..1b76c000 100644 --- a/Procyon.CompilerTools/build.gradle +++ b/Procyon.CompilerTools/build.gradle @@ -1,7 +1,7 @@ compileTestJava.options.encoding = 'UTF-8' dependencies { - compile project(':Procyon.Core') - testCompile project(':Procyon.Reflection') - testCompile files('src/test/resources') + implementation project(':Procyon.Core') + testImplementation project(':Procyon.Reflection') + testImplementation files('src/test/resources') } diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodDefinition.java b/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodDefinition.java index c4a5d223..74e52a9e 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodDefinition.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodDefinition.java @@ -219,15 +219,17 @@ public int hashCode() { @Override public boolean equals(final Object obj) { - if (obj instanceof MethodDefinition) { - final MethodDefinition other = (MethodDefinition) obj; - - return StringUtilities.equals(getName(), other.getName()) && - StringUtilities.equals(getErasedSignature(), other.getErasedSignature()) && - typeNamesMatch(getDeclaringType(), other.getDeclaringType()); + if (obj == this) { + return true; + } + if (obj == null || obj.getClass() != getClass()) { + return false; } + final MethodDefinition other = (MethodDefinition) obj; - return false; + return StringUtilities.equals(getName(), other.getName()) && + StringUtilities.equals(getErasedSignature(), other.getErasedSignature()) && + typeNamesMatch(getDeclaringType(), other.getDeclaringType()); } @Override @@ -236,7 +238,7 @@ public void invalidateSignature() { _erasedSignature = null; } - private boolean typeNamesMatch(final TypeReference t1, final TypeReference t2) { + private static boolean typeNamesMatch(final TypeReference t1, final TypeReference t2) { return t1 != null && t2 != null && StringUtilities.equals(t1.getFullName(), t2.getFullName()); diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodReference.java b/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodReference.java index a3a0caf9..9b4c67b2 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodReference.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/assembler/metadata/MethodReference.java @@ -17,7 +17,6 @@ package com.strobel.assembler.metadata; import com.strobel.core.StringUtilities; -import com.strobel.core.VerifyArgument; import com.strobel.util.ContractUtils; import java.util.Collections; @@ -28,21 +27,24 @@ * Date: 1/6/13 * Time: 2:29 PM */ -public abstract class MethodReference extends MemberReference implements IMethodSignature, - IGenericParameterProvider, - IGenericContext { - protected final static String CONSTRUCTOR_NAME = ""; - protected final static String STATIC_INITIALIZER_NAME = ""; +public abstract class MethodReference extends MemberReference implements IMethodSignature { + protected static final String CONSTRUCTOR_NAME = ""; + protected static final String STATIC_INITIALIZER_NAME = ""; // - public abstract TypeReference getReturnType(); - public boolean hasParameters() { return !getParameters().isEmpty(); } - public abstract List getParameters(); + public boolean hasParameter(String name) { + for (ParameterDefinition parameterDefinition : getParameters()) { + if (parameterDefinition.getName().equals(name)) { + return true; + } + } + return false; + } public List getThrownTypes() { return Collections.emptyList(); @@ -117,11 +119,11 @@ protected StringBuilder appendName(final StringBuilder sb, final boolean fullNam } public boolean isConstructor() { - return MethodDefinition.CONSTRUCTOR_NAME.equals(getName()); + return CONSTRUCTOR_NAME.equals(getName()); } public boolean isTypeInitializer() { - return MethodDefinition.STATIC_INITIALIZER_NAME.equals(getName()); + return STATIC_INITIALIZER_NAME.equals(getName()); } // @@ -171,9 +173,9 @@ public GenericParameter findTypeVariable(final String name) { public MethodDefinition resolve() { final TypeReference declaringType = getDeclaringType(); - if (declaringType == null) + if (declaringType == null) { throw ContractUtils.unsupported(); - + } return declaringType.resolve(this); } diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/Decompiler.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/Decompiler.java index 7b348f4d..8d801830 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/Decompiler.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/Decompiler.java @@ -19,14 +19,21 @@ import com.strobel.assembler.InputTypeLoader; import com.strobel.assembler.metadata.*; import com.strobel.core.VerifyArgument; +import com.strobel.decompiler.languages.TypeDecompilationResults; import com.strobel.decompiler.languages.java.JavaFormattingOptions; +import java.util.Collections; + public final class Decompiler { - public static void decompile(final String internalName, final ITextOutput output) { - decompile(internalName, output, new DecompilerSettings()); + + private Decompiler() { + } + + public static TypeDecompilationResults decompile(final String internalName, final ITextOutput output) { + return decompile(internalName, output, new DecompilerSettings()); } - public static void decompile(final String internalName, final ITextOutput output, final DecompilerSettings settings) { + public static TypeDecompilationResults decompile(final String internalName, final ITextOutput output, final DecompilerSettings settings) { VerifyArgument.notNull(internalName, "internalName"); VerifyArgument.notNull(settings, "settings"); @@ -53,7 +60,7 @@ public static void decompile(final String internalName, final ITextOutput output if (type == null || (resolvedType = type.resolve()) == null) { output.writeLine("!!! ERROR: Failed to load class %s.", internalName); - return; + return new TypeDecompilationResults(null); } DeobfuscationUtilities.processType(resolvedType); @@ -67,6 +74,6 @@ public static void decompile(final String internalName, final ITextOutput output settings.setJavaFormattingOptions(JavaFormattingOptions.createDefault()); } - settings.getLanguage().decompileType(resolvedType, output, options); + return settings.getLanguage().decompileType(resolvedType, output, options); } } diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java index 90cb2546..97d07f31 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/JavaOutputVisitor.java @@ -19,7 +19,6 @@ import com.strobel.assembler.ir.attributes.AttributeNames; import com.strobel.assembler.ir.attributes.LineNumberTableAttribute; import com.strobel.assembler.ir.attributes.ModuleAttribute; -import com.strobel.assembler.ir.attributes.PermittedSubclassesAttribute; import com.strobel.assembler.ir.attributes.SourceAttribute; import com.strobel.assembler.metadata.*; import com.strobel.core.ArrayUtilities; @@ -959,7 +958,27 @@ else if (parent instanceof WhileStatement) { } if (!(parent instanceof Expression || parent instanceof DoWhileStatement)) { - newLine(); + if ((parent.getNextSibling() != null && parent.getNextSibling().getRole() == TryCatchStatement.FINALLY_BLOCK_ROLE) || (node.getRole() == TryCatchStatement.TRY_BLOCK_ROLE && node.getNextSibling().getRole() == TryCatchStatement.FINALLY_BLOCK_ROLE)) { + if (policy.PlaceFinallyOnNewLine) { + newLine(); + } else { + space(); + } + } else if (parent.getNextSibling() instanceof CatchClause || (parent instanceof TryCatchStatement && node.getNextSibling() instanceof CatchClause)) { + if (policy.PlaceCatchOnNewLine) { + newLine(); + } else { + space(); + } + } else if (parent instanceof IfElseStatement && node.getRole() == IfElseStatement.TRUE_ROLE && node != parent.getLastChild()) { + if (policy.PlaceElseOnNewLine) { + newLine(); + } else { + space(); + } + } else { + newLine(); + } } endNode(node); @@ -1654,6 +1673,7 @@ public Void visitParameterDeclaration(final ParameterDeclaration node, final Voi @Override public Void visitFieldDeclaration(final FieldDeclaration node, final Void ignored) { startNode(node); + formatter.resetLineNumberOffsets(OffsetToLineNumberConverter.NOOP_CONVERTER); writeAnnotations(node.getAnnotations(), true); writeModifiers(node.getModifiers()); @@ -2695,7 +2715,7 @@ public Void visitArrayCreationExpression(final ArrayCreationExpression node, fin boolean needType = true; - //noinspection RedundantIfStatement + // noinspection RedundantIfStatement if (node.getDimensions().isEmpty() && node.getType() != null && (node.getParent() instanceof ArrayInitializerExpression || diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/LineNumberVisitor.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/LineNumberVisitor.java new file mode 100644 index 00000000..d808c249 --- /dev/null +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/LineNumberVisitor.java @@ -0,0 +1,505 @@ +package com.strobel.decompiler.languages.java; + +import com.strobel.decompiler.languages.java.ast.Annotation; +import com.strobel.decompiler.languages.java.ast.AnonymousObjectCreationExpression; +import com.strobel.decompiler.languages.java.ast.ArrayCreationExpression; +import com.strobel.decompiler.languages.java.ast.ArrayInitializerExpression; +import com.strobel.decompiler.languages.java.ast.ArraySpecifier; +import com.strobel.decompiler.languages.java.ast.AssertStatement; +import com.strobel.decompiler.languages.java.ast.AssignmentExpression; +import com.strobel.decompiler.languages.java.ast.AstNode; +import com.strobel.decompiler.languages.java.ast.BinaryOperatorExpression; +import com.strobel.decompiler.languages.java.ast.BlockStatement; +import com.strobel.decompiler.languages.java.ast.BreakStatement; +import com.strobel.decompiler.languages.java.ast.BytecodeConstant; +import com.strobel.decompiler.languages.java.ast.CaseLabel; +import com.strobel.decompiler.languages.java.ast.CastExpression; +import com.strobel.decompiler.languages.java.ast.CatchClause; +import com.strobel.decompiler.languages.java.ast.ClassOfExpression; +import com.strobel.decompiler.languages.java.ast.Comment; +import com.strobel.decompiler.languages.java.ast.CompilationUnit; +import com.strobel.decompiler.languages.java.ast.ComposedType; +import com.strobel.decompiler.languages.java.ast.ConditionalExpression; +import com.strobel.decompiler.languages.java.ast.ConstructorDeclaration; +import com.strobel.decompiler.languages.java.ast.ContinueStatement; +import com.strobel.decompiler.languages.java.ast.DoWhileStatement; +import com.strobel.decompiler.languages.java.ast.EmptyStatement; +import com.strobel.decompiler.languages.java.ast.EnumValueDeclaration; +import com.strobel.decompiler.languages.java.ast.Expression; +import com.strobel.decompiler.languages.java.ast.ExpressionStatement; +import com.strobel.decompiler.languages.java.ast.FieldDeclaration; +import com.strobel.decompiler.languages.java.ast.ForEachStatement; +import com.strobel.decompiler.languages.java.ast.ForStatement; +import com.strobel.decompiler.languages.java.ast.GotoStatement; +import com.strobel.decompiler.languages.java.ast.IAstVisitor; +import com.strobel.decompiler.languages.java.ast.Identifier; +import com.strobel.decompiler.languages.java.ast.IdentifierExpression; +import com.strobel.decompiler.languages.java.ast.IfElseStatement; +import com.strobel.decompiler.languages.java.ast.ImportDeclaration; +import com.strobel.decompiler.languages.java.ast.IndexerExpression; +import com.strobel.decompiler.languages.java.ast.InlinedBytecodeExpression; +import com.strobel.decompiler.languages.java.ast.InstanceInitializer; +import com.strobel.decompiler.languages.java.ast.InstanceOfExpression; +import com.strobel.decompiler.languages.java.ast.IntersectionType; +import com.strobel.decompiler.languages.java.ast.InvocationExpression; +import com.strobel.decompiler.languages.java.ast.JavaTokenNode; +import com.strobel.decompiler.languages.java.ast.LabelStatement; +import com.strobel.decompiler.languages.java.ast.LabeledStatement; +import com.strobel.decompiler.languages.java.ast.LambdaExpression; +import com.strobel.decompiler.languages.java.ast.LocalTypeDeclarationStatement; +import com.strobel.decompiler.languages.java.ast.MemberReferenceExpression; +import com.strobel.decompiler.languages.java.ast.MethodDeclaration; +import com.strobel.decompiler.languages.java.ast.MethodGroupExpression; +import com.strobel.decompiler.languages.java.ast.ModuleDeclaration; +import com.strobel.decompiler.languages.java.ast.NewLineNode; +import com.strobel.decompiler.languages.java.ast.NullReferenceExpression; +import com.strobel.decompiler.languages.java.ast.ObjectCreationExpression; +import com.strobel.decompiler.languages.java.ast.PackageDeclaration; +import com.strobel.decompiler.languages.java.ast.ParameterDeclaration; +import com.strobel.decompiler.languages.java.ast.ParenthesizedExpression; +import com.strobel.decompiler.languages.java.ast.PrimitiveExpression; +import com.strobel.decompiler.languages.java.ast.ReturnStatement; +import com.strobel.decompiler.languages.java.ast.SimpleType; +import com.strobel.decompiler.languages.java.ast.SuperReferenceExpression; +import com.strobel.decompiler.languages.java.ast.SwitchExpression; +import com.strobel.decompiler.languages.java.ast.SwitchExpressionArm; +import com.strobel.decompiler.languages.java.ast.SwitchSection; +import com.strobel.decompiler.languages.java.ast.SwitchStatement; +import com.strobel.decompiler.languages.java.ast.SynchronizedStatement; +import com.strobel.decompiler.languages.java.ast.TextNode; +import com.strobel.decompiler.languages.java.ast.ThisReferenceExpression; +import com.strobel.decompiler.languages.java.ast.ThrowStatement; +import com.strobel.decompiler.languages.java.ast.TryCatchStatement; +import com.strobel.decompiler.languages.java.ast.TypeDeclaration; +import com.strobel.decompiler.languages.java.ast.TypeParameterDeclaration; +import com.strobel.decompiler.languages.java.ast.TypeReferenceExpression; +import com.strobel.decompiler.languages.java.ast.UnaryOperatorExpression; +import com.strobel.decompiler.languages.java.ast.UnionType; +import com.strobel.decompiler.languages.java.ast.VariableDeclarationStatement; +import com.strobel.decompiler.languages.java.ast.VariableInitializer; +import com.strobel.decompiler.languages.java.ast.WhileStatement; +import com.strobel.decompiler.languages.java.ast.WildcardType; +import com.strobel.decompiler.patterns.Pattern; + +public class LineNumberVisitor implements IAstVisitor { + + private final LineNumberTableConverter lineNumberTableConverter; + private int minLineNumber = Integer.MAX_VALUE; + private int maxLineNumber = Integer.MIN_VALUE; + + public LineNumberVisitor(final LineNumberTableConverter lineNumberTableConverter) { + this.lineNumberTableConverter = lineNumberTableConverter; + } + + private Void updateMinMaxLineNumbers(int offset, AstNode node) { + if (offset != Expression.MYSTERY_OFFSET) { + int lineNumber = lineNumberTableConverter.getLineForOffset(offset); + minLineNumber = Math.min(minLineNumber, lineNumber); + maxLineNumber = Math.max(maxLineNumber, lineNumber); + } + visitChildren(node); + return null; + } + + private void visitChildren(AstNode node) { + if (node.hasChildren()) { + for (AstNode child : node.getChildren()) { + child.acceptVisitor(this, null); + } + } + } + + @Override + public Void visitComment(Comment node, Void data) { + return null; + } + + @Override + public Void visitPatternPlaceholder(AstNode node, Pattern pattern, Void data) { + return null; + } + + @Override + public Void visitInvocationExpression(InvocationExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitTypeReference(TypeReferenceExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitJavaTokenNode(JavaTokenNode node, Void data) { + return null; + } + + @Override + public Void visitMemberReferenceExpression(MemberReferenceExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitIdentifier(Identifier node, Void data) { + return null; + } + + @Override + public Void visitNullReferenceExpression(NullReferenceExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitThisReferenceExpression(ThisReferenceExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitSuperReferenceExpression(SuperReferenceExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitClassOfExpression(ClassOfExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitBlockStatement(BlockStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitExpressionStatement(ExpressionStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitBreakStatement(BreakStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitContinueStatement(ContinueStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitDoWhileStatement(DoWhileStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitEmptyStatement(EmptyStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitIfElseStatement(IfElseStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitLabelStatement(LabelStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitLabeledStatement(LabeledStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitReturnStatement(ReturnStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitSwitchStatement(SwitchStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitSwitchSection(SwitchSection node, Void data) { + return null; + } + + @Override + public Void visitSwitchExpression(SwitchExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitSwitchExpressionArm(SwitchExpressionArm node, Void data) { + return null; + } + + @Override + public Void visitCaseLabel(CaseLabel node, Void data) { + return null; + } + + @Override + public Void visitThrowStatement(ThrowStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitCatchClause(CatchClause node, Void data) { + return null; + } + + @Override + public Void visitAnnotation(Annotation node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitNewLine(NewLineNode node, Void data) { + return null; + } + + @Override + public Void visitVariableDeclaration(VariableDeclarationStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitVariableInitializer(VariableInitializer node, Void data) { + visitChildren(node); + return null; + } + + @Override + public Void visitText(TextNode node, Void data) { + return null; + } + + @Override + public Void visitImportDeclaration(ImportDeclaration node, Void data) { + return null; + } + + @Override + public Void visitSimpleType(SimpleType node, Void data) { + return null; + } + + @Override + public Void visitMethodDeclaration(MethodDeclaration node, Void data) { + return null; + } + + @Override + public Void visitInitializerBlock(InstanceInitializer node, Void data) { + return null; + } + + @Override + public Void visitConstructorDeclaration(ConstructorDeclaration node, Void data) { + return null; + } + + @Override + public Void visitTypeParameterDeclaration(TypeParameterDeclaration node, Void data) { + return null; + } + + @Override + public Void visitParameterDeclaration(ParameterDeclaration node, Void data) { + return null; + } + + @Override + public Void visitFieldDeclaration(FieldDeclaration node, Void data) { + return null; + } + + @Override + public Void visitTypeDeclaration(TypeDeclaration node, Void data) { + return null; + } + + @Override + public Void visitModuleDeclaration(ModuleDeclaration node, Void data) { + return null; + } + + @Override + public Void visitCompilationUnit(CompilationUnit node, Void data) { + return null; + } + + @Override + public Void visitPackageDeclaration(PackageDeclaration node, Void data) { + return null; + } + + @Override + public Void visitArraySpecifier(ArraySpecifier node, Void data) { + return null; + } + + @Override + public Void visitComposedType(ComposedType node, Void data) { + return null; + } + + @Override + public Void visitIntersectionType(IntersectionType node, Void data) { + return null; + } + + @Override + public Void visitUnionType(UnionType node, Void data) { + return null; + } + + @Override + public Void visitWhileStatement(WhileStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitPrimitiveExpression(PrimitiveExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitCastExpression(CastExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitBinaryOperatorExpression(BinaryOperatorExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitInstanceOfExpression(InstanceOfExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitIndexerExpression(IndexerExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitIdentifierExpression(IdentifierExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitUnaryOperatorExpression(UnaryOperatorExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitConditionalExpression(ConditionalExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitArrayInitializerExpression(ArrayInitializerExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitObjectCreationExpression(ObjectCreationExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitArrayCreationExpression(ArrayCreationExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitAssignmentExpression(AssignmentExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitForStatement(ForStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitForEachStatement(ForEachStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitTryCatchStatement(TryCatchStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitGotoStatement(GotoStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitParenthesizedExpression(ParenthesizedExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitSynchronizedStatement(SynchronizedStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitAnonymousObjectCreationExpression(AnonymousObjectCreationExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitWildcardType(WildcardType node, Void data) { + return null; + } + + @Override + public Void visitMethodGroupExpression(MethodGroupExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitEnumValueDeclaration(EnumValueDeclaration node, Void data) { + return null; + } + + @Override + public Void visitAssertStatement(AssertStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitLambdaExpression(LambdaExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitLocalTypeDeclarationStatement(LocalTypeDeclarationStatement node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitInlinedBytecode(InlinedBytecodeExpression node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + @Override + public Void visitBytecodeConstant(BytecodeConstant node, Void data) { + return updateMinMaxLineNumbers(node.getOffset(), node); + } + + public int getMinLineNumber() { + return minLineNumber; + } + + public int getMaxLineNumber() { + return maxLineNumber; + } +} diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/MinMaxLineNumberVisitor.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/MinMaxLineNumberVisitor.java new file mode 100644 index 00000000..38a27412 --- /dev/null +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/MinMaxLineNumberVisitor.java @@ -0,0 +1,383 @@ +/* + * MinMaxLineNumberVisitor.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler.languages.java; + +import com.strobel.decompiler.languages.java.ast.Annotation; +import com.strobel.decompiler.languages.java.ast.AnonymousObjectCreationExpression; +import com.strobel.decompiler.languages.java.ast.ArrayCreationExpression; +import com.strobel.decompiler.languages.java.ast.ArrayInitializerExpression; +import com.strobel.decompiler.languages.java.ast.AssertStatement; +import com.strobel.decompiler.languages.java.ast.AssignmentExpression; +import com.strobel.decompiler.languages.java.ast.BinaryOperatorExpression; +import com.strobel.decompiler.languages.java.ast.BlockStatement; +import com.strobel.decompiler.languages.java.ast.BreakStatement; +import com.strobel.decompiler.languages.java.ast.BytecodeConstant; +import com.strobel.decompiler.languages.java.ast.CastExpression; +import com.strobel.decompiler.languages.java.ast.ClassOfExpression; +import com.strobel.decompiler.languages.java.ast.ConditionalExpression; +import com.strobel.decompiler.languages.java.ast.ContinueStatement; +import com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor; +import com.strobel.decompiler.languages.java.ast.DoWhileStatement; +import com.strobel.decompiler.languages.java.ast.EmptyStatement; +import com.strobel.decompiler.languages.java.ast.Expression; +import com.strobel.decompiler.languages.java.ast.ExpressionStatement; +import com.strobel.decompiler.languages.java.ast.ForEachStatement; +import com.strobel.decompiler.languages.java.ast.ForStatement; +import com.strobel.decompiler.languages.java.ast.GotoStatement; +import com.strobel.decompiler.languages.java.ast.IdentifierExpression; +import com.strobel.decompiler.languages.java.ast.IfElseStatement; +import com.strobel.decompiler.languages.java.ast.IndexerExpression; +import com.strobel.decompiler.languages.java.ast.InlinedBytecodeExpression; +import com.strobel.decompiler.languages.java.ast.InstanceOfExpression; +import com.strobel.decompiler.languages.java.ast.InvocationExpression; +import com.strobel.decompiler.languages.java.ast.LabelStatement; +import com.strobel.decompiler.languages.java.ast.LabeledStatement; +import com.strobel.decompiler.languages.java.ast.LambdaExpression; +import com.strobel.decompiler.languages.java.ast.LocalTypeDeclarationStatement; +import com.strobel.decompiler.languages.java.ast.MemberReferenceExpression; +import com.strobel.decompiler.languages.java.ast.MethodGroupExpression; +import com.strobel.decompiler.languages.java.ast.NullReferenceExpression; +import com.strobel.decompiler.languages.java.ast.ObjectCreationExpression; +import com.strobel.decompiler.languages.java.ast.ParenthesizedExpression; +import com.strobel.decompiler.languages.java.ast.PrimitiveExpression; +import com.strobel.decompiler.languages.java.ast.ReturnStatement; +import com.strobel.decompiler.languages.java.ast.SuperReferenceExpression; +import com.strobel.decompiler.languages.java.ast.SwitchExpression; +import com.strobel.decompiler.languages.java.ast.SwitchStatement; +import com.strobel.decompiler.languages.java.ast.SynchronizedStatement; +import com.strobel.decompiler.languages.java.ast.ThisReferenceExpression; +import com.strobel.decompiler.languages.java.ast.ThrowStatement; +import com.strobel.decompiler.languages.java.ast.TryCatchStatement; +import com.strobel.decompiler.languages.java.ast.TypeReferenceExpression; +import com.strobel.decompiler.languages.java.ast.UnaryOperatorExpression; +import com.strobel.decompiler.languages.java.ast.VariableDeclarationStatement; +import com.strobel.decompiler.languages.java.ast.WhileStatement; + +public class MinMaxLineNumberVisitor extends DepthFirstAstVisitor { + + private final LineNumberTableConverter lineNumberTableConverter; + private int minLineNumber = Integer.MAX_VALUE; + private int maxLineNumber = Integer.MIN_VALUE; + + public MinMaxLineNumberVisitor(final LineNumberTableConverter lineNumberTableConverter) { + this.lineNumberTableConverter = lineNumberTableConverter; + } + + private void updateMinMaxLineNumbers(int offset) { + if (offset != Expression.MYSTERY_OFFSET) { + int lineNumber = lineNumberTableConverter.getLineForOffset(offset); + minLineNumber = Math.min(minLineNumber, lineNumber); + maxLineNumber = Math.max(maxLineNumber, lineNumber); + } + } + + @Override + public Void visitInvocationExpression(InvocationExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitInvocationExpression(node, data); + } + + @Override + public Void visitTypeReference(TypeReferenceExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitTypeReference(node, data); + } + + @Override + public Void visitMemberReferenceExpression(MemberReferenceExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitMemberReferenceExpression(node, data); + } + + @Override + public Void visitNullReferenceExpression(NullReferenceExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitNullReferenceExpression(node, data); + } + + @Override + public Void visitThisReferenceExpression(ThisReferenceExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitThisReferenceExpression(node, data); + } + + @Override + public Void visitSuperReferenceExpression(SuperReferenceExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitSuperReferenceExpression(node, data); + } + + @Override + public Void visitClassOfExpression(ClassOfExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitClassOfExpression(node, data); + } + + @Override + public Void visitBlockStatement(BlockStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitBlockStatement(node, data); + } + + @Override + public Void visitExpressionStatement(ExpressionStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitExpressionStatement(node, data); + } + + @Override + public Void visitBreakStatement(BreakStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitBreakStatement(node, data); + } + + @Override + public Void visitContinueStatement(ContinueStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitContinueStatement(node, data); + } + + @Override + public Void visitDoWhileStatement(DoWhileStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitDoWhileStatement(node, data); + } + + @Override + public Void visitEmptyStatement(EmptyStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitEmptyStatement(node, data); + } + + @Override + public Void visitIfElseStatement(IfElseStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitIfElseStatement(node, data); + } + + @Override + public Void visitLabelStatement(LabelStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitLabelStatement(node, data); + } + + @Override + public Void visitLabeledStatement(LabeledStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitLabeledStatement(node, data); + } + + @Override + public Void visitReturnStatement(ReturnStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitReturnStatement(node, data); + } + + @Override + public Void visitSwitchStatement(SwitchStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitSwitchStatement(node, data); + } + + @Override + public Void visitSwitchExpression(SwitchExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitSwitchExpression(node, data); + } + + @Override + public Void visitThrowStatement(ThrowStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitThrowStatement(node, data); + } + + @Override + public Void visitAnnotation(Annotation node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitAnnotation(node, data); + } + + @Override + public Void visitVariableDeclaration(VariableDeclarationStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitVariableDeclaration(node, data); + } + + @Override + public Void visitWhileStatement(WhileStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitWhileStatement(node, data); + } + + @Override + public Void visitPrimitiveExpression(PrimitiveExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitPrimitiveExpression(node, data); + } + + @Override + public Void visitCastExpression(CastExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitCastExpression(node, data); + } + + @Override + public Void visitBinaryOperatorExpression(BinaryOperatorExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitBinaryOperatorExpression(node, data); + } + + @Override + public Void visitInstanceOfExpression(InstanceOfExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitInstanceOfExpression(node, data); + } + + @Override + public Void visitIndexerExpression(IndexerExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitIndexerExpression(node, data); + } + + @Override + public Void visitIdentifierExpression(IdentifierExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitIdentifierExpression(node, data); + } + + @Override + public Void visitUnaryOperatorExpression(UnaryOperatorExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitUnaryOperatorExpression(node, data); + } + + @Override + public Void visitConditionalExpression(ConditionalExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitConditionalExpression(node, data); + } + + @Override + public Void visitArrayInitializerExpression(ArrayInitializerExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitArrayInitializerExpression(node, data); + } + + @Override + public Void visitObjectCreationExpression(ObjectCreationExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitObjectCreationExpression(node, data); + } + + @Override + public Void visitArrayCreationExpression(ArrayCreationExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitArrayCreationExpression(node, data); + } + + @Override + public Void visitAssignmentExpression(AssignmentExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitAssignmentExpression(node, data); + } + + @Override + public Void visitForStatement(ForStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitForStatement(node, data); + } + + @Override + public Void visitForEachStatement(ForEachStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitForEachStatement(node, data); + } + + @Override + public Void visitTryCatchStatement(TryCatchStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitTryCatchStatement(node, data); + } + + @Override + public Void visitGotoStatement(GotoStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitGotoStatement(node, data); + } + + @Override + public Void visitParenthesizedExpression(ParenthesizedExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitParenthesizedExpression(node, data); + } + + @Override + public Void visitSynchronizedStatement(SynchronizedStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitSynchronizedStatement(node, data); + } + + @Override + public Void visitAnonymousObjectCreationExpression(AnonymousObjectCreationExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitAnonymousObjectCreationExpression(node, data); + } + + @Override + public Void visitMethodGroupExpression(MethodGroupExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitMethodGroupExpression(node, data); + } + + @Override + public Void visitAssertStatement(AssertStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitAssertStatement(node, data); + } + + @Override + public Void visitLambdaExpression(LambdaExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitLambdaExpression(node, data); + } + + @Override + public Void visitLocalTypeDeclarationStatement(LocalTypeDeclarationStatement node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitLocalTypeDeclarationStatement(node, data); + } + + @Override + public Void visitInlinedBytecode(InlinedBytecodeExpression node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitInlinedBytecode(node, data); + } + + @Override + public Void visitBytecodeConstant(BytecodeConstant node, Void data) { + updateMinMaxLineNumbers(node.getOffset()); + return super.visitBytecodeConstant(node, data); + } + + public int getMinLineNumber() { + return minLineNumber; + } + + public int getMaxLineNumber() { + return maxLineNumber; + } +} \ No newline at end of file diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/TextOutputFormatter.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/TextOutputFormatter.java index 763f942c..7bf26df6 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/TextOutputFormatter.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/TextOutputFormatter.java @@ -99,10 +99,16 @@ public void startNode(final AstNode node) { else if (node instanceof Statement) { offset = ((Statement) node).getOffset(); prefix = "/*SL:"; + } else if (node instanceof FieldDeclaration + && node.getLastChild() instanceof VariableInitializer + && node.getLastChild().getLastChild() instanceof Expression) { + offset = ((Expression) node.getLastChild().getLastChild()).getOffset(); + prefix = "/*SL:"; } if (offset != Expression.MYSTERY_OFFSET) { // Convert to a line number. - final int lineNumber = offset2LineNumber.getLineForOffset(offset); + final int lineNumber = node instanceof FieldDeclaration ? ((FieldDeclaration) node).getLineNumber() + : offset2LineNumber.getLineForOffset(offset); if (lineNumber > lastObservedLineNumber) { // Record a data structure mapping original to actual line numbers. final int lineOfComment = output.getRow(); diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/EntityDeclaration.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/EntityDeclaration.java index f12a18e6..b4b38c8c 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/EntityDeclaration.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/EntityDeclaration.java @@ -16,7 +16,12 @@ package com.strobel.decompiler.languages.java.ast; +import com.strobel.assembler.ir.attributes.AttributeNames; +import com.strobel.assembler.ir.attributes.LineNumberTableAttribute; +import com.strobel.assembler.ir.attributes.LineNumberTableEntry; +import com.strobel.assembler.ir.attributes.SourceAttribute; import com.strobel.assembler.metadata.Flags; +import com.strobel.assembler.metadata.MethodDefinition; import com.strobel.decompiler.languages.EntityType; import com.strobel.decompiler.languages.TextLocation; import com.strobel.decompiler.patterns.Match; @@ -179,4 +184,22 @@ static boolean removeModifier(final AstNode node, final Flags.Flag modifier) { return false; } + + public int getFirstKnownLineNumber() { + MethodDefinition methodDefinition = getUserData(Keys.METHOD_DEFINITION); + if (methodDefinition != null) { + final LineNumberTableAttribute lineNumberTableAttribute = SourceAttribute.find(AttributeNames.LineNumberTable, methodDefinition.getSourceAttributes()); + if (lineNumberTableAttribute != null) { + List entries = lineNumberTableAttribute.getEntries(); + if (entries != null) { + for (LineNumberTableEntry entry : entries) { + if (entry != null) { + return entry.getLineNumber(); + } + } + } + } + } + return 0; + } } diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/FieldDeclaration.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/FieldDeclaration.java index 59dec7a9..6cce00bf 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/FieldDeclaration.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/FieldDeclaration.java @@ -21,6 +21,9 @@ import com.strobel.decompiler.patterns.Match; public class FieldDeclaration extends EntityDeclaration { + + private int lineNumber; + public final AstNodeCollection getVariables() { return getChildrenByRole(Roles.VARIABLE); } @@ -48,4 +51,17 @@ public boolean matches(final INode other, final Match match) { return false; } + + public int getLineNumber() { + return lineNumber; + } + + public void setLineNumber(int lineNumber) { + this.lineNumber = lineNumber; + } + + @Override + public int getFirstKnownLineNumber() { + return lineNumber; + } } diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/MethodDeclaration.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/MethodDeclaration.java index 0538cb54..c81ac700 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/MethodDeclaration.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/MethodDeclaration.java @@ -25,10 +25,12 @@ import com.strobel.decompiler.patterns.Role; public class MethodDeclaration extends EntityDeclaration { - public final static Role DEFAULT_VALUE_ROLE = new Role<>("DefaultValue", Expression.class, Expression.NULL); + public static final Role DEFAULT_VALUE_ROLE = new Role<>("DefaultValue", Expression.class, Expression.NULL); - public final static TokenRole DEFAULT_KEYWORD = new TokenRole("default", TokenRole.FLAG_KEYWORD); - public final static TokenRole THROWS_KEYWORD = new TokenRole("throws", TokenRole.FLAG_KEYWORD); + public static final TokenRole DEFAULT_KEYWORD = new TokenRole("default", TokenRole.FLAG_KEYWORD); + public static final TokenRole THROWS_KEYWORD = new TokenRole("throws", TokenRole.FLAG_KEYWORD); + + private int firstKnownLineNumber; public final AstType getPrivateImplementationType() { return getChildByRole(PRIVATE_IMPLEMENTATION_TYPE_ROLE); @@ -111,6 +113,22 @@ public boolean matches(final INode other, final Match match) { return false; } + + public boolean isFirstLineNumberKnown() { + return firstKnownLineNumber > 0; + } + + @Override + public int getFirstKnownLineNumber() { + if (isFirstLineNumberKnown()) { + return firstKnownLineNumber; + } + return super.getFirstKnownLineNumber(); + } + + public void setFirstKnownLineNumber(int firstKnownLineNumber) { + this.firstKnownLineNumber = firstKnownLineNumber; + } // @@ -118,7 +136,7 @@ public static MethodDeclaration forPattern(final Pattern pattern) { return new MethodDeclaration.PatternPlaceholder(VerifyArgument.notNull(pattern, "pattern")); } - private final static class PatternPlaceholder extends MethodDeclaration { + private static final class PatternPlaceholder extends MethodDeclaration { final Pattern child; PatternPlaceholder(final Pattern child) { diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/TypeDeclaration.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/TypeDeclaration.java index f03d604a..829f85ad 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/TypeDeclaration.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/TypeDeclaration.java @@ -123,6 +123,19 @@ public boolean matches(final INode other, final Match match) { return false; } + @Override + public int getFirstKnownLineNumber() { + for (EntityDeclaration entityDeclaration : getMembers()) { + if (entityDeclaration != null) { + int firstKnownLineNumber = entityDeclaration.getFirstKnownLineNumber(); + if (firstKnownLineNumber > 0) { + return firstKnownLineNumber; + } + } + } + return 0; + } + // public final static TypeDeclaration NULL = new NullTypeDeclaration(); diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/InvertIfStatementsTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/InvertIfStatementsTransform.java new file mode 100644 index 00000000..86e4884e --- /dev/null +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/InvertIfStatementsTransform.java @@ -0,0 +1,81 @@ +/* + * InvertIfStatementsTransform.java + * + * Copyright (c) 2013 Mike Strobel + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler.languages.java.ast.transforms; + +import com.strobel.assembler.ir.attributes.AttributeNames; +import com.strobel.assembler.ir.attributes.LineNumberTableAttribute; +import com.strobel.assembler.ir.attributes.SourceAttribute; +import com.strobel.decompiler.DecompilerContext; +import com.strobel.decompiler.languages.java.LineNumberTableConverter; +import com.strobel.decompiler.languages.java.LineNumberVisitor; +import com.strobel.decompiler.languages.java.ast.AstNode; +import com.strobel.decompiler.languages.java.ast.BlockStatement; +import com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor; +import com.strobel.decompiler.languages.java.ast.Expression; +import com.strobel.decompiler.languages.java.ast.IfElseStatement; +import com.strobel.decompiler.languages.java.ast.Statement; +import com.strobel.decompiler.languages.java.ast.UnaryOperatorExpression; +import com.strobel.decompiler.languages.java.ast.UnaryOperatorType; + +public class InvertIfStatementsTransform extends ContextTrackingVisitor { + public InvertIfStatementsTransform(final DecompilerContext context) { + super(context); + } + + @Override + public Void visitIfElseStatement(final IfElseStatement node, final Void data) { + super.visitIfElseStatement(node, data); + + final Statement trueStatement = node.getTrueStatement(); + final Statement falseStatement = node.getFalseStatement(); + + final LineNumberTableAttribute lineNumberTableAttribute = SourceAttribute.find(AttributeNames.LineNumberTable, context.getCurrentMethod().getSourceAttributes()); + if (lineNumberTableAttribute == null) { + return null; + } + final LineNumberTableConverter lineNumberTableConverter = new LineNumberTableConverter(lineNumberTableAttribute); + final LineNumberVisitor trueLineNumberVisitor = new LineNumberVisitor(lineNumberTableConverter); + final LineNumberVisitor nextLineNumbervisitor = new LineNumberVisitor(lineNumberTableConverter); + final AstNode nextSibling = node.getNextSibling(); + if ((falseStatement == null || falseStatement.isNull()) && nextSibling != null) { + trueStatement.acceptVisitor(trueLineNumberVisitor, null); + nextSibling.acceptVisitor(nextLineNumbervisitor, null); + if (nextLineNumbervisitor.getMaxLineNumber() != Integer.MIN_VALUE && trueLineNumberVisitor.getMinLineNumber() != Integer.MAX_VALUE + && nextLineNumbervisitor.getMaxLineNumber() < trueLineNumberVisitor.getMinLineNumber()) { + final Expression condition = node.getCondition(); + condition.remove(); + if (condition instanceof UnaryOperatorExpression && ((UnaryOperatorExpression) condition).getOperator() == UnaryOperatorType.NOT) { + Expression expression = ((UnaryOperatorExpression) condition).getExpression(); + expression.remove(); + node.setCondition(expression); + } else { + node.setCondition(new UnaryOperatorExpression(UnaryOperatorType.NOT, condition)); + } + trueStatement.remove(); + node.setFalseStatement(trueStatement); + BlockStatement blockStatement = new BlockStatement(); + for (Statement next = node.getNextStatement(); next != null; next = node.getNextStatement()) { + next.remove(); + blockStatement.add(next); + } + node.setTrueStatement(blockStatement); + } + } + + return null; + } +} diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/ReOrderMembersForLineStretchTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/ReOrderMembersForLineStretchTransform.java new file mode 100644 index 00000000..c1cbd2bf --- /dev/null +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/ReOrderMembersForLineStretchTransform.java @@ -0,0 +1,61 @@ +/* + * ReOrderMembersForLineStretchTransform.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler.languages.java.ast.transforms; + +import com.strobel.decompiler.DecompilerContext; +import com.strobel.decompiler.languages.java.ast.AstNodeCollection; +import com.strobel.decompiler.languages.java.ast.ContextTrackingVisitor; +import com.strobel.decompiler.languages.java.ast.EntityDeclaration; +import com.strobel.decompiler.languages.java.ast.Roles; +import com.strobel.decompiler.languages.java.ast.TypeDeclaration; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; + +public class ReOrderMembersForLineStretchTransform extends ContextTrackingVisitor { + + public ReOrderMembersForLineStretchTransform(DecompilerContext context) { + super(context); + } + + @Override + protected Void visitTypeDeclarationOverride(TypeDeclaration typeDeclaration, Void p) { + AstNodeCollection members = typeDeclaration.getChildrenByRole(Roles.TYPE_MEMBER); + List sortedMembers = new ArrayList<>(members); + Collections.sort(sortedMembers, new MemberComparator()); + for (EntityDeclaration member : members) { + member.remove(); + } + for (EntityDeclaration member : sortedMembers) { + typeDeclaration.addChild(member, Roles.TYPE_MEMBER); + } + return p; + } + + private static class MemberComparator implements Comparator, Serializable { + + private static final long serialVersionUID = 1L; + + @Override + public int compare(EntityDeclaration e1, EntityDeclaration e2) { + return Integer.compare(e1.getFirstKnownLineNumber(), e2.getFirstKnownLineNumber()); + } + } +} diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java new file mode 100644 index 00000000..734171e2 --- /dev/null +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/RewriteInitForLineStretchTransform.java @@ -0,0 +1,320 @@ +/* + * RewriteInitForLineStretchTransform.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler.languages.java.ast.transforms; + +import com.strobel.assembler.ir.attributes.AttributeNames; +import com.strobel.assembler.ir.attributes.LineNumberTableAttribute; +import com.strobel.assembler.ir.attributes.LocalVariableTableAttribute; +import com.strobel.assembler.ir.attributes.LocalVariableTableEntry; +import com.strobel.assembler.ir.attributes.SourceAttribute; +import com.strobel.assembler.metadata.FieldDefinition; +import com.strobel.assembler.metadata.MemberReference; +import com.strobel.assembler.metadata.MethodDefinition; +import com.strobel.decompiler.languages.java.LineNumberTableConverter; +import com.strobel.decompiler.languages.java.MinMaxLineNumberVisitor; +import com.strobel.decompiler.languages.java.ast.AssignmentExpression; +import com.strobel.decompiler.languages.java.ast.AssignmentOperatorType; +import com.strobel.decompiler.languages.java.ast.AstNode; +import com.strobel.decompiler.languages.java.ast.BlockStatement; +import com.strobel.decompiler.languages.java.ast.ConstructorDeclaration; +import com.strobel.decompiler.languages.java.ast.DepthFirstAstVisitor; +import com.strobel.decompiler.languages.java.ast.EntityDeclaration; +import com.strobel.decompiler.languages.java.ast.Expression; +import com.strobel.decompiler.languages.java.ast.ExpressionStatement; +import com.strobel.decompiler.languages.java.ast.FieldDeclaration; +import com.strobel.decompiler.languages.java.ast.Identifier; +import com.strobel.decompiler.languages.java.ast.InvocationExpression; +import com.strobel.decompiler.languages.java.ast.Keys; +import com.strobel.decompiler.languages.java.ast.MemberReferenceExpression; +import com.strobel.decompiler.languages.java.ast.MethodDeclaration; +import com.strobel.decompiler.languages.java.ast.Roles; +import com.strobel.decompiler.languages.java.ast.ThisReferenceExpression; +import com.strobel.decompiler.languages.java.ast.VariableInitializer; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +public class RewriteInitForLineStretchTransform extends DepthFirstAstVisitor implements IAstTransform { + + private ConcurrentHashMap fieldDeclarations = new ConcurrentHashMap<>(); + private ConcurrentHashMap fieldInitLocations = new ConcurrentHashMap<>(); + private ConcurrentHashMap constructionDefinitionToDeclaration = new ConcurrentHashMap<>(); + + @Override + public Void visitBlockStatement(BlockStatement node, Void data) { + if (node.getParent() instanceof MethodDeclaration) { + MethodDeclaration methodDeclaration = (MethodDeclaration) node.getParent(); + MethodDefinition methodDefinition = methodDeclaration.getUserData(Keys.METHOD_DEFINITION); + if (methodDefinition != null && methodDefinition.isTypeInitializer()) { + final LineNumberTableAttribute lineNumberTable = SourceAttribute.find(AttributeNames.LineNumberTable, methodDefinition.getSourceAttributes()); + if (lineNumberTable != null) { + LineNumberTableConverter lineNumberTableConverter = new LineNumberTableConverter(lineNumberTable); + int previousLineNumber = 0; + int pivotLineNumber = 0; + MethodDeclaration newMethodDeclaration = null; + for (AstNode child : node.getChildren()) { + MinMaxLineNumberVisitor minMaxLineNumberVisitor = new MinMaxLineNumberVisitor(lineNumberTableConverter); + child.acceptVisitor(minMaxLineNumberVisitor, null); + int currentLineNumber = minMaxLineNumberVisitor.getMinLineNumber(); + if (!methodDeclaration.isFirstLineNumberKnown()) { + methodDeclaration.setFirstKnownLineNumber(currentLineNumber); + } + if (previousLineNumber > 0 && currentLineNumber > previousLineNumber + 3) { + newMethodDeclaration = (MethodDeclaration) methodDeclaration.clone(); + newMethodDeclaration.setFirstKnownLineNumber(currentLineNumber); + methodDeclaration.getParent().insertChildAfter(methodDeclaration, newMethodDeclaration, Roles.TYPE_MEMBER); + pivotLineNumber = currentLineNumber; + break; + } + previousLineNumber = minMaxLineNumberVisitor.getMaxLineNumber(); + } + if (pivotLineNumber > 0) { + for (AstNode child : node.getChildren()) { + MinMaxLineNumberVisitor minMaxLineNumberVisitor = new MinMaxLineNumberVisitor(lineNumberTableConverter); + child.acceptVisitor(minMaxLineNumberVisitor, null); + int currentLineNumber = minMaxLineNumberVisitor.getMinLineNumber(); + if (currentLineNumber >= pivotLineNumber) { + child.remove(); + } + } + } + if (newMethodDeclaration != null) { + BlockStatement body = newMethodDeclaration.getBody(); + if (body != null) { + for (AstNode child : body.getChildren()) { + MinMaxLineNumberVisitor minMaxLineNumberVisitor = new MinMaxLineNumberVisitor(lineNumberTableConverter); + child.acceptVisitor(minMaxLineNumberVisitor, null); + int currentLineNumber = minMaxLineNumberVisitor.getMinLineNumber(); + if (currentLineNumber < pivotLineNumber) { + child.remove(); + } + } + visitBlockStatement(body, data); + } + } + } + } + } + return super.visitBlockStatement(node, data); + } + + @Override + public Void visitAssignmentExpression(AssignmentExpression node, Void data) { + AstNode parent = node.getParent(); + if (parent instanceof ExpressionStatement + && parent.getParent() instanceof BlockStatement + && parent.getParent().getParent() instanceof EntityDeclaration + && node.getLeft() instanceof MemberReferenceExpression + && node.getOperator() == AssignmentOperatorType.ASSIGN) { + EntityDeclaration entityDeclaration = (EntityDeclaration) parent.getParent().getParent(); + MethodDefinition methodDefinition = entityDeclaration.getUserData(Keys.METHOD_DEFINITION); + if (methodDefinition != null && (methodDefinition.isConstructor() || methodDefinition.isTypeInitializer())) { + LineNumberTableAttribute lineNumberTable = SourceAttribute.find(AttributeNames.LineNumberTable, methodDefinition.getSourceAttributes()); + LineNumberTableConverter lineNumberTableConverter = new LineNumberTableConverter(lineNumberTable); + MemberReferenceExpression memberReferenceExpression = (MemberReferenceExpression) node.getFirstChild(); + MemberReference memberReference = memberReferenceExpression.getUserData(Keys.MEMBER_REFERENCE); + FieldDeclaration fieldDeclaration = fieldDeclarations.get(memberReference.getFullName()); + Expression initializer = node.getRight(); + int offset = initializer.getOffset(); + if (offset != Expression.MYSTERY_OFFSET) { + int lineNumber = lineNumberTableConverter.getLineForOffset(offset); + if (lineNumber > 0 && fieldDeclaration != null && !methodDefinition.hasParameter(memberReference.getName())) { + LocalVariableTableAttribute localVariableTable = SourceAttribute.find(AttributeNames.LocalVariableTable, methodDefinition.getSourceAttributes()); + IdentifierGatherer identifierGatherer = new IdentifierGatherer(); + initializer.acceptVisitor(identifierGatherer, null); + if (localVariableTable == null || identifierGatherer.containsNoneOf(localVariableTable.getEntries())) { + fieldDeclaration.setLineNumber(lineNumber); + FieldLocation fieldLocation = new FieldLocation(memberReference.getFullName(), offset); + fieldInitLocations.putIfAbsent(fieldLocation, new FieldInit(fieldDeclaration)); + fieldInitLocations.get(fieldLocation).init(initializer, (ExpressionStatement) node.getParent(), methodDefinition); + } + } + } + } + } + return super.visitAssignmentExpression(node, data); + } + + @Override + public Void visitFieldDeclaration(FieldDeclaration node, Void data) { + FieldDefinition fieldDefinition = node.getUserData(Keys.FIELD_DEFINITION); + if (fieldDefinition != null) { + fieldDeclarations.put(fieldDefinition.getFullName(), node); + } + return super.visitFieldDeclaration(node, data); + } + + @Override + public Void visitThisReferenceExpression(ThisReferenceExpression node, Void data) { + if (node.getParent() instanceof InvocationExpression) { + MemberReference memberReference = node.getParent().getUserData(Keys.MEMBER_REFERENCE); + if (memberReference instanceof MethodDefinition) { + MethodDefinition methodDefinition = (MethodDefinition) memberReference; + ConstructorDeclaration constructorDeclaration = constructionDefinitionToDeclaration.get(methodDefinition); + if (constructorDeclaration != null) { + visitConstructorDeclaration(constructorDeclaration, data); + } + } + } + return super.visitThisReferenceExpression(node, data); + } + + @Override + public void run(AstNode compilationUnit) { + compilationUnit.acceptVisitor(new ConstructorGatherer(), null); + compilationUnit.acceptVisitor(this, null); + for (FieldInit fieldInit : fieldInitLocations.values()) { + if (fieldInit.isInAllConstructors() || fieldInit.isInTypeInitializer()) { + fieldInit.removeFieldInitStatements(); + fieldInit.createVariableInitializer(); + } + } + } + + private class FieldInit { + private final FieldDeclaration declaration; + private final List fieldInitStatements = new ArrayList<>(); + private boolean inConstructor = true; + private boolean inTypeInitializer = true; + + public FieldInit(FieldDeclaration declaration) { + this.declaration = declaration; + } + + public void init(Expression initializer, ExpressionStatement expressionStatement, MethodDefinition initMethod) { + inConstructor &= initMethod != null && initMethod.isConstructor(); + inTypeInitializer &= initMethod != null && initMethod.isTypeInitializer(); + fieldInitStatements.add(new FieldInitStatement(initializer, expressionStatement)); + } + + public void removeFieldInitStatements() { + AstNode parent = null; + for (FieldInitStatement fieldInitStatement : fieldInitStatements) { + parent = fieldInitStatement.statement.getParent(); + fieldInitStatement.remove(); + } + if (isInTypeInitializer() && parent != null && !parent.hasChildren() && parent.getParent() instanceof MethodDeclaration) { + parent.getParent().remove(); + } + } + + public boolean isInAllConstructors() { + int constructorCount = countConstructors(); + return inConstructor && constructorCount > 0 && fieldInitStatements.size() == constructorCount; + } + + private int countConstructors() { + int constructorCount = 0; + FieldDefinition fieldDefinition = declaration.getUserData(Keys.FIELD_DEFINITION); + if (fieldDefinition != null) { + for (MethodDefinition methodDefinition : constructionDefinitionToDeclaration.keySet()) { + if (methodDefinition.getDeclaringType() == fieldDefinition.getDeclaringType()) { + constructorCount++; + } + } + } + return constructorCount; + } + + public boolean isInTypeInitializer() { + return inTypeInitializer; + } + + public void createVariableInitializer() { + declaration.getVariables().clear(); + declaration.getVariables().add(new VariableInitializer(declaration.getName(), fieldInitStatements.get(0).initializer)); + } + } + + private static class FieldInitStatement { + private final Expression initializer; + private final ExpressionStatement statement; + + public FieldInitStatement(Expression initializer, ExpressionStatement statement) { + this.initializer = initializer; + this.statement = statement; + } + + public void remove() { + initializer.remove(); + statement.remove(); + } + } + + private static class FieldLocation { + private final String fieldName; + private final int fieldOffset; + + public FieldLocation(String fieldName, int fieldOffset) { + this.fieldName = fieldName; + this.fieldOffset = fieldOffset; + } + + @Override + public int hashCode() { + return Objects.hash(fieldName, fieldOffset); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null || getClass() != obj.getClass()) { + return false; + } + FieldLocation other = (FieldLocation) obj; + return Objects.equals(fieldName, other.fieldName) && fieldOffset == other.fieldOffset; + } + } + + private class ConstructorGatherer extends DepthFirstAstVisitor { + + @Override + public Void visitConstructorDeclaration(ConstructorDeclaration node, Void p) { + MethodDefinition methodDefinition = node.getUserData(Keys.METHOD_DEFINITION); + if (methodDefinition != null) { + constructionDefinitionToDeclaration.put(methodDefinition, node); + } + return super.visitConstructorDeclaration(node, p); + } + } + + private static class IdentifierGatherer extends DepthFirstAstVisitor { + + private Set identifiers = new HashSet<>(); + + public boolean containsNoneOf(List entries) { + for (LocalVariableTableEntry entry : entries) { + if (identifiers.contains(entry.getName())) { + return false; + } + } + return true; + } + + @Override + public Void visitIdentifier(Identifier node, Void data) { + identifiers.add(node.getName()); + return super.visitIdentifier(node, data); + } + } +} diff --git a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java index 6a2ff63f..21c22af1 100644 --- a/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java +++ b/Procyon.CompilerTools/src/main/java/com/strobel/decompiler/languages/java/ast/transforms/TransformationPipeline.java @@ -1,7 +1,7 @@ /* * TransformationPipeline.java * - * Copyright (c) 2013 Mike Strobel + * Copyright (c) 2013-2022 Mike Strobel and other contributors * * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. @@ -55,6 +55,7 @@ public static IAstTransform[] createPipeline(final DecompilerContext context) { new RewriteInnerClassConstructorCalls(context), new RemoveRedundantInitializersTransform(context), new FlattenElseIfStatementsTransform(context), + new InvertIfStatementsTransform(context), new RewriteSwitchExpressionsTransform(context), // invariant: any transforms requiring CFA/DAA must be done by now new AssertStatementTransform(context), // (again due to switch expression rewriting) new FlattenSwitchBlocksTransform(context), @@ -76,7 +77,9 @@ public static IAstTransform[] createPipeline(final DecompilerContext context) { new AddStandardAnnotationsTransform(context), new AddReferenceQualifiersTransform(context), new RemoveHiddenMembersTransform(context), - new CollapseImportsTransform(context) + new CollapseImportsTransform(context), + new RewriteInitForLineStretchTransform(), + new ReOrderMembersForLineStretchTransform(context) }; } diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/EncodingTests.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/EncodingTests.java index f0f7d80f..c99b7ea2 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/EncodingTests.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/EncodingTests.java @@ -61,7 +61,6 @@ public void testUnicodeIdentifierEscaping() { A.class, defaultSettings(), "private static final class A {\n" + - " static String \\ufe4f\\u2167;\n" + " static final transient short x\\u03a7x = 5;\n" + " private static String __\\u0130\\u00dfI(final A x) {\n" + " return A.\\ufe4f\\u2167;\n" + @@ -70,9 +69,7 @@ public void testUnicodeIdentifierEscaping() { " System.out.println(__\\u0130\\u00dfI(null));\n" + " System.out.println(\"\\\"\\u0000\\u000fu\\\\\\\"\\ff'\\rr'\\nn \\u0123\\u1234O\\uffffF\");\n" + " }\n" + - " static {\n" + - " A.\\ufe4f\\u2167 = \"\\ufeff\\ud800\\ud8d8\\udffd\";\n" + - " }\n" + + " static String \\ufe4f\\u2167 = \"\\ufeff\\ud800\\ud8d8\\udffd\";\n" + "}" ); } diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/InvertIfTests.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/InvertIfTests.java new file mode 100644 index 00000000..7b313000 --- /dev/null +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/InvertIfTests.java @@ -0,0 +1,97 @@ +/* + * InvertIfTests.java + * + * Copyright (c) 2013 Mike Strobel + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler; + +import org.junit.Test; + +public class InvertIfTests extends DecompilerTest { + private class T { + void main(final String[] args) { + if (args.length == 0) { + System.out.println("no arg"); + } else { + if (args.length == 1) { + System.out.println("1 arg"); + } else { + throw new RuntimeException("too many args"); + } + } + } + } + + private class U { + void test(final Object o) { + if (o instanceof String) { + System.out.println(o); + } else { + if (o instanceof CharSequence) { + System.out.println(o); + } else { + throw new RuntimeException(); + } + } + } + } + + @Test + public void testInvertIfTest() { + verifyOutput( + T.class, + lineNumberSettings(), + "private class T\n" + + "{\n" + + " void main(final String[] args) {\n" + + " /*SL:21*/if (args.length == 0) {\n" + + " System.out.println(/*EL:22*/\"no arg\");\n" + + " } else {\n" + + " /*SL:24*/if (args.length == 1) {\n" + + " System.out.println(/*EL:25*/\"1 arg\");\n" + + " } else {\n" + + " /*SL:27*/throw new RuntimeException(\"too many args\");\n" + + " }\n" + + " }\n" + + " }\n" + + "}" + ); + } + + @Test + public void testInvertIfDoubleNegationTest() { + verifyOutput( + U.class, + lineNumberSettings(), + "private class U\n" + + "{\n" + + " void test(final Object o) {\n" + + " /*SL:35*/if (o instanceof String) {\n" + + " System.out.println(/*EL:36*/o);\n" + + " } else {\n" + + " /*SL:38*/if (o instanceof CharSequence) {\n" + + " System.out.println(/*EL:39*/o);\n" + + " } else {\n" + + " /*SL:41*/throw new RuntimeException();\n" + + " }\n" + + " }\n" + + " }\n" + + "}" + ); + } + + + private DecompilerSettings lineNumberSettings() { + DecompilerSettings lineNumberSettings = defaultSettings(); + lineNumberSettings.setShowDebugLineNumbers(true); + return lineNumberSettings; + } +} \ No newline at end of file diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/NameTests.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/NameTests.java index 5c1822f4..2f4e73d2 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/NameTests.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/NameTests.java @@ -149,6 +149,9 @@ public void testVariablesHideClasses() throws Throwable { A.class, defaultSettings(), "static final class A {\n" + + " static class x {\n" + + " static int y;\n" + + " }\n" + " static final class Inner {\n" + " void f(final int x, final Object Integer) {\n" + " final x z = new x();\n" + @@ -158,9 +161,6 @@ public void testVariablesHideClasses() throws Throwable { " System.out.println(Integer instanceof Integer);\n" + " }\n" + " }\n" + - " static class x {\n" + - " static int y;\n" + - " }\n" + "}\n" ); } @@ -171,6 +171,8 @@ public void testLocalImportedAndNestedTypeNameCollisions() throws Throwable { B.class, defaultSettings(), "static final class B {\n" + + " static class Integer {\n" + + " }\n" + " void f(final Object o) {\n" + " class Integer {\n" + " }\n" + @@ -184,8 +186,6 @@ public void testLocalImportedAndNestedTypeNameCollisions() throws Throwable { " System.out.println(java.lang.Integer.class);\n" + " }\n" + " }\n" + - " static class Integer {\n" + - " }\n" + "}\n" ); } @@ -196,14 +196,11 @@ public void testFieldHidesImportedTypeName() throws Throwable { C.class, defaultSettings(), "static final class C {\n" + - " static float Float;\n" + + " static float Float = java.lang.Float.NaN;\n" + " void f() {\n" + " System.out.println(C.Float);\n" + " System.out.println(java.lang.Float.NaN);\n" + " }\n" + - " static {\n" + - " C.Float = java.lang.Float.NaN;\n" + - " }\n" + "}\n" ); } @@ -214,13 +211,13 @@ public void testFormalParameterHidesNestedClass() throws Throwable { D.class, defaultSettings(), "static final class D {\n" + + " static class x {\n" + + " static int y;\n" + + " }\n" + " void f(final int x) {\n" + " System.out.println(x * 2);\n" + " System.out.println(D.x.y);\n" + " }\n" + - " static class x {\n" + - " static int y;\n" + - " }\n" + "}\n" ); } @@ -247,14 +244,14 @@ public void testMethodTypeParameterHidesInnerClass() throws Throwable { F.class, defaultSettings(), "static final class F {\n" + + " static class x {\n" + + " static int y;\n" + + " }\n" + " void f(final x z) {\n" + " System.out.println(z);\n" + " System.out.println(F.x.y);\n" + " }\n" + " \n" + - " static class x {\n" + - " static int y;\n" + - " }\n" + "}\n" ); } @@ -265,14 +262,14 @@ public void testClassTypeParameterHidesInnerClass() throws Throwable { G.class, defaultSettings(), "static final class G {\n" + + " static class x {\n" + + " static int y;\n" + + " }\n" + " void f(final x z) {\n" + " System.out.println(z);\n" + " System.out.println(G.x.y);\n" + " }\n" + " \n" + - " static class x {\n" + - " static int y;\n" + - " }\n" + "}\n" ); } @@ -284,12 +281,12 @@ public void testInnerClassHidesBaseInnerClass() throws Throwable { defaultSettings(), "static final class H extends DeclaresX {\n" + " X z;\n" + + " static class X {\n" + + " }\n" + " void f(final DeclaresX.X x) {\n" + " System.out.println(x);\n" + " System.out.println(this.z);\n" + " }\n" + - " static class X {\n" + - " }\n" + "}\n" ); } @@ -316,13 +313,13 @@ public void testInnerClassHidesBaseInnerClassAndInterfaceInnerClass() throws Thr defaultSettings(), "static final class J extends DeclaresX implements IDeclaresX {\n" + " X z;\n" + + " static class X {\n" + + " }\n" + " void f(final DeclaresX.X x, final IDeclaresX.X y) {\n" + " System.out.println(x);\n" + " System.out.println(y);\n" + " System.out.println(this.z);\n" + " }\n" + - " static class X {\n" + - " }\n" + "}\n" ); } diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/OperatorTests.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/OperatorTests.java index 5f45ec31..fd85b9db 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/OperatorTests.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/OperatorTests.java @@ -72,11 +72,11 @@ private static class G { private int x; private static int y; private int[] a; - private static int[] b = new int[] { 0 }; + private static int[] b = new int[] { 1 }; private G() { super(); - this.a = new int[] { 0 }; + this.a = new int[] { 1 }; } public int f() { @@ -255,11 +255,10 @@ public void testPostIncrementOptimizations() { "private static class G {\n" + " private int x;\n" + " private static int y;\n" + - " private int[] a;\n" + - " private static int[] b;\n" + + " private static int[] b = { 1 };\n" + " private G() {\n" + - " this.a = new int[] { 0 };\n" + " }\n" + + " private int[] a = { 1 };\n" + " public int f() {\n" + " return this.x++;\n" + " }\n" + @@ -269,9 +268,6 @@ public void testPostIncrementOptimizations() { " public int h(int n) {\n" + " return (++this.x + this.a[n++]) / (this.a[++n] + ++this.a[n]) * ++G.b[++G.y];\n" + " }\n" + - " static {\n" + - " G.b = new int[] { 0 };\n" + - " }\n" + "}\n" ); } diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/PrimitiveTests.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/PrimitiveTests.java index d1e208de..a3c6c5aa 100644 --- a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/PrimitiveTests.java +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/PrimitiveTests.java @@ -38,11 +38,11 @@ public void testFloatingPointPrecision() throws Throwable { defaultSettings(), "private static final class A {\n" + " static final float e = 2.7182817f;\n" + - " static double d;\n" + - " static double w;\n" + - " static double x;\n" + - " static double y;\n" + - " static float z;\n" + + " static double d = 2.7182818459;\n" + + " static double w = Double.POSITIVE_INFINITY;\n" + + " static double x = Double.NEGATIVE_INFINITY;\n" + + " static double y = -4.9E-324;\n" + + " static float z = Float.MIN_VALUE;\n" + " public static strictfp void test() {\n" + " final double t = 9.007199254740992E15;\n" + " final double x = t * t;\n" + @@ -57,13 +57,6 @@ public void testFloatingPointPrecision() throws Throwable { " System.out.println(A.z);\n" + " System.out.println((double)A.z);\n" + " }\n" + - " static {\n" + - " A.d = 2.7182818459;\n" + - " A.w = Double.POSITIVE_INFINITY;\n" + - " A.x = Double.NEGATIVE_INFINITY;\n" + - " A.y = -4.9E-324;\n" + - " A.z = Float.MIN_VALUE;\n" + - " }\n" + "}" ); } diff --git a/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java new file mode 100644 index 00000000..9fe09bc9 --- /dev/null +++ b/Procyon.CompilerTools/src/test/java/com/strobel/decompiler/RealignTest.java @@ -0,0 +1,353 @@ +package com.strobel.decompiler; + +import org.junit.Test; + +public class RealignTest extends DecompilerTest { + + static class ReOrderMembers { + + public void method1() { + System.out.println("Test.method1"); + } + + public void method2() { + System.out.println("Test.method2"); + } + + class Inner1 { + + public Inner1() { + System.out.println("Inner1 constructor"); + } + + public void method1() { + System.out.println("Inner1.method1"); + } + + public void method2() { + System.out.println("Inner1.method2"); + } + } + + class Inner2 { + + public Inner2() { + System.out.println("Inner2 constructor"); + } + } + + + public void method3() { + System.out.println("Test.method3"); + } + + public void method4() { + System.out.println("Test.method4"); + } + + class Inner3 { + + public Inner3() { + System.out.println("Inner3 constructor"); + } + + public void method1() { + System.out.println("Inner3.method1"); + } + + public void method2() { + System.out.println("Inner3.method2"); + } + } + + class Inner4 { + + public Inner4() { + System.out.println("Inner4 constructor"); + } + + public void method1() { + System.out.println("Inner4.method1"); + } + + public void method2() { + System.out.println("Inner4.method2"); + } + } + + public void method5() { + System.out.println("Test.method5"); + } + + public void method6() { + System.out.println("Test.method6"); + } + } + + static class RewriteInit { + + private RewriteInit top = new RewriteInit(0); + private RewriteInit test; + + static { + System.out.println("clinit1"); + } + + public RewriteInit(int i) { + System.out.println(i); + } + + private RewriteInit middle = new RewriteInit(false); + + public RewriteInit(boolean flag) { + System.out.println(flag); + test = new RewriteInit(0); // must not be moved to declaration + } + + static { + System.out.println("clinit2"); + } + + private RewriteInit bottom = new RewriteInit(true); + + static { + System.out.println("clinit3"); + } + } + + static class RewriteInit2 { + + private RewriteInit2 top = new RewriteInit2(0); + private RewriteInit2 test; + + static { + System.out.println("clinit1"); + } + + public RewriteInit2(int i) { + this(false); + System.out.println(i); + } + + private RewriteInit2 middle = new RewriteInit2(false); + + public RewriteInit2(boolean flag) { + System.out.println(flag); + test = new RewriteInit2(0); // can be moved to declaration (because of this(...) call) + } + + static { + System.out.println("clinit2"); + } + + private RewriteInit2 bottom = new RewriteInit2(true); + + static { + System.out.println("clinit3"); + } + + class Inner { + Inner() { + System.out.println("Inner"); + } + } + } + + static class RewriteInit3 { + + private int _a, _b; + + public RewriteInit3(int a) { + _a = a; + double b = Math.random(); + _b = b < 0.5 ? 1 : 0; + } + } + + + @Test + public void testReOrderMembers() throws Throwable { + verifyOutput( + ReOrderMembers.class, + lineNumberSettings(), + "static class ReOrderMembers {\n" + + " public void method1() {\n" + + " System.out.println(/*EL:10*/\"Test.method1\");\n" + + " }\n" + + " \n" + + " public void method2() {\n" + + " System.out.println(/*EL:14*/\"Test.method2\");\n" + + " }\n" + + " \n" + + " class Inner1 {\n" + + " public Inner1() {\n" + + " System.out.println(/*EL:20*/\"Inner1 constructor\");\n" + + " }\n" + + " \n" + + " public void method1() {\n" + + " System.out.println(/*EL:24*/\"Inner1.method1\");\n" + + " }\n" + + " \n" + + " public void method2() {\n" + + " System.out.println(/*EL:28*/\"Inner1.method2\");\n" + + " }\n" + + " }\n" + + " \n" + + " class Inner2 {\n" + + " public Inner2() {\n" + + " System.out.println(/*EL:35*/\"Inner2 constructor\");\n" + + " }\n" + + " }\n" + + " \n" + + " public void method3() {\n" + + " System.out.println(/*EL:41*/\"Test.method3\");\n" + + " }\n" + + " \n" + + " public void method4() {\n" + + " System.out.println(/*EL:45*/\"Test.method4\");\n" + + " }\n" + + " \n" + + " class Inner3 {\n" + + " public Inner3() {\n" + + " System.out.println(/*EL:51*/\"Inner3 constructor\");\n" + + " }\n" + + " \n" + + " public void method1() {\n" + + " System.out.println(/*EL:55*/\"Inner3.method1\");\n" + + " }\n" + + " \n" + + " public void method2() {\n" + + " System.out.println(/*EL:59*/\"Inner3.method2\");\n" + + " }\n" + + " }\n" + + " \n" + + " class Inner4 {\n" + + " public Inner4() {\n" + + " System.out.println(/*EL:66*/\"Inner4 constructor\");\n" + + " }\n" + + " \n" + + " public void method1() {\n" + + " System.out.println(/*EL:70*/\"Inner4.method1\");\n" + + " }\n" + + " \n" + + " public void method2() {\n" + + " System.out.println(/*EL:74*/\"Inner4.method2\");\n" + + " }\n" + + " }\n" + + " \n" + + " public void method5() {\n" + + " System.out.println(/*EL:79*/\"Test.method5\");\n" + + " }\n" + + " \n" + + " public void method6() {\n" + + " System.out.println(/*EL:83*/\"Test.method6\");\n" + + " }\n" + + "}" + ); + } + + + @Test + public void testRewriteInit() throws Throwable { + verifyOutput( + RewriteInit.class, + lineNumberSettings(), + "static class RewriteInit {\n" + + " /*SL:89*/private RewriteInit top = new RewriteInit(0);\n" + + " static {\n" + + " System.out.println(/*EL:93*/\"clinit1\");\n" + + " }\n" + + " \n" + + " public RewriteInit(final int i) {\n" + + " System.out.println(/*EL:97*/i);\n" + + " }\n" + + " \n" + + " /*SL:100*/private RewriteInit middle = new RewriteInit(false);\n" + + " \n" + + " public RewriteInit(final boolean flag) {\n" + + " System.out.println(/*EL:103*/flag);\n" + + " /*SL:104*/this.test = new RewriteInit(0);\n" + + " }\n" + + " \n" + + " private RewriteInit test;\n" + + " static {\n" + + " System.out.println(/*EL:108*/\"clinit2\");\n" + + " }\n" + + " /*SL:111*/private RewriteInit bottom = new RewriteInit(true);\n" + + " static {\n" + + " System.out.println(/*EL:114*/\"clinit3\");\n" + + " }\n" + + "}" + ); + } + + @Test + public void testRewriteInit2() throws Throwable { + verifyOutput( + RewriteInit2.class, + lineNumberSettings(), + "static class RewriteInit2 {\n" + + " /*SL:120*/private RewriteInit2 top = new RewriteInit2(0);\n" + + " static {\n" + + " System.out.println(/*EL:124*/\"clinit1\");\n" + + " }\n" + + " \n" + + " public RewriteInit2(final int i) {\n" + + " /*SL:128*/this(false);\n" + + " System.out.println(/*EL:129*/i);\n" + + " }\n" + + " \n" + + " /*SL:132*/private RewriteInit2 middle = new RewriteInit2(false);\n" + + " \n" + + " public RewriteInit2(final boolean flag) {\n" + + " System.out.println(/*EL:135*/flag);\n" + + " }\n" + + " /*SL:136*/private RewriteInit2 test = new RewriteInit2(0);\n" + + " static {\n" + + " System.out.println(/*EL:140*/\"clinit2\");\n" + + " }\n" + + " /*SL:143*/private RewriteInit2 bottom = new RewriteInit2(true);\n" + + " static {\n" + + " System.out.println(/*EL:146*/\"clinit3\");\n" + + " }\n" + + " class Inner {\n" + + " Inner() {\n" + + " System.out.println(/*EL:151*/\"Inner\");\n" + + " }\n" + + " }\n" + + "}" + ); + } + + @Test + public void testRewriteInit3() throws Throwable { + verifyOutput( + RewriteInit3.class, + lineNumberSettings(), + "static class RewriteInit3 {\n" + + " private int _a;\n" + + " private int _b;\n" + + " public RewriteInit3(final int a) {\n" + + " /*SL:161*/this._a = a;\n" + + " final double b = /*EL:162*/Math.random();\n" + + " /*SL:163*/this._b = ((b < 0.5) ? 1 : 0);\n" + + " }\n" + + "}" + ); + } + + @Test + public void testRewriteInitThrowable() throws Throwable { + verifyOutput( + "java/lang/Throwable", + lineNumberSettings(), + "public class Throwable implements Serializable { private static final long serialVersionUID = -3042686055658047285L; private transient Object backtrace; private static final StackTraceElement[] UNASSIGNED_STACK; private StackTraceElement[] stackTrace; private static final List SUPPRESSED_SENTINEL; private List suppressedExceptions; private static final String NULL_CAUSE_MESSAGE = \"Cannot suppress a null exception.\"; private static final String SELF_SUPPRESSION_MESSAGE = \"Self-suppression not permitted\"; private static final String CAUSE_CAPTION = \"Caused by: \"; private static final String SUPPRESSED_CAPTION = \"Suppressed: \"; private static final Throwable[] EMPTY_THROWABLE_ARRAY; private native Throwable fillInStackTrace(final int p0); native int getStackTraceDepth(); native StackTraceElement getStackTraceElement(final int p0); private abstract static class PrintStreamOrWriter { abstract Object lock(); abstract void println(final Object p0); } private static class SentinelHolder { public static final StackTraceElement STACK_TRACE_ELEMENT_SENTINEL; public static final StackTraceElement[] STACK_TRACE_SENTINEL; static { /*SL:146*/STACK_TRACE_ELEMENT_SENTINEL = new StackTraceElement(\"\", \"\", null, Integer.MIN_VALUE); } static { /*SL:153*/STACK_TRACE_SENTINEL = new StackTraceElement[] { SentinelHolder.STACK_TRACE_ELEMENT_SENTINEL }; } } static { /*SL:160*/UNASSIGNED_STACK = new StackTraceElement[0]; } static { /*SL:216*/SUPPRESSED_SENTINEL = Collections.unmodifiableList((List)new ArrayList(0)); } public Throwable() { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:251*/this.fillInStackTrace(); } public Throwable(final String detailMessage) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:266*/this.fillInStackTrace(); /*SL:267*/this.detailMessage = detailMessage; } public Throwable(final String detailMessage, final Throwable cause) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:288*/this.fillInStackTrace(); /*SL:289*/this.detailMessage = detailMessage; /*SL:290*/this.cause = cause; } public Throwable(final Throwable cause) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:311*/this.fillInStackTrace(); /*SL:312*/this.detailMessage = ((cause == null) ? null : cause.toString()); /*SL:313*/this.cause = cause; } protected Throwable(final String detailMessage, final Throwable cause, final boolean b, final boolean b2) { /*SL:211*/this.stackTrace = Throwable.UNASSIGNED_STACK; /*SL:228*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; /*SL:360*/if (b2) { /*SL:361*/this.fillInStackTrace(); } else { /*SL:363*/this.stackTrace = null; } /*SL:365*/this.detailMessage = detailMessage; /*SL:366*/this.cause = cause; /*SL:367*/if (!b) { /*SL:368*/this.suppressedExceptions = null; } } private String detailMessage; /*SL:366*/private Throwable cause = this; public String getMessage() { /*SL:378*/return this.detailMessage; } public String getLocalizedMessage() { /*SL:392*/return this.getMessage(); } public synchronized Throwable getCause() { /*SL:416*/return (this.cause == this) ? null : this.cause; } public synchronized Throwable initCause(final Throwable cause) { /*SL:456*/if (this.cause != this) { /*SL:457*/throw new IllegalStateException(\"Can't overwrite cause with \" + /*EL:458*/Objects.toString(cause, \"a null\"), this); } /*SL:459*/if (cause == this) { /*SL:460*/throw new IllegalArgumentException(\"Self-causation not permitted\", this); } /*SL:461*/this.cause = cause; /*SL:462*/return this; } @Override public String toString() { final String name = /*EL:480*/this.getClass().getName(); final String localizedMessage = /*EL:481*/this.getLocalizedMessage(); /*SL:482*/return (localizedMessage != null) ? (name + \": \" + localizedMessage) : name; } public void printStackTrace() { /*SL:635*/this.printStackTrace(System.err); } public void printStackTrace(final PrintStream printStream) { /*SL:644*/this.printStackTrace(new WrappedPrintStream(printStream)); } private void printStackTrace(final PrintStreamOrWriter printStreamOrWriter) { final Set setFromMap = /*EL:651*/Collections.newSetFromMap(new IdentityHashMap()); /*SL:652*/setFromMap.add(this); /*SL:654*/synchronized (printStreamOrWriter.lock()) { /*SL:656*/printStreamOrWriter.println(this); final StackTraceElement[] ourStackTrace; final StackTraceElement[] array = /*EL:658*/ourStackTrace = this.getOurStackTrace(); for (int length = ourStackTrace.length, i = 0; i < length; ++i) { /*SL:659*/printStreamOrWriter.println(\"\\tat \" + ourStackTrace[i]); } final Throwable[] suppressed = /*EL:662*/this.getSuppressed(); for (int length2 = suppressed.length, j = 0; j < length2; ++j) { suppressed[j].printEnclosedStackTrace(/*EL:663*/printStreamOrWriter, array, \"Suppressed: \", \"\\t\", setFromMap); } final Throwable cause = /*EL:666*/this.getCause(); /*SL:667*/if (cause != null) { /*SL:668*/cause.printEnclosedStackTrace(printStreamOrWriter, array, \"Caused by: \", \"\", setFromMap); } } } private void printEnclosedStackTrace(final PrintStreamOrWriter printStreamOrWriter, final StackTraceElement[] array, final String s, final String s2, final Set set) { /*SL:681*/assert Thread.holdsLock(printStreamOrWriter.lock()); /*SL:682*/if (set.contains(this)) { /*SL:683*/printStreamOrWriter.println(s2 + s + \"[CIRCULAR REFERENCE: \" + this + \"]\"); } else { /*SL:685*/set.add(this); final StackTraceElement[] ourStackTrace = /*EL:687*/this.getOurStackTrace(); int n = /*EL:688*/ourStackTrace.length - 1; /*SL:690*/for (int n2 = array.length - 1; n >= 0 && n2 >= 0 && ourStackTrace[n].equals(array[n2]); /*SL:691*/--n, --n2) {} final int n3 = /*EL:693*/ourStackTrace.length - 1 - n; /*SL:696*/printStreamOrWriter.println(s2 + s + this); /*SL:697*/for (int i = 0; i <= n; ++i) { /*SL:698*/printStreamOrWriter.println(s2 + \"\\tat \" + ourStackTrace[i]); } /*SL:699*/if (n3 != 0) { /*SL:700*/printStreamOrWriter.println(s2 + \"\\t... \" + n3 + \" more\"); } final Throwable[] suppressed = /*EL:703*/this.getSuppressed(); for (int length = suppressed.length, j = 0; j < length; ++j) { suppressed[j].printEnclosedStackTrace(/*EL:704*/printStreamOrWriter, ourStackTrace, \"Suppressed: \", s2 + \"\\t\", set); } final Throwable cause = /*EL:708*/this.getCause(); /*SL:709*/if (cause != null) { /*SL:710*/cause.printEnclosedStackTrace(printStreamOrWriter, ourStackTrace, \"Caused by: \", s2, set); } } } public void printStackTrace(final PrintWriter printWriter) { /*SL:722*/this.printStackTrace(new WrappedPrintWriter(printWriter)); } private static class WrappedPrintStream extends PrintStreamOrWriter { /*SL:741*/private final PrintStream printStream = printStream; WrappedPrintStream(final PrintStream printStream) { } @Override Object lock() { /*SL:745*/return this.printStream; } @Override void println(final Object o) { /*SL:749*/this.printStream.println(o); } } private static class WrappedPrintWriter extends PrintStreamOrWriter { /*SL:757*/private final PrintWriter printWriter = printWriter; WrappedPrintWriter(final PrintWriter printWriter) { } @Override Object lock() { /*SL:761*/return this.printWriter; } @Override void println(final Object o) { /*SL:765*/this.printWriter.println(o); } } public synchronized Throwable fillInStackTrace() { /*SL:782*/if (this.stackTrace != null || this.backtrace != null) { /*SL:784*/this.fillInStackTrace(0); /*SL:785*/this.stackTrace = Throwable.UNASSIGNED_STACK; } /*SL:787*/return this; } public StackTraceElement[] getStackTrace() { /*SL:817*/return this.getOurStackTrace().clone(); } private synchronized StackTraceElement[] getOurStackTrace() { /*SL:823*/if (this.stackTrace == Throwable.UNASSIGNED_STACK || (this.stackTrace == null && this.backtrace != null)) { final int stackTraceDepth = /*EL:825*/this.getStackTraceDepth(); /*SL:826*/this.stackTrace = new StackTraceElement[stackTraceDepth]; /*SL:827*/for (int i = 0; i < stackTraceDepth; ++i) { /*SL:828*/this.stackTrace[i] = this.getStackTraceElement(i); } } else/*SL:829*/ if (this.stackTrace == null) { /*SL:830*/return Throwable.UNASSIGNED_STACK; } /*SL:832*/return this.stackTrace; } public void setStackTrace(final StackTraceElement[] array) { final StackTraceElement[] stackTrace = /*EL:865*/array.clone(); /*SL:866*/for (int i = 0; i < stackTrace.length; ++i) { /*SL:867*/if (stackTrace[i] == null) { /*SL:868*/throw new NullPointerException(\"stackTrace[\" + i + \"]\"); } } /*SL:871*/synchronized (this) { /*SL:872*/if (this.stackTrace == null && this.backtrace == null) { /*SL:874*/return; } /*SL:875*/this.stackTrace = stackTrace; } } private void readObject(final ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException { /*SL:915*/objectInputStream.defaultReadObject(); final List suppressedExceptions = /*EL:920*/this.suppressedExceptions; /*SL:921*/this.suppressedExceptions = Throwable.SUPPRESSED_SENTINEL; final StackTraceElement[] stackTrace = /*EL:923*/this.stackTrace; /*SL:924*/this.stackTrace = Throwable.UNASSIGNED_STACK.clone(); /*SL:926*/if (suppressedExceptions != null) { final int validateSuppressedExceptionsList = /*EL:927*/this.validateSuppressedExceptionsList(suppressedExceptions); /*SL:928*/if (validateSuppressedExceptionsList > 0) { final ArrayList suppressedExceptions2 = /*EL:929*/new ArrayList(Math.min(100, validateSuppressedExceptionsList)); /*SL:931*/for (final Throwable t : suppressedExceptions) { /*SL:934*/if (t == null) { /*SL:935*/throw new NullPointerException(\"Cannot suppress a null exception.\"); } /*SL:936*/if (t == this) { /*SL:937*/throw new IllegalArgumentException(\"Self-suppression not permitted\"); } /*SL:938*/suppressedExceptions2.add((Object)t); } /*SL:942*/this.suppressedExceptions = (List)suppressedExceptions2; } } else { /*SL:945*/this.suppressedExceptions = null; } /*SL:957*/if (stackTrace != null) { final StackTraceElement[] stackTrace2 = /*EL:960*/stackTrace.clone(); /*SL:961*/if (stackTrace2.length >= 1) { /*SL:962*/if (stackTrace2.length == 1 && SentinelHolder.STACK_TRACE_ELEMENT_SENTINEL.equals(stackTrace2[0])) { /*SL:965*/this.stackTrace = null; } else { final StackTraceElement[] array = /*EL:967*/stackTrace2; for (int length = array.length, i = 0; i < length; ++i) { /*SL:968*/if (array[i] == null) { /*SL:969*/throw new NullPointerException(\"null StackTraceElement in serial stream.\"); } } /*SL:971*/this.stackTrace = stackTrace2; } } } } private int validateSuppressedExceptionsList(final List list) throws IOException { /*SL:984*/if (Object.class.getClassLoader() != list.getClass().getClassLoader()) { /*SL:985*/throw new StreamCorruptedException(\"List implementation not on the bootclasspath.\"); } final int size = /*EL:987*/list.size(); /*SL:988*/if (size < 0) { /*SL:989*/throw new StreamCorruptedException(\"Negative list size reported.\"); } /*SL:991*/return size; } private synchronized void writeObject(final ObjectOutputStream objectOutputStream) throws IOException { /*SL:1008*/this.getOurStackTrace(); final StackTraceElement[] stackTrace = /*EL:1010*/this.stackTrace; try { /*SL:1012*/if (this.stackTrace == null) { /*SL:1013*/this.stackTrace = SentinelHolder.STACK_TRACE_SENTINEL; } /*SL:1014*/objectOutputStream.defaultWriteObject(); } finally { /*SL:1016*/this.stackTrace = stackTrace; } } public final synchronized void addSuppressed(final Throwable t) { /*SL:1071*/if (t == this) { /*SL:1072*/throw new IllegalArgumentException(\"Self-suppression not permitted\", t); } /*SL:1074*/if (t == null) { /*SL:1075*/throw new NullPointerException(\"Cannot suppress a null exception.\"); } /*SL:1077*/if (this.suppressedExceptions == null) { /*SL:1078*/return; } /*SL:1080*/if (this.suppressedExceptions == Throwable.SUPPRESSED_SENTINEL) { /*SL:1081*/this.suppressedExceptions = new ArrayList(1); } /*SL:1083*/this.suppressedExceptions.add(t); } static { /*SL:1086*/EMPTY_THROWABLE_ARRAY = new Throwable[0]; } public final synchronized Throwable[] getSuppressed() { /*SL:1104*/if (this.suppressedExceptions == Throwable.SUPPRESSED_SENTINEL || this.suppressedExceptions == null) { /*SL:1106*/return Throwable.EMPTY_THROWABLE_ARRAY; } /*SL:1108*/return this.suppressedExceptions.toArray(Throwable.EMPTY_THROWABLE_ARRAY); } }" + ); + } + + private static DecompilerSettings lineNumberSettings() { + DecompilerSettings lineNumberSettings = defaultSettings(); + lineNumberSettings.setShowDebugLineNumbers(true); + return lineNumberSettings; + } +} diff --git a/Procyon.Core/src/main/java/com/strobel/Procyon.java b/Procyon.Core/src/main/java/com/strobel/Procyon.java index cec413c8..20d89add 100644 --- a/Procyon.Core/src/main/java/com/strobel/Procyon.java +++ b/Procyon.Core/src/main/java/com/strobel/Procyon.java @@ -14,7 +14,7 @@ package com.strobel; public final class Procyon { - private static final String VERSION = "0.6.0"; + private static final String VERSION = "0.6.3-SNAPSHOT"; public static String version() { return VERSION; diff --git a/Procyon.Decompiler/build.gradle b/Procyon.Decompiler/build.gradle index b81fa7fe..535b0458 100644 --- a/Procyon.Decompiler/build.gradle +++ b/Procyon.Decompiler/build.gradle @@ -1,17 +1,16 @@ -uploadArchives.enabled = false - jar { manifest { attributes 'Title': archivesBaseName, 'Manifest-Version': '1.0', 'Version': version, 'Main-Class' : 'com.strobel.decompiler.DecompilerDriver' } from { - configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } + configurations.implementation.collect { it.isDirectory() ? it : zipTree(it) } } } dependencies { - compile 'com.beust:jcommander:1.78' - compile project(':Procyon.Core') - compile project(':Procyon.CompilerTools') + implementation 'com.beust:jcommander:1.82' + implementation project(':Procyon.Core') + implementation project(':Procyon.CompilerTools') + testImplementation 'commons-io:commons-io:2.20.0' } diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/AbstractLineNumberFormatter.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/AbstractLineNumberFormatter.java new file mode 100644 index 00000000..bd3121b4 --- /dev/null +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/AbstractLineNumberFormatter.java @@ -0,0 +1,225 @@ +/* + * AbstractLineNumberFormatter.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler; + +import com.strobel.decompiler.languages.LineNumberPosition; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.EnumSet; +import java.util.Iterator; +import java.util.List; + +public abstract class AbstractLineNumberFormatter { + + private final List _positions; + private final EnumSet _options; + + /** + * Constructs an instance. + * + * @param lineNumberPositions a recipe for how to fix the line numbers in 'file'. + * @param options controls how 'this' represents line numbers in the resulting file + */ + protected AbstractLineNumberFormatter( + List lineNumberPositions, + EnumSet options) { + _positions = lineNumberPositions; + _options = (options == null ? EnumSet.noneOf(LineNumberOption.class) : options); + } + + /** + * Rewrites the file passed to 'this' constructor so that the actual line + * numbers match the recipe passed to 'this' constructor. + * + * @return The formatted source code + */ + public String reformatFile() throws IOException { + List lineBrokenPositions = new ArrayList<>(); + List brokenLines = breakLines(lineBrokenPositions); + try (StringWriter sw = new StringWriter()) { + emitFormatted(brokenLines, lineBrokenPositions, sw); + return sw.toString(); + } + } + + /** + * Processes {@link #_file}, breaking apart any lines on which multiple line-number markers + * appear in different columns. + * + * @return the list of broken lines + */ + private List breakLines(List o_LineBrokenPositions) throws IOException { + int numLinesRead = 0; + int lineOffset = 0; + List brokenLines = new ArrayList<>(); + + try (BufferedReader r = createReader()) { + for (int posIndex = 0; posIndex < _positions.size(); posIndex++) { + LineNumberPosition pos = _positions.get(posIndex); + o_LineBrokenPositions.add( new LineNumberPosition( + pos.getOriginalLine(), pos.getEmittedLine()+lineOffset, pos.getEmittedColumn())); + + // Copy the input file up to but not including the emitted line # in "pos". + while (numLinesRead < pos.getEmittedLine() - 1) { + brokenLines.add(r.readLine()); + numLinesRead++; + } + + // Read the line that contains the next line number annotations, but don't write it yet. + String line = r.readLine(); + numLinesRead++; + + // See if there are two original line annotations on the same emitted line. + LineNumberPosition nextPos; + int prevPartLen = 0; + char[] indent = {}; + do { + nextPos = (posIndex < _positions.size() - 1) ? _positions.get(posIndex + 1) : null; + if ( nextPos != null + && nextPos.getEmittedLine() == pos.getEmittedLine() + && nextPos.getOriginalLine() > pos.getOriginalLine()) { + // Two different source line numbers on the same emitted line! + posIndex++; + lineOffset++; + String firstPart = line.substring(0, nextPos.getEmittedColumn() - prevPartLen - 1); + brokenLines.add(new String(indent) + firstPart); + prevPartLen += firstPart.length(); + indent = new char[prevPartLen]; + Arrays.fill(indent, ' '); + line = line.substring(firstPart.length(), line.length()); + + // Alter the position while adding it. + o_LineBrokenPositions.add( new LineNumberPosition( + nextPos.getOriginalLine(), nextPos.getEmittedLine()+lineOffset, nextPos.getEmittedColumn())); + } else { + nextPos = null; + } + } while (nextPos != null); + + // Nothing special here-- just emit the line. + brokenLines.add(new String(indent) + line); + } + + // Copy out the remainder of the file. + String line; + while ((line = r.readLine()) != null) { + brokenLines.add(line); + } + } + return brokenLines; + } + + protected abstract BufferedReader createReader() throws IOException; + + private void emitFormatted(List brokenLines, List lineBrokenPositions, Writer writer) { + int globalOffset = 0; + int numLinesRead = 0; + Iterator lines = brokenLines.iterator(); + + int maxLineNo = LineNumberPosition.computeMaxLineNumber(lineBrokenPositions); + try (LineNumberPrintWriter w = new LineNumberPrintWriter(maxLineNo, writer)) { + + // Suppress all line numbers if we weren't asked to show them. + if (!_options.contains(LineNumberOption.LEADING_COMMENTS)) { + w.suppressLineNumbers(); + } + + // Suppress stretching if we weren't asked to do it. + boolean doStretching = (_options.contains(LineNumberOption.STRETCHED)); + + for (LineNumberPosition pos : lineBrokenPositions) { + int nextTarget = pos.getOriginalLine(); + int nextActual = pos.getEmittedLine(); + int requiredAdjustment = (nextTarget - nextActual - globalOffset); + + if (doStretching && requiredAdjustment < 0) { + // We currently need to remove newlines to squeeze things together. + // prefer to remove empty lines, + // 1. read all lines before nextActual and remove empty lines as needed + List stripped = new ArrayList<>(); + while (numLinesRead < nextActual - 1) { + String line = lines.next(); + numLinesRead++; + if ((requiredAdjustment < 0) && line.trim().isEmpty()) { + requiredAdjustment++; + globalOffset--; + } else { + stripped.add(line); + } + } + // 2. print non empty lines while stripping further as needed + int lineNoToPrint = (stripped.size() + requiredAdjustment <= 0) + ? nextTarget : LineNumberPrintWriter.NO_LINE_NUMBER; + for (String line : stripped) { + if (requiredAdjustment < 0) { + w.print(lineNoToPrint, line); + w.print(" "); + requiredAdjustment++; + globalOffset--; + } else { + w.println(lineNoToPrint, line); + } + } + // 3. read and print next actual + String line = lines.next(); + numLinesRead++; + if (requiredAdjustment < 0) { + w.print(nextTarget, line); + w.print(" "); + globalOffset--; + } else { + w.println(nextTarget, line); + } + + } else { + while (numLinesRead < nextActual) { + String line = lines.next(); + numLinesRead++; + boolean isLast = (numLinesRead >= nextActual); + int lineNoToPrint = isLast ? nextTarget : LineNumberPrintWriter.NO_LINE_NUMBER; + + if (requiredAdjustment > 0 && doStretching) { + // We currently need to inject newlines to space things out. + do { + w.println(""); + requiredAdjustment--; + globalOffset++; + } while (isLast && requiredAdjustment > 0); + w.println(lineNoToPrint, line); + } else { + // No tweaks needed-- we are on the ball. + w.println(lineNoToPrint, line); + } + } + } + } + + // Finish out the file. + String line; + while (lines.hasNext()) { + line = lines.next(); + w.println(line); + } + } + } + +} diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java index 67800d13..3321a910 100644 --- a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/DecompilerDriver.java @@ -1,15 +1,38 @@ +/* + * DecompilerDriver.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + package com.strobel.decompiler; import com.beust.jcommander.JCommander; import com.strobel.Procyon; import com.strobel.annotations.NotNull; import com.strobel.assembler.InputTypeLoader; -import com.strobel.assembler.metadata.*; +import com.strobel.assembler.metadata.CompositeTypeLoader; +import com.strobel.assembler.metadata.DeobfuscationUtilities; +import com.strobel.assembler.metadata.IMetadataResolver; +import com.strobel.assembler.metadata.ITypeLoader; +import com.strobel.assembler.metadata.JarTypeLoader; +import com.strobel.assembler.metadata.MetadataParser; +import com.strobel.assembler.metadata.MetadataSystem; +import com.strobel.assembler.metadata.TypeDefinition; +import com.strobel.assembler.metadata.TypeReference; import com.strobel.core.ExceptionUtilities; import com.strobel.core.StringUtilities; -import com.strobel.decompiler.LineNumberFormatter.LineNumberOption; -import com.strobel.decompiler.languages.BytecodeOutputOptions; import com.strobel.decompiler.languages.BytecodeLanguage; +import com.strobel.decompiler.languages.BytecodeOutputOptions; import com.strobel.decompiler.languages.Languages; import com.strobel.decompiler.languages.LineNumberPosition; import com.strobel.decompiler.languages.TypeDecompilationResults; @@ -24,14 +47,13 @@ import java.io.Writer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.EnumSet; import java.util.Enumeration; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.logging.ConsoleHandler; @@ -42,7 +64,7 @@ import java.util.logging.Logger; public class DecompilerDriver { - public static void main(final String[] args) { + public static void main(final String... args) { final CommandLineOptions options = new CommandLineOptions(); final JCommander jCommander; final List typeNames; @@ -295,7 +317,7 @@ private static void decompileType( final TypeDefinition resolvedType; if (type == null || (resolvedType = type.resolve()) == null) { - System.err.printf("!!! ERROR: Failed to load class %s.\n", typeName); + System.err.printf("!!! ERROR: Failed to load class %s.%n", typeName); return; } @@ -327,7 +349,7 @@ private static void decompileType( } if (writeToFile) { - System.out.printf("Decompiling %s...\n", typeName); + System.out.printf("Decompiling %s...%n", typeName); } final TypeDecompilationResults results = settings.getLanguage().decompileType(resolvedType, output, options); @@ -353,13 +375,17 @@ private static void decompileType( lineNumberOptions.add(LineNumberOption.STRETCHED); } + final File outputFile = ((FileOutputWriter) writer).getFile(); final LineNumberFormatter lineFormatter = new LineNumberFormatter( - ((FileOutputWriter) writer).getFile(), + outputFile, lineNumberPositions, lineNumberOptions ); - lineFormatter.reformatFile(); + final String reformattedFile = lineFormatter.reformatFile(); + final Charset charset = settings.isUnicodeOutputEnabled() ? StandardCharsets.UTF_8 + : Charset.defaultCharset(); + Files.write(outputFile.toPath(), reformattedFile.getBytes(charset)); } } @@ -454,30 +480,4 @@ public String format(@NotNull final LogRecord record) { " [" + record.getLevel() + "] " + loggerName + ": " + record.getMessage() + ' ' + lineSep; } -} - -final class NoRetryMetadataSystem extends MetadataSystem { - private final Set _failedTypes = new HashSet<>(); - - NoRetryMetadataSystem() { - } - - NoRetryMetadataSystem(final ITypeLoader typeLoader) { - super(typeLoader); - } - - @Override - protected TypeDefinition resolveType(final String descriptor, final boolean mightBePrimitive) { - if (_failedTypes.contains(descriptor)) { - return null; - } - - final TypeDefinition result = super.resolveType(descriptor, mightBePrimitive); - - if (result == null) { - _failedTypes.add(descriptor); - } - - return result; - } } \ No newline at end of file diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/InMemoryLineNumberFormatter.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/InMemoryLineNumberFormatter.java new file mode 100644 index 00000000..78d44a56 --- /dev/null +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/InMemoryLineNumberFormatter.java @@ -0,0 +1,58 @@ +/* + * InMemoryLineNumberFormatter.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler; + +import com.strobel.decompiler.languages.LineNumberPosition; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; +import java.util.EnumSet; +import java.util.List; + +/** + * An InMemoryLineNumberFormatter is used to rewrite an existing .java source, introducing + * line number information. It can handle either, or both, of the following jobs: + * + *
    + *
  • Introduce line numbers as leading comments. + *
  • Stretch the source so that the line number comments match the physical lines. + *
+ */ +public class InMemoryLineNumberFormatter extends AbstractLineNumberFormatter { + + private final String _source; + + /** + * Constructs an instance. + * + * @param source the source whose line numbers should be fixed + * @param lineNumberPositions a recipe for how to fix the line numbers in source. + * @param options controls how 'this' represents line numbers in the resulting source + */ + public InMemoryLineNumberFormatter(String source, + List lineNumberPositions, + EnumSet options) { + super(lineNumberPositions, options); + _source = source; + } + + @Override + protected BufferedReader createReader() throws IOException { + return new BufferedReader(new StringReader(_source)); + } +} diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberFormatter.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberFormatter.java index a05e386d..3b16f7e2 100644 --- a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberFormatter.java +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberFormatter.java @@ -1,227 +1,59 @@ +/* + * LineNumberFormatter.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + package com.strobel.decompiler; +import com.strobel.decompiler.languages.LineNumberPosition; + import java.io.BufferedReader; -import java.io.BufferedWriter; import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; +import java.nio.file.Files; import java.util.EnumSet; -import java.util.Iterator; import java.util.List; -import com.strobel.decompiler.languages.LineNumberPosition; - /** * A LineNumberFormatter is used to rewrite an existing .java file, introducing * line number information. It can handle either, or both, of the following jobs: * *
    - *
  • Introduce line numbers as leading comments. + *
  • Introduce line numbers as leading comments. *
  • Stretch the file so that the line number comments match the physical lines. *
*/ -public class LineNumberFormatter { - private final List _positions; +public class LineNumberFormatter extends AbstractLineNumberFormatter { + private final File _file; - private final EnumSet _options; - - public enum LineNumberOption - { - LEADING_COMMENTS, - STRETCHED, - } - + /** * Constructs an instance. * - * @param file the file whose line numbers should be fixed + * @param file the file whose line numbers should be fixed * @param lineNumberPositions a recipe for how to fix the line numbers in 'file'. * @param options controls how 'this' represents line numbers in the resulting file */ public LineNumberFormatter(File file, List lineNumberPositions, EnumSet options) { + super(lineNumberPositions, options); _file = file; - _positions = lineNumberPositions; - _options = (options == null ? EnumSet.noneOf( LineNumberOption.class) : options); } - /** - * Rewrites the file passed to 'this' constructor so that the actual line numbers match - * the recipe passed to 'this' constructor. - */ - public void reformatFile() throws IOException { - List lineBrokenPositions = new ArrayList(); - List brokenLines = breakLines( lineBrokenPositions); - emitFormatted( brokenLines, lineBrokenPositions); + @Override + protected BufferedReader createReader() throws IOException { + return Files.newBufferedReader(_file.toPath()); } - - /** - * Processes {@link #_file}, breaking apart any lines on which multiple line-number markers - * appear in different columns. - * - * @return the list of broken lines - */ - private List breakLines( List o_LineBrokenPositions) throws IOException { - int numLinesRead = 0; - int lineOffset = 0; - List brokenLines = new ArrayList<>(); - - try( BufferedReader r = new BufferedReader( new FileReader( _file))) { - for ( int posIndex=0; posIndex<_positions.size(); posIndex++) { - LineNumberPosition pos = _positions.get( posIndex); - o_LineBrokenPositions.add( new LineNumberPosition( - pos.getOriginalLine(), pos.getEmittedLine()+lineOffset, pos.getEmittedColumn())); - - // Copy the input file up to but not including the emitted line # in "pos". - while ( numLinesRead < pos.getEmittedLine()-1) { - brokenLines.add( r.readLine()); - numLinesRead++; - } - - // Read the line that contains the next line number annotations, but don't write it yet. - String line = r.readLine(); - numLinesRead++; - - // See if there are two original line annotations on the same emitted line. - LineNumberPosition nextPos; - int prevPartLen = 0; - char[] indent = {}; - do { - nextPos = (posIndex < _positions.size()-1) ? _positions.get( posIndex+1) : null; - if ( nextPos != null - && nextPos.getEmittedLine() == pos.getEmittedLine() - && nextPos.getOriginalLine() > pos.getOriginalLine()) { - // Two different source line numbers on the same emitted line! - posIndex++; - lineOffset++; - String firstPart = line.substring( 0, nextPos.getEmittedColumn() - prevPartLen - 1); - brokenLines.add( new String(indent) + firstPart); - prevPartLen += firstPart.length(); - indent = new char[prevPartLen]; - Arrays.fill( indent, ' '); - line = line.substring( firstPart.length(), line.length()); - - // Alter the position while adding it. - o_LineBrokenPositions.add( new LineNumberPosition( - nextPos.getOriginalLine(), nextPos.getEmittedLine()+lineOffset, nextPos.getEmittedColumn())); - } else { - nextPos = null; - } - } while ( nextPos != null); - - // Nothing special here-- just emit the line. - brokenLines.add( new String(indent) + line); - } - - // Copy out the remainder of the file. - String line; - while ( (line = r.readLine()) != null) { - brokenLines.add( line); - } - } - return brokenLines; - } - - private void emitFormatted( List brokenLines, List lineBrokenPositions) throws IOException { - File tempFile = new File( _file.getAbsolutePath() + ".fixed"); - int globalOffset = 0; - int numLinesRead = 0; - Iterator lines = brokenLines.iterator(); - - int maxLineNo = LineNumberPosition.computeMaxLineNumber( lineBrokenPositions); - try( LineNumberPrintWriter w = new LineNumberPrintWriter( - maxLineNo, new BufferedWriter( new FileWriter( tempFile)))) { - - // Suppress all line numbers if we weren't asked to show them. - if ( ! _options.contains( LineNumberOption.LEADING_COMMENTS)) { - w.suppressLineNumbers(); - } - - // Suppress stretching if we weren't asked to do it. - boolean doStretching = (_options.contains( LineNumberOption.STRETCHED)); - - for ( LineNumberPosition pos : lineBrokenPositions) { - int nextTarget = pos.getOriginalLine(); - int nextActual = pos.getEmittedLine(); - int requiredAdjustment = (nextTarget - nextActual - globalOffset); - - if (doStretching && requiredAdjustment < 0) { - // We currently need to remove newlines to squeeze things together. - // prefer to remove empty lines, - // 1. read all lines before nextActual and remove empty lines as needed - List stripped = new ArrayList<>(); - while( numLinesRead < nextActual - 1) { - String line = lines.next(); - numLinesRead++; - if ((requiredAdjustment < 0) && line.trim().isEmpty()) { - requiredAdjustment++; - globalOffset--; - } else { - stripped.add(line); - } - } - // 2. print non empty lines while stripping further as needed - int lineNoToPrint = (stripped.size() + requiredAdjustment <= 0) - ? nextTarget : LineNumberPrintWriter.NO_LINE_NUMBER; - for (String line : stripped) { - if (requiredAdjustment < 0) { - w.print( lineNoToPrint, line); - w.print( " "); - requiredAdjustment++; - globalOffset--; - } else { - w.println( lineNoToPrint, line); - } - } - // 3. read and print next actual - String line = lines.next(); - numLinesRead++; - if (requiredAdjustment < 0) { - w.print( nextTarget, line); - w.print( " "); - globalOffset--; - } else { - w.println( nextTarget, line); - } - - } else { - while( numLinesRead < nextActual) { - String line = lines.next(); - numLinesRead++; - boolean isLast = (numLinesRead >= nextActual); - int lineNoToPrint = isLast ? nextTarget : LineNumberPrintWriter.NO_LINE_NUMBER; - - if ( requiredAdjustment > 0 && doStretching) { - // We currently need to inject newlines to space things out. - do { - w.println( ""); - requiredAdjustment--; - globalOffset++; - } while ( isLast && requiredAdjustment > 0); - w.println( lineNoToPrint, line); - } else { - // No tweaks needed-- we are on the ball. - w.println( lineNoToPrint, line); - } - } - } - } - - // Finish out the file. - String line; - while ( lines.hasNext()) { - line = lines.next(); - w.println( line); - } - } - - // Delete the original file and rename the formatted temp file over the original. - _file.delete(); - tempFile.renameTo( _file); - } - } diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberOption.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberOption.java new file mode 100644 index 00000000..e8e6f016 --- /dev/null +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberOption.java @@ -0,0 +1,23 @@ +/* + * LineNumberOption.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler; + +public enum LineNumberOption +{ + LEADING_COMMENTS, + STRETCHED, +} \ No newline at end of file diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberPrintWriter.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberPrintWriter.java index bdc2baa3..0b00fdc4 100644 --- a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberPrintWriter.java +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/LineNumberPrintWriter.java @@ -1,3 +1,19 @@ +/* + * LineNumberPrintWriter.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + package com.strobel.decompiler; import java.io.PrintWriter; diff --git a/Procyon.Decompiler/src/main/java/com/strobel/decompiler/NoRetryMetadataSystem.java b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/NoRetryMetadataSystem.java new file mode 100644 index 00000000..a17e1e7f --- /dev/null +++ b/Procyon.Decompiler/src/main/java/com/strobel/decompiler/NoRetryMetadataSystem.java @@ -0,0 +1,50 @@ +/* + * NoRetryMetadataSystem.java + * + * Copyright (c) 2013-2022 Mike Strobel and other contributors + * + * This source code is based on Mono.Cecil from Jb Evain, Copyright (c) Jb Evain; + * and ILSpy/ICSharpCode from SharpDevelop, Copyright (c) AlphaSierraPapa. + * + * This source code is subject to terms and conditions of the Apache License, Version 2.0. + * A copy of the license can be found in the License.html file at the root of this distribution. + * By using this source code in any fashion, you are agreeing to be bound by the terms of the + * Apache License, Version 2.0. + * + * You must not remove this notice, or any other, from this software. + */ + +package com.strobel.decompiler; + +import com.strobel.assembler.metadata.ITypeLoader; +import com.strobel.assembler.metadata.MetadataSystem; +import com.strobel.assembler.metadata.TypeDefinition; + +import java.util.HashSet; +import java.util.Set; + +public final class NoRetryMetadataSystem extends MetadataSystem { + private final Set _failedTypes = new HashSet<>(); + + NoRetryMetadataSystem() { + } + + NoRetryMetadataSystem(final ITypeLoader typeLoader) { + super(typeLoader); + } + + @Override + protected TypeDefinition resolveType(final String descriptor, final boolean mightBePrimitive) { + if (_failedTypes.contains(descriptor)) { + return null; + } + + final TypeDefinition result = super.resolveType(descriptor, mightBePrimitive); + + if (result == null) { + _failedTypes.add(descriptor); + } + + return result; + } +} \ No newline at end of file diff --git a/Procyon.Decompiler/src/test/java/com/strobel/decompiler/DecompilerDriverTest.java b/Procyon.Decompiler/src/test/java/com/strobel/decompiler/DecompilerDriverTest.java new file mode 100644 index 00000000..227d0115 --- /dev/null +++ b/Procyon.Decompiler/src/test/java/com/strobel/decompiler/DecompilerDriverTest.java @@ -0,0 +1,69 @@ +package com.strobel.decompiler; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.Assert.assertEquals; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.PrintStream; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.junit.Test; + +public class DecompilerDriverTest { + + private void assertEqualsIgnoreEOL(String expected, String actual) { + assertEquals(expected.replaceAll("\\s*\r?\n", "\n"), actual.replaceAll("\\s*\r?\n", "\n")); + } + + private String getResourceAsString(String path) throws IOException { + return IOUtils.toString(getClass().getResource(path), UTF_8); + } + + private String getFileAsString(File outputDir, String pathname) throws IOException { + return FileUtils.readFileToString(new File(outputDir, pathname), UTF_8); + } + + @Test + public void testDecompileModule() throws Exception { + File outputDir = new File("build/platform-1.0.0_decompiled"); + DecompilerDriver.main("src/test/resources/jar/platform-1.0.0.jar", "--suppress-banner", "-o", outputDir.getAbsolutePath()); + assertEqualsIgnoreEOL(getResourceAsString("/txt/platform-1.0.0/module-info.txt"), getFileAsString(outputDir, "module-info.java")); + } + + @Test + public void testDecompileModuleByteCode() throws Exception { + PrintStream systemOut = System.out; + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out, true, UTF_8.name())); + DecompilerDriver.main("src/test/resources/jar/platform-1.0.0.jar", "--suppress-banner", "-r", "-cp", "-lv", "-ta", "-v"); + assertEqualsIgnoreEOL(getResourceAsString("/txt/platform-1.0.0/platform-1.0.0-bytecode.txt"), new String(out.toByteArray(), UTF_8)); + } finally { + System.setOut(systemOut); + } + } + + @Test + public void testDecompileAllJavaSyntaxes() throws Exception { + File outputDir = new File("build/all-java-syntaxes"); + DecompilerDriver.main("src/test/resources/jar/all-java-syntaxes.jar", "--suppress-banner", "-o", outputDir.getAbsolutePath()); + assertEqualsIgnoreEOL(getResourceAsString("/txt/all-java-syntaxes/all-java-syntaxes.txt"), getFileAsString(outputDir, "demo/AllJavaSyntaxes.java")); + } + + @Test + public void testDecompileAllJavaSyntaxesByteCode() throws Exception { + PrintStream systemOut = System.out; + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + System.setOut(new PrintStream(out, true, UTF_8.name())); + DecompilerDriver.main("src/test/resources/jar/all-java-syntaxes.jar", "--suppress-banner", "-r", "-cp", "-lv", "-ta", "-v"); + assertEqualsIgnoreEOL(getResourceAsString("/txt/all-java-syntaxes/all-java-syntaxes-bytecode.txt"), new String(out.toByteArray(), UTF_8)); + } finally { + System.setOut(systemOut); + } + } + +} diff --git a/Procyon.Decompiler/src/test/resources/jar/all-java-syntaxes.jar b/Procyon.Decompiler/src/test/resources/jar/all-java-syntaxes.jar new file mode 100644 index 00000000..a01d2b91 Binary files /dev/null and b/Procyon.Decompiler/src/test/resources/jar/all-java-syntaxes.jar differ diff --git a/Procyon.Decompiler/src/test/resources/jar/platform-1.0.0.jar b/Procyon.Decompiler/src/test/resources/jar/platform-1.0.0.jar new file mode 100644 index 00000000..72c0f2c7 Binary files /dev/null and b/Procyon.Decompiler/src/test/resources/jar/platform-1.0.0.jar differ diff --git a/Procyon.Decompiler/src/test/resources/txt/all-java-syntaxes/all-java-syntaxes-bytecode.txt b/Procyon.Decompiler/src/test/resources/txt/all-java-syntaxes/all-java-syntaxes-bytecode.txt new file mode 100644 index 00000000..eb8dcb17 --- /dev/null +++ b/Procyon.Decompiler/src/test/resources/txt/all-java-syntaxes/all-java-syntaxes-bytecode.txt @@ -0,0 +1,5846 @@ +class demo.AllJavaSyntaxes + Minor version: 0 + Major version: 69 + Flags: PUBLIC, ABSTRACT, SUPER + SourceFile: AllJavaSyntaxes.java + Signature: ;>Ljava/util/ArrayList;Ljava/io/Serializable;Ljava/lang/Comparable;Ljava/lang/Iterable; + BootstrapMethods: + 0: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + ()Ljava/lang/Object; + invokestatic demo/AllJavaSyntaxes.lambda$0:()Ljava/lang/String; + ()Ljava/lang/String; + 1: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;)V + invokevirtual java/io/PrintStream.println:(Ljava/lang/Object;)V + (Ljava/lang/Object;)V + 2: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;)Ljava/lang/Object; + invokevirtual java/lang/Object.toString:()Ljava/lang/String; + (Ljava/lang/Object;)Ljava/lang/String; + 3: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (I)Ljava/lang/Object; + invokestatic demo/AllJavaSyntaxes.lambda$3:(I)[Ljava/lang/Object; + (I)[Ljava/lang/Object; + 4: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + ()Ljava/lang/Object; + invokestatic demo/AllJavaSyntaxes.lambda$4:()Ljava/lang/String; + ()Ljava/lang/String; + 5: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;)Ljava/lang/Object; + invokevirtual java/lang/String.length:()I + (Ljava/lang/String;)Ljava/lang/Integer; + 6: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;)V + invokespecial demo/AllJavaSyntaxes.lambda$6:(Ljava/lang/Integer;)V + (Ljava/lang/Integer;)V + 7: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;Ljava/lang/Object;)I + invokestatic demo/AllJavaSyntaxes.lambda$7:(Ljava/lang/String;Ljava/lang/String;)I + (Ljava/lang/String;Ljava/lang/String;)I + 8: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;Ljava/lang/Object;)I + invokestatic demo/AllJavaSyntaxes.lambda$8:(Ljava/lang/String;Ljava/lang/String;)I + (Ljava/lang/String;Ljava/lang/String;)I + 9: invokestatic java/lang/runtime/SwitchBootstraps.typeSwitch:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + java.lang.String.class + 10: invokestatic java/lang/runtime/SwitchBootstraps.typeSwitch:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + demo.AllJavaSyntaxes.Circle.class + demo.AllJavaSyntaxes.Rectangle.class + 11: invokestatic java/lang/runtime/SwitchBootstraps.typeSwitch:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + demo.AllJavaSyntaxes.Success.class + demo.AllJavaSyntaxes.Failure.class + 12: invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + "success:\u0001" + 13: invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + "failure:\u0001" + 14: invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + "\u0001\u0001\u0001" + 15: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;)Ljava/lang/Object; + invokevirtual java/lang/Object.toString:()Ljava/lang/String; + (Ljava/lang/Integer;)Ljava/lang/String; + 16: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + ()Ljava/lang/Object; + invokestatic demo/AllJavaSyntaxes.lambda$10:()Ljava/lang/IllegalArgumentException; + ()Ljava/lang/IllegalArgumentException; + 17: invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + "\u0001\u0001\u0001\u0001\u0001\u0001" + 18: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + ()Ljava/lang/Object; + invokestatic demo/AllJavaSyntaxes.lambda$12:()Ljava/lang/Integer; + ()Ljava/lang/Integer; + 19: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + (Ljava/lang/Object;Ljava/lang/Object;)I + invokevirtual java/lang/String.compareTo:(Ljava/lang/String;)I + (Ljava/lang/String;Ljava/lang/String;)I + 20: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + ()V + invokespecial demo/AllJavaSyntaxes.lambda$14:()V + ()V + 21: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + ()Ljava/lang/Object; + newinvokespecial java/util/ArrayList.:()V + ()Ljava/util/ArrayList; + 22: invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + "\u0001:\u0001" + 23: invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + "length=\u0001" + InnerClasses: + demo/AllJavaSyntaxes$1 + Local = demo/AllJavaSyntaxes$1Local + demo/AllJavaSyntaxes$2 + abstract static interface AdvancedInterface = demo/AllJavaSyntaxes$AdvancedInterface of demo/AllJavaSyntaxes + abstract static Base = demo/AllJavaSyntaxes$Base of demo/AllJavaSyntaxes + static final Circle = demo/AllJavaSyntaxes$Circle of demo/AllJavaSyntaxes + static final enum Day = demo/AllJavaSyntaxes$Day of demo/AllJavaSyntaxes + Derived = demo/AllJavaSyntaxes$Derived of demo/AllJavaSyntaxes + static Entity = demo/AllJavaSyntaxes$Entity of demo/AllJavaSyntaxes + static final Failure = demo/AllJavaSyntaxes$Failure of demo/AllJavaSyntaxes + static GenericConstructor = demo/AllJavaSyntaxes$GenericConstructor of demo/AllJavaSyntaxes + abstract static interface Identified = demo/AllJavaSyntaxes$Identified of demo/AllJavaSyntaxes + Inner = demo/AllJavaSyntaxes$Inner of demo/AllJavaSyntaxes + abstract static interface Marker = demo/AllJavaSyntaxes$Marker of demo/AllJavaSyntaxes + abstract static interface Named = demo/AllJavaSyntaxes$Named of demo/AllJavaSyntaxes + static enum Operation = demo/AllJavaSyntaxes$Operation of demo/AllJavaSyntaxes + Outer = demo/AllJavaSyntaxes$Outer of demo/AllJavaSyntaxes + Inner = demo/AllJavaSyntaxes$Outer$Inner of demo/AllJavaSyntaxes$Outer + Deep = demo/AllJavaSyntaxes$Outer$Inner$Deep of demo/AllJavaSyntaxes$Outer$Inner + static StaticNested = demo/AllJavaSyntaxes$Outer$StaticNested of demo/AllJavaSyntaxes$Outer + static final Rec = demo/AllJavaSyntaxes$Rec of demo/AllJavaSyntaxes + static final Rectangle = demo/AllJavaSyntaxes$Rectangle of demo/AllJavaSyntaxes + abstract static Result = demo/AllJavaSyntaxes$Result of demo/AllJavaSyntaxes + abstract static interface Shape = demo/AllJavaSyntaxes$Shape of demo/AllJavaSyntaxes + static strictfp StrictClass = demo/AllJavaSyntaxes$StrictClass of demo/AllJavaSyntaxes + static final Success = demo/AllJavaSyntaxes$Success of demo/AllJavaSyntaxes + SuperInner = demo/AllJavaSyntaxes$SuperInner of demo/AllJavaSyntaxes + SuperOuter = demo/AllJavaSyntaxes$SuperOuter of demo/AllJavaSyntaxes + abstract static interface Tag = demo/AllJavaSyntaxes$Tag of demo/AllJavaSyntaxes + Tagged = demo/AllJavaSyntaxes$Tagged of demo/AllJavaSyntaxes + abstract static interface Tags = demo/AllJavaSyntaxes$Tags of demo/AllJavaSyntaxes + abstract static interface TypeUse = demo/AllJavaSyntaxes$TypeUse of demo/AllJavaSyntaxes + abstract static interface WithDefaults = demo/AllJavaSyntaxes$WithDefaults of demo/AllJavaSyntaxes + public static final Lookup = java/lang/invoke/MethodHandles$Lookup of java/lang/invoke/MethodHandles + NestMembers: 00 25 02 3A 01 CF 02 49 02 FC 02 FF 01 6C 01 22 03 04 03 07 01 91 03 0B 01 55 03 0F 03 41 03 12 01 57 03 16 03 43 03 45 02 37 02 2E 02 32 02 3F 03 1C 01 72 01 A0 01 80 03 22 01 86 03 26 03 47 03 29 03 2C 03 2F 03 32 03 35 03 38 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes + 2: Utf8StringConstant "demo/AllJavaSyntaxes" + 3: TypeInfo #4 // java/util/ArrayList + 4: Utf8StringConstant "java/util/ArrayList" + 5: TypeInfo #6 // java/io/Serializable + 6: Utf8StringConstant "java/io/Serializable" + 7: TypeInfo #8 // java/lang/Comparable + 8: Utf8StringConstant "java/lang/Comparable" + 9: TypeInfo #10 // java/lang/Iterable + 10: Utf8StringConstant "java/lang/Iterable" + 11: Utf8StringConstant "serialVersionUID" + 12: Utf8StringConstant "J" + 13: Utf8StringConstant "ConstantValue" + 14: LongConstant 1L + 16: Utf8StringConstant "CHARS" + 17: Utf8StringConstant "[C" + 18: Utf8StringConstant "COUNTER" + 19: Utf8StringConstant "Ljava/util/concurrent/atomic/AtomicInteger;" + 20: Utf8StringConstant "callable" + 21: Utf8StringConstant "Ljava/util/concurrent/Callable;" + 22: Utf8StringConstant "Signature" + 23: Utf8StringConstant "Ljava/util/concurrent/Callable;" + 24: Utf8StringConstant "$assertionsDisabled" + 25: Utf8StringConstant "Z" + 26: Utf8StringConstant "$SWITCH_TABLE$demo$AllJavaSyntaxes$Day" + 27: Utf8StringConstant "[I" + 28: Utf8StringConstant "" + 29: Utf8StringConstant "()V" + 30: Utf8StringConstant "Code" + 31: MethodReference #32.#34 // java/lang/Class.desiredAssertionStatus:()Z + 32: TypeInfo #33 // java/lang/Class + 33: Utf8StringConstant "java/lang/Class" + 34: NameAndTypeDescriptor #35.#36 // desiredAssertionStatus:()Z + 35: Utf8StringConstant "desiredAssertionStatus" + 36: Utf8StringConstant "()Z" + 37: FieldReference #1.#38 // demo/AllJavaSyntaxes.$assertionsDisabled:Z + 38: NameAndTypeDescriptor #24.#25 // $assertionsDisabled:Z + 39: FieldReference #1.#40 // demo/AllJavaSyntaxes.CHARS:[C + 40: NameAndTypeDescriptor #16.#17 // CHARS:[C + 41: TypeInfo #42 // java/util/concurrent/atomic/AtomicInteger + 42: Utf8StringConstant "java/util/concurrent/atomic/AtomicInteger" + 43: MethodReference #41.#44 // java/util/concurrent/atomic/AtomicInteger.:()V + 44: NameAndTypeDescriptor #45.#29 // :()V + 45: Utf8StringConstant "" + 46: FieldReference #1.#47 // demo/AllJavaSyntaxes.COUNTER:Ljava/util/concurrent/atomic/AtomicInteger; + 47: NameAndTypeDescriptor #18.#19 // COUNTER:Ljava/util/concurrent/atomic/AtomicInteger; + 48: MethodReference #1.#49 // demo/AllJavaSyntaxes.init:()V + 49: NameAndTypeDescriptor #50.#29 // init:()V + 50: Utf8StringConstant "init" + 51: Utf8StringConstant "LineNumberTable" + 52: Utf8StringConstant "LocalVariableTable" + 53: Utf8StringConstant "x" + 54: Utf8StringConstant "I" + 55: Utf8StringConstant "y" + 56: Utf8StringConstant "StackMapTable" + 57: MethodReference #3.#44 // java/util/ArrayList.:()V + 58: InvokeDynamicInfo 0, #60.#61 // call:()Ljava/util/concurrent/Callable; + 59: NameAndTypeDescriptor #60.#61 // call:()Ljava/util/concurrent/Callable; + 60: Utf8StringConstant "call" + 61: Utf8StringConstant "()Ljava/util/concurrent/Callable;" + 62: FieldReference #1.#63 // demo/AllJavaSyntaxes.callable:Ljava/util/concurrent/Callable; + 63: NameAndTypeDescriptor #20.#21 // callable:Ljava/util/concurrent/Callable; + 64: Utf8StringConstant "this" + 65: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 66: Utf8StringConstant "LocalVariableTypeTable" + 67: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 68: Utf8StringConstant "deprecatedMethod" + 69: Utf8StringConstant "Deprecated" + 70: Utf8StringConstant "RuntimeVisibleAnnotations" + 71: Utf8StringConstant "Ljava/lang/Deprecated;" + 72: Utf8StringConstant "forRemoval" + 73: IntegerConstant 1 + 74: Utf8StringConstant "since" + 75: Utf8StringConstant "11" + 76: MethodReference #41.#77 // java/util/concurrent/atomic/AtomicInteger.incrementAndGet:()I + 77: NameAndTypeDescriptor #78.#79 // incrementAndGet:()I + 78: Utf8StringConstant "incrementAndGet" + 79: Utf8StringConstant "()I" + 80: Utf8StringConstant "methodReferencesAndLambdas" + 81: Utf8StringConstant "([Ljava/lang/Object;)[Ljava/lang/Object;" + 82: Utf8StringConstant "([TT;)[Ljava/lang/Object;" + 83: Utf8StringConstant "Ljava/lang/SafeVarargs;" + 84: InterfaceMethodReference #85.#87 // java/util/stream/Stream.of:([Ljava/lang/Object;)Ljava/util/stream/Stream; + 85: TypeInfo #86 // java/util/stream/Stream + 86: Utf8StringConstant "java/util/stream/Stream" + 87: NameAndTypeDescriptor #88.#89 // of:([Ljava/lang/Object;)Ljava/util/stream/Stream; + 88: Utf8StringConstant "of" + 89: Utf8StringConstant "([Ljava/lang/Object;)Ljava/util/stream/Stream;" + 90: FieldReference #91.#93 // java/lang/System.out:Ljava/io/PrintStream; + 91: TypeInfo #92 // java/lang/System + 92: Utf8StringConstant "java/lang/System" + 93: NameAndTypeDescriptor #94.#95 // out:Ljava/io/PrintStream; + 94: Utf8StringConstant "out" + 95: Utf8StringConstant "Ljava/io/PrintStream;" + 96: MethodReference #97.#99 // java/lang/Object.getClass:()Ljava/lang/Class; + 97: TypeInfo #98 // java/lang/Object + 98: Utf8StringConstant "java/lang/Object" + 99: NameAndTypeDescriptor #100.#101 // getClass:()Ljava/lang/Class; + 100: Utf8StringConstant "getClass" + 101: Utf8StringConstant "()Ljava/lang/Class;" + 102: InvokeDynamicInfo 1, #104.#105 // accept:(Ljava/io/PrintStream;)Ljava/util/function/Consumer; + 103: NameAndTypeDescriptor #104.#105 // accept:(Ljava/io/PrintStream;)Ljava/util/function/Consumer; + 104: Utf8StringConstant "accept" + 105: Utf8StringConstant "(Ljava/io/PrintStream;)Ljava/util/function/Consumer;" + 106: InterfaceMethodReference #85.#107 // java/util/stream/Stream.forEach:(Ljava/util/function/Consumer;)V + 107: NameAndTypeDescriptor #108.#109 // forEach:(Ljava/util/function/Consumer;)V + 108: Utf8StringConstant "forEach" + 109: Utf8StringConstant "(Ljava/util/function/Consumer;)V" + 110: InvokeDynamicInfo 2, #112.#113 // apply:()Ljava/util/function/Function; + 111: NameAndTypeDescriptor #112.#113 // apply:()Ljava/util/function/Function; + 112: Utf8StringConstant "apply" + 113: Utf8StringConstant "()Ljava/util/function/Function;" + 114: InterfaceMethodReference #85.#115 // java/util/stream/Stream.map:(Ljava/util/function/Function;)Ljava/util/stream/Stream; + 115: NameAndTypeDescriptor #116.#117 // map:(Ljava/util/function/Function;)Ljava/util/stream/Stream; + 116: Utf8StringConstant "map" + 117: Utf8StringConstant "(Ljava/util/function/Function;)Ljava/util/stream/Stream;" + 118: InvokeDynamicInfo 3, #112.#120 // apply:()Ljava/util/function/IntFunction; + 119: NameAndTypeDescriptor #112.#120 // apply:()Ljava/util/function/IntFunction; + 120: Utf8StringConstant "()Ljava/util/function/IntFunction;" + 121: InterfaceMethodReference #85.#122 // java/util/stream/Stream.toArray:(Ljava/util/function/IntFunction;)[Ljava/lang/Object; + 122: NameAndTypeDescriptor #123.#124 // toArray:(Ljava/util/function/IntFunction;)[Ljava/lang/Object; + 123: Utf8StringConstant "toArray" + 124: Utf8StringConstant "(Ljava/util/function/IntFunction;)[Ljava/lang/Object;" + 125: Utf8StringConstant "arguments" + 126: Utf8StringConstant "[Ljava/lang/Object;" + 127: Utf8StringConstant "classicFor" + 128: Utf8StringConstant "([Ljava/lang/String;)V" + 129: MethodReference #1.#130 // demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 130: NameAndTypeDescriptor #131.#132 // log:(Ljava/lang/String;)V + 131: Utf8StringConstant "log" + 132: Utf8StringConstant "(Ljava/lang/String;)V" + 133: Utf8StringConstant "[Ljava/lang/String;" + 134: Utf8StringConstant "index" + 135: Utf8StringConstant "whileLoop" + 136: Utf8StringConstant "doWhileLoop" + 137: Utf8StringConstant "lambdaAndOptional" + 138: InvokeDynamicInfo 4, #140.#141 // get:()Ljava/util/function/Supplier; + 139: NameAndTypeDescriptor #140.#141 // get:()Ljava/util/function/Supplier; + 140: Utf8StringConstant "get" + 141: Utf8StringConstant "()Ljava/util/function/Supplier;" + 142: InvokeDynamicInfo 5, #112.#113 // apply:()Ljava/util/function/Function; + 143: InterfaceMethodReference #144.#146 // java/util/function/Supplier.get:()Ljava/lang/Object; + 144: TypeInfo #145 // java/util/function/Supplier + 145: Utf8StringConstant "java/util/function/Supplier" + 146: NameAndTypeDescriptor #140.#147 // get:()Ljava/lang/Object; + 147: Utf8StringConstant "()Ljava/lang/Object;" + 148: TypeInfo #149 // java/lang/String + 149: Utf8StringConstant "java/lang/String" + 150: MethodReference #151.#153 // java/util/Optional.ofNullable:(Ljava/lang/Object;)Ljava/util/Optional; + 151: TypeInfo #152 // java/util/Optional + 152: Utf8StringConstant "java/util/Optional" + 153: NameAndTypeDescriptor #154.#155 // ofNullable:(Ljava/lang/Object;)Ljava/util/Optional; + 154: Utf8StringConstant "ofNullable" + 155: Utf8StringConstant "(Ljava/lang/Object;)Ljava/util/Optional;" + 156: MethodReference #151.#157 // java/util/Optional.map:(Ljava/util/function/Function;)Ljava/util/Optional; + 157: NameAndTypeDescriptor #116.#158 // map:(Ljava/util/function/Function;)Ljava/util/Optional; + 158: Utf8StringConstant "(Ljava/util/function/Function;)Ljava/util/Optional;" + 159: InvokeDynamicInfo 6, #104.#161 // accept:(Ldemo/AllJavaSyntaxes;)Ljava/util/function/Consumer; + 160: NameAndTypeDescriptor #104.#161 // accept:(Ldemo/AllJavaSyntaxes;)Ljava/util/function/Consumer; + 161: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)Ljava/util/function/Consumer;" + 162: MethodReference #151.#163 // java/util/Optional.ifPresent:(Ljava/util/function/Consumer;)V + 163: NameAndTypeDescriptor #164.#109 // ifPresent:(Ljava/util/function/Consumer;)V + 164: Utf8StringConstant "ifPresent" + 165: Utf8StringConstant "supplier" + 166: Utf8StringConstant "Ljava/util/function/Supplier;" + 167: Utf8StringConstant "function" + 168: Utf8StringConstant "Ljava/util/function/Function;" + 169: Utf8StringConstant "Ljava/util/function/Supplier;" + 170: Utf8StringConstant "Ljava/util/function/Function;" + 171: Utf8StringConstant "typedLambdaParams" + 172: Utf8StringConstant "(Ljava/util/List;)V" + 173: Utf8StringConstant "(Ljava/util/List;)V" + 174: InvokeDynamicInfo 7, #176.#177 // compare:()Ljava/util/Comparator; + 175: NameAndTypeDescriptor #176.#177 // compare:()Ljava/util/Comparator; + 176: Utf8StringConstant "compare" + 177: Utf8StringConstant "()Ljava/util/Comparator;" + 178: InterfaceMethodReference #179.#181 // java/util/List.sort:(Ljava/util/Comparator;)V + 179: TypeInfo #180 // java/util/List + 180: Utf8StringConstant "java/util/List" + 181: NameAndTypeDescriptor #182.#183 // sort:(Ljava/util/Comparator;)V + 182: Utf8StringConstant "sort" + 183: Utf8StringConstant "(Ljava/util/Comparator;)V" + 184: Utf8StringConstant "list" + 185: Utf8StringConstant "Ljava/util/List;" + 186: Utf8StringConstant "Ljava/util/List;" + 187: Utf8StringConstant "unTypedLambdaParams" + 188: InvokeDynamicInfo 8, #176.#177 // compare:()Ljava/util/Comparator; + 189: Utf8StringConstant "synchronizedMethod" + 190: StringConstant #191 // "synchronized" + 191: Utf8StringConstant "synchronized" + 192: Utf8StringConstant "tryCatchFinally" + 193: MethodReference #41.#194 // java/util/concurrent/atomic/AtomicInteger.get:()I + 194: NameAndTypeDescriptor #140.#79 // get:()I + 195: TypeInfo #196 // java/lang/IllegalStateException + 196: Utf8StringConstant "java/lang/IllegalStateException" + 197: MethodReference #195.#44 // java/lang/IllegalStateException.:()V + 198: MethodReference #32.#199 // java/lang/Class.getSimpleName:()Ljava/lang/String; + 199: NameAndTypeDescriptor #200.#201 // getSimpleName:()Ljava/lang/String; + 200: Utf8StringConstant "getSimpleName" + 201: Utf8StringConstant "()Ljava/lang/String;" + 202: StringConstant #203 // "finally" + 203: Utf8StringConstant "finally" + 204: TypeInfo #205 // java/lang/RuntimeException + 205: Utf8StringConstant "java/lang/RuntimeException" + 206: Utf8StringConstant "exception" + 207: Utf8StringConstant "Ljava/lang/RuntimeException;" + 208: TypeInfo #209 // java/lang/Throwable + 209: Utf8StringConstant "java/lang/Throwable" + 210: Utf8StringConstant "tryWithResources" + 211: Utf8StringConstant "(Ljava/nio/file/Path;)V" + 212: MethodReference #213.#215 // java/nio/file/Files.newBufferedReader:(Ljava/nio/file/Path;)Ljava/io/BufferedReader; + 213: TypeInfo #214 // java/nio/file/Files + 214: Utf8StringConstant "java/nio/file/Files" + 215: NameAndTypeDescriptor #216.#217 // newBufferedReader:(Ljava/nio/file/Path;)Ljava/io/BufferedReader; + 216: Utf8StringConstant "newBufferedReader" + 217: Utf8StringConstant "(Ljava/nio/file/Path;)Ljava/io/BufferedReader;" + 218: MethodReference #219.#221 // java/io/BufferedReader.readLine:()Ljava/lang/String; + 219: TypeInfo #220 // java/io/BufferedReader + 220: Utf8StringConstant "java/io/BufferedReader" + 221: NameAndTypeDescriptor #222.#201 // readLine:()Ljava/lang/String; + 222: Utf8StringConstant "readLine" + 223: MethodReference #219.#224 // java/io/BufferedReader.close:()V + 224: NameAndTypeDescriptor #225.#29 // close:()V + 225: Utf8StringConstant "close" + 226: MethodReference #208.#227 // java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V + 227: NameAndTypeDescriptor #228.#229 // addSuppressed:(Ljava/lang/Throwable;)V + 228: Utf8StringConstant "addSuppressed" + 229: Utf8StringConstant "(Ljava/lang/Throwable;)V" + 230: MethodReference #231.#233 // java/io/IOException.getMessage:()Ljava/lang/String; + 231: TypeInfo #232 // java/io/IOException + 232: Utf8StringConstant "java/io/IOException" + 233: NameAndTypeDescriptor #234.#201 // getMessage:()Ljava/lang/String; + 234: Utf8StringConstant "getMessage" + 235: Utf8StringConstant "path" + 236: Utf8StringConstant "Ljava/nio/file/Path;" + 237: Utf8StringConstant "line" + 238: Utf8StringConstant "Ljava/lang/String;" + 239: Utf8StringConstant "br" + 240: Utf8StringConstant "Ljava/io/BufferedReader;" + 241: Utf8StringConstant "Ljava/io/IOException;" + 242: TypeInfo #243 // java/nio/file/Path + 243: Utf8StringConstant "java/nio/file/Path" + 244: Utf8StringConstant "assertions" + 245: Utf8StringConstant "(I)V" + 246: TypeInfo #247 // java/lang/AssertionError + 247: Utf8StringConstant "java/lang/AssertionError" + 248: StringConstant #249 // "negative" + 249: Utf8StringConstant "negative" + 250: MethodReference #246.#251 // java/lang/AssertionError.:(Ljava/lang/Object;)V + 251: NameAndTypeDescriptor #45.#252 // :(Ljava/lang/Object;)V + 252: Utf8StringConstant "(Ljava/lang/Object;)V" + 253: Utf8StringConstant "value" + 254: Utf8StringConstant "boxingAndNumbers" + 255: MethodReference #256.#258 // java/lang/Integer.valueOf:(I)Ljava/lang/Integer; + 256: TypeInfo #257 // java/lang/Integer + 257: Utf8StringConstant "java/lang/Integer" + 258: NameAndTypeDescriptor #259.#260 // valueOf:(I)Ljava/lang/Integer; + 259: Utf8StringConstant "valueOf" + 260: Utf8StringConstant "(I)Ljava/lang/Integer;" + 261: MethodReference #256.#262 // java/lang/Integer.intValue:()I + 262: NameAndTypeDescriptor #263.#79 // intValue:()I + 263: Utf8StringConstant "intValue" + 264: MethodReference #265.#267 // java/math/BigDecimal.valueOf:(J)Ljava/math/BigDecimal; + 265: TypeInfo #266 // java/math/BigDecimal + 266: Utf8StringConstant "java/math/BigDecimal" + 267: NameAndTypeDescriptor #259.#268 // valueOf:(J)Ljava/math/BigDecimal; + 268: Utf8StringConstant "(J)Ljava/math/BigDecimal;" + 269: MethodReference #265.#270 // java/math/BigDecimal.toPlainString:()Ljava/lang/String; + 270: NameAndTypeDescriptor #271.#201 // toPlainString:()Ljava/lang/String; + 271: Utf8StringConstant "toPlainString" + 272: Utf8StringConstant "boxed" + 273: Utf8StringConstant "Ljava/lang/Integer;" + 274: Utf8StringConstant "primitive" + 275: Utf8StringConstant "decimal" + 276: Utf8StringConstant "Ljava/math/BigDecimal;" + 277: Utf8StringConstant "instanceofPattern" + 278: MethodReference #148.#279 // java/lang/String.isEmpty:()Z + 279: NameAndTypeDescriptor #280.#36 // isEmpty:()Z + 280: Utf8StringConstant "isEmpty" + 281: Utf8StringConstant "object" + 282: Utf8StringConstant "Ljava/lang/Object;" + 283: Utf8StringConstant "text" + 284: Utf8StringConstant "enumSwitch" + 285: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Day;)V" + 286: MethodReference #1.#287 // demo/AllJavaSyntaxes.$SWITCH_TABLE$demo$AllJavaSyntaxes$Day:()[I + 287: NameAndTypeDescriptor #26.#288 // $SWITCH_TABLE$demo$AllJavaSyntaxes$Day:()[I + 288: Utf8StringConstant "()[I" + 289: MethodReference #290.#292 // demo/AllJavaSyntaxes$Day.ordinal:()I + 290: TypeInfo #291 // demo/AllJavaSyntaxes$Day + 291: Utf8StringConstant "demo/AllJavaSyntaxes$Day" + 292: NameAndTypeDescriptor #293.#79 // ordinal:()I + 293: Utf8StringConstant "ordinal" + 294: StringConstant #295 // "weekday" + 295: Utf8StringConstant "weekday" + 296: StringConstant #297 // "other" + 297: Utf8StringConstant "other" + 298: Utf8StringConstant "day" + 299: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Day;" + 300: Utf8StringConstant "expressionSwitch" + 301: Utf8StringConstant "(I)Ljava/lang/String;" + 302: StringConstant #303 // "zero" + 303: Utf8StringConstant "zero" + 304: StringConstant #305 // "one" + 305: Utf8StringConstant "one" + 306: TypeInfo #307 // java/lang/IllegalArgumentException + 307: Utf8StringConstant "java/lang/IllegalArgumentException" + 308: MethodReference #306.#44 // java/lang/IllegalArgumentException.:()V + 309: Utf8StringConstant "compareTo" + 310: Utf8StringConstant "(Ljava/lang/Comparable;)I" + 311: Utf8StringConstant "(TE;)I" + 312: InterfaceMethodReference #313.#315 // java/util/Comparator.naturalOrder:()Ljava/util/Comparator; + 313: TypeInfo #314 // java/util/Comparator + 314: Utf8StringConstant "java/util/Comparator" + 315: NameAndTypeDescriptor #316.#177 // naturalOrder:()Ljava/util/Comparator; + 316: Utf8StringConstant "naturalOrder" + 317: InterfaceMethodReference #313.#318 // java/util/Comparator.compare:(Ljava/lang/Object;Ljava/lang/Object;)I + 318: NameAndTypeDescriptor #176.#319 // compare:(Ljava/lang/Object;Ljava/lang/Object;)I + 319: Utf8StringConstant "(Ljava/lang/Object;Ljava/lang/Object;)I" + 320: Utf8StringConstant "Ljava/lang/Comparable;" + 321: Utf8StringConstant "TE;" + 322: Utf8StringConstant "hashCode" + 323: MethodReference #3.#324 // java/util/ArrayList.hashCode:()I + 324: NameAndTypeDescriptor #322.#79 // hashCode:()I + 325: MethodReference #326.#328 // java/util/Objects.hash:([Ljava/lang/Object;)I + 326: TypeInfo #327 // java/util/Objects + 327: Utf8StringConstant "java/util/Objects" + 328: NameAndTypeDescriptor #329.#330 // hash:([Ljava/lang/Object;)I + 329: Utf8StringConstant "hash" + 330: Utf8StringConstant "([Ljava/lang/Object;)I" + 331: Utf8StringConstant "equals" + 332: Utf8StringConstant "(Ljava/lang/Object;)Z" + 333: MethodReference #3.#334 // java/util/ArrayList.equals:(Ljava/lang/Object;)Z + 334: NameAndTypeDescriptor #331.#332 // equals:(Ljava/lang/Object;)Z + 335: Utf8StringConstant "intersectionBound" + 336: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Named;)Ldemo/AllJavaSyntaxes$Named;" + 337: Utf8StringConstant ";>(TT;)TT;" + 338: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Named;" + 339: Utf8StringConstant "TT;" + 340: Utf8StringConstant "intersectionCast" + 341: TypeInfo #342 // demo/AllJavaSyntaxes$Identified + 342: Utf8StringConstant "demo/AllJavaSyntaxes$Identified" + 343: TypeInfo #344 // demo/AllJavaSyntaxes$Named + 344: Utf8StringConstant "demo/AllJavaSyntaxes$Named" + 345: InterfaceMethodReference #343.#346 // demo/AllJavaSyntaxes$Named.name:()Ljava/lang/String; + 346: NameAndTypeDescriptor #347.#201 // name:()Ljava/lang/String; + 347: Utf8StringConstant "name" + 348: Utf8StringConstant "guardedPattern" + 349: MethodReference #326.#350 // java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object; + 350: NameAndTypeDescriptor #351.#352 // requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object; + 351: Utf8StringConstant "requireNonNull" + 352: Utf8StringConstant "(Ljava/lang/Object;)Ljava/lang/Object;" + 353: InvokeDynamicInfo 9, #355.#356 // typeSwitch:(Ljava/lang/Object;I)I + 354: NameAndTypeDescriptor #355.#356 // typeSwitch:(Ljava/lang/Object;I)I + 355: Utf8StringConstant "typeSwitch" + 356: Utf8StringConstant "(Ljava/lang/Object;I)I" + 357: MethodReference #148.#358 // java/lang/String.length:()I + 358: NameAndTypeDescriptor #359.#79 // length:()I + 359: Utf8StringConstant "length" + 360: Utf8StringConstant "s" + 361: Utf8StringConstant "sealedSwitch" + 362: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Shape;)D" + 363: InvokeDynamicInfo 10, #355.#356 // typeSwitch:(Ljava/lang/Object;I)I + 364: TypeInfo #365 // demo/AllJavaSyntaxes$Circle + 365: Utf8StringConstant "demo/AllJavaSyntaxes$Circle" + 366: MethodReference #364.#367 // demo/AllJavaSyntaxes$Circle.area:()D + 367: NameAndTypeDescriptor #368.#369 // area:()D + 368: Utf8StringConstant "area" + 369: Utf8StringConstant "()D" + 370: TypeInfo #371 // demo/AllJavaSyntaxes$Rectangle + 371: Utf8StringConstant "demo/AllJavaSyntaxes$Rectangle" + 372: MethodReference #370.#367 // demo/AllJavaSyntaxes$Rectangle.area:()D + 373: TypeInfo #374 // java/lang/MatchException + 374: Utf8StringConstant "java/lang/MatchException" + 375: MethodReference #373.#376 // java/lang/MatchException.:(Ljava/lang/String;Ljava/lang/Throwable;)V + 376: NameAndTypeDescriptor #45.#377 // :(Ljava/lang/String;Ljava/lang/Throwable;)V + 377: Utf8StringConstant "(Ljava/lang/String;Ljava/lang/Throwable;)V" + 378: Utf8StringConstant "shape" + 379: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Shape;" + 380: Utf8StringConstant "circle" + 381: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Circle;" + 382: Utf8StringConstant "rectangle" + 383: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Rectangle;" + 384: TypeInfo #385 // demo/AllJavaSyntaxes$Shape + 385: Utf8StringConstant "demo/AllJavaSyntaxes$Shape" + 386: Utf8StringConstant "handleResult" + 387: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Result;)Ljava/lang/String;" + 388: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Result;)Ljava/lang/String;" + 389: InvokeDynamicInfo 11, #355.#356 // typeSwitch:(Ljava/lang/Object;I)I + 390: TypeInfo #391 // demo/AllJavaSyntaxes$Success + 391: Utf8StringConstant "demo/AllJavaSyntaxes$Success" + 392: MethodReference #390.#393 // demo/AllJavaSyntaxes$Success.value:()Ljava/lang/Object; + 393: NameAndTypeDescriptor #253.#147 // value:()Ljava/lang/Object; + 394: MethodReference #148.#395 // java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String; + 395: NameAndTypeDescriptor #259.#396 // valueOf:(Ljava/lang/Object;)Ljava/lang/String; + 396: Utf8StringConstant "(Ljava/lang/Object;)Ljava/lang/String;" + 397: InvokeDynamicInfo 12, #399.#400 // makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; + 398: NameAndTypeDescriptor #399.#400 // makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; + 399: Utf8StringConstant "makeConcatWithConstants" + 400: Utf8StringConstant "(Ljava/lang/String;)Ljava/lang/String;" + 401: TypeInfo #402 // demo/AllJavaSyntaxes$Failure + 402: Utf8StringConstant "demo/AllJavaSyntaxes$Failure" + 403: MethodReference #401.#404 // demo/AllJavaSyntaxes$Failure.exception:()Ljava/lang/Exception; + 404: NameAndTypeDescriptor #206.#405 // exception:()Ljava/lang/Exception; + 405: Utf8StringConstant "()Ljava/lang/Exception;" + 406: InvokeDynamicInfo 13, #399.#400 // makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; + 407: Utf8StringConstant "result" + 408: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Result;" + 409: Utf8StringConstant "success" + 410: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Success;" + 411: Utf8StringConstant "failure" + 412: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Failure;" + 413: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Result;" + 414: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Success;" + 415: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Failure;" + 416: TypeInfo #417 // demo/AllJavaSyntaxes$Result + 417: Utf8StringConstant "demo/AllJavaSyntaxes$Result" + 418: Utf8StringConstant "genericMethod" + 419: Utf8StringConstant "(TT;)TT;" + 420: Utf8StringConstant "labeledLoops" + 421: Utf8StringConstant "i" + 422: Utf8StringConstant "j" + 423: Utf8StringConstant "labeledBlock" + 424: StringConstant #425 // "unreachable" + 425: Utf8StringConstant "unreachable" + 426: Utf8StringConstant "localVar" + 427: StringConstant #283 // "text" + 428: MethodReference #3.#429 // java/util/ArrayList.size:()I + 429: NameAndTypeDescriptor #430.#79 // size:()I + 430: Utf8StringConstant "size" + 431: InvokeDynamicInfo 14, #399.#433 // makeConcatWithConstants:(Ljava/lang/String;II)Ljava/lang/String; + 432: NameAndTypeDescriptor #399.#433 // makeConcatWithConstants:(Ljava/lang/String;II)Ljava/lang/String; + 433: Utf8StringConstant "(Ljava/lang/String;II)Ljava/lang/String;" + 434: Utf8StringConstant "number" + 435: Utf8StringConstant "Ljava/util/ArrayList;" + 436: Utf8StringConstant "Ljava/util/ArrayList;" + 437: Utf8StringConstant "multiCatch" + 438: Utf8StringConstant "Exceptions" + 439: TypeInfo #440 // java/lang/Exception + 440: Utf8StringConstant "java/lang/Exception" + 441: MethodReference #231.#44 // java/io/IOException.:()V + 442: Utf8StringConstant "Ljava/lang/Exception;" + 443: Utf8StringConstant "suppressed" + 444: StringConstant #445 // "primary" + 445: Utf8StringConstant "primary" + 446: MethodReference #439.#447 // java/lang/Exception.:(Ljava/lang/String;)V + 447: NameAndTypeDescriptor #45.#132 // :(Ljava/lang/String;)V + 448: StringConstant #449 // "secondary" + 449: Utf8StringConstant "secondary" + 450: MethodReference #439.#227 // java/lang/Exception.addSuppressed:(Ljava/lang/Throwable;)V + 451: Utf8StringConstant "throwExpression" + 452: Utf8StringConstant "(Ljava/lang/Integer;)Ljava/lang/String;" + 453: InvokeDynamicInfo 15, #112.#113 // apply:()Ljava/util/function/Function; + 454: InvokeDynamicInfo 16, #140.#141 // get:()Ljava/util/function/Supplier; + 455: MethodReference #151.#456 // java/util/Optional.orElseThrow:(Ljava/util/function/Supplier;)Ljava/lang/Object; + 456: NameAndTypeDescriptor #457.#458 // orElseThrow:(Ljava/util/function/Supplier;)Ljava/lang/Object; + 457: Utf8StringConstant "orElseThrow" + 458: Utf8StringConstant "(Ljava/util/function/Supplier;)Ljava/lang/Object;" + 459: Utf8StringConstant "synchronizedBlock" + 460: StringConstant #461 // "sync" + 461: Utf8StringConstant "sync" + 462: Utf8StringConstant "localClass" + 463: TypeInfo #464 // demo/AllJavaSyntaxes$1Local + 464: Utf8StringConstant "demo/AllJavaSyntaxes$1Local" + 465: MethodReference #463.#466 // demo/AllJavaSyntaxes$1Local.:(Ldemo/AllJavaSyntaxes;)V + 466: NameAndTypeDescriptor #45.#467 // :(Ldemo/AllJavaSyntaxes;)V + 467: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 468: MethodReference #463.#469 // demo/AllJavaSyntaxes$1Local.value:()Ljava/lang/String; + 469: NameAndTypeDescriptor #253.#201 // value:()Ljava/lang/String; + 470: Utf8StringConstant "intersectionThrows" + 471: Utf8StringConstant "()V^TT;" + 472: Utf8StringConstant "wildcard" + 473: Utf8StringConstant "(Ljava/util/List<*>;)V" + 474: MethodReference #1.#475 // demo/AllJavaSyntaxes.capture:(Ljava/util/List;)V + 475: NameAndTypeDescriptor #476.#172 // capture:(Ljava/util/List;)V + 476: Utf8StringConstant "capture" + 477: Utf8StringConstant "Ljava/util/List<*>;" + 478: Utf8StringConstant "(Ljava/util/List;)V" + 479: InterfaceMethodReference #179.#480 // java/util/List.iterator:()Ljava/util/Iterator; + 480: NameAndTypeDescriptor #481.#482 // iterator:()Ljava/util/Iterator; + 481: Utf8StringConstant "iterator" + 482: Utf8StringConstant "()Ljava/util/Iterator;" + 483: InterfaceMethodReference #484.#486 // java/util/Iterator.next:()Ljava/lang/Object; + 484: TypeInfo #485 // java/util/Iterator + 485: Utf8StringConstant "java/util/Iterator" + 486: NameAndTypeDescriptor #487.#147 // next:()Ljava/lang/Object; + 487: Utf8StringConstant "next" + 488: InterfaceMethodReference #484.#489 // java/util/Iterator.hasNext:()Z + 489: NameAndTypeDescriptor #490.#36 // hasNext:()Z + 490: Utf8StringConstant "hasNext" + 491: Utf8StringConstant "element" + 492: Utf8StringConstant "Ljava/util/List;" + 493: Utf8StringConstant "typeUse" + 494: StringConstant #53 // "x" + 495: InterfaceMethodReference #179.#496 // java/util/List.of:(Ljava/lang/Object;)Ljava/util/List; + 496: NameAndTypeDescriptor #88.#497 // of:(Ljava/lang/Object;)Ljava/util/List; + 497: Utf8StringConstant "(Ljava/lang/Object;)Ljava/util/List;" + 498: InterfaceMethodReference #179.#499 // java/util/List.get:(I)Ljava/lang/Object; + 499: NameAndTypeDescriptor #140.#500 // get:(I)Ljava/lang/Object; + 500: Utf8StringConstant "(I)Ljava/lang/Object;" + 501: Utf8StringConstant "RuntimeInvisibleTypeAnnotations" + 502: Utf8StringConstant "Ldemo/AllJavaSyntaxes$TypeUse;" + 503: Utf8StringConstant "arrays" + 504: TypeInfo #133 // [Ljava/lang/String; + 505: StringConstant #506 // "a" + 506: Utf8StringConstant "a" + 507: StringConstant #508 // "b" + 508: Utf8StringConstant "b" + 509: TypeInfo #27 // [I + 510: Utf8StringConstant "literals" + 511: LongConstant 1000000L + 513: DoubleConstant 1000.0 + 515: InvokeDynamicInfo 17, #399.#517 // makeConcatWithConstants:(IIJFDC)Ljava/lang/String; + 516: NameAndTypeDescriptor #399.#517 // makeConcatWithConstants:(IIJFDC)Ljava/lang/String; + 517: Utf8StringConstant "(IIJFDC)Ljava/lang/String;" + 518: Utf8StringConstant "bin" + 519: Utf8StringConstant "hex" + 520: Utf8StringConstant "underscore" + 521: Utf8StringConstant "f" + 522: Utf8StringConstant "F" + 523: Utf8StringConstant "d" + 524: Utf8StringConstant "D" + 525: Utf8StringConstant "ch" + 526: Utf8StringConstant "C" + 527: Utf8StringConstant "textBlock" + 528: StringConstant #529 // "line1\nline2\n" + 529: Utf8StringConstant "line1\nline2\n" + 530: Utf8StringConstant "switchYield" + 531: Utf8StringConstant "(I)I" + 532: Utf8StringConstant "allOperators" + 533: MethodReference #97.#44 // java/lang/Object.:()V + 534: MethodReference #148.#535 // java/lang/String.valueOf:(I)Ljava/lang/String; + 535: NameAndTypeDescriptor #259.#301 // valueOf:(I)Ljava/lang/String; + 536: InvokeDynamicInfo 18, #140.#141 // get:()Ljava/util/function/Supplier; + 537: StringConstant #64 // "this" + 538: InvokeDynamicInfo 19, #176.#177 // compare:()Ljava/util/Comparator; + 539: TypeInfo #540 // [[I + 540: Utf8StringConstant "[[I" + 541: InvokeDynamicInfo 20, #543.#544 // run:(Ldemo/AllJavaSyntaxes;)Ljava/lang/Runnable; + 542: NameAndTypeDescriptor #543.#544 // run:(Ldemo/AllJavaSyntaxes;)Ljava/lang/Runnable; + 543: Utf8StringConstant "run" + 544: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)Ljava/lang/Runnable;" + 545: InvokeDynamicInfo 21, #140.#141 // get:()Ljava/util/function/Supplier; + 546: MethodReference #246.#44 // java/lang/AssertionError.:()V + 547: MethodReference #204.#44 // java/lang/RuntimeException.:()V + 548: InvokeDynamicInfo 22, #399.#550 // makeConcatWithConstants:(II)Ljava/lang/String; + 549: NameAndTypeDescriptor #399.#550 // makeConcatWithConstants:(II)Ljava/lang/String; + 550: Utf8StringConstant "(II)Ljava/lang/String;" + 551: Utf8StringConstant "widened" + 552: Utf8StringConstant "array" + 553: Utf8StringConstant "matrix" + 554: Utf8StringConstant "yielded" + 555: Utf8StringConstant "qualifiedNew" + 556: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer;)V" + 557: Utf8StringConstant "(Ldemo/AllJavaSyntaxes.Outer;)V" + 558: TypeInfo #559 // demo/AllJavaSyntaxes$Outer$Inner + 559: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner" + 560: MethodReference #558.#561 // demo/AllJavaSyntaxes$Outer$Inner.:(Ldemo/AllJavaSyntaxes$Outer;)V + 561: NameAndTypeDescriptor #45.#556 // :(Ldemo/AllJavaSyntaxes$Outer;)V + 562: TypeInfo #563 // demo/AllJavaSyntaxes$Outer$Inner$Deep + 563: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner$Deep" + 564: MethodReference #562.#565 // demo/AllJavaSyntaxes$Outer$Inner$Deep.:(Ldemo/AllJavaSyntaxes$Outer$Inner;)V + 565: NameAndTypeDescriptor #45.#566 // :(Ldemo/AllJavaSyntaxes$Outer$Inner;)V + 566: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer$Inner;)V" + 567: TypeInfo #568 // demo/AllJavaSyntaxes$Outer + 568: Utf8StringConstant "demo/AllJavaSyntaxes$Outer" + 569: MethodReference #567.#466 // demo/AllJavaSyntaxes$Outer.:(Ldemo/AllJavaSyntaxes;)V + 570: TypeInfo #571 // demo/AllJavaSyntaxes$1 + 571: Utf8StringConstant "demo/AllJavaSyntaxes$1" + 572: MethodReference #570.#573 // demo/AllJavaSyntaxes$1.:(Ldemo/AllJavaSyntaxes;Ldemo/AllJavaSyntaxes$Outer;)V + 573: NameAndTypeDescriptor #45.#574 // :(Ldemo/AllJavaSyntaxes;Ldemo/AllJavaSyntaxes$Outer;)V + 574: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;Ldemo/AllJavaSyntaxes$Outer;)V" + 575: TypeInfo #576 // demo/AllJavaSyntaxes$Outer$StaticNested + 576: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$StaticNested" + 577: MethodReference #575.#44 // demo/AllJavaSyntaxes$Outer$StaticNested.:()V + 578: Utf8StringConstant "outer" + 579: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Outer;" + 580: Utf8StringConstant "Ldemo/AllJavaSyntaxes.Outer;" + 581: Utf8StringConstant "receiverParameter" + 582: StringConstant #583 // "receiver" + 583: Utf8StringConstant "receiver" + 584: Utf8StringConstant "diamondAnonymous" + 585: TypeInfo #586 // demo/AllJavaSyntaxes$2 + 586: Utf8StringConstant "demo/AllJavaSyntaxes$2" + 587: MethodReference #585.#466 // demo/AllJavaSyntaxes$2.:(Ldemo/AllJavaSyntaxes;)V + 588: Utf8StringConstant "c" + 589: Utf8StringConstant "Ljava/util/Comparator;" + 590: Utf8StringConstant "Ljava/util/Comparator;" + 591: Utf8StringConstant "emptyStatement" + 592: Utf8StringConstant "(Z)V" + 593: Utf8StringConstant "flag" + 594: Utf8StringConstant "multiDimVarargs" + 595: Utf8StringConstant "([[I)V" + 596: Utf8StringConstant "values" + 597: Utf8StringConstant "strict" + 598: Utf8StringConstant "(DD)D" + 599: Utf8StringConstant "chainedAssignment" + 600: Utf8StringConstant "parameterAnnotation" + 601: Utf8StringConstant "RuntimeVisibleParameterAnnotations" + 602: Utf8StringConstant "(Ljava/lang/Object;)I" + 603: MethodReference #1.#604 // demo/AllJavaSyntaxes.compareTo:(Ljava/lang/Comparable;)I + 604: NameAndTypeDescriptor #309.#310 // compareTo:(Ljava/lang/Comparable;)I + 605: FieldReference #1.#606 // demo/AllJavaSyntaxes.$SWITCH_TABLE$demo$AllJavaSyntaxes$Day:[I + 606: NameAndTypeDescriptor #26.#27 // $SWITCH_TABLE$demo$AllJavaSyntaxes$Day:[I + 607: MethodReference #290.#608 // demo/AllJavaSyntaxes$Day.values:()[Ldemo/AllJavaSyntaxes$Day; + 608: NameAndTypeDescriptor #596.#609 // values:()[Ldemo/AllJavaSyntaxes$Day; + 609: Utf8StringConstant "()[Ldemo/AllJavaSyntaxes$Day;" + 610: FieldReference #290.#611 // demo/AllJavaSyntaxes$Day.FRIDAY:Ldemo/AllJavaSyntaxes$Day; + 611: NameAndTypeDescriptor #612.#299 // FRIDAY:Ldemo/AllJavaSyntaxes$Day; + 612: Utf8StringConstant "FRIDAY" + 613: FieldReference #290.#614 // demo/AllJavaSyntaxes$Day.MONDAY:Ldemo/AllJavaSyntaxes$Day; + 614: NameAndTypeDescriptor #615.#299 // MONDAY:Ldemo/AllJavaSyntaxes$Day; + 615: Utf8StringConstant "MONDAY" + 616: FieldReference #290.#617 // demo/AllJavaSyntaxes$Day.SATURDAY:Ldemo/AllJavaSyntaxes$Day; + 617: NameAndTypeDescriptor #618.#299 // SATURDAY:Ldemo/AllJavaSyntaxes$Day; + 618: Utf8StringConstant "SATURDAY" + 619: FieldReference #290.#620 // demo/AllJavaSyntaxes$Day.SUNDAY:Ldemo/AllJavaSyntaxes$Day; + 620: NameAndTypeDescriptor #621.#299 // SUNDAY:Ldemo/AllJavaSyntaxes$Day; + 621: Utf8StringConstant "SUNDAY" + 622: FieldReference #290.#623 // demo/AllJavaSyntaxes$Day.THURSDAY:Ldemo/AllJavaSyntaxes$Day; + 623: NameAndTypeDescriptor #624.#299 // THURSDAY:Ldemo/AllJavaSyntaxes$Day; + 624: Utf8StringConstant "THURSDAY" + 625: FieldReference #290.#626 // demo/AllJavaSyntaxes$Day.TUESDAY:Ldemo/AllJavaSyntaxes$Day; + 626: NameAndTypeDescriptor #627.#299 // TUESDAY:Ldemo/AllJavaSyntaxes$Day; + 627: Utf8StringConstant "TUESDAY" + 628: FieldReference #290.#629 // demo/AllJavaSyntaxes$Day.WEDNESDAY:Ldemo/AllJavaSyntaxes$Day; + 629: NameAndTypeDescriptor #630.#299 // WEDNESDAY:Ldemo/AllJavaSyntaxes$Day; + 630: Utf8StringConstant "WEDNESDAY" + 631: TypeInfo #632 // java/lang/NoSuchFieldError + 632: Utf8StringConstant "java/lang/NoSuchFieldError" + 633: Utf8StringConstant "lambda$0" + 634: StringConstant #20 // "callable" + 635: Utf8StringConstant "lambda$3" + 636: Utf8StringConstant "(I)[Ljava/lang/Object;" + 637: Utf8StringConstant "lambda$4" + 638: StringConstant #253 // "value" + 639: Utf8StringConstant "lambda$6" + 640: Utf8StringConstant "(Ljava/lang/Integer;)V" + 641: InvokeDynamicInfo 23, #399.#400 // makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; + 642: Utf8StringConstant "lambda$7" + 643: Utf8StringConstant "(Ljava/lang/String;Ljava/lang/String;)I" + 644: MethodReference #148.#645 // java/lang/String.compareTo:(Ljava/lang/String;)I + 645: NameAndTypeDescriptor #309.#646 // compareTo:(Ljava/lang/String;)I + 646: Utf8StringConstant "(Ljava/lang/String;)I" + 647: Utf8StringConstant "lambda$8" + 648: Utf8StringConstant "lambda$10" + 649: Utf8StringConstant "()Ljava/lang/IllegalArgumentException;" + 650: Utf8StringConstant "lambda$12" + 651: Utf8StringConstant "()Ljava/lang/Integer;" + 652: Utf8StringConstant "lambda$14" + 653: StringConstant #543 // "run" + 654: Utf8StringConstant "SourceFile" + 655: Utf8StringConstant "AllJavaSyntaxes.java" + 656: Utf8StringConstant ";>Ljava/util/ArrayList;Ljava/io/Serializable;Ljava/lang/Comparable;Ljava/lang/Iterable;" + 657: Utf8StringConstant "BootstrapMethods" + 658: MethodReference #659.#661 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + 659: TypeInfo #660 // java/lang/invoke/LambdaMetafactory + 660: Utf8StringConstant "java/lang/invoke/LambdaMetafactory" + 661: NameAndTypeDescriptor #662.#663 // metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + 662: Utf8StringConstant "metafactory" + 663: Utf8StringConstant "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;" + 664: MethodHandle InvokeStatic #659.#661 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + 665: MethodType ()Ljava/lang/Object; + 666: MethodReference #1.#667 // demo/AllJavaSyntaxes.lambda$0:()Ljava/lang/String; + 667: NameAndTypeDescriptor #633.#201 // lambda$0:()Ljava/lang/String; + 668: MethodHandle InvokeStatic #1.#667 // demo/AllJavaSyntaxes.lambda$0:()Ljava/lang/String; + 669: MethodType ()Ljava/lang/String; + 670: MethodType (Ljava/lang/Object;)V + 671: MethodReference #672.#674 // java/io/PrintStream.println:(Ljava/lang/Object;)V + 672: TypeInfo #673 // java/io/PrintStream + 673: Utf8StringConstant "java/io/PrintStream" + 674: NameAndTypeDescriptor #675.#252 // println:(Ljava/lang/Object;)V + 675: Utf8StringConstant "println" + 676: MethodHandle InvokeVirtual #672.#674 // java/io/PrintStream.println:(Ljava/lang/Object;)V + 677: MethodType (Ljava/lang/Object;)V + 678: MethodType (Ljava/lang/Object;)Ljava/lang/Object; + 679: MethodReference #97.#680 // java/lang/Object.toString:()Ljava/lang/String; + 680: NameAndTypeDescriptor #681.#201 // toString:()Ljava/lang/String; + 681: Utf8StringConstant "toString" + 682: MethodHandle InvokeVirtual #97.#680 // java/lang/Object.toString:()Ljava/lang/String; + 683: MethodType (Ljava/lang/Object;)Ljava/lang/String; + 684: MethodType (I)Ljava/lang/Object; + 685: MethodReference #1.#686 // demo/AllJavaSyntaxes.lambda$3:(I)[Ljava/lang/Object; + 686: NameAndTypeDescriptor #635.#636 // lambda$3:(I)[Ljava/lang/Object; + 687: MethodHandle InvokeStatic #1.#686 // demo/AllJavaSyntaxes.lambda$3:(I)[Ljava/lang/Object; + 688: MethodType (I)[Ljava/lang/Object; + 689: MethodType ()Ljava/lang/Object; + 690: MethodReference #1.#691 // demo/AllJavaSyntaxes.lambda$4:()Ljava/lang/String; + 691: NameAndTypeDescriptor #637.#201 // lambda$4:()Ljava/lang/String; + 692: MethodHandle InvokeStatic #1.#691 // demo/AllJavaSyntaxes.lambda$4:()Ljava/lang/String; + 693: MethodType ()Ljava/lang/String; + 694: MethodType (Ljava/lang/Object;)Ljava/lang/Object; + 695: MethodHandle InvokeVirtual #148.#358 // java/lang/String.length:()I + 696: Utf8StringConstant "(Ljava/lang/String;)Ljava/lang/Integer;" + 697: MethodType (Ljava/lang/String;)Ljava/lang/Integer; + 698: MethodType (Ljava/lang/Object;)V + 699: MethodReference #1.#700 // demo/AllJavaSyntaxes.lambda$6:(Ljava/lang/Integer;)V + 700: NameAndTypeDescriptor #639.#640 // lambda$6:(Ljava/lang/Integer;)V + 701: MethodHandle InvokeSpecial #1.#700 // demo/AllJavaSyntaxes.lambda$6:(Ljava/lang/Integer;)V + 702: MethodType (Ljava/lang/Integer;)V + 703: MethodType (Ljava/lang/Object;Ljava/lang/Object;)I + 704: MethodReference #1.#705 // demo/AllJavaSyntaxes.lambda$7:(Ljava/lang/String;Ljava/lang/String;)I + 705: NameAndTypeDescriptor #642.#643 // lambda$7:(Ljava/lang/String;Ljava/lang/String;)I + 706: MethodHandle InvokeStatic #1.#705 // demo/AllJavaSyntaxes.lambda$7:(Ljava/lang/String;Ljava/lang/String;)I + 707: MethodType (Ljava/lang/String;Ljava/lang/String;)I + 708: MethodType (Ljava/lang/Object;Ljava/lang/Object;)I + 709: MethodReference #1.#710 // demo/AllJavaSyntaxes.lambda$8:(Ljava/lang/String;Ljava/lang/String;)I + 710: NameAndTypeDescriptor #647.#643 // lambda$8:(Ljava/lang/String;Ljava/lang/String;)I + 711: MethodHandle InvokeStatic #1.#710 // demo/AllJavaSyntaxes.lambda$8:(Ljava/lang/String;Ljava/lang/String;)I + 712: MethodType (Ljava/lang/String;Ljava/lang/String;)I + 713: MethodReference #714.#716 // java/lang/runtime/SwitchBootstraps.typeSwitch:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 714: TypeInfo #715 // java/lang/runtime/SwitchBootstraps + 715: Utf8StringConstant "java/lang/runtime/SwitchBootstraps" + 716: NameAndTypeDescriptor #355.#717 // typeSwitch:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 717: Utf8StringConstant "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;" + 718: MethodHandle InvokeStatic #714.#716 // java/lang/runtime/SwitchBootstraps.typeSwitch:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 719: MethodReference #720.#722 // java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 720: TypeInfo #721 // java/lang/invoke/StringConcatFactory + 721: Utf8StringConstant "java/lang/invoke/StringConcatFactory" + 722: NameAndTypeDescriptor #399.#723 // makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 723: Utf8StringConstant "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;" + 724: MethodHandle InvokeStatic #720.#722 // java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 725: StringConstant #726 // "success:\u0001" + 726: Utf8StringConstant "success:\u0001" + 727: StringConstant #728 // "failure:\u0001" + 728: Utf8StringConstant "failure:\u0001" + 729: StringConstant #730 // "\u0001\u0001\u0001" + 730: Utf8StringConstant "\u0001\u0001\u0001" + 731: MethodType (Ljava/lang/Object;)Ljava/lang/Object; + 732: MethodHandle InvokeVirtual #97.#680 // java/lang/Object.toString:()Ljava/lang/String; + 733: MethodType (Ljava/lang/Integer;)Ljava/lang/String; + 734: MethodType ()Ljava/lang/Object; + 735: MethodReference #1.#736 // demo/AllJavaSyntaxes.lambda$10:()Ljava/lang/IllegalArgumentException; + 736: NameAndTypeDescriptor #648.#649 // lambda$10:()Ljava/lang/IllegalArgumentException; + 737: MethodHandle InvokeStatic #1.#736 // demo/AllJavaSyntaxes.lambda$10:()Ljava/lang/IllegalArgumentException; + 738: MethodType ()Ljava/lang/IllegalArgumentException; + 739: StringConstant #740 // "\u0001\u0001\u0001\u0001\u0001\u0001" + 740: Utf8StringConstant "\u0001\u0001\u0001\u0001\u0001\u0001" + 741: MethodType ()Ljava/lang/Object; + 742: MethodReference #1.#743 // demo/AllJavaSyntaxes.lambda$12:()Ljava/lang/Integer; + 743: NameAndTypeDescriptor #650.#651 // lambda$12:()Ljava/lang/Integer; + 744: MethodHandle InvokeStatic #1.#743 // demo/AllJavaSyntaxes.lambda$12:()Ljava/lang/Integer; + 745: MethodType ()Ljava/lang/Integer; + 746: MethodType (Ljava/lang/Object;Ljava/lang/Object;)I + 747: MethodHandle InvokeVirtual #148.#645 // java/lang/String.compareTo:(Ljava/lang/String;)I + 748: MethodType (Ljava/lang/String;Ljava/lang/String;)I + 749: MethodType ()V + 750: MethodReference #1.#751 // demo/AllJavaSyntaxes.lambda$14:()V + 751: NameAndTypeDescriptor #652.#29 // lambda$14:()V + 752: MethodHandle InvokeSpecial #1.#751 // demo/AllJavaSyntaxes.lambda$14:()V + 753: MethodType ()V + 754: MethodType ()Ljava/lang/Object; + 755: MethodHandle NewInvokeSpecial #3.#44 // java/util/ArrayList.:()V + 756: Utf8StringConstant "()Ljava/util/ArrayList;" + 757: MethodType ()Ljava/util/ArrayList; + 758: StringConstant #759 // "\u0001:\u0001" + 759: Utf8StringConstant "\u0001:\u0001" + 760: StringConstant #761 // "length=\u0001" + 761: Utf8StringConstant "length=\u0001" + 762: Utf8StringConstant "InnerClasses" + 763: Utf8StringConstant "Local" + 764: TypeInfo #765 // demo/AllJavaSyntaxes$AdvancedInterface + 765: Utf8StringConstant "demo/AllJavaSyntaxes$AdvancedInterface" + 766: Utf8StringConstant "AdvancedInterface" + 767: TypeInfo #768 // demo/AllJavaSyntaxes$Base + 768: Utf8StringConstant "demo/AllJavaSyntaxes$Base" + 769: Utf8StringConstant "Base" + 770: Utf8StringConstant "Circle" + 771: Utf8StringConstant "Day" + 772: TypeInfo #773 // demo/AllJavaSyntaxes$Derived + 773: Utf8StringConstant "demo/AllJavaSyntaxes$Derived" + 774: Utf8StringConstant "Derived" + 775: TypeInfo #776 // demo/AllJavaSyntaxes$Entity + 776: Utf8StringConstant "demo/AllJavaSyntaxes$Entity" + 777: Utf8StringConstant "Entity" + 778: Utf8StringConstant "Failure" + 779: TypeInfo #780 // demo/AllJavaSyntaxes$GenericConstructor + 780: Utf8StringConstant "demo/AllJavaSyntaxes$GenericConstructor" + 781: Utf8StringConstant "GenericConstructor" + 782: Utf8StringConstant "Identified" + 783: TypeInfo #784 // demo/AllJavaSyntaxes$Inner + 784: Utf8StringConstant "demo/AllJavaSyntaxes$Inner" + 785: Utf8StringConstant "Inner" + 786: TypeInfo #787 // demo/AllJavaSyntaxes$Marker + 787: Utf8StringConstant "demo/AllJavaSyntaxes$Marker" + 788: Utf8StringConstant "Marker" + 789: Utf8StringConstant "Named" + 790: TypeInfo #791 // demo/AllJavaSyntaxes$Operation + 791: Utf8StringConstant "demo/AllJavaSyntaxes$Operation" + 792: Utf8StringConstant "Operation" + 793: Utf8StringConstant "Outer" + 794: Utf8StringConstant "Deep" + 795: Utf8StringConstant "StaticNested" + 796: TypeInfo #797 // demo/AllJavaSyntaxes$Rec + 797: Utf8StringConstant "demo/AllJavaSyntaxes$Rec" + 798: Utf8StringConstant "Rec" + 799: Utf8StringConstant "Rectangle" + 800: Utf8StringConstant "Result" + 801: Utf8StringConstant "Shape" + 802: TypeInfo #803 // demo/AllJavaSyntaxes$StrictClass + 803: Utf8StringConstant "demo/AllJavaSyntaxes$StrictClass" + 804: Utf8StringConstant "StrictClass" + 805: Utf8StringConstant "Success" + 806: TypeInfo #807 // demo/AllJavaSyntaxes$SuperInner + 807: Utf8StringConstant "demo/AllJavaSyntaxes$SuperInner" + 808: Utf8StringConstant "SuperInner" + 809: TypeInfo #810 // demo/AllJavaSyntaxes$SuperOuter + 810: Utf8StringConstant "demo/AllJavaSyntaxes$SuperOuter" + 811: Utf8StringConstant "SuperOuter" + 812: TypeInfo #813 // demo/AllJavaSyntaxes$Tag + 813: Utf8StringConstant "demo/AllJavaSyntaxes$Tag" + 814: Utf8StringConstant "Tag" + 815: TypeInfo #816 // demo/AllJavaSyntaxes$Tagged + 816: Utf8StringConstant "demo/AllJavaSyntaxes$Tagged" + 817: Utf8StringConstant "Tagged" + 818: TypeInfo #819 // demo/AllJavaSyntaxes$Tags + 819: Utf8StringConstant "demo/AllJavaSyntaxes$Tags" + 820: Utf8StringConstant "Tags" + 821: TypeInfo #822 // demo/AllJavaSyntaxes$TypeUse + 822: Utf8StringConstant "demo/AllJavaSyntaxes$TypeUse" + 823: Utf8StringConstant "TypeUse" + 824: TypeInfo #825 // demo/AllJavaSyntaxes$WithDefaults + 825: Utf8StringConstant "demo/AllJavaSyntaxes$WithDefaults" + 826: Utf8StringConstant "WithDefaults" + 827: TypeInfo #828 // java/lang/invoke/MethodHandles$Lookup + 828: Utf8StringConstant "java/lang/invoke/MethodHandles$Lookup" + 829: TypeInfo #830 // java/lang/invoke/MethodHandles + 830: Utf8StringConstant "java/lang/invoke/MethodHandles" + 831: Utf8StringConstant "Lookup" + 832: Utf8StringConstant "NestMembers" + 833: TypeInfo #834 // demo/AllJavaSyntaxes$Inner$1 + 834: Utf8StringConstant "demo/AllJavaSyntaxes$Inner$1" + 835: TypeInfo #836 // demo/AllJavaSyntaxes$Operation$1 + 836: Utf8StringConstant "demo/AllJavaSyntaxes$Operation$1" + 837: TypeInfo #838 // demo/AllJavaSyntaxes$Operation$2 + 838: Utf8StringConstant "demo/AllJavaSyntaxes$Operation$2" + 839: TypeInfo #840 // demo/AllJavaSyntaxes$SuperInner$Deep + 840: Utf8StringConstant "demo/AllJavaSyntaxes$SuperInner$Deep" + private static final long serialVersionUID; + Flags: PRIVATE, STATIC, FINAL + ConstantValue: long 1L + private static transient volatile char[] CHARS; + Flags: PRIVATE, STATIC, TRANSIENT, VOLATILE + private static final java.util.concurrent.atomic.AtomicInteger COUNTER; + Flags: PRIVATE, STATIC, FINAL + transient java.util.concurrent.Callable callable; + Flags: TRANSIENT + Signature: Ljava/util/concurrent/Callable; + static final boolean $assertionsDisabled; + Flags: STATIC, FINAL, SYNTHETIC + private static volatile int[] $SWITCH_TABLE$demo$AllJavaSyntaxes$Day; + Flags: PRIVATE, STATIC, VOLATILE, SYNTHETIC + static {}; + Flags: STATIC + Code: + stack=4, locals=2, arguments=0 + 0: ldc Ldemo/AllJavaSyntaxes;.class + 2: invokevirtual java/lang/Class.desiredAssertionStatus:()Z + 5: ifne 12 + 8: iconst_1 + 9: goto 13 + 12: iconst_0 + 13: putstatic demo/AllJavaSyntaxes.$assertionsDisabled:Z + 16: iconst_2 + 17: newarray C + 19: dup + 20: iconst_0 + 21: bipush 65 + 23: castore + 24: dup + 25: iconst_1 + 26: bipush 66 + 28: castore + 29: putstatic demo/AllJavaSyntaxes.CHARS:[C + 32: new Ljava/util/concurrent/atomic/AtomicInteger; + 35: dup + 36: invokespecial java/util/concurrent/atomic/AtomicInteger.:()V + 39: putstatic demo/AllJavaSyntaxes.COUNTER:Ljava/util/concurrent/atomic/AtomicInteger; + 42: iconst_1 + 43: istore_0 /* x */ + 44: iconst_2 + 45: istore_1 /* y */ + 46: invokestatic demo/AllJavaSyntaxes.init:()V + 49: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + 44 5 0 x I + 46 3 1 y I + StackMapTable: 00 02 0C 40 01 + public void (); + Flags: PUBLIC + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/util/ArrayList.:()V + 4: aload_0 /* this */ + 5: invokedynamic BootstrapMethod #0, call:()Ljava/util/concurrent/Callable; + 10: putfield demo/AllJavaSyntaxes.callable:Ljava/util/concurrent/Callable; + 13: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 14 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 14 0 this Ldemo/AllJavaSyntaxes; + void deprecatedMethod(); + Flags: DEPRECATED + Code: + stack=0, locals=1, arguments=0 + 0: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 1 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 1 0 this Ldemo/AllJavaSyntaxes; + private static void init(); + Flags: PRIVATE, STATIC + Code: + stack=1, locals=0, arguments=0 + 0: getstatic demo/AllJavaSyntaxes.COUNTER:Ljava/util/concurrent/atomic/AtomicInteger; + 3: invokevirtual java/util/concurrent/atomic/AtomicInteger.incrementAndGet:()I + 6: pop + 7: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + protected final java.lang.Object[] methodReferencesAndLambdas(T... arguments); + Flags: PROTECTED, FINAL, VARARGS + Code: + stack=3, locals=2, arguments=1 + 0: aload_1 /* arguments */ + 1: invokestatic java/util/stream/Stream.of:([Ljava/lang/Object;)Ljava/util/stream/Stream; + 4: getstatic java/lang/System.out:Ljava/io/PrintStream; + 7: dup + 8: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 11: pop + 12: invokedynamic BootstrapMethod #1, accept:(Ljava/io/PrintStream;)Ljava/util/function/Consumer; + 17: invokeinterface java/util/stream/Stream.forEach:(Ljava/util/function/Consumer;)V + 22: aload_1 /* arguments */ + 23: invokestatic java/util/stream/Stream.of:([Ljava/lang/Object;)Ljava/util/stream/Stream; + 26: invokedynamic BootstrapMethod #2, apply:()Ljava/util/function/Function; + 31: invokeinterface java/util/stream/Stream.map:(Ljava/util/function/Function;)Ljava/util/stream/Stream; + 36: invokedynamic BootstrapMethod #3, apply:()Ljava/util/function/IntFunction; + 41: invokeinterface java/util/stream/Stream.toArray:(Ljava/util/function/IntFunction;)[Ljava/lang/Object; + 46: areturn + Signature: + ([TT;)[Ljava/lang/Object; + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------- + 0 47 0 this Ldemo/AllJavaSyntaxes; + 0 47 1 arguments [Ljava/lang/Object; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 47 0 this Ldemo/AllJavaSyntaxes; + void classicFor(java.lang.String[] arguments); + Code: + stack=3, locals=3, arguments=1 + 0: iconst_0 + 1: istore_2 /* index */ + 2: goto 15 + 5: aload_0 /* this */ + 6: aload_1 /* arguments */ + 7: iload_2 /* index */ + 8: aaload + 9: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 12: iinc index, 1 + 15: iload_2 /* index */ + 16: aload_1 /* arguments */ + 17: arraylength + 18: if_icmplt 5 + 21: iconst_0 + 22: istore_2 /* index */ + 23: goto 36 + 26: aload_0 /* this */ + 27: aload_1 /* arguments */ + 28: iload_2 /* index */ + 29: aaload + 30: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 33: iinc index, 1 + 36: iload_2 /* index */ + 37: aload_1 /* arguments */ + 38: arraylength + 39: if_icmplt 26 + 42: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------- + 0 43 0 this Ldemo/AllJavaSyntaxes; + 0 43 1 arguments [Ljava/lang/String; + 2 19 2 index I + 23 19 2 index I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 43 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 04 FC 00 05 01 09 0A 09 + void whileLoop(java.lang.String[] arguments); + Code: + stack=3, locals=3, arguments=1 + 0: iconst_0 + 1: istore_2 /* index */ + 2: goto 15 + 5: aload_0 /* this */ + 6: aload_1 /* arguments */ + 7: iload_2 /* index */ + 8: iinc index, 1 + 11: aaload + 12: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 15: iload_2 /* index */ + 16: aload_1 /* arguments */ + 17: arraylength + 18: if_icmplt 5 + 21: iconst_0 + 22: istore_2 /* index */ + 23: goto 36 + 26: aload_0 /* this */ + 27: aload_1 /* arguments */ + 28: iload_2 /* index */ + 29: iinc index, 1 + 32: aaload + 33: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 36: iload_2 /* index */ + 37: aload_1 /* arguments */ + 38: arraylength + 39: if_icmplt 26 + 42: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------- + 0 43 0 this Ldemo/AllJavaSyntaxes; + 0 43 1 arguments [Ljava/lang/String; + 2 41 2 index I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 43 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 04 FC 00 05 01 09 0A 09 + void doWhileLoop(java.lang.String[] arguments); + Code: + stack=3, locals=3, arguments=1 + 0: iconst_0 + 1: istore_2 /* index */ + 2: aload_0 /* this */ + 3: aload_1 /* arguments */ + 4: iload_2 /* index */ + 5: iinc index, 1 + 8: aaload + 9: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 12: iload_2 /* index */ + 13: aload_1 /* arguments */ + 14: arraylength + 15: if_icmplt 2 + 18: iconst_0 + 19: istore_2 /* index */ + 20: aload_0 /* this */ + 21: aload_1 /* arguments */ + 22: iload_2 /* index */ + 23: iinc index, 1 + 26: aaload + 27: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 30: iload_2 /* index */ + 31: aload_1 /* arguments */ + 32: arraylength + 33: if_icmplt 20 + 36: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------- + 0 37 0 this Ldemo/AllJavaSyntaxes; + 0 37 1 arguments [Ljava/lang/String; + 2 35 2 index I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 37 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 02 FC 00 02 01 11 + void lambdaAndOptional(); + Code: + stack=2, locals=3, arguments=0 + 0: invokedynamic BootstrapMethod #4, get:()Ljava/util/function/Supplier; + 5: astore_1 /* supplier */ + 6: invokedynamic BootstrapMethod #5, apply:()Ljava/util/function/Function; + 11: astore_2 /* function */ + 12: aload_1 /* supplier */ + 13: invokeinterface java/util/function/Supplier.get:()Ljava/lang/Object; + 18: checkcast Ljava/lang/String; + 21: invokestatic java/util/Optional.ofNullable:(Ljava/lang/Object;)Ljava/util/Optional; + 24: aload_2 /* function */ + 25: invokevirtual java/util/Optional.map:(Ljava/util/function/Function;)Ljava/util/Optional; + 28: aload_0 /* this */ + 29: invokedynamic BootstrapMethod #6, accept:(Ldemo/AllJavaSyntaxes;)Ljava/util/function/Consumer; + 34: invokevirtual java/util/Optional.ifPresent:(Ljava/util/function/Consumer;)V + 37: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- -------- ----------------------------- + 0 38 0 this Ldemo/AllJavaSyntaxes; + 6 32 1 supplier Ljava/util/function/Supplier; + 12 26 2 function Ljava/util/function/Function; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- -------- -------------------------------------------------------------------- + 0 38 0 this Ldemo/AllJavaSyntaxes; + 6 32 1 supplier Ljava/util/function/Supplier; + 12 26 2 function Ljava/util/function/Function; + void typedLambdaParams(java.util.List list); + Code: + stack=2, locals=2, arguments=1 + 0: aload_1 /* list */ + 1: invokedynamic BootstrapMethod #7, compare:()Ljava/util/Comparator; + 6: invokeinterface java/util/List.sort:(Ljava/util/Comparator;)V + 11: return + Signature: + (Ljava/util/List;)V + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 12 0 this Ldemo/AllJavaSyntaxes; + 0 12 1 list Ljava/util/List; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------------ + 0 12 0 this Ldemo/AllJavaSyntaxes; + 0 12 1 list Ljava/util/List; + void unTypedLambdaParams(java.util.List list); + Code: + stack=2, locals=2, arguments=1 + 0: aload_1 /* list */ + 1: invokedynamic BootstrapMethod #8, compare:()Ljava/util/Comparator; + 6: invokeinterface java/util/List.sort:(Ljava/util/Comparator;)V + 11: return + Signature: + (Ljava/util/List;)V + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 12 0 this Ldemo/AllJavaSyntaxes; + 0 12 1 list Ljava/util/List; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------------ + 0 12 0 this Ldemo/AllJavaSyntaxes; + 0 12 1 list Ljava/util/List; + synchronized void synchronizedMethod(); + Flags: SYNCHRONIZED + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: ldc "synchronized" + 3: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 6: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 7 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 7 0 this Ldemo/AllJavaSyntaxes; + void tryCatchFinally(); + Code: + stack=2, locals=3, arguments=0 + 0: getstatic demo/AllJavaSyntaxes.COUNTER:Ljava/util/concurrent/atomic/AtomicInteger; + 3: invokevirtual java/util/concurrent/atomic/AtomicInteger.get:()I + 6: ifge 47 + 9: new Ljava/lang/IllegalStateException; + 12: dup + 13: invokespecial java/lang/IllegalStateException.:()V + 16: athrow + 17: astore_1 /* exception */ + 18: aload_0 /* this */ + 19: aload_1 /* exception */ + 20: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 23: invokevirtual java/lang/Class.getSimpleName:()Ljava/lang/String; + 26: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 29: aload_0 /* this */ + 30: ldc "finally" + 32: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 35: goto 53 + 38: astore_2 + 39: aload_0 /* this */ + 40: ldc "finally" + 42: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 45: aload_2 + 46: athrow + 47: aload_0 /* this */ + 48: ldc "finally" + 50: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 53: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------------- + 0 54 0 this Ldemo/AllJavaSyntaxes; + 18 11 1 exception Ljava/lang/RuntimeException; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 54 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 04 51 07 00 CC 54 07 00 D0 08 05 + Exceptions: + Try Handler + Start End Start End Type + ----- ----- ----- ----- ---------------------------- + 0 17 17 38 Ljava/lang/RuntimeException; + 0 29 38 47 Any + void tryWithResources(java.nio.file.Path path); + Code: + stack=2, locals=6, arguments=1 + 0: aconst_null + 1: astore_3 + 2: aconst_null + 3: astore 4 + 5: aload_1 /* path */ + 6: invokestatic java/nio/file/Files.newBufferedReader:(Ljava/nio/file/Path;)Ljava/io/BufferedReader; + 9: astore br + 11: goto 19 + 14: aload_0 /* this */ + 15: aload_2 /* line */ + 16: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 19: aload br + 21: invokevirtual java/io/BufferedReader.readLine:()Ljava/lang/String; + 24: dup + 25: astore_2 /* line */ + 26: ifnonnull 14 + 29: aload br + 31: ifnull 90 + 34: aload br + 36: invokevirtual java/io/BufferedReader.close:()V + 39: goto 90 + 42: astore_3 + 43: aload br + 45: ifnull 53 + 48: aload br + 50: invokevirtual java/io/BufferedReader.close:()V + 53: aload_3 + 54: athrow + 55: astore 4 + 57: aload_3 + 58: ifnonnull 67 + 61: aload 4 + 63: astore_3 + 64: goto 79 + 67: aload_3 + 68: aload 4 + 70: if_acmpeq 79 + 73: aload_3 + 74: aload 4 + 76: invokevirtual java/lang/Throwable.addSuppressed:(Ljava/lang/Throwable;)V + 79: aload_3 + 80: athrow + 81: astore_3 /* exception */ + 82: aload_0 /* this */ + 83: aload_3 /* exception */ + 84: invokevirtual java/io/IOException.getMessage:()Ljava/lang/String; + 87: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 90: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ------------------------ + 0 91 0 this Ldemo/AllJavaSyntaxes; + 0 91 1 path Ljava/nio/file/Path; + 14 5 2 line Ljava/lang/String; + 26 16 2 line Ljava/lang/String; + 11 42 5 br Ljava/io/BufferedReader; + 82 8 3 exception Ljava/io/IOException; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 91 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 09 FF 00 0E 00 06 07 00 01 07 00 F2 07 00 94 07 00 D0 07 00 D0 07 00 DB 00 00 FF 00 04 00 06 07 00 01 07 00 F2 00 07 00 D0 07 00 D0 07 00 DB 00 00 56 07 00 D0 FA 00 0A 41 07 00 D0 0B 0B FF 00 01 00 02 07 00 01 07 00 F2 00 01 07 00 E7 08 + Exceptions: + Try Handler + Start End Start End Type + ----- ----- ----- ----- --------------------- + 11 29 42 55 Any + 5 55 55 81 Any + 0 81 81 90 Ljava/io/IOException; + void assertions(int value); + Code: + stack=3, locals=2, arguments=1 + 0: getstatic demo/AllJavaSyntaxes.$assertionsDisabled:Z + 3: ifne 20 + 6: iload_1 /* value */ + 7: ifge 20 + 10: new Ljava/lang/AssertionError; + 13: dup + 14: ldc "negative" + 16: invokespecial java/lang/AssertionError.:(Ljava/lang/Object;)V + 19: athrow + 20: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------- + 0 21 0 this Ldemo/AllJavaSyntaxes; + 0 21 1 value I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 21 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 01 14 + void boxingAndNumbers(); + Code: + stack=2, locals=4, arguments=0 + 0: iconst_1 + 1: invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer; + 4: astore_1 /* boxed */ + 5: aload_1 /* boxed */ + 6: invokevirtual java/lang/Integer.intValue:()I + 9: istore_2 /* primitive */ + 10: iload_2 /* primitive */ + 11: i2l + 12: invokestatic java/math/BigDecimal.valueOf:(J)Ljava/math/BigDecimal; + 15: astore_3 /* decimal */ + 16: aload_0 /* this */ + 17: aload_3 /* decimal */ + 18: invokevirtual java/math/BigDecimal.toPlainString:()Ljava/lang/String; + 21: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 24: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------- + 0 25 0 this Ldemo/AllJavaSyntaxes; + 5 20 1 boxed Ljava/lang/Integer; + 10 15 2 primitive I + 16 9 3 decimal Ljava/math/BigDecimal; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 25 0 this Ldemo/AllJavaSyntaxes; + void instanceofPattern(java.lang.Object object); + Code: + stack=2, locals=3, arguments=1 + 0: aload_1 /* object */ + 1: instanceof Ljava/lang/String; + 4: ifeq 24 + 7: aload_1 /* object */ + 8: checkcast Ljava/lang/String; + 11: astore_2 /* text */ + 12: aload_2 /* text */ + 13: invokevirtual java/lang/String.isEmpty:()Z + 16: ifne 24 + 19: aload_0 /* this */ + 20: aload_2 /* text */ + 21: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 24: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ---------------------- + 0 25 0 this Ldemo/AllJavaSyntaxes; + 0 25 1 object Ljava/lang/Object; + 12 12 2 text Ljava/lang/String; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 25 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 01 18 + void enumSwitch(demo.AllJavaSyntaxes.Day day); + Code: + stack=2, locals=2, arguments=1 + 0: invokestatic demo/AllJavaSyntaxes.$SWITCH_TABLE$demo$AllJavaSyntaxes$Day:()[I + 3: aload_1 /* day */ + 4: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 7: iaload + 8: tableswitch { + 2: 32 + 3: 32 + default: 42 + } + 32: aload_0 /* this */ + 33: ldc_w "weekday" + 36: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 39: goto 49 + 42: aload_0 /* this */ + 43: ldc_w "other" + 46: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 49: return + Signature: + (Ldemo/AllJavaSyntaxes$Day;)V + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------- + 0 50 0 this Ldemo/AllJavaSyntaxes; + 0 50 1 day Ldemo/AllJavaSyntaxes$Day; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 50 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 03 20 09 06 + public java.lang.String expressionSwitch(int value); + Flags: PUBLIC + Code: + stack=2, locals=2, arguments=1 + 0: iload_1 /* value */ + 1: tableswitch { + 0: 24 + 1: 30 + default: 36 + } + 24: ldc_w "zero" + 27: goto 44 + 30: ldc_w "one" + 33: goto 44 + 36: new Ljava/lang/IllegalArgumentException; + 39: dup + 40: invokespecial java/lang/IllegalArgumentException.:()V + 43: athrow + 44: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------- + 0 45 0 this Ldemo/AllJavaSyntaxes; + 0 45 1 value I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 45 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 04 18 05 05 47 07 00 94 + public int compareTo(E other); + Flags: PUBLIC + Code: + stack=3, locals=2, arguments=1 + 0: invokestatic java/util/Comparator.naturalOrder:()Ljava/util/Comparator; + 3: aconst_null + 4: aload_1 /* other */ + 5: invokeinterface java/util/Comparator.compare:(Ljava/lang/Object;Ljava/lang/Object;)I + 10: ireturn + Signature: + (TE;)I + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------- + 0 11 0 this Ldemo/AllJavaSyntaxes; + 0 11 1 other Ljava/lang/Comparable; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ----- --------------------------- + 0 11 0 this Ldemo/AllJavaSyntaxes; + 0 11 1 other TE; + public int hashCode(); + Flags: PUBLIC + Code: + stack=4, locals=1, arguments=0 + 0: iconst_2 + 1: anewarray Ljava/lang/Object; + 4: dup + 5: iconst_0 + 6: aload_0 /* this */ + 7: invokespecial java/util/ArrayList.hashCode:()I + 10: invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer; + 13: aastore + 14: dup + 15: iconst_1 + 16: getstatic demo/AllJavaSyntaxes.COUNTER:Ljava/util/concurrent/atomic/AtomicInteger; + 19: invokevirtual java/util/concurrent/atomic/AtomicInteger.get:()I + 22: invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer; + 25: aastore + 26: invokestatic java/util/Objects.hash:([Ljava/lang/Object;)I + 29: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 30 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 30 0 this Ldemo/AllJavaSyntaxes; + public boolean equals(java.lang.Object object); + Flags: PUBLIC + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 /* object */ + 2: if_acmpne 7 + 5: iconst_1 + 6: ireturn + 7: aload_0 /* this */ + 8: aload_1 /* object */ + 9: invokespecial java/util/ArrayList.equals:(Ljava/lang/Object;)Z + 12: ifeq 26 + 15: aload_0 /* this */ + 16: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 19: aload_1 /* object */ + 20: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 23: if_acmpeq 28 + 26: iconst_0 + 27: ireturn + 28: iconst_1 + 29: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ---------------------- + 0 30 0 this Ldemo/AllJavaSyntaxes; + 0 30 1 object Ljava/lang/Object; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 30 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 03 07 12 01 + public abstract void log(java.lang.String p0); + Flags: PUBLIC, ABSTRACT + static > T intersectionBound(T value); + Flags: STATIC + Code: + stack=1, locals=1, arguments=1 + 0: aload_0 /* value */ + 1: areturn + Signature: + ;>(TT;)TT; + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------------- + 0 2 0 value Ldemo/AllJavaSyntaxes$Named; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ----- --------- + 0 2 0 value TT; + void intersectionCast(java.lang.Object object); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 /* object */ + 2: checkcast Ldemo/AllJavaSyntaxes$Identified; + 5: checkcast Ldemo/AllJavaSyntaxes$Named; + 8: checkcast Ldemo/AllJavaSyntaxes$Named; + 11: invokeinterface demo/AllJavaSyntaxes$Named.name:()Ljava/lang/String; + 16: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 19: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ---------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + 0 20 1 object Ljava/lang/Object; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + void guardedPattern(java.lang.Object object); + Code: + stack=2, locals=4, arguments=1 + 0: aload_1 /* object */ + 1: dup + 2: invokestatic java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object; + 5: pop + 6: astore_2 + 7: aload_2 + 8: iconst_0 + 9: invokedynamic BootstrapMethod #9, typeSwitch:(Ljava/lang/Object;I)I + 14: tableswitch { + 0: 32 + default: 61 + } + 32: aload_2 + 33: checkcast Ljava/lang/String; + 36: astore_3 /* s */ + 37: aload_3 /* s */ + 38: invokevirtual java/lang/String.length:()I + 41: iconst_3 + 42: if_icmple 48 + 45: goto 53 + 48: aload_2 + 49: iconst_1 + 50: goto 9 + 53: aload_0 /* this */ + 54: aload_3 /* s */ + 55: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 58: goto 61 + 61: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ---------------------- + 0 62 0 this Ldemo/AllJavaSyntaxes; + 0 62 1 object Ljava/lang/Object; + 37 11 3 s Ljava/lang/String; + 53 8 3 s Ljava/lang/String; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 62 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 05 FF 00 09 00 03 07 00 01 07 00 61 07 00 61 00 02 07 00 61 01 16 0F FC 00 04 07 00 94 F9 00 07 + double sealedSwitch(demo.AllJavaSyntaxes.Shape shape); + Code: + stack=4, locals=5, arguments=1 + 0: aload_1 /* shape */ + 1: dup + 2: invokestatic java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object; + 5: pop + 6: astore_2 + 7: aload_2 + 8: iconst_0 + 9: invokedynamic BootstrapMethod #10, typeSwitch:(Ljava/lang/Object;I)I + 14: tableswitch { + 0: 36 + 1: 48 + default: 62 + } + 36: aload_2 + 37: checkcast Ldemo/AllJavaSyntaxes$Circle; + 40: astore_3 /* circle */ + 41: aload_3 /* circle */ + 42: invokevirtual demo/AllJavaSyntaxes$Circle.area:()D + 45: goto 72 + 48: aload_2 + 49: checkcast Ldemo/AllJavaSyntaxes$Rectangle; + 52: astore rectangle + 54: aload rectangle + 56: invokevirtual demo/AllJavaSyntaxes$Rectangle.area:()D + 59: goto 72 + 62: new Ljava/lang/MatchException; + 65: dup + 66: aconst_null + 67: aconst_null + 68: invokespecial java/lang/MatchException.:(Ljava/lang/String;Ljava/lang/Throwable;)V + 71: athrow + 72: dreturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- -------------------------------- + 0 73 0 this Ldemo/AllJavaSyntaxes; + 0 73 1 shape Ldemo/AllJavaSyntaxes$Shape; + 41 7 3 circle Ldemo/AllJavaSyntaxes$Circle; + 54 8 4 rectangle Ldemo/AllJavaSyntaxes$Rectangle; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 73 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 04 FC 00 24 07 01 80 0B 0D FF 00 09 00 02 07 00 01 07 01 80 00 01 03 + java.lang.String handleResult(demo.AllJavaSyntaxes.Result result); + Code: + stack=4, locals=5, arguments=1 + 0: aload_1 /* result */ + 1: dup + 2: invokestatic java/util/Objects.requireNonNull:(Ljava/lang/Object;)Ljava/lang/Object; + 5: pop + 6: astore_2 + 7: aload_2 + 8: iconst_0 + 9: invokedynamic BootstrapMethod #11, typeSwitch:(Ljava/lang/Object;I)I + 14: tableswitch { + 0: 36 + 1: 56 + default: 81 + } + 36: aload_2 + 37: checkcast Ldemo/AllJavaSyntaxes$Success; + 40: astore_3 /* success */ + 41: aload_3 /* success */ + 42: invokevirtual demo/AllJavaSyntaxes$Success.value:()Ljava/lang/Object; + 45: invokestatic java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String; + 48: invokedynamic BootstrapMethod #12, makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; + 53: goto 91 + 56: aload_2 + 57: checkcast Ldemo/AllJavaSyntaxes$Failure; + 60: astore failure + 62: aload failure + 64: invokevirtual demo/AllJavaSyntaxes$Failure.exception:()Ljava/lang/Exception; + 67: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 70: invokevirtual java/lang/Class.getSimpleName:()Ljava/lang/String; + 73: invokedynamic BootstrapMethod #13, makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; + 78: goto 91 + 81: new Ljava/lang/MatchException; + 84: dup + 85: aconst_null + 86: aconst_null + 87: invokespecial java/lang/MatchException.:(Ljava/lang/String;Ljava/lang/Throwable;)V + 90: athrow + 91: areturn + Signature: + (Ldemo/AllJavaSyntaxes$Result;)Ljava/lang/String; + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------- ------------------------------ + 0 92 0 this Ldemo/AllJavaSyntaxes; + 0 92 1 result Ldemo/AllJavaSyntaxes$Result; + 41 15 3 success Ldemo/AllJavaSyntaxes$Success; + 62 19 4 failure Ldemo/AllJavaSyntaxes$Failure; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ------- ----------------------------------- + 0 92 0 this Ldemo/AllJavaSyntaxes; + 0 92 1 result Ldemo/AllJavaSyntaxes$Result; + 41 15 3 success Ldemo/AllJavaSyntaxes$Success; + 62 19 4 failure Ldemo/AllJavaSyntaxes$Failure; + StackMapTable: 00 04 FC 00 24 07 01 A0 13 18 FF 00 09 00 02 07 00 01 07 01 A0 00 01 07 00 94 + static T genericMethod(T value); + Flags: STATIC + Code: + stack=1, locals=1, arguments=1 + 0: aload_0 /* value */ + 1: areturn + Signature: + (TT;)TT; + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ------------------ + 0 2 0 value Ljava/lang/Object; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ----- --------- + 0 2 0 value TT; + void labeledLoops(); + Code: + stack=2, locals=3, arguments=0 + 0: iconst_0 + 1: istore_1 /* i */ + 2: goto 39 + 5: iconst_0 + 6: istore_2 /* j */ + 7: goto 31 + 10: iload_1 /* i */ + 11: iload_2 /* j */ + 12: if_icmpne 18 + 15: goto 36 + 18: iload_1 /* i */ + 19: iload_2 /* j */ + 20: iadd + 21: iconst_3 + 22: if_icmple 28 + 25: goto 36 + 28: iinc j, 1 + 31: iload_2 /* j */ + 32: iconst_3 + 33: if_icmplt 10 + 36: iinc i, 1 + 39: iload_1 /* i */ + 40: iconst_3 + 41: if_icmplt 5 + 44: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 45 0 this Ldemo/AllJavaSyntaxes; + 2 42 1 i I + 7 29 2 j I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 45 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 07 FC 00 05 01 FC 00 04 01 07 09 02 FA 00 04 02 + void labeledBlock(); + Code: + stack=2, locals=1, arguments=0 + 0: getstatic demo/AllJavaSyntaxes.COUNTER:Ljava/util/concurrent/atomic/AtomicInteger; + 3: invokevirtual java/util/concurrent/atomic/AtomicInteger.get:()I + 6: iflt 12 + 9: goto 19 + 12: aload_0 /* this */ + 13: ldc_w "unreachable" + 16: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 19: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 02 0C 06 + void localVar(); + Code: + stack=4, locals=4, arguments=0 + 0: bipush 123 + 2: istore_1 /* number */ + 3: ldc_w "text" + 6: astore_2 /* text */ + 7: new Ljava/util/ArrayList; + 10: dup + 11: invokespecial java/util/ArrayList.:()V + 14: astore_3 /* list */ + 15: aload_0 /* this */ + 16: aload_2 /* text */ + 17: iload_1 /* number */ + 18: aload_3 /* list */ + 19: invokevirtual java/util/ArrayList.size:()I + 22: invokedynamic BootstrapMethod #14, makeConcatWithConstants:(Ljava/lang/String;II)Ljava/lang/String; + 27: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 30: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ---------------------- + 0 31 0 this Ldemo/AllJavaSyntaxes; + 3 28 1 number I + 7 24 2 text Ljava/lang/String; + 15 16 3 list Ljava/util/ArrayList; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------------------- + 0 31 0 this Ldemo/AllJavaSyntaxes; + 15 16 3 list Ljava/util/ArrayList; + void multiCatch() throws java.lang.Exception; + Code: + stack=2, locals=2, arguments=0 + 0: new Ljava/io/IOException; + 3: dup + 4: invokespecial java/io/IOException.:()V + 7: athrow + 8: astore_1 /* exception */ + 9: aload_1 /* exception */ + 10: athrow + Exceptions: + throws java.lang.Exception + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------- + 0 11 0 this Ldemo/AllJavaSyntaxes; + 9 2 1 exception Ljava/lang/Exception; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 11 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 01 48 07 01 B7 + Exceptions: + Try Handler + Start End Start End Type + ----- ----- ----- ----- ---------------------------- + 0 8 8 11 Ljava/io/IOException; + 0 8 8 11 Ljava/lang/RuntimeException; + void suppressed() throws java.lang.Exception; + Code: + stack=3, locals=3, arguments=0 + 0: new Ljava/lang/Exception; + 3: dup + 4: ldc_w "primary" + 7: invokespecial java/lang/Exception.:(Ljava/lang/String;)V + 10: astore_1 /* primary */ + 11: new Ljava/lang/Exception; + 14: dup + 15: ldc_w "secondary" + 18: invokespecial java/lang/Exception.:(Ljava/lang/String;)V + 21: astore_2 /* secondary */ + 22: aload_1 /* primary */ + 23: aload_2 /* secondary */ + 24: invokevirtual java/lang/Exception.addSuppressed:(Ljava/lang/Throwable;)V + 27: aload_1 /* primary */ + 28: athrow + Exceptions: + throws java.lang.Exception + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------- + 0 29 0 this Ldemo/AllJavaSyntaxes; + 11 18 1 primary Ljava/lang/Exception; + 22 7 2 secondary Ljava/lang/Exception; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 29 0 this Ldemo/AllJavaSyntaxes; + java.lang.String throwExpression(java.lang.Integer value); + Code: + stack=2, locals=2, arguments=1 + 0: aload_1 /* value */ + 1: invokestatic java/util/Optional.ofNullable:(Ljava/lang/Object;)Ljava/util/Optional; + 4: invokedynamic BootstrapMethod #15, apply:()Ljava/util/function/Function; + 9: invokevirtual java/util/Optional.map:(Ljava/util/function/Function;)Ljava/util/Optional; + 12: invokedynamic BootstrapMethod #16, get:()Ljava/util/function/Supplier; + 17: invokevirtual java/util/Optional.orElseThrow:(Ljava/util/function/Supplier;)Ljava/lang/Object; + 20: checkcast Ljava/lang/String; + 23: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------- + 0 24 0 this Ldemo/AllJavaSyntaxes; + 0 24 1 value Ljava/lang/Integer; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 24 0 this Ldemo/AllJavaSyntaxes; + void synchronizedBlock(); + Code: + stack=2, locals=2, arguments=0 + 0: aload_0 /* this */ + 1: dup + 2: astore_1 + 3: monitorenter + 4: aload_0 /* this */ + 5: ldc_w "sync" + 8: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 11: aload_1 + 12: monitorexit + 13: goto 19 + 16: aload_1 + 17: monitorexit + 18: athrow + 19: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 02 FF 00 10 00 02 07 00 01 07 00 01 00 01 07 00 D0 FA 00 02 + Exceptions: + Try Handler + Start End Start End Type + ----- ----- ----- ----- ---- + 4 13 16 19 Any + 16 18 16 19 Any + void localClass(); + Code: + stack=4, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: new Ldemo/AllJavaSyntaxes$1Local; + 4: dup + 5: aload_0 /* this */ + 6: invokespecial demo/AllJavaSyntaxes$1Local.:(Ldemo/AllJavaSyntaxes;)V + 9: invokevirtual demo/AllJavaSyntaxes$1Local.value:()Ljava/lang/String; + 12: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 15: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 16 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 16 0 this Ldemo/AllJavaSyntaxes; + void intersectionThrows() throws T, java.lang.Exception; + Code: + stack=0, locals=1, arguments=0 + 0: return + Exceptions: + throws java.lang.Exception + Signature: + ()V [from metadata: ()V^TT;] + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 1 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 1 0 this Ldemo/AllJavaSyntaxes; + void wildcard(java.util.List list); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 /* list */ + 2: invokevirtual demo/AllJavaSyntaxes.capture:(Ljava/util/List;)V + 5: return + Signature: + (Ljava/util/List<*>;)V + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 6 0 this Ldemo/AllJavaSyntaxes; + 0 6 1 list Ljava/util/List; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 6 0 this Ldemo/AllJavaSyntaxes; + 0 6 1 list Ljava/util/List<*>; + private void capture(java.util.List list); + Flags: PRIVATE + Code: + stack=2, locals=4, arguments=1 + 0: aload_1 /* list */ + 1: invokeinterface java/util/List.iterator:()Ljava/util/Iterator; + 6: astore_3 + 7: goto 28 + 10: aload_3 + 11: invokeinterface java/util/Iterator.next:()Ljava/lang/Object; + 16: checkcast Ljava/lang/Object; + 19: astore_2 /* element */ + 20: aload_0 /* this */ + 21: aload_2 /* element */ + 22: invokestatic java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String; + 25: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 28: aload_3 + 29: invokeinterface java/util/Iterator.hasNext:()Z + 34: ifne 10 + 37: return + Signature: + (Ljava/util/List;)V + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------- ---------------------- + 0 38 0 this Ldemo/AllJavaSyntaxes; + 0 38 1 list Ljava/util/List; + 20 8 2 element Ljava/lang/Object; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ------- --------------------------- + 0 38 0 this Ldemo/AllJavaSyntaxes; + 0 38 1 list Ljava/util/List; + 20 8 2 element TT; + StackMapTable: 00 02 FF 00 0A 00 04 07 00 01 07 00 B3 00 07 01 E4 00 00 11 + void typeUse(); + Code: + stack=3, locals=3, arguments=0 + 0: ldc_w "x" + 3: astore_1 /* value */ + 4: aload_1 /* value */ + 5: invokestatic java/util/List.of:(Ljava/lang/Object;)Ljava/util/List; + 8: astore_2 /* list */ + 9: aload_0 /* this */ + 10: aload_2 /* list */ + 11: iconst_0 + 12: invokeinterface java/util/List.get:(I)Ljava/lang/Object; + 17: checkcast Ljava/lang/String; + 20: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 23: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------- + 0 24 0 this Ldemo/AllJavaSyntaxes; + 4 20 1 value Ljava/lang/String; + 9 15 2 list Ljava/util/List; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------------ + 0 24 0 this Ldemo/AllJavaSyntaxes; + 9 15 2 list Ljava/util/List; + RuntimeInvisibleTypeAnnotations: 00 02 40 00 01 00 04 00 14 00 01 00 01 F6 00 00 40 00 01 00 09 00 0F 00 02 01 03 00 01 F6 00 00 + void arrays(); + Code: + stack=7, locals=1, arguments=0 + 0: iconst_0 + 1: newarray I + 3: pop + 4: iconst_3 + 5: newarray I + 7: dup + 8: iconst_0 + 9: iconst_1 + 10: iastore + 11: dup + 12: iconst_1 + 13: iconst_2 + 14: iastore + 15: dup + 16: iconst_2 + 17: iconst_3 + 18: iastore + 19: pop + 20: iconst_2 + 21: anewarray [Ljava/lang/String; + 24: dup + 25: iconst_0 + 26: iconst_1 + 27: anewarray Ljava/lang/String; + 30: dup + 31: iconst_0 + 32: ldc_w "a" + 35: aastore + 36: aastore + 37: dup + 38: iconst_1 + 39: iconst_1 + 40: anewarray Ljava/lang/String; + 43: dup + 44: iconst_0 + 45: ldc_w "b" + 48: aastore + 49: aastore + 50: pop + 51: iconst_1 + 52: newarray I + 54: pop + 55: iconst_2 + 56: newarray I + 58: dup + 59: iconst_1 + 60: iconst_1 + 61: iastore + 62: pop + 63: iconst_2 + 64: anewarray [I + 67: dup + 68: iconst_0 + 69: iconst_3 + 70: newarray I + 72: dup + 73: iconst_0 + 74: iconst_1 + 75: iastore + 76: dup + 77: iconst_1 + 78: iconst_2 + 79: iastore + 80: dup + 81: iconst_2 + 82: iconst_3 + 83: iastore + 84: aastore + 85: dup + 86: iconst_1 + 87: iconst_3 + 88: newarray I + 90: dup + 91: iconst_0 + 92: iconst_4 + 93: iastore + 94: dup + 95: iconst_1 + 96: iconst_5 + 97: iastore + 98: dup + 99: iconst_2 + 100: bipush 6 + 102: iastore + 103: aastore + 104: pop + 105: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 106 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 106 0 this Ldemo/AllJavaSyntaxes; + void literals(); + Code: + stack=9, locals=9, arguments=0 + 0: bipush 10 + 2: istore_1 /* bin */ + 3: sipush 255 + 6: istore_2 /* hex */ + 7: ldc2_w 1000000 + 10: lstore_3 /* underscore */ + 11: fconst_1 + 12: fstore f + 14: ldc2_w 1000.0 + 17: dstore d + 19: bipush 65 + 21: istore ch + 23: aload_0 /* this */ + 24: iload_1 /* bin */ + 25: iload_2 /* hex */ + 26: lload_3 /* underscore */ + 27: fload f + 29: dload d + 31: iload ch + 33: invokedynamic BootstrapMethod #17, makeConcatWithConstants:(IIJFDC)Ljava/lang/String; + 38: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 41: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---------- ---------------------- + 0 42 0 this Ldemo/AllJavaSyntaxes; + 3 39 1 bin I + 7 35 2 hex I + 11 31 3 underscore J + 14 28 5 f F + 19 23 6 d D + 23 19 8 ch C + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 42 0 this Ldemo/AllJavaSyntaxes; + void textBlock(); + Code: + stack=2, locals=2, arguments=0 + 0: ldc_w "line1\nline2\n" + 3: astore_1 /* text */ + 4: aload_0 /* this */ + 5: aload_1 /* text */ + 6: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes; + 4 6 1 text Ljava/lang/String; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes; + int switchYield(int i); + Code: + stack=1, locals=2, arguments=1 + 0: iload_1 /* i */ + 1: tableswitch { + 0: 20 + default: 25 + } + 20: bipush 10 + 22: goto 26 + 25: iconst_m1 + 26: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 27 0 this Ldemo/AllJavaSyntaxes; + 0 27 1 i I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 27 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 03 14 04 40 01 + void allOperators(); + Code: + stack=3, locals=12, arguments=0 + 0: bipush 10 + 2: istore_1 /* a */ + 3: iconst_3 + 4: istore_2 /* b */ + 5: iload_1 /* a */ + 6: iload_2 /* b */ + 7: idiv + 8: pop + 9: iload_1 /* a */ + 10: iload_2 /* b */ + 11: irem + 12: pop + 13: iinc a, 1 + 16: iinc a, -1 + 19: iinc a, 1 + 22: iinc a, -1 + 25: iload_1 /* a */ + 26: iload_2 /* b */ + 27: if_icmple 30 + 30: ldc_w "x" + 33: instanceof Ljava/lang/String; + 36: pop + 37: iload_1 /* a */ + 38: i2l + 39: lstore_3 /* widened */ + 40: new Ljava/lang/Object; + 43: invokespecial java/lang/Object.:()V + 46: iconst_3 + 47: newarray I + 49: astore array + 51: aload array + 53: iconst_0 + 54: iaload + 55: istore element + 57: aload_0 /* this */ + 58: iload element + 60: invokestatic java/lang/String.valueOf:(I)Ljava/lang/String; + 63: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 66: aload array + 68: arraylength + 69: pop + 70: invokedynamic BootstrapMethod #5, apply:()Ljava/util/function/Function; + 75: pop + 76: invokedynamic BootstrapMethod #18, get:()Ljava/util/function/Supplier; + 81: pop + 82: aload_0 /* this */ + 83: ldc_w "this" + 86: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 89: aload_0 /* this */ + 90: invokespecial java/util/ArrayList.size:()I + 93: pop + 94: invokedynamic BootstrapMethod #19, compare:()Ljava/util/Comparator; + 99: pop + 100: iconst_1 + 101: iconst_1 + 102: multianewarray [[I + 106: astore matrix + 108: aload matrix + 110: iconst_0 + 111: aaload + 112: arraylength + 113: pop + 114: aload_0 /* this */ + 115: invokedynamic BootstrapMethod #20, run:(Ldemo/AllJavaSyntaxes;)Ljava/lang/Runnable; + 120: pop + 121: invokedynamic BootstrapMethod #21, get:()Ljava/util/function/Supplier; + 126: pop + 127: iload_1 /* a */ + 128: tableswitch { + 0: 148 + default: 152 + } + 148: iconst_0 + 149: goto 153 + 152: iconst_1 + 153: istore yielded + 155: getstatic demo/AllJavaSyntaxes.$assertionsDisabled:Z + 158: ifne 174 + 161: iload yielded + 163: ifge 174 + 166: new Ljava/lang/AssertionError; + 169: dup + 170: invokespecial java/lang/AssertionError.:()V + 173: athrow + 174: new Ljava/lang/RuntimeException; + 177: dup + 178: invokespecial java/lang/RuntimeException.:()V + 181: astore exception + 183: aload exception + 185: ifnonnull 188 + 188: iconst_0 + 189: istore i + 191: bipush 10 + 193: istore j + 195: goto 217 + 198: aload_0 /* this */ + 199: iload i + 201: iload j + 203: invokedynamic BootstrapMethod #22, makeConcatWithConstants:(II)Ljava/lang/String; + 208: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 211: iinc i, 1 + 214: iinc j, -1 + 217: iload i + 219: iload j + 221: if_icmplt 198 + 224: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ---------------------------- + 0 225 0 this Ldemo/AllJavaSyntaxes; + 3 222 1 a I + 5 220 2 b I + 40 185 3 widened J + 51 174 5 array [I + 57 168 6 element I + 108 117 7 matrix [[I + 155 70 8 yielded I + 183 42 9 exception Ljava/lang/RuntimeException; + 191 33 10 i I + 195 29 11 j I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 225 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 08 FD 00 1E 01 01 FF 00 75 00 07 07 00 01 01 01 04 07 01 FD 01 07 02 1B 00 00 03 40 01 FC 00 14 01 FC 00 0D 07 00 CC FD 00 09 01 01 12 + void qualifiedNew(demo.AllJavaSyntaxes.Outer outer); + Code: + stack=5, locals=2, arguments=1 + 0: new Ldemo/AllJavaSyntaxes$Outer$Inner; + 3: aload_1 /* outer */ + 4: dup + 5: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 8: pop + 9: invokespecial demo/AllJavaSyntaxes$Outer$Inner.:(Ldemo/AllJavaSyntaxes$Outer;)V + 12: new Ldemo/AllJavaSyntaxes$Outer$Inner$Deep; + 15: new Ldemo/AllJavaSyntaxes$Outer$Inner; + 18: dup + 19: aload_1 /* outer */ + 20: dup + 21: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 24: pop + 25: invokespecial demo/AllJavaSyntaxes$Outer$Inner.:(Ldemo/AllJavaSyntaxes$Outer;)V + 28: dup + 29: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 32: pop + 33: invokespecial demo/AllJavaSyntaxes$Outer$Inner$Deep.:(Ldemo/AllJavaSyntaxes$Outer$Inner;)V + 36: new Ldemo/AllJavaSyntaxes$Outer$Inner; + 39: aload_1 /* outer */ + 40: dup + 41: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 44: pop + 45: invokespecial demo/AllJavaSyntaxes$Outer$Inner.:(Ldemo/AllJavaSyntaxes$Outer;)V + 48: new Ldemo/AllJavaSyntaxes$Outer$Inner; + 51: new Ldemo/AllJavaSyntaxes$Outer; + 54: dup + 55: aload_0 /* this */ + 56: dup + 57: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 60: pop + 61: invokespecial demo/AllJavaSyntaxes$Outer.:(Ldemo/AllJavaSyntaxes;)V + 64: dup + 65: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 68: pop + 69: invokespecial demo/AllJavaSyntaxes$Outer$Inner.:(Ldemo/AllJavaSyntaxes$Outer;)V + 72: new Ldemo/AllJavaSyntaxes$1; + 75: aload_0 /* this */ + 76: aload_1 /* outer */ + 77: dup + 78: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 81: pop + 82: invokespecial demo/AllJavaSyntaxes$1.:(Ldemo/AllJavaSyntaxes;Ldemo/AllJavaSyntaxes$Outer;)V + 85: new Ldemo/AllJavaSyntaxes$Outer$StaticNested; + 88: invokespecial demo/AllJavaSyntaxes$Outer$StaticNested.:()V + 91: new Ldemo/AllJavaSyntaxes$Outer$StaticNested; + 94: invokespecial demo/AllJavaSyntaxes$Outer$StaticNested.:()V + 97: return + Signature: + (Ldemo/AllJavaSyntaxes$Outer;)V [from metadata: (Ldemo/AllJavaSyntaxes.Outer;)V] + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------------- + 0 98 0 this Ldemo/AllJavaSyntaxes; + 0 98 1 outer Ldemo/AllJavaSyntaxes$Outer; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------------- + 0 98 0 this Ldemo/AllJavaSyntaxes; + 0 98 1 outer Ldemo/AllJavaSyntaxes$Outer; + void receiverParameter(); + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: ldc_w "receiver" + 4: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 7: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 8 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 8 0 this Ldemo/AllJavaSyntaxes; + void diamondAnonymous(); + Code: + stack=4, locals=2, arguments=0 + 0: new Ldemo/AllJavaSyntaxes$2; + 3: dup + 4: aload_0 /* this */ + 5: invokespecial demo/AllJavaSyntaxes$2.:(Ldemo/AllJavaSyntaxes;)V + 8: astore_1 /* c */ + 9: aload_0 /* this */ + 10: aload_1 /* c */ + 11: ldc_w "a" + 14: ldc_w "b" + 17: invokeinterface java/util/Comparator.compare:(Ljava/lang/Object;Ljava/lang/Object;)I + 22: invokestatic java/lang/String.valueOf:(I)Ljava/lang/String; + 25: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 28: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 29 0 this Ldemo/AllJavaSyntaxes; + 9 20 1 c Ljava/util/Comparator; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------------------ + 0 29 0 this Ldemo/AllJavaSyntaxes; + 9 20 1 c Ljava/util/Comparator; + void emptyStatement(boolean flag); + Code: + stack=1, locals=2, arguments=1 + 0: iload_1 /* flag */ + 1: ifne 0 + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes; + 0 5 1 flag Z + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes; + StackMapTable: 00 01 00 + void multiDimVarargs(int[]... values); + Flags: VARARGS + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 /* values */ + 2: arraylength + 3: invokestatic java/lang/String.valueOf:(I)Ljava/lang/String; + 6: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ---------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes; + 0 10 1 values [[I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes; + double strict(double a, double b); + Code: + stack=4, locals=5, arguments=2 + 0: dload_1 /* a */ + 1: dload_3 + 2: ddiv + 3: dreturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 4 0 this Ldemo/AllJavaSyntaxes; + 0 4 1 a D + 0 4 3 b D + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 4 0 this Ldemo/AllJavaSyntaxes; + void chainedAssignment(); + Code: + stack=3, locals=4, arguments=0 + 0: bipush 10 + 2: dup + 3: istore_3 /* c */ + 4: dup + 5: istore_2 /* b */ + 6: istore_1 /* a */ + 7: aload_0 /* this */ + 8: iload_1 /* a */ + 9: iload_2 /* b */ + 10: iadd + 11: iload_3 /* c */ + 12: iadd + 13: invokestatic java/lang/String.valueOf:(I)Ljava/lang/String; + 16: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 19: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + 7 13 1 a I + 6 14 2 b I + 4 16 3 c I + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 20 0 this Ldemo/AllJavaSyntaxes; + void parameterAnnotation(java.lang.String value); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 /* value */ + 2: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 5: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ---------------------- + 0 6 0 this Ldemo/AllJavaSyntaxes; + 0 6 1 value Ljava/lang/String; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 6 0 this Ldemo/AllJavaSyntaxes; + public int compareTo(java.lang.Object p0); + Flags: PUBLIC, BRIDGE, SYNTHETIC + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 + 1: aload_1 + 2: checkcast Ljava/lang/Comparable; + 5: invokevirtual demo/AllJavaSyntaxes.compareTo:(Ljava/lang/Comparable;)I + 8: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + static int[] $SWITCH_TABLE$demo$AllJavaSyntaxes$Day(); + Flags: STATIC, SYNTHETIC + Code: + stack=3, locals=1, arguments=0 + 0: getstatic demo/AllJavaSyntaxes.$SWITCH_TABLE$demo$AllJavaSyntaxes$Day:[I + 3: dup + 4: ifnull 8 + 7: areturn + 8: pop + 9: invokestatic demo/AllJavaSyntaxes$Day.values:()[Ldemo/AllJavaSyntaxes$Day; + 12: arraylength + 13: newarray I + 15: astore_0 + 16: aload_0 + 17: getstatic demo/AllJavaSyntaxes$Day.FRIDAY:Ldemo/AllJavaSyntaxes$Day; + 20: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 23: iconst_5 + 24: iastore + 25: goto 29 + 28: pop + 29: aload_0 + 30: getstatic demo/AllJavaSyntaxes$Day.MONDAY:Ldemo/AllJavaSyntaxes$Day; + 33: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 36: iconst_1 + 37: iastore + 38: goto 42 + 41: pop + 42: aload_0 + 43: getstatic demo/AllJavaSyntaxes$Day.SATURDAY:Ldemo/AllJavaSyntaxes$Day; + 46: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 49: bipush 6 + 51: iastore + 52: goto 56 + 55: pop + 56: aload_0 + 57: getstatic demo/AllJavaSyntaxes$Day.SUNDAY:Ldemo/AllJavaSyntaxes$Day; + 60: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 63: bipush 7 + 65: iastore + 66: goto 70 + 69: pop + 70: aload_0 + 71: getstatic demo/AllJavaSyntaxes$Day.THURSDAY:Ldemo/AllJavaSyntaxes$Day; + 74: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 77: iconst_4 + 78: iastore + 79: goto 83 + 82: pop + 83: aload_0 + 84: getstatic demo/AllJavaSyntaxes$Day.TUESDAY:Ldemo/AllJavaSyntaxes$Day; + 87: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 90: iconst_2 + 91: iastore + 92: goto 96 + 95: pop + 96: aload_0 + 97: getstatic demo/AllJavaSyntaxes$Day.WEDNESDAY:Ldemo/AllJavaSyntaxes$Day; + 100: invokevirtual demo/AllJavaSyntaxes$Day.ordinal:()I + 103: iconst_3 + 104: iastore + 105: goto 109 + 108: pop + 109: aload_0 + 110: dup + 111: putstatic demo/AllJavaSyntaxes.$SWITCH_TABLE$demo$AllJavaSyntaxes$Day:[I + 114: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + StackMapTable: 00 0F 48 07 01 FD FF 00 13 00 01 07 01 FD 00 01 07 02 77 00 4B 07 02 77 00 4C 07 02 77 00 4C 07 02 77 00 4B 07 02 77 00 4B 07 02 77 00 4B 07 02 77 00 + Exceptions: + Try Handler + Start End Start End Type + ----- ----- ----- ----- ---------------------------- + 16 25 28 29 Ljava/lang/NoSuchFieldError; + 29 38 41 42 Ljava/lang/NoSuchFieldError; + 42 52 55 56 Ljava/lang/NoSuchFieldError; + 56 66 69 70 Ljava/lang/NoSuchFieldError; + 70 79 82 83 Ljava/lang/NoSuchFieldError; + 83 92 95 96 Ljava/lang/NoSuchFieldError; + 96 105 108 109 Ljava/lang/NoSuchFieldError; + private static java.lang.String lambda$0() throws java.lang.Exception; + Flags: PRIVATE, STATIC, SYNTHETIC + Code: + stack=1, locals=0, arguments=0 + 0: ldc_w "callable" + 3: areturn + Exceptions: + throws java.lang.Exception + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private static java.lang.Object[] lambda$3(int p0); + Flags: PRIVATE, STATIC, SYNTHETIC + Code: + stack=1, locals=1, arguments=1 + 0: iload_0 + 1: anewarray Ljava/lang/Object; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private static java.lang.String lambda$4(); + Flags: PRIVATE, STATIC, SYNTHETIC + Code: + stack=1, locals=0, arguments=0 + 0: ldc_w "value" + 3: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private void lambda$6(java.lang.Integer length); + Flags: PRIVATE, SYNTHETIC + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 /* length */ + 2: invokestatic java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String; + 5: invokedynamic BootstrapMethod #23, makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; + 10: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 13: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ---------------------- + 0 14 0 this Ldemo/AllJavaSyntaxes; + 0 14 1 length Ljava/lang/Integer; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 14 0 this Ldemo/AllJavaSyntaxes; + private static int lambda$7(java.lang.String a, java.lang.String b); + Flags: PRIVATE, STATIC, SYNTHETIC + Code: + stack=2, locals=2, arguments=2 + 0: aload_1 /* b */ + 1: aload_0 /* a */ + 2: invokevirtual java/lang/String.compareTo:(Ljava/lang/String;)I + 5: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------ + 0 6 0 a Ljava/lang/String; + 0 6 1 b Ljava/lang/String; + private static int lambda$8(java.lang.String a, java.lang.String b); + Flags: PRIVATE, STATIC, SYNTHETIC + Code: + stack=2, locals=2, arguments=2 + 0: aload_1 /* b */ + 1: aload_0 /* a */ + 2: invokevirtual java/lang/String.compareTo:(Ljava/lang/String;)I + 5: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------ + 0 6 0 a Ljava/lang/String; + 0 6 1 b Ljava/lang/String; + private static java.lang.IllegalArgumentException lambda$10(); + Flags: PRIVATE, STATIC, SYNTHETIC + Code: + stack=2, locals=0, arguments=0 + 0: new Ljava/lang/IllegalArgumentException; + 3: dup + 4: invokespecial java/lang/IllegalArgumentException.:()V + 7: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private static java.lang.Integer lambda$12(); + Flags: PRIVATE, STATIC, SYNTHETIC + Code: + stack=1, locals=0, arguments=0 + 0: bipush 42 + 2: invokestatic java/lang/Integer.valueOf:(I)Ljava/lang/Integer; + 5: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private void lambda$14(); + Flags: PRIVATE, SYNTHETIC + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: ldc_w "run" + 4: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 7: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------- + 0 8 0 this Ldemo/AllJavaSyntaxes; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 8 0 this Ldemo/AllJavaSyntaxes; +interface demo.AllJavaSyntaxes.AdvancedInterface + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface AdvancedInterface = demo/AllJavaSyntaxes$AdvancedInterface of demo/AllJavaSyntaxes + NestHost: 00 17 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$AdvancedInterface + 2: Utf8StringConstant "demo/AllJavaSyntaxes$AdvancedInterface" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "defaultMethod" + 6: Utf8StringConstant "()Ljava/lang/String;" + 7: Utf8StringConstant "Code" + 8: InterfaceMethodReference #1.#9 // demo/AllJavaSyntaxes$AdvancedInterface.privateHelper:()Ljava/lang/String; + 9: NameAndTypeDescriptor #10.#6 // privateHelper:()Ljava/lang/String; + 10: Utf8StringConstant "privateHelper" + 11: Utf8StringConstant "LineNumberTable" + 12: Utf8StringConstant "LocalVariableTable" + 13: Utf8StringConstant "this" + 14: Utf8StringConstant "Ldemo/AllJavaSyntaxes$AdvancedInterface;" + 15: Utf8StringConstant "staticMethod" + 16: StringConstant #17 // "static" + 17: Utf8StringConstant "static" + 18: StringConstant #19 // "private" + 19: Utf8StringConstant "private" + 20: Utf8StringConstant "SourceFile" + 21: Utf8StringConstant "AllJavaSyntaxes.java" + 22: Utf8StringConstant "InnerClasses" + 23: TypeInfo #24 // demo/AllJavaSyntaxes + 24: Utf8StringConstant "demo/AllJavaSyntaxes" + 25: Utf8StringConstant "AdvancedInterface" + 26: Utf8StringConstant "NestHost" + public java.lang.String defaultMethod(); + Flags: PUBLIC, DEFAULT + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokeinterface demo/AllJavaSyntaxes$AdvancedInterface.privateHelper:()Ljava/lang/String; + 6: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------------- + 0 7 0 this Ldemo/AllJavaSyntaxes$AdvancedInterface; + public static java.lang.String staticMethod(); + Flags: PUBLIC, DEFAULT, STATIC + Code: + stack=1, locals=0, arguments=0 + 0: ldc "static" + 2: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private java.lang.String privateHelper(); + Flags: PRIVATE, DEFAULT + Code: + stack=1, locals=1, arguments=0 + 0: ldc "private" + 2: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------------- + 0 3 0 this Ldemo/AllJavaSyntaxes$AdvancedInterface; +class demo.AllJavaSyntaxes.Base + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static Base = demo/AllJavaSyntaxes$Base of demo/AllJavaSyntaxes + NestHost: 00 15 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Base + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Base" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: Utf8StringConstant "Code" + 8: MethodReference #3.#9 // java/lang/Object.:()V + 9: NameAndTypeDescriptor #5.#6 // :()V + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Base;" + 14: Utf8StringConstant "value" + 15: Utf8StringConstant "()Ljava/lang/String;" + 16: StringConstant #17 // "base" + 17: Utf8StringConstant "base" + 18: Utf8StringConstant "SourceFile" + 19: Utf8StringConstant "AllJavaSyntaxes.java" + 20: Utf8StringConstant "InnerClasses" + 21: TypeInfo #22 // demo/AllJavaSyntaxes + 22: Utf8StringConstant "demo/AllJavaSyntaxes" + 23: Utf8StringConstant "Base" + 24: Utf8StringConstant "NestHost" + void (); + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$Base; + java.lang.String value(); + Code: + stack=1, locals=1, arguments=0 + 0: ldc "base" + 2: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------- + 0 3 0 this Ldemo/AllJavaSyntaxes$Base; +class demo.AllJavaSyntaxes.Circle + Minor version: 0 + Major version: 69 + Flags: STATIC, FINAL, SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + static final Circle = demo/AllJavaSyntaxes$Circle of demo/AllJavaSyntaxes + abstract static interface Shape = demo/AllJavaSyntaxes$Shape of demo/AllJavaSyntaxes + NestHost: 00 1E + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Circle + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Circle" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // demo/AllJavaSyntaxes$Shape + 6: Utf8StringConstant "demo/AllJavaSyntaxes$Shape" + 7: Utf8StringConstant "radius" + 8: Utf8StringConstant "D" + 9: Utf8StringConstant "" + 10: Utf8StringConstant "(D)V" + 11: Utf8StringConstant "Code" + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #9.#14 // :()V + 14: Utf8StringConstant "()V" + 15: FieldReference #1.#16 // demo/AllJavaSyntaxes$Circle.radius:D + 16: NameAndTypeDescriptor #7.#8 // radius:D + 17: Utf8StringConstant "LineNumberTable" + 18: Utf8StringConstant "LocalVariableTable" + 19: Utf8StringConstant "this" + 20: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Circle;" + 21: Utf8StringConstant "area" + 22: Utf8StringConstant "()D" + 23: TypeInfo #24 // java/lang/Math + 24: Utf8StringConstant "java/lang/Math" + 25: DoubleConstant 3.141592653589793 + 27: Utf8StringConstant "SourceFile" + 28: Utf8StringConstant "AllJavaSyntaxes.java" + 29: Utf8StringConstant "InnerClasses" + 30: TypeInfo #31 // demo/AllJavaSyntaxes + 31: Utf8StringConstant "demo/AllJavaSyntaxes" + 32: Utf8StringConstant "Circle" + 33: Utf8StringConstant "Shape" + 34: Utf8StringConstant "NestHost" + private final double radius; + Flags: PRIVATE, FINAL + void (double radius); + Code: + stack=3, locals=3, arguments=1 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: aload_0 /* this */ + 5: dload_1 /* radius */ + 6: putfield demo/AllJavaSyntaxes$Circle.radius:D + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ ----------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$Circle; + 0 10 1 radius D + public double area(); + Flags: PUBLIC + Code: + stack=4, locals=1, arguments=0 + 0: ldc2_w 3.141592653589793 + 3: aload_0 /* this */ + 4: getfield demo/AllJavaSyntaxes$Circle.radius:D + 7: dmul + 8: aload_0 /* this */ + 9: getfield demo/AllJavaSyntaxes$Circle.radius:D + 12: dmul + 13: dreturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 14 0 this Ldemo/AllJavaSyntaxes$Circle; +interface demo.AllJavaSyntaxes.Shape + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, SEALED, INTERFACE + SourceFile: AllJavaSyntaxes.java + PermittedSubclasses: demo/AllJavaSyntaxes$Circle, demo/AllJavaSyntaxes$Rectangle + InnerClasses: + static final Circle = demo/AllJavaSyntaxes$Circle of demo/AllJavaSyntaxes + static final Rectangle = demo/AllJavaSyntaxes$Rectangle of demo/AllJavaSyntaxes + abstract static interface Shape = demo/AllJavaSyntaxes$Shape of demo/AllJavaSyntaxes + NestHost: 00 0F + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Shape + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Shape" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "area" + 6: Utf8StringConstant "()D" + 7: Utf8StringConstant "SourceFile" + 8: Utf8StringConstant "AllJavaSyntaxes.java" + 9: Utf8StringConstant "PermittedSubclasses" + 10: TypeInfo #11 // demo/AllJavaSyntaxes$Circle + 11: Utf8StringConstant "demo/AllJavaSyntaxes$Circle" + 12: TypeInfo #13 // demo/AllJavaSyntaxes$Rectangle + 13: Utf8StringConstant "demo/AllJavaSyntaxes$Rectangle" + 14: Utf8StringConstant "InnerClasses" + 15: TypeInfo #16 // demo/AllJavaSyntaxes + 16: Utf8StringConstant "demo/AllJavaSyntaxes" + 17: Utf8StringConstant "Circle" + 18: Utf8StringConstant "Rectangle" + 19: Utf8StringConstant "Shape" + 20: Utf8StringConstant "NestHost" + public abstract double area(); + Flags: PUBLIC, ABSTRACT +class demo.AllJavaSyntaxes.Rectangle + Minor version: 0 + Major version: 69 + Flags: STATIC, FINAL, SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + static final Rectangle = demo/AllJavaSyntaxes$Rectangle of demo/AllJavaSyntaxes + abstract static interface Shape = demo/AllJavaSyntaxes$Shape of demo/AllJavaSyntaxes + NestHost: 00 1D + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Rectangle + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Rectangle" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // demo/AllJavaSyntaxes$Shape + 6: Utf8StringConstant "demo/AllJavaSyntaxes$Shape" + 7: Utf8StringConstant "width" + 8: Utf8StringConstant "D" + 9: Utf8StringConstant "height" + 10: Utf8StringConstant "" + 11: Utf8StringConstant "(DD)V" + 12: Utf8StringConstant "Code" + 13: MethodReference #3.#14 // java/lang/Object.:()V + 14: NameAndTypeDescriptor #10.#15 // :()V + 15: Utf8StringConstant "()V" + 16: FieldReference #1.#17 // demo/AllJavaSyntaxes$Rectangle.width:D + 17: NameAndTypeDescriptor #7.#8 // width:D + 18: FieldReference #1.#19 // demo/AllJavaSyntaxes$Rectangle.height:D + 19: NameAndTypeDescriptor #9.#8 // height:D + 20: Utf8StringConstant "LineNumberTable" + 21: Utf8StringConstant "LocalVariableTable" + 22: Utf8StringConstant "this" + 23: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Rectangle;" + 24: Utf8StringConstant "area" + 25: Utf8StringConstant "()D" + 26: Utf8StringConstant "SourceFile" + 27: Utf8StringConstant "AllJavaSyntaxes.java" + 28: Utf8StringConstant "InnerClasses" + 29: TypeInfo #30 // demo/AllJavaSyntaxes + 30: Utf8StringConstant "demo/AllJavaSyntaxes" + 31: Utf8StringConstant "Rectangle" + 32: Utf8StringConstant "Shape" + 33: Utf8StringConstant "NestHost" + private final double width; + Flags: PRIVATE, FINAL + private final double height; + Flags: PRIVATE, FINAL + void (double width, double height); + Code: + stack=3, locals=5, arguments=2 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: aload_0 /* this */ + 5: dload_1 /* width */ + 6: putfield demo/AllJavaSyntaxes$Rectangle.width:D + 9: aload_0 /* this */ + 10: dload_3 + 11: putfield demo/AllJavaSyntaxes$Rectangle.height:D + 14: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ------ -------------------------------- + 0 15 0 this Ldemo/AllJavaSyntaxes$Rectangle; + 0 15 1 width D + 0 15 3 height D + public double area(); + Flags: PUBLIC + Code: + stack=4, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Rectangle.width:D + 4: aload_0 /* this */ + 5: getfield demo/AllJavaSyntaxes$Rectangle.height:D + 8: dmul + 9: dreturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$Rectangle; +enum demo.AllJavaSyntaxes.Day + Minor version: 0 + Major version: 69 + Flags: STATIC, FINAL, SUPER, ENUM + SourceFile: AllJavaSyntaxes.java + Signature: Ljava/lang/Enum; + InnerClasses: + static final enum Day = demo/AllJavaSyntaxes$Day of demo/AllJavaSyntaxes + NestHost: 00 43 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Day + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Day" + 3: TypeInfo #4 // java/lang/Enum + 4: Utf8StringConstant "java/lang/Enum" + 5: Utf8StringConstant "MONDAY" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Day;" + 7: Utf8StringConstant "Signature" + 8: Utf8StringConstant "TUESDAY" + 9: Utf8StringConstant "WEDNESDAY" + 10: Utf8StringConstant "THURSDAY" + 11: Utf8StringConstant "FRIDAY" + 12: Utf8StringConstant "SATURDAY" + 13: Utf8StringConstant "SUNDAY" + 14: Utf8StringConstant "ENUM$VALUES" + 15: Utf8StringConstant "[Ldemo/AllJavaSyntaxes$Day;" + 16: Utf8StringConstant "" + 17: Utf8StringConstant "()V" + 18: Utf8StringConstant "Code" + 19: StringConstant #5 // "MONDAY" + 20: MethodReference #1.#21 // demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 21: NameAndTypeDescriptor #22.#23 // :(Ljava/lang/String;I)V + 22: Utf8StringConstant "" + 23: Utf8StringConstant "(Ljava/lang/String;I)V" + 24: FieldReference #1.#25 // demo/AllJavaSyntaxes$Day.MONDAY:Ldemo/AllJavaSyntaxes$Day; + 25: NameAndTypeDescriptor #5.#6 // MONDAY:Ldemo/AllJavaSyntaxes$Day; + 26: StringConstant #8 // "TUESDAY" + 27: FieldReference #1.#28 // demo/AllJavaSyntaxes$Day.TUESDAY:Ldemo/AllJavaSyntaxes$Day; + 28: NameAndTypeDescriptor #8.#6 // TUESDAY:Ldemo/AllJavaSyntaxes$Day; + 29: StringConstant #9 // "WEDNESDAY" + 30: FieldReference #1.#31 // demo/AllJavaSyntaxes$Day.WEDNESDAY:Ldemo/AllJavaSyntaxes$Day; + 31: NameAndTypeDescriptor #9.#6 // WEDNESDAY:Ldemo/AllJavaSyntaxes$Day; + 32: StringConstant #10 // "THURSDAY" + 33: FieldReference #1.#34 // demo/AllJavaSyntaxes$Day.THURSDAY:Ldemo/AllJavaSyntaxes$Day; + 34: NameAndTypeDescriptor #10.#6 // THURSDAY:Ldemo/AllJavaSyntaxes$Day; + 35: StringConstant #11 // "FRIDAY" + 36: FieldReference #1.#37 // demo/AllJavaSyntaxes$Day.FRIDAY:Ldemo/AllJavaSyntaxes$Day; + 37: NameAndTypeDescriptor #11.#6 // FRIDAY:Ldemo/AllJavaSyntaxes$Day; + 38: StringConstant #12 // "SATURDAY" + 39: FieldReference #1.#40 // demo/AllJavaSyntaxes$Day.SATURDAY:Ldemo/AllJavaSyntaxes$Day; + 40: NameAndTypeDescriptor #12.#6 // SATURDAY:Ldemo/AllJavaSyntaxes$Day; + 41: StringConstant #13 // "SUNDAY" + 42: FieldReference #1.#43 // demo/AllJavaSyntaxes$Day.SUNDAY:Ldemo/AllJavaSyntaxes$Day; + 43: NameAndTypeDescriptor #13.#6 // SUNDAY:Ldemo/AllJavaSyntaxes$Day; + 44: FieldReference #1.#45 // demo/AllJavaSyntaxes$Day.ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Day; + 45: NameAndTypeDescriptor #14.#15 // ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Day; + 46: Utf8StringConstant "LineNumberTable" + 47: Utf8StringConstant "LocalVariableTable" + 48: MethodReference #3.#21 // java/lang/Enum.:(Ljava/lang/String;I)V + 49: Utf8StringConstant "this" + 50: Utf8StringConstant "values" + 51: Utf8StringConstant "()[Ldemo/AllJavaSyntaxes$Day;" + 52: MethodReference #53.#55 // java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V + 53: TypeInfo #54 // java/lang/System + 54: Utf8StringConstant "java/lang/System" + 55: NameAndTypeDescriptor #56.#57 // arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V + 56: Utf8StringConstant "arraycopy" + 57: Utf8StringConstant "(Ljava/lang/Object;ILjava/lang/Object;II)V" + 58: Utf8StringConstant "valueOf" + 59: Utf8StringConstant "(Ljava/lang/String;)Ldemo/AllJavaSyntaxes$Day;" + 60: MethodReference #3.#61 // java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; + 61: NameAndTypeDescriptor #58.#62 // valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; + 62: Utf8StringConstant "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;" + 63: Utf8StringConstant "SourceFile" + 64: Utf8StringConstant "AllJavaSyntaxes.java" + 65: Utf8StringConstant "Ljava/lang/Enum;" + 66: Utf8StringConstant "InnerClasses" + 67: TypeInfo #68 // demo/AllJavaSyntaxes + 68: Utf8StringConstant "demo/AllJavaSyntaxes" + 69: Utf8StringConstant "Day" + 70: Utf8StringConstant "NestHost" + public static final demo.AllJavaSyntaxes.Day MONDAY; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Day; + public static final demo.AllJavaSyntaxes.Day TUESDAY; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Day; + public static final demo.AllJavaSyntaxes.Day WEDNESDAY; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Day; + public static final demo.AllJavaSyntaxes.Day THURSDAY; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Day; + public static final demo.AllJavaSyntaxes.Day FRIDAY; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Day; + public static final demo.AllJavaSyntaxes.Day SATURDAY; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Day; + public static final demo.AllJavaSyntaxes.Day SUNDAY; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Day; + private static final demo.AllJavaSyntaxes.Day[] ENUM$VALUES; + Flags: PRIVATE, STATIC, FINAL, SYNTHETIC + static {}; + Flags: STATIC + Code: + stack=4, locals=0, arguments=0 + 0: new Ldemo/AllJavaSyntaxes$Day; + 3: dup + 4: ldc "MONDAY" + 6: iconst_0 + 7: invokespecial demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 10: putstatic demo/AllJavaSyntaxes$Day.MONDAY:Ldemo/AllJavaSyntaxes$Day; + 13: new Ldemo/AllJavaSyntaxes$Day; + 16: dup + 17: ldc "TUESDAY" + 19: iconst_1 + 20: invokespecial demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 23: putstatic demo/AllJavaSyntaxes$Day.TUESDAY:Ldemo/AllJavaSyntaxes$Day; + 26: new Ldemo/AllJavaSyntaxes$Day; + 29: dup + 30: ldc "WEDNESDAY" + 32: iconst_2 + 33: invokespecial demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 36: putstatic demo/AllJavaSyntaxes$Day.WEDNESDAY:Ldemo/AllJavaSyntaxes$Day; + 39: new Ldemo/AllJavaSyntaxes$Day; + 42: dup + 43: ldc "THURSDAY" + 45: iconst_3 + 46: invokespecial demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 49: putstatic demo/AllJavaSyntaxes$Day.THURSDAY:Ldemo/AllJavaSyntaxes$Day; + 52: new Ldemo/AllJavaSyntaxes$Day; + 55: dup + 56: ldc "FRIDAY" + 58: iconst_4 + 59: invokespecial demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 62: putstatic demo/AllJavaSyntaxes$Day.FRIDAY:Ldemo/AllJavaSyntaxes$Day; + 65: new Ldemo/AllJavaSyntaxes$Day; + 68: dup + 69: ldc "SATURDAY" + 71: iconst_5 + 72: invokespecial demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 75: putstatic demo/AllJavaSyntaxes$Day.SATURDAY:Ldemo/AllJavaSyntaxes$Day; + 78: new Ldemo/AllJavaSyntaxes$Day; + 81: dup + 82: ldc "SUNDAY" + 84: bipush 6 + 86: invokespecial demo/AllJavaSyntaxes$Day.:(Ljava/lang/String;I)V + 89: putstatic demo/AllJavaSyntaxes$Day.SUNDAY:Ldemo/AllJavaSyntaxes$Day; + 92: bipush 7 + 94: anewarray Ldemo/AllJavaSyntaxes$Day; + 97: dup + 98: iconst_0 + 99: getstatic demo/AllJavaSyntaxes$Day.MONDAY:Ldemo/AllJavaSyntaxes$Day; + 102: aastore + 103: dup + 104: iconst_1 + 105: getstatic demo/AllJavaSyntaxes$Day.TUESDAY:Ldemo/AllJavaSyntaxes$Day; + 108: aastore + 109: dup + 110: iconst_2 + 111: getstatic demo/AllJavaSyntaxes$Day.WEDNESDAY:Ldemo/AllJavaSyntaxes$Day; + 114: aastore + 115: dup + 116: iconst_3 + 117: getstatic demo/AllJavaSyntaxes$Day.THURSDAY:Ldemo/AllJavaSyntaxes$Day; + 120: aastore + 121: dup + 122: iconst_4 + 123: getstatic demo/AllJavaSyntaxes$Day.FRIDAY:Ldemo/AllJavaSyntaxes$Day; + 126: aastore + 127: dup + 128: iconst_5 + 129: getstatic demo/AllJavaSyntaxes$Day.SATURDAY:Ldemo/AllJavaSyntaxes$Day; + 132: aastore + 133: dup + 134: bipush 6 + 136: getstatic demo/AllJavaSyntaxes$Day.SUNDAY:Ldemo/AllJavaSyntaxes$Day; + 139: aastore + 140: putstatic demo/AllJavaSyntaxes$Day.ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Day; + 143: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private void (java.lang.String p0, int p1); + Flags: PRIVATE + Code: + stack=3, locals=3, arguments=2 + 0: aload_0 /* this */ + 1: aload_1 + 2: iload_2 + 3: invokespecial java/lang/Enum.:(Ljava/lang/String;I)V + 6: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------- + 0 7 0 this Ldemo/AllJavaSyntaxes$Day; + public static demo.AllJavaSyntaxes.Day[] values(); + Flags: PUBLIC, STATIC + Code: + stack=5, locals=3, arguments=0 + 0: getstatic demo/AllJavaSyntaxes$Day.ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Day; + 3: dup + 4: astore_0 + 5: iconst_0 + 6: aload_0 + 7: arraylength + 8: dup + 9: istore_1 + 10: anewarray Ldemo/AllJavaSyntaxes$Day; + 13: dup + 14: astore_2 + 15: iconst_0 + 16: iload_1 + 17: invokestatic java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V + 20: aload_2 + 21: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + public static demo.AllJavaSyntaxes.Day valueOf(java.lang.String p0); + Flags: PUBLIC, STATIC + Code: + stack=2, locals=1, arguments=1 + 0: ldc Ldemo/AllJavaSyntaxes$Day;.class + 2: aload_0 + 3: invokestatic java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; + 6: checkcast Ldemo/AllJavaSyntaxes$Day; + 9: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +class demo.AllJavaSyntaxes.Derived + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static Base = demo/AllJavaSyntaxes$Base of demo/AllJavaSyntaxes + Derived = demo/AllJavaSyntaxes$Derived of demo/AllJavaSyntaxes + NestHost: 00 22 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Derived + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Derived" + 3: TypeInfo #4 // demo/AllJavaSyntaxes$Base + 4: Utf8StringConstant "demo/AllJavaSyntaxes$Base" + 5: Utf8StringConstant "this$0" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 9: Utf8StringConstant "Code" + 10: StringConstant #11 // "x" + 11: Utf8StringConstant "x" + 12: MethodReference #1.#13 // demo/AllJavaSyntaxes$Derived.:(Ldemo/AllJavaSyntaxes;Ljava/lang/String;)V + 13: NameAndTypeDescriptor #7.#14 // :(Ldemo/AllJavaSyntaxes;Ljava/lang/String;)V + 14: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;Ljava/lang/String;)V" + 15: Utf8StringConstant "LineNumberTable" + 16: Utf8StringConstant "LocalVariableTable" + 17: Utf8StringConstant "this" + 18: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Derived;" + 19: FieldReference #1.#20 // demo/AllJavaSyntaxes$Derived.this$0:Ldemo/AllJavaSyntaxes; + 20: NameAndTypeDescriptor #5.#6 // this$0:Ldemo/AllJavaSyntaxes; + 21: MethodReference #3.#22 // demo/AllJavaSyntaxes$Base.:()V + 22: NameAndTypeDescriptor #7.#23 // :()V + 23: Utf8StringConstant "()V" + 24: Utf8StringConstant "s" + 25: Utf8StringConstant "Ljava/lang/String;" + 26: Utf8StringConstant "value" + 27: Utf8StringConstant "()Ljava/lang/String;" + 28: MethodReference #3.#29 // demo/AllJavaSyntaxes$Base.value:()Ljava/lang/String; + 29: NameAndTypeDescriptor #26.#27 // value:()Ljava/lang/String; + 30: Utf8StringConstant "qualifiedThis" + 31: StringConstant #32 // "qualified" + 32: Utf8StringConstant "qualified" + 33: MethodReference #34.#36 // demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 34: TypeInfo #35 // demo/AllJavaSyntaxes + 35: Utf8StringConstant "demo/AllJavaSyntaxes" + 36: NameAndTypeDescriptor #37.#38 // log:(Ljava/lang/String;)V + 37: Utf8StringConstant "log" + 38: Utf8StringConstant "(Ljava/lang/String;)V" + 39: Utf8StringConstant "SourceFile" + 40: Utf8StringConstant "AllJavaSyntaxes.java" + 41: Utf8StringConstant "InnerClasses" + 42: Utf8StringConstant "Base" + 43: Utf8StringConstant "Derived" + 44: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Code: + stack=3, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: ldc "x" + 4: invokespecial demo/AllJavaSyntaxes$Derived.:(Ldemo/AllJavaSyntaxes;Ljava/lang/String;)V + 7: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 8 0 this Ldemo/AllJavaSyntaxes$Derived; + void (demo.AllJavaSyntaxes p0, java.lang.String s); + Code: + stack=2, locals=3, arguments=2 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$Derived.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: invokespecial demo/AllJavaSyntaxes$Base.:()V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 10 0 this Ldemo/AllJavaSyntaxes$Derived; + 0 10 2 s Ljava/lang/String; + java.lang.String value(); + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial demo/AllJavaSyntaxes$Base.value:()Ljava/lang/String; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 5 0 this Ldemo/AllJavaSyntaxes$Derived; + void qualifiedThis(); + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Derived.this$0:Ldemo/AllJavaSyntaxes; + 4: ldc "qualified" + 6: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 10 0 this Ldemo/AllJavaSyntaxes$Derived; +class demo.AllJavaSyntaxes.Entity + Minor version: 0 + Major version: 69 + Flags: STATIC, SUPER + SourceFile: AllJavaSyntaxes.java + Signature: Ljava/lang/Object;Ldemo/AllJavaSyntaxes$Named;Ldemo/AllJavaSyntaxes$Identified;Ljava/lang/Comparable; + InnerClasses: + static Entity = demo/AllJavaSyntaxes$Entity of demo/AllJavaSyntaxes + abstract static interface Identified = demo/AllJavaSyntaxes$Identified of demo/AllJavaSyntaxes + abstract static interface Named = demo/AllJavaSyntaxes$Named of demo/AllJavaSyntaxes + NestHost: 00 48 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Entity + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Entity" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // demo/AllJavaSyntaxes$Named + 6: Utf8StringConstant "demo/AllJavaSyntaxes$Named" + 7: TypeInfo #8 // demo/AllJavaSyntaxes$Identified + 8: Utf8StringConstant "demo/AllJavaSyntaxes$Identified" + 9: TypeInfo #10 // java/lang/Comparable + 10: Utf8StringConstant "java/lang/Comparable" + 11: Utf8StringConstant "id" + 12: Utf8StringConstant "J" + 13: Utf8StringConstant "name" + 14: Utf8StringConstant "Ljava/lang/String;" + 15: Utf8StringConstant "" + 16: Utf8StringConstant "(JLjava/lang/String;)V" + 17: Utf8StringConstant "Code" + 18: MethodReference #3.#19 // java/lang/Object.:()V + 19: NameAndTypeDescriptor #15.#20 // :()V + 20: Utf8StringConstant "()V" + 21: FieldReference #1.#22 // demo/AllJavaSyntaxes$Entity.id:J + 22: NameAndTypeDescriptor #11.#12 // id:J + 23: FieldReference #1.#24 // demo/AllJavaSyntaxes$Entity.name:Ljava/lang/String; + 24: NameAndTypeDescriptor #13.#14 // name:Ljava/lang/String; + 25: Utf8StringConstant "LineNumberTable" + 26: Utf8StringConstant "LocalVariableTable" + 27: Utf8StringConstant "this" + 28: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Entity;" + 29: Utf8StringConstant "()Ljava/lang/String;" + 30: Utf8StringConstant "()J" + 31: Utf8StringConstant "hashCode" + 32: Utf8StringConstant "()I" + 33: MethodReference #34.#36 // java/lang/Long.valueOf:(J)Ljava/lang/Long; + 34: TypeInfo #35 // java/lang/Long + 35: Utf8StringConstant "java/lang/Long" + 36: NameAndTypeDescriptor #37.#38 // valueOf:(J)Ljava/lang/Long; + 37: Utf8StringConstant "valueOf" + 38: Utf8StringConstant "(J)Ljava/lang/Long;" + 39: MethodReference #40.#42 // java/util/Objects.hash:([Ljava/lang/Object;)I + 40: TypeInfo #41 // java/util/Objects + 41: Utf8StringConstant "java/util/Objects" + 42: NameAndTypeDescriptor #43.#44 // hash:([Ljava/lang/Object;)I + 43: Utf8StringConstant "hash" + 44: Utf8StringConstant "([Ljava/lang/Object;)I" + 45: Utf8StringConstant "equals" + 46: Utf8StringConstant "(Ljava/lang/Object;)Z" + 47: MethodReference #3.#48 // java/lang/Object.getClass:()Ljava/lang/Class; + 48: NameAndTypeDescriptor #49.#50 // getClass:()Ljava/lang/Class; + 49: Utf8StringConstant "getClass" + 50: Utf8StringConstant "()Ljava/lang/Class;" + 51: MethodReference #40.#52 // java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z + 52: NameAndTypeDescriptor #45.#53 // equals:(Ljava/lang/Object;Ljava/lang/Object;)Z + 53: Utf8StringConstant "(Ljava/lang/Object;Ljava/lang/Object;)Z" + 54: Utf8StringConstant "obj" + 55: Utf8StringConstant "Ljava/lang/Object;" + 56: Utf8StringConstant "other" + 57: Utf8StringConstant "StackMapTable" + 58: Utf8StringConstant "compareTo" + 59: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Entity;)I" + 60: MethodReference #34.#61 // java/lang/Long.compare:(JJ)I + 61: NameAndTypeDescriptor #62.#63 // compare:(JJ)I + 62: Utf8StringConstant "compare" + 63: Utf8StringConstant "(JJ)I" + 64: Utf8StringConstant "(Ljava/lang/Object;)I" + 65: MethodReference #1.#66 // demo/AllJavaSyntaxes$Entity.compareTo:(Ldemo/AllJavaSyntaxes$Entity;)I + 66: NameAndTypeDescriptor #58.#59 // compareTo:(Ldemo/AllJavaSyntaxes$Entity;)I + 67: Utf8StringConstant "SourceFile" + 68: Utf8StringConstant "AllJavaSyntaxes.java" + 69: Utf8StringConstant "Signature" + 70: Utf8StringConstant "Ljava/lang/Object;Ldemo/AllJavaSyntaxes$Named;Ldemo/AllJavaSyntaxes$Identified;Ljava/lang/Comparable;" + 71: Utf8StringConstant "InnerClasses" + 72: TypeInfo #73 // demo/AllJavaSyntaxes + 73: Utf8StringConstant "demo/AllJavaSyntaxes" + 74: Utf8StringConstant "Entity" + 75: Utf8StringConstant "Identified" + 76: Utf8StringConstant "Named" + 77: Utf8StringConstant "NestHost" + private long id; + Flags: PRIVATE + private java.lang.String name; + Flags: PRIVATE + void (long id, java.lang.String name); + Code: + stack=3, locals=4, arguments=2 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: aload_0 /* this */ + 5: lload_1 /* id */ + 6: putfield demo/AllJavaSyntaxes$Entity.id:J + 9: aload_0 /* this */ + 10: aload_3 + 11: putfield demo/AllJavaSyntaxes$Entity.name:Ljava/lang/String; + 14: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 15 0 this Ldemo/AllJavaSyntaxes$Entity; + 0 15 1 id J + 0 15 3 name Ljava/lang/String; + public java.lang.String name(); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Entity.name:Ljava/lang/String; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$Entity; + public long id(); + Flags: PUBLIC + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Entity.id:J + 4: lreturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$Entity; + public int hashCode(); + Flags: PUBLIC + Code: + stack=5, locals=1, arguments=0 + 0: iconst_2 + 1: anewarray Ljava/lang/Object; + 4: dup + 5: iconst_0 + 6: aload_0 /* this */ + 7: getfield demo/AllJavaSyntaxes$Entity.id:J + 10: invokestatic java/lang/Long.valueOf:(J)Ljava/lang/Long; + 13: aastore + 14: dup + 15: iconst_1 + 16: aload_0 /* this */ + 17: getfield demo/AllJavaSyntaxes$Entity.name:Ljava/lang/String; + 20: aastore + 21: invokestatic java/util/Objects.hash:([Ljava/lang/Object;)I + 24: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 25 0 this Ldemo/AllJavaSyntaxes$Entity; + public boolean equals(java.lang.Object obj); + Flags: PUBLIC + Code: + stack=4, locals=3, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 /* obj */ + 2: if_acmpne 7 + 5: iconst_1 + 6: ireturn + 7: aload_1 /* obj */ + 8: ifnonnull 13 + 11: iconst_0 + 12: ireturn + 13: aload_0 /* this */ + 14: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 17: aload_1 /* obj */ + 18: invokevirtual java/lang/Object.getClass:()Ljava/lang/Class; + 21: if_acmpeq 26 + 24: iconst_0 + 25: ireturn + 26: aload_1 /* obj */ + 27: checkcast Ldemo/AllJavaSyntaxes$Entity; + 30: astore_2 /* other */ + 31: aload_0 /* this */ + 32: getfield demo/AllJavaSyntaxes$Entity.id:J + 35: aload_2 /* other */ + 36: getfield demo/AllJavaSyntaxes$Entity.id:J + 39: lcmp + 40: ifne 59 + 43: aload_0 /* this */ + 44: getfield demo/AllJavaSyntaxes$Entity.name:Ljava/lang/String; + 47: aload_2 /* other */ + 48: getfield demo/AllJavaSyntaxes$Entity.name:Ljava/lang/String; + 51: invokestatic java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z + 54: ifeq 59 + 57: iconst_1 + 58: ireturn + 59: iconst_0 + 60: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ----------------------------- + 0 61 0 this Ldemo/AllJavaSyntaxes$Entity; + 0 61 1 obj Ljava/lang/Object; + 31 30 2 other Ldemo/AllJavaSyntaxes$Entity; + StackMapTable: 00 04 07 05 0C FC 00 20 07 00 01 + public int compareTo(demo.AllJavaSyntaxes.Entity other); + Flags: PUBLIC + Code: + stack=4, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Entity.id:J + 4: aload_1 /* other */ + 5: getfield demo/AllJavaSyntaxes$Entity.id:J + 8: invokestatic java/lang/Long.compare:(JJ)I + 11: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ----------------------------- + 0 12 0 this Ldemo/AllJavaSyntaxes$Entity; + 0 12 1 other Ldemo/AllJavaSyntaxes$Entity; + public int compareTo(java.lang.Object p0); + Flags: PUBLIC, BRIDGE, SYNTHETIC + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 + 1: aload_1 + 2: checkcast Ldemo/AllJavaSyntaxes$Entity; + 5: invokevirtual demo/AllJavaSyntaxes$Entity.compareTo:(Ldemo/AllJavaSyntaxes$Entity;)I + 8: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +interface demo.AllJavaSyntaxes.Named + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface Named = demo/AllJavaSyntaxes$Named of demo/AllJavaSyntaxes + NestHost: 00 0A + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Named + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Named" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "name" + 6: Utf8StringConstant "()Ljava/lang/String;" + 7: Utf8StringConstant "SourceFile" + 8: Utf8StringConstant "AllJavaSyntaxes.java" + 9: Utf8StringConstant "InnerClasses" + 10: TypeInfo #11 // demo/AllJavaSyntaxes + 11: Utf8StringConstant "demo/AllJavaSyntaxes" + 12: Utf8StringConstant "Named" + 13: Utf8StringConstant "NestHost" + public abstract java.lang.String name(); + Flags: PUBLIC, ABSTRACT +interface demo.AllJavaSyntaxes.Identified + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface Identified = demo/AllJavaSyntaxes$Identified of demo/AllJavaSyntaxes + NestHost: 00 0A + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Identified + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Identified" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "id" + 6: Utf8StringConstant "()J" + 7: Utf8StringConstant "SourceFile" + 8: Utf8StringConstant "AllJavaSyntaxes.java" + 9: Utf8StringConstant "InnerClasses" + 10: TypeInfo #11 // demo/AllJavaSyntaxes + 11: Utf8StringConstant "demo/AllJavaSyntaxes" + 12: Utf8StringConstant "Identified" + 13: Utf8StringConstant "NestHost" + public abstract long id(); + Flags: PUBLIC, ABSTRACT +class demo.AllJavaSyntaxes.Failure + Minor version: 0 + Major version: 69 + Flags: STATIC, FINAL, SUPER + SourceFile: AllJavaSyntaxes.java + Signature: Ldemo/AllJavaSyntaxes$Result; + InnerClasses: + static final Failure = demo/AllJavaSyntaxes$Failure of demo/AllJavaSyntaxes + abstract static Result = demo/AllJavaSyntaxes$Result of demo/AllJavaSyntaxes + NestHost: 00 1B + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Failure + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Failure" + 3: TypeInfo #4 // demo/AllJavaSyntaxes$Result + 4: Utf8StringConstant "demo/AllJavaSyntaxes$Result" + 5: Utf8StringConstant "exception" + 6: Utf8StringConstant "Ljava/lang/Exception;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ljava/lang/Exception;)V" + 9: Utf8StringConstant "Code" + 10: MethodReference #3.#11 // demo/AllJavaSyntaxes$Result.:()V + 11: NameAndTypeDescriptor #7.#12 // :()V + 12: Utf8StringConstant "()V" + 13: FieldReference #1.#14 // demo/AllJavaSyntaxes$Failure.exception:Ljava/lang/Exception; + 14: NameAndTypeDescriptor #5.#6 // exception:Ljava/lang/Exception; + 15: Utf8StringConstant "LineNumberTable" + 16: Utf8StringConstant "LocalVariableTable" + 17: Utf8StringConstant "this" + 18: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Failure;" + 19: Utf8StringConstant "LocalVariableTypeTable" + 20: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Failure;" + 21: Utf8StringConstant "()Ljava/lang/Exception;" + 22: Utf8StringConstant "SourceFile" + 23: Utf8StringConstant "AllJavaSyntaxes.java" + 24: Utf8StringConstant "Signature" + 25: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Result;" + 26: Utf8StringConstant "InnerClasses" + 27: TypeInfo #28 // demo/AllJavaSyntaxes + 28: Utf8StringConstant "demo/AllJavaSyntaxes" + 29: Utf8StringConstant "Failure" + 30: Utf8StringConstant "Result" + 31: Utf8StringConstant "NestHost" + private final java.lang.Exception exception; + Flags: PRIVATE, FINAL + void (java.lang.Exception exception); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: invokespecial demo/AllJavaSyntaxes$Result.:()V + 4: aload_0 /* this */ + 5: aload_1 /* exception */ + 6: putfield demo/AllJavaSyntaxes$Failure.exception:Ljava/lang/Exception; + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- --------- ------------------------------ + 0 10 0 this Ldemo/AllJavaSyntaxes$Failure; + 0 10 1 exception Ljava/lang/Exception; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$Failure; + java.lang.Exception exception(); + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Failure.exception:Ljava/lang/Exception; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 5 0 this Ldemo/AllJavaSyntaxes$Failure; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$Failure; +class demo.AllJavaSyntaxes.Result + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, SEALED, SUPER + SourceFile: AllJavaSyntaxes.java + Signature: Ljava/lang/Object; + PermittedSubclasses: demo/AllJavaSyntaxes$Success, demo/AllJavaSyntaxes$Failure + InnerClasses: + static final Failure = demo/AllJavaSyntaxes$Failure of demo/AllJavaSyntaxes + abstract static Result = demo/AllJavaSyntaxes$Result of demo/AllJavaSyntaxes + static final Success = demo/AllJavaSyntaxes$Success of demo/AllJavaSyntaxes + NestHost: 00 1A + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Result + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Result" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: Utf8StringConstant "Code" + 8: MethodReference #3.#9 // java/lang/Object.:()V + 9: NameAndTypeDescriptor #5.#6 // :()V + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Result;" + 14: Utf8StringConstant "LocalVariableTypeTable" + 15: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Result;" + 16: Utf8StringConstant "SourceFile" + 17: Utf8StringConstant "AllJavaSyntaxes.java" + 18: Utf8StringConstant "Signature" + 19: Utf8StringConstant "Ljava/lang/Object;" + 20: Utf8StringConstant "PermittedSubclasses" + 21: TypeInfo #22 // demo/AllJavaSyntaxes$Success + 22: Utf8StringConstant "demo/AllJavaSyntaxes$Success" + 23: TypeInfo #24 // demo/AllJavaSyntaxes$Failure + 24: Utf8StringConstant "demo/AllJavaSyntaxes$Failure" + 25: Utf8StringConstant "InnerClasses" + 26: TypeInfo #27 // demo/AllJavaSyntaxes + 27: Utf8StringConstant "demo/AllJavaSyntaxes" + 28: Utf8StringConstant "Failure" + 29: Utf8StringConstant "Result" + 30: Utf8StringConstant "Success" + 31: Utf8StringConstant "NestHost" + private void (); + Flags: PRIVATE + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$Result; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$Result; +class demo.AllJavaSyntaxes.Success + Minor version: 0 + Major version: 69 + Flags: STATIC, FINAL, SUPER + SourceFile: AllJavaSyntaxes.java + Signature: Ldemo/AllJavaSyntaxes$Result; + InnerClasses: + abstract static Result = demo/AllJavaSyntaxes$Result of demo/AllJavaSyntaxes + static final Success = demo/AllJavaSyntaxes$Success of demo/AllJavaSyntaxes + NestHost: 00 1E + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Success + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Success" + 3: TypeInfo #4 // demo/AllJavaSyntaxes$Result + 4: Utf8StringConstant "demo/AllJavaSyntaxes$Result" + 5: Utf8StringConstant "value" + 6: Utf8StringConstant "Ljava/lang/Object;" + 7: Utf8StringConstant "Signature" + 8: Utf8StringConstant "TT;" + 9: Utf8StringConstant "" + 10: Utf8StringConstant "(Ljava/lang/Object;)V" + 11: Utf8StringConstant "(TT;)V" + 12: Utf8StringConstant "Code" + 13: MethodReference #3.#14 // demo/AllJavaSyntaxes$Result.:()V + 14: NameAndTypeDescriptor #9.#15 // :()V + 15: Utf8StringConstant "()V" + 16: FieldReference #1.#17 // demo/AllJavaSyntaxes$Success.value:Ljava/lang/Object; + 17: NameAndTypeDescriptor #5.#6 // value:Ljava/lang/Object; + 18: Utf8StringConstant "LineNumberTable" + 19: Utf8StringConstant "LocalVariableTable" + 20: Utf8StringConstant "this" + 21: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Success;" + 22: Utf8StringConstant "LocalVariableTypeTable" + 23: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Success;" + 24: Utf8StringConstant "()Ljava/lang/Object;" + 25: Utf8StringConstant "()TT;" + 26: Utf8StringConstant "SourceFile" + 27: Utf8StringConstant "AllJavaSyntaxes.java" + 28: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Result;" + 29: Utf8StringConstant "InnerClasses" + 30: TypeInfo #31 // demo/AllJavaSyntaxes + 31: Utf8StringConstant "demo/AllJavaSyntaxes" + 32: Utf8StringConstant "Result" + 33: Utf8StringConstant "Success" + 34: Utf8StringConstant "NestHost" + private final T value; + Flags: PRIVATE, FINAL + Signature: TT; + void (T value); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: invokespecial demo/AllJavaSyntaxes$Result.:()V + 4: aload_0 /* this */ + 5: aload_1 /* value */ + 6: putfield demo/AllJavaSyntaxes$Success.value:Ljava/lang/Object; + 9: return + Signature: + (TT;)V + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ------------------------------ + 0 10 0 this Ldemo/AllJavaSyntaxes$Success; + 0 10 1 value Ljava/lang/Object; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ----------------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$Success; + 0 10 1 value TT; + T value(); + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Success.value:Ljava/lang/Object; + 4: areturn + Signature: + ()TT; + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 5 0 this Ldemo/AllJavaSyntaxes$Success; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$Success; +class demo.AllJavaSyntaxes.GenericConstructor + Minor version: 0 + Major version: 69 + Flags: STATIC, SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + static GenericConstructor = demo/AllJavaSyntaxes$GenericConstructor of demo/AllJavaSyntaxes + NestHost: 00 18 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$GenericConstructor + 2: Utf8StringConstant "demo/AllJavaSyntaxes$GenericConstructor" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "(Ljava/lang/Object;)V" + 7: Utf8StringConstant "Signature" + 8: Utf8StringConstant "(TT;)V" + 9: Utf8StringConstant "Code" + 10: MethodReference #3.#11 // java/lang/Object.:()V + 11: NameAndTypeDescriptor #5.#12 // :()V + 12: Utf8StringConstant "()V" + 13: Utf8StringConstant "LineNumberTable" + 14: Utf8StringConstant "LocalVariableTable" + 15: Utf8StringConstant "this" + 16: Utf8StringConstant "Ldemo/AllJavaSyntaxes$GenericConstructor;" + 17: Utf8StringConstant "value" + 18: Utf8StringConstant "Ljava/lang/Object;" + 19: Utf8StringConstant "LocalVariableTypeTable" + 20: Utf8StringConstant "TT;" + 21: Utf8StringConstant "SourceFile" + 22: Utf8StringConstant "AllJavaSyntaxes.java" + 23: Utf8StringConstant "InnerClasses" + 24: TypeInfo #25 // demo/AllJavaSyntaxes + 25: Utf8StringConstant "demo/AllJavaSyntaxes" + 26: Utf8StringConstant "GenericConstructor" + 27: Utf8StringConstant "NestHost" + void (T value); + Code: + stack=1, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + Signature: + (TT;)V + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ----- ----------------------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$GenericConstructor; + 0 5 1 value Ljava/lang/Object; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ----- --------- + 0 5 1 value TT; +class demo.AllJavaSyntaxes.Inner + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + BootstrapMethods: + 0: invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + Arguments: + ()V + invokespecial demo/AllJavaSyntaxes$Inner.lambda$0:()V + ()V + InnerClasses: + Inner = demo/AllJavaSyntaxes$Inner of demo/AllJavaSyntaxes + demo/AllJavaSyntaxes$Inner$1 + public static final Lookup = java/lang/invoke/MethodHandles$Lookup of java/lang/invoke/MethodHandles + NestHost: 00 12 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Inner + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Inner" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "this$0" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$Inner.this$0:Ldemo/AllJavaSyntaxes; + 11: NameAndTypeDescriptor #5.#6 // this$0:Ldemo/AllJavaSyntaxes; + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #7.#14 // :()V + 14: Utf8StringConstant "()V" + 15: StringConstant #16 // "Inner constructor" + 16: Utf8StringConstant "Inner constructor" + 17: MethodReference #18.#20 // demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 18: TypeInfo #19 // demo/AllJavaSyntaxes + 19: Utf8StringConstant "demo/AllJavaSyntaxes" + 20: NameAndTypeDescriptor #21.#22 // log:(Ljava/lang/String;)V + 21: Utf8StringConstant "log" + 22: Utf8StringConstant "(Ljava/lang/String;)V" + 23: Utf8StringConstant "LineNumberTable" + 24: Utf8StringConstant "LocalVariableTable" + 25: Utf8StringConstant "this" + 26: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Inner;" + 27: Utf8StringConstant "anonymousClass" + 28: TypeInfo #29 // java/lang/Thread + 29: Utf8StringConstant "java/lang/Thread" + 30: TypeInfo #31 // demo/AllJavaSyntaxes$Inner$1 + 31: Utf8StringConstant "demo/AllJavaSyntaxes$Inner$1" + 32: MethodReference #30.#33 // demo/AllJavaSyntaxes$Inner$1.:(Ldemo/AllJavaSyntaxes$Inner;)V + 33: NameAndTypeDescriptor #7.#34 // :(Ldemo/AllJavaSyntaxes$Inner;)V + 34: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Inner;)V" + 35: MethodReference #28.#36 // java/lang/Thread.:(Ljava/lang/Runnable;)V + 36: NameAndTypeDescriptor #7.#37 // :(Ljava/lang/Runnable;)V + 37: Utf8StringConstant "(Ljava/lang/Runnable;)V" + 38: MethodReference #28.#39 // java/lang/Thread.start:()V + 39: NameAndTypeDescriptor #40.#14 // start:()V + 40: Utf8StringConstant "start" + 41: Utf8StringConstant "lambda" + 42: InvokeDynamicInfo 0, #44.#45 // run:(Ldemo/AllJavaSyntaxes$Inner;)Ljava/lang/Runnable; + 43: NameAndTypeDescriptor #44.#45 // run:(Ldemo/AllJavaSyntaxes$Inner;)Ljava/lang/Runnable; + 44: Utf8StringConstant "run" + 45: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Inner;)Ljava/lang/Runnable;" + 46: Utf8StringConstant "access$0" + 47: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Inner;)Ldemo/AllJavaSyntaxes;" + 48: Utf8StringConstant "lambda$0" + 49: StringConstant #50 // "Inner.lambda" + 50: Utf8StringConstant "Inner.lambda" + 51: Utf8StringConstant "SourceFile" + 52: Utf8StringConstant "AllJavaSyntaxes.java" + 53: Utf8StringConstant "BootstrapMethods" + 54: MethodReference #55.#57 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + 55: TypeInfo #56 // java/lang/invoke/LambdaMetafactory + 56: Utf8StringConstant "java/lang/invoke/LambdaMetafactory" + 57: NameAndTypeDescriptor #58.#59 // metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + 58: Utf8StringConstant "metafactory" + 59: Utf8StringConstant "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;" + 60: MethodHandle InvokeStatic #55.#57 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; + 61: MethodType ()V + 62: MethodReference #1.#63 // demo/AllJavaSyntaxes$Inner.lambda$0:()V + 63: NameAndTypeDescriptor #48.#14 // lambda$0:()V + 64: MethodHandle InvokeSpecial #1.#63 // demo/AllJavaSyntaxes$Inner.lambda$0:()V + 65: MethodType ()V + 66: Utf8StringConstant "InnerClasses" + 67: Utf8StringConstant "Inner" + 68: TypeInfo #69 // java/lang/invoke/MethodHandles$Lookup + 69: Utf8StringConstant "java/lang/invoke/MethodHandles$Lookup" + 70: TypeInfo #71 // java/lang/invoke/MethodHandles + 71: Utf8StringConstant "java/lang/invoke/MethodHandles" + 72: Utf8StringConstant "Lookup" + 73: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$Inner.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: aload_1 + 10: ldc "Inner constructor" + 12: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 15: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------- + 0 16 0 this Ldemo/AllJavaSyntaxes$Inner; + void anonymousClass(); + Code: + stack=5, locals=1, arguments=0 + 0: new Ljava/lang/Thread; + 3: dup + 4: new Ldemo/AllJavaSyntaxes$Inner$1; + 7: dup + 8: aload_0 /* this */ + 9: invokespecial demo/AllJavaSyntaxes$Inner$1.:(Ldemo/AllJavaSyntaxes$Inner;)V + 12: invokespecial java/lang/Thread.:(Ljava/lang/Runnable;)V + 15: invokevirtual java/lang/Thread.start:()V + 18: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------- + 0 19 0 this Ldemo/AllJavaSyntaxes$Inner; + void lambda(); + Code: + stack=3, locals=1, arguments=0 + 0: new Ljava/lang/Thread; + 3: dup + 4: aload_0 /* this */ + 5: invokedynamic BootstrapMethod #0, run:(Ldemo/AllJavaSyntaxes$Inner;)Ljava/lang/Runnable; + 10: invokespecial java/lang/Thread.:(Ljava/lang/Runnable;)V + 13: invokevirtual java/lang/Thread.start:()V + 16: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------- + 0 17 0 this Ldemo/AllJavaSyntaxes$Inner; + static demo.AllJavaSyntaxes access$0(demo.AllJavaSyntaxes.Inner p0); + Flags: STATIC, SYNTHETIC + Code: + stack=1, locals=1, arguments=1 + 0: aload_0 + 1: getfield demo/AllJavaSyntaxes$Inner.this$0:Ldemo/AllJavaSyntaxes; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private void lambda$0(); + Flags: PRIVATE, SYNTHETIC + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Inner.this$0:Ldemo/AllJavaSyntaxes; + 4: ldc "Inner.lambda" + 6: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$Inner; +class demo.AllJavaSyntaxes$Inner$1demo.AllJavaSyntaxes.Inner.AllJavaSyntaxes$Inner$1 + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + EnclosingType: demo/AllJavaSyntaxes$Inner + EnclosingMethod: demo/AllJavaSyntaxes$Inner.anonymousClass:()V + BootstrapMethods: + 0: invokestatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + Arguments: + "index=\u0001,constant=1" + InnerClasses: + Inner = demo/AllJavaSyntaxes$Inner of demo/AllJavaSyntaxes + demo/AllJavaSyntaxes$Inner$1 + public static final Lookup = java/lang/invoke/MethodHandles$Lookup of java/lang/invoke/MethodHandles + NestHost: 00 2A + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Inner$1 + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Inner$1" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // java/lang/Runnable + 6: Utf8StringConstant "java/lang/Runnable" + 7: Utf8StringConstant "CONSTANT" + 8: Utf8StringConstant "J" + 9: Utf8StringConstant "ConstantValue" + 10: LongConstant 1L + 12: Utf8StringConstant "index" + 13: Utf8StringConstant "I" + 14: Utf8StringConstant "this$1" + 15: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Inner;" + 16: Utf8StringConstant "" + 17: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Inner;)V" + 18: Utf8StringConstant "Code" + 19: FieldReference #1.#20 // demo/AllJavaSyntaxes$Inner$1.this$1:Ldemo/AllJavaSyntaxes$Inner; + 20: NameAndTypeDescriptor #14.#15 // this$1:Ldemo/AllJavaSyntaxes$Inner; + 21: MethodReference #3.#22 // java/lang/Object.:()V + 22: NameAndTypeDescriptor #16.#23 // :()V + 23: Utf8StringConstant "()V" + 24: FieldReference #1.#25 // demo/AllJavaSyntaxes$Inner$1.index:I + 25: NameAndTypeDescriptor #12.#13 // index:I + 26: Utf8StringConstant "LineNumberTable" + 27: Utf8StringConstant "LocalVariableTable" + 28: Utf8StringConstant "this" + 29: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Inner$1;" + 30: Utf8StringConstant "run" + 31: MethodReference #32.#34 // demo/AllJavaSyntaxes$Inner.access$0:(Ldemo/AllJavaSyntaxes$Inner;)Ldemo/AllJavaSyntaxes; + 32: TypeInfo #33 // demo/AllJavaSyntaxes$Inner + 33: Utf8StringConstant "demo/AllJavaSyntaxes$Inner" + 34: NameAndTypeDescriptor #35.#36 // access$0:(Ldemo/AllJavaSyntaxes$Inner;)Ldemo/AllJavaSyntaxes; + 35: Utf8StringConstant "access$0" + 36: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Inner;)Ldemo/AllJavaSyntaxes;" + 37: InvokeDynamicInfo 0, #39.#40 // makeConcatWithConstants:(I)Ljava/lang/String; + 38: NameAndTypeDescriptor #39.#40 // makeConcatWithConstants:(I)Ljava/lang/String; + 39: Utf8StringConstant "makeConcatWithConstants" + 40: Utf8StringConstant "(I)Ljava/lang/String;" + 41: MethodReference #42.#44 // demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 42: TypeInfo #43 // demo/AllJavaSyntaxes + 43: Utf8StringConstant "demo/AllJavaSyntaxes" + 44: NameAndTypeDescriptor #45.#46 // log:(Ljava/lang/String;)V + 45: Utf8StringConstant "log" + 46: Utf8StringConstant "(Ljava/lang/String;)V" + 47: Utf8StringConstant "SourceFile" + 48: Utf8StringConstant "AllJavaSyntaxes.java" + 49: Utf8StringConstant "EnclosingMethod" + 50: NameAndTypeDescriptor #51.#23 // anonymousClass:()V + 51: Utf8StringConstant "anonymousClass" + 52: Utf8StringConstant "BootstrapMethods" + 53: MethodReference #54.#56 // java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 54: TypeInfo #55 // java/lang/invoke/StringConcatFactory + 55: Utf8StringConstant "java/lang/invoke/StringConcatFactory" + 56: NameAndTypeDescriptor #39.#57 // makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 57: Utf8StringConstant "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;" + 58: MethodHandle InvokeStatic #54.#56 // java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite; + 59: StringConstant #60 // "index=\u0001,constant=1" + 60: Utf8StringConstant "index=\u0001,constant=1" + 61: Utf8StringConstant "InnerClasses" + 62: Utf8StringConstant "Inner" + 63: TypeInfo #64 // java/lang/invoke/MethodHandles$Lookup + 64: Utf8StringConstant "java/lang/invoke/MethodHandles$Lookup" + 65: TypeInfo #66 // java/lang/invoke/MethodHandles + 66: Utf8StringConstant "java/lang/invoke/MethodHandles" + 67: Utf8StringConstant "Lookup" + 68: Utf8StringConstant "NestHost" + private static final long CONSTANT; + Flags: PRIVATE, STATIC, FINAL + ConstantValue: long 1L + int index; + final demo.AllJavaSyntaxes.Inner this$1; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes.Inner p0); + Flags: SYNTHETIC, ANONCONSTR + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$Inner$1.this$1:Ldemo/AllJavaSyntaxes$Inner; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: aload_0 /* this */ + 10: iconst_m1 + 11: putfield demo/AllJavaSyntaxes$Inner$1.index:I + 14: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 15 0 this Ldemo/AllJavaSyntaxes$Inner$1; + public void run(); + Flags: PUBLIC + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$Inner$1.this$1:Ldemo/AllJavaSyntaxes$Inner; + 4: invokestatic demo/AllJavaSyntaxes$Inner.access$0:(Ldemo/AllJavaSyntaxes$Inner;)Ldemo/AllJavaSyntaxes; + 7: aload_0 /* this */ + 8: getfield demo/AllJavaSyntaxes$Inner$1.index:I + 11: invokedynamic BootstrapMethod #0, makeConcatWithConstants:(I)Ljava/lang/String; + 16: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 19: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------ + 0 20 0 this Ldemo/AllJavaSyntaxes$Inner$1; +@interface demo.AllJavaSyntaxes.Marker + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface Marker = demo/AllJavaSyntaxes$Marker of demo/AllJavaSyntaxes + NestHost: 00 13 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Marker + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Marker" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // java/lang/annotation/Annotation + 6: Utf8StringConstant "java/lang/annotation/Annotation" + 7: Utf8StringConstant "SourceFile" + 8: Utf8StringConstant "AllJavaSyntaxes.java" + 9: Utf8StringConstant "RuntimeVisibleAnnotations" + 10: Utf8StringConstant "Ljava/lang/annotation/Retention;" + 11: Utf8StringConstant "value" + 12: Utf8StringConstant "Ljava/lang/annotation/RetentionPolicy;" + 13: Utf8StringConstant "RUNTIME" + 14: Utf8StringConstant "Ljava/lang/annotation/Target;" + 15: Utf8StringConstant "Ljava/lang/annotation/ElementType;" + 16: Utf8StringConstant "TYPE" + 17: Utf8StringConstant "METHOD" + 18: Utf8StringConstant "InnerClasses" + 19: TypeInfo #20 // demo/AllJavaSyntaxes + 20: Utf8StringConstant "demo/AllJavaSyntaxes" + 21: Utf8StringConstant "Marker" + 22: Utf8StringConstant "NestHost" +enum demo.AllJavaSyntaxes.Operation + Minor version: 0 + Major version: 69 + Flags: STATIC, SEALED, SUPER, ENUM + SourceFile: AllJavaSyntaxes.java + Signature: Ljava/lang/Enum; + PermittedSubclasses: demo/AllJavaSyntaxes$Operation$1, demo/AllJavaSyntaxes$Operation$2 + InnerClasses: + static enum Operation = demo/AllJavaSyntaxes$Operation of demo/AllJavaSyntaxes + final enum demo/AllJavaSyntaxes$Operation$1 + final enum demo/AllJavaSyntaxes$Operation$2 + NestHost: 00 37 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Operation + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Operation" + 3: TypeInfo #4 // java/lang/Enum + 4: Utf8StringConstant "java/lang/Enum" + 5: Utf8StringConstant "ADD" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Operation;" + 7: Utf8StringConstant "Signature" + 8: Utf8StringConstant "SUB" + 9: Utf8StringConstant "ENUM$VALUES" + 10: Utf8StringConstant "[Ldemo/AllJavaSyntaxes$Operation;" + 11: Utf8StringConstant "" + 12: Utf8StringConstant "()V" + 13: Utf8StringConstant "Code" + 14: TypeInfo #15 // demo/AllJavaSyntaxes$Operation$1 + 15: Utf8StringConstant "demo/AllJavaSyntaxes$Operation$1" + 16: StringConstant #5 // "ADD" + 17: MethodReference #14.#18 // demo/AllJavaSyntaxes$Operation$1.:(Ljava/lang/String;I)V + 18: NameAndTypeDescriptor #19.#20 // :(Ljava/lang/String;I)V + 19: Utf8StringConstant "" + 20: Utf8StringConstant "(Ljava/lang/String;I)V" + 21: FieldReference #1.#22 // demo/AllJavaSyntaxes$Operation.ADD:Ldemo/AllJavaSyntaxes$Operation; + 22: NameAndTypeDescriptor #5.#6 // ADD:Ldemo/AllJavaSyntaxes$Operation; + 23: TypeInfo #24 // demo/AllJavaSyntaxes$Operation$2 + 24: Utf8StringConstant "demo/AllJavaSyntaxes$Operation$2" + 25: StringConstant #8 // "SUB" + 26: MethodReference #23.#18 // demo/AllJavaSyntaxes$Operation$2.:(Ljava/lang/String;I)V + 27: FieldReference #1.#28 // demo/AllJavaSyntaxes$Operation.SUB:Ldemo/AllJavaSyntaxes$Operation; + 28: NameAndTypeDescriptor #8.#6 // SUB:Ldemo/AllJavaSyntaxes$Operation; + 29: FieldReference #1.#30 // demo/AllJavaSyntaxes$Operation.ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Operation; + 30: NameAndTypeDescriptor #9.#10 // ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Operation; + 31: Utf8StringConstant "LineNumberTable" + 32: Utf8StringConstant "LocalVariableTable" + 33: MethodReference #3.#18 // java/lang/Enum.:(Ljava/lang/String;I)V + 34: Utf8StringConstant "this" + 35: Utf8StringConstant "apply" + 36: Utf8StringConstant "(II)I" + 37: Utf8StringConstant "values" + 38: Utf8StringConstant "()[Ldemo/AllJavaSyntaxes$Operation;" + 39: MethodReference #40.#42 // java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V + 40: TypeInfo #41 // java/lang/System + 41: Utf8StringConstant "java/lang/System" + 42: NameAndTypeDescriptor #43.#44 // arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V + 43: Utf8StringConstant "arraycopy" + 44: Utf8StringConstant "(Ljava/lang/Object;ILjava/lang/Object;II)V" + 45: Utf8StringConstant "valueOf" + 46: Utf8StringConstant "(Ljava/lang/String;)Ldemo/AllJavaSyntaxes$Operation;" + 47: MethodReference #3.#48 // java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; + 48: NameAndTypeDescriptor #45.#49 // valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; + 49: Utf8StringConstant "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;" + 50: Utf8StringConstant "SourceFile" + 51: Utf8StringConstant "AllJavaSyntaxes.java" + 52: Utf8StringConstant "Ljava/lang/Enum;" + 53: Utf8StringConstant "PermittedSubclasses" + 54: Utf8StringConstant "InnerClasses" + 55: TypeInfo #56 // demo/AllJavaSyntaxes + 56: Utf8StringConstant "demo/AllJavaSyntaxes" + 57: Utf8StringConstant "Operation" + 58: Utf8StringConstant "NestHost" + public static final demo.AllJavaSyntaxes.Operation ADD; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Operation; + public static final demo.AllJavaSyntaxes.Operation SUB; + Flags: PUBLIC, STATIC, FINAL, ENUM + Signature: Ldemo/AllJavaSyntaxes$Operation; + private static final demo.AllJavaSyntaxes.Operation[] ENUM$VALUES; + Flags: PRIVATE, STATIC, FINAL, SYNTHETIC + static {}; + Flags: STATIC + Code: + stack=4, locals=0, arguments=0 + 0: new Ldemo/AllJavaSyntaxes$Operation$1; + 3: dup + 4: ldc "ADD" + 6: iconst_0 + 7: invokespecial demo/AllJavaSyntaxes$Operation$1.:(Ljava/lang/String;I)V + 10: putstatic demo/AllJavaSyntaxes$Operation.ADD:Ldemo/AllJavaSyntaxes$Operation; + 13: new Ldemo/AllJavaSyntaxes$Operation$2; + 16: dup + 17: ldc "SUB" + 19: iconst_1 + 20: invokespecial demo/AllJavaSyntaxes$Operation$2.:(Ljava/lang/String;I)V + 23: putstatic demo/AllJavaSyntaxes$Operation.SUB:Ldemo/AllJavaSyntaxes$Operation; + 26: iconst_2 + 27: anewarray Ldemo/AllJavaSyntaxes$Operation; + 30: dup + 31: iconst_0 + 32: getstatic demo/AllJavaSyntaxes$Operation.ADD:Ldemo/AllJavaSyntaxes$Operation; + 35: aastore + 36: dup + 37: iconst_1 + 38: getstatic demo/AllJavaSyntaxes$Operation.SUB:Ldemo/AllJavaSyntaxes$Operation; + 41: aastore + 42: putstatic demo/AllJavaSyntaxes$Operation.ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Operation; + 45: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + private void (java.lang.String p0, int p1); + Flags: PRIVATE + Code: + stack=3, locals=3, arguments=2 + 0: aload_0 /* this */ + 1: aload_1 + 2: iload_2 + 3: invokespecial java/lang/Enum.:(Ljava/lang/String;I)V + 6: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------- + 0 7 0 this Ldemo/AllJavaSyntaxes$Operation; + native int apply(int p0, int p1); + Flags: NATIVE + public static demo.AllJavaSyntaxes.Operation[] values(); + Flags: PUBLIC, STATIC + Code: + stack=5, locals=3, arguments=0 + 0: getstatic demo/AllJavaSyntaxes$Operation.ENUM$VALUES:[Ldemo/AllJavaSyntaxes$Operation; + 3: dup + 4: astore_0 + 5: iconst_0 + 6: aload_0 + 7: arraylength + 8: dup + 9: istore_1 + 10: anewarray Ldemo/AllJavaSyntaxes$Operation; + 13: dup + 14: astore_2 + 15: iconst_0 + 16: iload_1 + 17: invokestatic java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V + 20: aload_2 + 21: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + public static demo.AllJavaSyntaxes.Operation valueOf(java.lang.String p0); + Flags: PUBLIC, STATIC + Code: + stack=2, locals=1, arguments=1 + 0: ldc Ldemo/AllJavaSyntaxes$Operation;.class + 2: aload_0 + 3: invokestatic java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum; + 6: checkcast Ldemo/AllJavaSyntaxes$Operation; + 9: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +enum demo.AllJavaSyntaxes$Operation$1demo.AllJavaSyntaxes.Operation.AllJavaSyntaxes$Operation$1 + Minor version: 0 + Major version: 69 + Flags: FINAL, SUPER, ENUM + SourceFile: AllJavaSyntaxes.java + EnclosingType: demo/AllJavaSyntaxes$Operation + InnerClasses: + static enum Operation = demo/AllJavaSyntaxes$Operation of demo/AllJavaSyntaxes + final enum demo/AllJavaSyntaxes$Operation$1 + NestHost: 00 17 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Operation$1 + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Operation$1" + 3: TypeInfo #4 // demo/AllJavaSyntaxes$Operation + 4: Utf8StringConstant "demo/AllJavaSyntaxes$Operation" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "(Ljava/lang/String;I)V" + 7: Utf8StringConstant "Code" + 8: MethodReference #3.#9 // demo/AllJavaSyntaxes$Operation.:(Ljava/lang/String;I)V + 9: NameAndTypeDescriptor #5.#6 // :(Ljava/lang/String;I)V + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Operation$1;" + 14: Utf8StringConstant "apply" + 15: Utf8StringConstant "(II)I" + 16: Utf8StringConstant "a" + 17: Utf8StringConstant "I" + 18: Utf8StringConstant "b" + 19: Utf8StringConstant "SourceFile" + 20: Utf8StringConstant "AllJavaSyntaxes.java" + 21: Utf8StringConstant "EnclosingMethod" + 22: Utf8StringConstant "InnerClasses" + 23: TypeInfo #24 // demo/AllJavaSyntaxes + 24: Utf8StringConstant "demo/AllJavaSyntaxes" + 25: Utf8StringConstant "Operation" + 26: Utf8StringConstant "NestHost" + void (java.lang.String p0, int p1); + Flags: SYNTHETIC, ANONCONSTR + Code: + stack=3, locals=3, arguments=2 + 0: aload_0 /* this */ + 1: aload_1 + 2: iload_2 + 3: invokespecial demo/AllJavaSyntaxes$Operation.:(Ljava/lang/String;I)V + 6: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 7 0 this Ldemo/AllJavaSyntaxes$Operation$1; + int apply(int a, int b); + Code: + stack=2, locals=3, arguments=2 + 0: iload_1 /* a */ + 1: iload_2 /* b */ + 2: iadd + 3: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 4 0 this Ldemo/AllJavaSyntaxes$Operation$1; + 0 4 1 a I + 0 4 2 b I +enum demo.AllJavaSyntaxes$Operation$2demo.AllJavaSyntaxes.Operation.AllJavaSyntaxes$Operation$2 + Minor version: 0 + Major version: 69 + Flags: FINAL, SUPER, ENUM + SourceFile: AllJavaSyntaxes.java + EnclosingType: demo/AllJavaSyntaxes$Operation + InnerClasses: + static enum Operation = demo/AllJavaSyntaxes$Operation of demo/AllJavaSyntaxes + final enum demo/AllJavaSyntaxes$Operation$2 + NestHost: 00 17 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Operation$2 + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Operation$2" + 3: TypeInfo #4 // demo/AllJavaSyntaxes$Operation + 4: Utf8StringConstant "demo/AllJavaSyntaxes$Operation" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "(Ljava/lang/String;I)V" + 7: Utf8StringConstant "Code" + 8: MethodReference #3.#9 // demo/AllJavaSyntaxes$Operation.:(Ljava/lang/String;I)V + 9: NameAndTypeDescriptor #5.#6 // :(Ljava/lang/String;I)V + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Operation$2;" + 14: Utf8StringConstant "apply" + 15: Utf8StringConstant "(II)I" + 16: Utf8StringConstant "a" + 17: Utf8StringConstant "I" + 18: Utf8StringConstant "b" + 19: Utf8StringConstant "SourceFile" + 20: Utf8StringConstant "AllJavaSyntaxes.java" + 21: Utf8StringConstant "EnclosingMethod" + 22: Utf8StringConstant "InnerClasses" + 23: TypeInfo #24 // demo/AllJavaSyntaxes + 24: Utf8StringConstant "demo/AllJavaSyntaxes" + 25: Utf8StringConstant "Operation" + 26: Utf8StringConstant "NestHost" + void (java.lang.String p0, int p1); + Flags: SYNTHETIC, ANONCONSTR + Code: + stack=3, locals=3, arguments=2 + 0: aload_0 /* this */ + 1: aload_1 + 2: iload_2 + 3: invokespecial demo/AllJavaSyntaxes$Operation.:(Ljava/lang/String;I)V + 6: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 7 0 this Ldemo/AllJavaSyntaxes$Operation$2; + int apply(int a, int b); + Code: + stack=2, locals=3, arguments=2 + 0: iload_1 /* a */ + 1: iload_2 /* b */ + 2: isub + 3: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 4 0 this Ldemo/AllJavaSyntaxes$Operation$2; + 0 4 1 a I + 0 4 2 b I +class demo.AllJavaSyntaxes.Outer + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + Outer = demo/AllJavaSyntaxes$Outer of demo/AllJavaSyntaxes + Inner = demo/AllJavaSyntaxes$Outer$Inner of demo/AllJavaSyntaxes$Outer + static StaticNested = demo/AllJavaSyntaxes$Outer$StaticNested of demo/AllJavaSyntaxes$Outer + NestHost: 00 1C + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Outer + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Outer" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "value" + 6: Utf8StringConstant "I" + 7: Utf8StringConstant "this$0" + 8: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 9: Utf8StringConstant "" + 10: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 11: Utf8StringConstant "Code" + 12: FieldReference #1.#13 // demo/AllJavaSyntaxes$Outer.this$0:Ldemo/AllJavaSyntaxes; + 13: NameAndTypeDescriptor #7.#8 // this$0:Ldemo/AllJavaSyntaxes; + 14: MethodReference #3.#15 // java/lang/Object.:()V + 15: NameAndTypeDescriptor #9.#16 // :()V + 16: Utf8StringConstant "()V" + 17: FieldReference #1.#18 // demo/AllJavaSyntaxes$Outer.value:I + 18: NameAndTypeDescriptor #5.#6 // value:I + 19: Utf8StringConstant "LineNumberTable" + 20: Utf8StringConstant "LocalVariableTable" + 21: Utf8StringConstant "this" + 22: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Outer;" + 23: Utf8StringConstant "access$0" + 24: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes;" + 25: Utf8StringConstant "SourceFile" + 26: Utf8StringConstant "AllJavaSyntaxes.java" + 27: Utf8StringConstant "InnerClasses" + 28: TypeInfo #29 // demo/AllJavaSyntaxes + 29: Utf8StringConstant "demo/AllJavaSyntaxes" + 30: Utf8StringConstant "Outer" + 31: TypeInfo #32 // demo/AllJavaSyntaxes$Outer$Inner + 32: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner" + 33: Utf8StringConstant "Inner" + 34: TypeInfo #35 // demo/AllJavaSyntaxes$Outer$StaticNested + 35: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$StaticNested" + 36: Utf8StringConstant "StaticNested" + 37: Utf8StringConstant "NestHost" + int value; + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$Outer.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: aload_0 /* this */ + 10: iconst_1 + 11: putfield demo/AllJavaSyntaxes$Outer.value:I + 14: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------- + 0 15 0 this Ldemo/AllJavaSyntaxes$Outer; + static demo.AllJavaSyntaxes access$0(demo.AllJavaSyntaxes.Outer p0); + Flags: STATIC, SYNTHETIC + Code: + stack=1, locals=1, arguments=1 + 0: aload_0 + 1: getfield demo/AllJavaSyntaxes$Outer.this$0:Ldemo/AllJavaSyntaxes; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +class demo.AllJavaSyntaxes.Outer.Inner + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + Outer = demo/AllJavaSyntaxes$Outer of demo/AllJavaSyntaxes + Inner = demo/AllJavaSyntaxes$Outer$Inner of demo/AllJavaSyntaxes$Outer + Deep = demo/AllJavaSyntaxes$Outer$Inner$Deep of demo/AllJavaSyntaxes$Outer$Inner + NestHost: 00 18 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Outer$Inner + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "this$1" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Outer;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$Outer$Inner.this$1:Ldemo/AllJavaSyntaxes$Outer; + 11: NameAndTypeDescriptor #5.#6 // this$1:Ldemo/AllJavaSyntaxes$Outer; + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #7.#14 // :()V + 14: Utf8StringConstant "()V" + 15: MethodReference #16.#18 // demo/AllJavaSyntaxes$Outer.access$0:(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes; + 16: TypeInfo #17 // demo/AllJavaSyntaxes$Outer + 17: Utf8StringConstant "demo/AllJavaSyntaxes$Outer" + 18: NameAndTypeDescriptor #19.#20 // access$0:(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes; + 19: Utf8StringConstant "access$0" + 20: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes;" + 21: StringConstant #22 // "Inner" + 22: Utf8StringConstant "Inner" + 23: MethodReference #24.#26 // demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 24: TypeInfo #25 // demo/AllJavaSyntaxes + 25: Utf8StringConstant "demo/AllJavaSyntaxes" + 26: NameAndTypeDescriptor #27.#28 // log:(Ljava/lang/String;)V + 27: Utf8StringConstant "log" + 28: Utf8StringConstant "(Ljava/lang/String;)V" + 29: Utf8StringConstant "LineNumberTable" + 30: Utf8StringConstant "LocalVariableTable" + 31: Utf8StringConstant "this" + 32: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Outer$Inner;" + 33: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer$Inner;)Ldemo/AllJavaSyntaxes$Outer;" + 34: Utf8StringConstant "SourceFile" + 35: Utf8StringConstant "AllJavaSyntaxes.java" + 36: Utf8StringConstant "InnerClasses" + 37: Utf8StringConstant "Outer" + 38: TypeInfo #39 // demo/AllJavaSyntaxes$Outer$Inner$Deep + 39: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner$Deep" + 40: Utf8StringConstant "Deep" + 41: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes.Outer this$1; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes.Outer p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$Outer$Inner.this$1:Ldemo/AllJavaSyntaxes$Outer; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: aload_1 + 10: invokestatic demo/AllJavaSyntaxes$Outer.access$0:(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes; + 13: ldc "Inner" + 15: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 18: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 19 0 this Ldemo/AllJavaSyntaxes$Outer$Inner; + static demo.AllJavaSyntaxes.Outer access$0(demo.AllJavaSyntaxes.Outer.Inner p0); + Flags: STATIC, SYNTHETIC + Code: + stack=1, locals=1, arguments=1 + 0: aload_0 + 1: getfield demo/AllJavaSyntaxes$Outer$Inner.this$1:Ldemo/AllJavaSyntaxes$Outer; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +class demo.AllJavaSyntaxes.Outer.Inner.Deep + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + Outer = demo/AllJavaSyntaxes$Outer of demo/AllJavaSyntaxes + Inner = demo/AllJavaSyntaxes$Outer$Inner of demo/AllJavaSyntaxes$Outer + Deep = demo/AllJavaSyntaxes$Outer$Inner$Deep of demo/AllJavaSyntaxes$Outer$Inner + NestHost: 00 1D + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Outer$Inner$Deep + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner$Deep" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "this$2" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Outer$Inner;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer$Inner;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$Outer$Inner$Deep.this$2:Ldemo/AllJavaSyntaxes$Outer$Inner; + 11: NameAndTypeDescriptor #5.#6 // this$2:Ldemo/AllJavaSyntaxes$Outer$Inner; + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #7.#14 // :()V + 14: Utf8StringConstant "()V" + 15: MethodReference #16.#18 // demo/AllJavaSyntaxes$Outer$Inner.access$0:(Ldemo/AllJavaSyntaxes$Outer$Inner;)Ldemo/AllJavaSyntaxes$Outer; + 16: TypeInfo #17 // demo/AllJavaSyntaxes$Outer$Inner + 17: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner" + 18: NameAndTypeDescriptor #19.#20 // access$0:(Ldemo/AllJavaSyntaxes$Outer$Inner;)Ldemo/AllJavaSyntaxes$Outer; + 19: Utf8StringConstant "access$0" + 20: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer$Inner;)Ldemo/AllJavaSyntaxes$Outer;" + 21: MethodReference #22.#24 // demo/AllJavaSyntaxes$Outer.access$0:(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes; + 22: TypeInfo #23 // demo/AllJavaSyntaxes$Outer + 23: Utf8StringConstant "demo/AllJavaSyntaxes$Outer" + 24: NameAndTypeDescriptor #19.#25 // access$0:(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes; + 25: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes;" + 26: StringConstant #27 // "Deep" + 27: Utf8StringConstant "Deep" + 28: MethodReference #29.#31 // demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 29: TypeInfo #30 // demo/AllJavaSyntaxes + 30: Utf8StringConstant "demo/AllJavaSyntaxes" + 31: NameAndTypeDescriptor #32.#33 // log:(Ljava/lang/String;)V + 32: Utf8StringConstant "log" + 33: Utf8StringConstant "(Ljava/lang/String;)V" + 34: Utf8StringConstant "LineNumberTable" + 35: Utf8StringConstant "LocalVariableTable" + 36: Utf8StringConstant "this" + 37: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Outer$Inner$Deep;" + 38: Utf8StringConstant "SourceFile" + 39: Utf8StringConstant "AllJavaSyntaxes.java" + 40: Utf8StringConstant "InnerClasses" + 41: Utf8StringConstant "Outer" + 42: Utf8StringConstant "Inner" + 43: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes.Outer.Inner this$2; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes.Outer.Inner p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$Outer$Inner$Deep.this$2:Ldemo/AllJavaSyntaxes$Outer$Inner; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: aload_1 + 10: invokestatic demo/AllJavaSyntaxes$Outer$Inner.access$0:(Ldemo/AllJavaSyntaxes$Outer$Inner;)Ldemo/AllJavaSyntaxes$Outer; + 13: invokestatic demo/AllJavaSyntaxes$Outer.access$0:(Ldemo/AllJavaSyntaxes$Outer;)Ldemo/AllJavaSyntaxes; + 16: ldc "Deep" + 18: invokevirtual demo/AllJavaSyntaxes.log:(Ljava/lang/String;)V + 21: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------------------- + 0 22 0 this Ldemo/AllJavaSyntaxes$Outer$Inner$Deep; +class demo.AllJavaSyntaxes.Outer.StaticNested + Minor version: 0 + Major version: 69 + Flags: STATIC, SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + Outer = demo/AllJavaSyntaxes$Outer of demo/AllJavaSyntaxes + static StaticNested = demo/AllJavaSyntaxes$Outer$StaticNested of demo/AllJavaSyntaxes$Outer + NestHost: 00 21 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Outer$StaticNested + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$StaticNested" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: Utf8StringConstant "Code" + 8: MethodReference #3.#9 // java/lang/Object.:()V + 9: NameAndTypeDescriptor #5.#6 // :()V + 10: FieldReference #11.#13 // java/lang/System.out:Ljava/io/PrintStream; + 11: TypeInfo #12 // java/lang/System + 12: Utf8StringConstant "java/lang/System" + 13: NameAndTypeDescriptor #14.#15 // out:Ljava/io/PrintStream; + 14: Utf8StringConstant "out" + 15: Utf8StringConstant "Ljava/io/PrintStream;" + 16: StringConstant #17 // "StaticNested" + 17: Utf8StringConstant "StaticNested" + 18: MethodReference #19.#21 // java/io/PrintStream.println:(Ljava/lang/String;)V + 19: TypeInfo #20 // java/io/PrintStream + 20: Utf8StringConstant "java/io/PrintStream" + 21: NameAndTypeDescriptor #22.#23 // println:(Ljava/lang/String;)V + 22: Utf8StringConstant "println" + 23: Utf8StringConstant "(Ljava/lang/String;)V" + 24: Utf8StringConstant "LineNumberTable" + 25: Utf8StringConstant "LocalVariableTable" + 26: Utf8StringConstant "this" + 27: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Outer$StaticNested;" + 28: Utf8StringConstant "SourceFile" + 29: Utf8StringConstant "AllJavaSyntaxes.java" + 30: Utf8StringConstant "InnerClasses" + 31: TypeInfo #32 // demo/AllJavaSyntaxes$Outer + 32: Utf8StringConstant "demo/AllJavaSyntaxes$Outer" + 33: TypeInfo #34 // demo/AllJavaSyntaxes + 34: Utf8StringConstant "demo/AllJavaSyntaxes" + 35: Utf8StringConstant "Outer" + 36: Utf8StringConstant "NestHost" + void (); + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: getstatic java/lang/System.out:Ljava/io/PrintStream; + 7: ldc "StaticNested" + 9: invokevirtual java/io/PrintStream.println:(Ljava/lang/String;)V + 12: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------------------- + 0 13 0 this Ldemo/AllJavaSyntaxes$Outer$StaticNested; +class demo.AllJavaSyntaxes.Rec + Minor version: 0 + Major version: 69 + Flags: STATIC, FINAL, SUPER + SourceFile: AllJavaSyntaxes.java + BootstrapMethods: + 0: invokestatic java/lang/runtime/ObjectMethods.bootstrap:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object; + Arguments: + demo.AllJavaSyntaxes.Rec.class + "s;l" + getfield demo/AllJavaSyntaxes$Rec.s:()Ljava/lang/String; + getfield demo/AllJavaSyntaxes$Rec.l:()Ljava/util/List; + InnerClasses: + static final Rec = demo/AllJavaSyntaxes$Rec of demo/AllJavaSyntaxes + public static final Lookup = java/lang/invoke/MethodHandles$Lookup of java/lang/invoke/MethodHandles + NestHost: 00 4A + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Rec + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Rec" + 3: TypeInfo #4 // java/lang/Record + 4: Utf8StringConstant "java/lang/Record" + 5: Utf8StringConstant "s" + 6: Utf8StringConstant "Ljava/lang/String;" + 7: Utf8StringConstant "l" + 8: Utf8StringConstant "Ljava/util/List;" + 9: Utf8StringConstant "Signature" + 10: Utf8StringConstant "Ljava/util/List;" + 11: Utf8StringConstant "" + 12: Utf8StringConstant "(Ljava/lang/String;Ljava/util/List;)V" + 13: Utf8StringConstant "(Ljava/lang/String;Ljava/util/List;)V" + 14: Utf8StringConstant "Code" + 15: MethodReference #3.#16 // java/lang/Record.:()V + 16: NameAndTypeDescriptor #11.#17 // :()V + 17: Utf8StringConstant "()V" + 18: StringConstant #19 // "" + 19: Utf8StringConstant "" + 20: InterfaceMethodReference #21.#23 // java/util/List.of:()Ljava/util/List; + 21: TypeInfo #22 // java/util/List + 22: Utf8StringConstant "java/util/List" + 23: NameAndTypeDescriptor #24.#25 // of:()Ljava/util/List; + 24: Utf8StringConstant "of" + 25: Utf8StringConstant "()Ljava/util/List;" + 26: InterfaceMethodReference #21.#27 // java/util/List.copyOf:(Ljava/util/Collection;)Ljava/util/List; + 27: NameAndTypeDescriptor #28.#29 // copyOf:(Ljava/util/Collection;)Ljava/util/List; + 28: Utf8StringConstant "copyOf" + 29: Utf8StringConstant "(Ljava/util/Collection;)Ljava/util/List;" + 30: FieldReference #1.#31 // demo/AllJavaSyntaxes$Rec.s:Ljava/lang/String; + 31: NameAndTypeDescriptor #5.#6 // s:Ljava/lang/String; + 32: FieldReference #1.#33 // demo/AllJavaSyntaxes$Rec.l:Ljava/util/List; + 33: NameAndTypeDescriptor #7.#8 // l:Ljava/util/List; + 34: Utf8StringConstant "LineNumberTable" + 35: Utf8StringConstant "LocalVariableTable" + 36: Utf8StringConstant "this" + 37: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Rec;" + 38: Utf8StringConstant "LocalVariableTypeTable" + 39: Utf8StringConstant "StackMapTable" + 40: TypeInfo #41 // java/lang/String + 41: Utf8StringConstant "java/lang/String" + 42: Utf8StringConstant "MethodParameters" + 43: Utf8StringConstant "()Ljava/lang/String;" + 44: Utf8StringConstant "()Ljava/util/List;" + 45: Utf8StringConstant "toString" + 46: InvokeDynamicInfo 0, #45.#48 // toString:(Ldemo/AllJavaSyntaxes$Rec;)Ljava/lang/String; + 47: NameAndTypeDescriptor #45.#48 // toString:(Ldemo/AllJavaSyntaxes$Rec;)Ljava/lang/String; + 48: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Rec;)Ljava/lang/String;" + 49: Utf8StringConstant "hashCode" + 50: Utf8StringConstant "()I" + 51: InvokeDynamicInfo 0, #49.#53 // hashCode:(Ldemo/AllJavaSyntaxes$Rec;)I + 52: NameAndTypeDescriptor #49.#53 // hashCode:(Ldemo/AllJavaSyntaxes$Rec;)I + 53: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Rec;)I" + 54: Utf8StringConstant "equals" + 55: Utf8StringConstant "(Ljava/lang/Object;)Z" + 56: InvokeDynamicInfo 0, #54.#58 // equals:(Ldemo/AllJavaSyntaxes$Rec;Ljava/lang/Object;)Z + 57: NameAndTypeDescriptor #54.#58 // equals:(Ldemo/AllJavaSyntaxes$Rec;Ljava/lang/Object;)Z + 58: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Rec;Ljava/lang/Object;)Z" + 59: Utf8StringConstant "SourceFile" + 60: Utf8StringConstant "AllJavaSyntaxes.java" + 61: Utf8StringConstant "BootstrapMethods" + 62: MethodReference #63.#65 // java/lang/runtime/ObjectMethods.bootstrap:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object; + 63: TypeInfo #64 // java/lang/runtime/ObjectMethods + 64: Utf8StringConstant "java/lang/runtime/ObjectMethods" + 65: NameAndTypeDescriptor #66.#67 // bootstrap:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object; + 66: Utf8StringConstant "bootstrap" + 67: Utf8StringConstant "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object;" + 68: MethodHandle InvokeStatic #63.#65 // java/lang/runtime/ObjectMethods.bootstrap:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/TypeDescriptor;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/invoke/MethodHandle;)Ljava/lang/Object; + 69: StringConstant #70 // "s;l" + 70: Utf8StringConstant "s;l" + 71: MethodHandle GetField #1.#31 // demo/AllJavaSyntaxes$Rec.s:Ljava/lang/String; + 72: MethodHandle GetField #1.#33 // demo/AllJavaSyntaxes$Rec.l:Ljava/util/List; + 73: Utf8StringConstant "InnerClasses" + 74: TypeInfo #75 // demo/AllJavaSyntaxes + 75: Utf8StringConstant "demo/AllJavaSyntaxes" + 76: Utf8StringConstant "Rec" + 77: TypeInfo #78 // java/lang/invoke/MethodHandles$Lookup + 78: Utf8StringConstant "java/lang/invoke/MethodHandles$Lookup" + 79: TypeInfo #80 // java/lang/invoke/MethodHandles + 80: Utf8StringConstant "java/lang/invoke/MethodHandles" + 81: Utf8StringConstant "Lookup" + 82: Utf8StringConstant "NestHost" + 83: Utf8StringConstant "Record" + private final java.lang.String s; + Flags: PRIVATE, FINAL + private final java.util.List l; + Flags: PRIVATE, FINAL + Signature: Ljava/util/List; + public void (java.lang.String s, java.util.List l); + Flags: PUBLIC + Code: + stack=2, locals=3, arguments=2 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Record.:()V + 4: aload_1 /* s */ + 5: ifnonnull 13 + 8: ldc "" + 10: goto 14 + 13: aload_1 /* s */ + 14: astore_1 /* s */ + 15: aload_2 /* l */ + 16: ifnonnull 25 + 19: invokestatic java/util/List.of:()Ljava/util/List; + 22: goto 29 + 25: aload_2 /* l */ + 26: invokestatic java/util/List.copyOf:(Ljava/util/Collection;)Ljava/util/List; + 29: astore_2 /* l */ + 30: aload_0 /* this */ + 31: aload_1 /* s */ + 32: putfield demo/AllJavaSyntaxes$Rec.s:Ljava/lang/String; + 35: aload_0 /* this */ + 36: aload_2 /* l */ + 37: putfield demo/AllJavaSyntaxes$Rec.l:Ljava/util/List; + 40: return + Signature: + (Ljava/lang/String;Ljava/util/List;)V + MethodParameters: + Name Flags + ---- -------- + s MANDATED + l MANDATED + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------- + 0 41 0 this Ldemo/AllJavaSyntaxes$Rec; + 0 41 1 s Ljava/lang/String; + 0 41 2 l Ljava/util/List; + LocalVariableTypeTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------------ + 0 41 2 l Ljava/util/List; + StackMapTable: 00 04 FF 00 0D 00 03 07 00 01 07 00 28 07 00 15 00 00 40 07 00 28 0A 43 07 00 15 + public java.lang.String s(); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 + 1: getfield demo/AllJavaSyntaxes$Rec.s:Ljava/lang/String; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + public java.util.List l(); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 + 1: getfield demo/AllJavaSyntaxes$Rec.l:Ljava/util/List; + 4: areturn + Signature: + ()Ljava/util/List; + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + public final java.lang.String toString(); + Flags: PUBLIC, FINAL + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 + 1: invokedynamic BootstrapMethod #0, toString:(Ldemo/AllJavaSyntaxes$Rec;)Ljava/lang/String; + 6: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + public final int hashCode(); + Flags: PUBLIC, FINAL + Code: + stack=2, locals=1, arguments=0 + 0: aload_0 + 1: invokedynamic BootstrapMethod #0, hashCode:(Ldemo/AllJavaSyntaxes$Rec;)I + 6: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- + public final boolean equals(java.lang.Object p0); + Flags: PUBLIC, FINAL + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 + 1: aload_1 + 2: invokedynamic BootstrapMethod #0, equals:(Ldemo/AllJavaSyntaxes$Rec;Ljava/lang/Object;)Z + 7: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +class demo.AllJavaSyntaxes.StrictClass + Minor version: 0 + Major version: 69 + Flags: STATIC, STRICTFP, SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + static strictfp StrictClass = demo/AllJavaSyntaxes$StrictClass of demo/AllJavaSyntaxes + NestHost: 00 15 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$StrictClass + 2: Utf8StringConstant "demo/AllJavaSyntaxes$StrictClass" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: Utf8StringConstant "Code" + 8: MethodReference #3.#9 // java/lang/Object.:()V + 9: NameAndTypeDescriptor #5.#6 // :()V + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Ldemo/AllJavaSyntaxes$StrictClass;" + 14: Utf8StringConstant "value" + 15: Utf8StringConstant "()D" + 16: DoubleConstant 0.3333333333333333 + 18: Utf8StringConstant "SourceFile" + 19: Utf8StringConstant "AllJavaSyntaxes.java" + 20: Utf8StringConstant "InnerClasses" + 21: TypeInfo #22 // demo/AllJavaSyntaxes + 22: Utf8StringConstant "demo/AllJavaSyntaxes" + 23: Utf8StringConstant "StrictClass" + 24: Utf8StringConstant "NestHost" + void (); + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 5 0 this Ldemo/AllJavaSyntaxes$StrictClass; + double value(); + Code: + stack=2, locals=1, arguments=0 + 0: ldc2_w 0.3333333333333333 + 3: dreturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------- + 0 4 0 this Ldemo/AllJavaSyntaxes$StrictClass; +class demo.AllJavaSyntaxes.SuperInner + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + Signature: Ldemo/AllJavaSyntaxes$SuperOuter; + InnerClasses: + SuperInner = demo/AllJavaSyntaxes$SuperInner of demo/AllJavaSyntaxes + Deep = demo/AllJavaSyntaxes$SuperInner$Deep of demo/AllJavaSyntaxes$SuperInner + SuperOuter = demo/AllJavaSyntaxes$SuperOuter of demo/AllJavaSyntaxes + NestHost: 00 1D + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$SuperInner + 2: Utf8StringConstant "demo/AllJavaSyntaxes$SuperInner" + 3: TypeInfo #4 // demo/AllJavaSyntaxes$SuperOuter + 4: Utf8StringConstant "demo/AllJavaSyntaxes$SuperOuter" + 5: Utf8StringConstant "this$0" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$SuperInner.this$0:Ldemo/AllJavaSyntaxes; + 11: NameAndTypeDescriptor #5.#6 // this$0:Ldemo/AllJavaSyntaxes; + 12: MethodReference #3.#13 // demo/AllJavaSyntaxes$SuperOuter.:(Ldemo/AllJavaSyntaxes;)V + 13: NameAndTypeDescriptor #7.#8 // :(Ldemo/AllJavaSyntaxes;)V + 14: Utf8StringConstant "LineNumberTable" + 15: Utf8StringConstant "LocalVariableTable" + 16: Utf8StringConstant "this" + 17: Utf8StringConstant "Ldemo/AllJavaSyntaxes$SuperInner;" + 18: Utf8StringConstant "access$0" + 19: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$SuperInner;)Ljava/lang/String;" + 20: MethodReference #3.#21 // demo/AllJavaSyntaxes$SuperOuter.value:()Ljava/lang/String; + 21: NameAndTypeDescriptor #22.#23 // value:()Ljava/lang/String; + 22: Utf8StringConstant "value" + 23: Utf8StringConstant "()Ljava/lang/String;" + 24: Utf8StringConstant "SourceFile" + 25: Utf8StringConstant "AllJavaSyntaxes.java" + 26: Utf8StringConstant "Signature" + 27: Utf8StringConstant "Ldemo/AllJavaSyntaxes.SuperOuter;" + 28: Utf8StringConstant "InnerClasses" + 29: TypeInfo #30 // demo/AllJavaSyntaxes + 30: Utf8StringConstant "demo/AllJavaSyntaxes" + 31: Utf8StringConstant "SuperInner" + 32: TypeInfo #33 // demo/AllJavaSyntaxes$SuperInner$Deep + 33: Utf8StringConstant "demo/AllJavaSyntaxes$SuperInner$Deep" + 34: Utf8StringConstant "Deep" + 35: Utf8StringConstant "SuperOuter" + 36: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$SuperInner.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: aload_1 + 7: invokespecial demo/AllJavaSyntaxes$SuperOuter.:(Ldemo/AllJavaSyntaxes;)V + 10: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------------- + 0 11 0 this Ldemo/AllJavaSyntaxes$SuperInner; + static java.lang.String access$0(demo.AllJavaSyntaxes.SuperInner p0); + Flags: STATIC, SYNTHETIC + Code: + stack=1, locals=1, arguments=1 + 0: aload_0 + 1: invokespecial demo/AllJavaSyntaxes$SuperOuter.value:()Ljava/lang/String; + 4: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +class demo.AllJavaSyntaxes.SuperInner.Deep + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + SuperInner = demo/AllJavaSyntaxes$SuperInner of demo/AllJavaSyntaxes + Deep = demo/AllJavaSyntaxes$SuperInner$Deep of demo/AllJavaSyntaxes$SuperInner + NestHost: 00 1E + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$SuperInner$Deep + 2: Utf8StringConstant "demo/AllJavaSyntaxes$SuperInner$Deep" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "this$1" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes$SuperInner;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$SuperInner;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$SuperInner$Deep.this$1:Ldemo/AllJavaSyntaxes$SuperInner; + 11: NameAndTypeDescriptor #5.#6 // this$1:Ldemo/AllJavaSyntaxes$SuperInner; + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #7.#14 // :()V + 14: Utf8StringConstant "()V" + 15: Utf8StringConstant "LineNumberTable" + 16: Utf8StringConstant "LocalVariableTable" + 17: Utf8StringConstant "this" + 18: Utf8StringConstant "Ldemo/AllJavaSyntaxes$SuperInner$Deep;" + 19: Utf8StringConstant "value" + 20: Utf8StringConstant "()Ljava/lang/String;" + 21: MethodReference #22.#24 // demo/AllJavaSyntaxes$SuperInner.access$0:(Ldemo/AllJavaSyntaxes$SuperInner;)Ljava/lang/String; + 22: TypeInfo #23 // demo/AllJavaSyntaxes$SuperInner + 23: Utf8StringConstant "demo/AllJavaSyntaxes$SuperInner" + 24: NameAndTypeDescriptor #25.#26 // access$0:(Ldemo/AllJavaSyntaxes$SuperInner;)Ljava/lang/String; + 25: Utf8StringConstant "access$0" + 26: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$SuperInner;)Ljava/lang/String;" + 27: Utf8StringConstant "SourceFile" + 28: Utf8StringConstant "AllJavaSyntaxes.java" + 29: Utf8StringConstant "InnerClasses" + 30: TypeInfo #31 // demo/AllJavaSyntaxes + 31: Utf8StringConstant "demo/AllJavaSyntaxes" + 32: Utf8StringConstant "SuperInner" + 33: Utf8StringConstant "Deep" + 34: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes.SuperInner this$1; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes.SuperInner p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$SuperInner$Deep.this$1:Ldemo/AllJavaSyntaxes$SuperInner; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$SuperInner$Deep; + java.lang.String value(); + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: getfield demo/AllJavaSyntaxes$SuperInner$Deep.this$1:Ldemo/AllJavaSyntaxes$SuperInner; + 4: invokestatic demo/AllJavaSyntaxes$SuperInner.access$0:(Ldemo/AllJavaSyntaxes$SuperInner;)Ljava/lang/String; + 7: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------- + 0 8 0 this Ldemo/AllJavaSyntaxes$SuperInner$Deep; +class demo.AllJavaSyntaxes.SuperOuter + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + SuperOuter = demo/AllJavaSyntaxes$SuperOuter of demo/AllJavaSyntaxes + NestHost: 00 1A + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$SuperOuter + 2: Utf8StringConstant "demo/AllJavaSyntaxes$SuperOuter" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "this$0" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$SuperOuter.this$0:Ldemo/AllJavaSyntaxes; + 11: NameAndTypeDescriptor #5.#6 // this$0:Ldemo/AllJavaSyntaxes; + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #7.#14 // :()V + 14: Utf8StringConstant "()V" + 15: Utf8StringConstant "LineNumberTable" + 16: Utf8StringConstant "LocalVariableTable" + 17: Utf8StringConstant "this" + 18: Utf8StringConstant "Ldemo/AllJavaSyntaxes$SuperOuter;" + 19: Utf8StringConstant "value" + 20: Utf8StringConstant "()Ljava/lang/String;" + 21: StringConstant #22 // "outer" + 22: Utf8StringConstant "outer" + 23: Utf8StringConstant "SourceFile" + 24: Utf8StringConstant "AllJavaSyntaxes.java" + 25: Utf8StringConstant "InnerClasses" + 26: TypeInfo #27 // demo/AllJavaSyntaxes + 27: Utf8StringConstant "demo/AllJavaSyntaxes" + 28: Utf8StringConstant "SuperOuter" + 29: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$SuperOuter.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$SuperOuter; + java.lang.String value(); + Code: + stack=1, locals=1, arguments=0 + 0: ldc "outer" + 2: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------------------------------- + 0 3 0 this Ldemo/AllJavaSyntaxes$SuperOuter; +@interface demo.AllJavaSyntaxes.Tag + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface Tag = demo/AllJavaSyntaxes$Tag of demo/AllJavaSyntaxes + NestHost: 00 0F + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Tag + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Tag" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // java/lang/annotation/Annotation + 6: Utf8StringConstant "java/lang/annotation/Annotation" + 7: Utf8StringConstant "value" + 8: Utf8StringConstant "()Ljava/lang/String;" + 9: Utf8StringConstant "SourceFile" + 10: Utf8StringConstant "AllJavaSyntaxes.java" + 11: Utf8StringConstant "RuntimeVisibleAnnotations" + 12: Utf8StringConstant "Ljava/lang/annotation/Repeatable;" + 13: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Tags;" + 14: Utf8StringConstant "InnerClasses" + 15: TypeInfo #16 // demo/AllJavaSyntaxes + 16: Utf8StringConstant "demo/AllJavaSyntaxes" + 17: Utf8StringConstant "Tag" + 18: Utf8StringConstant "NestHost" + public abstract java.lang.String value(); + Flags: PUBLIC, ABSTRACT +class demo.AllJavaSyntaxes.Tagged + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface Tag = demo/AllJavaSyntaxes$Tag of demo/AllJavaSyntaxes + Tagged = demo/AllJavaSyntaxes$Tagged of demo/AllJavaSyntaxes + abstract static interface Tags = demo/AllJavaSyntaxes$Tags of demo/AllJavaSyntaxes + NestHost: 00 1E + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Tagged + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Tagged" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "this$0" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$Tagged.this$0:Ldemo/AllJavaSyntaxes; + 11: NameAndTypeDescriptor #5.#6 // this$0:Ldemo/AllJavaSyntaxes; + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #7.#14 // :()V + 14: Utf8StringConstant "()V" + 15: Utf8StringConstant "LineNumberTable" + 16: Utf8StringConstant "LocalVariableTable" + 17: Utf8StringConstant "this" + 18: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Tagged;" + 19: Utf8StringConstant "SourceFile" + 20: Utf8StringConstant "AllJavaSyntaxes.java" + 21: Utf8StringConstant "RuntimeInvisibleAnnotations" + 22: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Tags;" + 23: Utf8StringConstant "value" + 24: Utf8StringConstant "Ldemo/AllJavaSyntaxes$Tag;" + 25: Utf8StringConstant "one" + 26: Utf8StringConstant "two" + 27: Utf8StringConstant "InnerClasses" + 28: TypeInfo #29 // demo/AllJavaSyntaxes$Tag + 29: Utf8StringConstant "demo/AllJavaSyntaxes$Tag" + 30: TypeInfo #31 // demo/AllJavaSyntaxes + 31: Utf8StringConstant "demo/AllJavaSyntaxes" + 32: Utf8StringConstant "Tag" + 33: Utf8StringConstant "Tagged" + 34: TypeInfo #35 // demo/AllJavaSyntaxes$Tags + 35: Utf8StringConstant "demo/AllJavaSyntaxes$Tags" + 36: Utf8StringConstant "Tags" + 37: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$Tagged.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$Tagged; +@interface demo.AllJavaSyntaxes.Tags + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface Tag = demo/AllJavaSyntaxes$Tag of demo/AllJavaSyntaxes + abstract static interface Tags = demo/AllJavaSyntaxes$Tags of demo/AllJavaSyntaxes + NestHost: 00 0E + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$Tags + 2: Utf8StringConstant "demo/AllJavaSyntaxes$Tags" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // java/lang/annotation/Annotation + 6: Utf8StringConstant "java/lang/annotation/Annotation" + 7: Utf8StringConstant "value" + 8: Utf8StringConstant "()[Ldemo/AllJavaSyntaxes$Tag;" + 9: Utf8StringConstant "SourceFile" + 10: Utf8StringConstant "AllJavaSyntaxes.java" + 11: Utf8StringConstant "InnerClasses" + 12: TypeInfo #13 // demo/AllJavaSyntaxes$Tag + 13: Utf8StringConstant "demo/AllJavaSyntaxes$Tag" + 14: TypeInfo #15 // demo/AllJavaSyntaxes + 15: Utf8StringConstant "demo/AllJavaSyntaxes" + 16: Utf8StringConstant "Tag" + 17: Utf8StringConstant "Tags" + 18: Utf8StringConstant "NestHost" + public abstract demo.AllJavaSyntaxes.Tag[] value(); + Flags: PUBLIC, ABSTRACT +@interface demo.AllJavaSyntaxes.TypeUse + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface TypeUse = demo/AllJavaSyntaxes$TypeUse of demo/AllJavaSyntaxes + NestHost: 00 0F + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$TypeUse + 2: Utf8StringConstant "demo/AllJavaSyntaxes$TypeUse" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // java/lang/annotation/Annotation + 6: Utf8StringConstant "java/lang/annotation/Annotation" + 7: Utf8StringConstant "SourceFile" + 8: Utf8StringConstant "AllJavaSyntaxes.java" + 9: Utf8StringConstant "RuntimeVisibleAnnotations" + 10: Utf8StringConstant "Ljava/lang/annotation/Target;" + 11: Utf8StringConstant "value" + 12: Utf8StringConstant "Ljava/lang/annotation/ElementType;" + 13: Utf8StringConstant "TYPE_USE" + 14: Utf8StringConstant "InnerClasses" + 15: TypeInfo #16 // demo/AllJavaSyntaxes + 16: Utf8StringConstant "demo/AllJavaSyntaxes" + 17: Utf8StringConstant "TypeUse" + 18: Utf8StringConstant "NestHost" +@interface demo.AllJavaSyntaxes.WithDefaults + Minor version: 0 + Major version: 69 + Flags: ABSTRACT, STATIC, INTERFACE + SourceFile: AllJavaSyntaxes.java + InnerClasses: + abstract static interface WithDefaults = demo/AllJavaSyntaxes$WithDefaults of demo/AllJavaSyntaxes + NestHost: 00 16 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$WithDefaults + 2: Utf8StringConstant "demo/AllJavaSyntaxes$WithDefaults" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // java/lang/annotation/Annotation + 6: Utf8StringConstant "java/lang/annotation/Annotation" + 7: Utf8StringConstant "number" + 8: Utf8StringConstant "()I" + 9: Utf8StringConstant "AnnotationDefault" + 10: IntegerConstant 42 + 11: Utf8StringConstant "text" + 12: Utf8StringConstant "()Ljava/lang/String;" + 13: Utf8StringConstant "default" + 14: Utf8StringConstant "type" + 15: Utf8StringConstant "()Ljava/lang/Class;" + 16: Utf8StringConstant "Signature" + 17: Utf8StringConstant "()Ljava/lang/Class<*>;" + 18: Utf8StringConstant "Ljava/lang/Object;" + 19: Utf8StringConstant "SourceFile" + 20: Utf8StringConstant "AllJavaSyntaxes.java" + 21: Utf8StringConstant "InnerClasses" + 22: TypeInfo #23 // demo/AllJavaSyntaxes + 23: Utf8StringConstant "demo/AllJavaSyntaxes" + 24: Utf8StringConstant "WithDefaults" + 25: Utf8StringConstant "NestHost" + public abstract int number(); + Flags: PUBLIC, ABSTRACT + public abstract java.lang.String text(); + Flags: PUBLIC, ABSTRACT + public abstract java.lang.Class type(); + Flags: PUBLIC, ABSTRACT + Signature: + ()Ljava/lang/Class<*>; +class demo.AllJavaSyntaxes.Local + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + EnclosingType: demo/AllJavaSyntaxes + EnclosingMethod: demo/AllJavaSyntaxes.localClass:()V + InnerClasses: + Local = demo/AllJavaSyntaxes$1Local + NestHost: 00 1A + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$1Local + 2: Utf8StringConstant "demo/AllJavaSyntaxes$1Local" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "this$0" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$1Local.this$0:Ldemo/AllJavaSyntaxes; + 11: NameAndTypeDescriptor #5.#6 // this$0:Ldemo/AllJavaSyntaxes; + 12: MethodReference #3.#13 // java/lang/Object.:()V + 13: NameAndTypeDescriptor #7.#14 // :()V + 14: Utf8StringConstant "()V" + 15: Utf8StringConstant "LineNumberTable" + 16: Utf8StringConstant "LocalVariableTable" + 17: Utf8StringConstant "this" + 18: Utf8StringConstant "Ldemo/AllJavaSyntaxes$1Local;" + 19: Utf8StringConstant "value" + 20: Utf8StringConstant "()Ljava/lang/String;" + 21: StringConstant #22 // "local" + 22: Utf8StringConstant "local" + 23: Utf8StringConstant "SourceFile" + 24: Utf8StringConstant "AllJavaSyntaxes.java" + 25: Utf8StringConstant "EnclosingMethod" + 26: TypeInfo #27 // demo/AllJavaSyntaxes + 27: Utf8StringConstant "demo/AllJavaSyntaxes" + 28: NameAndTypeDescriptor #29.#14 // localClass:()V + 29: Utf8StringConstant "localClass" + 30: Utf8StringConstant "InnerClasses" + 31: Utf8StringConstant "Local" + 32: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$1Local.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 10 0 this Ldemo/AllJavaSyntaxes$1Local; + java.lang.String value(); + Code: + stack=1, locals=1, arguments=0 + 0: ldc "local" + 2: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ----------------------------- + 0 3 0 this Ldemo/AllJavaSyntaxes$1Local; +class demo.AllJavaSyntaxes$2demo.AllJavaSyntaxes.AllJavaSyntaxes$2 + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + Signature: Ljava/lang/Object;Ljava/util/Comparator; + EnclosingType: demo/AllJavaSyntaxes + EnclosingMethod: demo/AllJavaSyntaxes.diamondAnonymous:()V + InnerClasses: + demo/AllJavaSyntaxes$2 + NestHost: 00 28 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$2 + 2: Utf8StringConstant "demo/AllJavaSyntaxes$2" + 3: TypeInfo #4 // java/lang/Object + 4: Utf8StringConstant "java/lang/Object" + 5: TypeInfo #6 // java/util/Comparator + 6: Utf8StringConstant "java/util/Comparator" + 7: Utf8StringConstant "this$0" + 8: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 9: Utf8StringConstant "" + 10: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;)V" + 11: Utf8StringConstant "Code" + 12: FieldReference #1.#13 // demo/AllJavaSyntaxes$2.this$0:Ldemo/AllJavaSyntaxes; + 13: NameAndTypeDescriptor #7.#8 // this$0:Ldemo/AllJavaSyntaxes; + 14: MethodReference #3.#15 // java/lang/Object.:()V + 15: NameAndTypeDescriptor #9.#16 // :()V + 16: Utf8StringConstant "()V" + 17: Utf8StringConstant "LineNumberTable" + 18: Utf8StringConstant "LocalVariableTable" + 19: Utf8StringConstant "this" + 20: Utf8StringConstant "Ldemo/AllJavaSyntaxes$2;" + 21: Utf8StringConstant "compare" + 22: Utf8StringConstant "(Ljava/lang/String;Ljava/lang/String;)I" + 23: MethodReference #24.#26 // java/lang/String.compareTo:(Ljava/lang/String;)I + 24: TypeInfo #25 // java/lang/String + 25: Utf8StringConstant "java/lang/String" + 26: NameAndTypeDescriptor #27.#28 // compareTo:(Ljava/lang/String;)I + 27: Utf8StringConstant "compareTo" + 28: Utf8StringConstant "(Ljava/lang/String;)I" + 29: Utf8StringConstant "a" + 30: Utf8StringConstant "Ljava/lang/String;" + 31: Utf8StringConstant "b" + 32: Utf8StringConstant "(Ljava/lang/Object;Ljava/lang/Object;)I" + 33: MethodReference #1.#34 // demo/AllJavaSyntaxes$2.compare:(Ljava/lang/String;Ljava/lang/String;)I + 34: NameAndTypeDescriptor #21.#22 // compare:(Ljava/lang/String;Ljava/lang/String;)I + 35: Utf8StringConstant "SourceFile" + 36: Utf8StringConstant "AllJavaSyntaxes.java" + 37: Utf8StringConstant "Signature" + 38: Utf8StringConstant "Ljava/lang/Object;Ljava/util/Comparator;" + 39: Utf8StringConstant "EnclosingMethod" + 40: TypeInfo #41 // demo/AllJavaSyntaxes + 41: Utf8StringConstant "demo/AllJavaSyntaxes" + 42: NameAndTypeDescriptor #43.#16 // diamondAnonymous:()V + 43: Utf8StringConstant "diamondAnonymous" + 44: Utf8StringConstant "InnerClasses" + 45: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0); + Flags: SYNTHETIC, ANONCONSTR + Code: + stack=2, locals=2, arguments=1 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$2.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: invokespecial java/lang/Object.:()V + 9: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------ + 0 10 0 this Ldemo/AllJavaSyntaxes$2; + public int compare(java.lang.String a, java.lang.String b); + Flags: PUBLIC + Code: + stack=2, locals=3, arguments=2 + 0: aload_1 /* a */ + 1: aload_2 /* b */ + 2: invokevirtual java/lang/String.compareTo:(Ljava/lang/String;)I + 5: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------ + 0 6 0 this Ldemo/AllJavaSyntaxes$2; + 0 6 1 a Ljava/lang/String; + 0 6 2 b Ljava/lang/String; + public int compare(java.lang.Object p0, java.lang.Object p1); + Flags: PUBLIC, BRIDGE, SYNTHETIC + Code: + stack=3, locals=3, arguments=2 + 0: aload_0 + 1: aload_1 + 2: checkcast Ljava/lang/String; + 5: aload_2 + 6: checkcast Ljava/lang/String; + 9: invokevirtual demo/AllJavaSyntaxes$2.compare:(Ljava/lang/String;Ljava/lang/String;)I + 12: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- --------- +class demo.AllJavaSyntaxes$1demo.AllJavaSyntaxes.AllJavaSyntaxes$1 + Minor version: 0 + Major version: 69 + Flags: SUPER + SourceFile: AllJavaSyntaxes.java + Signature: Ldemo/AllJavaSyntaxes$Outer$Inner; + EnclosingType: demo/AllJavaSyntaxes + EnclosingMethod: demo/AllJavaSyntaxes.qualifiedNew:(Ldemo/AllJavaSyntaxes$Outer;)V + InnerClasses: + demo/AllJavaSyntaxes$1 + Outer = demo/AllJavaSyntaxes$Outer of demo/AllJavaSyntaxes + Inner = demo/AllJavaSyntaxes$Outer$Inner of demo/AllJavaSyntaxes$Outer + NestHost: 00 18 + Constant Pool: + 1: TypeInfo #2 // demo/AllJavaSyntaxes$1 + 2: Utf8StringConstant "demo/AllJavaSyntaxes$1" + 3: TypeInfo #4 // demo/AllJavaSyntaxes$Outer$Inner + 4: Utf8StringConstant "demo/AllJavaSyntaxes$Outer$Inner" + 5: Utf8StringConstant "this$0" + 6: Utf8StringConstant "Ldemo/AllJavaSyntaxes;" + 7: Utf8StringConstant "" + 8: Utf8StringConstant "(Ldemo/AllJavaSyntaxes;Ldemo/AllJavaSyntaxes$Outer;)V" + 9: Utf8StringConstant "Code" + 10: FieldReference #1.#11 // demo/AllJavaSyntaxes$1.this$0:Ldemo/AllJavaSyntaxes; + 11: NameAndTypeDescriptor #5.#6 // this$0:Ldemo/AllJavaSyntaxes; + 12: MethodReference #3.#13 // demo/AllJavaSyntaxes$Outer$Inner.:(Ldemo/AllJavaSyntaxes$Outer;)V + 13: NameAndTypeDescriptor #7.#14 // :(Ldemo/AllJavaSyntaxes$Outer;)V + 14: Utf8StringConstant "(Ldemo/AllJavaSyntaxes$Outer;)V" + 15: Utf8StringConstant "LineNumberTable" + 16: Utf8StringConstant "LocalVariableTable" + 17: Utf8StringConstant "this" + 18: Utf8StringConstant "Ldemo/AllJavaSyntaxes$1;" + 19: Utf8StringConstant "SourceFile" + 20: Utf8StringConstant "AllJavaSyntaxes.java" + 21: Utf8StringConstant "Signature" + 22: Utf8StringConstant "Ldemo/AllJavaSyntaxes.Outer.Inner;" + 23: Utf8StringConstant "EnclosingMethod" + 24: TypeInfo #25 // demo/AllJavaSyntaxes + 25: Utf8StringConstant "demo/AllJavaSyntaxes" + 26: NameAndTypeDescriptor #27.#14 // qualifiedNew:(Ldemo/AllJavaSyntaxes$Outer;)V + 27: Utf8StringConstant "qualifiedNew" + 28: Utf8StringConstant "InnerClasses" + 29: TypeInfo #30 // demo/AllJavaSyntaxes$Outer + 30: Utf8StringConstant "demo/AllJavaSyntaxes$Outer" + 31: Utf8StringConstant "Outer" + 32: Utf8StringConstant "Inner" + 33: Utf8StringConstant "NestHost" + final demo.AllJavaSyntaxes this$0; + Flags: FINAL, SYNTHETIC + void (demo.AllJavaSyntaxes p0, demo.AllJavaSyntaxes.Outer p1); + Flags: SYNTHETIC, ANONCONSTR + Code: + stack=2, locals=3, arguments=2 + 0: aload_0 /* this */ + 1: aload_1 + 2: putfield demo/AllJavaSyntaxes$1.this$0:Ldemo/AllJavaSyntaxes; + 5: aload_0 /* this */ + 6: aload_2 + 7: invokespecial demo/AllJavaSyntaxes$Outer$Inner.:(Ldemo/AllJavaSyntaxes$Outer;)V + 10: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------ + 0 11 0 this Ldemo/AllJavaSyntaxes$1; diff --git a/Procyon.Decompiler/src/test/resources/txt/all-java-syntaxes/all-java-syntaxes.txt b/Procyon.Decompiler/src/test/resources/txt/all-java-syntaxes/all-java-syntaxes.txt new file mode 100644 index 00000000..327170af --- /dev/null +++ b/Procyon.Decompiler/src/test/resources/txt/all-java-syntaxes/all-java-syntaxes.txt @@ -0,0 +1,799 @@ +package demo; +import java.lang.invoke.CallSite; +import java.lang.reflect.UndeclaredThrowableException; +import java.lang.invoke.MethodHandle; +import java.lang.runtime.SwitchBootstraps; +import java.lang.invoke.MethodType; +import java.lang.invoke.MethodHandles; +import java.lang.annotation.Repeatable; +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Retention; +import java.util.Collection; +import java.util.Iterator; +import java.util.Objects; +import java.util.Comparator; +import java.math.BigDecimal; +import java.io.BufferedReader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.function.Supplier; +import java.util.Optional; +import java.util.function.Function; +import java.util.function.Consumer; +import java.util.stream.Stream; +import java.util.concurrent.Callable; +import java.util.concurrent.atomic.AtomicInteger; +import java.io.Serializable; +import java.util.ArrayList; +public abstract class AllJavaSyntaxes> extends ArrayList implements Serializable, Comparable, Iterable +{ + private static final long serialVersionUID = 1L; + private static final AtomicInteger COUNTER; + public abstract void log(final String p0); + @Tags({ @Tag("one"), @Tag("two") }) + class Tagged + { + } + sealed interface Shape permits Circle, Rectangle + { + double area(); + } + interface Named + { + String name(); + } + interface Identified + { + long id(); + } + @Retention(RetentionPolicy.RUNTIME) + @Target({ ElementType.TYPE, ElementType.METHOD }) + @interface Marker { + } + @Repeatable(Tags.class) + @interface Tag { + String value(); + } + @interface Tags { + Tag[] value(); + } + @Target({ ElementType.TYPE_USE }) + @interface TypeUse { + } + @interface WithDefaults { + int number() default 42; + String text() default "default"; + Class type() default Object.class; + } + // This helper class was generated by Procyon to approximate the behavior of an + // 'invokedynamic' instruction that it doesn't know how to interpret. + private static final class ProcyonInvokeDynamicHelper_1 + { + private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + private static MethodHandle handle; + private static volatile int fence; + private static MethodHandle handle() { + final MethodHandle handle = ProcyonInvokeDynamicHelper_1.handle; + if (handle != null) + return handle; + return ProcyonInvokeDynamicHelper_1.ensureHandle(); + } + private static MethodHandle ensureHandle() { + ProcyonInvokeDynamicHelper_1.fence = 0; + MethodHandle handle = ProcyonInvokeDynamicHelper_1.handle; + if (handle == null) { + MethodHandles.Lookup lookup = ProcyonInvokeDynamicHelper_1.LOOKUP; + try { + handle = ((CallSite)SwitchBootstraps.typeSwitch(lookup, "typeSwitch", MethodType.methodType(int.class, Object.class, int.class), String.class)).dynamicInvoker(); + } catch (Throwable t) { + throw new UndeclaredThrowableException(t); + } + ProcyonInvokeDynamicHelper_1.fence = 1; + ProcyonInvokeDynamicHelper_1.handle = handle; + ProcyonInvokeDynamicHelper_1.fence = 0; + } + return handle; + } + private static int invoke(Object p0, int p1) { + try { + return ProcyonInvokeDynamicHelper_1.handle().invokeExact(p0, p1); + } catch (Throwable t) { + throw new UndeclaredThrowableException(t); + } + } + } + // This helper class was generated by Procyon to approximate the behavior of an + // 'invokedynamic' instruction that it doesn't know how to interpret. + private static final class ProcyonInvokeDynamicHelper_2 + { + private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + private static MethodHandle handle; + private static volatile int fence; + private static MethodHandle handle() { + final MethodHandle handle = ProcyonInvokeDynamicHelper_2.handle; + if (handle != null) + return handle; + return ProcyonInvokeDynamicHelper_2.ensureHandle(); + } + private static MethodHandle ensureHandle() { + ProcyonInvokeDynamicHelper_2.fence = 0; + MethodHandle handle = ProcyonInvokeDynamicHelper_2.handle; + if (handle == null) { + MethodHandles.Lookup lookup = ProcyonInvokeDynamicHelper_2.LOOKUP; + try { + handle = ((CallSite)SwitchBootstraps.typeSwitch(lookup, "typeSwitch", MethodType.methodType(int.class, Object.class, int.class), Circle.class, Rectangle.class)).dynamicInvoker(); + } catch (Throwable t) { + throw new UndeclaredThrowableException(t); + } + ProcyonInvokeDynamicHelper_2.fence = 1; + ProcyonInvokeDynamicHelper_2.handle = handle; + ProcyonInvokeDynamicHelper_2.fence = 0; + } + return handle; + } + private static int invoke(Object p0, int p1) { + try { + return ProcyonInvokeDynamicHelper_2.handle().invokeExact(p0, p1); + } catch (Throwable t) { + throw new UndeclaredThrowableException(t); + } + } + } + // This helper class was generated by Procyon to approximate the behavior of an + // 'invokedynamic' instruction that it doesn't know how to interpret. + private static final class ProcyonInvokeDynamicHelper_3 + { + private static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + private static MethodHandle handle; + private static volatile int fence; + private static MethodHandle handle() { + final MethodHandle handle = ProcyonInvokeDynamicHelper_3.handle; + if (handle != null) + return handle; + return ProcyonInvokeDynamicHelper_3.ensureHandle(); + } + private static MethodHandle ensureHandle() { + ProcyonInvokeDynamicHelper_3.fence = 0; + MethodHandle handle = ProcyonInvokeDynamicHelper_3.handle; + if (handle == null) { + MethodHandles.Lookup lookup = ProcyonInvokeDynamicHelper_3.LOOKUP; + try { + handle = ((CallSite)SwitchBootstraps.typeSwitch(lookup, "typeSwitch", MethodType.methodType(int.class, Object.class, int.class), Success.class, Failure.class)).dynamicInvoker(); + } catch (Throwable t) { + throw new UndeclaredThrowableException(t); + } + ProcyonInvokeDynamicHelper_3.fence = 1; + ProcyonInvokeDynamicHelper_3.handle = handle; + ProcyonInvokeDynamicHelper_3.fence = 0; + } + return handle; + } + private static int invoke(Object p0, int p1) { + try { + return ProcyonInvokeDynamicHelper_3.handle().invokeExact(p0, p1); + } catch (Throwable t) { + throw new UndeclaredThrowableException(t); + } + } + } + public AllJavaSyntaxes() { + } + private static transient volatile char[] CHARS = { 'A', 'B' }; + static { + COUNTER = new AtomicInteger(); + final int x = 1; + final int y = 2; + init(); + } + @Deprecated(forRemoval = true, since = "11") + void deprecatedMethod() { + } + private static void init() { + AllJavaSyntaxes.COUNTER.incrementAndGet(); + } + @SafeVarargs + protected final Object[] methodReferencesAndLambdas(final T... arguments) { + Stream.of(arguments).forEach(System.out::println); + return Stream.of(arguments).map((Function)Object::toString).toArray(Object[]::new); + } + void classicFor(final String[] arguments) { + for (int index = 0; index < arguments.length; ++index) { + this.log(arguments[index]); + } + for (int index = 0; index < arguments.length; ++index) { + this.log(arguments[index]); + } + } + void whileLoop(final String[] arguments) { + int index = 0; + while (index < arguments.length) { + this.log(arguments[index++]); + } + index = 0; + while (index < arguments.length) { + this.log(arguments[index++]); + } + } + void doWhileLoop(final String[] arguments) { + int index = 0; + do { + this.log(arguments[index++]); + } while (index < arguments.length); + index = 0; + do { + this.log(arguments[index++]); + } while (index < arguments.length); + } + void lambdaAndOptional() { + final Supplier supplier = () -> "value"; + final Function function = String::length; + Optional.ofNullable(supplier.get()).map((Function)function).ifPresent(length -> this.log("length=" + String.valueOf(length))); + } + void typedLambdaParams(final List list) { + list.sort((a, b) -> b.compareTo(a)); + } + void unTypedLambdaParams(final List list) { + list.sort((a, b) -> b.compareTo(a)); + } + synchronized void synchronizedMethod() { + this.log("synchronized"); + } + void tryCatchFinally() { + try { + if (AllJavaSyntaxes.COUNTER.get() < 0) { + throw new IllegalStateException(); + } + } catch (final RuntimeException exception) { + this.log(exception.getClass().getSimpleName()); + return; + } finally { + this.log("finally"); + } + this.log("finally"); + } + void tryWithResources(final Path path) { + try { + Throwable t = null; + try { + final BufferedReader br = Files.newBufferedReader(path); + try { + String line; + while ((line = br.readLine()) != null) { + this.log(line); + } + } finally { + if (br != null) { + br.close(); + } + } + } finally { + if (t == null) { + final Throwable t2; + t = t2; + } else { + final Throwable t2; + if (t != t2) { + t.addSuppressed(t2); + } + } + } + } catch (final IOException exception) { + this.log(exception.getMessage()); + } + } + void assertions(final int value) { + assert value >= 0 : "negative"; + } + void boxingAndNumbers() { + final Integer boxed = 1; + final int primitive = boxed; + final BigDecimal decimal = BigDecimal.valueOf(primitive); + this.log(decimal.toPlainString()); + } + void instanceofPattern(final Object object) { + if (object instanceof final String text) { + if (!text.isEmpty()) { + this.log(text); + } + } + } + void enumSwitch(final Day day) { + switch (day) { + case MONDAY: + case TUESDAY: { + this.log("weekday"); + break; + } + default: { + this.log("other"); + break; + } + } + } + public String expressionSwitch(final int value) { + return switch (value) { + case 0 -> "zero"; + case 1 -> "one"; + default -> throw new IllegalArgumentException(); + }; + } + @Override + public int compareTo(final E other) { + return Comparator.naturalOrder().compare(null, other); + } + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), AllJavaSyntaxes.COUNTER.get()); + } + @Override + public boolean equals(final Object object) { + return this == object || (super.equals(object) && this.getClass() == object.getClass()); + } + static class Entity implements Named, Identified, Comparable + { + private long id; + private String name; + Entity(final long id, final String name) { + this.id = id; + this.name = name; + } + @Override + public String name() { + return this.name; + } + @Override + public long id() { + return this.id; + } + @Override + public int hashCode() { + return Objects.hash(this.id, this.name); + } + @Override + public boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (this.getClass() != obj.getClass()) { + return false; + } + final Entity other = (Entity)obj; + return this.id == other.id && Objects.equals(this.name, other.name); + } + @Override + public int compareTo(final Entity other) { + return Long.compare(this.id, other.id); + } + } + static > T intersectionBound(final T value) { + return value; + } + void intersectionCast(final Object object) { + this.log(((Named)object).name()); + } + static final class Circle implements Shape + { + private final double radius; + Circle(final double radius) { + this.radius = radius; + } + @Override + public double area() { + return 3.141592653589793 * this.radius * this.radius; + } + } + static final class Rectangle implements Shape + { + private final double width; + private final double height; + Rectangle(final double width, final double height) { + this.width = width; + this.height = height; + } + @Override + public double area() { + return this.width * this.height; + } + } + void guardedPattern(final Object object) { + Objects.requireNonNull(object); + Object o = object; + boolean b = false; + Label_0061: + while (true) { + switch (/* invokedynamic(!) */ProcyonInvokeDynamicHelper_1.invoke(o, b)) { + case 0: { + final String s = (String)object; + if (s.length() > 3) { + this.log(s); + break Label_0061; + } + o = object; + b = true; + continue; + } + default: { + break Label_0061; + } + } + } + } + double sealedSwitch(final Shape shape) { + Objects.requireNonNull(shape); + return switch (/* invokedynamic(!) */ProcyonInvokeDynamicHelper_2.invoke(shape, false)) { + case 0 -> { + final Circle circle = (Circle)shape; + yield circle.area(); + } + case 1 -> { + final Rectangle rectangle = (Rectangle)shape; + yield rectangle.area(); + } + default -> throw new MatchException((String)null, (Throwable)null); + }; + } + abstract static sealed class Result permits Success, Failure + { + private Result() { + } + } + static final class Success extends Result + { + private final T value; + Success(final T value) { + this.value = value; + } + T value() { + return this.value; + } + } + static final class Failure extends Result + { + private final Exception exception; + Failure(final Exception exception) { + this.exception = exception; + } + Exception exception() { + return this.exception; + } + } + String handleResult(final Result result) { + Objects.requireNonNull(result); + return switch (/* invokedynamic(!) */ProcyonInvokeDynamicHelper_3.invoke(result, false)) { + case 0 -> { + final Success success = (Success)result; + yield "success:" + String.valueOf(success.value()); + } + case 1 -> { + final Failure failure = (Failure)result; + yield "failure:" + failure.exception().getClass().getSimpleName(); + } + default -> throw new MatchException((String)null, (Throwable)null); + }; + } + class Inner + { + Inner() { + AllJavaSyntaxes.this.log("Inner constructor"); + } + void anonymousClass() { + new Thread(new Runnable() { + private static final long CONSTANT = 1L; + int index = -1; + @Override + public void run() { + AllJavaSyntaxes.this.log("index=" + this.index + ",constant=1"); + } + }).start(); + } + void lambda() { + new Thread(() -> AllJavaSyntaxes.this.log("Inner.lambda")).start(); + } + } + record Rec(String s, List l) { + public Rec { + s = ((s == null) ? "" : s); + l = ((l == null) ? List.of() : List.copyOf((Collection)l)); + } + } + enum Day + { + MONDAY("MONDAY", 0), + TUESDAY("TUESDAY", 1), + WEDNESDAY("WEDNESDAY", 2), + THURSDAY("THURSDAY", 3), + FRIDAY("FRIDAY", 4), + SATURDAY("SATURDAY", 5), + SUNDAY("SUNDAY", 6); + private Day(final String s, final int n) { + } + } + static T genericMethod(final T value) { + return value; + } + transient Callable callable = () -> "callable"; + void labeledLoops() { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 3; ++j) { + if (i == j) { + break; + } + if (i + j > 3) { + break; + } + } + } + } + void labeledBlock() { + if (AllJavaSyntaxes.COUNTER.get() < 0) { + this.log("unreachable"); + } + } + void localVar() { + final int number = 123; + final String text = "text"; + final ArrayList list = new ArrayList(); + this.log(text + number + list.size()); + } + void multiCatch() throws Exception { + try { + throw new IOException(); + } catch (final IOException | RuntimeException exception) { + throw exception; + } + } + void suppressed() throws Exception { + final Exception primary = new Exception("primary"); + final Exception secondary = new Exception("secondary"); + primary.addSuppressed(secondary); + throw primary; + } + String throwExpression(final Integer value) { + return Optional.ofNullable(value).map((Function)Object::toString).orElseThrow(() -> new IllegalArgumentException()); + } + void synchronizedBlock() { + synchronized (this) { + this.log("sync"); + } + } + void localClass() { + class Local + { + String value() { + return "local"; + } + } + this.log(new Local().value()); + } + static class GenericConstructor + { + GenericConstructor(final T value) { + } + } + void intersectionThrows() throws T, Exception { + } + void wildcard(final List list) { + this.capture(list); + } + private void capture(final List list) { + for (final T element : list) { + this.log(String.valueOf(element)); + } + } + interface AdvancedInterface + { + default String defaultMethod() { + return this.privateHelper(); + } + default String staticMethod() { + return "static"; + } + default String privateHelper() { + return "private"; + } + } + void typeUse() { + final String value = "x"; + final List list = List.of((Object)value); + this.log(list.get(0)); + } + void arrays() { + final int[] array = new int[0]; + final int[] array2 = { 1, 2, 3 }; + final String[][] array3 = { { "a" }, { "b" } }; + final int[] array4 = { 0 }; + (new int[2])[1] = 1; + final int[][] array5 = { { 1, 2, 3 }, { 4, 5, 6 } }; + } + void literals() { + final int bin = 10; + final int hex = 255; + final long underscore = 1000000L; + final float f = 1.0f; + final double d = 1000.0; + final char ch = 'A'; + this.log("" + bin + hex + underscore + f + d + ch); + } + void textBlock() { + final String text = """ + line1 + line2 + """; + this.log(text); + } + int switchYield(final int i) { + return switch (i) { + case 0 -> 10; + default -> -1; + }; + } + abstract static class Base + { + String value() { + return "base"; + } + } + class Derived extends Base + { + Derived(final AllJavaSyntaxes allJavaSyntaxes) { + this(allJavaSyntaxes, "x"); + } + Derived(final String s) { + } + @Override + String value() { + return super.value(); + } + void qualifiedThis() { + AllJavaSyntaxes.this.log("qualified"); + } + } + enum Operation permits AllJavaSyntaxes$Operation$1, AllJavaSyntaxes$Operation$2 + { + ADD { + @Override + int apply(final int a, final int b) { + return a + b; + } + }, + SUB { + @Override + int apply(final int a, final int b) { + return a - b; + } + }; + private Operation(final String s, final int n) { + } + native int apply(final int p0, final int p1); + } + void allOperators() { + int a = 10; + final int b = 3; + final int n = a / b; + final int n2 = a % b; + ++a; + --a; + ++a; + if (--a > b) {} + final boolean b2 = "x" instanceof String; + final long widened = a; + new Object(); + final int[] array = new int[3]; + final int element = array[0]; + this.log(String.valueOf(element)); + final int length = array.length; + String::length; + () -> 42; + this.log("this"); + super.size(); + String::compareTo; + final int[][] matrix = new int[1][1]; + final int length2 = matrix[0].length; + () -> this.log("run"); + ArrayList::new; + final int yielded = switch (a) { + case 0 -> 0; + default -> 1; + }; + assert yielded >= 0; + final RuntimeException exception = new RuntimeException(); + if (exception == null) {} + for (int i = 0, j = 10; i < j; ++i, --j) { + this.log(i + ":" + j); + } + } + class Outer + { + int value = 1; + final /* synthetic */ AllJavaSyntaxes this$0; + Outer() { + } + class Inner + { + final /* synthetic */ Outer this$1; + Inner() { + Outer.this.this$0.log("Inner"); + } + class Deep + { + Deep() { + Inner.this.this$1.this$0.log("Deep"); + } + } + } + static class StaticNested + { + StaticNested() { + System.out.println("StaticNested"); + } + } + } + void qualifiedNew(final Outer outer) { + final Outer.Inner inner = outer.new Inner(); + outer.new Inner().new Deep(); + final Outer.Inner inner2 = outer.new Inner(); + new Outer().new Inner(); + outer.getClass(); + final Outer.Inner inner3 = new Outer.Inner(outer) {}; + new Outer.StaticNested(); + new Outer.StaticNested(); + } + void receiverParameter() { + this.log("receiver"); + } + void diamondAnonymous() { + final Comparator c = new Comparator() { + @Override + public int compare(final String a, final String b) { + return a.compareTo(b); + } + }; + this.log(String.valueOf(c.compare("a", "b"))); + } + void emptyStatement(final boolean flag) { + while (flag) {} + } + class SuperOuter + { + String value() { + return "outer"; + } + } + class SuperInner extends SuperOuter + { + class Deep + { + String value() { + return SuperOuter.this.value(); + } + } + } + void multiDimVarargs(final int[]... values) { + this.log(String.valueOf(values.length)); + } + double strict(final double a, final double b) { + return a / b; + } + static strictfp class StrictClass + { + double value() { + return 0.3333333333333333; + } + } + void chainedAssignment() { + final int c; + final int a; + final int b = a = (c = 10); + this.log(String.valueOf(a + b + c)); + } + void parameterAnnotation(@Deprecated final String value) { + this.log(value); + } +} diff --git a/Procyon.Decompiler/src/test/resources/txt/platform-1.0.0/module-info.txt b/Procyon.Decompiler/src/test/resources/txt/platform-1.0.0/module-info.txt new file mode 100644 index 00000000..39525c4c --- /dev/null +++ b/Procyon.Decompiler/src/test/resources/txt/platform-1.0.0/module-info.txt @@ -0,0 +1,16 @@ +module com.example.platform { + requires java.base mandated; + requires java.sql; + requires transitive java.xml; + requires static java.compiler; + + exports com.example.platform.api; + exports com.example.platform.internal to java.logging; + + opens com.example.platform.model; + opens com.example.platform.persistence to java.sql; + + uses java.sql.Driver; + + provides java.sql.Driver with com.example.platform.impl.ExampleSqlDriver; +} diff --git a/Procyon.Decompiler/src/test/resources/txt/platform-1.0.0/platform-1.0.0-bytecode.txt b/Procyon.Decompiler/src/test/resources/txt/platform-1.0.0/platform-1.0.0-bytecode.txt new file mode 100644 index 00000000..b5f754b4 --- /dev/null +++ b/Procyon.Decompiler/src/test/resources/txt/platform-1.0.0/platform-1.0.0-bytecode.txt @@ -0,0 +1,342 @@ +class com.example.platform.api.ApiMarker + Minor version: 0 + Major version: 65 + Flags: PUBLIC, FINAL, SUPER + SourceFile: ApiMarker.java + Constant Pool: + 1: MethodReference #2.#3 // java/lang/Object.:()V + 2: TypeInfo #4 // java/lang/Object + 3: NameAndTypeDescriptor #5.#6 // :()V + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: TypeInfo #8 // com/example/platform/api/ApiMarker + 8: Utf8StringConstant "com/example/platform/api/ApiMarker" + 9: Utf8StringConstant "Code" + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Lcom/example/platform/api/ApiMarker;" + 14: Utf8StringConstant "SourceFile" + 15: Utf8StringConstant "ApiMarker.java" + + public void (); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ------------------------------------ + 0 5 0 this Lcom/example/platform/api/ApiMarker; +class com.example.platform.impl.ExampleSqlDriver + Minor version: 0 + Major version: 65 + Flags: PUBLIC, FINAL, SUPER + SourceFile: ExampleSqlDriver.java + Constant Pool: + 1: MethodReference #2.#3 // java/lang/Object.:()V + 2: TypeInfo #4 // java/lang/Object + 3: NameAndTypeDescriptor #5.#6 // :()V + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: TypeInfo #8 // java/sql/DriverPropertyInfo + 8: Utf8StringConstant "java/sql/DriverPropertyInfo" + 9: MethodReference #10.#11 // java/util/logging/Logger.getGlobal:()Ljava/util/logging/Logger; + 10: TypeInfo #12 // java/util/logging/Logger + 11: NameAndTypeDescriptor #13.#14 // getGlobal:()Ljava/util/logging/Logger; + 12: Utf8StringConstant "java/util/logging/Logger" + 13: Utf8StringConstant "getGlobal" + 14: Utf8StringConstant "()Ljava/util/logging/Logger;" + 15: TypeInfo #16 // com/example/platform/impl/ExampleSqlDriver + 16: Utf8StringConstant "com/example/platform/impl/ExampleSqlDriver" + 17: TypeInfo #18 // java/sql/Driver + 18: Utf8StringConstant "java/sql/Driver" + 19: Utf8StringConstant "Code" + 20: Utf8StringConstant "LineNumberTable" + 21: Utf8StringConstant "LocalVariableTable" + 22: Utf8StringConstant "this" + 23: Utf8StringConstant "Lcom/example/platform/impl/ExampleSqlDriver;" + 24: Utf8StringConstant "connect" + 25: Utf8StringConstant "(Ljava/lang/String;Ljava/util/Properties;)Ljava/sql/Connection;" + 26: Utf8StringConstant "url" + 27: Utf8StringConstant "Ljava/lang/String;" + 28: Utf8StringConstant "info" + 29: Utf8StringConstant "Ljava/util/Properties;" + 30: Utf8StringConstant "Exceptions" + 31: TypeInfo #32 // java/sql/SQLException + 32: Utf8StringConstant "java/sql/SQLException" + 33: Utf8StringConstant "acceptsURL" + 34: Utf8StringConstant "(Ljava/lang/String;)Z" + 35: Utf8StringConstant "getPropertyInfo" + 36: Utf8StringConstant "(Ljava/lang/String;Ljava/util/Properties;)[Ljava/sql/DriverPropertyInfo;" + 37: Utf8StringConstant "getMajorVersion" + 38: Utf8StringConstant "()I" + 39: Utf8StringConstant "getMinorVersion" + 40: Utf8StringConstant "jdbcCompliant" + 41: Utf8StringConstant "()Z" + 42: Utf8StringConstant "getParentLogger" + 43: Utf8StringConstant "SourceFile" + 44: Utf8StringConstant "ExampleSqlDriver.java" + + public void (); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 5 0 this Lcom/example/platform/impl/ExampleSqlDriver; + + public java.sql.Connection connect(java.lang.String url, java.util.Properties info) throws java.sql.SQLException; + Flags: PUBLIC + Code: + stack=1, locals=3, arguments=2 + 0: aconst_null + 1: areturn + Exceptions: + throws java.sql.SQLException + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 2 0 this Lcom/example/platform/impl/ExampleSqlDriver; + 0 2 1 url Ljava/lang/String; + 0 2 2 info Ljava/util/Properties; + + public boolean acceptsURL(java.lang.String url) throws java.sql.SQLException; + Flags: PUBLIC + Code: + stack=1, locals=2, arguments=1 + 0: iconst_0 + 1: ireturn + Exceptions: + throws java.sql.SQLException + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 2 0 this Lcom/example/platform/impl/ExampleSqlDriver; + 0 2 1 url Ljava/lang/String; + + public java.sql.DriverPropertyInfo[] getPropertyInfo(java.lang.String url, java.util.Properties info) throws java.sql.SQLException; + Flags: PUBLIC + Code: + stack=1, locals=3, arguments=2 + 0: iconst_0 + 1: anewarray Ljava/sql/DriverPropertyInfo; + 4: areturn + Exceptions: + throws java.sql.SQLException + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 5 0 this Lcom/example/platform/impl/ExampleSqlDriver; + 0 5 1 url Ljava/lang/String; + 0 5 2 info Ljava/util/Properties; + + public int getMajorVersion(); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: iconst_1 + 1: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 2 0 this Lcom/example/platform/impl/ExampleSqlDriver; + + public int getMinorVersion(); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: iconst_0 + 1: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 2 0 this Lcom/example/platform/impl/ExampleSqlDriver; + + public boolean jdbcCompliant(); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: iconst_0 + 1: ireturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 2 0 this Lcom/example/platform/impl/ExampleSqlDriver; + + public java.util.logging.Logger getParentLogger(); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: invokestatic java/util/logging/Logger.getGlobal:()Ljava/util/logging/Logger; + 3: areturn + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- -------------------------------------------- + 0 4 0 this Lcom/example/platform/impl/ExampleSqlDriver; +class com.example.platform.internal.InternalMarker + Minor version: 0 + Major version: 65 + Flags: PUBLIC, FINAL, SUPER + SourceFile: InternalMarker.java + Constant Pool: + 1: MethodReference #2.#3 // java/lang/Object.:()V + 2: TypeInfo #4 // java/lang/Object + 3: NameAndTypeDescriptor #5.#6 // :()V + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: TypeInfo #8 // com/example/platform/internal/InternalMarker + 8: Utf8StringConstant "com/example/platform/internal/InternalMarker" + 9: Utf8StringConstant "Code" + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Lcom/example/platform/internal/InternalMarker;" + 14: Utf8StringConstant "SourceFile" + 15: Utf8StringConstant "InternalMarker.java" + + public void (); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------------------- + 0 5 0 this Lcom/example/platform/internal/InternalMarker; +class com.example.platform.model.ModelMarker + Minor version: 0 + Major version: 65 + Flags: PUBLIC, FINAL, SUPER + SourceFile: ModelMarker.java + Constant Pool: + 1: MethodReference #2.#3 // java/lang/Object.:()V + 2: TypeInfo #4 // java/lang/Object + 3: NameAndTypeDescriptor #5.#6 // :()V + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: TypeInfo #8 // com/example/platform/model/ModelMarker + 8: Utf8StringConstant "com/example/platform/model/ModelMarker" + 9: Utf8StringConstant "Code" + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Lcom/example/platform/model/ModelMarker;" + 14: Utf8StringConstant "SourceFile" + 15: Utf8StringConstant "ModelMarker.java" + + public void (); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------------- + 0 5 0 this Lcom/example/platform/model/ModelMarker; +class com.example.platform.persistence.PersistenceMarker + Minor version: 0 + Major version: 65 + Flags: PUBLIC, FINAL, SUPER + SourceFile: PersistenceMarker.java + Constant Pool: + 1: MethodReference #2.#3 // java/lang/Object.:()V + 2: TypeInfo #4 // java/lang/Object + 3: NameAndTypeDescriptor #5.#6 // :()V + 4: Utf8StringConstant "java/lang/Object" + 5: Utf8StringConstant "" + 6: Utf8StringConstant "()V" + 7: TypeInfo #8 // com/example/platform/persistence/PersistenceMarker + 8: Utf8StringConstant "com/example/platform/persistence/PersistenceMarker" + 9: Utf8StringConstant "Code" + 10: Utf8StringConstant "LineNumberTable" + 11: Utf8StringConstant "LocalVariableTable" + 12: Utf8StringConstant "this" + 13: Utf8StringConstant "Lcom/example/platform/persistence/PersistenceMarker;" + 14: Utf8StringConstant "SourceFile" + 15: Utf8StringConstant "PersistenceMarker.java" + + public void (); + Flags: PUBLIC + Code: + stack=1, locals=1, arguments=0 + 0: aload_0 /* this */ + 1: invokespecial java/lang/Object.:()V + 4: return + LocalVariableTable: + Start Length Slot Name Signature + ----- ------ ---- ---- ---------------------------------------------------- + 0 5 0 this Lcom/example/platform/persistence/PersistenceMarker; +module com.example.platform + Minor version: 0 + Major version: 65 + SourceFile: module-info.java + ModulePackages: com.example.platform.api + com.example.platform.impl + com.example.platform.internal + com.example.platform.model + com.example.platform.persistence + Constant Pool: + 1: TypeInfo #2 // module-info + 2: Utf8StringConstant "module-info" + 3: Utf8StringConstant "SourceFile" + 4: Utf8StringConstant "module-info.java" + 5: Utf8StringConstant "Module" + 6: Module #7 // com.example.platform + 7: Utf8StringConstant "com.example.platform" + 8: Utf8StringConstant "1.0.0" + 9: Module #10 // java.base + 10: Utf8StringConstant "java.base" + 11: Utf8StringConstant "21.0.6" + 12: Module #13 // java.sql + 13: Utf8StringConstant "java.sql" + 14: Module #15 // java.xml + 15: Utf8StringConstant "java.xml" + 16: Module #17 // java.compiler + 17: Utf8StringConstant "java.compiler" + 18: Package #19 // com/example/platform/api + 19: Utf8StringConstant "com/example/platform/api" + 20: Package #21 // com/example/platform/internal + 21: Utf8StringConstant "com/example/platform/internal" + 22: Module #23 // java.logging + 23: Utf8StringConstant "java.logging" + 24: Package #25 // com/example/platform/model + 25: Utf8StringConstant "com/example/platform/model" + 26: Package #27 // com/example/platform/persistence + 27: Utf8StringConstant "com/example/platform/persistence" + 28: TypeInfo #29 // java/sql/Driver + 29: Utf8StringConstant "java/sql/Driver" + 30: TypeInfo #31 // com/example/platform/impl/ExampleSqlDriver + 31: Utf8StringConstant "com/example/platform/impl/ExampleSqlDriver" + 32: Utf8StringConstant "ModulePackages" + 33: Utf8StringConstant "com/example/platform/impl" + 34: Package #33 // com/example/platform/impl + + requires java.base mandated; + requires java.sql; + requires transitive java.xml; + requires static java.compiler; + + exports com/example/platform/api; + exports com/example/platform/internal to java.logging; + + opens com/example/platform/model; + opens com/example/platform/persistence to java.sql; + + uses java/sql/Driver; + + provides java/sql/Driver with com/example/platform/impl/ExampleSqlDriver; diff --git a/Procyon.Expressions/build.gradle b/Procyon.Expressions/build.gradle index fbba7a05..543a8026 100644 --- a/Procyon.Expressions/build.gradle +++ b/Procyon.Expressions/build.gradle @@ -1,6 +1,6 @@ dependencies { - compile project(':Procyon.Core') - compile project(':Procyon.Reflection') + implementation project(':Procyon.Core') + implementation project(':Procyon.Reflection') } /* diff --git a/Procyon.Reflection/build.gradle b/Procyon.Reflection/build.gradle index 4e727b26..773e5e89 100644 --- a/Procyon.Reflection/build.gradle +++ b/Procyon.Reflection/build.gradle @@ -1,5 +1,5 @@ dependencies { - compile project(':Procyon.Core') + implementation project(':Procyon.Core') } /* diff --git a/README.md b/README.md index 70d0e11d..18b3ce0e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ +[![](https://jitpack.io/v/nbauma109/procyon.svg)](https://jitpack.io/#nbauma109/procyon) +[![Coverage Status](https://codecov.io/gh/nbauma109/procyon/branch/master/graph/badge.svg)](https://app.codecov.io/gh/nbauma109/procyon) + +### Why a fork ? + + * I haven't been able to get my multiple pull requests merged for years ([#52](https://github.com/mstrobel/procyon/pull/52), [#53](https://github.com/mstrobel/procyon/pull/53), [#55](https://github.com/mstrobel/procyon/pull/55), [#59](https://github.com/mstrobel/procyon/pull/59), [#60](https://github.com/mstrobel/procyon/pull/60)) + * Original project hasn't been maintained for years + * I haven't been able to get in touch by e-mail with Mike Strobel + * I need this fork for line number realignment to work properly in Eclipse Enhanced Decompiler plugin ([ECD](https://github.com/nbauma109/ecd)) + ![](https://mstrobel.github.io/procyon/procyon.png) *Procyon* is a suite of Java metaprogramming tools focused on code generation and analysis. It includes the following libraries: @@ -131,3 +141,8 @@ Check out these third party products based on Procyon! Are you using Procyon in A JavaFX-based decompiler front-end with fast and convenient code navigation. Download it, or launch it directly from your browser. - [Bytecode Viewer](https://github.com/Konloch/bytecode-viewer) is an open source Java decompilation, disassembly, and debugging suite by [@Konloch](https://twitter.com/Konloch). It can produce decompiled sources from several modern Java decompilers, including Procyon, CFR, and FernFlower. + + + + + diff --git a/build.gradle b/build.gradle index 550c0a4f..d7d90496 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,34 @@ import org.gradle.api.tasks.testing.logging.TestExceptionFormat import org.gradle.api.tasks.testing.logging.TestLogEvent -apply plugin: 'java' -apply plugin: 'maven' -apply plugin: 'idea' +plugins { + id 'java' + id 'maven-publish' + id 'idea' + id 'jacoco' + id 'jacoco-report-aggregation' +} + +java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 +} + +repositories { + mavenCentral() +} + +jacoco { + toolVersion = '0.8.14' +} + +dependencies { + jacocoAggregation project(':Procyon.Core') + jacocoAggregation project(':Procyon.CompilerTools') + jacocoAggregation project(':Procyon.Decompiler') + jacocoAggregation project(':Procyon.Expressions') + jacocoAggregation project(':Procyon.Reflection') +} archivesBaseName = 'procyon' @@ -35,21 +60,27 @@ final def procyonVersion = getProcyonVersion() allprojects { apply plugin: 'java' apply plugin: 'idea' - apply plugin: 'maven' + apply plugin: 'maven-publish' + apply plugin: 'jacoco' + + jacoco { + toolVersion = '0.8.14' + } buildDir = rootDir.canonicalPath + "/build/" + rootProject.relativePath(projectDir.canonicalPath) version procyonVersion group 'com.github.mstrobel' - sourceCompatibility = 1.7 // JDK version + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 repositories { mavenCentral() } dependencies { - testCompile 'junit:junit:4.13.2' + testImplementation 'junit:junit:4.13.2' } } @@ -58,10 +89,9 @@ allprojects { // rootProject.tasks.each { it.enabled = false } rootProject.tasks.withType(DefaultTask).each { it.enabled = true } -rootProject.uploadArchives.enabled = false subprojects { - apply plugin: 'maven' + apply plugin: 'maven-publish' apply plugin: 'signing' final boolean shouldSign = "true".equalsIgnoreCase(System.properties.getProperty("procyon.signing.enabled")) @@ -80,11 +110,6 @@ subprojects { from 'build/docs/javadoc' } - task sourcesJar(type: Jar, dependsOn: classes) { - classifier = 'sources' - from sourceSets.main.allSource - } - tasks.withType(Test) { testLogging { // set options for log level LIFECYCLE @@ -122,11 +147,26 @@ subprojects { } if (project.name == "Procyon.Decompiler") { + + task sourcesJar(type: Jar, dependsOn: classes) { + classifier = 'sources' + from sourceSets.main.allSource + from project(':Procyon.Core').collect { it.sourceSets.main.allSource } + from project(':Procyon.CompilerTools').collect { it.sourceSets.main.allSource } + } + artifacts { archives jar + archives javadocJar + archives sourcesJar } } else { + task sourcesJar(type: Jar, dependsOn: classes) { + classifier = 'sources' + from sourceSets.main.allSource + } + javadoc { options.encoding = 'UTF-8' } @@ -143,78 +183,79 @@ subprojects { } } - uploadArchives { - repositories.mavenDeployer { - if (shouldSign) { - beforeDeployment { MavenDeployment deployment -> - signing.signPom(deployment) - } - } - - snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots") { - authentication(userName: project.properties.get("procyon.sonatype.username"), - password: project.properties.get("procyon.sonatype.password")) - } - - repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2") { - authentication(userName: project.properties.get("procyon.sonatype.username"), - password: project.properties.get("procyon.sonatype.password")) - } - - pom { + publishing { + publications { + mavenJava(MavenPublication) { + from components.java + + artifact jar + artifact javadocJar + artifact sourcesJar + groupId = project.group - version = project.version artifactId = project.archivesBaseName - - project { - name project.archivesBaseName - packaging 'jar' - description 'Procyon' - url 'https://github.com/mstrobel/procyon' - + version = project.version + + pom { + name.set(project.archivesBaseName) + description.set('Procyon') + url.set('https://github.com/mstrobel/procyon') + scm { - url 'https://github.com/mstrobel/procyon' - connection 'scm:git:https://github.com/mstrobel/procyon.git' - developerConnection 'scm:git:https://mstrobel@github.com/mstrobel/procyon.git' + url.set('https://github.com/mstrobel/procyon') + connection.set('scm:git:https://github.com/mstrobel/procyon.git') + developerConnection.set('scm:git:https://mstrobel@github.com/mstrobel/procyon.git') } - + issueManagement { - system 'github' - url 'https://github.com/mstrobel/procyon/issues' + system.set('github') + url.set('https://github.com/mstrobel/procyon/issues') } - + licenses { license { - name 'The Apache Software License, Version 2.0' - url 'http://www.apache.org/licenses/LICENSE-2.0.txt' - distribution 'repo' + name.set('The Apache Software License, Version 2.0') + url.set('http://www.apache.org/licenses/LICENSE-2.0.txt') + distribution.set('repo') } } - + developers { developer { - id 'mstrobel' - name 'Mike Strobel' - roles { - role 'owner' - role 'packager' - role 'developer' - } - } - } - - dependencies { - dependency { - groupId 'junit' - artifactId 'junit' - version '4.11' - scope 'test' -// optional = true + id.set('mstrobel') + name.set('Mike Strobel') } } } } } + + repositories { + maven { + name = 'sonatypeSnapshots' + url = uri('https://oss.sonatype.org/content/repositories/snapshots') + credentials { + username = project.findProperty('procyon.sonatype.username') + password = project.findProperty('procyon.sonatype.password') + } + } + + maven { + name = 'sonatypeReleases' + url = uri('https://oss.sonatype.org/service/local/staging/deploy/maven2') + credentials { + username = project.findProperty('procyon.sonatype.username') + password = project.findProperty('procyon.sonatype.password') + } + } + } } + + if (shouldSign) { + signing { + sign publishing.publications.mavenJava + } + } + } } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 05ef575b..afba1092 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 93eef23b..b3715553 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Oct 27 14:39:59 EDT 2019 -distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-bin.zip distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.6-bin.zip +networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 9d82f789..65dcd68d 100755 --- a/gradlew +++ b/gradlew @@ -1,74 +1,129 @@ -#!/usr/bin/env bash +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ############################################################################## -## -## Gradle start up script for UN*X -## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum -warn ( ) { +warn () { echo "$*" -} +} >&2 -die ( ) { +die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -77,7 +132,7 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" + JAVACMD=java which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the @@ -85,76 +140,105 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=$((i+1)) + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index aec99730..6689b85b 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,4 +1,20 @@ -@if "%DEBUG%" == "" @echo off +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -8,20 +24,24 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +55,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,44 +65,26 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal