كيفية تجنب "النوع غير القانوني في تجمع ثابت" باستخدام "LDC_W " في ياسمين؟

StackOverflow https://stackoverflow.com/questions/2784791

  •  03-10-2019
  •  | 
  •  

سؤال

أنا أكتب مترجمًا يولد رمز Jasmin وأريد استدعاء طريقة تأخذ الفصل كمعلمة.

public class CTest
{
    public static void main(String[] args)
        throws Exception
    {
        java.lang.reflect.Array.newInstance(CTest.class, 0);
    }
}

لذلك في ياسمين ، أعتقد أنه ينبغي أن يكون:

.class public CTest2
.super java/lang/Object

.method public static main([Ljava/lang/String;)V
    .limit stack 2
    .limit locals 1
    ldc_w CTest2
    iconst_0
    invokestatic java/lang/reflect/Array/newInstance(Ljava/lang/Class;I)Ljava/lang/Object;
    pop
    return
.end method

عندما أقوم بتجميعها وأركضها ، أحصل عليها:

استثناء في الموضوع "الرئيسي" java.lang.verifyerror: (الفئة: CTEST2 ، الطريقة: التوقيع الرئيسي: ([ljava/lang/string ؛) v) نوع غير قانوني في مجموعة ثابتة

بالنظر إلى الكود المفكك لكل من ctest.class (إصدار Java) و Ctest2.Class (إصدار Jasmin) مع "Javap -C -Verbose" يبدو أن كلاهما يقوم بإعداد المسبح الثابت بنفس الطريقة:

const #2 = class        #16;    //  CTest
const #16 = Asciz       CTest;

  0:   ldc_w   #2; //class CTest

const #14 = Asciz       CTest2;
const #17 = class       #14;    //  CTest2

  0:   ldc_w   #17; //class CTest2

لقد أصلحت اثنين من الأخطاء في Jasmin بالفعل ، لكن لا يمكنني رؤية ما يفعله خطأ عند وضع الفصل في المجموعة الثابتة لـ "LDC_W" ، فإنه يضع الفصول في المجموعة الثابتة للحصول على تعليمات أخرى ، مثل "New" و "anewarray "بشكل صحيح.

لقد حاولت النظر إلى ملفات .class مع TraceClassVisitor في ASM ، لكنها لا تتخلص من التجمع الثابت.

أي أفكار ما يمكنني تجربته بعد ذلك؟

هل كانت مفيدة؟

المحلول

يجب عليك التأكد من أن رقم الإصدار من الفصل هو 49 على الأقل (انظر VisitLdcinsn على هذا صفحة ASM Javadoc).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top