OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/interpreter/bytecode-generator.h" | 5 #include "src/interpreter/bytecode-generator.h" |
6 | 6 |
7 #include "src/ast/compile-time-value.h" | 7 #include "src/ast/compile-time-value.h" |
8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
10 #include "src/compilation-info.h" | 10 #include "src/compilation-info.h" |
(...skipping 1282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1293 Visit(stmt->try_block()); | 1293 Visit(stmt->try_block()); |
1294 } | 1294 } |
1295 try_control_builder.EndTry(); | 1295 try_control_builder.EndTry(); |
1296 | 1296 |
1297 // Create a catch scope that binds the exception. | 1297 // Create a catch scope that binds the exception. |
1298 BuildNewLocalCatchContext(stmt->variable(), stmt->scope()); | 1298 BuildNewLocalCatchContext(stmt->variable(), stmt->scope()); |
1299 builder()->StoreAccumulatorInRegister(context); | 1299 builder()->StoreAccumulatorInRegister(context); |
1300 | 1300 |
1301 // If requested, clear message object as we enter the catch block. | 1301 // If requested, clear message object as we enter the catch block. |
1302 if (stmt->clear_pending_message()) { | 1302 if (stmt->clear_pending_message()) { |
1303 builder()->CallRuntime(Runtime::kInterpreterClearPendingMessage); | 1303 builder()->LoadTheHole().SetPendingMessage(); |
1304 } | 1304 } |
1305 | 1305 |
1306 // Load the catch context into the accumulator. | 1306 // Load the catch context into the accumulator. |
1307 builder()->LoadAccumulatorWithRegister(context); | 1307 builder()->LoadAccumulatorWithRegister(context); |
1308 | 1308 |
1309 // Evaluate the catch-block. | 1309 // Evaluate the catch-block. |
1310 VisitInScope(stmt->catch_block(), stmt->scope()); | 1310 VisitInScope(stmt->catch_block(), stmt->scope()); |
1311 try_control_builder.EndCatch(); | 1311 try_control_builder.EndCatch(); |
1312 } | 1312 } |
1313 | 1313 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1352 commands.RecordFallThroughPath(); | 1352 commands.RecordFallThroughPath(); |
1353 try_control_builder.LeaveTry(); | 1353 try_control_builder.LeaveTry(); |
1354 try_control_builder.BeginHandler(); | 1354 try_control_builder.BeginHandler(); |
1355 commands.RecordHandlerReThrowPath(); | 1355 commands.RecordHandlerReThrowPath(); |
1356 | 1356 |
1357 // Pending message object is saved on entry. | 1357 // Pending message object is saved on entry. |
1358 try_control_builder.BeginFinally(); | 1358 try_control_builder.BeginFinally(); |
1359 Register message = context; // Reuse register. | 1359 Register message = context; // Reuse register. |
1360 | 1360 |
1361 // Clear message object as we enter the finally block. | 1361 // Clear message object as we enter the finally block. |
1362 builder() | 1362 builder()->LoadTheHole().SetPendingMessage().StoreAccumulatorInRegister( |
1363 ->CallRuntime(Runtime::kInterpreterClearPendingMessage) | 1363 message); |
1364 .StoreAccumulatorInRegister(message); | |
1365 | 1364 |
1366 // Evaluate the finally-block. | 1365 // Evaluate the finally-block. |
1367 Visit(stmt->finally_block()); | 1366 Visit(stmt->finally_block()); |
1368 try_control_builder.EndFinally(); | 1367 try_control_builder.EndFinally(); |
1369 | 1368 |
1370 // Pending message object is restored on exit. | 1369 // Pending message object is restored on exit. |
1371 builder()->CallRuntime(Runtime::kInterpreterSetPendingMessage, message); | 1370 builder()->LoadAccumulatorWithRegister(message).SetPendingMessage(); |
1372 | 1371 |
1373 // Dynamic dispatch after the finally-block. | 1372 // Dynamic dispatch after the finally-block. |
1374 commands.ApplyDeferredCommands(); | 1373 commands.ApplyDeferredCommands(); |
1375 } | 1374 } |
1376 | 1375 |
1377 void BytecodeGenerator::VisitDebuggerStatement(DebuggerStatement* stmt) { | 1376 void BytecodeGenerator::VisitDebuggerStatement(DebuggerStatement* stmt) { |
1378 builder()->SetStatementPosition(stmt); | 1377 builder()->SetStatementPosition(stmt); |
1379 builder()->Debugger(); | 1378 builder()->Debugger(); |
1380 } | 1379 } |
1381 | 1380 |
(...skipping 1804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3186 } | 3185 } |
3187 | 3186 |
3188 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() { | 3187 Runtime::FunctionId BytecodeGenerator::StoreKeyedToSuperRuntimeId() { |
3189 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict | 3188 return is_strict(language_mode()) ? Runtime::kStoreKeyedToSuper_Strict |
3190 : Runtime::kStoreKeyedToSuper_Sloppy; | 3189 : Runtime::kStoreKeyedToSuper_Sloppy; |
3191 } | 3190 } |
3192 | 3191 |
3193 } // namespace interpreter | 3192 } // namespace interpreter |
3194 } // namespace internal | 3193 } // namespace internal |
3195 } // namespace v8 | 3194 } // namespace v8 |
OLD | NEW |