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/heap/factory-inl.h"
11 #include "src/objects/map.h"
12 #include "src/objects/scope-info.h"
13
14 namespace v8 {
15 namespace internal {
16 namespace compiler {
17
18 // In the functions below, we call the ObjectRef (or subclass) constructor in
19 // order to trigger serialization if not yet done.
20
JSHeapCopyReducer(JSHeapBroker * broker)21 JSHeapCopyReducer::JSHeapCopyReducer(JSHeapBroker* broker) : broker_(broker) {}
22
broker()23 JSHeapBroker* JSHeapCopyReducer::broker() { return broker_; }
24
Reduce(Node * node)25 Reduction JSHeapCopyReducer::Reduce(Node* node) {
26 switch (node->opcode()) {
27 case IrOpcode::kHeapConstant: {
28 ObjectRef(broker(), HeapConstantOf(node->op()));
29 break;
30 }
31 case IrOpcode::kJSCreateArray: {
32 CreateArrayParameters const& p = CreateArrayParametersOf(node->op());
33 Handle<AllocationSite> site;
34 if (p.site().ToHandle(&site)) AllocationSiteRef(broker(), site);
35 break;
36 }
37 case IrOpcode::kJSCreateCatchContext: {
38 ScopeInfoRef(broker(), ScopeInfoOf(node->op()));
39 break;
40 }
41 case IrOpcode::kJSCreateClosure: {
42 CreateClosureParameters const& p = CreateClosureParametersOf(node->op());
43 SharedFunctionInfoRef(broker(), p.shared_info());
44 HeapObjectRef(broker(), p.feedback_cell());
45 HeapObjectRef(broker(), p.code());
46 break;
47 }
48 case IrOpcode::kJSCreateEmptyLiteralArray: {
49 // TODO(neis, jarin) Force serialization of the entire feedback vector
50 // rather than just the one element.
51 FeedbackParameter const& p = FeedbackParameterOf(node->op());
52 FeedbackVectorRef(broker(), p.feedback().vector());
53 Handle<Object> feedback(
54 p.feedback().vector()->Get(p.feedback().slot())->ToObject(),
55 broker()->isolate());
56 ObjectRef(broker(), feedback);
57 break;
58 }
59 case IrOpcode::kJSCreateFunctionContext: {
60 CreateFunctionContextParameters const& p =
61 CreateFunctionContextParametersOf(node->op());
62 ScopeInfoRef(broker(), p.scope_info());
63 break;
64 }
65 case IrOpcode::kJSCreateLiteralArray:
66 case IrOpcode::kJSCreateLiteralObject: {
67 CreateLiteralParameters const& p = CreateLiteralParametersOf(node->op());
68 ObjectRef(broker(), p.feedback().vector());
69 break;
70 }
71 case IrOpcode::kJSLoadNamed:
72 case IrOpcode::kJSStoreNamed: {
73 NamedAccess const& p = NamedAccessOf(node->op());
74 NameRef(broker(), p.name());
75 break;
76 }
77 default:
78 break;
79 }
80 return NoChange();
81 }
82
83 } // namespace compiler
84 } // namespace internal
85 } // namespace v8
86