V8 API Reference, 7.2.502.16 (for Deno 0.2.4)
js-heap-copy-reducer.cc
1 // Copyright 2018 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/js-heap-copy-reducer.h"
6 
7 #include "src/compiler/common-operator.h"
8 #include "src/compiler/js-heap-broker.h"
9 #include "src/compiler/js-operator.h"
10 #include "src/compiler/node-properties.h"
11 #include "src/compiler/simplified-operator.h"
12 #include "src/heap/factory-inl.h"
13 #include "src/objects/map.h"
14 #include "src/objects/scope-info.h"
15 
16 namespace v8 {
17 namespace internal {
18 namespace compiler {
19 
20 // In the functions below, we call the ObjectRef (or subclass) constructor in
21 // order to trigger serialization if not yet done.
22 
23 JSHeapCopyReducer::JSHeapCopyReducer(JSHeapBroker* broker) : broker_(broker) {}
24 
25 JSHeapBroker* JSHeapCopyReducer::broker() { return broker_; }
26 
27 Reduction JSHeapCopyReducer::Reduce(Node* node) {
28  switch (node->opcode()) {
29  case IrOpcode::kHeapConstant: {
30  ObjectRef object(broker(), HeapConstantOf(node->op()));
31  if (object.IsJSFunction()) object.AsJSFunction().Serialize();
32  if (object.IsJSObject()) object.AsJSObject().SerializeObjectCreateMap();
33  if (object.IsModule()) object.AsModule().Serialize();
34  if (object.IsContext()) object.AsContext().Serialize();
35  break;
36  }
37  case IrOpcode::kJSCreateArray: {
38  CreateArrayParameters const& p = CreateArrayParametersOf(node->op());
39  Handle<AllocationSite> site;
40  if (p.site().ToHandle(&site)) AllocationSiteRef(broker(), site);
41  break;
42  }
43  case IrOpcode::kJSCreateArguments: {
44  Node* const frame_state = NodeProperties::GetFrameStateInput(node);
45  FrameStateInfo state_info = FrameStateInfoOf(frame_state->op());
46  SharedFunctionInfoRef shared(broker(),
47  state_info.shared_info().ToHandleChecked());
48  break;
49  }
50  case IrOpcode::kJSCreateBlockContext: {
51  ScopeInfoRef(broker(), ScopeInfoOf(node->op()));
52  break;
53  }
54  case IrOpcode::kJSCreateBoundFunction: {
55  CreateBoundFunctionParameters const& p =
56  CreateBoundFunctionParametersOf(node->op());
57  MapRef(broker(), p.map());
58  break;
59  }
60  case IrOpcode::kJSCreateCatchContext: {
61  ScopeInfoRef(broker(), ScopeInfoOf(node->op()));
62  break;
63  }
64  case IrOpcode::kJSCreateClosure: {
65  CreateClosureParameters const& p = CreateClosureParametersOf(node->op());
66  SharedFunctionInfoRef(broker(), p.shared_info());
67  HeapObjectRef(broker(), p.feedback_cell());
68  HeapObjectRef(broker(), p.code());
69  break;
70  }
71  case IrOpcode::kJSCreateEmptyLiteralArray: {
72  FeedbackParameter const& p = FeedbackParameterOf(node->op());
73  FeedbackVectorRef(broker(), p.feedback().vector()).SerializeSlots();
74  break;
75  }
76  case IrOpcode::kJSCreateFunctionContext: {
77  CreateFunctionContextParameters const& p =
78  CreateFunctionContextParametersOf(node->op());
79  ScopeInfoRef(broker(), p.scope_info());
80  break;
81  }
82  case IrOpcode::kJSCreateLiteralArray:
83  case IrOpcode::kJSCreateLiteralObject: {
84  CreateLiteralParameters const& p = CreateLiteralParametersOf(node->op());
85  FeedbackVectorRef(broker(), p.feedback().vector()).SerializeSlots();
86  break;
87  }
88  case IrOpcode::kJSCreateLiteralRegExp: {
89  CreateLiteralParameters const& p = CreateLiteralParametersOf(node->op());
90  FeedbackVectorRef(broker(), p.feedback().vector()).SerializeSlots();
91  break;
92  }
93  case IrOpcode::kJSCreateWithContext: {
94  ScopeInfoRef(broker(), ScopeInfoOf(node->op()));
95  break;
96  }
97  case IrOpcode::kJSLoadNamed:
98  case IrOpcode::kJSStoreNamed: {
99  NamedAccess const& p = NamedAccessOf(node->op());
100  NameRef(broker(), p.name());
101  break;
102  }
103  case IrOpcode::kStoreField:
104  case IrOpcode::kLoadField: {
105  FieldAccess access = FieldAccessOf(node->op());
106  Handle<Map> map_handle;
107  if (access.map.ToHandle(&map_handle)) {
108  MapRef(broker(), map_handle);
109  }
110  Handle<Name> name_handle;
111  if (access.name.ToHandle(&name_handle)) {
112  NameRef(broker(), name_handle);
113  }
114  break;
115  }
116  case IrOpcode::kMapGuard: {
117  ZoneHandleSet<Map> const maps = MapGuardMapsOf(node->op()).maps();
118  for (Handle<Map> map : maps) {
119  MapRef(broker(), map);
120  }
121  break;
122  }
123  case IrOpcode::kCheckMaps: {
124  ZoneHandleSet<Map> const maps = CheckMapsParametersOf(node->op()).maps();
125  for (Handle<Map> map : maps) {
126  MapRef(broker(), map);
127  }
128  break;
129  }
130  case IrOpcode::kCompareMaps: {
131  ZoneHandleSet<Map> const maps =
132  CompareMapsParametersOf(node->op()).maps();
133  for (Handle<Map> map : maps) {
134  MapRef(broker(), map);
135  }
136  break;
137  }
138 
139  default:
140  break;
141  }
142  return NoChange();
143 }
144 
145 } // namespace compiler
146 } // namespace internal
147 } // namespace v8
Definition: libplatform.h:13