WALA/com.ibm.wala.shrike/src/com/ibm/wala/sourcepos/CRTFlags.java

102 lines
2.8 KiB
Java

/******************************************************************************
* Copyright (c) 2002 - 2014 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*****************************************************************************/
/*
* CRTFlags.java
*
* Created on 7. Juni 2005, 11:28
*/
package com.ibm.wala.sourcepos;
import java.util.LinkedList;
/**
* This class represents the flags which a entry in the CharacterRangeTable can
* have. The flags are bitwise ORed.
*
* @see CRTData
* @see CRTable
* @author Siegfried Weber
* @author Juergen Graf <juergen.graf@gmail.com>
*/
public final class CRTFlags {
/** Stores the value of the {@code CRT_SOURCE_INFO} flag. */
static final short CRT_SOURCE_INFO = 0x0200;
/** Stores the names of the flags. */
private static final String[] flagNames = { "CRT_STATEMENT", // 0x0001
"CRT_BLOCK", // 0x0002
"CRT_ASSIGNMENT", // 0x0004
"CRT_FLOW_CONTROLLER", // 0x0008
"CRT_FLOW_TARGET", // 0x0010
"CRT_INVOKE", // 0x0020
"CRT_CREATE", // 0x0040
"CRT_BRANCH_TRUE", // 0x0080
"CRT_BRANCH_FALSE", // 0x0100
"CRT_SOURCE_INFO" }; // 0x0200
private static final String WARN_INVALID_FLAG = "Error at CRT entry %1$s: invalid flag %2$s";
/** Stores the flags. */
private final short flags;
/**
* Creates a new instance of CRTFlags.
*
* @param flags
* the flags
* @throws InvalidCRTDataException
* An InvalidCRTDataException is thrown if the flags are not valid.
*/
CRTFlags(short flags) throws InvalidCRTDataException {
this.flags = flags;
if (!isFlagValid())
throw new InvalidCRTDataException(WARN_INVALID_FLAG, Integer.toHexString(flags));
}
/**
* Returns the flag names of this instance.
*
* @return An array of Strings containing the flag names.
*/
public final String[] getFlagNames() {
LinkedList<String> names = new LinkedList<>();
int index = 0;
short tFlags = flags;
while (tFlags > 0) {
if (tFlags % 2 == 1) {
if (index < flagNames.length)
names.add(flagNames[index]);
else {
// assert false
// because exception was thrown in the constructor.
names.add("UNKNOWN (" + Integer.toHexString(2 << index) + ")");
}
}
tFlags >>= 1;
++index;
}
return names.toArray(new String[names.size()]);
}
/**
* Tests whether the flags are valid.
*
* @return whether the flags are valid.
*/
private boolean isFlagValid() {
return 0 < flags && flags < 2 << flagNames.length - 1;
}
}