toString() funktioniert bei Wrapper Klassen nicht #310

Closed
opened 2024-04-01 22:48:42 +00:00 by i21023 · 0 comments
Collaborator

Beim Aufrufen der toString() Methode auf Wrapperklassen der Basisdatentypen ist der Bytecode fehlerhaft.

Beispiel

Sourcecode

import java.lang.Integer;
import java.lang.String;

class Foo{
    Integer i = 3;
    toString(){
        return i.toString();
    }
}

Bytecode von toString()

java.lang.String toString();
   descriptor: ()Ljava/lang/String;
   flags: (0x0000)
   Code:
     stack=1, locals=1, args_size=1
        0: aload_0
        1: getfield      #20                 // Field i:Ljava/lang/Integer;
        4: invokevirtual #26                 // Method java/lang/Integer.intValue:()I
        7: invokevirtual #28                 // Method java/lang/Integer.toString:()Ljava/lang/String;
       10: areturn
   Signature: #22                          // ()Ljava/lang/String;
     JavaTXSignature: length = 0x2 (unknown attribute)
      00 22

Im Bytecode wird nach getfield (mMn fälschlicherweise) Integer.intValue() aufgerufen, um den Basisdatentyp zu bekommen. Erst danach wird versucht toString() auf java.lang.Integer aufzurufen. Allerdings liegt jetzt der Basisdatentyp auf dem Stack und der Aufruf schlägt fehl.

Mit anderen Wrapperklassen wie Boolean, Double, Float ist das Problem das Selbe. Mit anderen Objekten funktioniert der Aufruf wie erwartet, da hier der Aufruf für den primitiven Datentyp logischerweise fehlt.

Beim Aufrufen der toString() Methode auf Wrapperklassen der Basisdatentypen ist der Bytecode fehlerhaft. ### Beispiel **Sourcecode** ```java import java.lang.Integer; import java.lang.String; class Foo{ Integer i = 3; toString(){ return i.toString(); } } ``` **Bytecode von toString()** ``` java.lang.String toString(); descriptor: ()Ljava/lang/String; flags: (0x0000) Code: stack=1, locals=1, args_size=1 0: aload_0 1: getfield #20 // Field i:Ljava/lang/Integer; 4: invokevirtual #26 // Method java/lang/Integer.intValue:()I 7: invokevirtual #28 // Method java/lang/Integer.toString:()Ljava/lang/String; 10: areturn Signature: #22 // ()Ljava/lang/String; JavaTXSignature: length = 0x2 (unknown attribute) 00 22 ``` Im Bytecode wird nach `getfield` (mMn fälschlicherweise) `Integer.intValue()` aufgerufen, um den Basisdatentyp zu bekommen. Erst danach wird versucht `toString()` auf `java.lang.Integer` aufzurufen. Allerdings liegt jetzt der Basisdatentyp auf dem Stack und der Aufruf schlägt fehl. Mit anderen Wrapperklassen wie `Boolean`, `Double`, `Float` ist das Problem das Selbe. Mit anderen Objekten funktioniert der Aufruf wie erwartet, da hier der Aufruf für den primitiven Datentyp logischerweise fehlt.
dholle referenced this issue from a commit 2024-04-08 09:52:57 +00:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 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#310
No description provided.