Home | History | Annotate | Download | only in analysis
      1 /***
      2  * ASM: a very small and fast Java bytecode manipulation framework
      3  * Copyright (c) 2000-2005 INRIA, France Telecom
      4  * All rights reserved.
      5  *
      6  * Redistribution and use in source and binary forms, with or without
      7  * modification, are permitted provided that the following conditions
      8  * are met:
      9  * 1. Redistributions of source code must retain the above copyright
     10  *    notice, this list of conditions and the following disclaimer.
     11  * 2. Redistributions in binary form must reproduce the above copyright
     12  *    notice, this list of conditions and the following disclaimer in the
     13  *    documentation and/or other materials provided with the distribution.
     14  * 3. Neither the name of the copyright holders nor the names of its
     15  *    contributors may be used to endorse or promote products derived from
     16  *    this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
     28  * THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 package org.objectweb.asm.tree.analysis;
     31 
     32 import org.objectweb.asm.Type;
     33 
     34 /**
     35  * A {@link Value} that is represented by its type in a seven types type sytem.
     36  * This type system distinguishes the UNINITIALZED, INT, FLOAT, LONG, DOUBLE,
     37  * REFERENCE and RETURNADDRESS types.
     38  *
     39  * @author Eric Bruneton
     40  */
     41 public class BasicValue implements Value {
     42 
     43     public final static Value UNINITIALIZED_VALUE = new BasicValue(null);
     44 
     45     public final static Value INT_VALUE = new BasicValue(Type.INT_TYPE);
     46 
     47     public final static Value FLOAT_VALUE = new BasicValue(Type.FLOAT_TYPE);
     48 
     49     public final static Value LONG_VALUE = new BasicValue(Type.LONG_TYPE);
     50 
     51     public final static Value DOUBLE_VALUE = new BasicValue(Type.DOUBLE_TYPE);
     52 
     53     public final static Value REFERENCE_VALUE = new BasicValue(Type.getType("Ljava/lang/Object;"));
     54 
     55     public final static Value RETURNADDRESS_VALUE = new BasicValue(null);
     56 
     57     private Type type;
     58 
     59     public BasicValue(final Type type) {
     60         this.type = type;
     61     }
     62 
     63     public Type getType() {
     64         return type;
     65     }
     66 
     67     public int getSize() {
     68         return type == Type.LONG_TYPE || type == Type.DOUBLE_TYPE ? 2 : 1;
     69     }
     70 
     71     public boolean isReference() {
     72         return type != null
     73                 && (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY);
     74     }
     75 
     76     public boolean equals(final Object value) {
     77         if (value == this) {
     78             return true;
     79         } else if (value instanceof BasicValue) {
     80             if (type == null) {
     81                 return ((BasicValue) value).type == null;
     82             } else {
     83                 return type.equals(((BasicValue) value).type);
     84             }
     85         } else {
     86             return false;
     87         }
     88     }
     89 
     90     public int hashCode() {
     91         return type == null ? 0 : type.hashCode();
     92     }
     93 
     94     public String toString() {
     95         if (this == UNINITIALIZED_VALUE) {
     96             return ".";
     97         } else if (this == RETURNADDRESS_VALUE) {
     98             return "A";
     99         } else if (this == REFERENCE_VALUE) {
    100             return "R";
    101         } else {
    102             return type.getDescriptor();
    103         }
    104     }
    105 }