Changeset 192436 in webkit for trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
- Timestamp:
- Nov 13, 2015, 11:13:39 AM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r192155 r192436 3398 3398 identifiers.append(m_boundProperty); 3399 3399 } 3400 3400 3401 void AssignmentElementNode::collectBoundIdentifiers(Vector<Identifier>&) const 3402 { 3403 } 3404 3405 void AssignmentElementNode::bindValue(BytecodeGenerator& generator, RegisterID* value) const 3406 { 3407 if (m_assignmentTarget->isResolveNode()) { 3408 ResolveNode* lhs = static_cast<ResolveNode*>(m_assignmentTarget); 3409 Variable var = generator.variable(lhs->identifier()); 3410 bool isReadOnly = var.isReadOnly(); 3411 if (RegisterID* local = var.local()) { 3412 generator.emitTDZCheckIfNecessary(var, local, nullptr); 3413 3414 if (isReadOnly) 3415 generator.emitReadOnlyExceptionIfNeeded(var); 3416 else { 3417 generator.invalidateForInContextForLocal(local); 3418 generator.moveToDestinationIfNeeded(local, value); 3419 generator.emitProfileType(local, divotStart(), divotEnd()); 3420 } 3421 return; 3422 } 3423 if (generator.isStrictMode()) 3424 generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd()); 3425 RefPtr<RegisterID> scope = generator.emitResolveScope(nullptr, var); 3426 generator.emitTDZCheckIfNecessary(var, nullptr, scope.get()); 3427 if (isReadOnly) { 3428 bool threwException = generator.emitReadOnlyExceptionIfNeeded(var); 3429 if (threwException) 3430 return; 3431 } 3432 generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd()); 3433 if (!isReadOnly) { 3434 generator.emitPutToScope(scope.get(), var, value, generator.isStrictMode() ? ThrowIfNotFound : DoNotThrowIfNotFound, NotInitialization); 3435 generator.emitProfileType(value, var, divotStart(), divotEnd()); 3436 } 3437 } else if (m_assignmentTarget->isDotAccessorNode()) { 3438 DotAccessorNode* lhs = static_cast<DotAccessorNode*>(m_assignmentTarget); 3439 RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(lhs->base(), true, false); 3440 generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd()); 3441 generator.emitPutById(base.get(), lhs->identifier(), value); 3442 generator.emitProfileType(value, divotStart(), divotEnd()); 3443 } else if (m_assignmentTarget->isBracketAccessorNode()) { 3444 BracketAccessorNode* lhs = static_cast<BracketAccessorNode*>(m_assignmentTarget); 3445 RefPtr<RegisterID> base = generator.emitNodeForLeftHandSide(lhs->base(), true, false); 3446 RefPtr<RegisterID> property = generator.emitNodeForLeftHandSide(lhs->subscript(), true, false); 3447 generator.emitExpressionInfo(divotEnd(), divotStart(), divotEnd()); 3448 generator.emitPutByVal(base.get(), property.get(), value); 3449 generator.emitProfileType(value, divotStart(), divotEnd()); 3450 } 3451 } 3452 3453 void AssignmentElementNode::toString(StringBuilder& builder) const 3454 { 3455 if (m_assignmentTarget->isResolveNode()) 3456 builder.append(static_cast<ResolveNode*>(m_assignmentTarget)->identifier().string()); 3457 } 3458 3401 3459 RegisterID* SpreadExpressionNode::emitBytecode(BytecodeGenerator&, RegisterID*) 3402 3460 {
Note:
See TracChangeset
for help on using the changeset viewer.