#include "config.h"
#include "DFGNode.h"
#if ENABLE(DFG_JIT)
#include "DFGGraph.h"
#include "DFGNodeAllocator.h"
#include "DFGPromotedHeapLocation.h"
#include "JSCInlines.h"
namespace JSC { namespace DFG {
bool MultiPutByOffsetData::writesStructures() const
{
for (unsigned i = variants.size(); i--;) {
if (variants[i].writesStructures())
return true;
}
return false;
}
bool MultiPutByOffsetData::reallocatesStorage() const
{
for (unsigned i = variants.size(); i--;) {
if (variants[i].reallocatesStorage())
return true;
}
return false;
}
void BranchTarget::dump(PrintStream& out) const
{
if (!block)
return;
out.print(*block);
if (count == count) out.print("/w:", count);
}
unsigned Node::index() const
{
return NodeAllocator::allocatorOf(this)->indexOf(this);
}
bool Node::hasVariableAccessData(Graph& graph)
{
switch (op()) {
case Phi:
return graph.m_form != SSA;
case GetLocal:
case SetLocal:
case SetArgument:
case Flush:
case PhantomLocal:
return true;
default:
return false;
}
}
void Node::remove()
{
ASSERT(!(flags() & NodeHasVarArgs));
children = children.justChecks();
setOpAndDefaultFlags(Check);
}
void Node::convertToIdentity()
{
RELEASE_ASSERT(child1());
RELEASE_ASSERT(!child2());
NodeFlags result = canonicalResultRepresentation(this->result());
setOpAndDefaultFlags(Identity);
setResult(result);
}
void Node::convertToIdentityOn(Node* child)
{
children.reset();
child1() = child->defaultEdge();
NodeFlags output = canonicalResultRepresentation(this->result());
NodeFlags input = canonicalResultRepresentation(child->result());
if (output == input) {
setOpAndDefaultFlags(Identity);
setResult(output);
return;
}
switch (output) {
case NodeResultDouble:
setOpAndDefaultFlags(DoubleRep);
switch (input) {
case NodeResultInt52:
child1().setUseKind(Int52RepUse);
return;
case NodeResultJS:
child1().setUseKind(NumberUse);
return;
default:
RELEASE_ASSERT_NOT_REACHED();
return;
}
case NodeResultInt52:
setOpAndDefaultFlags(Int52Rep);
switch (input) {
case NodeResultDouble:
child1().setUseKind(DoubleRepMachineIntUse);
return;
case NodeResultJS:
child1().setUseKind(MachineIntUse);
return;
default:
RELEASE_ASSERT_NOT_REACHED();
return;
}
case NodeResultJS:
setOpAndDefaultFlags(ValueRep);
switch (input) {
case NodeResultDouble:
child1().setUseKind(DoubleRepUse);
return;
case NodeResultInt52:
child1().setUseKind(Int52RepUse);
return;
default:
RELEASE_ASSERT_NOT_REACHED();
return;
}
default:
RELEASE_ASSERT_NOT_REACHED();
return;
}
}
void Node::convertToPutHint(const PromotedLocationDescriptor& descriptor, Node* base, Node* value)
{
m_op = PutHint;
m_opInfo = descriptor.imm1().m_value;
m_opInfo2 = descriptor.imm2().m_value;
child1() = base->defaultEdge();
child2() = value->defaultEdge();
child3() = Edge();
}
void Node::convertToPutStructureHint(Node* structure)
{
ASSERT(m_op == PutStructure);
ASSERT(structure->castConstant<Structure*>() == transition()->next);
convertToPutHint(StructurePLoc, child1().node(), structure);
}
void Node::convertToPutByOffsetHint()
{
ASSERT(m_op == PutByOffset);
convertToPutHint(
PromotedLocationDescriptor(NamedPropertyPLoc, storageAccessData().identifierNumber),
child2().node(), child3().node());
}
void Node::convertToPutClosureVarHint()
{
ASSERT(m_op == PutClosureVar);
convertToPutHint(
PromotedLocationDescriptor(ClosureVarPLoc, scopeOffset().offset()),
child1().node(), child2().node());
}
PromotedLocationDescriptor Node::promotedLocationDescriptor()
{
return PromotedLocationDescriptor(static_cast<PromotedLocationKind>(m_opInfo), m_opInfo2);
}
} }
namespace WTF {
using namespace JSC;
using namespace JSC::DFG;
void printInternal(PrintStream& out, SwitchKind kind)
{
switch (kind) {
case SwitchImm:
out.print("SwitchImm");
return;
case SwitchChar:
out.print("SwitchChar");
return;
case SwitchString:
out.print("SwitchString");
return;
case SwitchCell:
out.print("SwitchCell");
return;
}
RELEASE_ASSERT_NOT_REACHED();
}
void printInternal(PrintStream& out, Node* node)
{
if (!node) {
out.print("-");
return;
}
out.print("@", node->index());
if (node->hasDoubleResult())
out.print("<Double>");
else if (node->hasInt52Result())
out.print("<Int52>");
}
}
#endif // ENABLE(DFG_JIT)