Mixin icon indicating copy to clipboard operation
Mixin copied to clipboard

Non-trivial initialization of the last declared field declared on multiple lines causes initialization of other fields in the same mixin to not be merged into the target class when using javac

Open Niko-sk2x opened this issue 5 years ago • 1 comments

Example target class:

public class TestTarget {
}

And example mixin:

@Mixin(TestTarget.class)
public abstract class TestMixin {

    private Object field1 = new Object();
    private Object field2 =
            String.valueOf("test"); // this breaks initialization of field1 when it's on multiple lines when using javac
}

This also works correctly when this is "trivial" initialization that doesn't involve invoking any methods, or if there is a different field after field2, or field2 is moved above field1. This affects all fields other than the last one, not just the one immediately preceding it.

Java compiler bytecode with initialization on the same line:

  public <init>()V
   L0
    LINENUMBER 7 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
   L1
    LINENUMBER 9 L1
    ALOAD 0
    NEW java/lang/Object
    DUP
    INVOKESPECIAL java/lang/Object.<init> ()V
    PUTFIELD io/github/opencubicchunks/cubicchunks/mixin/core/common/TestMixin.field1 : Ljava/lang/Object;
   L2
    LINENUMBER 10 L2
    ALOAD 0
    LDC "test"
    INVOKESTATIC java/lang/String.valueOf (Ljava/lang/Object;)Ljava/lang/String;
    PUTFIELD io/github/opencubicchunks/cubicchunks/mixin/core/common/TestMixin.field2 : Ljava/lang/Object;
RETURN
   L3
    LOCALVARIABLE this Lio/github/opencubicchunks/cubicchunks/mixin/core/common/TestMixin; L0 L3 0
    MAXSTACK = 3
    MAXLOCALS = 1

Java compiler bytecode with the field initialization in separate line:

  public <init>()V
   L0
    LINENUMBER 7 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
   L1
    LINENUMBER 9 L1
    ALOAD 0
    NEW java/lang/Object
    DUP
    INVOKESPECIAL java/lang/Object.<init> ()V
    PUTFIELD io/github/opencubicchunks/cubicchunks/mixin/core/common/TestMixin.field1 : Ljava/lang/Object;
   L2
    LINENUMBER 10 L2
    ALOAD 0
    LDC "test"
   L3
    LINENUMBER 11 L3
    INVOKESTATIC java/lang/String.valueOf (Ljava/lang/Object;)Ljava/lang/String;
    PUTFIELD io/github/opencubicchunks/cubicchunks/mixin/core/common/TestMixin.field2 : Ljava/lang/Object;
   L4
    LINENUMBER 10 L4
    RETURN
   L5
    LOCALVARIABLE this Lio/github/opencubicchunks/cubicchunks/mixin/core/common/TestMixin; L0 L5 0
    MAXSTACK = 3
    MAXLOCALS = 1

Eclipse compiler output with initialization on separate line:

  public <init>()V
   L0
    LINENUMBER 7 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
   L1
    LINENUMBER 9 L1
    ALOAD 0
    NEW java/lang/Object
    DUP
    INVOKESPECIAL java/lang/Object.<init> ()V
    PUTFIELD io/github/opencubicchunks/cubicchunks/mixin/core/common/TestMixin.field1 : Ljava/lang/Object;
   L2
    LINENUMBER 10 L2
    ALOAD 0
   L3
    LINENUMBER 11 L3
    LDC "test"
    INVOKESTATIC java/lang/String.valueOf (Ljava/lang/Object;)Ljava/lang/String;
    PUTFIELD io/github/opencubicchunks/cubicchunks/mixin/core/common/TestMixin.field2 : Ljava/lang/Object;
   L4
    LINENUMBER 7 L4
    RETURN
   L5
    LOCALVARIABLE this Lio/github/opencubicchunks/cubicchunks/mixin/core/common/TestMixin; L0 L5 0
    MAXSTACK = 3
    MAXLOCALS = 1

Transformed output bytecode when mixin is compiled with javac:

  // access flags 0x2
  private Ljava/lang/Object; field1

  // access flags 0x2
  private Ljava/lang/Object; field2

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 3 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    ALOAD 0
    LDC "test"
    INVOKESTATIC java/lang/String.valueOf (Ljava/lang/Object;)Ljava/lang/String;
    PUTFIELD io/github/opencubicchunks/cubicchunks/TestTarget.field2 : Ljava/lang/Object;
    RETURN
   L1
    LOCALVARIABLE this Lio/github/opencubicchunks/cubicchunks/TestTarget; L0 L1 0
    MAXSTACK = 2
    MAXLOCALS = 1

Niko-sk2x avatar Jun 21 '20 16:06 Niko-sk2x

I'll look into this.

Mumfrey avatar Jun 21 '20 19:06 Mumfrey