| /* |
| * Copyright 2000-2014 JetBrains s.r.o. |
| * |
| * 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.jetbrains.java.decompiler.struct.consts; |
| |
| import java.io.DataOutputStream; |
| import java.io.IOException; |
| |
| /* |
| * Integer, Long, Float, Double, String, Class, UTF8 |
| */ |
| |
| public class PrimitiveConstant extends PooledConstant { |
| |
| // ***************************************************************************** |
| // public fields |
| // ***************************************************************************** |
| |
| public int index; |
| |
| public Object value; |
| |
| public boolean isArray; |
| |
| // ***************************************************************************** |
| // constructors |
| // ***************************************************************************** |
| |
| public PrimitiveConstant(int type, Object value) { |
| this.type = type; |
| this.value = value; |
| |
| initConstant(); |
| } |
| |
| public PrimitiveConstant(int type, int index) { |
| this.type = type; |
| this.index = index; |
| } |
| |
| // ***************************************************************************** |
| // public methods |
| // ***************************************************************************** |
| |
| public int getInt() { |
| return ((Integer)value).intValue(); |
| } |
| |
| public long getLong() { |
| return ((Long)value).longValue(); |
| } |
| |
| public float getFloat() { |
| return ((Float)value).floatValue(); |
| } |
| |
| public double getDouble() { |
| return ((Double)value).doubleValue(); |
| } |
| |
| public String getString() { |
| return (String)value; |
| } |
| |
| public void resolveConstant(ConstantPool pool) { |
| |
| if (type == CONSTANT_Class || type == CONSTANT_String || type == CONSTANT_MethodType) { |
| value = pool.getPrimitiveConstant(index).getString(); |
| initConstant(); |
| } |
| } |
| |
| public void writeToStream(DataOutputStream out) throws IOException { |
| |
| out.writeByte(type); |
| switch (type) { |
| case CONSTANT_Integer: |
| out.writeInt(getInt()); |
| break; |
| case CONSTANT_Float: |
| out.writeFloat(getFloat()); |
| break; |
| case CONSTANT_Long: |
| out.writeLong(getLong()); |
| break; |
| case CONSTANT_Double: |
| out.writeDouble(getDouble()); |
| break; |
| case CONSTANT_Utf8: |
| out.writeUTF(getString()); |
| break; |
| default: // CONSTANT_Class, CONSTANT_String, CONSTANT_MethodType |
| out.writeShort(index); |
| } |
| } |
| |
| public boolean equals(Object o) { |
| if (o == this) return true; |
| if (o == null || !(o instanceof PrimitiveConstant)) return false; |
| |
| PrimitiveConstant cn = (PrimitiveConstant)o; |
| return this.type == cn.type && |
| this.isArray == cn.isArray && |
| this.value.equals(cn.value); |
| } |
| |
| private void initConstant() { |
| if (type == CONSTANT_Class) { |
| String className = getString(); |
| isArray = |
| (className.length() > 0 && className.charAt(0) == '['); // empty string for a class name seems to be possible in some android files |
| } |
| } |
| } |