| OLD | NEW |
| 1 // Copyright 2009 the V8 project authors. All rights reserved. | 1 // Copyright 2009 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 } | 498 } |
| 499 | 499 |
| 500 | 500 |
| 501 void FastCodeGenerator::VisitAssignment(Assignment* expr) { | 501 void FastCodeGenerator::VisitAssignment(Assignment* expr) { |
| 502 Comment cmnt(masm_, "[ Assignment"); | 502 Comment cmnt(masm_, "[ Assignment"); |
| 503 ASSERT(expr->op() == Token::ASSIGN || expr->op() == Token::INIT_VAR); | 503 ASSERT(expr->op() == Token::ASSIGN || expr->op() == Token::INIT_VAR); |
| 504 | 504 |
| 505 // Record source code position of the (possible) IC call. | 505 // Record source code position of the (possible) IC call. |
| 506 SetSourcePosition(expr->position()); | 506 SetSourcePosition(expr->position()); |
| 507 | 507 |
| 508 // Left-hand side can only be a property, a global or a (parameter or local) |
| 509 // slot. Variables with rewrite to .arguments are treated as KEYED_PROPERTY. |
| 510 enum LhsKind { VARIABLE, NAMED_PROPERTY, KEYED_PROPERTY }; |
| 511 LhsKind assign_type = VARIABLE; |
| 512 Property* prop = expr->target()->AsProperty(); |
| 513 // In case of a property we use the uninitialized expression context |
| 514 // of the key to detect a named property. |
| 515 if (prop != NULL) { |
| 516 assign_type = (prop->key()->context() == Expression::kUninitialized) |
| 517 ? NAMED_PROPERTY |
| 518 : KEYED_PROPERTY; |
| 519 } |
| 520 |
| 508 Expression* rhs = expr->value(); | 521 Expression* rhs = expr->value(); |
| 509 // Left-hand side can only be a property, a global or a (parameter or | 522 ASSERT_EQ(Expression::kValue, rhs->context()); |
| 510 // local) slot. | 523 |
| 511 Variable* var = expr->target()->AsVariableProxy()->AsVariable(); | 524 switch (assign_type) { |
| 512 Property* prop = expr->target()->AsProperty(); | 525 case VARIABLE: |
| 513 if (var != NULL) { | |
| 514 Visit(rhs); | |
| 515 ASSERT_EQ(Expression::kValue, rhs->context()); | |
| 516 EmitVariableAssignment(expr); | |
| 517 } else if (prop != NULL) { | |
| 518 // Assignment to a property. | |
| 519 Visit(prop->obj()); | |
| 520 ASSERT_EQ(Expression::kValue, prop->obj()->context()); | |
| 521 // Use the expression context of the key subexpression to detect whether | |
| 522 // we have decided to us a named or keyed IC. | |
| 523 if (prop->key()->context() == Expression::kUninitialized) { | |
| 524 ASSERT(prop->key()->AsLiteral() != NULL); | |
| 525 Visit(rhs); | 526 Visit(rhs); |
| 526 ASSERT_EQ(Expression::kValue, rhs->context()); | 527 EmitVariableAssignment(expr); |
| 528 break; |
| 529 case NAMED_PROPERTY: |
| 530 Visit(prop->obj()); |
| 531 ASSERT_EQ(Expression::kValue, prop->obj()->context()); |
| 532 Visit(rhs); |
| 527 EmitNamedPropertyAssignment(expr); | 533 EmitNamedPropertyAssignment(expr); |
| 528 } else { | 534 break; |
| 535 case KEYED_PROPERTY: |
| 536 Visit(prop->obj()); |
| 537 ASSERT_EQ(Expression::kValue, prop->obj()->context()); |
| 529 Visit(prop->key()); | 538 Visit(prop->key()); |
| 530 ASSERT_EQ(Expression::kValue, prop->key()->context()); | 539 ASSERT_EQ(Expression::kValue, prop->key()->context()); |
| 531 Visit(rhs); | 540 Visit(rhs); |
| 532 ASSERT_EQ(Expression::kValue, rhs->context()); | |
| 533 EmitKeyedPropertyAssignment(expr); | 541 EmitKeyedPropertyAssignment(expr); |
| 534 } | 542 break; |
| 535 } else { | |
| 536 UNREACHABLE(); | |
| 537 } | 543 } |
| 538 } | 544 } |
| 539 | 545 |
| 540 | 546 |
| 541 void FastCodeGenerator::VisitCatchExtensionObject(CatchExtensionObject* expr) { | 547 void FastCodeGenerator::VisitCatchExtensionObject(CatchExtensionObject* expr) { |
| 542 UNREACHABLE(); | 548 UNREACHABLE(); |
| 543 } | 549 } |
| 544 | 550 |
| 545 | 551 |
| 546 void FastCodeGenerator::VisitThrow(Throw* expr) { | 552 void FastCodeGenerator::VisitThrow(Throw* expr) { |
| 547 UNREACHABLE(); | 553 UNREACHABLE(); |
| 548 } | 554 } |
| 549 | 555 |
| 550 | 556 |
| 551 void FastCodeGenerator::VisitThisFunction(ThisFunction* expr) { | 557 void FastCodeGenerator::VisitThisFunction(ThisFunction* expr) { |
| 552 UNREACHABLE(); | 558 UNREACHABLE(); |
| 553 } | 559 } |
| 554 | 560 |
| 555 | 561 |
| 556 #undef __ | 562 #undef __ |
| 557 | 563 |
| 558 | 564 |
| 559 } } // namespace v8::internal | 565 } } // namespace v8::internal |
| OLD | NEW |