Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source.
   *
   * Copyright 2012 Red Hat, Inc.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
  *     http://www.apache.org/licenses/LICENSE-2.0
  *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package org.jboss.classfilewriter.util;
 
This class is responsible for generating bytecode fragments to box/unbox whatever happens to be on the top of the stack. It is the calling codes responsibility to make sure that the correct type is on the stack

Author(s):
Stuart Douglas
 
 public class Boxing {
 
     static public void boxIfNessesary(CodeAttribute caString desc) {
         if (desc.length() == 1) {
             char type = desc.charAt(0);
             switch (type) {
                 case 'I':
                     boxInt(ca);
                     break;
                 case 'J':
                     boxLong(ca);
                     break;
                 case 'S':
                     boxShort(ca);
                     break;
                 case 'F':
                     boxFloat(ca);
                     break;
                 case 'D':
                     boxDouble(ca);
                     break;
                 case 'B':
                     boxByte(ca);
                     break;
                 case 'C':
                     boxChar(ca);
                     break;
                 case 'Z':
                     boxBoolean(ca);
                     break;
                 default:
                     throw new RuntimeException("Cannot box unkown primitive type: " + type);
             }
         }
     }
 
     static public CodeAttribute unbox(CodeAttribute caString desc) {
         char type = desc.charAt(0);
         switch (type) {
             case 'I':
                 return unboxInt(ca);
             case 'J':
                 return unboxLong(ca);
             case 'S':
                 return unboxShort(ca);
             case 'F':
                 return unboxFloat(ca);
             case 'D':
                 return unboxDouble(ca);
             case 'B':
                 return unboxByte(ca);
             case 'C':
                 return unboxChar(ca);
             case 'Z':
                 return unboxBoolean(ca);
         }
         throw new RuntimeException("Cannot unbox unkown primitive type: " + type);
     }
 
     static public void boxInt(CodeAttribute bc) {
         bc.invokestatic("java.lang.Integer""valueOf""(I)Ljava/lang/Integer;");
     }
 
     static public void boxLong(CodeAttribute bc) {
         bc.invokestatic("java.lang.Long""valueOf""(J)Ljava/lang/Long;");
     }
 
     static public void boxShort(CodeAttribute bc) {
         bc.invokestatic("java.lang.Short""valueOf""(S)Ljava/lang/Short;");
     }
    static public void boxByte(CodeAttribute bc) {
        bc.invokestatic("java.lang.Byte""valueOf""(B)Ljava/lang/Byte;");
    }
    static public void boxFloat(CodeAttribute bc) {
        bc.invokestatic("java.lang.Float""valueOf""(F)Ljava/lang/Float;");
    }
    static public void boxDouble(CodeAttribute bc) {
        bc.invokestatic("java.lang.Double""valueOf""(D)Ljava/lang/Double;");
    }
    static public void boxChar(CodeAttribute bc) {
        bc.invokestatic("java.lang.Character""valueOf""(C)Ljava/lang/Character;");
    }
    static public void boxBoolean(CodeAttribute bc) {
        bc.invokestatic("java.lang.Boolean""valueOf""(Z)Ljava/lang/Boolean;");
    }
    // unboxing
    static public CodeAttribute unboxInt(CodeAttribute bc) {
        bc.checkcast("java.lang.Number");
        bc.invokevirtual("java.lang.Number""intValue""()I");
        return bc;
    }
    static public CodeAttribute unboxLong(CodeAttribute bc) {
        bc.checkcast("java.lang.Number");
        bc.invokevirtual("java.lang.Number""longValue""()J");
        return bc;
    }
    static public CodeAttribute unboxShort(CodeAttribute bc) {
        bc.checkcast("java.lang.Number");
        bc.invokevirtual("java.lang.Number""shortValue""()S");
        return bc;
    }
    static public CodeAttribute unboxByte(CodeAttribute bc) {
        bc.checkcast("java.lang.Number");
        bc.invokevirtual("java.lang.Number""byteValue""()B");
        return bc;
    }
    static public CodeAttribute unboxFloat(CodeAttribute bc) {
        bc.checkcast("java.lang.Number");
        bc.invokevirtual("java.lang.Number""floatValue""()F");
        return bc;
    }
    static public CodeAttribute unboxDouble(CodeAttribute bc) {
        bc.checkcast("java.lang.Number");
        bc.invokevirtual("java.lang.Number""doubleValue""()D");
        return bc;
    }
    static public CodeAttribute unboxChar(CodeAttribute bc) {
        bc.checkcast("java.lang.Character");
        bc.invokevirtual("java.lang.Character""charValue""()C");
        return bc;
    }
    static public CodeAttribute unboxBoolean(CodeAttribute bc) {
        bc.checkcast("java.lang.Boolean");
        bc.invokevirtual("java.lang.Boolean""booleanValue""()Z");
        return bc;
    }
New to GrepCode? Check out our FAQ X