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/compiler/bytecode-graph-builder.h" | 5 #include "src/compiler/bytecode-graph-builder.h" |
6 | 6 |
7 #include "src/ast/ast.h" | 7 #include "src/ast/ast.h" |
8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
9 #include "src/compiler/access-builder.h" | 9 #include "src/compiler/access-builder.h" |
10 #include "src/compiler/compiler-source-position-table.h" | 10 #include "src/compiler/compiler-source-position-table.h" |
(...skipping 2259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2270 index = NewNode( | 2270 index = NewNode( |
2271 simplified()->SpeculativeNumberAdd(NumberOperationHint::kSignedSmall), | 2271 simplified()->SpeculativeNumberAdd(NumberOperationHint::kSignedSmall), |
2272 index, jsgraph()->OneConstant()); | 2272 index, jsgraph()->OneConstant()); |
2273 environment()->BindAccumulator(index, Environment::kAttachFrameState); | 2273 environment()->BindAccumulator(index, Environment::kAttachFrameState); |
2274 } | 2274 } |
2275 | 2275 |
2276 void BytecodeGraphBuilder::VisitSuspendGenerator() { | 2276 void BytecodeGraphBuilder::VisitSuspendGenerator() { |
2277 Node* state = environment()->LookupAccumulator(); | 2277 Node* state = environment()->LookupAccumulator(); |
2278 Node* generator = environment()->LookupRegister( | 2278 Node* generator = environment()->LookupRegister( |
2279 bytecode_iterator().GetRegisterOperand(0)); | 2279 bytecode_iterator().GetRegisterOperand(0)); |
| 2280 interpreter::Register first_reg = bytecode_iterator().GetRegisterOperand(1); |
| 2281 // We assume we are storing a range starting from index 0. |
| 2282 CHECK_EQ(0, first_reg.index()); |
| 2283 int register_count = |
| 2284 static_cast<int>(bytecode_iterator().GetRegisterCountOperand(2)); |
2280 SuspendFlags flags = interpreter::SuspendGeneratorBytecodeFlags::Decode( | 2285 SuspendFlags flags = interpreter::SuspendGeneratorBytecodeFlags::Decode( |
2281 bytecode_iterator().GetFlagOperand(1)); | 2286 bytecode_iterator().GetFlagOperand(3)); |
| 2287 |
2282 // The offsets used by the bytecode iterator are relative to a different base | 2288 // The offsets used by the bytecode iterator are relative to a different base |
2283 // than what is used in the interpreter, hence the addition. | 2289 // than what is used in the interpreter, hence the addition. |
2284 Node* offset = | 2290 Node* offset = |
2285 jsgraph()->Constant(bytecode_iterator().current_offset() + | 2291 jsgraph()->Constant(bytecode_iterator().current_offset() + |
2286 (BytecodeArray::kHeaderSize - kHeapObjectTag)); | 2292 (BytecodeArray::kHeaderSize - kHeapObjectTag)); |
2287 | 2293 |
2288 int register_count = environment()->register_count(); | |
2289 int value_input_count = 3 + register_count; | 2294 int value_input_count = 3 + register_count; |
2290 | 2295 |
2291 Node** value_inputs = local_zone()->NewArray<Node*>(value_input_count); | 2296 Node** value_inputs = local_zone()->NewArray<Node*>(value_input_count); |
2292 value_inputs[0] = generator; | 2297 value_inputs[0] = generator; |
2293 value_inputs[1] = state; | 2298 value_inputs[1] = state; |
2294 value_inputs[2] = offset; | 2299 value_inputs[2] = offset; |
2295 for (int i = 0; i < register_count; ++i) { | 2300 for (int i = 0; i < register_count; ++i) { |
2296 value_inputs[3 + i] = | 2301 value_inputs[3 + i] = |
2297 environment()->LookupRegister(interpreter::Register(i)); | 2302 environment()->LookupRegister(interpreter::Register(i)); |
2298 } | 2303 } |
2299 | 2304 |
2300 MakeNode(javascript()->GeneratorStore(register_count, flags), | 2305 MakeNode(javascript()->GeneratorStore(register_count, flags), |
2301 value_input_count, value_inputs, false); | 2306 value_input_count, value_inputs, false); |
2302 } | 2307 } |
2303 | 2308 |
2304 void BytecodeGraphBuilder::VisitResumeGenerator() { | 2309 void BytecodeGraphBuilder::VisitRestoreGeneratorState() { |
2305 Node* generator = environment()->LookupRegister( | 2310 Node* generator = environment()->LookupRegister( |
2306 bytecode_iterator().GetRegisterOperand(0)); | 2311 bytecode_iterator().GetRegisterOperand(0)); |
2307 | 2312 |
2308 // Bijection between registers and array indices must match that used in | |
2309 // InterpreterAssembler::ExportRegisterFile. | |
2310 for (int i = 0; i < environment()->register_count(); ++i) { | |
2311 Node* value = NewNode(javascript()->GeneratorRestoreRegister(i), generator); | |
2312 environment()->BindRegister(interpreter::Register(i), value); | |
2313 } | |
2314 | |
2315 Node* state = | 2313 Node* state = |
2316 NewNode(javascript()->GeneratorRestoreContinuation(), generator); | 2314 NewNode(javascript()->GeneratorRestoreContinuation(), generator); |
2317 | 2315 |
2318 environment()->BindAccumulator(state); | 2316 environment()->BindAccumulator(state, Environment::kAttachFrameState); |
| 2317 } |
| 2318 |
| 2319 void BytecodeGraphBuilder::VisitRestoreGeneratorRegisters() { |
| 2320 Node* generator = |
| 2321 environment()->LookupRegister(bytecode_iterator().GetRegisterOperand(0)); |
| 2322 interpreter::Register first_reg = bytecode_iterator().GetRegisterOperand(1); |
| 2323 // We assume we are restoring registers starting fromm index 0. |
| 2324 CHECK_EQ(0, first_reg.index()); |
| 2325 int register_count = |
| 2326 static_cast<int>(bytecode_iterator().GetRegisterCountOperand(2)); |
| 2327 |
| 2328 // Bijection between registers and array indices must match that used in |
| 2329 // InterpreterAssembler::ExportRegisterFile. |
| 2330 for (int i = 0; i < register_count; ++i) { |
| 2331 Node* value = NewNode(javascript()->GeneratorRestoreRegister(i), generator); |
| 2332 environment()->BindRegister(interpreter::Register(i), value); |
| 2333 } |
2319 } | 2334 } |
2320 | 2335 |
2321 void BytecodeGraphBuilder::VisitWide() { | 2336 void BytecodeGraphBuilder::VisitWide() { |
2322 // Consumed by the BytecodeArrayIterator. | 2337 // Consumed by the BytecodeArrayIterator. |
2323 UNREACHABLE(); | 2338 UNREACHABLE(); |
2324 } | 2339 } |
2325 | 2340 |
2326 void BytecodeGraphBuilder::VisitExtraWide() { | 2341 void BytecodeGraphBuilder::VisitExtraWide() { |
2327 // Consumed by the BytecodeArrayIterator. | 2342 // Consumed by the BytecodeArrayIterator. |
2328 UNREACHABLE(); | 2343 UNREACHABLE(); |
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2831 it->source_position().ScriptOffset(), start_position_.InliningId())); | 2846 it->source_position().ScriptOffset(), start_position_.InliningId())); |
2832 it->Advance(); | 2847 it->Advance(); |
2833 } else { | 2848 } else { |
2834 DCHECK_GT(it->code_offset(), offset); | 2849 DCHECK_GT(it->code_offset(), offset); |
2835 } | 2850 } |
2836 } | 2851 } |
2837 | 2852 |
2838 } // namespace compiler | 2853 } // namespace compiler |
2839 } // namespace internal | 2854 } // namespace internal |
2840 } // namespace v8 | 2855 } // namespace v8 |
OLD | NEW |