OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/ast-graph-builder.h" | 5 #include "src/compiler/ast-graph-builder.h" |
6 | 6 |
7 #include "src/compiler.h" | 7 #include "src/compiler.h" |
8 #include "src/compiler/ast-loop-assignment-analyzer.h" | 8 #include "src/compiler/ast-loop-assignment-analyzer.h" |
9 #include "src/compiler/control-builders.h" | 9 #include "src/compiler/control-builders.h" |
10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
(...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 // Build node to initialize local function context. | 442 // Build node to initialize local function context. |
443 Node* closure = GetFunctionClosure(); | 443 Node* closure = GetFunctionClosure(); |
444 Node* inner_context = BuildLocalFunctionContext(incoming_context, closure); | 444 Node* inner_context = BuildLocalFunctionContext(incoming_context, closure); |
445 | 445 |
446 // Push top-level function context for the function body. | 446 // Push top-level function context for the function body. |
447 ContextScope top_context(this, scope, inner_context); | 447 ContextScope top_context(this, scope, inner_context); |
448 | 448 |
449 // Build the arguments object if it is used. | 449 // Build the arguments object if it is used. |
450 BuildArgumentsObject(scope->arguments()); | 450 BuildArgumentsObject(scope->arguments()); |
451 | 451 |
| 452 // Build rest arguments array if it is used. |
| 453 int rest_index; |
| 454 Variable* rest_parameter = scope->rest_parameter(&rest_index); |
| 455 BuildRestArgumentsArray(rest_parameter, rest_index); |
| 456 |
452 // Emit tracing call if requested to do so. | 457 // Emit tracing call if requested to do so. |
453 if (FLAG_trace) { | 458 if (FLAG_trace) { |
454 NewNode(javascript()->CallRuntime(Runtime::kTraceEnter, 0)); | 459 NewNode(javascript()->CallRuntime(Runtime::kTraceEnter, 0)); |
455 } | 460 } |
456 | 461 |
457 // Visit implicit declaration of the function name. | 462 // Visit implicit declaration of the function name. |
458 if (scope->is_function_scope() && scope->function() != NULL) { | 463 if (scope->is_function_scope() && scope->function() != NULL) { |
459 VisitVariableDeclaration(scope->function()); | 464 VisitVariableDeclaration(scope->function()); |
460 } | 465 } |
461 | 466 |
(...skipping 2010 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2472 | 2477 |
2473 // Assign the object to the arguments variable. | 2478 // Assign the object to the arguments variable. |
2474 DCHECK(arguments->IsContextSlot() || arguments->IsStackAllocated()); | 2479 DCHECK(arguments->IsContextSlot() || arguments->IsStackAllocated()); |
2475 // This should never lazy deopt, so it is fine to send invalid bailout id. | 2480 // This should never lazy deopt, so it is fine to send invalid bailout id. |
2476 BuildVariableAssignment(arguments, object, Token::ASSIGN, BailoutId::None()); | 2481 BuildVariableAssignment(arguments, object, Token::ASSIGN, BailoutId::None()); |
2477 | 2482 |
2478 return object; | 2483 return object; |
2479 } | 2484 } |
2480 | 2485 |
2481 | 2486 |
| 2487 Node* AstGraphBuilder::BuildRestArgumentsArray(Variable* rest, int index) { |
| 2488 if (rest == NULL) return NULL; |
| 2489 |
| 2490 DCHECK(index >= 0); |
| 2491 const Operator* op = javascript()->CallRuntime(Runtime::kNewRestParamSlow, 1); |
| 2492 Node* object = NewNode(op, jsgraph()->SmiConstant(index)); |
| 2493 |
| 2494 // Assign the object to the rest array |
| 2495 DCHECK(rest->IsContextSlot() || rest->IsStackAllocated()); |
| 2496 // This should never lazy deopt, so it is fine to send invalid bailout id. |
| 2497 BuildVariableAssignment(rest, object, Token::ASSIGN, BailoutId::None()); |
| 2498 |
| 2499 return object; |
| 2500 } |
| 2501 |
| 2502 |
2482 Node* AstGraphBuilder::BuildHoleCheckSilent(Node* value, Node* for_hole, | 2503 Node* AstGraphBuilder::BuildHoleCheckSilent(Node* value, Node* for_hole, |
2483 Node* not_hole) { | 2504 Node* not_hole) { |
2484 IfBuilder hole_check(this); | 2505 IfBuilder hole_check(this); |
2485 Node* the_hole = jsgraph()->TheHoleConstant(); | 2506 Node* the_hole = jsgraph()->TheHoleConstant(); |
2486 Node* check = NewNode(javascript()->StrictEqual(), value, the_hole); | 2507 Node* check = NewNode(javascript()->StrictEqual(), value, the_hole); |
2487 hole_check.If(check); | 2508 hole_check.If(check); |
2488 hole_check.Then(); | 2509 hole_check.Then(); |
2489 environment()->Push(for_hole); | 2510 environment()->Push(for_hole); |
2490 hole_check.Else(); | 2511 hole_check.Else(); |
2491 environment()->Push(not_hole); | 2512 environment()->Push(not_hole); |
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3142 Node* dead_node = graph()->NewNode(common()->Dead()); | 3163 Node* dead_node = graph()->NewNode(common()->Dead()); |
3143 dead_control_.set(dead_node); | 3164 dead_control_.set(dead_node); |
3144 return dead_node; | 3165 return dead_node; |
3145 } | 3166 } |
3146 return dead_control_.get(); | 3167 return dead_control_.get(); |
3147 } | 3168 } |
3148 | 3169 |
3149 } // namespace compiler | 3170 } // namespace compiler |
3150 } // namespace internal | 3171 } // namespace internal |
3151 } // namespace v8 | 3172 } // namespace v8 |
OLD | NEW |