Fehlerhafte Typen bei Aufrufen von Interace-Methode mit this-Parameter #307
Labels
No Label
Codegen
confirmed
duplicate
Eclipse-Plugin
Feature Request
generics
in progress
invalid
JavaCompilerCore
needs info
Parser
Trash
Type
Unify
won't fix
works for me
No Milestone
No project
No Assignees
3 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: JavaTX/JavaCompilerCore#307
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Beim Visitor-Pattern vom Compiler ist mir aufgefallen, dass die
visit(this){}
Methode teilweise mit einem falschen Typen für den Parameterthis
aufgerufen wird.Beispiel:
Code
Bytecode der Methode
Foo.accept(IVisitor)
Wie man sehen kann wird
visit
in der KlasseFoo
mit dem TypenFooBar
stattFoo
aufgerufen, was natürlich nicht funktioniert.Der Bug ist leider auch nicht deterministisch. Bei jedem neuen Kompilieren können sich die Typen des Aufrufs ändern.
Manchmal stimmen der Typ vom
visit
-Aufruf inFoo
nicht, manchmal inFooBar
nicht, manchmal sind sogar beide vertauscht, alsoFoo.visit
ruft mit dem TypFooBar
auf undFooBar.visit
ruft mit dem TypFoo
auf und manchmal ist auch alles korrekt. Ich hoffe also, dass andere den Bug überhaupt reproduzieren können."Ich kann den Bug leider nicht reproduzieren... Kannst du dir mal den Test anschauen (Bug307.jav)? So funktioniert es bei mir anscheinend jedes mal. Wie genau rufst du das ganze denn auf?
Das Problem tritt anscheinend nur auf wenn der JavaTX compiler mit der Konsole aufgerufen wird. Sehr seltsam.
Bei mir tritt das Problem immer noch auf. Im Anhang auch mal die resultierenden class files mit den falschen Aufrufen wie oben beschrieben.
Dieses mal habe ich den Compiler auch nicht über das Terminal mit der jar aufgerufen, sondern über die Intellij GUI, falls du das meintest.
Mit
this
scheint es aber nichts zu tun zu haben, wenn ich stattdessen ein neu erstelltes Objekt übergebe, tritt das gleiche Problem mit dem falschen Typen im Aufruf auf.@pl So wie es aussieht ist hier die Signatur der Methode
visit
falsch. Es passiert leider nur äußerst selten, also wenn du den TesttestBug307
so um die 10x aufrufst sollte ein Fehler kommen.Ich hab den Testfall mal vereinfacht und die Interfaces entfernt. Vielleicht ist das Problem so besser eingrenzbar.
Wenn man sich das Ergebnis anschaut kommt eine unterschiedliche Lösung raus:
Diese hier wäre richtig:
manchmal passiert jedoch
Mit dem commit
e37040f367
wurde Bug gefixt.Bei den parallelen Ausführungen der Oder-Contraints wurden die methodsignatures nicht angepasst.