blob: 4bc8ef6134e956d1a11c50884ba36513b3b81f35 [file] [log] [blame]
Ben Murdochc8c1d9e2017-03-08 14:04:23 +00001// Copyright 2016 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#ifndef V8_IC_HANDLER_CONFIGURATION_INL_H_
6#define V8_IC_HANDLER_CONFIGURATION_INL_H_
7
8#include "src/ic/handler-configuration.h"
9
Rubin Xu7bc1b612021-02-16 09:38:50 +000010#include "src/handles/handles-inl.h"
11#include "src/objects/data-handler-inl.h"
12#include "src/objects/field-index-inl.h"
13#include "src/objects/objects-inl.h"
14#include "src/objects/smi.h"
15
16// Has to be the last include (doesn't have include guards):
17#include "src/objects/object-macros.h"
Ben Murdochc8c1d9e2017-03-08 14:04:23 +000018
19namespace v8 {
20namespace internal {
21
Rubin Xu7bc1b612021-02-16 09:38:50 +000022OBJECT_CONSTRUCTORS_IMPL(LoadHandler, DataHandler)
23
24CAST_ACCESSOR(LoadHandler)
25
26// Decodes kind from Smi-handler.
27LoadHandler::Kind LoadHandler::GetHandlerKind(Smi smi_handler) {
28 return KindBits::decode(smi_handler.value());
29}
30
31Handle<Smi> LoadHandler::LoadNormal(Isolate* isolate) {
32 int config = KindBits::encode(kNormal);
33 return handle(Smi::FromInt(config), isolate);
34}
35
36Handle<Smi> LoadHandler::LoadGlobal(Isolate* isolate) {
37 int config = KindBits::encode(kGlobal);
38 return handle(Smi::FromInt(config), isolate);
39}
40
41Handle<Smi> LoadHandler::LoadInterceptor(Isolate* isolate) {
42 int config = KindBits::encode(kInterceptor);
43 return handle(Smi::FromInt(config), isolate);
44}
45
46Handle<Smi> LoadHandler::LoadSlow(Isolate* isolate) {
47 int config = KindBits::encode(kSlow);
48 return handle(Smi::FromInt(config), isolate);
49}
50
51Handle<Smi> LoadHandler::LoadField(Isolate* isolate, FieldIndex field_index,
52 ElementsKind kind) {
53 int config = KindBits::encode(kField) |
Ben Murdochc8c1d9e2017-03-08 14:04:23 +000054 IsInobjectBits::encode(field_index.is_inobject()) |
55 IsDoubleBits::encode(field_index.is_double()) |
Rubin Xu7bc1b612021-02-16 09:38:50 +000056 FieldIndexBits::encode(field_index.index()) |
57 CompactElementsKindBits::encode(ToCompactElementsKind(kind));
Ben Murdochc8c1d9e2017-03-08 14:04:23 +000058 return handle(Smi::FromInt(config), isolate);
59}
60
Rubin Xu7bc1b612021-02-16 09:38:50 +000061Handle<Smi> LoadHandler::LoadConstantFromPrototype(Isolate* isolate,
62 ElementsKind kind) {
63 int config = KindBits::encode(kConstantFromPrototype) |
64 CompactElementsKindBits::encode(ToCompactElementsKind(kind));
Ben Murdochc8c1d9e2017-03-08 14:04:23 +000065 return handle(Smi::FromInt(config), isolate);
66}
67
Rubin Xu7bc1b612021-02-16 09:38:50 +000068Handle<Smi> LoadHandler::LoadAccessor(Isolate* isolate, int descriptor) {
69 int config = KindBits::encode(kAccessor) | DescriptorBits::encode(descriptor);
Ben Murdochc8c1d9e2017-03-08 14:04:23 +000070 return handle(Smi::FromInt(config), isolate);
71}
72
Rubin Xu7bc1b612021-02-16 09:38:50 +000073Handle<Smi> LoadHandler::LoadProxy(Isolate* isolate) {
74 int config = KindBits::encode(kProxy);
Ben Murdochc8c1d9e2017-03-08 14:04:23 +000075 return handle(Smi::FromInt(config), isolate);
76}
77
Rubin Xu7bc1b612021-02-16 09:38:50 +000078Handle<Smi> LoadHandler::LoadNativeDataProperty(Isolate* isolate,
79 int descriptor) {
80 int config = KindBits::encode(kNativeDataProperty) |
81 DescriptorBits::encode(descriptor);
Ben Murdochc8c1d9e2017-03-08 14:04:23 +000082 return handle(Smi::FromInt(config), isolate);
83}
84
Rubin Xu7bc1b612021-02-16 09:38:50 +000085Handle<Smi> LoadHandler::LoadApiGetter(Isolate* isolate,
86 bool holder_is_receiver) {
87 int config = KindBits::encode(
88 holder_is_receiver ? kApiGetter : kApiGetterHolderIsPrototype);
89 return handle(Smi::FromInt(config), isolate);
90}
91
92Handle<Smi> LoadHandler::LoadModuleExport(Isolate* isolate, int index) {
Ben Murdochc8c1d9e2017-03-08 14:04:23 +000093 int config =
Rubin Xu7bc1b612021-02-16 09:38:50 +000094 KindBits::encode(kModuleExport) | ExportsIndexBits::encode(index);
Ben Murdochc8c1d9e2017-03-08 14:04:23 +000095 return handle(Smi::FromInt(config), isolate);
96}
97
Rubin Xu7bc1b612021-02-16 09:38:50 +000098Handle<Smi> LoadHandler::LoadNonExistent(Isolate* isolate) {
99 int config = KindBits::encode(kNonExistent);
Ben Murdochc8c1d9e2017-03-08 14:04:23 +0000100 return handle(Smi::FromInt(config), isolate);
101}
102
Rubin Xu7bc1b612021-02-16 09:38:50 +0000103Handle<Smi> LoadHandler::LoadElement(Isolate* isolate,
104 ElementsKind elements_kind,
105 bool convert_hole_to_undefined,
106 bool is_js_array,
107 KeyedAccessLoadMode load_mode) {
108 int config =
109 KindBits::encode(kElement) |
110 AllowOutOfBoundsBits::encode(load_mode == LOAD_IGNORE_OUT_OF_BOUNDS) |
111 ElementsKindBits::encode(elements_kind) |
112 ConvertHoleBits::encode(convert_hole_to_undefined) |
113 IsJsArrayBits::encode(is_js_array);
Ben Murdochc8c1d9e2017-03-08 14:04:23 +0000114 return handle(Smi::FromInt(config), isolate);
115}
116
Rubin Xu7bc1b612021-02-16 09:38:50 +0000117Handle<Smi> LoadHandler::LoadIndexedString(Isolate* isolate,
118 KeyedAccessLoadMode load_mode) {
119 int config =
120 KindBits::encode(kIndexedString) |
121 AllowOutOfBoundsBits::encode(load_mode == LOAD_IGNORE_OUT_OF_BOUNDS);
122 return handle(Smi::FromInt(config), isolate);
Ben Murdochc8c1d9e2017-03-08 14:04:23 +0000123}
124
Rubin Xu7bc1b612021-02-16 09:38:50 +0000125OBJECT_CONSTRUCTORS_IMPL(StoreHandler, DataHandler)
126
127CAST_ACCESSOR(StoreHandler)
128
129Handle<Smi> StoreHandler::StoreGlobalProxy(Isolate* isolate) {
130 int config = KindBits::encode(kGlobalProxy);
131 return handle(Smi::FromInt(config), isolate);
Ben Murdochc8c1d9e2017-03-08 14:04:23 +0000132}
133
Rubin Xu7bc1b612021-02-16 09:38:50 +0000134Handle<Smi> StoreHandler::StoreNormal(Isolate* isolate) {
135 int config = KindBits::encode(kNormal);
136 return handle(Smi::FromInt(config), isolate);
137}
138
139Handle<Smi> StoreHandler::StoreInterceptor(Isolate* isolate) {
140 int config = KindBits::encode(kInterceptor);
141 return handle(Smi::FromInt(config), isolate);
142}
143
144Handle<Smi> StoreHandler::StoreSlow(Isolate* isolate,
145 KeyedAccessStoreMode store_mode) {
146 int config =
147 KindBits::encode(kSlow) | KeyedAccessStoreModeBits::encode(store_mode);
148 return handle(Smi::FromInt(config), isolate);
149}
150
151Handle<Smi> StoreHandler::StoreProxy(Isolate* isolate) {
152 int config = KindBits::encode(kProxy);
153 return handle(Smi::FromInt(config), isolate);
154}
155
156Handle<Smi> StoreHandler::StoreField(Isolate* isolate, Kind kind,
157 int descriptor, FieldIndex field_index,
158 Representation representation) {
159 DCHECK(!representation.IsNone());
160 DCHECK(kind == kField || kind == kConstField);
161
162 int config = KindBits::encode(kind) |
163 IsInobjectBits::encode(field_index.is_inobject()) |
164 RepresentationBits::encode(representation.kind()) |
165 DescriptorBits::encode(descriptor) |
166 FieldIndexBits::encode(field_index.index());
167 return handle(Smi::FromInt(config), isolate);
168}
169
170Handle<Smi> StoreHandler::StoreField(Isolate* isolate, int descriptor,
171 FieldIndex field_index,
172 PropertyConstness constness,
173 Representation representation) {
174 Kind kind = constness == PropertyConstness::kMutable ? kField : kConstField;
175 return StoreField(isolate, kind, descriptor, field_index, representation);
176}
177
178Handle<Smi> StoreHandler::StoreNativeDataProperty(Isolate* isolate,
Ben Murdochc8c1d9e2017-03-08 14:04:23 +0000179 int descriptor) {
Rubin Xu7bc1b612021-02-16 09:38:50 +0000180 int config = KindBits::encode(kNativeDataProperty) |
181 DescriptorBits::encode(descriptor);
182 return handle(Smi::FromInt(config), isolate);
183}
184
185Handle<Smi> StoreHandler::StoreAccessor(Isolate* isolate, int descriptor) {
186 int config = KindBits::encode(kAccessor) | DescriptorBits::encode(descriptor);
187 return handle(Smi::FromInt(config), isolate);
188}
189
190Handle<Smi> StoreHandler::StoreApiSetter(Isolate* isolate,
191 bool holder_is_receiver) {
192 int config = KindBits::encode(
193 holder_is_receiver ? kApiSetter : kApiSetterHolderIsPrototype);
Ben Murdochc8c1d9e2017-03-08 14:04:23 +0000194 return handle(Smi::FromInt(config), isolate);
195}
196
197} // namespace internal
198} // namespace v8
199
Rubin Xu7bc1b612021-02-16 09:38:50 +0000200#include "src/objects/object-macros-undef.h"
201
Ben Murdochc8c1d9e2017-03-08 14:04:23 +0000202#endif // V8_IC_HANDLER_CONFIGURATION_INL_H_