mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 23:04:50 +02:00
8308753: Class-File API transition to Preview
Reviewed-by: ihse, mchung, vromero
This commit is contained in:
parent
b9df827adc
commit
2b00ac0d02
681 changed files with 7518 additions and 6502 deletions
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Opcode;
|
||||
import java.lang.classfile.TypeKind;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models an array load instruction in the {@code code} array of a {@code Code}
|
||||
* attribute. Corresponding opcodes will have a {@code kind} of {@link
|
||||
* Opcode.Kind#ARRAY_LOAD}. Delivered as a {@link CodeElement} when
|
||||
* traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface ArrayLoadInstruction extends Instruction
|
||||
permits AbstractInstruction.UnboundArrayLoadInstruction {
|
||||
/**
|
||||
* {@return the component type of the array}
|
||||
*/
|
||||
TypeKind typeKind();
|
||||
|
||||
/**
|
||||
* {@return an array load instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of array load instruction,
|
||||
* which must be of kind {@link Opcode.Kind#ARRAY_LOAD}
|
||||
*/
|
||||
static ArrayLoadInstruction of(Opcode op) {
|
||||
Util.checkKind(op, Opcode.Kind.ARRAY_LOAD);
|
||||
return new AbstractInstruction.UnboundArrayLoadInstruction(op);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Opcode;
|
||||
import java.lang.classfile.TypeKind;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models an array store instruction in the {@code code} array of a {@code Code}
|
||||
* attribute. Corresponding opcodes will have a {@code kind} of {@link
|
||||
* Opcode.Kind#ARRAY_STORE}. Delivered as a {@link CodeElement} when
|
||||
* traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface ArrayStoreInstruction extends Instruction
|
||||
permits AbstractInstruction.UnboundArrayStoreInstruction {
|
||||
/**
|
||||
* {@return the component type of the array}
|
||||
*/
|
||||
TypeKind typeKind();
|
||||
|
||||
/**
|
||||
* {@return an array store instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of array store instruction,
|
||||
* which must be of kind {@link Opcode.Kind#ARRAY_STORE}
|
||||
*/
|
||||
static ArrayStoreInstruction of(Opcode op) {
|
||||
Util.checkKind(op, Opcode.Kind.ARRAY_STORE);
|
||||
return new AbstractInstruction.UnboundArrayStoreInstruction(op);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Label;
|
||||
import java.lang.classfile.Opcode;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a branching instruction (conditional or unconditional) in the {@code
|
||||
* code} array of a {@code Code} attribute. Corresponding opcodes will have a
|
||||
* {@code kind} of {@link Opcode.Kind#BRANCH}. Delivered as a {@link
|
||||
* CodeElement} when traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface BranchInstruction extends Instruction
|
||||
permits AbstractInstruction.BoundBranchInstruction,
|
||||
AbstractInstruction.UnboundBranchInstruction {
|
||||
/**
|
||||
* {@return the target of the branch}
|
||||
*/
|
||||
Label target();
|
||||
|
||||
/**
|
||||
* {@return a branch instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of branch instruction,
|
||||
* which must be of kind {@link Opcode.Kind#BRANCH}
|
||||
* @param target the target of the branch
|
||||
*/
|
||||
static BranchInstruction of(Opcode op, Label target) {
|
||||
Util.checkKind(op, Opcode.Kind.BRANCH);
|
||||
return new AbstractInstruction.UnboundBranchInstruction(op, target);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.ClassFile;
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Label;
|
||||
import java.lang.classfile.PseudoInstruction;
|
||||
import java.lang.classfile.attribute.CharacterRangeTableAttribute;
|
||||
import jdk.internal.classfile.impl.AbstractPseudoInstruction;
|
||||
import jdk.internal.classfile.impl.BoundCharacterRange;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* A pseudo-instruction which models a single entry in the
|
||||
* {@link CharacterRangeTableAttribute}. Delivered as a {@link CodeElement}
|
||||
* during traversal of the elements of a {@link CodeModel}, according to
|
||||
* the setting of the {@link ClassFile.DebugElementsOption} option.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface CharacterRange extends PseudoInstruction
|
||||
permits AbstractPseudoInstruction.UnboundCharacterRange, BoundCharacterRange {
|
||||
/**
|
||||
* {@return the start of the instruction range}
|
||||
*/
|
||||
Label startScope();
|
||||
|
||||
/**
|
||||
* {@return the end of the instruction range}
|
||||
*/
|
||||
Label endScope();
|
||||
|
||||
/**
|
||||
* {@return the encoded start of the character range region (inclusive)}
|
||||
* The value is constructed from the line_number/column_number pair as given
|
||||
* by {@code line_number << 10 + column_number}, where the source file is
|
||||
* viewed as an array of (possibly multi-byte) characters.
|
||||
*/
|
||||
int characterRangeStart();
|
||||
|
||||
/**
|
||||
* {@return the encoded end of the character range region (exclusive)}.
|
||||
* The value is constructed from the line_number/column_number pair as given
|
||||
* by {@code line_number << 10 + column_number}, where the source file is
|
||||
* viewed as an array of (possibly multi-byte) characters.
|
||||
*/
|
||||
int characterRangeEnd();
|
||||
|
||||
/**
|
||||
* A flags word, indicating the kind of range. Multiple flag bits
|
||||
* may be set. Valid flags include:
|
||||
* <ul>
|
||||
* <li>{@link java.lang.classfile.ClassFile#CRT_STATEMENT}
|
||||
* <li>{@link java.lang.classfile.ClassFile#CRT_BLOCK}
|
||||
* <li>{@link java.lang.classfile.ClassFile#CRT_ASSIGNMENT}
|
||||
* <li>{@link java.lang.classfile.ClassFile#CRT_FLOW_CONTROLLER}
|
||||
* <li>{@link java.lang.classfile.ClassFile#CRT_FLOW_TARGET}
|
||||
* <li>{@link java.lang.classfile.ClassFile#CRT_INVOKE}
|
||||
* <li>{@link java.lang.classfile.ClassFile#CRT_CREATE}
|
||||
* <li>{@link java.lang.classfile.ClassFile#CRT_BRANCH_TRUE}
|
||||
* <li>{@link java.lang.classfile.ClassFile#CRT_BRANCH_FALSE}
|
||||
* </ul>
|
||||
*
|
||||
* @see java.lang.classfile.attribute.CharacterRangeInfo#flags()
|
||||
*
|
||||
* @return the flags
|
||||
*/
|
||||
int flags();
|
||||
|
||||
/**
|
||||
* {@return a character range pseudo-instruction}
|
||||
*
|
||||
* @param startScope the start of the instruction range
|
||||
* @param endScope the end of the instruction range
|
||||
* @param characterRangeStart the encoded start of the character range region (inclusive)
|
||||
* @param characterRangeEnd the encoded end of the character range region (exclusive)
|
||||
* @param flags a flags word, indicating the kind of range
|
||||
*/
|
||||
static CharacterRange of(Label startScope, Label endScope, int characterRangeStart, int characterRangeEnd, int flags) {
|
||||
return new AbstractPseudoInstruction.UnboundCharacterRange(startScope, endScope, characterRangeStart, characterRangeEnd, flags);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,169 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.constant.ConstantDesc;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Opcode;
|
||||
import java.lang.classfile.TypeKind;
|
||||
import java.lang.classfile.constantpool.LoadableConstantEntry;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a constant-load instruction in the {@code code} array of a {@code
|
||||
* Code} attribute, including "intrinsic constant" instructions (e.g., {@code
|
||||
* iconst_0}), "argument constant" instructions (e.g., {@code bipush}), and "load
|
||||
* constant" instructions (e.g., {@code LDC}). Corresponding opcodes will have
|
||||
* a {@code kind} of {@link Opcode.Kind#CONSTANT}. Delivered as a {@link
|
||||
* CodeElement} when traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface ConstantInstruction extends Instruction {
|
||||
|
||||
/**
|
||||
* {@return the constant value}
|
||||
*/
|
||||
ConstantDesc constantValue();
|
||||
|
||||
/**
|
||||
* {@return the type of the constant}
|
||||
*/
|
||||
TypeKind typeKind();
|
||||
|
||||
/**
|
||||
* Models an "intrinsic constant" instruction (e.g., {@code
|
||||
* iconst_0}).
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
sealed interface IntrinsicConstantInstruction extends ConstantInstruction
|
||||
permits AbstractInstruction.UnboundIntrinsicConstantInstruction {
|
||||
|
||||
/**
|
||||
* {@return the type of the constant}
|
||||
*/
|
||||
@Override
|
||||
default TypeKind typeKind() {
|
||||
return opcode().primaryTypeKind();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Models an "argument constant" instruction (e.g., {@code
|
||||
* bipush}).
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
sealed interface ArgumentConstantInstruction extends ConstantInstruction
|
||||
permits AbstractInstruction.BoundArgumentConstantInstruction,
|
||||
AbstractInstruction.UnboundArgumentConstantInstruction {
|
||||
|
||||
@Override
|
||||
Integer constantValue();
|
||||
|
||||
/**
|
||||
* {@return the type of the constant}
|
||||
*/
|
||||
@Override
|
||||
default TypeKind typeKind() {
|
||||
return opcode().primaryTypeKind();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Models a "load constant" instruction (e.g., {@code
|
||||
* ldc}).
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
sealed interface LoadConstantInstruction extends ConstantInstruction
|
||||
permits AbstractInstruction.BoundLoadConstantInstruction,
|
||||
AbstractInstruction.UnboundLoadConstantInstruction {
|
||||
|
||||
/**
|
||||
* {@return the constant value}
|
||||
*/
|
||||
LoadableConstantEntry constantEntry();
|
||||
|
||||
/**
|
||||
* {@return the type of the constant}
|
||||
*/
|
||||
@Override
|
||||
default TypeKind typeKind() {
|
||||
return constantEntry().typeKind();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return an intrinsic constant instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of intrinsic constant instruction,
|
||||
* which must be of kind {@link Opcode.Kind#CONSTANT}
|
||||
*/
|
||||
static IntrinsicConstantInstruction ofIntrinsic(Opcode op) {
|
||||
Util.checkKind(op, Opcode.Kind.CONSTANT);
|
||||
if (op.constantValue() == null)
|
||||
throw new IllegalArgumentException(String.format("Wrong opcode specified; found %s, expected xCONST_val", op));
|
||||
return new AbstractInstruction.UnboundIntrinsicConstantInstruction(op);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return an argument constant instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of intrinsic constant instruction,
|
||||
* which must be of kind {@link Opcode.Kind#CONSTANT}
|
||||
* @param value the constant value
|
||||
*/
|
||||
static ArgumentConstantInstruction ofArgument(Opcode op, int value) {
|
||||
Util.checkKind(op, Opcode.Kind.CONSTANT);
|
||||
if (op != Opcode.BIPUSH && op != Opcode.SIPUSH)
|
||||
throw new IllegalArgumentException(String.format("Wrong opcode specified; found %s, expected BIPUSH or SIPUSH", op));
|
||||
return new AbstractInstruction.UnboundArgumentConstantInstruction(op, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a load constant instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of load constant instruction,
|
||||
* which must be of kind {@link Opcode.Kind#CONSTANT}
|
||||
* @param constant the constant value
|
||||
*/
|
||||
static LoadConstantInstruction ofLoad(Opcode op, LoadableConstantEntry constant) {
|
||||
Util.checkKind(op, Opcode.Kind.CONSTANT);
|
||||
if (op != Opcode.LDC && op != Opcode.LDC_W && op != Opcode.LDC2_W)
|
||||
throw new IllegalArgumentException(String.format("Wrong opcode specified; found %s, expected LDC, LDC_W or LDC2_W", op));
|
||||
return new AbstractInstruction.UnboundLoadConstantInstruction(op, constant);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Opcode;
|
||||
import java.lang.classfile.TypeKind;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.BytecodeHelpers;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a primitive conversion instruction in the {@code code} array of a
|
||||
* {@code Code} attribute, such as {@code i2l}. Corresponding opcodes will have
|
||||
* a {@code kind} of {@link Opcode.Kind#CONVERT}. Delivered as a {@link
|
||||
* CodeElement} when traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface ConvertInstruction extends Instruction
|
||||
permits AbstractInstruction.UnboundConvertInstruction {
|
||||
/**
|
||||
* {@return the source type to convert from}
|
||||
*/
|
||||
TypeKind fromType();
|
||||
|
||||
/**
|
||||
* {@return the destination type to convert to}
|
||||
*/
|
||||
TypeKind toType();
|
||||
|
||||
/**
|
||||
* {@return A conversion instruction}
|
||||
*
|
||||
* @param fromType the type to convert from
|
||||
* @param toType the type to convert to
|
||||
*/
|
||||
static ConvertInstruction of(TypeKind fromType, TypeKind toType) {
|
||||
return of(BytecodeHelpers.convertOpcode(fromType, toType));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a conversion instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of conversion instruction,
|
||||
* which must be of kind {@link Opcode.Kind#CONVERT}
|
||||
*/
|
||||
static ConvertInstruction of(Opcode op) {
|
||||
Util.checkKind(op, Opcode.Kind.CONVERT);
|
||||
return new AbstractInstruction.UnboundConvertInstruction(op);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Label;
|
||||
import java.lang.classfile.Opcode;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models instruction discontinued from the {@code code} array of a {@code Code}
|
||||
* attribute. Delivered as a {@link CodeElement} when traversing the elements of
|
||||
* a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface DiscontinuedInstruction extends Instruction {
|
||||
|
||||
/**
|
||||
* Models JSR and JSR_W instructions discontinued from the {@code code}
|
||||
* array of a {@code Code} attribute since class file version 51.0.
|
||||
* Corresponding opcodes will have a {@code kind} of
|
||||
* {@link Opcode.Kind#DISCONTINUED_JSR}. Delivered as a {@link CodeElement}
|
||||
* when traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
sealed interface JsrInstruction extends DiscontinuedInstruction
|
||||
permits AbstractInstruction.BoundJsrInstruction,
|
||||
AbstractInstruction.UnboundJsrInstruction {
|
||||
|
||||
/**
|
||||
* {@return the target of the JSR instruction}
|
||||
*/
|
||||
Label target();
|
||||
|
||||
/**
|
||||
* {@return a JSR instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of JSR instruction,
|
||||
* which must be of kind {@link Opcode.Kind#DISCONTINUED_JSR}
|
||||
* @param target target label of the subroutine
|
||||
*/
|
||||
static JsrInstruction of(Opcode op, Label target) {
|
||||
Util.checkKind(op, Opcode.Kind.DISCONTINUED_JSR);
|
||||
return new AbstractInstruction.UnboundJsrInstruction(op, target);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a JSR instruction}
|
||||
*
|
||||
* @param target target label of the subroutine
|
||||
*/
|
||||
static JsrInstruction of(Label target) {
|
||||
return of(Opcode.JSR, target);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Models RET and RET_W instructions discontinued from the {@code code}
|
||||
* array of a {@code Code} attribute since class file version 51.0.
|
||||
* Corresponding opcodes will have a {@code kind} of
|
||||
* {@link Opcode.Kind#DISCONTINUED_RET}. Delivered as a {@link CodeElement}
|
||||
* when traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
sealed interface RetInstruction extends DiscontinuedInstruction
|
||||
permits AbstractInstruction.BoundRetInstruction,
|
||||
AbstractInstruction.UnboundRetInstruction {
|
||||
|
||||
/**
|
||||
* {@return the local variable slot with return address}
|
||||
*/
|
||||
int slot();
|
||||
|
||||
/**
|
||||
* {@return a RET or RET_W instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of RET instruction,
|
||||
* which must be of kind {@link Opcode.Kind#DISCONTINUED_RET}
|
||||
* @param slot the local variable slot to load return address from
|
||||
*/
|
||||
static RetInstruction of(Opcode op, int slot) {
|
||||
Util.checkKind(op, Opcode.Kind.DISCONTINUED_RET);
|
||||
return new AbstractInstruction.UnboundRetInstruction(op, slot);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a RET instruction}
|
||||
*
|
||||
* @param slot the local variable slot to load return address from
|
||||
*/
|
||||
static RetInstruction of(int slot) {
|
||||
return of(slot < 256 ? Opcode.RET : Opcode.RET_W, slot);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,93 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.util.Optional;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.constantpool.ClassEntry;
|
||||
import java.lang.classfile.Label;
|
||||
import java.lang.classfile.PseudoInstruction;
|
||||
import jdk.internal.classfile.impl.AbstractPseudoInstruction;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* A pseudo-instruction modeling an entry in the exception table of a code
|
||||
* attribute. Entries in the exception table model catch and finally blocks.
|
||||
* Delivered as a {@link CodeElement} when traversing the contents
|
||||
* of a {@link CodeModel}.
|
||||
*
|
||||
* @see PseudoInstruction
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface ExceptionCatch extends PseudoInstruction
|
||||
permits AbstractPseudoInstruction.ExceptionCatchImpl {
|
||||
/**
|
||||
* {@return the handler for the exception}
|
||||
*/
|
||||
Label handler();
|
||||
|
||||
/**
|
||||
* {@return the beginning of the instruction range for the guarded instructions}
|
||||
*/
|
||||
Label tryStart();
|
||||
|
||||
/**
|
||||
* {@return the end of the instruction range for the guarded instructions}
|
||||
*/
|
||||
Label tryEnd();
|
||||
|
||||
/**
|
||||
* {@return the type of the exception to catch, or empty if this handler is
|
||||
* unconditional}
|
||||
*/
|
||||
Optional<ClassEntry> catchType();
|
||||
|
||||
/**
|
||||
* {@return an exception table pseudo-instruction}
|
||||
* @param handler the handler for the exception
|
||||
* @param tryStart the beginning of the instruction range for the guarded instructions
|
||||
* @param tryEnd the end of the instruction range for the guarded instructions
|
||||
* @param catchTypeEntry the type of exception to catch, or empty if this
|
||||
* handler is unconditional
|
||||
*/
|
||||
static ExceptionCatch of(Label handler, Label tryStart, Label tryEnd,
|
||||
Optional<ClassEntry> catchTypeEntry) {
|
||||
return new AbstractPseudoInstruction.ExceptionCatchImpl(handler, tryStart, tryEnd, catchTypeEntry.orElse(null));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return an exception table pseudo-instruction for an unconditional handler}
|
||||
* @param handler the handler for the exception
|
||||
* @param tryStart the beginning of the instruction range for the gaurded instructions
|
||||
* @param tryEnd the end of the instruction range for the gaurded instructions
|
||||
*/
|
||||
static ExceptionCatch of(Label handler, Label tryStart, Label tryEnd) {
|
||||
return new AbstractPseudoInstruction.ExceptionCatchImpl(handler, tryStart, tryEnd, (ClassEntry) null);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,127 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.constant.ClassDesc;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.constantpool.ClassEntry;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Opcode;
|
||||
import java.lang.classfile.constantpool.FieldRefEntry;
|
||||
import java.lang.classfile.constantpool.NameAndTypeEntry;
|
||||
import java.lang.classfile.constantpool.Utf8Entry;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.TemporaryConstantPool;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a field access instruction in the {@code code} array of a {@code Code}
|
||||
* attribute. Corresponding opcodes will have a {@code kind} of {@link
|
||||
* Opcode.Kind#FIELD_ACCESS}. Delivered as a {@link CodeElement} when
|
||||
* traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface FieldInstruction extends Instruction
|
||||
permits AbstractInstruction.BoundFieldInstruction, AbstractInstruction.UnboundFieldInstruction {
|
||||
/**
|
||||
* {@return the {@link FieldRefEntry} constant described by this instruction}
|
||||
*/
|
||||
FieldRefEntry field();
|
||||
|
||||
/**
|
||||
* {@return the class holding the field}
|
||||
*/
|
||||
default ClassEntry owner() {
|
||||
return field().owner();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return the name of the field}
|
||||
*/
|
||||
default Utf8Entry name() {
|
||||
return field().nameAndType().name();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return the field descriptor of the field}
|
||||
*/
|
||||
default Utf8Entry type() {
|
||||
return field().nameAndType().type();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a symbolic descriptor for the type of the field}
|
||||
*/
|
||||
default ClassDesc typeSymbol() {
|
||||
return field().typeSymbol();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a field access instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of field access instruction,
|
||||
* which must be of kind {@link Opcode.Kind#FIELD_ACCESS}
|
||||
* @param field a constant pool entry describing the field
|
||||
*/
|
||||
static FieldInstruction of(Opcode op, FieldRefEntry field) {
|
||||
Util.checkKind(op, Opcode.Kind.FIELD_ACCESS);
|
||||
return new AbstractInstruction.UnboundFieldInstruction(op, field);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a field access instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of field access instruction,
|
||||
* which must be of kind {@link Opcode.Kind#FIELD_ACCESS}
|
||||
* @param owner the class holding the field
|
||||
* @param name the name of the field
|
||||
* @param type the field descriptor
|
||||
*/
|
||||
static FieldInstruction of(Opcode op,
|
||||
ClassEntry owner,
|
||||
Utf8Entry name,
|
||||
Utf8Entry type) {
|
||||
return of(op, owner, TemporaryConstantPool.INSTANCE.nameAndTypeEntry(name, type));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a field access instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of field access instruction,
|
||||
* which must be of kind {@link Opcode.Kind#FIELD_ACCESS}
|
||||
* @param owner the class holding the field
|
||||
* @param nameAndType the name and field descriptor of the field
|
||||
*/
|
||||
static FieldInstruction of(Opcode op,
|
||||
ClassEntry owner,
|
||||
NameAndTypeEntry nameAndType) {
|
||||
return of(op, TemporaryConstantPool.INSTANCE.fieldRefEntry(owner, nameAndType));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Opcode;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a local variable increment instruction in the {@code code} array of a
|
||||
* {@code Code} attribute. Corresponding opcodes will have a {@code kind} of
|
||||
* {@link Opcode.Kind#INCREMENT}. Delivered as a {@link CodeElement} when
|
||||
* traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface IncrementInstruction extends Instruction
|
||||
permits AbstractInstruction.BoundIncrementInstruction,
|
||||
AbstractInstruction.UnboundIncrementInstruction {
|
||||
/**
|
||||
* {@return the local variable slot to increment}
|
||||
*/
|
||||
int slot();
|
||||
|
||||
/**
|
||||
* {@return the value to increment by}
|
||||
*/
|
||||
int constant();
|
||||
|
||||
/**
|
||||
* {@return an increment instruction}
|
||||
*
|
||||
* @param slot the local variable slot to increment
|
||||
* @param constant the value to increment by
|
||||
*/
|
||||
static IncrementInstruction of(int slot, int constant) {
|
||||
return new AbstractInstruction.UnboundIncrementInstruction(slot, constant);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,108 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.constant.ConstantDesc;
|
||||
import java.lang.constant.DirectMethodHandleDesc;
|
||||
import java.lang.constant.MethodTypeDesc;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.constantpool.InvokeDynamicEntry;
|
||||
import java.lang.classfile.constantpool.LoadableConstantEntry;
|
||||
import java.lang.classfile.constantpool.Utf8Entry;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models an {@code invokedynamic} instruction in the {@code code} array of a
|
||||
* {@code Code} attribute. Delivered as a {@link CodeElement} when traversing
|
||||
* the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface InvokeDynamicInstruction extends Instruction
|
||||
permits AbstractInstruction.BoundInvokeDynamicInstruction, AbstractInstruction.UnboundInvokeDynamicInstruction {
|
||||
/**
|
||||
* {@return an {@link InvokeDynamicEntry} describing the call site}
|
||||
*/
|
||||
InvokeDynamicEntry invokedynamic();
|
||||
|
||||
/**
|
||||
* {@return the invocation name of the call site}
|
||||
*/
|
||||
default Utf8Entry name() {
|
||||
return invokedynamic().name();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return the invocation type of the call site}
|
||||
*/
|
||||
default Utf8Entry type() {
|
||||
return invokedynamic().type();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return the invocation type of the call site, as a symbolic descriptor}
|
||||
*/
|
||||
default MethodTypeDesc typeSymbol() {
|
||||
return invokedynamic().typeSymbol();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return the bootstrap method of the call site}
|
||||
*/
|
||||
default DirectMethodHandleDesc bootstrapMethod() {
|
||||
return invokedynamic().bootstrap()
|
||||
.bootstrapMethod()
|
||||
.asSymbol();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return the bootstrap arguments of the call site}
|
||||
*/
|
||||
default List<ConstantDesc> bootstrapArgs() {
|
||||
return Util.mappedList(invokedynamic().bootstrap().arguments(), new Function<>() {
|
||||
@Override
|
||||
public ConstantDesc apply(LoadableConstantEntry loadableConstantEntry) {
|
||||
return loadableConstantEntry.constantValue();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return an invokedynamic instruction}
|
||||
*
|
||||
* @param invokedynamic the constant pool entry describing the call site
|
||||
*/
|
||||
static InvokeDynamicInstruction of(InvokeDynamicEntry invokedynamic) {
|
||||
return new AbstractInstruction.UnboundInvokeDynamicInstruction(invokedynamic);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,148 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.constant.MethodTypeDesc;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.constantpool.ClassEntry;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Opcode;
|
||||
import java.lang.classfile.constantpool.InterfaceMethodRefEntry;
|
||||
import java.lang.classfile.constantpool.MemberRefEntry;
|
||||
import java.lang.classfile.constantpool.MethodRefEntry;
|
||||
import java.lang.classfile.constantpool.NameAndTypeEntry;
|
||||
import java.lang.classfile.constantpool.Utf8Entry;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.TemporaryConstantPool;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a method invocation instruction in the {@code code} array of a {@code
|
||||
* Code} attribute, other than {@code invokedynamic}. Corresponding opcodes
|
||||
* will have a {@code kind} of {@link Opcode.Kind#INVOKE}. Delivered as a
|
||||
* {@link CodeElement} when traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface InvokeInstruction extends Instruction
|
||||
permits AbstractInstruction.BoundInvokeInterfaceInstruction, AbstractInstruction.BoundInvokeInstruction, AbstractInstruction.UnboundInvokeInstruction {
|
||||
/**
|
||||
* {@return the {@link MethodRefEntry} or {@link InterfaceMethodRefEntry}
|
||||
* constant described by this instruction}
|
||||
*/
|
||||
MemberRefEntry method();
|
||||
|
||||
/**
|
||||
* {@return whether the class holding the method is an interface}
|
||||
*/
|
||||
boolean isInterface();
|
||||
|
||||
/**
|
||||
* {@return the {@code count} value of an {@code invokeinterface} instruction, as defined in {@jvms 6.5}
|
||||
* or {@code 0} for {@code invokespecial}, {@code invokestatic} and {@code invokevirtual} instructions}
|
||||
*/
|
||||
int count();
|
||||
|
||||
/**
|
||||
* {@return the class holding the method}
|
||||
*/
|
||||
default ClassEntry owner() {
|
||||
return method().owner();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return the name of the method}
|
||||
*/
|
||||
default Utf8Entry name() {
|
||||
return method().nameAndType().name();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return the method descriptor of the method}
|
||||
*/
|
||||
default Utf8Entry type() {
|
||||
return method().nameAndType().type();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a symbolic descriptor for the method type}
|
||||
*/
|
||||
default MethodTypeDesc typeSymbol() {
|
||||
return Util.methodTypeSymbol(method().nameAndType());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* {@return an invocation instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of invocation instruction,
|
||||
* which must be of kind {@link Opcode.Kind#INVOKE}
|
||||
* @param method a constant pool entry describing the method
|
||||
*/
|
||||
static InvokeInstruction of(Opcode op, MemberRefEntry method) {
|
||||
Util.checkKind(op, Opcode.Kind.INVOKE);
|
||||
return new AbstractInstruction.UnboundInvokeInstruction(op, method);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return an invocation instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of invocation instruction,
|
||||
* which must be of kind {@link Opcode.Kind#INVOKE}
|
||||
* @param owner the class holding the method
|
||||
* @param name the name of the method
|
||||
* @param type the method descriptor
|
||||
* @param isInterface whether the class holding the method is an interface
|
||||
*/
|
||||
static InvokeInstruction of(Opcode op,
|
||||
ClassEntry owner,
|
||||
Utf8Entry name,
|
||||
Utf8Entry type,
|
||||
boolean isInterface) {
|
||||
return of(op, owner, TemporaryConstantPool.INSTANCE.nameAndTypeEntry(name, type), isInterface);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return an invocation instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of invocation instruction,
|
||||
* which must be of kind {@link Opcode.Kind#INVOKE}
|
||||
* @param owner the class holding the method
|
||||
* @param nameAndType the name and type of the method
|
||||
* @param isInterface whether the class holding the method is an interface
|
||||
*/
|
||||
static InvokeInstruction of(Opcode op,
|
||||
ClassEntry owner,
|
||||
NameAndTypeEntry nameAndType,
|
||||
boolean isInterface) {
|
||||
return of(op, isInterface
|
||||
? TemporaryConstantPool.INSTANCE.interfaceMethodRefEntry(owner, nameAndType)
|
||||
: TemporaryConstantPool.INSTANCE.methodRefEntry(owner, nameAndType));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,51 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Label;
|
||||
import java.lang.classfile.PseudoInstruction;
|
||||
import jdk.internal.classfile.impl.LabelImpl;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* A pseudo-instruction which indicates that the specified label corresponds to
|
||||
* the current position in the {@code Code} attribute. Delivered as a {@link
|
||||
* CodeElement} during traversal of the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @see PseudoInstruction
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface LabelTarget extends PseudoInstruction
|
||||
permits LabelImpl {
|
||||
|
||||
/**
|
||||
* {@return the label corresponding to this target}
|
||||
*/
|
||||
Label label();
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.ClassFile;
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.PseudoInstruction;
|
||||
import java.lang.classfile.attribute.LineNumberTableAttribute;
|
||||
import jdk.internal.classfile.impl.LineNumberImpl;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* A pseudo-instruction which models a single entry in the
|
||||
* {@link LineNumberTableAttribute}. Delivered as a {@link CodeElement}
|
||||
* during traversal of the elements of a {@link CodeModel}, according to
|
||||
* the setting of the {@link ClassFile.LineNumbersOption} option.
|
||||
*
|
||||
* @see PseudoInstruction
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface LineNumber extends PseudoInstruction
|
||||
permits LineNumberImpl {
|
||||
|
||||
/**
|
||||
* {@return the line number}
|
||||
*/
|
||||
int line();
|
||||
|
||||
/**
|
||||
* {@return a line number pseudo-instruction}
|
||||
*
|
||||
* @param line the line number
|
||||
*/
|
||||
static LineNumber of(int line) {
|
||||
return LineNumberImpl.of(line);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Opcode;
|
||||
import java.lang.classfile.TypeKind;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.BytecodeHelpers;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a local variable load instruction in the {@code code} array of a
|
||||
* {@code Code} attribute. Corresponding opcodes will have a {@code kind} of
|
||||
* {@link Opcode.Kind#LOAD}. Delivered as a {@link CodeElement} when
|
||||
* traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface LoadInstruction extends Instruction
|
||||
permits AbstractInstruction.BoundLoadInstruction,
|
||||
AbstractInstruction.UnboundLoadInstruction {
|
||||
|
||||
/**
|
||||
* {@return the local variable slot to load from}
|
||||
*/
|
||||
int slot();
|
||||
|
||||
/**
|
||||
* {@return the type of the value to be loaded}
|
||||
*/
|
||||
TypeKind typeKind();
|
||||
|
||||
/**
|
||||
* {@return a local variable load instruction}
|
||||
*
|
||||
* @param kind the type of the value to be loaded
|
||||
* @param slot the local variable slot to load from
|
||||
*/
|
||||
static LoadInstruction of(TypeKind kind, int slot) {
|
||||
return of(BytecodeHelpers.loadOpcode(kind, slot), slot);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a local variable load instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of load instruction,
|
||||
* which must be of kind {@link Opcode.Kind#LOAD}
|
||||
* @param slot the local variable slot to load from
|
||||
*/
|
||||
static LoadInstruction of(Opcode op, int slot) {
|
||||
Util.checkKind(op, Opcode.Kind.LOAD);
|
||||
return new AbstractInstruction.UnboundLoadInstruction(op, slot);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,124 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.constant.ClassDesc;
|
||||
|
||||
import java.lang.classfile.BufWriter;
|
||||
import java.lang.classfile.ClassFile;
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Label;
|
||||
import java.lang.classfile.PseudoInstruction;
|
||||
import java.lang.classfile.attribute.LocalVariableTableAttribute;
|
||||
import java.lang.classfile.constantpool.Utf8Entry;
|
||||
import jdk.internal.classfile.impl.AbstractPseudoInstruction;
|
||||
import jdk.internal.classfile.impl.BoundLocalVariable;
|
||||
import jdk.internal.classfile.impl.TemporaryConstantPool;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* A pseudo-instruction which models a single entry in the
|
||||
* {@link LocalVariableTableAttribute}. Delivered as a {@link CodeElement}
|
||||
* during traversal of the elements of a {@link CodeModel}, according to
|
||||
* the setting of the {@link ClassFile.DebugElementsOption} option.
|
||||
*
|
||||
* @see PseudoInstruction
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface LocalVariable extends PseudoInstruction
|
||||
permits AbstractPseudoInstruction.UnboundLocalVariable, BoundLocalVariable {
|
||||
/**
|
||||
* {@return the local variable slot}
|
||||
*/
|
||||
int slot();
|
||||
|
||||
/**
|
||||
* {@return the local variable name}
|
||||
*/
|
||||
Utf8Entry name();
|
||||
|
||||
/**
|
||||
* {@return the local variable field descriptor}
|
||||
*/
|
||||
Utf8Entry type();
|
||||
|
||||
/**
|
||||
* {@return the local variable type, as a symbolic descriptor}
|
||||
*/
|
||||
default ClassDesc typeSymbol() {
|
||||
return ClassDesc.ofDescriptor(type().stringValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return the start range of the local variable scope}
|
||||
*/
|
||||
Label startScope();
|
||||
|
||||
/**
|
||||
* {@return the end range of the local variable scope}
|
||||
*/
|
||||
Label endScope();
|
||||
|
||||
/**
|
||||
* Writes the local variable to the specified writer
|
||||
*
|
||||
* @param buf the writer
|
||||
* @return true if the variable has been written
|
||||
*/
|
||||
boolean writeTo(BufWriter buf);
|
||||
|
||||
/**
|
||||
* {@return a local variable pseudo-instruction}
|
||||
*
|
||||
* @param slot the local variable slot
|
||||
* @param nameEntry the local variable name
|
||||
* @param descriptorEntry the local variable descriptor
|
||||
* @param startScope the start range of the local variable scope
|
||||
* @param endScope the end range of the local variable scope
|
||||
*/
|
||||
static LocalVariable of(int slot, Utf8Entry nameEntry, Utf8Entry descriptorEntry, Label startScope, Label endScope) {
|
||||
return new AbstractPseudoInstruction.UnboundLocalVariable(slot, nameEntry, descriptorEntry,
|
||||
startScope, endScope);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a local variable pseudo-instruction}
|
||||
*
|
||||
* @param slot the local variable slot
|
||||
* @param name the local variable name
|
||||
* @param descriptor the local variable descriptor
|
||||
* @param startScope the start range of the local variable scope
|
||||
* @param endScope the end range of the local variable scope
|
||||
*/
|
||||
static LocalVariable of(int slot, String name, ClassDesc descriptor, Label startScope, Label endScope) {
|
||||
return of(slot,
|
||||
TemporaryConstantPool.INSTANCE.utf8Entry(name),
|
||||
TemporaryConstantPool.INSTANCE.utf8Entry(descriptor.descriptorString()),
|
||||
startScope, endScope);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,121 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.BufWriter;
|
||||
import java.lang.classfile.ClassFile;
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Label;
|
||||
import java.lang.classfile.PseudoInstruction;
|
||||
import java.lang.classfile.Signature;
|
||||
import java.lang.classfile.attribute.LocalVariableTypeTableAttribute;
|
||||
import java.lang.classfile.constantpool.Utf8Entry;
|
||||
import jdk.internal.classfile.impl.AbstractPseudoInstruction;
|
||||
import jdk.internal.classfile.impl.BoundLocalVariableType;
|
||||
import jdk.internal.classfile.impl.TemporaryConstantPool;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* A pseudo-instruction which models a single entry in the {@link
|
||||
* LocalVariableTypeTableAttribute}. Delivered as a {@link CodeElement} during
|
||||
* traversal of the elements of a {@link CodeModel}, according to the setting of
|
||||
* the {@link ClassFile.DebugElementsOption} option.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface LocalVariableType extends PseudoInstruction
|
||||
permits AbstractPseudoInstruction.UnboundLocalVariableType, BoundLocalVariableType {
|
||||
/**
|
||||
* {@return the local variable slot}
|
||||
*/
|
||||
int slot();
|
||||
|
||||
/**
|
||||
* {@return the local variable name}
|
||||
*/
|
||||
Utf8Entry name();
|
||||
|
||||
/**
|
||||
* {@return the local variable signature}
|
||||
*/
|
||||
Utf8Entry signature();
|
||||
|
||||
/**
|
||||
* {@return the local variable signature}
|
||||
*/
|
||||
default Signature signatureSymbol() {
|
||||
return Signature.parseFrom(signature().stringValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return the start range of the local variable scope}
|
||||
*/
|
||||
Label startScope();
|
||||
|
||||
/**
|
||||
* {@return the end range of the local variable scope}
|
||||
*/
|
||||
Label endScope();
|
||||
|
||||
/**
|
||||
* Writes the local variable to the specified writer
|
||||
*
|
||||
* @param buf the writer
|
||||
* @return true if the variable has been written
|
||||
*/
|
||||
boolean writeTo(BufWriter buf);
|
||||
|
||||
/**
|
||||
* {@return a local variable type pseudo-instruction}
|
||||
*
|
||||
* @param slot the local variable slot
|
||||
* @param nameEntry the local variable name
|
||||
* @param signatureEntry the local variable signature
|
||||
* @param startScope the start range of the local variable scope
|
||||
* @param endScope the end range of the local variable scope
|
||||
*/
|
||||
static LocalVariableType of(int slot, Utf8Entry nameEntry, Utf8Entry signatureEntry, Label startScope, Label endScope) {
|
||||
return new AbstractPseudoInstruction.UnboundLocalVariableType(slot, nameEntry, signatureEntry,
|
||||
startScope, endScope);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a local variable type pseudo-instruction}
|
||||
*
|
||||
* @param slot the local variable slot
|
||||
* @param name the local variable name
|
||||
* @param signature the local variable signature
|
||||
* @param startScope the start range of the local variable scope
|
||||
* @param endScope the end range of the local variable scope
|
||||
*/
|
||||
static LocalVariableType of(int slot, String name, Signature signature, Label startScope, Label endScope) {
|
||||
return of(slot,
|
||||
TemporaryConstantPool.INSTANCE.utf8Entry(name),
|
||||
TemporaryConstantPool.INSTANCE.utf8Entry(signature.signatureString()),
|
||||
startScope, endScope);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Label;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a {@code lookupswitch} instruction in the {@code code} array of a
|
||||
* {@code Code} attribute. Delivered as a {@link CodeElement} when traversing
|
||||
* the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface LookupSwitchInstruction extends Instruction
|
||||
permits AbstractInstruction.BoundLookupSwitchInstruction,
|
||||
AbstractInstruction.UnboundLookupSwitchInstruction {
|
||||
/**
|
||||
* {@return the target of the default case}
|
||||
*/
|
||||
Label defaultTarget();
|
||||
|
||||
/**
|
||||
* {@return the cases of the switch}
|
||||
*/
|
||||
List<SwitchCase> cases();
|
||||
|
||||
/**
|
||||
* {@return a lookup switch instruction}
|
||||
*
|
||||
* @param defaultTarget the default target of the switch
|
||||
* @param cases the cases of the switch
|
||||
*/
|
||||
static LookupSwitchInstruction of(Label defaultTarget, List<SwitchCase> cases) {
|
||||
return new AbstractInstruction.UnboundLookupSwitchInstruction(defaultTarget, cases);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,56 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Opcode;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a {@code monitorenter} or {@code monitorexit} instruction in the
|
||||
* {@code code} array of a {@code Code} attribute. Delivered as a {@link
|
||||
* CodeElement} when traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface MonitorInstruction extends Instruction
|
||||
permits AbstractInstruction.UnboundMonitorInstruction {
|
||||
|
||||
/**
|
||||
* {@return a monitor instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of monitor instruction,
|
||||
* which must be of kind {@link Opcode.Kind#MONITOR}
|
||||
*/
|
||||
static MonitorInstruction of(Opcode op) {
|
||||
Util.checkKind(op, Opcode.Kind.MONITOR);
|
||||
return new AbstractInstruction.UnboundMonitorInstruction(op);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.constantpool.ClassEntry;
|
||||
import java.lang.classfile.Instruction;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a {@code multianewarray} invocation instruction in the {@code code}
|
||||
* array of a {@code Code} attribute. Delivered as a {@link CodeElement}
|
||||
* when traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface NewMultiArrayInstruction extends Instruction
|
||||
permits AbstractInstruction.BoundNewMultidimensionalArrayInstruction,
|
||||
AbstractInstruction.UnboundNewMultidimensionalArrayInstruction {
|
||||
|
||||
/**
|
||||
* {@return the type of the array, as a symbolic descriptor}
|
||||
*/
|
||||
ClassEntry arrayType();
|
||||
|
||||
/**
|
||||
* {@return the number of dimensions of the array}
|
||||
*/
|
||||
int dimensions();
|
||||
|
||||
/**
|
||||
* {@return a new multi-dimensional array instruction}
|
||||
*
|
||||
* @param arrayTypeEntry the type of the array
|
||||
* @param dimensions the number of dimensions of the array
|
||||
*/
|
||||
static NewMultiArrayInstruction of(ClassEntry arrayTypeEntry,
|
||||
int dimensions) {
|
||||
return new AbstractInstruction.UnboundNewMultidimensionalArrayInstruction(arrayTypeEntry, dimensions);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.constantpool.ClassEntry;
|
||||
import java.lang.classfile.Instruction;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a {@code new} instruction in the {@code code} array of a {@code Code}
|
||||
* attribute. Delivered as a {@link CodeElement} when traversing the elements
|
||||
* of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface NewObjectInstruction extends Instruction
|
||||
permits AbstractInstruction.BoundNewObjectInstruction, AbstractInstruction.UnboundNewObjectInstruction {
|
||||
|
||||
/**
|
||||
* {@return the type of object to create}
|
||||
*/
|
||||
ClassEntry className();
|
||||
|
||||
/**
|
||||
* {@return a new object instruction}
|
||||
*
|
||||
* @param className the type of object to create
|
||||
*/
|
||||
static NewObjectInstruction of(ClassEntry className) {
|
||||
return new AbstractInstruction.UnboundNewObjectInstruction(className);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.TypeKind;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a {@code newarray} invocation instruction in the {@code code}
|
||||
* array of a {@code Code} attribute. Delivered as a {@link CodeElement}
|
||||
* when traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface NewPrimitiveArrayInstruction extends Instruction
|
||||
permits AbstractInstruction.BoundNewPrimitiveArrayInstruction,
|
||||
AbstractInstruction.UnboundNewPrimitiveArrayInstruction {
|
||||
/**
|
||||
* {@return the component type of the array}
|
||||
*/
|
||||
TypeKind typeKind();
|
||||
|
||||
/**
|
||||
* {@return a new primitive array instruction}
|
||||
*
|
||||
* @param typeKind the component type of the array
|
||||
*/
|
||||
static NewPrimitiveArrayInstruction of(TypeKind typeKind) {
|
||||
return new AbstractInstruction.UnboundNewPrimitiveArrayInstruction(typeKind);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.constantpool.ClassEntry;
|
||||
import java.lang.classfile.Instruction;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a {@code anewarray} invocation instruction in the {@code code}
|
||||
* array of a {@code Code} attribute. Delivered as a {@link CodeElement}
|
||||
* when traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface NewReferenceArrayInstruction extends Instruction
|
||||
permits AbstractInstruction.BoundNewReferenceArrayInstruction, AbstractInstruction.UnboundNewReferenceArrayInstruction {
|
||||
/**
|
||||
* {@return the component type of the array}
|
||||
*/
|
||||
ClassEntry componentType();
|
||||
|
||||
/**
|
||||
* {@return a new reference array instruction}
|
||||
*
|
||||
* @param componentType the component type of the array
|
||||
*/
|
||||
static NewReferenceArrayInstruction of(ClassEntry componentType) {
|
||||
return new AbstractInstruction.UnboundNewReferenceArrayInstruction(componentType);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a {@code nop} invocation instruction in the {@code code}
|
||||
* array of a {@code Code} attribute. Delivered as a {@link CodeElement}
|
||||
* when traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface NopInstruction extends Instruction
|
||||
permits AbstractInstruction.UnboundNopInstruction {
|
||||
/**
|
||||
* {@return a no-op instruction}
|
||||
*/
|
||||
static NopInstruction of() {
|
||||
return new AbstractInstruction.UnboundNopInstruction();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Opcode;
|
||||
import java.lang.classfile.TypeKind;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models an arithmetic operator instruction in the {@code code} array of a
|
||||
* {@code Code} attribute. Corresponding opcodes will have a {@code kind} of
|
||||
* {@link Opcode.Kind#OPERATOR}. Delivered as a {@link CodeElement} when
|
||||
* traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface OperatorInstruction extends Instruction
|
||||
permits AbstractInstruction.UnboundOperatorInstruction {
|
||||
/**
|
||||
* {@return the operand type of the instruction}
|
||||
*/
|
||||
TypeKind typeKind();
|
||||
|
||||
/**
|
||||
* {@return an operator instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of array load instruction,
|
||||
* which must be of kind {@link Opcode.Kind#OPERATOR}
|
||||
*/
|
||||
static OperatorInstruction of(Opcode op) {
|
||||
Util.checkKind(op, Opcode.Kind.OPERATOR);
|
||||
return new AbstractInstruction.UnboundOperatorInstruction(op);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Opcode;
|
||||
import java.lang.classfile.TypeKind;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.BytecodeHelpers;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a return-from-method instruction in the {@code code} array of a
|
||||
* {@code Code} attribute. Corresponding opcodes will have a {@code kind} of
|
||||
* {@link Opcode.Kind#RETURN}. Delivered as a {@link CodeElement} when
|
||||
* traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface ReturnInstruction extends Instruction
|
||||
permits AbstractInstruction.UnboundReturnInstruction {
|
||||
|
||||
/**
|
||||
* {@return the type of the return instruction}
|
||||
*/
|
||||
TypeKind typeKind();
|
||||
|
||||
/**
|
||||
* {@return a return instruction}
|
||||
*
|
||||
* @param typeKind the type of the return instruction
|
||||
*/
|
||||
static ReturnInstruction of(TypeKind typeKind) {
|
||||
return of(BytecodeHelpers.returnOpcode(typeKind));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a return instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of return instruction,
|
||||
* which must be of kind {@link Opcode.Kind#RETURN}
|
||||
*/
|
||||
static ReturnInstruction of(Opcode op) {
|
||||
Util.checkKind(op, Opcode.Kind.RETURN);
|
||||
return new AbstractInstruction.UnboundReturnInstruction(op);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Opcode;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a stack manipulation instruction in the {@code code} array of a
|
||||
* {@code Code} attribute. Corresponding opcodes will have a {@code kind} of
|
||||
* {@link Opcode.Kind#STACK}. Delivered as a {@link CodeElement} when
|
||||
* traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface StackInstruction extends Instruction
|
||||
permits AbstractInstruction.UnboundStackInstruction {
|
||||
|
||||
/**
|
||||
* {@return a stack manipulation instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of stack instruction,
|
||||
* which must be of kind {@link Opcode.Kind#STACK}
|
||||
*/
|
||||
static StackInstruction of(Opcode op) {
|
||||
Util.checkKind(op, Opcode.Kind.STACK);
|
||||
return new AbstractInstruction.UnboundStackInstruction(op);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Opcode;
|
||||
import java.lang.classfile.TypeKind;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.BytecodeHelpers;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a local variable store instruction in the {@code code} array of a
|
||||
* {@code Code} attribute. Corresponding opcodes will have a {@code kind} of
|
||||
* {@link Opcode.Kind#STORE}. Delivered as a {@link CodeElement} when
|
||||
* traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface StoreInstruction extends Instruction
|
||||
permits AbstractInstruction.BoundStoreInstruction, AbstractInstruction.UnboundStoreInstruction {
|
||||
|
||||
/**
|
||||
* {@return the local variable slot to store to}
|
||||
*/
|
||||
int slot();
|
||||
|
||||
/**
|
||||
* {@return the type of the value to be stored}
|
||||
*/
|
||||
TypeKind typeKind();
|
||||
|
||||
/**
|
||||
* {@return a local variable store instruction}
|
||||
*
|
||||
* @param kind the type of the value to be stored
|
||||
* @param slot the local variable slot to store to
|
||||
*/
|
||||
static StoreInstruction of(TypeKind kind, int slot) {
|
||||
return of(BytecodeHelpers.storeOpcode(kind, slot), slot);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a local variable store instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of store instruction,
|
||||
* which must be of kind {@link Opcode.Kind#STORE}
|
||||
* @param slot the local variable slot to store to
|
||||
*/
|
||||
static StoreInstruction of(Opcode op, int slot) {
|
||||
Util.checkKind(op, Opcode.Kind.STORE);
|
||||
return new AbstractInstruction.UnboundStoreInstruction(op, slot);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.Label;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a single case in a {@code lookupswitch} or {@code tableswitch}
|
||||
* instruction.
|
||||
*
|
||||
* @see LookupSwitchInstruction
|
||||
* @see TableSwitchInstruction
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface SwitchCase
|
||||
permits AbstractInstruction.SwitchCaseImpl {
|
||||
|
||||
/** {@return the integer value corresponding to this case} */
|
||||
int caseValue();
|
||||
|
||||
/** {@return the branch target corresponding to this case} */
|
||||
Label target();
|
||||
|
||||
/**
|
||||
* Create a {@linkplain SwitchCase}
|
||||
*
|
||||
* @param caseValue the integer value for the case
|
||||
* @param target the branch target for the case
|
||||
* @return the {@linkplain SwitchCase}
|
||||
*/
|
||||
static SwitchCase of(int caseValue, Label target) {
|
||||
return new AbstractInstruction.SwitchCaseImpl(caseValue, target);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Label;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models a {@code tableswitch} instruction in the {@code code} array of a
|
||||
* {@code Code} attribute. Delivered as a {@link CodeElement} when traversing
|
||||
* the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface TableSwitchInstruction extends Instruction
|
||||
permits AbstractInstruction.BoundTableSwitchInstruction, AbstractInstruction.UnboundTableSwitchInstruction {
|
||||
/**
|
||||
* {@return the low value of the switch target range, inclusive}
|
||||
*/
|
||||
int lowValue();
|
||||
|
||||
/**
|
||||
* {@return the high value of the switch target range, inclusive}
|
||||
*/
|
||||
int highValue();
|
||||
|
||||
/**
|
||||
* {@return the default target of the switch}
|
||||
*/
|
||||
Label defaultTarget();
|
||||
|
||||
/**
|
||||
* {@return the cases of the switch}
|
||||
*/
|
||||
List<SwitchCase> cases();
|
||||
|
||||
/**
|
||||
* {@return a table switch instruction}
|
||||
*
|
||||
* @param lowValue the low value of the switch target range, inclusive
|
||||
* @param highValue the high value of the switch target range, inclusive
|
||||
* @param defaultTarget the default target of the switch
|
||||
* @param cases the cases of the switch
|
||||
*/
|
||||
static TableSwitchInstruction of(int lowValue, int highValue, Label defaultTarget, List<SwitchCase> cases) {
|
||||
return new AbstractInstruction.UnboundTableSwitchInstruction(lowValue, highValue, defaultTarget, cases);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.Instruction;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models an {@code athrow} instruction in the {@code code} array of a
|
||||
* {@code Code} attribute. Delivered as a {@link CodeElement} when traversing
|
||||
* the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface ThrowInstruction extends Instruction
|
||||
permits AbstractInstruction.UnboundThrowInstruction {
|
||||
|
||||
/**
|
||||
* {@return a throw instruction}
|
||||
*/
|
||||
static ThrowInstruction of() {
|
||||
return new AbstractInstruction.UnboundThrowInstruction();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import java.lang.constant.ClassDesc;
|
||||
|
||||
import java.lang.classfile.CodeElement;
|
||||
import java.lang.classfile.CodeModel;
|
||||
import java.lang.classfile.constantpool.ClassEntry;
|
||||
import java.lang.classfile.Instruction;
|
||||
import java.lang.classfile.Opcode;
|
||||
import jdk.internal.classfile.impl.AbstractInstruction;
|
||||
import jdk.internal.classfile.impl.TemporaryConstantPool;
|
||||
import jdk.internal.classfile.impl.Util;
|
||||
import jdk.internal.javac.PreviewFeature;
|
||||
|
||||
/**
|
||||
* Models an {@code instanceof} or {@code checkcast} instruction in the {@code
|
||||
* code} array of a {@code Code} attribute. Delivered as a {@link CodeElement}
|
||||
* when traversing the elements of a {@link CodeModel}.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
public sealed interface TypeCheckInstruction extends Instruction
|
||||
permits AbstractInstruction.BoundTypeCheckInstruction,
|
||||
AbstractInstruction.UnboundTypeCheckInstruction {
|
||||
|
||||
/**
|
||||
* {@return the type against which the instruction checks or casts}
|
||||
*/
|
||||
ClassEntry type();
|
||||
|
||||
/**
|
||||
* {@return a type check instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of type check instruction,
|
||||
* which must be of kind {@link Opcode.Kind#TYPE_CHECK}
|
||||
* @param type the type against which to check or cast
|
||||
*/
|
||||
static TypeCheckInstruction of(Opcode op, ClassEntry type) {
|
||||
Util.checkKind(op, Opcode.Kind.TYPE_CHECK);
|
||||
return new AbstractInstruction.UnboundTypeCheckInstruction(op, type);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@return a type check instruction}
|
||||
*
|
||||
* @param op the opcode for the specific type of type check instruction,
|
||||
* which must be of kind {@link Opcode.Kind#TYPE_CHECK}
|
||||
* @param type the type against which to check or cast
|
||||
*/
|
||||
static TypeCheckInstruction of(Opcode op, ClassDesc type) {
|
||||
return of(op, TemporaryConstantPool.INSTANCE.classEntry(type));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
/*
|
||||
* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation. Oracle designates this
|
||||
* particular file as subject to the "Classpath" exception as provided
|
||||
* by Oracle in the LICENSE file that accompanied this code.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/**
|
||||
* <h2>Provides interfaces describing code instructions for the {@link java.lang.classfile} library.</h2>
|
||||
*
|
||||
* The {@code java.lang.classfile.attribute} package contains interfaces describing code instructions.
|
||||
*
|
||||
* @since 22
|
||||
*/
|
||||
@PreviewFeature(feature = PreviewFeature.Feature.CLASSFILE_API)
|
||||
package java.lang.classfile.instruction;
|
||||
|
||||
import jdk.internal.javac.PreviewFeature;
|
Loading…
Add table
Add a link
Reference in a new issue