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/scopes.h" | 7 #include "src/ast/scopes.h" |
8 #include "src/compiler.h" | 8 #include "src/compiler.h" |
9 #include "src/interpreter/bytecode-register-allocator.h" | 9 #include "src/interpreter/bytecode-register-allocator.h" |
10 #include "src/interpreter/control-flow-builders.h" | 10 #include "src/interpreter/control-flow-builders.h" |
(...skipping 899 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
910 // that is intercepting 'throw' control commands. | 910 // that is intercepting 'throw' control commands. |
911 try_control_builder.BeginTry(context); | 911 try_control_builder.BeginTry(context); |
912 // TODO(mstarzinger): Control scope is missing! | 912 // TODO(mstarzinger): Control scope is missing! |
913 Visit(stmt->try_block()); | 913 Visit(stmt->try_block()); |
914 try_control_builder.EndTry(); | 914 try_control_builder.EndTry(); |
915 | 915 |
916 // Clear message object as we enter the catch block. | 916 // Clear message object as we enter the catch block. |
917 // TODO(mstarzinger): Implement this! | 917 // TODO(mstarzinger): Implement this! |
918 | 918 |
919 // Create a catch scope that binds the exception. | 919 // Create a catch scope that binds the exception. |
920 register_allocator()->PrepareForConsecutiveAllocations(3); | 920 VisitNewLocalCatchContext(stmt->variable()); |
921 Register name = register_allocator()->NextConsecutiveRegister(); | 921 ContextScope scope(this, stmt->scope()); |
922 Register exception = register_allocator()->NextConsecutiveRegister(); | |
923 Register closure = register_allocator()->NextConsecutiveRegister(); | |
924 builder() | |
925 ->StoreAccumulatorInRegister(exception) | |
926 .LoadLiteral(stmt->variable()->name()) | |
927 .StoreAccumulatorInRegister(name); | |
928 VisitFunctionClosureForContext(); | |
929 builder()->StoreAccumulatorInRegister(closure).CallRuntime( | |
930 Runtime::kPushCatchContext, name, 3); | |
931 | 922 |
932 // Evaluate the catch-block. | 923 // Evaluate the catch-block. |
933 Visit(stmt->catch_block()); | 924 Visit(stmt->catch_block()); |
934 try_control_builder.EndCatch(); | 925 try_control_builder.EndCatch(); |
935 } | 926 } |
936 | 927 |
937 | 928 |
938 void BytecodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) { | 929 void BytecodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) { |
939 TryFinallyBuilder try_control_builder(builder()); | 930 TryFinallyBuilder try_control_builder(builder()); |
940 | 931 |
(...skipping 1175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2116 ->LoadLiteral(scope->GetScopeInfo(isolate())) | 2107 ->LoadLiteral(scope->GetScopeInfo(isolate())) |
2117 .StoreAccumulatorInRegister(scope_info); | 2108 .StoreAccumulatorInRegister(scope_info); |
2118 VisitFunctionClosureForContext(); | 2109 VisitFunctionClosureForContext(); |
2119 builder() | 2110 builder() |
2120 ->StoreAccumulatorInRegister(closure) | 2111 ->StoreAccumulatorInRegister(closure) |
2121 .CallRuntime(Runtime::kPushBlockContext, scope_info, 2); | 2112 .CallRuntime(Runtime::kPushBlockContext, scope_info, 2); |
2122 execution_result()->SetResultInAccumulator(); | 2113 execution_result()->SetResultInAccumulator(); |
2123 } | 2114 } |
2124 | 2115 |
2125 | 2116 |
| 2117 void BytecodeGenerator::VisitNewLocalCatchContext(Variable* variable) { |
| 2118 AccumulatorResultScope accumulator_execution_result(this); |
| 2119 DCHECK(variable->IsContextSlot()); |
| 2120 |
| 2121 // Allocate a new local block context. |
| 2122 register_allocator()->PrepareForConsecutiveAllocations(3); |
| 2123 Register name = register_allocator()->NextConsecutiveRegister(); |
| 2124 Register exception = register_allocator()->NextConsecutiveRegister(); |
| 2125 Register closure = register_allocator()->NextConsecutiveRegister(); |
| 2126 |
| 2127 builder() |
| 2128 ->StoreAccumulatorInRegister(exception) |
| 2129 .LoadLiteral(variable->name()) |
| 2130 .StoreAccumulatorInRegister(name); |
| 2131 VisitFunctionClosureForContext(); |
| 2132 builder()->StoreAccumulatorInRegister(closure).CallRuntime( |
| 2133 Runtime::kPushCatchContext, name, 3); |
| 2134 execution_result()->SetResultInAccumulator(); |
| 2135 } |
| 2136 |
| 2137 |
2126 void BytecodeGenerator::VisitObjectLiteralAccessor( | 2138 void BytecodeGenerator::VisitObjectLiteralAccessor( |
2127 Register home_object, ObjectLiteralProperty* property, Register value_out) { | 2139 Register home_object, ObjectLiteralProperty* property, Register value_out) { |
2128 // TODO(rmcilroy): Replace value_out with VisitForRegister(); | 2140 // TODO(rmcilroy): Replace value_out with VisitForRegister(); |
2129 if (property == nullptr) { | 2141 if (property == nullptr) { |
2130 builder()->LoadNull().StoreAccumulatorInRegister(value_out); | 2142 builder()->LoadNull().StoreAccumulatorInRegister(value_out); |
2131 } else { | 2143 } else { |
2132 VisitForAccumulatorValue(property->value()); | 2144 VisitForAccumulatorValue(property->value()); |
2133 builder()->StoreAccumulatorInRegister(value_out); | 2145 builder()->StoreAccumulatorInRegister(value_out); |
2134 VisitSetHomeObject(value_out, home_object, property); | 2146 VisitSetHomeObject(value_out, home_object, property); |
2135 } | 2147 } |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2255 } | 2267 } |
2256 | 2268 |
2257 | 2269 |
2258 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { | 2270 int BytecodeGenerator::feedback_index(FeedbackVectorSlot slot) const { |
2259 return info()->feedback_vector()->GetIndex(slot); | 2271 return info()->feedback_vector()->GetIndex(slot); |
2260 } | 2272 } |
2261 | 2273 |
2262 } // namespace interpreter | 2274 } // namespace interpreter |
2263 } // namespace internal | 2275 } // namespace internal |
2264 } // namespace v8 | 2276 } // namespace v8 |
OLD | NEW |