Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(379)

Side by Side Diff: src/stub-cache.h

Issue 422023003: Encapsulate the holder in the PropertyHolderCompilers (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/ic.cc ('k') | src/stub-cache.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_STUB_CACHE_H_ 5 #ifndef V8_STUB_CACHE_H_
6 #define V8_STUB_CACHE_H_ 6 #define V8_STUB_CACHE_H_
7 7
8 #include "src/allocation.h" 8 #include "src/allocation.h"
9 #include "src/arguments.h" 9 #include "src/arguments.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 }; 367 };
368 368
369 369
370 class PropertyHandlerCompiler : public PropertyAccessCompiler { 370 class PropertyHandlerCompiler : public PropertyAccessCompiler {
371 public: 371 public:
372 static Handle<Code> Find(Handle<Name> name, Handle<Map> map, Code::Kind kind, 372 static Handle<Code> Find(Handle<Name> name, Handle<Map> map, Code::Kind kind,
373 CacheHolderFlag cache_holder, Code::StubType type); 373 CacheHolderFlag cache_holder, Code::StubType type);
374 374
375 protected: 375 protected:
376 PropertyHandlerCompiler(Isolate* isolate, Code::Kind kind, 376 PropertyHandlerCompiler(Isolate* isolate, Code::Kind kind,
377 Handle<HeapType> type, CacheHolderFlag cache_holder) 377 Handle<HeapType> type, Handle<JSObject> holder,
378 : PropertyAccessCompiler(isolate, kind, cache_holder), type_(type) {} 378 CacheHolderFlag cache_holder)
379 : PropertyAccessCompiler(isolate, kind, cache_holder),
380 type_(type),
381 holder_(holder) {}
379 382
380 virtual ~PropertyHandlerCompiler() {} 383 virtual ~PropertyHandlerCompiler() {}
381 384
382 virtual Register FrontendHeader(Register object_reg, Handle<JSObject> holder, 385 virtual Register FrontendHeader(Register object_reg, Handle<Name> name,
383 Handle<Name> name, Label* miss) { 386 Label* miss) {
384 UNREACHABLE(); 387 UNREACHABLE();
385 return receiver(); 388 return receiver();
386 } 389 }
387 390
388 virtual void FrontendFooter(Handle<Name> name, Label* miss) { UNREACHABLE(); } 391 virtual void FrontendFooter(Handle<Name> name, Label* miss) { UNREACHABLE(); }
389 392
390 Register Frontend(Register object_reg, Handle<JSObject> holder, 393 Register Frontend(Register object_reg, Handle<Name> name);
391 Handle<Name> name);
392 394
393 // TODO(verwaest): Make non-static. 395 // TODO(verwaest): Make non-static.
394 static void GenerateFastApiCall(MacroAssembler* masm, 396 static void GenerateFastApiCall(MacroAssembler* masm,
395 const CallOptimization& optimization, 397 const CallOptimization& optimization,
396 Handle<Map> receiver_map, Register receiver, 398 Handle<Map> receiver_map, Register receiver,
397 Register scratch, bool is_store, int argc, 399 Register scratch, bool is_store, int argc,
398 Register* values); 400 Register* values);
399 401
400 // Helper function used to check that the dictionary doesn't contain 402 // Helper function used to check that the dictionary doesn't contain
401 // the property. This function may return false negatives, so miss_label 403 // the property. This function may return false negatives, so miss_label
(...skipping 21 matching lines...) Expand all
423 // objects or doing negative lookup for slow objects, ensures that the 425 // objects or doing negative lookup for slow objects, ensures that the
424 // property cells for global objects are still empty) and checks that the map 426 // property cells for global objects are still empty) and checks that the map
425 // of the holder has not changed. If necessary the function also generates 427 // of the holder has not changed. If necessary the function also generates
426 // code for security check in case of global object holders. Helps to make 428 // code for security check in case of global object holders. Helps to make
427 // sure that the current IC is still valid. 429 // sure that the current IC is still valid.
428 // 430 //
429 // The scratch and holder registers are always clobbered, but the object 431 // The scratch and holder registers are always clobbered, but the object
430 // register is only clobbered if it the same as the holder register. The 432 // register is only clobbered if it the same as the holder register. The
431 // function returns a register containing the holder - either object_reg or 433 // function returns a register containing the holder - either object_reg or
432 // holder_reg. 434 // holder_reg.
433 Register CheckPrototypes(Register object_reg, Handle<JSObject> holder, 435 Register CheckPrototypes(Register object_reg, Register holder_reg,
434 Register holder_reg, Register scratch1, 436 Register scratch1, Register scratch2,
435 Register scratch2, Handle<Name> name, Label* miss, 437 Handle<Name> name, Label* miss,
436 PrototypeCheckType check = CHECK_ALL_MAPS); 438 PrototypeCheckType check = CHECK_ALL_MAPS);
437 439
438 Handle<Code> GetCode(Code::Kind kind, Code::StubType type, Handle<Name> name); 440 Handle<Code> GetCode(Code::Kind kind, Code::StubType type, Handle<Name> name);
439 void set_type_for_object(Handle<Object> object) { 441 void set_type_for_object(Handle<Object> object) {
440 type_ = IC::CurrentTypeOf(object, isolate()); 442 type_ = IC::CurrentTypeOf(object, isolate());
441 } 443 }
444 void set_holder(Handle<JSObject> holder) { holder_ = holder; }
442 Handle<HeapType> type() const { return type_; } 445 Handle<HeapType> type() const { return type_; }
446 Handle<JSObject> holder() const { return holder_; }
443 447
444 private: 448 private:
445 Handle<HeapType> type_; 449 Handle<HeapType> type_;
450 Handle<JSObject> holder_;
446 }; 451 };
447 452
448 453
449 class NamedLoadHandlerCompiler : public PropertyHandlerCompiler { 454 class NamedLoadHandlerCompiler : public PropertyHandlerCompiler {
450 public: 455 public:
451 NamedLoadHandlerCompiler(Isolate* isolate, Handle<HeapType> type, 456 NamedLoadHandlerCompiler(Isolate* isolate, Handle<HeapType> type,
457 Handle<JSObject> holder,
452 CacheHolderFlag cache_holder) 458 CacheHolderFlag cache_holder)
453 : PropertyHandlerCompiler(isolate, Code::LOAD_IC, type, cache_holder) {} 459 : PropertyHandlerCompiler(isolate, Code::LOAD_IC, type, holder,
460 cache_holder) {}
454 461
455 virtual ~NamedLoadHandlerCompiler() {} 462 virtual ~NamedLoadHandlerCompiler() {}
456 463
457 Handle<Code> CompileLoadField(Handle<JSObject> holder, Handle<Name> name, 464 Handle<Code> CompileLoadField(Handle<Name> name, FieldIndex index,
458 FieldIndex index,
459 Representation representation); 465 Representation representation);
460 466
461 Handle<Code> CompileLoadCallback(Handle<JSObject> holder, Handle<Name> name, 467 Handle<Code> CompileLoadCallback(Handle<Name> name,
462 Handle<ExecutableAccessorInfo> callback); 468 Handle<ExecutableAccessorInfo> callback);
463 469
464 Handle<Code> CompileLoadCallback(Handle<JSObject> holder, Handle<Name> name, 470 Handle<Code> CompileLoadCallback(Handle<Name> name,
465 const CallOptimization& call_optimization); 471 const CallOptimization& call_optimization);
466 472
467 Handle<Code> CompileLoadConstant(Handle<JSObject> holder, Handle<Name> name, 473 Handle<Code> CompileLoadConstant(Handle<Name> name, Handle<Object> value);
468 Handle<Object> value);
469 474
470 Handle<Code> CompileLoadInterceptor(Handle<JSObject> holder, 475 Handle<Code> CompileLoadInterceptor(Handle<Name> name);
471 Handle<Name> name);
472 476
473 Handle<Code> CompileLoadViaGetter(Handle<JSObject> holder, Handle<Name> name, 477 Handle<Code> CompileLoadViaGetter(Handle<Name> name,
474 Handle<JSFunction> getter); 478 Handle<JSFunction> getter);
475 479
476 Handle<Code> CompileLoadGlobal(Handle<GlobalObject> holder, 480 Handle<Code> CompileLoadGlobal(Handle<PropertyCell> cell, Handle<Name> name,
477 Handle<PropertyCell> cell, Handle<Name> name,
478 bool is_dont_delete); 481 bool is_dont_delete);
479 482
483 // Static interface
480 static Handle<Code> ComputeLoadNonexistent(Handle<Name> name, 484 static Handle<Code> ComputeLoadNonexistent(Handle<Name> name,
481 Handle<HeapType> type); 485 Handle<HeapType> type);
482 486
483 static void GenerateLoadViaGetter(MacroAssembler* masm, Handle<HeapType> type, 487 static void GenerateLoadViaGetter(MacroAssembler* masm, Handle<HeapType> type,
484 Register receiver, 488 Register receiver,
485 Handle<JSFunction> getter); 489 Handle<JSFunction> getter);
486 490
487 static void GenerateLoadViaGetterForDeopt(MacroAssembler* masm) { 491 static void GenerateLoadViaGetterForDeopt(MacroAssembler* masm) {
488 GenerateLoadViaGetter(masm, Handle<HeapType>::null(), no_reg, 492 GenerateLoadViaGetter(masm, Handle<HeapType>::null(), no_reg,
489 Handle<JSFunction>()); 493 Handle<JSFunction>());
490 } 494 }
491 495
492 static void GenerateLoadFunctionPrototype(MacroAssembler* masm, 496 static void GenerateLoadFunctionPrototype(MacroAssembler* masm,
493 Register receiver, 497 Register receiver,
494 Register scratch1, 498 Register scratch1,
495 Register scratch2, 499 Register scratch2,
496 Label* miss_label); 500 Label* miss_label);
497 501
498 // These constants describe the structure of the interceptor arguments on the 502 // These constants describe the structure of the interceptor arguments on the
499 // stack. The arguments are pushed by the (platform-specific) 503 // stack. The arguments are pushed by the (platform-specific)
500 // PushInterceptorArguments and read by LoadPropertyWithInterceptorOnly and 504 // PushInterceptorArguments and read by LoadPropertyWithInterceptorOnly and
501 // LoadWithInterceptor. 505 // LoadWithInterceptor.
502 static const int kInterceptorArgsNameIndex = 0; 506 static const int kInterceptorArgsNameIndex = 0;
503 static const int kInterceptorArgsInfoIndex = 1; 507 static const int kInterceptorArgsInfoIndex = 1;
504 static const int kInterceptorArgsThisIndex = 2; 508 static const int kInterceptorArgsThisIndex = 2;
505 static const int kInterceptorArgsHolderIndex = 3; 509 static const int kInterceptorArgsHolderIndex = 3;
506 static const int kInterceptorArgsLength = 4; 510 static const int kInterceptorArgsLength = 4;
507 511
508 protected: 512 protected:
509 virtual Register FrontendHeader(Register object_reg, Handle<JSObject> holder, 513 virtual Register FrontendHeader(Register object_reg, Handle<Name> name,
510 Handle<Name> name, Label* miss); 514 Label* miss);
511 515
512 virtual void FrontendFooter(Handle<Name> name, Label* miss); 516 virtual void FrontendFooter(Handle<Name> name, Label* miss);
513 517
514 private: 518 private:
515 Register CallbackFrontend(Register object_reg, Handle<JSObject> holder, 519 Register CallbackFrontend(Register object_reg, Handle<Name> name,
516 Handle<Name> name, Handle<Object> callback); 520 Handle<Object> callback);
517 Handle<Code> CompileLoadNonexistent(Handle<JSObject> last, Handle<Name> name); 521 Handle<Code> CompileLoadNonexistent(Handle<Name> name);
518 void NonexistentFrontend(Handle<JSObject> last, Handle<Name> name); 522 void NonexistentFrontend(Handle<Name> name);
519 523
520 void GenerateLoadField(Register reg, 524 void GenerateLoadField(Register reg,
521 Handle<JSObject> holder,
522 FieldIndex field, 525 FieldIndex field,
523 Representation representation); 526 Representation representation);
524 void GenerateLoadConstant(Handle<Object> value); 527 void GenerateLoadConstant(Handle<Object> value);
525 void GenerateLoadCallback(Register reg, 528 void GenerateLoadCallback(Register reg,
526 Handle<ExecutableAccessorInfo> callback); 529 Handle<ExecutableAccessorInfo> callback);
527 void GenerateLoadCallback(const CallOptimization& call_optimization, 530 void GenerateLoadCallback(const CallOptimization& call_optimization,
528 Handle<Map> receiver_map); 531 Handle<Map> receiver_map);
529 void GenerateLoadInterceptor(Register holder_reg, 532 void GenerateLoadInterceptor(Register holder_reg,
530 Handle<JSObject> holder,
531 LookupResult* lookup, 533 LookupResult* lookup,
532 Handle<Name> name); 534 Handle<Name> name);
533 void GenerateLoadPostInterceptor(Register reg, 535 void GenerateLoadPostInterceptor(Register reg,
534 Handle<JSObject> interceptor_holder,
535 Handle<Name> name, 536 Handle<Name> name,
536 LookupResult* lookup); 537 LookupResult* lookup);
537 538
538 // Generates prototype loading code that uses the objects from the 539 // Generates prototype loading code that uses the objects from the
539 // context we were in when this function was called. If the context 540 // context we were in when this function was called. If the context
540 // has changed, a jump to miss is performed. This ties the generated 541 // has changed, a jump to miss is performed. This ties the generated
541 // code to a particular context and so must not be used in cases 542 // code to a particular context and so must not be used in cases
542 // where the generated code is not allowed to have references to 543 // where the generated code is not allowed to have references to
543 // objects from a context. 544 // objects from a context.
544 static void GenerateDirectLoadGlobalFunctionPrototype(MacroAssembler* masm, 545 static void GenerateDirectLoadGlobalFunctionPrototype(MacroAssembler* masm,
545 int index, 546 int index,
546 Register prototype, 547 Register prototype,
547 Label* miss); 548 Label* miss);
548 549
549 550
550 Register scratch4() { return registers_[5]; } 551 Register scratch4() { return registers_[5]; }
551 }; 552 };
552 553
553 554
554 class NamedStoreHandlerCompiler : public PropertyHandlerCompiler { 555 class NamedStoreHandlerCompiler : public PropertyHandlerCompiler {
555 public: 556 public:
556 explicit NamedStoreHandlerCompiler(Isolate* isolate, Handle<HeapType> type) 557 explicit NamedStoreHandlerCompiler(Isolate* isolate, Handle<HeapType> type,
557 : PropertyHandlerCompiler(isolate, Code::STORE_IC, type, 558 Handle<JSObject> holder)
559 : PropertyHandlerCompiler(isolate, Code::STORE_IC, type, holder,
558 kCacheOnReceiver) {} 560 kCacheOnReceiver) {}
559 561
560 virtual ~NamedStoreHandlerCompiler() {} 562 virtual ~NamedStoreHandlerCompiler() {}
561 563
562 Handle<Code> CompileStoreTransition(Handle<JSObject> object, 564 Handle<Code> CompileStoreTransition(LookupResult* lookup,
563 LookupResult* lookup,
564 Handle<Map> transition, 565 Handle<Map> transition,
565 Handle<Name> name); 566 Handle<Name> name);
566 567
567 Handle<Code> CompileStoreField(Handle<JSObject> object, 568 Handle<Code> CompileStoreField(LookupResult* lookup, Handle<Name> name);
568 LookupResult* lookup,
569 Handle<Name> name);
570 569
571 Handle<Code> CompileStoreArrayLength(Handle<JSObject> object, 570 Handle<Code> CompileStoreArrayLength(LookupResult* lookup, Handle<Name> name);
572 LookupResult* lookup,
573 Handle<Name> name);
574 571
575 Handle<Code> CompileStoreCallback(Handle<JSObject> object, 572 Handle<Code> CompileStoreCallback(Handle<JSObject> object, Handle<Name> name,
576 Handle<JSObject> holder, Handle<Name> name,
577 Handle<ExecutableAccessorInfo> callback); 573 Handle<ExecutableAccessorInfo> callback);
578 574
579 Handle<Code> CompileStoreCallback(Handle<JSObject> object, 575 Handle<Code> CompileStoreCallback(Handle<JSObject> object, Handle<Name> name,
580 Handle<JSObject> holder, Handle<Name> name,
581 const CallOptimization& call_optimization); 576 const CallOptimization& call_optimization);
582 577
583 Handle<Code> CompileStoreViaSetter(Handle<JSObject> object, 578 Handle<Code> CompileStoreViaSetter(Handle<JSObject> object, Handle<Name> name,
584 Handle<JSObject> holder, Handle<Name> name,
585 Handle<JSFunction> setter); 579 Handle<JSFunction> setter);
586 580
587 Handle<Code> CompileStoreInterceptor(Handle<JSObject> object, 581 Handle<Code> CompileStoreInterceptor(Handle<Name> name);
588 Handle<Name> name);
589 582
590 583
591 static void GenerateStoreViaSetter(MacroAssembler* masm, 584 static void GenerateStoreViaSetter(MacroAssembler* masm,
592 Handle<HeapType> type, Register receiver, 585 Handle<HeapType> type, Register receiver,
593 Handle<JSFunction> setter); 586 Handle<JSFunction> setter);
594 587
595 static void GenerateStoreViaSetterForDeopt(MacroAssembler* masm) { 588 static void GenerateStoreViaSetterForDeopt(MacroAssembler* masm) {
596 GenerateStoreViaSetter(masm, Handle<HeapType>::null(), no_reg, 589 GenerateStoreViaSetter(masm, Handle<HeapType>::null(), no_reg,
597 Handle<JSFunction>()); 590 Handle<JSFunction>());
598 } 591 }
599 592
600 protected: 593 protected:
601 virtual Register FrontendHeader(Register object_reg, Handle<JSObject> holder, 594 virtual Register FrontendHeader(Register object_reg, Handle<Name> name,
602 Handle<Name> name, Label* miss); 595 Label* miss);
603 596
604 virtual void FrontendFooter(Handle<Name> name, Label* miss); 597 virtual void FrontendFooter(Handle<Name> name, Label* miss);
605 void GenerateRestoreName(MacroAssembler* masm, Label* label, 598 void GenerateRestoreName(MacroAssembler* masm, Label* label,
606 Handle<Name> name); 599 Handle<Name> name);
607 600
608 private: 601 private:
609 void GenerateStoreArrayLength(); 602 void GenerateStoreArrayLength();
610 603
611 void GenerateNegativeHolderLookup(MacroAssembler* masm, 604 void GenerateNegativeHolderLookup(MacroAssembler* masm,
612 Handle<JSObject> holder, 605 Handle<JSObject> holder,
613 Register holder_reg, 606 Register holder_reg,
614 Handle<Name> name, 607 Handle<Name> name,
615 Label* miss); 608 Label* miss);
616 609
617 void GenerateStoreTransition(MacroAssembler* masm, 610 void GenerateStoreTransition(MacroAssembler* masm,
618 Handle<JSObject> object,
619 LookupResult* lookup, 611 LookupResult* lookup,
620 Handle<Map> transition, 612 Handle<Map> transition,
621 Handle<Name> name, 613 Handle<Name> name,
622 Register receiver_reg, 614 Register receiver_reg,
623 Register name_reg, 615 Register name_reg,
624 Register value_reg, 616 Register value_reg,
625 Register scratch1, 617 Register scratch1,
626 Register scratch2, 618 Register scratch2,
627 Register scratch3, 619 Register scratch3,
628 Label* miss_label, 620 Label* miss_label,
(...skipping 19 matching lines...) Expand all
648 } 640 }
649 641
650 static Register value(); 642 static Register value();
651 }; 643 };
652 644
653 645
654 class ElementHandlerCompiler : public PropertyHandlerCompiler { 646 class ElementHandlerCompiler : public PropertyHandlerCompiler {
655 public: 647 public:
656 explicit ElementHandlerCompiler(Isolate* isolate) 648 explicit ElementHandlerCompiler(Isolate* isolate)
657 : PropertyHandlerCompiler(isolate, Code::KEYED_LOAD_IC, 649 : PropertyHandlerCompiler(isolate, Code::KEYED_LOAD_IC,
658 Handle<HeapType>::null(), kCacheOnReceiver) {} 650 Handle<HeapType>::null(),
651 Handle<JSObject>::null(), kCacheOnReceiver) {}
659 652
660 virtual ~ElementHandlerCompiler() {} 653 virtual ~ElementHandlerCompiler() {}
661 654
662 void CompileElementHandlers(MapHandleList* receiver_maps, 655 void CompileElementHandlers(MapHandleList* receiver_maps,
663 CodeHandleList* handlers); 656 CodeHandleList* handlers);
664 657
665 static void GenerateLoadDictionaryElement(MacroAssembler* masm); 658 static void GenerateLoadDictionaryElement(MacroAssembler* masm);
666 static void GenerateStoreDictionaryElement(MacroAssembler* masm); 659 static void GenerateStoreDictionaryElement(MacroAssembler* masm);
667 }; 660 };
668 661
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 Handle<JSFunction> constant_function_; 713 Handle<JSFunction> constant_function_;
721 bool is_simple_api_call_; 714 bool is_simple_api_call_;
722 Handle<FunctionTemplateInfo> expected_receiver_type_; 715 Handle<FunctionTemplateInfo> expected_receiver_type_;
723 Handle<CallHandlerInfo> api_call_info_; 716 Handle<CallHandlerInfo> api_call_info_;
724 }; 717 };
725 718
726 719
727 } } // namespace v8::internal 720 } } // namespace v8::internal
728 721
729 #endif // V8_STUB_CACHE_H_ 722 #endif // V8_STUB_CACHE_H_
OLDNEW
« no previous file with comments | « src/ic.cc ('k') | src/stub-cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698