#include "config.h"
#include "PredictedType.h"
#include "JSArray.h"
#include "JSFunction.h"
#include "ValueProfile.h"
#include <wtf/BoundsCheckedPointer.h>
namespace JSC {
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 & 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 & PredictUint8ClampedArray)
ptr.strcat("Uint8clampedarray");
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 & PredictDoubleReal)
ptr.strcat("Doublereal");
else
isTop = false;
if (value & PredictDoubleNaN)
ptr.strcat("Doublenan");
else
isTop = false;
if (value & PredictBoolean)
ptr.strcat("Bool");
else
isTop = false;
if (value & PredictOther)
ptr.strcat("Other");
else
isTop = false;
if (isTop) {
ptr = description;
ptr.strcat("Top");
}
if (value & PredictEmpty)
ptr.strcat("Empty");
*ptr++ = 0;
return description;
}
const char* predictionToAbbreviatedString(PredictedType prediction)
{
if (isFinalObjectPrediction(prediction))
return "<Final>";
if (isArrayPrediction(prediction))
return "<Array>";
if (isStringPrediction(prediction))
return "<String>";
if (isFunctionPrediction(prediction))
return "<Function>";
if (isInt8ArrayPrediction(prediction))
return "<Int8array>";
if (isInt16ArrayPrediction(prediction))
return "<Int16array>";
if (isInt32ArrayPrediction(prediction))
return "<Int32array>";
if (isUint8ArrayPrediction(prediction))
return "<Uint8array>";
if (isUint16ArrayPrediction(prediction))
return "<Uint16array>";
if (isUint32ArrayPrediction(prediction))
return "<Uint32array>";
if (isFloat32ArrayPrediction(prediction))
return "<Float32array>";
if (isFloat64ArrayPrediction(prediction))
return "<Float64array>";
if (isObjectPrediction(prediction))
return "<Object>";
if (isCellPrediction(prediction))
return "<Cell>";
if (isInt32Prediction(prediction))
return "<Int32>";
if (isDoublePrediction(prediction))
return "<Double>";
if (isNumberPrediction(prediction))
return "<Number>";
if (isBooleanPrediction(prediction))
return "<Boolean>";
if (isOtherPrediction(prediction))
return "<Other>";
return "";
}
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->typedArrayStorageType != TypedArrayNone) {
switch (classInfo->typedArrayStorageType) {
case TypedArrayInt8:
return PredictInt8Array;
case TypedArrayInt16:
return PredictInt16Array;
case TypedArrayInt32:
return PredictInt32Array;
case TypedArrayUint8:
return PredictUint8Array;
case TypedArrayUint8Clamped:
return PredictUint8ClampedArray;
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.isEmpty())
return PredictEmpty;
if (value.isInt32())
return PredictInt32;
if (value.isDouble()) {
double number = value.asNumber();
if (number == number)
return PredictDoubleReal;
return PredictDoubleNaN;
}
if (value.isCell())
return predictionFromCell(value.asCell());
if (value.isBoolean())
return PredictBoolean;
ASSERT(value.isUndefinedOrNull());
return PredictOther;
}
}