DFGPromoteHeapAccess.h [plain text]
#ifndef DFGPromoteHeapAccess_h
#define DFGPromoteHeapAccess_h
#if ENABLE(DFG_JIT)
#include "DFGNode.h"
#include "DFGPromotedHeapLocation.h"
namespace JSC { namespace DFG {
template<typename WriteFunctor, typename ReadFunctor>
void promoteHeapAccess(Node* node, const WriteFunctor& write, const ReadFunctor& read)
{
switch (node->op()) {
case CheckStructure: {
if (node->child1()->isPhantomObjectAllocation())
read(PromotedHeapLocation(StructurePLoc, node->child1()));
break;
}
case GetByOffset:
case GetGetterSetterByOffset: {
if (node->child2()->isPhantomObjectAllocation()) {
unsigned identifierNumber = node->storageAccessData().identifierNumber;
read(PromotedHeapLocation(NamedPropertyPLoc, node->child2(), identifierNumber));
}
break;
}
case MultiGetByOffset: {
if (node->child1()->isPhantomObjectAllocation()) {
unsigned identifierNumber = node->multiGetByOffsetData().identifierNumber;
read(PromotedHeapLocation(NamedPropertyPLoc, node->child1(), identifierNumber));
}
break;
}
case GetClosureVar:
if (node->child1()->isPhantomActivationAllocation())
read(PromotedHeapLocation(ClosureVarPLoc, node->child1(), node->scopeOffset().offset()));
break;
case SkipScope:
if (node->child1()->isPhantomActivationAllocation())
read(PromotedHeapLocation(ActivationScopePLoc, node->child1()));
break;
case GetScope:
if (node->child1()->isPhantomFunctionAllocation())
read(PromotedHeapLocation(FunctionActivationPLoc, node->child1()));
break;
case GetExecutable:
if (node->child1()->isPhantomFunctionAllocation())
read(PromotedHeapLocation(FunctionExecutablePLoc, node->child1()));
break;
case PutHint: {
ASSERT(node->child1()->isPhantomAllocation());
write(
PromotedHeapLocation(node->child1().node(), node->promotedLocationDescriptor()),
node->child2());
break;
}
default:
break;
}
}
} }
#endif // ENABLE(DFG_JIT)
#endif // DFGPromoteHeapAccess_h