OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
939 __ bind(&done); | 939 __ bind(&done); |
940 PrepareForBailoutForId(stmt->id(), NO_REGISTERS); | 940 PrepareForBailoutForId(stmt->id(), NO_REGISTERS); |
941 } | 941 } |
942 | 942 |
943 | 943 |
944 void FullCodeGenerator::VisitContinueStatement(ContinueStatement* stmt) { | 944 void FullCodeGenerator::VisitContinueStatement(ContinueStatement* stmt) { |
945 Comment cmnt(masm_, "[ ContinueStatement"); | 945 Comment cmnt(masm_, "[ ContinueStatement"); |
946 SetStatementPosition(stmt); | 946 SetStatementPosition(stmt); |
947 NestedStatement* current = nesting_stack_; | 947 NestedStatement* current = nesting_stack_; |
948 int stack_depth = 0; | 948 int stack_depth = 0; |
| 949 // When continuing, we clobber the unpredictable value in the accumulator |
| 950 // with one that's safe for GC. If we hit an exit from the try block of |
| 951 // try...finally on our way out, we will unconditionally preserve the |
| 952 // accumulator on the stack. |
| 953 ClearAccumulator(); |
949 while (!current->IsContinueTarget(stmt->target())) { | 954 while (!current->IsContinueTarget(stmt->target())) { |
950 stack_depth = current->Exit(stack_depth); | 955 stack_depth = current->Exit(stack_depth); |
951 current = current->outer(); | 956 current = current->outer(); |
952 } | 957 } |
953 __ Drop(stack_depth); | 958 __ Drop(stack_depth); |
954 | 959 |
955 Iteration* loop = current->AsIteration(); | 960 Iteration* loop = current->AsIteration(); |
956 __ jmp(loop->continue_target()); | 961 __ jmp(loop->continue_target()); |
957 } | 962 } |
958 | 963 |
959 | 964 |
960 void FullCodeGenerator::VisitBreakStatement(BreakStatement* stmt) { | 965 void FullCodeGenerator::VisitBreakStatement(BreakStatement* stmt) { |
961 Comment cmnt(masm_, "[ BreakStatement"); | 966 Comment cmnt(masm_, "[ BreakStatement"); |
962 SetStatementPosition(stmt); | 967 SetStatementPosition(stmt); |
963 NestedStatement* current = nesting_stack_; | 968 NestedStatement* current = nesting_stack_; |
964 int stack_depth = 0; | 969 int stack_depth = 0; |
| 970 // When breaking, we clobber the unpredictable value in the accumulator |
| 971 // with one that's safe for GC. If we hit an exit from the try block of |
| 972 // try...finally on our way out, we will unconditionally preserve the |
| 973 // accumulator on the stack. |
| 974 ClearAccumulator(); |
965 while (!current->IsBreakTarget(stmt->target())) { | 975 while (!current->IsBreakTarget(stmt->target())) { |
966 stack_depth = current->Exit(stack_depth); | 976 stack_depth = current->Exit(stack_depth); |
967 current = current->outer(); | 977 current = current->outer(); |
968 } | 978 } |
969 __ Drop(stack_depth); | 979 __ Drop(stack_depth); |
970 | 980 |
971 Breakable* target = current->AsBreakable(); | 981 Breakable* target = current->AsBreakable(); |
972 __ jmp(target->break_target()); | 982 __ jmp(target->break_target()); |
973 } | 983 } |
974 | 984 |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1228 } | 1238 } |
1229 | 1239 |
1230 __ bind(&try_handler_setup); | 1240 __ bind(&try_handler_setup); |
1231 { | 1241 { |
1232 // Setup try handler (stack pointer registers). | 1242 // Setup try handler (stack pointer registers). |
1233 TryFinally try_block(this, &finally_entry); | 1243 TryFinally try_block(this, &finally_entry); |
1234 __ PushTryHandler(IN_JAVASCRIPT, TRY_FINALLY_HANDLER); | 1244 __ PushTryHandler(IN_JAVASCRIPT, TRY_FINALLY_HANDLER); |
1235 Visit(stmt->try_block()); | 1245 Visit(stmt->try_block()); |
1236 __ PopTryHandler(); | 1246 __ PopTryHandler(); |
1237 } | 1247 } |
1238 // Execute the finally block on the way out. | 1248 // Execute the finally block on the way out. Clobber the unpredictable |
| 1249 // value in the accumulator with one that's safe for GC. The finally |
| 1250 // block will unconditionally preserve the accumulator on the stack. |
| 1251 ClearAccumulator(); |
1239 __ Call(&finally_entry); | 1252 __ Call(&finally_entry); |
1240 } | 1253 } |
1241 | 1254 |
1242 | 1255 |
1243 void FullCodeGenerator::VisitDebuggerStatement(DebuggerStatement* stmt) { | 1256 void FullCodeGenerator::VisitDebuggerStatement(DebuggerStatement* stmt) { |
1244 #ifdef ENABLE_DEBUGGER_SUPPORT | 1257 #ifdef ENABLE_DEBUGGER_SUPPORT |
1245 Comment cmnt(masm_, "[ DebuggerStatement"); | 1258 Comment cmnt(masm_, "[ DebuggerStatement"); |
1246 SetStatementPosition(stmt); | 1259 SetStatementPosition(stmt); |
1247 | 1260 |
1248 __ DebugBreak(); | 1261 __ DebugBreak(); |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1348 __ Drop(stack_depth); | 1361 __ Drop(stack_depth); |
1349 __ PopTryHandler(); | 1362 __ PopTryHandler(); |
1350 return 0; | 1363 return 0; |
1351 } | 1364 } |
1352 | 1365 |
1353 | 1366 |
1354 #undef __ | 1367 #undef __ |
1355 | 1368 |
1356 | 1369 |
1357 } } // namespace v8::internal | 1370 } } // namespace v8::internal |
OLD | NEW |