• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "src/compiler/frame-states.h"
6 #include "src/compiler/js-context-relaxation.h"
7 #include "src/compiler/js-operator.h"
8 #include "src/compiler/node.h"
9 #include "src/compiler/node-properties.h"
10 
11 namespace v8 {
12 namespace internal {
13 namespace compiler {
14 
Reduce(Node * node)15 Reduction JSContextRelaxation::Reduce(Node* node) {
16   switch (node->opcode()) {
17     case IrOpcode::kJSCallFunction:
18     case IrOpcode::kJSToNumber: {
19       Node* frame_state = NodeProperties::GetFrameStateInput(node, 0);
20       Node* outer_frame = frame_state;
21       Node* original_context = NodeProperties::GetContextInput(node);
22       Node* candidate_new_context = original_context;
23       do {
24         FrameStateInfo frame_state_info(
25             OpParameter<FrameStateInfo>(outer_frame->op()));
26         const FrameStateFunctionInfo* function_info =
27             frame_state_info.function_info();
28         if (function_info == nullptr ||
29             (function_info->context_calling_mode() ==
30              CALL_CHANGES_NATIVE_CONTEXT)) {
31           break;
32         }
33         candidate_new_context = outer_frame->InputAt(kFrameStateContextInput);
34         outer_frame = outer_frame->InputAt(kFrameStateOuterStateInput);
35       } while (outer_frame->opcode() == IrOpcode::kFrameState);
36 
37       while (true) {
38         switch (candidate_new_context->opcode()) {
39           case IrOpcode::kParameter:
40           case IrOpcode::kJSCreateModuleContext:
41           case IrOpcode::kJSCreateScriptContext:
42             if (candidate_new_context != original_context) {
43               NodeProperties::ReplaceContextInput(node, candidate_new_context);
44               return Changed(node);
45             } else {
46               return NoChange();
47             }
48           case IrOpcode::kJSCreateCatchContext:
49           case IrOpcode::kJSCreateWithContext:
50           case IrOpcode::kJSCreateBlockContext:
51             candidate_new_context =
52                 NodeProperties::GetContextInput(candidate_new_context);
53             break;
54           default:
55             return NoChange();
56         }
57       }
58     }
59     default:
60       break;
61   }
62   return NoChange();
63 }
64 
65 }  // namespace compiler
66 }  // namespace internal
67 }  // namespace v8
68