blob: 58a99c59acb5ecbd52527c0ee7f197b648039fc6 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.flex.abc.semantics;
import org.apache.flex.abc.ABCConstants;
/**
* A representation of a value in a <a href="http://learn.adobe.com/wiki/display/AVM2/4.3+Constant+pool">constant pool</a>
* that is not a name, namespace, or namespace set.
*/
public class PooledValue
{
/**
* Construct a PooledValue, kind determined by the value object's type.
*
* @param value - the PooledValue's value. Must be one of a restricted set
* of Java types.
*/
public PooledValue(Object value)
{
// Deduce the kind from the value.
if (value instanceof Integer)
this.kind = ABCConstants.CONSTANT_Int;
else if (value instanceof Long)
this.kind = ABCConstants.CONSTANT_UInt;
else if (value instanceof Double)
this.kind = ABCConstants.CONSTANT_Double;
else if (value instanceof String)
this.kind = ABCConstants.CONSTANT_Utf8;
else if (Boolean.TRUE.equals(value))
this.kind = ABCConstants.CONSTANT_True;
else if (Boolean.FALSE.equals(value))
this.kind = ABCConstants.CONSTANT_False;
else if (ABCConstants.UNDEFINED_VALUE == value)
this.kind = ABCConstants.CONSTANT_Undefined;
else if (value == ABCConstants.NULL_VALUE)
this.kind = ABCConstants.CONSTANT_Null;
else if (value instanceof Namespace)
this.kind = ((Namespace)value).getKind();
else
throw new IllegalArgumentException("Unknown value class " + value == null ? "null" : value.getClass().toString());
this.value = value;
}
/**
* Construct a PooledValue, kind taken directly from the caller.
*/
public PooledValue(int kind, Object value)
{
this.kind = kind;
this.value = value;
}
/**
* The value's ABC kind designator.
*/
private int kind;
/**
* The value's pool index. Set when the containing MethodInfo or other
* container type structure undergoes its endVisit() event.
*/
private int poolIndex = -1;
/**
* The value, if there is one. Many value kinds don't have a value or don't
* consider it relevant.
*/
private final Object value;
/**
* Set the value's pool index. This is done when the object that owns this
* PooledValue, e.g., a MethodInfo, gets to its visitEnd() event and
* registers all its constant information with the ABCEmitter's constant
* pools.
*/
public void setPoolIndex(int index)
{
assert (this.poolIndex == -1);
this.poolIndex = index;
}
/**
* @return the value's pool index.
*/
public int getPoolIndex()
{
assert (this.poolIndex != -1);
return this.poolIndex;
}
/**
* @return the value's kind.
* @see "the kind values in ABCConstants."
*/
public int getKind()
{
return this.kind;
}
/**
* @return this value's value object.
*/
public Object getValue()
{
return this.value;
}
/**
* @return this value's value object, cast to Integer.
*/
public Integer getIntegerValue()
{
return (Integer)this.value;
}
/**
* @return this value's value object, cast to Long (uint).
*/
public Long getLongValue()
{
return (Long)this.value;
}
/**
* @return this value's value object, cast to Double (Number).
*/
public Double getDoubleValue()
{
return (Double)this.value;
}
/**
* @return this value's value object, cast to String.
*/
public String getStringValue()
{
return (String)this.value;
}
/**
* @return this value's value object, cast to Namespace
*/
public Namespace getNamespaceValue()
{
return (Namespace)this.value;
}
}