#ifndef DFGUseKind_h
#define DFGUseKind_h
#if ENABLE(DFG_JIT)
#include "DFGNodeFlags.h"
#include "SpeculatedType.h"
#include <wtf/PrintStream.h>
namespace JSC { namespace DFG {
enum UseKind {
UntypedUse, Int32Use,
KnownInt32Use,
AnyIntUse,
NumberUse,
RealNumberUse,
BooleanUse,
KnownBooleanUse,
CellUse,
KnownCellUse,
CellOrOtherUse,
ObjectUse,
FunctionUse,
FinalObjectUse,
RegExpObjectUse,
ObjectOrOtherUse,
StringIdentUse,
StringUse,
StringOrOtherUse,
KnownStringUse,
KnownPrimitiveUse, SymbolUse,
StringObjectUse,
StringOrStringObjectUse,
NotStringVarUse,
NotCellUse,
OtherUse,
MiscUse,
DoubleRepUse,
DoubleRepRealUse,
DoubleRepAnyIntUse,
Int52RepUse,
LastUseKind };
inline SpeculatedType typeFilterFor(UseKind useKind)
{
switch (useKind) {
case UntypedUse:
return SpecBytecodeTop;
case Int32Use:
case KnownInt32Use:
return SpecInt32Only;
case Int52RepUse:
return SpecAnyInt;
case AnyIntUse:
return SpecInt32Only | SpecAnyIntAsDouble;
case NumberUse:
return SpecBytecodeNumber;
case RealNumberUse:
return SpecBytecodeRealNumber;
case DoubleRepUse:
return SpecFullDouble;
case DoubleRepRealUse:
return SpecDoubleReal;
case DoubleRepAnyIntUse:
return SpecAnyIntAsDouble;
case BooleanUse:
case KnownBooleanUse:
return SpecBoolean;
case CellUse:
case KnownCellUse:
return SpecCell;
case CellOrOtherUse:
return SpecCell | SpecOther;
case ObjectUse:
return SpecObject;
case FunctionUse:
return SpecFunction;
case FinalObjectUse:
return SpecFinalObject;
case RegExpObjectUse:
return SpecRegExpObject;
case ObjectOrOtherUse:
return SpecObject | SpecOther;
case StringIdentUse:
return SpecStringIdent;
case StringUse:
case KnownStringUse:
return SpecString;
case StringOrOtherUse:
return SpecString | SpecOther;
case KnownPrimitiveUse:
return SpecHeapTop & ~SpecObject;
case SymbolUse:
return SpecSymbol;
case StringObjectUse:
return SpecStringObject;
case StringOrStringObjectUse:
return SpecString | SpecStringObject;
case NotStringVarUse:
return ~SpecStringVar;
case NotCellUse:
return ~SpecCell;
case OtherUse:
return SpecOther;
case MiscUse:
return SpecMisc;
default:
RELEASE_ASSERT_NOT_REACHED();
return SpecFullTop;
}
}
inline bool shouldNotHaveTypeCheck(UseKind kind)
{
switch (kind) {
case UntypedUse:
case KnownInt32Use:
case KnownCellUse:
case KnownStringUse:
case KnownPrimitiveUse:
case KnownBooleanUse:
case Int52RepUse:
case DoubleRepUse:
return true;
default:
return false;
}
}
inline bool mayHaveTypeCheck(UseKind kind)
{
return !shouldNotHaveTypeCheck(kind);
}
inline bool isNumerical(UseKind kind)
{
switch (kind) {
case Int32Use:
case KnownInt32Use:
case NumberUse:
case RealNumberUse:
case Int52RepUse:
case DoubleRepUse:
case DoubleRepRealUse:
case AnyIntUse:
case DoubleRepAnyIntUse:
return true;
default:
return false;
}
}
inline bool isDouble(UseKind kind)
{
switch (kind) {
case DoubleRepUse:
case DoubleRepRealUse:
case DoubleRepAnyIntUse:
return true;
default:
return false;
}
}
inline bool isCell(UseKind kind)
{
switch (kind) {
case CellUse:
case KnownCellUse:
case ObjectUse:
case FunctionUse:
case FinalObjectUse:
case RegExpObjectUse:
case StringIdentUse:
case StringUse:
case KnownStringUse:
case SymbolUse:
case StringObjectUse:
case StringOrStringObjectUse:
return true;
default:
return false;
}
}
inline bool usesStructure(UseKind kind)
{
switch (kind) {
case StringObjectUse:
case StringOrStringObjectUse:
return true;
default:
return false;
}
}
inline bool alreadyChecked(UseKind kind, SpeculatedType type)
{
if (usesStructure(kind))
return false;
return !(type & ~typeFilterFor(kind));
}
inline UseKind useKindForResult(NodeFlags result)
{
ASSERT(!(result & ~NodeResultMask));
switch (result) {
case NodeResultInt52:
return Int52RepUse;
case NodeResultDouble:
return DoubleRepUse;
default:
return UntypedUse;
}
}
} }
namespace WTF {
void printInternal(PrintStream&, JSC::DFG::UseKind);
}
#endif // ENABLE(DFG_JIT)
#endif // DFGUseKind_h