1

コードをより厳密な Java 7 ベリファイアに適合させる必要がありvisitFrame、MethodNode に呼び出しを追加する必要があります (ツリー API を使用しています)。TypevisitFrame で使用される sへのマップ方法に関する情報を見つけることができなかっObject[]たので、ここで私を助けてください...

これは私がこれまでに持っているものです:

private Object getFrameType(Type type) {
    switch (type.getSort()) {
        case Type.BOOLEAN:
        case Type.CHAR:
        case Type.BYTE:
        case Type.SHORT:
        case Type.INT:
            return Opcodes.INTEGER;
        case Type.LONG:
            return Opcodes.LONG;
        case Type.FLOAT:
            return Opcodes.FLOAT;
        case Type.DOUBLE:
            return Opcodes.DOUBLE;
        case Type.OBJECT:
        case Type.ARRAY:
            return type.getInternalName();
    }
    throw new RuntimeException(type + " can not be converted to frame type");
}

私が知りたいのはType.VOID、 とは何Type.METHODですか? Opcodes.TOPOpcodes.NULLおよびが必要になるのはOpcodes.UNINITIALIZED_THISいつですか?

UNINITIALIZED_THISはコンストラクターでのみ使用され、おそらく and を無視できるVOIDMETHOD思いますが、よくわかりませんし、何が何であるのか少しもわかりませんTOP

4

1 に答える 1

0

私があなたの必要性を正しく理解していれば、ASM にフレームを計算させることができます。これにより、おそらくクラスの生成が少し遅くなりますが、試してみる価値はあります。

を作成するときは、コンストラクターの flags 引数にClassWriter追加するだけです。COMPUTE_FRAMES

new ClassWriter(ClassWriter.COMPUTE_FRAMES);

同様に、クラスを変換する場合、次のようにフレームClassReaderを展開するように要求できます。

ClassReader cr = ...;
ClassNode cn = new ClassNode(ASM4);
cr.accept(cn, ClassReader.EXPAND_FRAMES);

前者のオプションには、フレーム (および「maxs」) を完全に忘れることができるという利点がありますが、後者のオプションでは、実行する変換の種類に応じて、自分でフレームにパッチを適用する必要がある場合があります。

例は ASM バージョン 4 用ですが、これらの機能は少なくともバージョン 3 以降でサポートされています。パラメーターの受け渡し方法が少し異なるだけです。

于 2013-02-22T20:12:09.023 に答える