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

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

Issue 426633002: Encapsulate type in the PropertyHandlerCompiler (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
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 CacheHolderFlag cache_holder) 377 Handle<HeapType> type, CacheHolderFlag cache_holder)
378 : PropertyAccessCompiler(isolate, kind, cache_holder) {} 378 : PropertyAccessCompiler(isolate, kind, cache_holder), type_(type) {}
379 379
380 virtual ~PropertyHandlerCompiler() {} 380 virtual ~PropertyHandlerCompiler() {}
381 381
382 virtual Register FrontendHeader(Handle<HeapType> type, Register object_reg, 382 virtual Register FrontendHeader(Register object_reg, Handle<JSObject> holder,
383 Handle<JSObject> holder, Handle<Name> name, 383 Handle<Name> name, Label* miss) {
384 Label* miss) {
385 UNREACHABLE(); 384 UNREACHABLE();
386 return receiver(); 385 return receiver();
387 } 386 }
388 387
389 virtual void FrontendFooter(Handle<Name> name, Label* miss) { UNREACHABLE(); } 388 virtual void FrontendFooter(Handle<Name> name, Label* miss) { UNREACHABLE(); }
390 389
391 Register Frontend(Handle<HeapType> type, Register object_reg, 390 Register Frontend(Register object_reg, Handle<JSObject> holder,
392 Handle<JSObject> holder, Handle<Name> name); 391 Handle<Name> name);
393 392
394 // TODO(verwaest): Make non-static. 393 // TODO(verwaest): Make non-static.
395 static void GenerateFastApiCall(MacroAssembler* masm, 394 static void GenerateFastApiCall(MacroAssembler* masm,
396 const CallOptimization& optimization, 395 const CallOptimization& optimization,
397 Handle<Map> receiver_map, Register receiver, 396 Handle<Map> receiver_map, Register receiver,
398 Register scratch, bool is_store, int argc, 397 Register scratch, bool is_store, int argc,
399 Register* values); 398 Register* values);
400 399
401 // Helper function used to check that the dictionary doesn't contain 400 // Helper function used to check that the dictionary doesn't contain
402 // the property. This function may return false negatives, so miss_label 401 // the property. This function may return false negatives, so miss_label
(...skipping 21 matching lines...) Expand all
424 // objects or doing negative lookup for slow objects, ensures that the 423 // objects or doing negative lookup for slow objects, ensures that the
425 // property cells for global objects are still empty) and checks that the map 424 // property cells for global objects are still empty) and checks that the map
426 // of the holder has not changed. If necessary the function also generates 425 // of the holder has not changed. If necessary the function also generates
427 // code for security check in case of global object holders. Helps to make 426 // code for security check in case of global object holders. Helps to make
428 // sure that the current IC is still valid. 427 // sure that the current IC is still valid.
429 // 428 //
430 // The scratch and holder registers are always clobbered, but the object 429 // The scratch and holder registers are always clobbered, but the object
431 // register is only clobbered if it the same as the holder register. The 430 // register is only clobbered if it the same as the holder register. The
432 // function returns a register containing the holder - either object_reg or 431 // function returns a register containing the holder - either object_reg or
433 // holder_reg. 432 // holder_reg.
434 Register CheckPrototypes(Handle<HeapType> type, 433 Register CheckPrototypes(Register object_reg, Handle<JSObject> holder,
435 Register object_reg, 434 Register holder_reg, Register scratch1,
436 Handle<JSObject> holder, 435 Register scratch2, Handle<Name> name, Label* miss,
437 Register holder_reg,
438 Register scratch1,
439 Register scratch2,
440 Handle<Name> name,
441 Label* miss,
442 PrototypeCheckType check = CHECK_ALL_MAPS); 436 PrototypeCheckType check = CHECK_ALL_MAPS);
443 437
444 Handle<Code> GetCode(Code::Kind kind, Code::StubType type, Handle<Name> name); 438 Handle<Code> GetCode(Code::Kind kind, Code::StubType type, Handle<Name> name);
439 void set_type_for_object(Handle<Object> object) {
440 type_ = IC::CurrentTypeOf(object, isolate());
441 }
442 Handle<HeapType> type() const { return type_; }
443
444 private:
445 Handle<HeapType> type_;
445 }; 446 };
446 447
447 448
448 class NamedLoadHandlerCompiler : public PropertyHandlerCompiler { 449 class NamedLoadHandlerCompiler : public PropertyHandlerCompiler {
449 public: 450 public:
450 NamedLoadHandlerCompiler(Isolate* isolate, 451 NamedLoadHandlerCompiler(Isolate* isolate, Handle<HeapType> type,
451 CacheHolderFlag cache_holder = kCacheOnReceiver) 452 CacheHolderFlag cache_holder)
452 : PropertyHandlerCompiler(isolate, Code::LOAD_IC, cache_holder) {} 453 : PropertyHandlerCompiler(isolate, Code::LOAD_IC, type, cache_holder) {}
453 454
454 virtual ~NamedLoadHandlerCompiler() {} 455 virtual ~NamedLoadHandlerCompiler() {}
455 456
456 Handle<Code> CompileLoadField(Handle<HeapType> type, 457 Handle<Code> CompileLoadField(Handle<JSObject> holder, Handle<Name> name,
457 Handle<JSObject> holder,
458 Handle<Name> name,
459 FieldIndex index, 458 FieldIndex index,
460 Representation representation); 459 Representation representation);
461 460
462 Handle<Code> CompileLoadCallback(Handle<HeapType> type, 461 Handle<Code> CompileLoadCallback(Handle<JSObject> holder, Handle<Name> name,
463 Handle<JSObject> holder,
464 Handle<Name> name,
465 Handle<ExecutableAccessorInfo> callback); 462 Handle<ExecutableAccessorInfo> callback);
466 463
467 Handle<Code> CompileLoadCallback(Handle<HeapType> type, 464 Handle<Code> CompileLoadCallback(Handle<JSObject> holder, Handle<Name> name,
468 Handle<JSObject> holder,
469 Handle<Name> name,
470 const CallOptimization& call_optimization); 465 const CallOptimization& call_optimization);
471 466
472 Handle<Code> CompileLoadConstant(Handle<HeapType> type, 467 Handle<Code> CompileLoadConstant(Handle<JSObject> holder, Handle<Name> name,
473 Handle<JSObject> holder,
474 Handle<Name> name,
475 Handle<Object> value); 468 Handle<Object> value);
476 469
477 Handle<Code> CompileLoadInterceptor(Handle<HeapType> type, 470 Handle<Code> CompileLoadInterceptor(Handle<JSObject> holder,
478 Handle<JSObject> holder,
479 Handle<Name> name); 471 Handle<Name> name);
480 472
481 Handle<Code> CompileLoadViaGetter(Handle<HeapType> type, 473 Handle<Code> CompileLoadViaGetter(Handle<JSObject> holder, Handle<Name> name,
482 Handle<JSObject> holder,
483 Handle<Name> name,
484 Handle<JSFunction> getter); 474 Handle<JSFunction> getter);
485 475
476 Handle<Code> CompileLoadGlobal(Handle<GlobalObject> holder,
477 Handle<PropertyCell> cell, Handle<Name> name,
478 bool is_dont_delete);
479
486 static Handle<Code> ComputeLoadNonexistent(Handle<Name> name, 480 static Handle<Code> ComputeLoadNonexistent(Handle<Name> name,
487 Handle<HeapType> type); 481 Handle<HeapType> type);
488 482
489 Handle<Code> CompileLoadGlobal(Handle<HeapType> type,
490 Handle<GlobalObject> holder,
491 Handle<PropertyCell> cell,
492 Handle<Name> name,
493 bool is_dont_delete);
494
495 static void GenerateLoadViaGetter(MacroAssembler* masm, Handle<HeapType> type, 483 static void GenerateLoadViaGetter(MacroAssembler* masm, Handle<HeapType> type,
496 Register receiver, 484 Register receiver,
497 Handle<JSFunction> getter); 485 Handle<JSFunction> getter);
498 486
499 static void GenerateLoadViaGetterForDeopt(MacroAssembler* masm) { 487 static void GenerateLoadViaGetterForDeopt(MacroAssembler* masm) {
500 GenerateLoadViaGetter(masm, Handle<HeapType>::null(), no_reg, 488 GenerateLoadViaGetter(masm, Handle<HeapType>::null(), no_reg,
501 Handle<JSFunction>()); 489 Handle<JSFunction>());
502 } 490 }
503 491
504 static void GenerateLoadFunctionPrototype(MacroAssembler* masm, 492 static void GenerateLoadFunctionPrototype(MacroAssembler* masm,
505 Register receiver, 493 Register receiver,
506 Register scratch1, 494 Register scratch1,
507 Register scratch2, 495 Register scratch2,
508 Label* miss_label); 496 Label* miss_label);
509 497
510 // These constants describe the structure of the interceptor arguments on the 498 // These constants describe the structure of the interceptor arguments on the
511 // stack. The arguments are pushed by the (platform-specific) 499 // stack. The arguments are pushed by the (platform-specific)
512 // PushInterceptorArguments and read by LoadPropertyWithInterceptorOnly and 500 // PushInterceptorArguments and read by LoadPropertyWithInterceptorOnly and
513 // LoadWithInterceptor. 501 // LoadWithInterceptor.
514 static const int kInterceptorArgsNameIndex = 0; 502 static const int kInterceptorArgsNameIndex = 0;
515 static const int kInterceptorArgsInfoIndex = 1; 503 static const int kInterceptorArgsInfoIndex = 1;
516 static const int kInterceptorArgsThisIndex = 2; 504 static const int kInterceptorArgsThisIndex = 2;
517 static const int kInterceptorArgsHolderIndex = 3; 505 static const int kInterceptorArgsHolderIndex = 3;
518 static const int kInterceptorArgsLength = 4; 506 static const int kInterceptorArgsLength = 4;
519 507
520 protected: 508 protected:
521 virtual Register FrontendHeader(Handle<HeapType> type, Register object_reg, 509 virtual Register FrontendHeader(Register object_reg, Handle<JSObject> holder,
522 Handle<JSObject> holder, Handle<Name> name, 510 Handle<Name> name, Label* miss);
523 Label* miss);
524 511
525 virtual void FrontendFooter(Handle<Name> name, Label* miss); 512 virtual void FrontendFooter(Handle<Name> name, Label* miss);
526 513
527 private: 514 private:
528 Register CallbackFrontend(Handle<HeapType> type, Register object_reg, 515 Register CallbackFrontend(Register object_reg, Handle<JSObject> holder,
529 Handle<JSObject> holder, Handle<Name> name, 516 Handle<Name> name, Handle<Object> callback);
530 Handle<Object> callback); 517 Handle<Code> CompileLoadNonexistent(Handle<JSObject> last, Handle<Name> name);
531 Handle<Code> CompileLoadNonexistent(Handle<HeapType> type, 518 void NonexistentFrontend(Handle<JSObject> last, Handle<Name> name);
532 Handle<JSObject> last, Handle<Name> name);
533 void NonexistentFrontend(Handle<HeapType> type, Handle<JSObject> last,
534 Handle<Name> name);
535 519
536 void GenerateLoadField(Register reg, 520 void GenerateLoadField(Register reg,
537 Handle<JSObject> holder, 521 Handle<JSObject> holder,
538 FieldIndex field, 522 FieldIndex field,
539 Representation representation); 523 Representation representation);
540 void GenerateLoadConstant(Handle<Object> value); 524 void GenerateLoadConstant(Handle<Object> value);
541 void GenerateLoadCallback(Register reg, 525 void GenerateLoadCallback(Register reg,
542 Handle<ExecutableAccessorInfo> callback); 526 Handle<ExecutableAccessorInfo> callback);
543 void GenerateLoadCallback(const CallOptimization& call_optimization, 527 void GenerateLoadCallback(const CallOptimization& call_optimization,
544 Handle<Map> receiver_map); 528 Handle<Map> receiver_map);
545 void GenerateLoadInterceptor(Register holder_reg, 529 void GenerateLoadInterceptor(Register holder_reg,
546 Handle<Object> object,
547 Handle<JSObject> holder, 530 Handle<JSObject> holder,
548 LookupResult* lookup, 531 LookupResult* lookup,
549 Handle<Name> name); 532 Handle<Name> name);
550 void GenerateLoadPostInterceptor(Register reg, 533 void GenerateLoadPostInterceptor(Register reg,
551 Handle<JSObject> interceptor_holder, 534 Handle<JSObject> interceptor_holder,
552 Handle<Name> name, 535 Handle<Name> name,
553 LookupResult* lookup); 536 LookupResult* lookup);
554 537
555 // Generates prototype loading code that uses the objects from the 538 // Generates prototype loading code that uses the objects from the
556 // context we were in when this function was called. If the context 539 // context we were in when this function was called. If the context
557 // has changed, a jump to miss is performed. This ties the generated 540 // has changed, a jump to miss is performed. This ties the generated
558 // code to a particular context and so must not be used in cases 541 // code to a particular context and so must not be used in cases
559 // where the generated code is not allowed to have references to 542 // where the generated code is not allowed to have references to
560 // objects from a context. 543 // objects from a context.
561 static void GenerateDirectLoadGlobalFunctionPrototype(MacroAssembler* masm, 544 static void GenerateDirectLoadGlobalFunctionPrototype(MacroAssembler* masm,
562 int index, 545 int index,
563 Register prototype, 546 Register prototype,
564 Label* miss); 547 Label* miss);
565 548
566 549
567 Register scratch4() { return registers_[5]; } 550 Register scratch4() { return registers_[5]; }
568 }; 551 };
569 552
570 553
571 class NamedStoreHandlerCompiler : public PropertyHandlerCompiler { 554 class NamedStoreHandlerCompiler : public PropertyHandlerCompiler {
572 public: 555 public:
573 explicit NamedStoreHandlerCompiler(Isolate* isolate) 556 explicit NamedStoreHandlerCompiler(Isolate* isolate, Handle<HeapType> type)
574 : PropertyHandlerCompiler(isolate, Code::STORE_IC, kCacheOnReceiver) {} 557 : PropertyHandlerCompiler(isolate, Code::STORE_IC, type,
558 kCacheOnReceiver) {}
575 559
576 virtual ~NamedStoreHandlerCompiler() {} 560 virtual ~NamedStoreHandlerCompiler() {}
577 561
578 Handle<Code> CompileStoreTransition(Handle<JSObject> object, 562 Handle<Code> CompileStoreTransition(Handle<JSObject> object,
579 LookupResult* lookup, 563 LookupResult* lookup,
580 Handle<Map> transition, 564 Handle<Map> transition,
581 Handle<Name> name); 565 Handle<Name> name);
582 566
583 Handle<Code> CompileStoreField(Handle<JSObject> object, 567 Handle<Code> CompileStoreField(Handle<JSObject> object,
584 LookupResult* lookup, 568 LookupResult* lookup,
(...skipping 22 matching lines...) Expand all
607 static void GenerateStoreViaSetter(MacroAssembler* masm, 591 static void GenerateStoreViaSetter(MacroAssembler* masm,
608 Handle<HeapType> type, Register receiver, 592 Handle<HeapType> type, Register receiver,
609 Handle<JSFunction> setter); 593 Handle<JSFunction> setter);
610 594
611 static void GenerateStoreViaSetterForDeopt(MacroAssembler* masm) { 595 static void GenerateStoreViaSetterForDeopt(MacroAssembler* masm) {
612 GenerateStoreViaSetter(masm, Handle<HeapType>::null(), no_reg, 596 GenerateStoreViaSetter(masm, Handle<HeapType>::null(), no_reg,
613 Handle<JSFunction>()); 597 Handle<JSFunction>());
614 } 598 }
615 599
616 protected: 600 protected:
617 virtual Register FrontendHeader(Handle<HeapType> type, Register object_reg, 601 virtual Register FrontendHeader(Register object_reg, Handle<JSObject> holder,
618 Handle<JSObject> holder, Handle<Name> name, 602 Handle<Name> name, Label* miss);
619 Label* miss);
620 603
621 virtual void FrontendFooter(Handle<Name> name, Label* miss); 604 virtual void FrontendFooter(Handle<Name> name, Label* miss);
622 void GenerateRestoreName(MacroAssembler* masm, Label* label, 605 void GenerateRestoreName(MacroAssembler* masm, Label* label,
623 Handle<Name> name); 606 Handle<Name> name);
624 607
625 private: 608 private:
626 void GenerateStoreArrayLength(); 609 void GenerateStoreArrayLength();
627 610
628 void GenerateNegativeHolderLookup(MacroAssembler* masm, 611 void GenerateNegativeHolderLookup(MacroAssembler* masm,
629 Handle<JSObject> holder, 612 Handle<JSObject> holder,
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
665 } 648 }
666 649
667 static Register value(); 650 static Register value();
668 }; 651 };
669 652
670 653
671 class ElementHandlerCompiler : public PropertyHandlerCompiler { 654 class ElementHandlerCompiler : public PropertyHandlerCompiler {
672 public: 655 public:
673 explicit ElementHandlerCompiler(Isolate* isolate) 656 explicit ElementHandlerCompiler(Isolate* isolate)
674 : PropertyHandlerCompiler(isolate, Code::KEYED_LOAD_IC, 657 : PropertyHandlerCompiler(isolate, Code::KEYED_LOAD_IC,
675 kCacheOnReceiver) {} 658 Handle<HeapType>::null(), kCacheOnReceiver) {}
676 659
677 virtual ~ElementHandlerCompiler() {} 660 virtual ~ElementHandlerCompiler() {}
678 661
679 void CompileElementHandlers(MapHandleList* receiver_maps, 662 void CompileElementHandlers(MapHandleList* receiver_maps,
680 CodeHandleList* handlers); 663 CodeHandleList* handlers);
681 664
682 static void GenerateLoadDictionaryElement(MacroAssembler* masm); 665 static void GenerateLoadDictionaryElement(MacroAssembler* masm);
683 static void GenerateStoreDictionaryElement(MacroAssembler* masm); 666 static void GenerateStoreDictionaryElement(MacroAssembler* masm);
684 }; 667 };
685 668
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 Handle<JSFunction> constant_function_; 720 Handle<JSFunction> constant_function_;
738 bool is_simple_api_call_; 721 bool is_simple_api_call_;
739 Handle<FunctionTemplateInfo> expected_receiver_type_; 722 Handle<FunctionTemplateInfo> expected_receiver_type_;
740 Handle<CallHandlerInfo> api_call_info_; 723 Handle<CallHandlerInfo> api_call_info_;
741 }; 724 };
742 725
743 726
744 } } // namespace v8::internal 727 } } // namespace v8::internal
745 728
746 #endif // V8_STUB_CACHE_H_ 729 #endif // V8_STUB_CACHE_H_
OLDNEW
« src/objects.cc ('K') | « src/objects-inl.h ('k') | src/stub-cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698