修飾子と型 | クラスと説明 |
---|---|
static interface | CodeFlow.ClinitAdder clinit 静的初期化ブロックを生成するために使用されるインターフェース。 |
static interface | CodeFlow.FieldAdder フィールドの生成に使用されるインターフェース。 |
AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V9
コンストラクターと説明 |
---|
CodeFlow(StringSE className, ClassWriter classWriter) 指定されたクラスの新しい CodeFlow を構築します。 |
修飾子と型 | メソッドと説明 |
---|---|
static boolean | areBoxingCompatible(StringSE desc1, StringSE desc2) ボクシング / アンボクシングが 1 つの型から別の型に移行できるかどうかを決定します。 |
static int | arrayCodeFor(StringSE arraytype) NEWARRAY バイトコードに使用する適切な T タグを決定します。 |
static StringSE | createSignatureDescriptor(ConstructorSE<?> ctor) コンストラクターの JVM シグニチャー記述子を作成します。 |
static StringSE | createSignatureDescriptor(MethodSE method) メソッドの JVM シグニチャー記述子を作成します。 |
void | enterCompilationScope() 通常、ネストされた式の評価により、新しいコンパイルスコープを入力します。 |
void | exitCompilationScope() 通常、ネストされた式が評価された後で、コンパイルスコープを終了します。 |
void | finish() メインの式評価メソッドが生成された後に呼び出されるこのメソッドは、登録済みの FieldAdders または ClinitAdders をコールバックして、コンパイルされた式を表すクラスに追加情報を追加します。 |
StringSE | getClassName() |
static void | insertAnyNecessaryTypeConversionBytecodes(MethodVisitor mv, char targetDescriptor, StringSE stackDescriptor) スタックの内容と目的のターゲット型に基づいて、必要な数値変換バイトコードを挿入します。 |
static void | insertArrayStore(MethodVisitor mv, StringSE arrayElementType) スタック項目を配列に格納するための適切なバイトコードを生成します。 |
static void | insertBoxIfNecessary(MethodVisitor mv, char ch) 特定の型に適切なボクシング指示を決定し(ボクシングが必要な場合)、指示を提供されたビジターに挿入します。 |
static void | insertBoxIfNecessary(MethodVisitor mv, StringSE descriptor) 特定の型に適切なボクシング指示を決定し(ボクシングが必要な場合)、指示を提供されたビジターに挿入します。 |
static void | insertCheckCast(MethodVisitor mv, StringSE descriptor) 提供された記述子に適切な CHECKCAST 命令を挿入します。 |
static void | insertNewArrayCode(MethodVisitor mv, int size, StringSE arraytype) 正しいバイトコードを生成して配列を構築します。 |
static void | insertNumericUnboxOrPrimitiveTypeCoercion(MethodVisitor mv, StringSE stackDescriptor, char targetDescriptor) 数学演算子で使用するために、スタック上の(おそらくボックス化された)数値からプリミティブ数値型への変換を処理します。 |
static void | insertOptimalLoad(MethodVisitor mv, int value) スタックに数値をロードするための最適な命令を作成します。 |
static void | insertUnboxInsns(MethodVisitor mv, char ch, StringSE stackDescriptor) ボックス型からプリミティブ値に変換するために必要なキャストと値の呼び出しを挿入します。 |
static void | insertUnboxNumberInsns(MethodVisitor mv, char targetDescriptor, StringSE stackDescriptor) 数値の場合は、適切なメソッドを使用して、リクエストされたプリミティブ型に変換します。 |
static boolean | isBooleanCompatible(StringSE descriptor) 記述子がブールプリミティブ型かブール参照型かを判別します。 |
static boolean | isIntegerForNumericOp(NumberSE number) 指定された数値が、バイトコードレベルでの数値演算の目的で整数と見なされるかどうかを決定します。 |
static boolean | isPrimitive(StringSE descriptor) 記述子がプリミティブ型用かどうかを判別します。 |
static boolean | isPrimitiveArray(StringSE descriptor) 記述子がプリミティブ配列用かどうかを判断します(例: |
static boolean | isPrimitiveOrUnboxableSupportedNumber(StringSE descriptor) 指定された記述子がサポートされている数値用かどうかを判別してください。 |
static boolean | isPrimitiveOrUnboxableSupportedNumberOrBoolean(StringSE descriptor) 提供された記述子が、サポートされている数値型またはブール値のどちらであるかを判別してください。 |
static boolean | isReferenceTypeArray(StringSE arraytype) 指定された配列型にコアコンポーネント参照型があるかどうかを返します。 |
StringSE | lastDescriptor() 現在スタックの最上位にある(現在のスコープ内の)アイテムの記述子を返します。 |
void | loadEvaluationContext(MethodVisitor mv) バイトコードをプッシュして EvaluationContext(コンパイルされた式メソッドに渡される 2 番目のパラメーター)をロードします。 |
void | loadTarget(MethodVisitor mv) バイトコードをプッシュしてターゲットをロードします(つまり |
int | nextFieldId() |
int | nextFreeVariableId() |
void | pushDescriptor(StringSE descriptor) 最後に評価された式要素の記述子を記録します。 |
void | registerNewClinit(CodeFlow.ClinitAdder clinitAdder) 生成されたクラスの静的初期化子にコードを追加する ClinitAdder を登録して、ast ノードのプライマリ generateCode() メソッドによって生成されたコードをサポートします。 |
void | registerNewField(CodeFlow.FieldAdder fieldAdder) ast ノードのプライマリ generateCode() メソッドによって生成されたコードをサポートするために、生成されたクラスに新しいフィールドを追加する FieldAdder を登録します。 |
static StringSE | toBoxedDescriptor(StringSE primitiveDescriptor) |
static StringSE | toDescriptor(ClassSE<?> type) 型の記述子を推定します。 |
static StringSE | toDescriptorFromObject(ObjectSE value) オブジェクトインスタンス(または null )の記述子を決定します。 |
static StringSE[] | toDescriptors(ClassSE<?>[] types) クラスの配列から記述子の配列を作成します。 |
static StringSE | toJvmDescriptor(ClassSE<?> clazz) 指定されたクラスの JVM 記述子を決定します。 |
static StringSE[] | toParamDescriptors(ConstructorSE<?> ctor) 指定されたコンストラクターのパラメーター型を表す記述子の配列を作成します。 |
static StringSE[] | toParamDescriptors(MethodSE method) 指定されたメソッドのパラメーター型を表す記述子の配列を作成します。 |
static char | toPrimitiveTargetDesc(StringSE descriptor) 型記述子を 1 文字のプリミティブ記述子に変換します。 |
void | unboxBooleanIfNecessary(MethodVisitor mv) コードフローが java.lang.Boolean に評価された最後の式を示している場合は、必要な命令を挿入して、ブールプリミティブにボックス化します。 |
cloneSE, equalsSE, finalizeSE, getClassSE, hashCodeSE, notifySE, notifyAllSE, toStringSE, waitSE, waitSE, waitSE
public CodeFlow(StringSE className, ClassWriter classWriter)
CodeFlow
を構築します。className
- クラスの名前 classWriter
- 対応する ASM ClassWriter
public void loadTarget(MethodVisitor mv)
mv
- ロード命令が挿入されるビジター public void loadEvaluationContext(MethodVisitor mv)
mv
- ロード命令が挿入されるビジター public void pushDescriptor(@Nullable StringSE descriptor)
descriptor
- 最近評価された要素の型記述子 public void enterCompilationScope()
public void exitCompilationScope()
public void unboxBooleanIfNecessary(MethodVisitor mv)
mv
- 新しい指示を挿入する訪問者 public void finish()
public void registerNewField(CodeFlow.FieldAdder fieldAdder)
public void registerNewClinit(CodeFlow.ClinitAdder clinitAdder)
public int nextFieldId()
public int nextFreeVariableId()
public StringSE getClassName()
public static void insertUnboxInsns(MethodVisitor mv, char ch, @Nullable StringSE stackDescriptor)
mv
- 命令を挿入するメソッドビジター ch
- 出力として必要なプリミティブ型 stackDescriptor
- スタックの一番上の型の記述子 public static void insertUnboxNumberInsns(MethodVisitor mv, char targetDescriptor, @Nullable StringSE stackDescriptor)
mv
- 命令を挿入するメソッドビジター targetDescriptor
- 出力として必要なプリミティブ型 stackDescriptor
- スタックの一番上の型の記述子 public static void insertAnyNecessaryTypeConversionBytecodes(MethodVisitor mv, char targetDescriptor, StringSE stackDescriptor)
mv
- 指示が配置されるメソッドビジター targetDescriptor
- ターゲット型の(プリミティブ)記述子 stackDescriptor
- スタックの最上位のオペランドの記述子 public static StringSE createSignatureDescriptor(MethodSE method)
method
- メソッド public static StringSE createSignatureDescriptor(ConstructorSE<?> ctor)
ctor
- コンストラクター public static StringSE toJvmDescriptor(ClassSE<?> clazz)
clazz
- クラス public static StringSE toDescriptorFromObject(@Nullable ObjectSE value)
null
)の記述子を決定します。value
- オブジェクト (おそらく null
)null
値の記述子は "Ljava/lang/Object" です)public static boolean isBooleanCompatible(@Nullable StringSE descriptor)
descriptor
- 型記述子 true
public static boolean isPrimitive(@Nullable StringSE descriptor)
descriptor
- 型記述子 true
public static boolean isPrimitiveArray(@Nullable StringSE descriptor)
descriptor
- 可能なプリミティブ配列の記述子 true
(記述子がプリミティブ配列の場合)public static boolean areBoxingCompatible(StringSE desc1, StringSE desc2)
true
public static boolean isPrimitiveOrUnboxableSupportedNumberOrBoolean(@Nullable StringSE descriptor)
descriptor
- 型の記述子 true
(記述子がサポートされている数値型またはブール値用である場合)public static boolean isPrimitiveOrUnboxableSupportedNumber(@Nullable StringSE descriptor)
descriptor
- 型の記述子 true
public static boolean isIntegerForNumericOp(NumberSE number)
public static char toPrimitiveTargetDesc(StringSE descriptor)
descriptor
- プリミティブ表現が必要な型の記述子 public static void insertCheckCast(MethodVisitor mv, @Nullable StringSE descriptor)
mv
- 指示を挿入する対象の訪問者 descriptor
- キャストする型の記述子 public static void insertBoxIfNecessary(MethodVisitor mv, @Nullable StringSE descriptor)
mv
- 新しい指示の対象訪問者 descriptor
- ボクシングが必要かどうかにかかわらず、型の記述子 public static void insertBoxIfNecessary(MethodVisitor mv, char ch)
mv
- 新しい指示の対象訪問者 ch
- ボクシングが必要になる可能性がある型の記述子 public static StringSE toDescriptor(ClassSE<?> type)
type
- 記述子を決定する型(プリミティブの場合があります)public static StringSE[] toParamDescriptors(MethodSE method)
method
- メソッド public static StringSE[] toParamDescriptors(ConstructorSE<?> ctor)
ctor
- コンストラクター public static StringSE[] toDescriptors(ClassSE<?>[] types)
types
- クラスの入力配列 public static void insertOptimalLoad(MethodVisitor mv, int value)
mv
- バイトコードを挿入する場所 value
- ロードする値 public static void insertArrayStore(MethodVisitor mv, StringSE arrayElementType)
mv
- バイトコードを挿入する場所 arrayElementType
- 配列要素の型 public static int arrayCodeFor(StringSE arraytype)
arraytype
- 配列プリミティブコンポーネント型 public static boolean isReferenceTypeArray(StringSE arraytype)
public static void insertNewArrayCode(MethodVisitor mv, int size, StringSE arraytype)
mv
- コードを挿入する methodvisitorsize
- 配列のサイズ arraytype
- 配列の型 public static void insertNumericUnboxOrPrimitiveTypeCoercion(MethodVisitor mv, @Nullable StringSE stackDescriptor, char targetDescriptor)
例: Integer から double へ、'Number.doubleValue()' を呼び出すだけですが、int から double へは、バイトコード 'i2d' を使用する必要があります。
mv
- 指示を追加する必要がある場合のメソッドビジター stackDescriptor
- スタック上のオペランドの記述子 targetDescriptor
- プリミティブ型記述子