// Copyright (c) 2011, David J. Pearce (djp@ecs.vuw.ac.nz)
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of the <organization> nor the
// names of its contributors may be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL DAVID J. PEARCE BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package jasm.attributes;
import jasm.io.BinaryOutputStream;
import jasm.lang.*;
import jasm.util.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
import java.util.Set;
public class ConstantValue implements BytecodeAttribute {
private Object constant;
/**
* A ConstantValue attribute. Here, the constant must be either an
* instanceof of Boolean, Byte, Character, Short, Integer, Float, Double or
* String.
*
* @param constant
*/
public ConstantValue(Object constant) {
this.constant = constant;
if (getConstantInfo() == null) {
throw new IllegalArgumentException(
"constant must be instance of Boolean, Byte, Character, Short, Integer, Float, Double or String (got "
+ constant.getClass().getName() + ")");
}
}
public String name() {
return "ConstantValue";
}
public Object constant() {
return constant;
}
public void addPoolItems(Set<Constant.Info> constantPool) {
Constant.addPoolItem(new Constant.Utf8("ConstantValue"), constantPool);
Constant.addPoolItem(getConstantInfo(), constantPool);
}
public void write(BinaryOutputStream writer,
Map<Constant.Info, Integer> constantPool) throws IOException {
writer.write_u16(constantPool.get(new Constant.Utf8("ConstantValue")));
writer.write_u32(2);
writer.write_u16(constantPool.get(getConstantInfo()));
}
public void print(PrintWriter output,
Map<Constant.Info, Integer> constantPool) throws IOException {
String type;
if (constant instanceof Byte || constant instanceof Character
|| constant instanceof Boolean || constant instanceof Short
|| constant instanceof Integer) {
type = "int";
} else if (constant instanceof Long) {
type = "long";
} else if (constant instanceof Float) {
type = "float";
} else {
type = "double";
}
output.println(" Constant value: " + type + " " + constant.toString());
}
private Constant.Info getConstantInfo() {
if(constant instanceof Boolean) {
boolean b = (Boolean) constant;
if(b) {
return new Constant.Integer(1);
} else {
return new Constant.Integer(0);
}
} else if(constant instanceof Byte) {
return new Constant.Integer((Byte)constant);
} else if(constant instanceof Character) {
return new Constant.Integer((Character)constant);
} else if(constant instanceof Short) {
return new Constant.Integer((Short)constant);
} else if(constant instanceof Integer) {
return new Constant.Integer((Integer)constant);
} else if(constant instanceof Long) {
return new Constant.Long((Long)constant);
} else if(constant instanceof Float) {
return new Constant.Float((Float)constant);
} else if(constant instanceof Double) {
return new Constant.Double((Double)constant);
} else if(constant instanceof String) {
return new Constant.String(new Constant.Utf8((String) constant));
} else {
return null;
}
}
}