ProfilerOriginStack.cpp [plain text]
#include "config.h"
#include "ProfilerOriginStack.h"
#include "CodeOrigin.h"
#include "JSGlobalObject.h"
#include "JSCInlines.h"
#include "ProfilerDatabase.h"
namespace JSC { namespace Profiler {
OriginStack::OriginStack(WTF::HashTableDeletedValueType)
{
m_stack.append(Origin(WTF::HashTableDeletedValue));
}
OriginStack::OriginStack(const Origin& origin)
{
m_stack.append(origin);
}
OriginStack::OriginStack(Database& database, CodeBlock* codeBlock, const CodeOrigin& codeOrigin)
{
Vector<CodeOrigin> stack = codeOrigin.inlineStack();
append(Origin(database, codeBlock, stack[0].bytecodeIndex));
for (unsigned i = 1; i < stack.size(); ++i) {
append(Origin(
database.ensureBytecodesFor(stack[i].inlineCallFrame->baselineCodeBlock()),
stack[i].bytecodeIndex));
}
}
OriginStack::~OriginStack() { }
void OriginStack::append(const Origin& origin)
{
m_stack.append(origin);
}
bool OriginStack::operator==(const OriginStack& other) const
{
if (m_stack.size() != other.m_stack.size())
return false;
for (unsigned i = m_stack.size(); i--;) {
if (m_stack[i] != other.m_stack[i])
return false;
}
return true;
}
unsigned OriginStack::hash() const
{
unsigned result = m_stack.size();
for (unsigned i = m_stack.size(); i--;) {
result *= 3;
result += m_stack[i].hash();
}
return result;
}
void OriginStack::dump(PrintStream& out) const
{
for (unsigned i = 0; i < m_stack.size(); ++i) {
if (i)
out.print(" --> ");
out.print(m_stack[i]);
}
}
JSValue OriginStack::toJS(ExecState* exec) const
{
JSArray* result = constructEmptyArray(exec, 0);
for (unsigned i = 0; i < m_stack.size(); ++i)
result->putDirectIndex(exec, i, m_stack[i].toJS(exec));
return result;
}
} }