#include "config.h"
#include "PredictedType.h"
#include "JSByteArray.h"
#include "JSFunction.h"
#include "ValueProfile.h"
#include <wtf/BoundsCheckedPointer.h>
namespace JSC {
#ifndef NDEBUG
const char* predictionToString(PredictedType value)
{
if (value == PredictNone)
return "None";
static const int size = 256;
static char description[size];
BoundsCheckedPointer<char> ptr(description, size);
bool isTop = true;
if (value & PredictCellOther)
ptr.strcat("Othercell");
else
isTop = false;
if (value & PredictObjectOther)
ptr.strcat("Otherobj");
else
isTop = false;
if (value & PredictFinalObject)
ptr.strcat("Final");
else
isTop = false;
if (value & PredictArray)
ptr.strcat("Array");
else
isTop = false;
if (value & PredictByteArray)
ptr.strcat("Bytearray");
else
isTop = false;
if (value & PredictInt8Array)
ptr.strcat("Int8array");
else
isTop = false;
if (value & PredictInt16Array)
ptr.strcat("Int16array");
else
isTop = false;
if (value & PredictInt32Array)
ptr.strcat("Int32array");
else
isTop = false;
if (value & PredictUint8Array)
ptr.strcat("Uint8array");
else
isTop = false;
if (value & PredictUint16Array)
ptr.strcat("Uint16array");
else
isTop = false;
if (value & PredictUint32Array)
ptr.strcat("Uint32array");
else
isTop = false;
if (value & PredictFloat32Array)
ptr.strcat("Float32array");
else
isTop = false;
if (value & PredictFloat64Array)
ptr.strcat("Float64array");
else
isTop = false;
if (value & PredictFunction)
ptr.strcat("Function");
else
isTop = false;
if (value & PredictString)
ptr.strcat("String");
else
isTop = false;
if (value & PredictInt32)
ptr.strcat("Int");
else
isTop = false;
if (value & PredictDouble)
ptr.strcat("Double");
else
isTop = false;
if (value & PredictBoolean)
ptr.strcat("Bool");
else
isTop = false;
if (value & PredictOther)
ptr.strcat("Other");
else
isTop = false;
if (isTop)
return "Top";
*ptr++ = 0;
return description;
}
#endif
PredictedType predictionFromClassInfo(const ClassInfo* classInfo)
{
if (classInfo == &JSFinalObject::s_info)
return PredictFinalObject;
if (classInfo == &JSArray::s_info)
return PredictArray;
if (classInfo == &JSString::s_info)
return PredictString;
if (classInfo->isSubClassOf(&JSFunction::s_info))
return PredictFunction;
if (classInfo->isSubClassOf(&JSByteArray::s_info))
return PredictByteArray;
if (classInfo->typedArrayStorageType != TypedArrayNone) {
switch (classInfo->typedArrayStorageType) {
case TypedArrayInt8:
return PredictInt8Array;
case TypedArrayInt16:
return PredictInt16Array;
case TypedArrayInt32:
return PredictInt32Array;
case TypedArrayUint8:
return PredictUint8Array;
case TypedArrayUint16:
return PredictUint16Array;
case TypedArrayUint32:
return PredictUint32Array;
case TypedArrayFloat32:
return PredictFloat32Array;
case TypedArrayFloat64:
return PredictFloat64Array;
default:
break;
}
}
if (classInfo->isSubClassOf(&JSObject::s_info))
return PredictObjectOther;
return PredictCellOther;
}
PredictedType predictionFromStructure(Structure* structure)
{
return predictionFromClassInfo(structure->classInfo());
}
PredictedType predictionFromCell(JSCell* cell)
{
return predictionFromStructure(cell->structure());
}
PredictedType predictionFromValue(JSValue value)
{
if (value.isInt32())
return PredictInt32;
if (value.isDouble())
return PredictDouble;
if (value.isCell())
return predictionFromCell(value.asCell());
if (value.isBoolean())
return PredictBoolean;
ASSERT(value.isUndefinedOrNull());
return PredictOther;
}
}