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 440 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
451 // It will be replaced with {Dead} after typing and optimizations. | 451 // It will be replaced with {Dead} after typing and optimizations. |
452 NewNode(common()->OsrNormalEntry()); | 452 NewNode(common()->OsrNormalEntry()); |
453 } | 453 } |
454 | 454 |
455 // Initialize the incoming context. | 455 // Initialize the incoming context. |
456 CreateFunctionContext(constant_context); | 456 CreateFunctionContext(constant_context); |
457 ContextScope incoming(this, scope, function_context_.get()); | 457 ContextScope incoming(this, scope, function_context_.get()); |
458 | 458 |
459 // Build receiver check for sloppy mode if necessary. | 459 // Build receiver check for sloppy mode if necessary. |
460 // TODO(mstarzinger/verwaest): Should this be moved back into the CallIC? | 460 // TODO(mstarzinger/verwaest): Should this be moved back into the CallIC? |
461 Node* original_receiver = env.Lookup(scope->receiver()); | 461 if (scope->has_this_declaration()) { |
462 Node* patched_receiver = BuildPatchReceiverToGlobalProxy(original_receiver); | 462 Node* original_receiver = env.Lookup(scope->receiver()); |
463 env.Bind(scope->receiver(), patched_receiver); | 463 Node* patched_receiver = BuildPatchReceiverToGlobalProxy(original_receiver); |
| 464 env.Bind(scope->receiver(), patched_receiver); |
| 465 } |
464 | 466 |
465 // Build function context only if there are context allocated variables. | 467 // Build function context only if there are context allocated variables. |
466 int heap_slots = info()->num_heap_slots() - Context::MIN_CONTEXT_SLOTS; | 468 int heap_slots = info()->num_heap_slots() - Context::MIN_CONTEXT_SLOTS; |
467 if (heap_slots > 0) { | 469 if (heap_slots > 0) { |
468 // Push a new inner context scope for the function. | 470 // Push a new inner context scope for the function. |
469 Node* closure = GetFunctionClosure(); | 471 Node* closure = GetFunctionClosure(); |
470 Node* inner_context = | 472 Node* inner_context = |
471 BuildLocalFunctionContext(function_context_.get(), closure); | 473 BuildLocalFunctionContext(function_context_.get(), closure); |
472 ContextScope top_context(this, scope, inner_context); | 474 ContextScope top_context(this, scope, inner_context); |
473 CreateGraphBody(); | 475 CreateGraphBody(); |
(...skipping 1976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2450 } | 2452 } |
2451 | 2453 |
2452 | 2454 |
2453 Node* AstGraphBuilder::BuildLocalFunctionContext(Node* context, Node* closure) { | 2455 Node* AstGraphBuilder::BuildLocalFunctionContext(Node* context, Node* closure) { |
2454 // Allocate a new local context. | 2456 // Allocate a new local context. |
2455 const Operator* op = javascript()->CreateFunctionContext(); | 2457 const Operator* op = javascript()->CreateFunctionContext(); |
2456 Node* local_context = NewNode(op, closure); | 2458 Node* local_context = NewNode(op, closure); |
2457 | 2459 |
2458 // Copy parameters into context if necessary. | 2460 // Copy parameters into context if necessary. |
2459 int num_parameters = info()->scope()->num_parameters(); | 2461 int num_parameters = info()->scope()->num_parameters(); |
2460 for (int i = 0; i < num_parameters; i++) { | 2462 int first_parameter = info()->scope()->has_this_declaration() ? -1 : 0; |
2461 Variable* variable = info()->scope()->parameter(i); | 2463 for (int i = first_parameter; i < num_parameters; i++) { |
| 2464 Variable* variable = |
| 2465 (i == -1) ? info()->scope()->receiver() : info()->scope()->parameter(i); |
2462 if (!variable->IsContextSlot()) continue; | 2466 if (!variable->IsContextSlot()) continue; |
2463 // Temporary parameter node. The parameter indices are shifted by 1 | 2467 // Temporary parameter node. The parameter indices are shifted by 1 |
2464 // (receiver is parameter index -1 but environment index 0). | 2468 // (receiver is parameter index -1 but environment index 0). |
2465 Node* parameter = NewNode(common()->Parameter(i + 1), graph()->start()); | 2469 Node* parameter = NewNode(common()->Parameter(i + 1), graph()->start()); |
2466 // Context variable (at bottom of the context chain). | 2470 // Context variable (at bottom of the context chain). |
2467 DCHECK_EQ(0, info()->scope()->ContextChainLength(variable->scope())); | 2471 DCHECK_EQ(0, info()->scope()->ContextChainLength(variable->scope())); |
2468 const Operator* op = javascript()->StoreContext(0, variable->index()); | 2472 const Operator* op = javascript()->StoreContext(0, variable->index()); |
2469 NewNode(op, local_context, parameter); | 2473 NewNode(op, local_context, parameter); |
2470 } | 2474 } |
2471 | 2475 |
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3233 // Phi does not exist yet, introduce one. | 3237 // Phi does not exist yet, introduce one. |
3234 value = NewPhi(inputs, value, control); | 3238 value = NewPhi(inputs, value, control); |
3235 value->ReplaceInput(inputs - 1, other); | 3239 value->ReplaceInput(inputs - 1, other); |
3236 } | 3240 } |
3237 return value; | 3241 return value; |
3238 } | 3242 } |
3239 | 3243 |
3240 } // namespace compiler | 3244 } // namespace compiler |
3241 } // namespace internal | 3245 } // namespace internal |
3242 } // namespace v8 | 3246 } // namespace v8 |
OLD | NEW |