aot compiler halts when there exists an infinite loop in clinit()
Yuting Chen
chenyt.cs.sjtu at gmail.com
Wed Apr 19 02:09:24 UTC 2017
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
>>>> }
More information about the hotspot-compiler-dev
mailing list