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 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 | 281 |
282 | 282 |
283 void FastCodeGenerator::VisitEmptyStatement(EmptyStatement* stmt) { | 283 void FastCodeGenerator::VisitEmptyStatement(EmptyStatement* stmt) { |
284 Comment cmnt(masm_, "[ EmptyStatement"); | 284 Comment cmnt(masm_, "[ EmptyStatement"); |
285 SetStatementPosition(stmt); | 285 SetStatementPosition(stmt); |
286 } | 286 } |
287 | 287 |
288 | 288 |
289 void FastCodeGenerator::VisitIfStatement(IfStatement* stmt) { | 289 void FastCodeGenerator::VisitIfStatement(IfStatement* stmt) { |
290 Comment cmnt(masm_, "[ IfStatement"); | 290 Comment cmnt(masm_, "[ IfStatement"); |
| 291 SetStatementPosition(stmt); |
291 // Expressions cannot recursively enter statements, there are no labels in | 292 // Expressions cannot recursively enter statements, there are no labels in |
292 // the state. | 293 // the state. |
293 ASSERT_EQ(NULL, true_label_); | 294 ASSERT_EQ(NULL, true_label_); |
294 ASSERT_EQ(NULL, false_label_); | 295 ASSERT_EQ(NULL, false_label_); |
295 Label then_part, else_part, done; | 296 Label then_part, else_part, done; |
296 | 297 |
297 // Do not worry about optimizing for empty then or else bodies. | 298 // Do not worry about optimizing for empty then or else bodies. |
298 true_label_ = &then_part; | 299 true_label_ = &then_part; |
299 false_label_ = &else_part; | 300 false_label_ = &else_part; |
300 ASSERT(stmt->condition()->context() == Expression::kTest); | 301 ASSERT(stmt->condition()->context() == Expression::kTest); |
301 Visit(stmt->condition()); | 302 Visit(stmt->condition()); |
302 true_label_ = NULL; | 303 true_label_ = NULL; |
303 false_label_ = NULL; | 304 false_label_ = NULL; |
304 | 305 |
305 __ bind(&then_part); | 306 __ bind(&then_part); |
306 Visit(stmt->then_statement()); | 307 Visit(stmt->then_statement()); |
307 __ jmp(&done); | 308 __ jmp(&done); |
308 | 309 |
309 __ bind(&else_part); | 310 __ bind(&else_part); |
310 Visit(stmt->else_statement()); | 311 Visit(stmt->else_statement()); |
311 | 312 |
312 __ bind(&done); | 313 __ bind(&done); |
313 } | 314 } |
314 | 315 |
315 | 316 |
316 void FastCodeGenerator::VisitContinueStatement(ContinueStatement* stmt) { | 317 void FastCodeGenerator::VisitContinueStatement(ContinueStatement* stmt) { |
317 Comment cmnt(masm_, "[ ContinueStatement"); | 318 Comment cmnt(masm_, "[ ContinueStatement"); |
| 319 SetStatementPosition(stmt); |
318 NestedStatement* current = nesting_stack_; | 320 NestedStatement* current = nesting_stack_; |
319 int stack_depth = 0; | 321 int stack_depth = 0; |
320 while (!current->IsContinueTarget(stmt->target())) { | 322 while (!current->IsContinueTarget(stmt->target())) { |
321 stack_depth = current->Exit(stack_depth); | 323 stack_depth = current->Exit(stack_depth); |
322 current = current->outer(); | 324 current = current->outer(); |
323 } | 325 } |
324 __ Drop(stack_depth); | 326 __ Drop(stack_depth); |
325 | 327 |
326 Iteration* loop = current->AsIteration(); | 328 Iteration* loop = current->AsIteration(); |
327 __ jmp(loop->continue_target()); | 329 __ jmp(loop->continue_target()); |
328 } | 330 } |
329 | 331 |
330 | 332 |
331 void FastCodeGenerator::VisitBreakStatement(BreakStatement* stmt) { | 333 void FastCodeGenerator::VisitBreakStatement(BreakStatement* stmt) { |
332 Comment cmnt(masm_, "[ BreakStatement"); | 334 Comment cmnt(masm_, "[ BreakStatement"); |
| 335 SetStatementPosition(stmt); |
333 NestedStatement* current = nesting_stack_; | 336 NestedStatement* current = nesting_stack_; |
334 int stack_depth = 0; | 337 int stack_depth = 0; |
335 while (!current->IsBreakTarget(stmt->target())) { | 338 while (!current->IsBreakTarget(stmt->target())) { |
336 stack_depth = current->Exit(stack_depth); | 339 stack_depth = current->Exit(stack_depth); |
337 current = current->outer(); | 340 current = current->outer(); |
338 } | 341 } |
339 __ Drop(stack_depth); | 342 __ Drop(stack_depth); |
340 | 343 |
341 Breakable* target = current->AsBreakable(); | 344 Breakable* target = current->AsBreakable(); |
342 __ jmp(target->break_target()); | 345 __ jmp(target->break_target()); |
343 } | 346 } |
344 | 347 |
345 | 348 |
346 void FastCodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { | 349 void FastCodeGenerator::VisitReturnStatement(ReturnStatement* stmt) { |
347 Comment cmnt(masm_, "[ ReturnStatement"); | 350 Comment cmnt(masm_, "[ ReturnStatement"); |
| 351 SetStatementPosition(stmt); |
348 Expression* expr = stmt->expression(); | 352 Expression* expr = stmt->expression(); |
349 // Complete the statement based on the type of the subexpression. | 353 // Complete the statement based on the type of the subexpression. |
350 if (expr->AsLiteral() != NULL) { | 354 if (expr->AsLiteral() != NULL) { |
351 __ Move(result_register(), expr->AsLiteral()->handle()); | 355 __ Move(result_register(), expr->AsLiteral()->handle()); |
352 } else { | 356 } else { |
353 ASSERT_EQ(Expression::kValue, expr->context()); | 357 ASSERT_EQ(Expression::kValue, expr->context()); |
354 Visit(expr); | 358 Visit(expr); |
355 __ pop(result_register()); | 359 __ pop(result_register()); |
356 } | 360 } |
357 | 361 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
399 } | 403 } |
400 | 404 |
401 | 405 |
402 void FastCodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) { | 406 void FastCodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) { |
403 UNREACHABLE(); | 407 UNREACHABLE(); |
404 } | 408 } |
405 | 409 |
406 | 410 |
407 void FastCodeGenerator::VisitDoWhileStatement(DoWhileStatement* stmt) { | 411 void FastCodeGenerator::VisitDoWhileStatement(DoWhileStatement* stmt) { |
408 Comment cmnt(masm_, "[ DoWhileStatement"); | 412 Comment cmnt(masm_, "[ DoWhileStatement"); |
| 413 SetStatementPosition(stmt); |
409 Label body, stack_limit_hit, stack_check_success; | 414 Label body, stack_limit_hit, stack_check_success; |
410 | 415 |
411 Iteration loop_statement(this, stmt); | 416 Iteration loop_statement(this, stmt); |
412 increment_loop_depth(); | 417 increment_loop_depth(); |
413 | 418 |
414 __ bind(&body); | 419 __ bind(&body); |
415 Visit(stmt->body()); | 420 Visit(stmt->body()); |
416 | 421 |
417 // Check stack before looping. | 422 // Check stack before looping. |
418 __ StackLimitCheck(&stack_limit_hit); | 423 __ StackLimitCheck(&stack_limit_hit); |
(...skipping 17 matching lines...) Expand all Loading... |
436 __ jmp(&stack_check_success); | 441 __ jmp(&stack_check_success); |
437 | 442 |
438 __ bind(loop_statement.break_target()); | 443 __ bind(loop_statement.break_target()); |
439 | 444 |
440 decrement_loop_depth(); | 445 decrement_loop_depth(); |
441 } | 446 } |
442 | 447 |
443 | 448 |
444 void FastCodeGenerator::VisitWhileStatement(WhileStatement* stmt) { | 449 void FastCodeGenerator::VisitWhileStatement(WhileStatement* stmt) { |
445 Comment cmnt(masm_, "[ WhileStatement"); | 450 Comment cmnt(masm_, "[ WhileStatement"); |
| 451 SetStatementPosition(stmt); |
446 Label body, stack_limit_hit, stack_check_success; | 452 Label body, stack_limit_hit, stack_check_success; |
447 | 453 |
448 Iteration loop_statement(this, stmt); | 454 Iteration loop_statement(this, stmt); |
449 increment_loop_depth(); | 455 increment_loop_depth(); |
450 | 456 |
451 // Emit the test at the bottom of the loop. | 457 // Emit the test at the bottom of the loop. |
452 __ jmp(loop_statement.continue_target()); | 458 __ jmp(loop_statement.continue_target()); |
453 | 459 |
454 __ bind(&body); | 460 __ bind(&body); |
455 Visit(stmt->body()); | 461 Visit(stmt->body()); |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
782 __ Drop(stack_depth); | 788 __ Drop(stack_depth); |
783 __ PopTryHandler(); | 789 __ PopTryHandler(); |
784 return 0; | 790 return 0; |
785 } | 791 } |
786 | 792 |
787 | 793 |
788 #undef __ | 794 #undef __ |
789 | 795 |
790 | 796 |
791 } } // namespace v8::internal | 797 } } // namespace v8::internal |
OLD | NEW |