Changeset 209121 in webkit for trunk/Source/JavaScriptCore/dfg/DFGPreciseLocalClobberize.h
- Timestamp:
- Nov 29, 2016, 10:24:44 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/dfg/DFGPreciseLocalClobberize.h
r208524 r209121 107 107 void readTop() 108 108 { 109 switch (m_node->op()) { 110 case GetMyArgumentByVal: 111 case GetMyArgumentByValOutOfBounds: 112 case ForwardVarargs: 113 case CallForwardVarargs: 114 case ConstructForwardVarargs: 115 case TailCallForwardVarargs: 116 case TailCallForwardVarargsInlinedCaller: { 117 118 InlineCallFrame* inlineCallFrame; 119 if (m_node->hasArgumentsChild() && m_node->argumentsChild()) 120 inlineCallFrame = m_node->argumentsChild()->origin.semantic.inlineCallFrame; 121 else 122 inlineCallFrame = m_node->origin.semantic.inlineCallFrame; 123 124 unsigned numberOfArgumentsToSkip = 0; 125 if (m_node->op() == GetMyArgumentByVal || m_node->op() == GetMyArgumentByValOutOfBounds) { 126 // The value of numberOfArgumentsToSkip guarantees that GetMyArgumentByVal* will never 127 // read any arguments below the number of arguments to skip. For example, if numberOfArgumentsToSkip is 2, 128 // we will never read argument 0 or argument 1. 129 numberOfArgumentsToSkip = m_node->numberOfArgumentsToSkip(); 130 } 131 109 auto readFrame = [&] (InlineCallFrame* inlineCallFrame, unsigned numberOfArgumentsToSkip) { 132 110 if (!inlineCallFrame) { 133 111 // Read the outermost arguments and argument count. … … 135 113 m_read(virtualRegisterForArgument(i)); 136 114 m_read(VirtualRegister(CallFrameSlot::argumentCount)); 137 break;115 return; 138 116 } 139 117 … … 142 120 if (inlineCallFrame->isVarargs()) 143 121 m_read(VirtualRegister(inlineCallFrame->stackOffset + CallFrameSlot::argumentCount)); 122 }; 123 124 auto readNewArrayWithSpreadNode = [&] (Node* arrayWithSpread) { 125 ASSERT(arrayWithSpread->op() == NewArrayWithSpread || arrayWithSpread->op() == PhantomNewArrayWithSpread); 126 BitVector* bitVector = arrayWithSpread->bitVector(); 127 for (unsigned i = 0; i < arrayWithSpread->numChildren(); i++) { 128 if (bitVector->get(i)) { 129 Node* child = m_graph.varArgChild(arrayWithSpread, i).node(); 130 if (child->op() == PhantomSpread) { 131 ASSERT(child->child1()->op() == PhantomCreateRest); 132 InlineCallFrame* inlineCallFrame = child->child1()->origin.semantic.inlineCallFrame; 133 unsigned numberOfArgumentsToSkip = child->child1()->numberOfArgumentsToSkip(); 134 readFrame(inlineCallFrame, numberOfArgumentsToSkip); 135 } 136 } 137 } 138 }; 139 140 bool isForwardingNode = false; 141 switch (m_node->op()) { 142 case ForwardVarargs: 143 case CallForwardVarargs: 144 case ConstructForwardVarargs: 145 case TailCallForwardVarargs: 146 case TailCallForwardVarargsInlinedCaller: 147 isForwardingNode = true; 148 FALLTHROUGH; 149 case GetMyArgumentByVal: 150 case GetMyArgumentByValOutOfBounds: { 151 152 if (isForwardingNode && m_node->hasArgumentsChild() && m_node->argumentsChild() && m_node->argumentsChild()->op() == PhantomNewArrayWithSpread) { 153 Node* arrayWithSpread = m_node->argumentsChild().node(); 154 readNewArrayWithSpreadNode(arrayWithSpread); 155 } else { 156 InlineCallFrame* inlineCallFrame; 157 if (m_node->hasArgumentsChild() && m_node->argumentsChild()) 158 inlineCallFrame = m_node->argumentsChild()->origin.semantic.inlineCallFrame; 159 else 160 inlineCallFrame = m_node->origin.semantic.inlineCallFrame; 161 162 unsigned numberOfArgumentsToSkip = 0; 163 if (m_node->op() == GetMyArgumentByVal || m_node->op() == GetMyArgumentByValOutOfBounds) { 164 // The value of numberOfArgumentsToSkip guarantees that GetMyArgumentByVal* will never 165 // read any arguments below the number of arguments to skip. For example, if numberOfArgumentsToSkip is 2, 166 // we will never read argument 0 or argument 1. 167 numberOfArgumentsToSkip = m_node->numberOfArgumentsToSkip(); 168 } 169 170 readFrame(inlineCallFrame, numberOfArgumentsToSkip); 171 } 172 173 break; 174 } 175 176 case NewArrayWithSpread: { 177 readNewArrayWithSpreadNode(m_node); 144 178 break; 145 179 }
Note:
See TracChangeset
for help on using the changeset viewer.