aot compiler halts when there exists an infinite loop in clinit()

Yuting Chen chenyt.cs.sjtu at gmail.com
Wed Apr 19 00:17:43 UTC 2017


Thank you, Vladimir. Should it be better if the compiler can report a
timeout error for such a class initializer?

On Tue, Apr 18, 2017 at 4:46 PM, Vladimir Kozlov
<vladimir.kozlov at oracle.com> wrote:
> On 4/18/17 2:20 PM, Yuting Chen wrote:
>>
>> Hi, are there any comments to this case? I found that the clinit
>> method will be compiled if it does not contain the infinite loop. Does
>> it mean that clinit will run before it is compiled.
>
>
> Yes, AOT compiler will run class initializer since it needs to access static
> fields and other values.
>
> Vladimir
>
>
>>
>> Re-paste the bytecode:
>>
>> public class Vector1
>>   minor version: 0
>>   major version: 52
>>   flags: ACC_PUBLIC, ACC_SUPER
>> Constant pool:
>>    #1 = Utf8               Vector1
>>    #2 = Class              #1             // Vector1
>>    #3 = Utf8               java/lang/Object
>>    #4 = Class              #3             // java/lang/Object
>>    #5 = Utf8               serialVersionUID
>>    #6 = Utf8               J
>>    #7 = Long               -2767605614048989439l
>>    #9 = Utf8               <clinit>
>>   #10 = Utf8               ()V
>>   #11 = NameAndType        #5:#6          // serialVersionUID:J
>>   #12 = Fieldref           #2.#11         // Vector1.serialVersionUID:J
>>   #13 = Utf8               main
>>   #14 = Utf8               ([Ljava/lang/String;)V
>>   #15 = Utf8               ConstantValue
>>   #16 = Utf8               Code
>>   #17 = Utf8               StackMapTable
>> {
>>   public static {};
>>     descriptor: ()V
>>     flags: ACC_PUBLIC, ACC_STATIC
>>     Code:
>>       stack=2, locals=0, args_size=0
>>          0: ldc2_w        #7                  // long
>> -2767605614048989439l
>>          3: putstatic     #12                 // Field serialVersionUID:J
>>          6: iconst_1
>>          7: iconst_m1
>>          8: iadd
>>          9: ifge          0
>>         12: return
>>       StackMapTable: number_of_entries = 1
>>         frame_type = 0 /* same */
>>
>>   public static void main(java.lang.String[]);
>>     descriptor: ([Ljava/lang/String;)V
>>     flags: ACC_PUBLIC, ACC_STATIC
>>     Code:
>>       stack=0, locals=1, args_size=1
>>          0: return
>> }
>>
>> On Tue, Apr 18, 2017 at 9:41 AM, Yuting Chen <chenyt.cs.sjtu at gmail.com>
>> wrote:
>>>
>>> Hi, are there any comments to this case? I found that the clinit
>>> method will be compiled if it does not contain the infinite loop. It's
>>> weird.
>>>
>>> The bytecode is shown as follows:
>>>
>>>  public class Vector1
>>>    minor version: 0
>>>    major version: 52
>>>    flags: ACC_PUBLIC, ACC_SUPER
>>>  Constant pool:
>>>     #1 = Utf8               Vector1
>>>     #2 = Class              #1             // Vector1
>>>     #3 = Utf8               java/lang/Object
>>>     #4 = Class              #3             // java/lang/Object
>>>     #5 = Utf8               serialVersionUID
>>>     #6 = Utf8               J
>>>     #7 = Long               -2767605614048989439l
>>>     #9 = Utf8               <clinit>
>>>    #10 = Utf8               ()V
>>>    #11 = NameAndType        #5:#6          // serialVersionUID:J
>>>    #12 = Fieldref           #2.#11         // Vector1.serialVersionUID:J
>>>    #13 = Utf8               main
>>>    #14 = Utf8               ([Ljava/lang/String;)V
>>>    #15 = Utf8               ConstantValue
>>>    #16 = Utf8               Code
>>>    #17 = Utf8               StackMapTable
>>>  {
>>>    public static {};
>>>      descriptor: ()V
>>>      flags: ACC_PUBLIC, ACC_STATIC
>>>      Code:
>>>        stack=2, locals=0, args_size=0
>>>           0: ldc2_w        #7                  // long
>>> -2767605614048989439l
>>>           3: putstatic     #12                 // Field
>>> serialVersionUID:J
>>>           6: iconst_1
>>>           7: iconst_m1
>>>           8: iadd
>>>           9: ifge          0
>>>          12: return
>>>        StackMapTable: number_of_entries = 1
>>>          frame_type = 0 /* same */
>>>
>>>    public static void main(java.lang.String[]);
>>>      descriptor: ([Ljava/lang/String;)V
>>>      flags: ACC_PUBLIC, ACC_STATIC
>>>      Code:
>>>        stack=0, locals=1, args_size=1
>>>           0: return
>>>  }


More information about the hotspot-compiler-dev mailing list