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/ast/scopes.h" | 7 #include "src/ast/scopes.h" |
8 #include "src/compiler.h" | 8 #include "src/compiler.h" |
9 #include "src/compiler/ast-loop-assignment-analyzer.h" | 9 #include "src/compiler/ast-loop-assignment-analyzer.h" |
10 #include "src/compiler/control-builders.h" | 10 #include "src/compiler/control-builders.h" |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 liveness_analyzer_(static_cast<size_t>(info->scope()->num_stack_slots()), | 434 liveness_analyzer_(static_cast<size_t>(info->scope()->num_stack_slots()), |
435 local_zone), | 435 local_zone), |
436 frame_state_function_info_(common()->CreateFrameStateFunctionInfo( | 436 frame_state_function_info_(common()->CreateFrameStateFunctionInfo( |
437 FrameStateType::kJavaScriptFunction, info->num_parameters() + 1, | 437 FrameStateType::kJavaScriptFunction, info->num_parameters() + 1, |
438 info->scope()->num_stack_slots(), info->shared_info())) { | 438 info->scope()->num_stack_slots(), info->shared_info())) { |
439 InitializeAstVisitor(info->isolate()); | 439 InitializeAstVisitor(info->isolate()); |
440 } | 440 } |
441 | 441 |
442 | 442 |
443 Node* AstGraphBuilder::GetFunctionClosureForContext() { | 443 Node* AstGraphBuilder::GetFunctionClosureForContext() { |
444 DeclarationScope* closure_scope = current_scope()->GetClosureScope(); | 444 Scope* closure_scope = current_scope()->ClosureScope(); |
445 if (closure_scope->is_script_scope() || | 445 if (closure_scope->is_script_scope() || |
446 closure_scope->is_module_scope()) { | 446 closure_scope->is_module_scope()) { |
447 // Contexts nested in the native context have a canonical empty function as | 447 // Contexts nested in the native context have a canonical empty function as |
448 // their closure, not the anonymous closure containing the global code. | 448 // their closure, not the anonymous closure containing the global code. |
449 return BuildLoadNativeContextField(Context::CLOSURE_INDEX); | 449 return BuildLoadNativeContextField(Context::CLOSURE_INDEX); |
450 } else if (closure_scope->is_eval_scope()) { | 450 } else if (closure_scope->is_eval_scope()) { |
451 // Contexts nested inside eval code have the same closure as the context | 451 // Contexts nested inside eval code have the same closure as the context |
452 // calling eval, not the anonymous closure containing the eval code. | 452 // calling eval, not the anonymous closure containing the eval code. |
453 const Operator* op = | 453 const Operator* op = |
454 javascript()->LoadContext(0, Context::CLOSURE_INDEX, false); | 454 javascript()->LoadContext(0, Context::CLOSURE_INDEX, false); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
501 Node* node = graph()->NewNode( | 501 Node* node = graph()->NewNode( |
502 op, jsgraph()->EmptyStateValues(), jsgraph()->EmptyStateValues(), | 502 op, jsgraph()->EmptyStateValues(), jsgraph()->EmptyStateValues(), |
503 jsgraph()->EmptyStateValues(), jsgraph()->NoContextConstant(), | 503 jsgraph()->EmptyStateValues(), jsgraph()->NoContextConstant(), |
504 jsgraph()->UndefinedConstant(), graph()->start()); | 504 jsgraph()->UndefinedConstant(), graph()->start()); |
505 empty_frame_state_.set(node); | 505 empty_frame_state_.set(node); |
506 } | 506 } |
507 return empty_frame_state_.get(); | 507 return empty_frame_state_.get(); |
508 } | 508 } |
509 | 509 |
510 bool AstGraphBuilder::CreateGraph(bool stack_check) { | 510 bool AstGraphBuilder::CreateGraph(bool stack_check) { |
511 DeclarationScope* scope = info()->scope(); | 511 Scope* scope = info()->scope(); |
512 DCHECK_NOT_NULL(graph()); | 512 DCHECK_NOT_NULL(graph()); |
513 | 513 |
514 // Set up the basic structure of the graph. Outputs for {Start} are the formal | 514 // Set up the basic structure of the graph. Outputs for {Start} are the formal |
515 // parameters (including the receiver) plus new target, number of arguments, | 515 // parameters (including the receiver) plus new target, number of arguments, |
516 // context and closure. | 516 // context and closure. |
517 int actual_parameter_count = info()->num_parameters_including_this() + 4; | 517 int actual_parameter_count = info()->num_parameters_including_this() + 4; |
518 graph()->SetStart(graph()->NewNode(common()->Start(actual_parameter_count))); | 518 graph()->SetStart(graph()->NewNode(common()->Start(actual_parameter_count))); |
519 | 519 |
520 // Initialize the top-level environment. | 520 // Initialize the top-level environment. |
521 Environment env(this, scope, graph()->start()); | 521 Environment env(this, scope, graph()->start()); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
561 // Compute local variable liveness information and use it to relax | 561 // Compute local variable liveness information and use it to relax |
562 // frame states. | 562 // frame states. |
563 ClearNonLiveSlotsInFrameStates(); | 563 ClearNonLiveSlotsInFrameStates(); |
564 | 564 |
565 // Failures indicated by stack overflow. | 565 // Failures indicated by stack overflow. |
566 return !HasStackOverflow(); | 566 return !HasStackOverflow(); |
567 } | 567 } |
568 | 568 |
569 | 569 |
570 void AstGraphBuilder::CreateGraphBody(bool stack_check) { | 570 void AstGraphBuilder::CreateGraphBody(bool stack_check) { |
571 DeclarationScope* scope = info()->scope(); | 571 Scope* scope = info()->scope(); |
572 | 572 |
573 // Build the arguments object if it is used. | 573 // Build the arguments object if it is used. |
574 BuildArgumentsObject(scope->arguments()); | 574 BuildArgumentsObject(scope->arguments()); |
575 | 575 |
576 // Build rest arguments array if it is used. | 576 // Build rest arguments array if it is used. |
577 int rest_index; | 577 int rest_index; |
578 Variable* rest_parameter = scope->rest_parameter(&rest_index); | 578 Variable* rest_parameter = scope->rest_parameter(&rest_index); |
579 BuildRestArgumentsArray(rest_parameter, rest_index); | 579 BuildRestArgumentsArray(rest_parameter, rest_index); |
580 | 580 |
581 // Build assignment to {.this_function} variable if it is used. | 581 // Build assignment to {.this_function} variable if it is used. |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
627 } | 627 } |
628 | 628 |
629 | 629 |
630 // Gets the bailout id just before reading a variable proxy, but only for | 630 // Gets the bailout id just before reading a variable proxy, but only for |
631 // unallocated variables. | 631 // unallocated variables. |
632 static BailoutId BeforeId(VariableProxy* proxy) { | 632 static BailoutId BeforeId(VariableProxy* proxy) { |
633 return proxy->var()->IsUnallocatedOrGlobalSlot() ? proxy->BeforeId() | 633 return proxy->var()->IsUnallocatedOrGlobalSlot() ? proxy->BeforeId() |
634 : BailoutId::None(); | 634 : BailoutId::None(); |
635 } | 635 } |
636 | 636 |
637 static const char* GetDebugParameterName(Zone* zone, DeclarationScope* scope, | 637 |
638 int index) { | 638 static const char* GetDebugParameterName(Zone* zone, Scope* scope, int index) { |
639 #if DEBUG | 639 #if DEBUG |
640 const AstRawString* name = scope->parameter(index)->raw_name(); | 640 const AstRawString* name = scope->parameter(index)->raw_name(); |
641 if (name && name->length() > 0) { | 641 if (name && name->length() > 0) { |
642 char* data = zone->NewArray<char>(name->length() + 1); | 642 char* data = zone->NewArray<char>(name->length() + 1); |
643 data[name->length()] = 0; | 643 data[name->length()] = 0; |
644 memcpy(data, name->raw_data(), name->length()); | 644 memcpy(data, name->raw_data(), name->length()); |
645 return data; | 645 return data; |
646 } | 646 } |
647 #endif | 647 #endif |
648 return nullptr; | 648 return nullptr; |
649 } | 649 } |
650 | 650 |
| 651 |
651 AstGraphBuilder::Environment::Environment(AstGraphBuilder* builder, | 652 AstGraphBuilder::Environment::Environment(AstGraphBuilder* builder, |
652 DeclarationScope* scope, | 653 Scope* scope, |
653 Node* control_dependency) | 654 Node* control_dependency) |
654 : builder_(builder), | 655 : builder_(builder), |
655 parameters_count_(scope->num_parameters() + 1), | 656 parameters_count_(scope->num_parameters() + 1), |
656 locals_count_(scope->num_stack_slots()), | 657 locals_count_(scope->num_stack_slots()), |
657 liveness_block_(IsLivenessAnalysisEnabled() | 658 liveness_block_(IsLivenessAnalysisEnabled() |
658 ? builder_->liveness_analyzer()->NewBlock() | 659 ? builder_->liveness_analyzer()->NewBlock() |
659 : nullptr), | 660 : nullptr), |
660 values_(builder_->local_zone()), | 661 values_(builder_->local_zone()), |
661 contexts_(builder_->local_zone()), | 662 contexts_(builder_->local_zone()), |
662 control_dependency_(control_dependency), | 663 control_dependency_(control_dependency), |
(...skipping 2458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3121 Node** all = info()->zone()->NewArray<Node*>(arity); | 3122 Node** all = info()->zone()->NewArray<Node*>(arity); |
3122 for (int i = arity - 1; i >= 0; --i) { | 3123 for (int i = arity - 1; i >= 0; --i) { |
3123 all[i] = environment()->Pop(); | 3124 all[i] = environment()->Pop(); |
3124 } | 3125 } |
3125 Node* value = NewNode(op, arity, all); | 3126 Node* value = NewNode(op, arity, all); |
3126 return value; | 3127 return value; |
3127 } | 3128 } |
3128 | 3129 |
3129 | 3130 |
3130 Node* AstGraphBuilder::BuildLocalActivationContext(Node* context) { | 3131 Node* AstGraphBuilder::BuildLocalActivationContext(Node* context) { |
3131 DeclarationScope* scope = info()->scope(); | 3132 Scope* scope = info()->scope(); |
3132 | 3133 |
3133 // Allocate a new local context. | 3134 // Allocate a new local context. |
3134 Node* local_context = scope->is_script_scope() | 3135 Node* local_context = scope->is_script_scope() |
3135 ? BuildLocalScriptContext(scope) | 3136 ? BuildLocalScriptContext(scope) |
3136 : BuildLocalFunctionContext(scope); | 3137 : BuildLocalFunctionContext(scope); |
3137 | 3138 |
3138 if (scope->has_this_declaration() && scope->receiver()->IsContextSlot()) { | 3139 if (scope->has_this_declaration() && scope->receiver()->IsContextSlot()) { |
3139 Node* receiver = environment()->RawParameterLookup(0); | 3140 Node* receiver = environment()->RawParameterLookup(0); |
3140 // Context variable (at bottom of the context chain). | 3141 // Context variable (at bottom of the context chain). |
3141 Variable* variable = scope->receiver(); | 3142 Variable* variable = scope->receiver(); |
(...skipping 1177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4319 // Phi does not exist yet, introduce one. | 4320 // Phi does not exist yet, introduce one. |
4320 value = NewPhi(inputs, value, control); | 4321 value = NewPhi(inputs, value, control); |
4321 value->ReplaceInput(inputs - 1, other); | 4322 value->ReplaceInput(inputs - 1, other); |
4322 } | 4323 } |
4323 return value; | 4324 return value; |
4324 } | 4325 } |
4325 | 4326 |
4326 } // namespace compiler | 4327 } // namespace compiler |
4327 } // namespace internal | 4328 } // namespace internal |
4328 } // namespace v8 | 4329 } // namespace v8 |
OLD | NEW |