blob: 860ad2afd139c7e5a1fd224e389335e8cc549bad [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// Copyright 2012 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
Ben Murdochb8a8cc12014-11-26 15:28:44 +00005#include "src/interface-descriptors.h"
6
7namespace v8 {
8namespace internal {
9
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000010namespace {
11// Constructors for common combined semantic and representation types.
12Type* SmiType(Zone* zone) {
13 return Type::Intersect(Type::SignedSmall(), Type::TaggedSigned(), zone);
14}
15
16
17Type* UntaggedIntegral32(Zone* zone) {
18 return Type::Intersect(Type::Signed32(), Type::UntaggedIntegral32(), zone);
19}
20
21
22Type* AnyTagged(Zone* zone) {
23 return Type::Intersect(
24 Type::Any(),
25 Type::Union(Type::TaggedPointer(), Type::TaggedSigned(), zone), zone);
26}
27
28
29Type* ExternalPointer(Zone* zone) {
30 return Type::Intersect(Type::Internal(), Type::UntaggedPointer(), zone);
31}
32} // namespace
33
Ben Murdoch097c5b22016-05-18 11:27:45 +010034FunctionType* CallInterfaceDescriptor::BuildDefaultFunctionType(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000035 Isolate* isolate, int parameter_count) {
36 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +010037 FunctionType* function =
38 Type::Function(AnyTagged(zone), Type::Undefined(), parameter_count, zone)
39 ->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000040 while (parameter_count-- != 0) {
41 function->InitParameter(parameter_count, AnyTagged(zone));
42 }
43 return function;
44}
45
46
47void CallInterfaceDescriptorData::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +000048 int register_parameter_count, Register* registers,
Ben Murdochb8a8cc12014-11-26 15:28:44 +000049 PlatformInterfaceDescriptor* platform_descriptor) {
50 platform_specific_descriptor_ = platform_descriptor;
51 register_param_count_ = register_parameter_count;
52
Ben Murdochb8a8cc12014-11-26 15:28:44 +000053 // InterfaceDescriptor owns a copy of the registers array.
54 register_params_.Reset(NewArray<Register>(register_parameter_count));
55 for (int i = 0; i < register_parameter_count; i++) {
56 register_params_[i] = registers[i];
57 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +000058}
59
Emily Bernierd0a1eb72015-03-24 16:35:39 -040060const char* CallInterfaceDescriptor::DebugName(Isolate* isolate) const {
Ben Murdochb8a8cc12014-11-26 15:28:44 +000061 CallInterfaceDescriptorData* start = isolate->call_descriptor_data(0);
62 size_t index = data_ - start;
63 DCHECK(index < CallDescriptors::NUMBER_OF_DESCRIPTORS);
64 CallDescriptors::Key key = static_cast<CallDescriptors::Key>(index);
65 switch (key) {
66#define DEF_CASE(NAME) \
67 case CallDescriptors::NAME: \
68 return #NAME " Descriptor";
69 INTERFACE_DESCRIPTOR_LIST(DEF_CASE)
70#undef DEF_CASE
71 case CallDescriptors::NUMBER_OF_DESCRIPTORS:
72 break;
73 }
74 return "";
75}
76
77
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000078void VoidDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +000079 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000080 data->InitializePlatformSpecific(0, nullptr);
Ben Murdochb8a8cc12014-11-26 15:28:44 +000081}
82
Ben Murdoch097c5b22016-05-18 11:27:45 +010083FunctionType* LoadDescriptor::BuildCallInterfaceDescriptorFunctionType(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000084 Isolate* isolate, int paramater_count) {
85 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +010086 FunctionType* function =
87 Type::Function(AnyTagged(zone), Type::Undefined(), 3, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000088 function->InitParameter(0, AnyTagged(zone));
89 function->InitParameter(1, AnyTagged(zone));
90 function->InitParameter(2, SmiType(zone));
91 return function;
92}
93
94
95void LoadDescriptor::InitializePlatformSpecific(
96 CallInterfaceDescriptorData* data) {
97 Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister()};
98 data->InitializePlatformSpecific(arraysize(registers), registers);
99}
100
101
102void StoreDescriptor::InitializePlatformSpecific(
103 CallInterfaceDescriptorData* data) {
104 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister()};
105 data->InitializePlatformSpecific(arraysize(registers), registers);
106}
107
108
109void StoreTransitionDescriptor::InitializePlatformSpecific(
110 CallInterfaceDescriptorData* data) {
111 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
112 MapRegister()};
113
114 data->InitializePlatformSpecific(arraysize(registers), registers);
115}
116
117
118void VectorStoreTransitionDescriptor::InitializePlatformSpecific(
119 CallInterfaceDescriptorData* data) {
120 if (SlotRegister().is(no_reg)) {
121 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
122 MapRegister(), VectorRegister()};
123 data->InitializePlatformSpecific(arraysize(registers), registers);
124 } else {
125 Register registers[] = {ReceiverRegister(), NameRegister(),
126 ValueRegister(), MapRegister(),
127 SlotRegister(), VectorRegister()};
128 data->InitializePlatformSpecific(arraysize(registers), registers);
129 }
130}
131
Ben Murdoch097c5b22016-05-18 11:27:45 +0100132FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000133StoreTransitionDescriptor::BuildCallInterfaceDescriptorFunctionType(
134 Isolate* isolate, int paramater_count) {
135 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100136 FunctionType* function =
137 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000138 function->InitParameter(0, AnyTagged(zone)); // Receiver
139 function->InitParameter(1, AnyTagged(zone)); // Name
140 function->InitParameter(2, AnyTagged(zone)); // Value
141 function->InitParameter(3, AnyTagged(zone)); // Map
142 return function;
143}
144
Ben Murdoch097c5b22016-05-18 11:27:45 +0100145FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000146LoadGlobalViaContextDescriptor::BuildCallInterfaceDescriptorFunctionType(
147 Isolate* isolate, int paramater_count) {
148 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100149 FunctionType* function =
150 Type::Function(AnyTagged(zone), Type::Undefined(), 1, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000151 function->InitParameter(0, UntaggedIntegral32(zone));
152 return function;
153}
154
155
156void LoadGlobalViaContextDescriptor::InitializePlatformSpecific(
157 CallInterfaceDescriptorData* data) {
158 Register registers[] = {SlotRegister()};
159 data->InitializePlatformSpecific(arraysize(registers), registers);
160}
161
Ben Murdoch097c5b22016-05-18 11:27:45 +0100162FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000163StoreGlobalViaContextDescriptor::BuildCallInterfaceDescriptorFunctionType(
164 Isolate* isolate, int paramater_count) {
165 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100166 FunctionType* function =
167 Type::Function(AnyTagged(zone), Type::Undefined(), 2, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000168 function->InitParameter(0, UntaggedIntegral32(zone));
169 function->InitParameter(1, AnyTagged(zone));
170 return function;
171}
172
173
174void StoreGlobalViaContextDescriptor::InitializePlatformSpecific(
175 CallInterfaceDescriptorData* data) {
176 Register registers[] = {SlotRegister(), ValueRegister()};
177 data->InitializePlatformSpecific(arraysize(registers), registers);
178}
179
180
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000181void StringCompareDescriptor::InitializePlatformSpecific(
182 CallInterfaceDescriptorData* data) {
183 Register registers[] = {LeftRegister(), RightRegister()};
184 data->InitializePlatformSpecific(arraysize(registers), registers);
185}
186
Ben Murdochda12d292016-06-02 14:46:10 +0100187void TypeConversionDescriptor::InitializePlatformSpecific(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000188 CallInterfaceDescriptorData* data) {
Ben Murdochda12d292016-06-02 14:46:10 +0100189 Register registers[] = {ArgumentRegister()};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000190 data->InitializePlatformSpecific(arraysize(registers), registers);
191}
192
Ben Murdochc5610432016-08-08 18:44:38 +0100193void HasPropertyDescriptor::InitializePlatformSpecific(
194 CallInterfaceDescriptorData* data) {
195 Register registers[] = {KeyRegister(), ObjectRegister()};
196 data->InitializePlatformSpecific(arraysize(registers), registers);
197}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000198
199void MathPowTaggedDescriptor::InitializePlatformSpecific(
200 CallInterfaceDescriptorData* data) {
201 Register registers[] = {exponent()};
202 data->InitializePlatformSpecific(arraysize(registers), registers);
203}
204
205
206void MathPowIntegerDescriptor::InitializePlatformSpecific(
207 CallInterfaceDescriptorData* data) {
208 Register registers[] = {exponent()};
209 data->InitializePlatformSpecific(arraysize(registers), registers);
210}
211
Ben Murdoch097c5b22016-05-18 11:27:45 +0100212FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000213LoadWithVectorDescriptor::BuildCallInterfaceDescriptorFunctionType(
214 Isolate* isolate, int paramater_count) {
215 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100216 FunctionType* function =
217 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000218 function->InitParameter(0, AnyTagged(zone));
219 function->InitParameter(1, AnyTagged(zone));
220 function->InitParameter(2, SmiType(zone));
221 function->InitParameter(3, AnyTagged(zone));
222 return function;
223}
224
225
226void LoadWithVectorDescriptor::InitializePlatformSpecific(
227 CallInterfaceDescriptorData* data) {
228 Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister(),
229 VectorRegister()};
230 data->InitializePlatformSpecific(arraysize(registers), registers);
231}
232
Ben Murdoch097c5b22016-05-18 11:27:45 +0100233FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000234VectorStoreTransitionDescriptor::BuildCallInterfaceDescriptorFunctionType(
235 Isolate* isolate, int paramater_count) {
236 Zone* zone = isolate->interface_descriptor_zone();
237 bool has_slot = !VectorStoreTransitionDescriptor::SlotRegister().is(no_reg);
238 int arg_count = has_slot ? 6 : 5;
Ben Murdoch097c5b22016-05-18 11:27:45 +0100239 FunctionType* function =
240 Type::Function(AnyTagged(zone), Type::Undefined(), arg_count, zone)
241 ->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000242 int index = 0;
243 function->InitParameter(index++, AnyTagged(zone)); // receiver
244 function->InitParameter(index++, AnyTagged(zone)); // name
245 function->InitParameter(index++, AnyTagged(zone)); // value
246 function->InitParameter(index++, AnyTagged(zone)); // map
247 if (has_slot) {
248 function->InitParameter(index++, SmiType(zone)); // slot
249 }
250 function->InitParameter(index++, AnyTagged(zone)); // vector
251 return function;
252}
253
Ben Murdoch097c5b22016-05-18 11:27:45 +0100254FunctionType* VectorStoreICDescriptor::BuildCallInterfaceDescriptorFunctionType(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000255 Isolate* isolate, int paramater_count) {
256 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100257 FunctionType* function =
258 Type::Function(AnyTagged(zone), Type::Undefined(), 5, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000259 function->InitParameter(0, AnyTagged(zone));
260 function->InitParameter(1, AnyTagged(zone));
261 function->InitParameter(2, AnyTagged(zone));
262 function->InitParameter(3, SmiType(zone));
263 function->InitParameter(4, AnyTagged(zone));
264 return function;
265}
266
267
268void VectorStoreICDescriptor::InitializePlatformSpecific(
269 CallInterfaceDescriptorData* data) {
270 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000271 SlotRegister(), VectorRegister()};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000272 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000273}
274
Ben Murdoch097c5b22016-05-18 11:27:45 +0100275FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000276VectorStoreICTrampolineDescriptor::BuildCallInterfaceDescriptorFunctionType(
277 Isolate* isolate, int paramater_count) {
278 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100279 FunctionType* function =
280 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000281 function->InitParameter(0, AnyTagged(zone));
282 function->InitParameter(1, AnyTagged(zone));
283 function->InitParameter(2, AnyTagged(zone));
284 function->InitParameter(3, SmiType(zone));
285 return function;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000286}
287
288
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000289void VectorStoreICTrampolineDescriptor::InitializePlatformSpecific(
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000290 CallInterfaceDescriptorData* data) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000291 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(),
292 SlotRegister()};
293 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000294}
295
Ben Murdochc5610432016-08-08 18:44:38 +0100296const Register ApiGetterDescriptor::ReceiverRegister() {
297 return LoadDescriptor::ReceiverRegister();
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000298}
299
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000300void ApiGetterDescriptor::InitializePlatformSpecific(
301 CallInterfaceDescriptorData* data) {
Ben Murdochc5610432016-08-08 18:44:38 +0100302 Register registers[] = {ReceiverRegister(), HolderRegister(),
303 CallbackRegister()};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000304 data->InitializePlatformSpecific(arraysize(registers), registers);
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000305}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000306
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000307void ContextOnlyDescriptor::InitializePlatformSpecific(
308 CallInterfaceDescriptorData* data) {
309 data->InitializePlatformSpecific(0, nullptr);
310}
311
312
313void GrowArrayElementsDescriptor::InitializePlatformSpecific(
314 CallInterfaceDescriptorData* data) {
315 Register registers[] = {ObjectRegister(), KeyRegister()};
316 data->InitializePlatformSpecific(arraysize(registers), registers);
317}
318
Ben Murdochda12d292016-06-02 14:46:10 +0100319FunctionType* FastArrayPushDescriptor::BuildCallInterfaceDescriptorFunctionType(
320 Isolate* isolate, int paramater_count) {
321 Zone* zone = isolate->interface_descriptor_zone();
322 FunctionType* function =
323 Type::Function(AnyTagged(zone), AnyTagged(zone), 1, zone)->AsFunction();
324 function->InitParameter(0, UntaggedIntegral32(zone)); // actual #arguments
325 return function;
326}
327
Ben Murdoch097c5b22016-05-18 11:27:45 +0100328FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000329FastCloneRegExpDescriptor::BuildCallInterfaceDescriptorFunctionType(
330 Isolate* isolate, int paramater_count) {
331 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100332 FunctionType* function =
333 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000334 function->InitParameter(0, AnyTagged(zone)); // closure
335 function->InitParameter(1, SmiType(zone)); // literal_index
336 function->InitParameter(2, AnyTagged(zone)); // pattern
337 function->InitParameter(3, AnyTagged(zone)); // flags
338 return function;
339}
340
Ben Murdoch097c5b22016-05-18 11:27:45 +0100341FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000342FastCloneShallowArrayDescriptor::BuildCallInterfaceDescriptorFunctionType(
343 Isolate* isolate, int paramater_count) {
344 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100345 FunctionType* function =
346 Type::Function(AnyTagged(zone), Type::Undefined(), 3, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000347 function->InitParameter(0, AnyTagged(zone));
348 function->InitParameter(1, SmiType(zone));
349 function->InitParameter(2, AnyTagged(zone));
350 return function;
351}
352
Ben Murdoch097c5b22016-05-18 11:27:45 +0100353FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000354CreateAllocationSiteDescriptor::BuildCallInterfaceDescriptorFunctionType(
355 Isolate* isolate, int paramater_count) {
356 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100357 FunctionType* function =
358 Type::Function(AnyTagged(zone), Type::Undefined(), 2, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000359 function->InitParameter(0, AnyTagged(zone));
360 function->InitParameter(1, SmiType(zone));
361 return function;
362}
363
Ben Murdoch097c5b22016-05-18 11:27:45 +0100364FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000365CreateWeakCellDescriptor::BuildCallInterfaceDescriptorFunctionType(
366 Isolate* isolate, int paramater_count) {
367 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100368 FunctionType* function =
369 Type::Function(AnyTagged(zone), Type::Undefined(), 3, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000370 function->InitParameter(0, AnyTagged(zone));
371 function->InitParameter(1, SmiType(zone));
372 function->InitParameter(2, AnyTagged(zone));
373 return function;
374}
375
Ben Murdoch097c5b22016-05-18 11:27:45 +0100376FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000377CallTrampolineDescriptor::BuildCallInterfaceDescriptorFunctionType(
378 Isolate* isolate, int paramater_count) {
379 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100380 FunctionType* function =
381 Type::Function(AnyTagged(zone), Type::Undefined(), 2, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000382 function->InitParameter(0, AnyTagged(zone)); // target
383 function->InitParameter(1, UntaggedIntegral32(zone)); // actual #arguments
384 return function;
385}
386
Ben Murdoch097c5b22016-05-18 11:27:45 +0100387FunctionType* ConstructStubDescriptor::BuildCallInterfaceDescriptorFunctionType(
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000388 Isolate* isolate, int paramater_count) {
389 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100390 FunctionType* function =
391 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000392 function->InitParameter(0, AnyTagged(zone)); // target
393 function->InitParameter(1, AnyTagged(zone)); // new.target
394 function->InitParameter(2, UntaggedIntegral32(zone)); // actual #arguments
395 function->InitParameter(3, AnyTagged(zone)); // opt. allocation site
396 return function;
397}
398
Ben Murdoch097c5b22016-05-18 11:27:45 +0100399FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000400ConstructTrampolineDescriptor::BuildCallInterfaceDescriptorFunctionType(
401 Isolate* isolate, int paramater_count) {
402 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100403 FunctionType* function =
404 Type::Function(AnyTagged(zone), Type::Undefined(), 3, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000405 function->InitParameter(0, AnyTagged(zone)); // target
406 function->InitParameter(1, AnyTagged(zone)); // new.target
407 function->InitParameter(2, UntaggedIntegral32(zone)); // actual #arguments
408 return function;
409}
410
Ben Murdoch097c5b22016-05-18 11:27:45 +0100411FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000412CallFunctionWithFeedbackDescriptor::BuildCallInterfaceDescriptorFunctionType(
413 Isolate* isolate, int paramater_count) {
414 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100415 FunctionType* function =
416 Type::Function(AnyTagged(zone), Type::Undefined(), 2, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000417 function->InitParameter(0, Type::Receiver()); // JSFunction
418 function->InitParameter(1, SmiType(zone));
419 return function;
420}
421
Ben Murdoch097c5b22016-05-18 11:27:45 +0100422FunctionType* CallFunctionWithFeedbackAndVectorDescriptor::
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000423 BuildCallInterfaceDescriptorFunctionType(Isolate* isolate,
424 int paramater_count) {
425 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100426 FunctionType* function =
427 Type::Function(AnyTagged(zone), Type::Undefined(), 3, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000428 function->InitParameter(0, Type::Receiver()); // JSFunction
429 function->InitParameter(1, SmiType(zone));
430 function->InitParameter(2, AnyTagged(zone));
431 return function;
432}
433
Ben Murdoch097c5b22016-05-18 11:27:45 +0100434FunctionType*
Ben Murdochc5610432016-08-08 18:44:38 +0100435ArrayNoArgumentConstructorDescriptor::BuildCallInterfaceDescriptorFunctionType(
436 Isolate* isolate, int paramater_count) {
437 Zone* zone = isolate->interface_descriptor_zone();
438 FunctionType* function =
439 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
440 function->InitParameter(0, Type::Receiver()); // JSFunction
441 function->InitParameter(1, AnyTagged(zone));
442 function->InitParameter(2, UntaggedIntegral32(zone));
443 function->InitParameter(3, AnyTagged(zone));
444 return function;
445}
446
447FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000448ArrayConstructorDescriptor::BuildCallInterfaceDescriptorFunctionType(
449 Isolate* isolate, int paramater_count) {
450 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100451 FunctionType* function =
452 Type::Function(AnyTagged(zone), Type::Undefined(), 3, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000453 function->InitParameter(0, Type::Receiver()); // JSFunction
454 function->InitParameter(1, AnyTagged(zone));
455 function->InitParameter(2, UntaggedIntegral32(zone));
456 return function;
457}
458
Ben Murdoch097c5b22016-05-18 11:27:45 +0100459FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000460InternalArrayConstructorDescriptor::BuildCallInterfaceDescriptorFunctionType(
461 Isolate* isolate, int paramater_count) {
462 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100463 FunctionType* function =
464 Type::Function(AnyTagged(zone), Type::Undefined(), 2, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000465 function->InitParameter(0, Type::Receiver()); // JSFunction
466 function->InitParameter(1, UntaggedIntegral32(zone));
467 return function;
468}
469
Ben Murdoch097c5b22016-05-18 11:27:45 +0100470FunctionType*
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000471ArgumentAdaptorDescriptor::BuildCallInterfaceDescriptorFunctionType(
472 Isolate* isolate, int paramater_count) {
473 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100474 FunctionType* function =
475 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000476 function->InitParameter(0, Type::Receiver()); // JSFunction
477 function->InitParameter(1, AnyTagged(zone)); // the new target
478 function->InitParameter(2, UntaggedIntegral32(zone)); // actual #arguments
479 function->InitParameter(3, UntaggedIntegral32(zone)); // expected #arguments
480 return function;
481}
482
Ben Murdochda12d292016-06-02 14:46:10 +0100483CallInterfaceDescriptor ApiCallbackDescriptorBase::ForArgs(Isolate* isolate,
484 int argc) {
485 switch (argc) {
486 case 0:
487 return ApiCallbackWith0ArgsDescriptor(isolate);
488 case 1:
489 return ApiCallbackWith1ArgsDescriptor(isolate);
490 case 2:
491 return ApiCallbackWith2ArgsDescriptor(isolate);
492 case 3:
493 return ApiCallbackWith3ArgsDescriptor(isolate);
494 case 4:
495 return ApiCallbackWith4ArgsDescriptor(isolate);
496 case 5:
497 return ApiCallbackWith5ArgsDescriptor(isolate);
498 case 6:
499 return ApiCallbackWith6ArgsDescriptor(isolate);
500 case 7:
501 return ApiCallbackWith7ArgsDescriptor(isolate);
502 default:
503 UNREACHABLE();
504 return VoidDescriptor(isolate);
505 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000506}
507
Ben Murdochda12d292016-06-02 14:46:10 +0100508FunctionType*
509ApiCallbackDescriptorBase::BuildCallInterfaceDescriptorFunctionTypeWithArg(
510 Isolate* isolate, int parameter_count, int argc) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000511 Zone* zone = isolate->interface_descriptor_zone();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100512 FunctionType* function =
Ben Murdochda12d292016-06-02 14:46:10 +0100513 Type::Function(AnyTagged(zone), Type::Undefined(), 4 + argc, zone)
514 ->AsFunction();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000515 function->InitParameter(0, AnyTagged(zone)); // callee
516 function->InitParameter(1, AnyTagged(zone)); // call_data
517 function->InitParameter(2, AnyTagged(zone)); // holder
518 function->InitParameter(3, ExternalPointer(zone)); // api_function_address
Ben Murdochda12d292016-06-02 14:46:10 +0100519 for (int i = 0; i < argc; i++) {
520 function->InitParameter(i, AnyTagged(zone));
521 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000522 return function;
523}
524
Ben Murdoch097c5b22016-05-18 11:27:45 +0100525FunctionType*
526InterpreterDispatchDescriptor::BuildCallInterfaceDescriptorFunctionType(
527 Isolate* isolate, int parameter_count) {
528 Zone* zone = isolate->interface_descriptor_zone();
529 FunctionType* function =
Ben Murdochc5610432016-08-08 18:44:38 +0100530 Type::Function(AnyTagged(zone), Type::Undefined(), 4, zone)->AsFunction();
Ben Murdoch097c5b22016-05-18 11:27:45 +0100531 function->InitParameter(kAccumulatorParameter, AnyTagged(zone));
Ben Murdoch097c5b22016-05-18 11:27:45 +0100532 function->InitParameter(kBytecodeOffsetParameter, UntaggedIntegral32(zone));
533 function->InitParameter(kBytecodeArrayParameter, AnyTagged(zone));
534 function->InitParameter(kDispatchTableParameter, AnyTagged(zone));
535 return function;
536}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000537
538} // namespace internal
539} // namespace v8