Primitiver Typ wird bei super() call nicht substituiert #328

Open
opened 2024-04-28 17:10:52 +00:00 by i21023 · 3 comments
Collaborator

Analog zu #294

Beispiel im Anhang.

Bytecode vom Standardkonstruktor von Sub sieht folgendermaßen aus:

Code:
      stack=2, locals=1, args_size=1
         0: aload_0
         1: ldc           #8                  // int 1
         3: invokestatic  #14                 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
         6: invokespecial #17                 // Method Super."<init>":(Ljava/lang/Integer;)V
         9: return
        10: athrow

Hier wird also der Superkonstruktor mit java.lang.Integer aufgerufen, erwartet wird aber int

Analog zu #294 Beispiel im Anhang. Bytecode vom Standardkonstruktor von Sub sieht folgendermaßen aus: ``` Code: stack=2, locals=1, args_size=1 0: aload_0 1: ldc #8 // int 1 3: invokestatic #14 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 6: invokespecial #17 // Method Super."<init>":(Ljava/lang/Integer;)V 9: return 10: athrow ``` Hier wird also der Superkonstruktor mit java.lang.Integer aufgerufen, erwartet wird aber int
1.0 KiB
dholle referenced this issue from a commit 2024-04-28 17:25:26 +00:00
dholle reopened this issue 2024-04-28 18:17:52 +00:00
dholle added the
Codegen
confirmed
in progress
labels 2024-04-28 18:18:05 +00:00
dholle referenced this issue from a commit 2024-04-29 08:25:06 +00:00
Owner

@pl Ich glaube die signature constraints werden nie ausgewertet. Ich generiere die hier:

constraintsSet.addOderConstraint(methodConstraints);

@pl Ich glaube die signature constraints werden nie ausgewertet. Ich generiere die hier: https://gitea.hb.dhbw-stuttgart.de/JavaTX/JavaCompilerCore/src/commit/2c66a1d6e68d3ff0ffb2d1c774cbda0db071d592/src/main/java/de/dhbwstuttgart/typeinference/typeAlgo/TYPEStmt.java#L602
Owner

71dfe5d9e1 lost das Problem

  1. src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java
    in der Methode copute wurden die methodSignatureConstraints der bereits zu Beginn
    aufegloesten einer Oder Constraints in die Methodconstraints der Unifikation geschrieben

  2. Elementtyp der linken Seiten der methodSignatureConstraints wurden von RefTypeOrTPHOrWildcardOrGeneric auf
    TypePlaceholder geaendert, weil dort nur TypePlaceholder geaendert.

  3. src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java
    in der Methode prepareBlock wurde der Typ des Rückgabewerts des supercalls von Void auf eine
    Freshtpevar gesetzt.

  4. src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java
    in der unify2-Methode wurde am Ende der Aufruf der Substitution nach Hinzufuegen der
    Methodconstraints auskommentiert -> hat zu nicht geloesten Constraints gefuehrt.

71dfe5d9e1b8e9a7fc60ff4c372cd0080360b520 lost das Problem 1. src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java in der Methode copute wurden die methodSignatureConstraints der bereits zu Beginn aufegloesten einer Oder Constraints in die Methodconstraints der Unifikation geschrieben 2. Elementtyp der linken Seiten der methodSignatureConstraints wurden von RefTypeOrTPHOrWildcardOrGeneric auf TypePlaceholder geaendert, weil dort nur TypePlaceholder geaendert. 3. src/main/java/de/dhbwstuttgart/parser/SyntaxTreeGenerator/SyntaxTreeGenerator.java in der Methode prepareBlock wurde der Typ des Rückgabewerts des supercalls von Void auf eine Freshtpevar gesetzt. 4. src/main/java/de/dhbwstuttgart/typeinference/unify/TypeUnifyTask.java in der unify2-Methode wurde am Ende der Aufruf der Substitution nach Hinzufuegen der Methodconstraints auskommentiert -> hat zu nicht geloesten Constraints gefuehrt.
pl closed this issue 2024-05-02 14:52:49 +00:00
Author
Collaborator

Das Problem besteht weiterhin

hierzu folgendes Beispiel:

Datei Super.java

public class Super {
    public Super(int a){
    }
}

Datei Sub.jav

import java.lang.Integer;

public class Sub extends Super{
    public Sub(a){
        super(a);
    }
}

Der Bytecode (decompiled) von Sub.jav sieht nachher so aus:

// Source code is decompiled from a .class file using FernFlower decompiler.
public class Sub extends Super {
   public Sub(Integer var1) {
      super(var1);
   }
}

Es für den Parameter a wird also java.lang.Integer statt int inferiert.

Das Problem besteht weiterhin hierzu folgendes Beispiel: Datei Super.java ```java public class Super { public Super(int a){ } } ``` Datei Sub.jav ```java import java.lang.Integer; public class Sub extends Super{ public Sub(a){ super(a); } } ``` Der Bytecode (decompiled) von Sub.jav sieht nachher so aus: ```java // Source code is decompiled from a .class file using FernFlower decompiler. public class Sub extends Super { public Sub(Integer var1) { super(var1); } } ``` Es für den Parameter a wird also java.lang.Integer statt int inferiert.
i21023 reopened this issue 2024-05-13 16:54:09 +00:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
3 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: JavaTX/JavaCompilerCore#328
No description provided.