1 // 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 5 #include "src/interface-descriptors.h" 6 7 namespace v8 { 8 namespace internal { 9 10 namespace { 11 // Constructors for common combined semantic and representation types. 12 Type* SmiType(Zone* zone) { 13 return Type::Intersect(Type::SignedSmall(), Type::TaggedSigned(), zone); 14 } 15 16 17 Type* UntaggedIntegral32(Zone* zone) { 18 return Type::Intersect(Type::Signed32(), Type::UntaggedIntegral32(), zone); 19 } 20 21 22 Type* AnyTagged(Zone* zone) { 23 return Type::Intersect( 24 Type::Any(), 25 Type::Union(Type::TaggedPointer(), Type::TaggedSigned(), zone), zone); 26 } 27 28 29 Type* ExternalPointer(Zone* zone) { 30 return Type::Intersect(Type::Internal(), Type::UntaggedPointer(), zone); 31 } 32 } // namespace 33 34 35 Type::FunctionType* CallInterfaceDescriptor::BuildDefaultFunctionType( 36 Isolate* isolate, int parameter_count) { 37 Zone* zone = isolate->interface_descriptor_zone(); 38 Type::FunctionType* function = Type::FunctionType::New( 39 AnyTagged(zone), Type::Undefined(), parameter_count, zone); 40 while (parameter_count-- != 0) { 41 function->InitParameter(parameter_count, AnyTagged(zone)); 42 } 43 return function; 44 } 45 46 47 void CallInterfaceDescriptorData::InitializePlatformSpecific( 48 int register_parameter_count, Register* registers, 49 PlatformInterfaceDescriptor* platform_descriptor) { 50 platform_specific_descriptor_ = platform_descriptor; 51 register_param_count_ = register_parameter_count; 52 53 // 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 } 58 } 59 60 const char* CallInterfaceDescriptor::DebugName(Isolate* isolate) const { 61 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 78 void AllocateMutableHeapNumberDescriptor::InitializePlatformSpecific( 79 CallInterfaceDescriptorData* data) { 80 data->InitializePlatformSpecific(0, nullptr, nullptr); 81 } 82 83 84 void VoidDescriptor::InitializePlatformSpecific( 85 CallInterfaceDescriptorData* data) { 86 data->InitializePlatformSpecific(0, nullptr); 87 } 88 89 90 Type::FunctionType* LoadDescriptor::BuildCallInterfaceDescriptorFunctionType( 91 Isolate* isolate, int paramater_count) { 92 Zone* zone = isolate->interface_descriptor_zone(); 93 Type::FunctionType* function = 94 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 3, zone); 95 function->InitParameter(0, AnyTagged(zone)); 96 function->InitParameter(1, AnyTagged(zone)); 97 function->InitParameter(2, SmiType(zone)); 98 return function; 99 } 100 101 102 void LoadDescriptor::InitializePlatformSpecific( 103 CallInterfaceDescriptorData* data) { 104 Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister()}; 105 data->InitializePlatformSpecific(arraysize(registers), registers); 106 } 107 108 109 void StoreDescriptor::InitializePlatformSpecific( 110 CallInterfaceDescriptorData* data) { 111 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister()}; 112 data->InitializePlatformSpecific(arraysize(registers), registers); 113 } 114 115 116 void StoreTransitionDescriptor::InitializePlatformSpecific( 117 CallInterfaceDescriptorData* data) { 118 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), 119 MapRegister()}; 120 121 data->InitializePlatformSpecific(arraysize(registers), registers); 122 } 123 124 125 void VectorStoreTransitionDescriptor::InitializePlatformSpecific( 126 CallInterfaceDescriptorData* data) { 127 if (SlotRegister().is(no_reg)) { 128 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), 129 MapRegister(), VectorRegister()}; 130 data->InitializePlatformSpecific(arraysize(registers), registers); 131 } else { 132 Register registers[] = {ReceiverRegister(), NameRegister(), 133 ValueRegister(), MapRegister(), 134 SlotRegister(), VectorRegister()}; 135 data->InitializePlatformSpecific(arraysize(registers), registers); 136 } 137 } 138 139 140 Type::FunctionType* 141 StoreTransitionDescriptor::BuildCallInterfaceDescriptorFunctionType( 142 Isolate* isolate, int paramater_count) { 143 Zone* zone = isolate->interface_descriptor_zone(); 144 Type::FunctionType* function = 145 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 4, zone); 146 function->InitParameter(0, AnyTagged(zone)); // Receiver 147 function->InitParameter(1, AnyTagged(zone)); // Name 148 function->InitParameter(2, AnyTagged(zone)); // Value 149 function->InitParameter(3, AnyTagged(zone)); // Map 150 return function; 151 } 152 153 154 Type::FunctionType* 155 LoadGlobalViaContextDescriptor::BuildCallInterfaceDescriptorFunctionType( 156 Isolate* isolate, int paramater_count) { 157 Zone* zone = isolate->interface_descriptor_zone(); 158 Type::FunctionType* function = 159 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 1, zone); 160 function->InitParameter(0, UntaggedIntegral32(zone)); 161 return function; 162 } 163 164 165 void LoadGlobalViaContextDescriptor::InitializePlatformSpecific( 166 CallInterfaceDescriptorData* data) { 167 Register registers[] = {SlotRegister()}; 168 data->InitializePlatformSpecific(arraysize(registers), registers); 169 } 170 171 172 Type::FunctionType* 173 StoreGlobalViaContextDescriptor::BuildCallInterfaceDescriptorFunctionType( 174 Isolate* isolate, int paramater_count) { 175 Zone* zone = isolate->interface_descriptor_zone(); 176 Type::FunctionType* function = 177 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 2, zone); 178 function->InitParameter(0, UntaggedIntegral32(zone)); 179 function->InitParameter(1, AnyTagged(zone)); 180 return function; 181 } 182 183 184 void StoreGlobalViaContextDescriptor::InitializePlatformSpecific( 185 CallInterfaceDescriptorData* data) { 186 Register registers[] = {SlotRegister(), ValueRegister()}; 187 data->InitializePlatformSpecific(arraysize(registers), registers); 188 } 189 190 191 void InstanceOfDescriptor::InitializePlatformSpecific( 192 CallInterfaceDescriptorData* data) { 193 Register registers[] = {LeftRegister(), RightRegister()}; 194 data->InitializePlatformSpecific(arraysize(registers), registers); 195 } 196 197 198 void StringCompareDescriptor::InitializePlatformSpecific( 199 CallInterfaceDescriptorData* data) { 200 Register registers[] = {LeftRegister(), RightRegister()}; 201 data->InitializePlatformSpecific(arraysize(registers), registers); 202 } 203 204 205 void ToLengthDescriptor::InitializePlatformSpecific( 206 CallInterfaceDescriptorData* data) { 207 Register registers[] = {ReceiverRegister()}; 208 data->InitializePlatformSpecific(arraysize(registers), registers); 209 } 210 211 212 void ToStringDescriptor::InitializePlatformSpecific( 213 CallInterfaceDescriptorData* data) { 214 Register registers[] = {ReceiverRegister()}; 215 data->InitializePlatformSpecific(arraysize(registers), registers); 216 } 217 218 219 void ToObjectDescriptor::InitializePlatformSpecific( 220 CallInterfaceDescriptorData* data) { 221 Register registers[] = {ReceiverRegister()}; 222 data->InitializePlatformSpecific(arraysize(registers), registers); 223 } 224 225 226 void MathPowTaggedDescriptor::InitializePlatformSpecific( 227 CallInterfaceDescriptorData* data) { 228 Register registers[] = {exponent()}; 229 data->InitializePlatformSpecific(arraysize(registers), registers); 230 } 231 232 233 void MathPowIntegerDescriptor::InitializePlatformSpecific( 234 CallInterfaceDescriptorData* data) { 235 Register registers[] = {exponent()}; 236 data->InitializePlatformSpecific(arraysize(registers), registers); 237 } 238 239 240 Type::FunctionType* 241 LoadWithVectorDescriptor::BuildCallInterfaceDescriptorFunctionType( 242 Isolate* isolate, int paramater_count) { 243 Zone* zone = isolate->interface_descriptor_zone(); 244 Type::FunctionType* function = 245 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 4, zone); 246 function->InitParameter(0, AnyTagged(zone)); 247 function->InitParameter(1, AnyTagged(zone)); 248 function->InitParameter(2, SmiType(zone)); 249 function->InitParameter(3, AnyTagged(zone)); 250 return function; 251 } 252 253 254 void LoadWithVectorDescriptor::InitializePlatformSpecific( 255 CallInterfaceDescriptorData* data) { 256 Register registers[] = {ReceiverRegister(), NameRegister(), SlotRegister(), 257 VectorRegister()}; 258 data->InitializePlatformSpecific(arraysize(registers), registers); 259 } 260 261 262 Type::FunctionType* 263 VectorStoreTransitionDescriptor::BuildCallInterfaceDescriptorFunctionType( 264 Isolate* isolate, int paramater_count) { 265 Zone* zone = isolate->interface_descriptor_zone(); 266 bool has_slot = !VectorStoreTransitionDescriptor::SlotRegister().is(no_reg); 267 int arg_count = has_slot ? 6 : 5; 268 Type::FunctionType* function = Type::FunctionType::New( 269 AnyTagged(zone), Type::Undefined(), arg_count, zone); 270 int index = 0; 271 function->InitParameter(index++, AnyTagged(zone)); // receiver 272 function->InitParameter(index++, AnyTagged(zone)); // name 273 function->InitParameter(index++, AnyTagged(zone)); // value 274 function->InitParameter(index++, AnyTagged(zone)); // map 275 if (has_slot) { 276 function->InitParameter(index++, SmiType(zone)); // slot 277 } 278 function->InitParameter(index++, AnyTagged(zone)); // vector 279 return function; 280 } 281 282 283 Type::FunctionType* 284 VectorStoreICDescriptor::BuildCallInterfaceDescriptorFunctionType( 285 Isolate* isolate, int paramater_count) { 286 Zone* zone = isolate->interface_descriptor_zone(); 287 Type::FunctionType* function = 288 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 5, zone); 289 function->InitParameter(0, AnyTagged(zone)); 290 function->InitParameter(1, AnyTagged(zone)); 291 function->InitParameter(2, AnyTagged(zone)); 292 function->InitParameter(3, SmiType(zone)); 293 function->InitParameter(4, AnyTagged(zone)); 294 return function; 295 } 296 297 298 void VectorStoreICDescriptor::InitializePlatformSpecific( 299 CallInterfaceDescriptorData* data) { 300 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), 301 SlotRegister(), VectorRegister()}; 302 data->InitializePlatformSpecific(arraysize(registers), registers); 303 } 304 305 306 Type::FunctionType* 307 VectorStoreICTrampolineDescriptor::BuildCallInterfaceDescriptorFunctionType( 308 Isolate* isolate, int paramater_count) { 309 Zone* zone = isolate->interface_descriptor_zone(); 310 Type::FunctionType* function = 311 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 4, zone); 312 function->InitParameter(0, AnyTagged(zone)); 313 function->InitParameter(1, AnyTagged(zone)); 314 function->InitParameter(2, AnyTagged(zone)); 315 function->InitParameter(3, SmiType(zone)); 316 return function; 317 } 318 319 320 void VectorStoreICTrampolineDescriptor::InitializePlatformSpecific( 321 CallInterfaceDescriptorData* data) { 322 Register registers[] = {ReceiverRegister(), NameRegister(), ValueRegister(), 323 SlotRegister()}; 324 data->InitializePlatformSpecific(arraysize(registers), registers); 325 } 326 327 328 Type::FunctionType* 329 ApiGetterDescriptor::BuildCallInterfaceDescriptorFunctionType( 330 Isolate* isolate, int paramater_count) { 331 Zone* zone = isolate->interface_descriptor_zone(); 332 Type::FunctionType* function = 333 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 1, zone); 334 function->InitParameter(0, ExternalPointer(zone)); 335 return function; 336 } 337 338 339 void ApiGetterDescriptor::InitializePlatformSpecific( 340 CallInterfaceDescriptorData* data) { 341 Register registers[] = {function_address()}; 342 data->InitializePlatformSpecific(arraysize(registers), registers); 343 } 344 345 346 void ArgumentsAccessReadDescriptor::InitializePlatformSpecific( 347 CallInterfaceDescriptorData* data) { 348 Register registers[] = {index(), parameter_count()}; 349 data->InitializePlatformSpecific(arraysize(registers), registers); 350 } 351 352 353 Type::FunctionType* 354 ArgumentsAccessNewDescriptor::BuildCallInterfaceDescriptorFunctionType( 355 Isolate* isolate, int paramater_count) { 356 Zone* zone = isolate->interface_descriptor_zone(); 357 Type::FunctionType* function = 358 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 3, zone); 359 function->InitParameter(0, AnyTagged(zone)); 360 function->InitParameter(1, SmiType(zone)); 361 function->InitParameter(2, ExternalPointer(zone)); 362 return function; 363 } 364 365 366 void ArgumentsAccessNewDescriptor::InitializePlatformSpecific( 367 CallInterfaceDescriptorData* data) { 368 Register registers[] = {function(), parameter_count(), parameter_pointer()}; 369 data->InitializePlatformSpecific(arraysize(registers), registers); 370 } 371 372 373 Type::FunctionType* 374 RestParamAccessDescriptor::BuildCallInterfaceDescriptorFunctionType( 375 Isolate* isolate, int paramater_count) { 376 Zone* zone = isolate->interface_descriptor_zone(); 377 Type::FunctionType* function = 378 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 3, zone); 379 function->InitParameter(0, SmiType(zone)); 380 function->InitParameter(1, ExternalPointer(zone)); 381 function->InitParameter(2, SmiType(zone)); 382 return function; 383 } 384 385 386 void RestParamAccessDescriptor::InitializePlatformSpecific( 387 CallInterfaceDescriptorData* data) { 388 Register registers[] = {parameter_count(), parameter_pointer(), 389 rest_parameter_index()}; 390 data->InitializePlatformSpecific(arraysize(registers), registers); 391 } 392 393 394 void ContextOnlyDescriptor::InitializePlatformSpecific( 395 CallInterfaceDescriptorData* data) { 396 data->InitializePlatformSpecific(0, nullptr); 397 } 398 399 400 void GrowArrayElementsDescriptor::InitializePlatformSpecific( 401 CallInterfaceDescriptorData* data) { 402 Register registers[] = {ObjectRegister(), KeyRegister()}; 403 data->InitializePlatformSpecific(arraysize(registers), registers); 404 } 405 406 407 Type::FunctionType* 408 FastCloneRegExpDescriptor::BuildCallInterfaceDescriptorFunctionType( 409 Isolate* isolate, int paramater_count) { 410 Zone* zone = isolate->interface_descriptor_zone(); 411 Type::FunctionType* function = 412 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 4, zone); 413 function->InitParameter(0, AnyTagged(zone)); // closure 414 function->InitParameter(1, SmiType(zone)); // literal_index 415 function->InitParameter(2, AnyTagged(zone)); // pattern 416 function->InitParameter(3, AnyTagged(zone)); // flags 417 return function; 418 } 419 420 421 Type::FunctionType* 422 FastCloneShallowArrayDescriptor::BuildCallInterfaceDescriptorFunctionType( 423 Isolate* isolate, int paramater_count) { 424 Zone* zone = isolate->interface_descriptor_zone(); 425 Type::FunctionType* function = 426 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 3, zone); 427 function->InitParameter(0, AnyTagged(zone)); 428 function->InitParameter(1, SmiType(zone)); 429 function->InitParameter(2, AnyTagged(zone)); 430 return function; 431 } 432 433 434 Type::FunctionType* 435 CreateAllocationSiteDescriptor::BuildCallInterfaceDescriptorFunctionType( 436 Isolate* isolate, int paramater_count) { 437 Zone* zone = isolate->interface_descriptor_zone(); 438 Type::FunctionType* function = 439 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 2, zone); 440 function->InitParameter(0, AnyTagged(zone)); 441 function->InitParameter(1, SmiType(zone)); 442 return function; 443 } 444 445 446 Type::FunctionType* 447 CreateWeakCellDescriptor::BuildCallInterfaceDescriptorFunctionType( 448 Isolate* isolate, int paramater_count) { 449 Zone* zone = isolate->interface_descriptor_zone(); 450 Type::FunctionType* function = 451 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 3, zone); 452 function->InitParameter(0, AnyTagged(zone)); 453 function->InitParameter(1, SmiType(zone)); 454 function->InitParameter(2, AnyTagged(zone)); 455 return function; 456 } 457 458 459 Type::FunctionType* 460 CallTrampolineDescriptor::BuildCallInterfaceDescriptorFunctionType( 461 Isolate* isolate, int paramater_count) { 462 Zone* zone = isolate->interface_descriptor_zone(); 463 Type::FunctionType* function = 464 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 2, zone); 465 function->InitParameter(0, AnyTagged(zone)); // target 466 function->InitParameter(1, UntaggedIntegral32(zone)); // actual #arguments 467 return function; 468 } 469 470 471 Type::FunctionType* 472 ConstructStubDescriptor::BuildCallInterfaceDescriptorFunctionType( 473 Isolate* isolate, int paramater_count) { 474 Zone* zone = isolate->interface_descriptor_zone(); 475 Type::FunctionType* function = 476 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 4, zone); 477 function->InitParameter(0, AnyTagged(zone)); // target 478 function->InitParameter(1, AnyTagged(zone)); // new.target 479 function->InitParameter(2, UntaggedIntegral32(zone)); // actual #arguments 480 function->InitParameter(3, AnyTagged(zone)); // opt. allocation site 481 return function; 482 } 483 484 485 Type::FunctionType* 486 ConstructTrampolineDescriptor::BuildCallInterfaceDescriptorFunctionType( 487 Isolate* isolate, int paramater_count) { 488 Zone* zone = isolate->interface_descriptor_zone(); 489 Type::FunctionType* function = 490 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 3, zone); 491 function->InitParameter(0, AnyTagged(zone)); // target 492 function->InitParameter(1, AnyTagged(zone)); // new.target 493 function->InitParameter(2, UntaggedIntegral32(zone)); // actual #arguments 494 return function; 495 } 496 497 498 Type::FunctionType* 499 CallFunctionWithFeedbackDescriptor::BuildCallInterfaceDescriptorFunctionType( 500 Isolate* isolate, int paramater_count) { 501 Zone* zone = isolate->interface_descriptor_zone(); 502 Type::FunctionType* function = 503 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 2, zone); 504 function->InitParameter(0, Type::Receiver()); // JSFunction 505 function->InitParameter(1, SmiType(zone)); 506 return function; 507 } 508 509 510 Type::FunctionType* CallFunctionWithFeedbackAndVectorDescriptor:: 511 BuildCallInterfaceDescriptorFunctionType(Isolate* isolate, 512 int paramater_count) { 513 Zone* zone = isolate->interface_descriptor_zone(); 514 Type::FunctionType* function = 515 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 3, zone); 516 function->InitParameter(0, Type::Receiver()); // JSFunction 517 function->InitParameter(1, SmiType(zone)); 518 function->InitParameter(2, AnyTagged(zone)); 519 return function; 520 } 521 522 523 Type::FunctionType* 524 ArrayConstructorDescriptor::BuildCallInterfaceDescriptorFunctionType( 525 Isolate* isolate, int paramater_count) { 526 Zone* zone = isolate->interface_descriptor_zone(); 527 Type::FunctionType* function = 528 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 3, zone); 529 function->InitParameter(0, Type::Receiver()); // JSFunction 530 function->InitParameter(1, AnyTagged(zone)); 531 function->InitParameter(2, UntaggedIntegral32(zone)); 532 return function; 533 } 534 535 536 Type::FunctionType* 537 InternalArrayConstructorDescriptor::BuildCallInterfaceDescriptorFunctionType( 538 Isolate* isolate, int paramater_count) { 539 Zone* zone = isolate->interface_descriptor_zone(); 540 Type::FunctionType* function = 541 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 2, zone); 542 function->InitParameter(0, Type::Receiver()); // JSFunction 543 function->InitParameter(1, UntaggedIntegral32(zone)); 544 return function; 545 } 546 547 548 Type::FunctionType* 549 ArgumentAdaptorDescriptor::BuildCallInterfaceDescriptorFunctionType( 550 Isolate* isolate, int paramater_count) { 551 Zone* zone = isolate->interface_descriptor_zone(); 552 Type::FunctionType* function = 553 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 4, zone); 554 function->InitParameter(0, Type::Receiver()); // JSFunction 555 function->InitParameter(1, AnyTagged(zone)); // the new target 556 function->InitParameter(2, UntaggedIntegral32(zone)); // actual #arguments 557 function->InitParameter(3, UntaggedIntegral32(zone)); // expected #arguments 558 return function; 559 } 560 561 562 Type::FunctionType* 563 ApiFunctionDescriptor::BuildCallInterfaceDescriptorFunctionType( 564 Isolate* isolate, int paramater_count) { 565 Zone* zone = isolate->interface_descriptor_zone(); 566 Type::FunctionType* function = 567 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 5, zone); 568 function->InitParameter(0, AnyTagged(zone)); // callee 569 function->InitParameter(1, AnyTagged(zone)); // call_data 570 function->InitParameter(2, AnyTagged(zone)); // holder 571 function->InitParameter(3, ExternalPointer(zone)); // api_function_address 572 function->InitParameter(4, UntaggedIntegral32(zone)); // actual #arguments 573 return function; 574 } 575 576 577 Type::FunctionType* 578 ApiAccessorDescriptor::BuildCallInterfaceDescriptorFunctionType( 579 Isolate* isolate, int paramater_count) { 580 Zone* zone = isolate->interface_descriptor_zone(); 581 Type::FunctionType* function = 582 Type::FunctionType::New(AnyTagged(zone), Type::Undefined(), 4, zone); 583 function->InitParameter(0, AnyTagged(zone)); // callee 584 function->InitParameter(1, AnyTagged(zone)); // call_data 585 function->InitParameter(2, AnyTagged(zone)); // holder 586 function->InitParameter(3, ExternalPointer(zone)); // api_function_address 587 return function; 588 } 589 590 591 } // namespace internal 592 } // namespace v8 593