Changeset 156464 in webkit for trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
- Timestamp:
- Sep 26, 2013, 9:52:32 AM (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r156374 r156464 36 36 #include "JSGlobalObject.h" 37 37 #include "JSNameScope.h" 38 #include "JSONObject.h" 38 39 #include "LabelScope.h" 39 40 #include "Lexer.h" … … 1714 1715 generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd()); 1715 1716 generator.emitPutById(base, ident, propertyName); 1716 } else { 1717 ASSERT(m_lexpr->isBracketAccessorNode()); 1717 } else if (m_lexpr->isBracketAccessorNode()) { 1718 1718 BracketAccessorNode* assignNode = static_cast<BracketAccessorNode*>(m_lexpr); 1719 1719 propertyName = generator.newTemporary(); … … 1724 1724 generator.emitExpressionInfo(assignNode->divot(), assignNode->divotStart(), assignNode->divotEnd()); 1725 1725 generator.emitPutByVal(base.get(), subscript, propertyName); 1726 } 1726 } else { 1727 ASSERT(m_lexpr->isDeconstructionNode()); 1728 DeconstructingAssignmentNode* assignNode = static_cast<DeconstructingAssignmentNode*>(m_lexpr); 1729 propertyName = generator.newTemporary(); 1730 RefPtr<RegisterID> protect(propertyName); 1731 assignNode->bindings()->emitBytecode(generator, propertyName); 1732 } 1727 1733 1728 1734 generator.emitNode(dst, m_statement); … … 2180 2186 return generator.emitNewFunctionExpression(generator.finalDestination(dst), this); 2181 2187 } 2188 2189 // ------------------------------ DeconstructingAssignmentNode ----------------- 2190 RegisterID* DeconstructingAssignmentNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 2191 { 2192 if (RegisterID* result = m_bindings->emitDirectBinding(generator, dst, m_initializer)) 2193 return result; 2194 RefPtr<RegisterID> initializer = generator.tempDestination(dst); 2195 generator.emitNode(initializer.get(), m_initializer); 2196 m_bindings->emitBytecode(generator, initializer.get()); 2197 return generator.moveToDestinationIfNeeded(dst, initializer.get()); 2198 } 2199 2200 DeconstructionPatternNode::~DeconstructionPatternNode() 2201 { 2202 } 2203 2204 void ArrayPatternNode::emitBytecode(BytecodeGenerator& generator, RegisterID* rhs) const 2205 { 2206 for (size_t i = 0; i < m_targetPatterns.size(); i++) { 2207 auto target = m_targetPatterns[i]; 2208 if (!target) 2209 continue; 2210 RefPtr<RegisterID> temp = generator.newTemporary(); 2211 generator.emitLoad(temp.get(), jsNumber(i)); 2212 generator.emitGetByVal(temp.get(), rhs, temp.get()); 2213 target->emitBytecode(generator, temp.get()); 2214 } 2215 } 2216 2217 RegisterID* ArrayPatternNode::emitDirectBinding(BytecodeGenerator& generator, RegisterID* dst, ExpressionNode* rhs) 2218 { 2219 if (rhs->isResolveNode() 2220 && generator.willResolveToArguments(static_cast<ResolveNode*>(rhs)->identifier()) 2221 && !generator.symbolTable().slowArguments()) { 2222 for (size_t i = 0; i < m_targetPatterns.size(); i++) { 2223 auto target = m_targetPatterns[i]; 2224 if (!target) 2225 continue; 2226 2227 RefPtr<RegisterID> temp = generator.newTemporary(); 2228 generator.emitLoad(temp.get(), jsNumber(i)); 2229 generator.emitGetArgumentByVal(generator.finalDestination(dst), generator.uncheckedRegisterForArguments(), temp.get()); 2230 target->emitBytecode(generator, temp.get()); 2231 } 2232 } 2233 if (!rhs->isSimpleArray()) 2234 return 0; 2235 ElementNode* elementNodes = static_cast<ArrayNode*>(rhs)->elements(); 2236 Vector<ExpressionNode*> elements; 2237 for (; elementNodes; elementNodes = elementNodes->next()) 2238 elements.append(elementNodes->value()); 2239 if (m_targetPatterns.size() != elements.size()) 2240 return 0; 2241 Vector<RefPtr<RegisterID>> registers; 2242 registers.reserveCapacity(m_targetPatterns.size()); 2243 for (size_t i = 0; i < m_targetPatterns.size(); i++) { 2244 registers.uncheckedAppend(generator.newTemporary()); 2245 generator.emitNode(registers.last().get(), elements[i]); 2246 } 2247 2248 for (size_t i = 0; i < m_targetPatterns.size(); i++) { 2249 if (m_targetPatterns[i]) 2250 m_targetPatterns[i]->emitBytecode(generator, registers[i].get()); 2251 } 2252 RefPtr<RegisterID> result = generator.finalDestination(dst); 2253 return generator.emitLoad(result.get(), jsUndefined()); 2254 } 2255 2256 void ArrayPatternNode::toString(StringBuilder& builder) const 2257 { 2258 builder.append('['); 2259 for (size_t i = 0; i < m_targetPatterns.size(); i++) { 2260 if (!m_targetPatterns[i]) { 2261 builder.append(','); 2262 continue; 2263 } 2264 m_targetPatterns[i]->toString(builder); 2265 if (i < m_targetPatterns.size() - 1) 2266 builder.append(','); 2267 } 2268 builder.append(']'); 2269 } 2270 2271 void ArrayPatternNode::collectBoundIdentifiers(Vector<Identifier>& identifiers) const 2272 { 2273 for (size_t i = 0; i < m_targetPatterns.size(); i++) { 2274 if (DeconstructionPatternNode* node = m_targetPatterns[i].get()) 2275 node->collectBoundIdentifiers(identifiers); 2276 } 2277 } 2278 2279 void ObjectPatternNode::toString(StringBuilder& builder) const 2280 { 2281 builder.append('{'); 2282 for (size_t i = 0; i < m_targetPatterns.size(); i++) { 2283 if (m_targetPatterns[i].wasString) { 2284 builder.append('"'); 2285 escapeStringToBuilder(builder, m_targetPatterns[i].propertyName.string()); 2286 builder.append('"'); 2287 } else 2288 builder.append(m_targetPatterns[i].propertyName.string()); 2289 builder.append(":"); 2290 m_targetPatterns[i].pattern->toString(builder); 2291 if (i < m_targetPatterns.size() - 1) 2292 builder.append(','); 2293 } 2294 builder.append('}'); 2295 } 2296 2297 void ObjectPatternNode::emitBytecode(BytecodeGenerator& generator, RegisterID* rhs) const 2298 { 2299 for (size_t i = 0; i < m_targetPatterns.size(); i++) { 2300 auto& target = m_targetPatterns[i]; 2301 RefPtr<RegisterID> temp = generator.newTemporary(); 2302 generator.emitGetById(temp.get(), rhs, target.propertyName); 2303 target.pattern->emitBytecode(generator, temp.get()); 2304 } 2305 } 2306 2307 void ObjectPatternNode::collectBoundIdentifiers(Vector<Identifier>& identifiers) const 2308 { 2309 for (size_t i = 0; i < m_targetPatterns.size(); i++) 2310 m_targetPatterns[i].pattern->collectBoundIdentifiers(identifiers); 2311 } 2312 2313 void BindingNode::emitBytecode(BytecodeGenerator& generator, RegisterID* value) const 2314 { 2315 if (Local local = generator.local(m_boundProperty)) { 2316 if (local.isReadOnly()) { 2317 generator.emitReadOnlyExceptionIfNeeded(); 2318 return; 2319 } 2320 generator.emitMove(local.get(), value); 2321 return; 2322 } 2323 if (generator.isStrictMode()) 2324 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 2325 RegisterID* scope = generator.emitResolveScope(generator.newTemporary(), m_boundProperty); 2326 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 2327 generator.emitPutToScope(scope, m_boundProperty, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound); 2328 return; 2329 } 2330 2331 void BindingNode::toString(StringBuilder& builder) const 2332 { 2333 builder.append(m_boundProperty.string()); 2334 } 2335 2336 void BindingNode::collectBoundIdentifiers(Vector<Identifier>& identifiers) const 2337 { 2338 identifiers.append(m_boundProperty); 2339 } 2182 2340 2183 2341 } // namespace JSC
Note:
See TracChangeset
for help on using the changeset viewer.