Chromium Code Reviews| 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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 68 break; | 68 break; |
| 69 default: | 69 default: |
| 70 UNREACHABLE(); | 70 UNREACHABLE(); |
| 71 } | 71 } |
| 72 return offset; | 72 return offset; |
| 73 } | 73 } |
| 74 | 74 |
| 75 | 75 |
| 76 void FastCodeGenerator::VisitDeclarations( | 76 void FastCodeGenerator::VisitDeclarations( |
| 77 ZoneList<Declaration*>* declarations) { | 77 ZoneList<Declaration*>* declarations) { |
| 78 Comment cmnt(masm_, "[ Declarations"); | |
| 78 int length = declarations->length(); | 79 int length = declarations->length(); |
| 79 int globals = 0; | 80 int globals = 0; |
| 80 for (int i = 0; i < length; i++) { | 81 for (int i = 0; i < length; i++) { |
| 81 Declaration* node = declarations->at(i); | 82 Declaration* node = declarations->at(i); |
| 82 Variable* var = node->proxy()->var(); | 83 Variable* var = node->proxy()->var(); |
| 83 Slot* slot = var->slot(); | 84 Slot* slot = var->slot(); |
| 84 | 85 |
| 85 // If it was not possible to allocate the variable at compile | 86 // If it was not possible to allocate the variable at compile |
| 86 // time, we need to "declare" it at runtime to make sure it | 87 // time, we need to "declare" it at runtime to make sure it |
| 87 // actually exists in the local context. | 88 // actually exists in the local context. |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 282 } | 283 } |
| 283 | 284 |
| 284 | 285 |
| 285 void FastCodeGenerator::VisitEmptyStatement(EmptyStatement* stmt) { | 286 void FastCodeGenerator::VisitEmptyStatement(EmptyStatement* stmt) { |
| 286 Comment cmnt(masm_, "[ EmptyStatement"); | 287 Comment cmnt(masm_, "[ EmptyStatement"); |
| 287 SetStatementPosition(stmt); | 288 SetStatementPosition(stmt); |
| 288 } | 289 } |
| 289 | 290 |
| 290 | 291 |
| 291 void FastCodeGenerator::VisitIfStatement(IfStatement* stmt) { | 292 void FastCodeGenerator::VisitIfStatement(IfStatement* stmt) { |
| 293 Comment cmnt(masm_, "[ IfStatement"); | |
| 292 // Expressions cannot recursively enter statements, there are no labels in | 294 // Expressions cannot recursively enter statements, there are no labels in |
| 293 // the state. | 295 // the state. |
| 294 ASSERT_EQ(NULL, true_label_); | 296 ASSERT_EQ(NULL, true_label_); |
| 295 ASSERT_EQ(NULL, false_label_); | 297 ASSERT_EQ(NULL, false_label_); |
| 296 Label then_part, else_part, done; | 298 Label then_part, else_part, done; |
| 297 | 299 |
| 298 // Do not worry about optimizing for empty then or else bodies. | 300 // Do not worry about optimizing for empty then or else bodies. |
| 299 true_label_ = &then_part; | 301 true_label_ = &then_part; |
| 300 false_label_ = &else_part; | 302 false_label_ = &else_part; |
| 301 ASSERT(stmt->condition()->context() == Expression::kTest); | 303 ASSERT(stmt->condition()->context() == Expression::kTest); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 343 UNREACHABLE(); | 345 UNREACHABLE(); |
| 344 } | 346 } |
| 345 | 347 |
| 346 | 348 |
| 347 void FastCodeGenerator::VisitWhileStatement(WhileStatement* stmt) { | 349 void FastCodeGenerator::VisitWhileStatement(WhileStatement* stmt) { |
| 348 UNREACHABLE(); | 350 UNREACHABLE(); |
| 349 } | 351 } |
| 350 | 352 |
| 351 | 353 |
| 352 void FastCodeGenerator::VisitForStatement(ForStatement* stmt) { | 354 void FastCodeGenerator::VisitForStatement(ForStatement* stmt) { |
| 355 Comment cmnt(masm_, "[ ForStatement"); | |
| 353 Label test, body, exit; | 356 Label test, body, exit; |
| 354 if (stmt->init() != NULL) Visit(stmt->init()); | 357 if (stmt->init() != NULL) Visit(stmt->init()); |
| 355 | 358 |
| 359 increment_loop_depth(); | |
|
Søren Thygesen Gjesse
2009/11/03 13:57:47
How placing the increment_loop_depth()/decrement_l
Kevin Millikin (Chromium)
2009/11/03 14:16:09
I thought about that, but it seemed too complicate
| |
| 356 // Emit the test at the bottom of the loop (even if empty). | 360 // Emit the test at the bottom of the loop (even if empty). |
| 357 __ jmp(&test); | 361 __ jmp(&test); |
| 358 __ bind(&body); | 362 __ bind(&body); |
| 359 Visit(stmt->body()); | 363 Visit(stmt->body()); |
| 360 if (stmt->next() != NULL) Visit(stmt->next()); | 364 if (stmt->next() != NULL) Visit(stmt->next()); |
| 361 | 365 |
| 362 __ bind(&test); | 366 __ bind(&test); |
| 363 if (stmt->cond() == NULL) { | 367 if (stmt->cond() == NULL) { |
| 364 // For an empty test jump to the top of the loop. | 368 // For an empty test jump to the top of the loop. |
| 365 __ jmp(&body); | 369 __ jmp(&body); |
| 366 } else { | 370 } else { |
| 367 // We are not in an expression context because we have been compiling | 371 // We are not in an expression context because we have been compiling |
| 368 // statements. Set up a test expression context for the condition. | 372 // statements. Set up a test expression context for the condition. |
| 369 ASSERT_EQ(NULL, true_label_); | 373 ASSERT_EQ(NULL, true_label_); |
| 370 ASSERT_EQ(NULL, false_label_); | 374 ASSERT_EQ(NULL, false_label_); |
| 371 true_label_ = &body; | 375 true_label_ = &body; |
| 372 false_label_ = &exit; | 376 false_label_ = &exit; |
| 373 ASSERT(stmt->cond()->context() == Expression::kTest); | 377 ASSERT(stmt->cond()->context() == Expression::kTest); |
| 374 Visit(stmt->cond()); | 378 Visit(stmt->cond()); |
| 375 true_label_ = NULL; | 379 true_label_ = NULL; |
| 376 false_label_ = NULL; | 380 false_label_ = NULL; |
| 377 } | 381 } |
| 378 | 382 |
| 379 __ bind(&exit); | 383 __ bind(&exit); |
| 384 decrement_loop_depth(); | |
| 380 } | 385 } |
| 381 | 386 |
| 382 | 387 |
| 383 void FastCodeGenerator::VisitForInStatement(ForInStatement* stmt) { | 388 void FastCodeGenerator::VisitForInStatement(ForInStatement* stmt) { |
| 384 UNREACHABLE(); | 389 UNREACHABLE(); |
| 385 } | 390 } |
| 386 | 391 |
| 387 | 392 |
| 388 void FastCodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) { | 393 void FastCodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) { |
| 389 UNREACHABLE(); | 394 UNREACHABLE(); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 400 } | 405 } |
| 401 | 406 |
| 402 | 407 |
| 403 void FastCodeGenerator::VisitFunctionBoilerplateLiteral( | 408 void FastCodeGenerator::VisitFunctionBoilerplateLiteral( |
| 404 FunctionBoilerplateLiteral* expr) { | 409 FunctionBoilerplateLiteral* expr) { |
| 405 UNREACHABLE(); | 410 UNREACHABLE(); |
| 406 } | 411 } |
| 407 | 412 |
| 408 | 413 |
| 409 void FastCodeGenerator::VisitConditional(Conditional* expr) { | 414 void FastCodeGenerator::VisitConditional(Conditional* expr) { |
| 415 Comment cmnt(masm_, "[ Conditional"); | |
| 410 ASSERT_EQ(Expression::kTest, expr->condition()->context()); | 416 ASSERT_EQ(Expression::kTest, expr->condition()->context()); |
| 411 ASSERT_EQ(expr->context(), expr->then_expression()->context()); | 417 ASSERT_EQ(expr->context(), expr->then_expression()->context()); |
| 412 ASSERT_EQ(expr->context(), expr->else_expression()->context()); | 418 ASSERT_EQ(expr->context(), expr->else_expression()->context()); |
| 413 | 419 |
| 414 | 420 |
| 415 Label true_case, false_case, done; | 421 Label true_case, false_case, done; |
| 416 Label* saved_true = true_label_; | 422 Label* saved_true = true_label_; |
| 417 Label* saved_false = false_label_; | 423 Label* saved_false = false_label_; |
| 418 | 424 |
| 419 true_label_ = &true_case; | 425 true_label_ = &true_case; |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 440 } | 446 } |
| 441 | 447 |
| 442 | 448 |
| 443 void FastCodeGenerator::VisitSlot(Slot* expr) { | 449 void FastCodeGenerator::VisitSlot(Slot* expr) { |
| 444 // Slots do not appear directly in the AST. | 450 // Slots do not appear directly in the AST. |
| 445 UNREACHABLE(); | 451 UNREACHABLE(); |
| 446 } | 452 } |
| 447 | 453 |
| 448 | 454 |
| 449 void FastCodeGenerator::VisitLiteral(Literal* expr) { | 455 void FastCodeGenerator::VisitLiteral(Literal* expr) { |
| 456 Comment cmnt(masm_, "[ Literal"); | |
| 450 Move(expr->context(), expr); | 457 Move(expr->context(), expr); |
| 451 } | 458 } |
| 452 | 459 |
| 453 | 460 |
| 454 void FastCodeGenerator::VisitAssignment(Assignment* expr) { | 461 void FastCodeGenerator::VisitAssignment(Assignment* expr) { |
| 455 Comment cmnt(masm_, "[ Assignment"); | 462 Comment cmnt(masm_, "[ Assignment"); |
| 456 ASSERT(expr->op() == Token::ASSIGN || expr->op() == Token::INIT_VAR); | 463 ASSERT(expr->op() == Token::ASSIGN || expr->op() == Token::INIT_VAR); |
| 457 | 464 |
| 458 // Record source code position of the (possible) IC call. | 465 // Record source code position of the (possible) IC call. |
| 459 SetSourcePosition(expr->position()); | 466 SetSourcePosition(expr->position()); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 503 | 510 |
| 504 void FastCodeGenerator::VisitThisFunction(ThisFunction* expr) { | 511 void FastCodeGenerator::VisitThisFunction(ThisFunction* expr) { |
| 505 UNREACHABLE(); | 512 UNREACHABLE(); |
| 506 } | 513 } |
| 507 | 514 |
| 508 | 515 |
| 509 #undef __ | 516 #undef __ |
| 510 | 517 |
| 511 | 518 |
| 512 } } // namespace v8::internal | 519 } } // namespace v8::internal |
| OLD | NEW |