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

Igor Veresov igor.veresov at oracle.com
Wed Apr 19 03:15:55 UTC 2017


We know :)

https://bugs.openjdk.java.net/browse/JDK-8146201 <https://bugs.openjdk.java.net/browse/JDK-8146201>


igor

> On Apr 18, 2017, at 7:09 PM, Yuting Chen <chenyt.cs.sjtu at gmail.com> wrote:
> 
> Besides,  if a class initializer writes into an external file (or make
> some computations), the compiler will have side effects when compiling
> the corresponding class, :).
> 
> On Tue, Apr 18, 2017 at 5:17 PM, Yuting Chen <chenyt.cs.sjtu at gmail.com> wrote:
>> 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
>>>>> }

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20170418/d17db13e/attachment-0001.html>


More information about the hotspot-compiler-dev mailing list