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

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

Issue 112863002: Merge bleeding_edge 18021:18297 (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/parser
Patch Set: Created 7 years 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/smart-pointers.h ('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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 }; 76 };
77 77
78 void Initialize(); 78 void Initialize();
79 79
80 Handle<JSObject> StubHolder(Handle<JSObject> receiver, 80 Handle<JSObject> StubHolder(Handle<JSObject> receiver,
81 Handle<JSObject> holder); 81 Handle<JSObject> holder);
82 82
83 Handle<Code> FindIC(Handle<Name> name, 83 Handle<Code> FindIC(Handle<Name> name,
84 Handle<Map> stub_holder_map, 84 Handle<Map> stub_holder_map,
85 Code::Kind kind, 85 Code::Kind kind,
86 Code::ExtraICState extra_state = Code::kNoExtraICState, 86 ExtraICState extra_state = kNoExtraICState,
87 InlineCacheHolderFlag cache_holder = OWN_MAP); 87 InlineCacheHolderFlag cache_holder = OWN_MAP);
88 88
89 Handle<Code> FindHandler(Handle<Name> name, 89 Handle<Code> FindHandler(Handle<Name> name,
90 Handle<HeapObject> stub_holder, 90 Handle<Map> map,
91 Code::Kind kind, 91 Code::Kind kind,
92 InlineCacheHolderFlag cache_holder = OWN_MAP, 92 InlineCacheHolderFlag cache_holder = OWN_MAP);
93 StrictModeFlag strict_mode = kNonStrictMode);
94 93
95 Handle<Code> ComputeMonomorphicIC(Handle<Name> name, 94 Handle<Code> ComputeMonomorphicIC(Handle<Name> name,
96 Handle<Type> type, 95 Handle<Type> type,
97 Handle<Code> handler, 96 Handle<Code> handler,
98 StrictModeFlag strict_mode); 97 ExtraICState extra_ic_state);
99 98
100 Handle<Code> ComputeLoadNonexistent(Handle<Name> name, Handle<Object> object); 99 Handle<Code> ComputeLoadNonexistent(Handle<Name> name, Handle<Type> type);
101 100
102 Handle<Code> ComputeKeyedLoadElement(Handle<Map> receiver_map); 101 Handle<Code> ComputeKeyedLoadElement(Handle<Map> receiver_map);
103 102
104 Handle<Code> ComputeKeyedStoreElement(Handle<Map> receiver_map, 103 Handle<Code> ComputeKeyedStoreElement(Handle<Map> receiver_map,
105 StrictModeFlag strict_mode, 104 StrictModeFlag strict_mode,
106 KeyedAccessStoreMode store_mode); 105 KeyedAccessStoreMode store_mode);
107 106
108 Handle<Code> ComputeCallField(int argc, 107 Handle<Code> ComputeCallField(int argc,
109 Code::Kind, 108 Code::Kind,
110 Code::ExtraICState extra_state, 109 ExtraICState extra_state,
111 Handle<Name> name, 110 Handle<Name> name,
112 Handle<Object> object, 111 Handle<Object> object,
113 Handle<JSObject> holder, 112 Handle<JSObject> holder,
114 PropertyIndex index); 113 PropertyIndex index);
115 114
116 Handle<Code> ComputeCallConstant(int argc, 115 Handle<Code> ComputeCallConstant(int argc,
117 Code::Kind, 116 Code::Kind,
118 Code::ExtraICState extra_state, 117 ExtraICState extra_state,
119 Handle<Name> name, 118 Handle<Name> name,
120 Handle<Object> object, 119 Handle<Object> object,
121 Handle<JSObject> holder, 120 Handle<JSObject> holder,
122 Handle<JSFunction> function); 121 Handle<JSFunction> function);
123 122
124 Handle<Code> ComputeCallInterceptor(int argc, 123 Handle<Code> ComputeCallInterceptor(int argc,
125 Code::Kind, 124 Code::Kind,
126 Code::ExtraICState extra_state, 125 ExtraICState extra_state,
127 Handle<Name> name, 126 Handle<Name> name,
128 Handle<Object> object, 127 Handle<Object> object,
129 Handle<JSObject> holder); 128 Handle<JSObject> holder);
130 129
131 Handle<Code> ComputeCallGlobal(int argc, 130 Handle<Code> ComputeCallGlobal(int argc,
132 Code::Kind, 131 Code::Kind,
133 Code::ExtraICState extra_state, 132 ExtraICState extra_state,
134 Handle<Name> name, 133 Handle<Name> name,
135 Handle<JSObject> object, 134 Handle<JSObject> object,
136 Handle<GlobalObject> holder, 135 Handle<GlobalObject> holder,
137 Handle<PropertyCell> cell, 136 Handle<PropertyCell> cell,
138 Handle<JSFunction> function); 137 Handle<JSFunction> function);
139 138
140 // --- 139 // ---
141 140
142 Handle<Code> ComputeCallInitialize(int argc, RelocInfo::Mode mode); 141 Handle<Code> ComputeCallInitialize(int argc, RelocInfo::Mode mode);
143 142
144 Handle<Code> ComputeKeyedCallInitialize(int argc); 143 Handle<Code> ComputeKeyedCallInitialize(int argc);
145 144
146 Handle<Code> ComputeCallPreMonomorphic(int argc, 145 Handle<Code> ComputeCallPreMonomorphic(int argc,
147 Code::Kind kind, 146 Code::Kind kind,
148 Code::ExtraICState extra_state); 147 ExtraICState extra_state);
149 148
150 Handle<Code> ComputeCallNormal(int argc, 149 Handle<Code> ComputeCallNormal(int argc,
151 Code::Kind kind, 150 Code::Kind kind,
152 Code::ExtraICState state); 151 ExtraICState state);
153 152
154 Handle<Code> ComputeCallArguments(int argc); 153 Handle<Code> ComputeCallArguments(int argc);
155 154
156 Handle<Code> ComputeCallMegamorphic(int argc, 155 Handle<Code> ComputeCallMegamorphic(int argc,
157 Code::Kind kind, 156 Code::Kind kind,
158 Code::ExtraICState state); 157 ExtraICState state);
159 158
160 Handle<Code> ComputeCallMiss(int argc, 159 Handle<Code> ComputeCallMiss(int argc,
161 Code::Kind kind, 160 Code::Kind kind,
162 Code::ExtraICState state); 161 ExtraICState state);
163 162
164 // --- 163 // ---
165 164
166 Handle<Code> ComputeCompareNil(Handle<Map> receiver_map, 165 Handle<Code> ComputeCompareNil(Handle<Map> receiver_map,
167 CompareNilICStub& stub); 166 CompareNilICStub& stub);
168 167
169 // --- 168 // ---
170 169
171 Handle<Code> ComputeLoadElementPolymorphic(MapHandleList* receiver_maps); 170 Handle<Code> ComputeLoadElementPolymorphic(MapHandleList* receiver_maps);
172 Handle<Code> ComputeStoreElementPolymorphic(MapHandleList* receiver_maps, 171 Handle<Code> ComputeStoreElementPolymorphic(MapHandleList* receiver_maps,
173 KeyedAccessStoreMode store_mode, 172 KeyedAccessStoreMode store_mode,
174 StrictModeFlag strict_mode); 173 StrictModeFlag strict_mode);
175 174
176 Handle<Code> ComputePolymorphicIC(TypeHandleList* types, 175 Handle<Code> ComputePolymorphicIC(TypeHandleList* types,
177 CodeHandleList* handlers, 176 CodeHandleList* handlers,
178 int number_of_valid_maps, 177 int number_of_valid_maps,
179 Handle<Name> name, 178 Handle<Name> name,
180 StrictModeFlag strict_mode); 179 ExtraICState extra_ic_state);
181 180
182 // Finds the Code object stored in the Heap::non_monomorphic_cache(). 181 // Finds the Code object stored in the Heap::non_monomorphic_cache().
183 Code* FindCallInitialize(int argc, RelocInfo::Mode mode, Code::Kind kind); 182 Code* FindCallInitialize(int argc, RelocInfo::Mode mode, Code::Kind kind);
184 183
185 #ifdef ENABLE_DEBUGGER_SUPPORT 184 #ifdef ENABLE_DEBUGGER_SUPPORT
186 Handle<Code> ComputeCallDebugBreak(int argc, Code::Kind kind); 185 Handle<Code> ComputeCallDebugBreak(int argc, Code::Kind kind);
187 186
188 Handle<Code> ComputeCallDebugPrepareStepIn(int argc, Code::Kind kind); 187 Handle<Code> ComputeCallDebugPrepareStepIn(int argc, Code::Kind kind);
189 #endif 188 #endif
190 189
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
358 DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedLoadPropertyWithInterceptor); 357 DECLARE_RUNTIME_FUNCTION(MaybeObject*, KeyedLoadPropertyWithInterceptor);
359 358
360 359
361 enum PrototypeCheckType { CHECK_ALL_MAPS, SKIP_RECEIVER }; 360 enum PrototypeCheckType { CHECK_ALL_MAPS, SKIP_RECEIVER };
362 enum IcCheckType { ELEMENT, PROPERTY }; 361 enum IcCheckType { ELEMENT, PROPERTY };
363 362
364 363
365 // The stub compilers compile stubs for the stub cache. 364 // The stub compilers compile stubs for the stub cache.
366 class StubCompiler BASE_EMBEDDED { 365 class StubCompiler BASE_EMBEDDED {
367 public: 366 public:
368 explicit StubCompiler(Isolate* isolate) 367 explicit StubCompiler(Isolate* isolate,
369 : isolate_(isolate), masm_(isolate, NULL, 256), failure_(NULL) { } 368 ExtraICState extra_ic_state = kNoExtraICState)
369 : isolate_(isolate), extra_ic_state_(extra_ic_state),
370 masm_(isolate, NULL, 256), failure_(NULL) { }
370 371
371 // Functions to compile either CallIC or KeyedCallIC. The specific kind 372 // Functions to compile either CallIC or KeyedCallIC. The specific kind
372 // is extracted from the code flags. 373 // is extracted from the code flags.
373 Handle<Code> CompileCallInitialize(Code::Flags flags); 374 Handle<Code> CompileCallInitialize(Code::Flags flags);
374 Handle<Code> CompileCallPreMonomorphic(Code::Flags flags); 375 Handle<Code> CompileCallPreMonomorphic(Code::Flags flags);
375 Handle<Code> CompileCallNormal(Code::Flags flags); 376 Handle<Code> CompileCallNormal(Code::Flags flags);
376 Handle<Code> CompileCallMegamorphic(Code::Flags flags); 377 Handle<Code> CompileCallMegamorphic(Code::Flags flags);
377 Handle<Code> CompileCallArguments(Code::Flags flags); 378 Handle<Code> CompileCallArguments(Code::Flags flags);
378 Handle<Code> CompileCallMiss(Code::Flags flags); 379 Handle<Code> CompileCallMiss(Code::Flags flags);
379 380
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 437
437 // Generate code to check that a global property cell is empty. Create 438 // Generate code to check that a global property cell is empty. Create
438 // the property cell at compilation time if no cell exists for the 439 // the property cell at compilation time if no cell exists for the
439 // property. 440 // property.
440 static void GenerateCheckPropertyCell(MacroAssembler* masm, 441 static void GenerateCheckPropertyCell(MacroAssembler* masm,
441 Handle<JSGlobalObject> global, 442 Handle<JSGlobalObject> global,
442 Handle<Name> name, 443 Handle<Name> name,
443 Register scratch, 444 Register scratch,
444 Label* miss); 445 Label* miss);
445 446
446 // Calls GenerateCheckPropertyCell for each global object in the prototype
447 // chain from object to (but not including) holder.
448 static void GenerateCheckPropertyCells(MacroAssembler* masm,
449 Handle<JSObject> object,
450 Handle<JSObject> holder,
451 Handle<Name> name,
452 Register scratch,
453 Label* miss);
454
455 static void TailCallBuiltin(MacroAssembler* masm, Builtins::Name name); 447 static void TailCallBuiltin(MacroAssembler* masm, Builtins::Name name);
456 448
457 // Generates code that verifies that the property holder has not changed 449 // Generates code that verifies that the property holder has not changed
458 // (checking maps of objects in the prototype chain for fast and global 450 // (checking maps of objects in the prototype chain for fast and global
459 // objects or doing negative lookup for slow objects, ensures that the 451 // objects or doing negative lookup for slow objects, ensures that the
460 // property cells for global objects are still empty) and checks that the map 452 // property cells for global objects are still empty) and checks that the map
461 // of the holder has not changed. If necessary the function also generates 453 // of the holder has not changed. If necessary the function also generates
462 // code for security check in case of global object holders. Helps to make 454 // code for security check in case of global object holders. Helps to make
463 // sure that the current IC is still valid. 455 // sure that the current IC is still valid.
464 // 456 //
465 // The scratch and holder registers are always clobbered, but the object 457 // The scratch and holder registers are always clobbered, but the object
466 // register is only clobbered if it the same as the holder register. The 458 // register is only clobbered if it the same as the holder register. The
467 // function returns a register containing the holder - either object_reg or 459 // function returns a register containing the holder - either object_reg or
468 // holder_reg. 460 // holder_reg.
469 // The function can optionally (when save_at_depth != 461 // The function can optionally (when save_at_depth !=
470 // kInvalidProtoDepth) save the object at the given depth by moving 462 // kInvalidProtoDepth) save the object at the given depth by moving
471 // it to [esp + kPointerSize]. 463 // it to [esp + kPointerSize].
472 Register CheckPrototypes(Handle<JSObject> object, 464 Register CheckPrototypes(Handle<Type> type,
473 Register object_reg, 465 Register object_reg,
474 Handle<JSObject> holder, 466 Handle<JSObject> holder,
475 Register holder_reg, 467 Register holder_reg,
476 Register scratch1, 468 Register scratch1,
477 Register scratch2, 469 Register scratch2,
478 Handle<Name> name, 470 Handle<Name> name,
479 Label* miss, 471 Label* miss,
480 PrototypeCheckType check = CHECK_ALL_MAPS) { 472 PrototypeCheckType check = CHECK_ALL_MAPS) {
481 return CheckPrototypes(object, object_reg, holder, holder_reg, scratch1, 473 return CheckPrototypes(type, object_reg, holder, holder_reg, scratch1,
482 scratch2, name, kInvalidProtoDepth, miss, check); 474 scratch2, name, kInvalidProtoDepth, miss, check);
483 } 475 }
484 476
485 Register CheckPrototypes(Handle<JSObject> object, 477 Register CheckPrototypes(Handle<Type> type,
486 Register object_reg, 478 Register object_reg,
487 Handle<JSObject> holder, 479 Handle<JSObject> holder,
488 Register holder_reg, 480 Register holder_reg,
489 Register scratch1, 481 Register scratch1,
490 Register scratch2, 482 Register scratch2,
491 Handle<Name> name, 483 Handle<Name> name,
492 int save_at_depth, 484 int save_at_depth,
493 Label* miss, 485 Label* miss,
494 PrototypeCheckType check = CHECK_ALL_MAPS); 486 PrototypeCheckType check = CHECK_ALL_MAPS);
495 487
496 void GenerateBooleanCheck(Register object, Label* miss); 488 void GenerateBooleanCheck(Register object, Label* miss);
497 489
498 protected: 490 protected:
499 Handle<Code> GetCodeWithFlags(Code::Flags flags, const char* name); 491 Handle<Code> GetCodeWithFlags(Code::Flags flags, const char* name);
500 Handle<Code> GetCodeWithFlags(Code::Flags flags, Handle<Name> name); 492 Handle<Code> GetCodeWithFlags(Code::Flags flags, Handle<Name> name);
501 493
494 ExtraICState extra_state() { return extra_ic_state_; }
495
502 MacroAssembler* masm() { return &masm_; } 496 MacroAssembler* masm() { return &masm_; }
503 void set_failure(Failure* failure) { failure_ = failure; } 497 void set_failure(Failure* failure) { failure_ = failure; }
504 498
505 static void LookupPostInterceptor(Handle<JSObject> holder, 499 static void LookupPostInterceptor(Handle<JSObject> holder,
506 Handle<Name> name, 500 Handle<Name> name,
507 LookupResult* lookup); 501 LookupResult* lookup);
508 502
509 Isolate* isolate() { return isolate_; } 503 Isolate* isolate() { return isolate_; }
510 Heap* heap() { return isolate()->heap(); } 504 Heap* heap() { return isolate()->heap(); }
511 Factory* factory() { return isolate()->factory(); } 505 Factory* factory() { return isolate()->factory(); }
512 506
513 static void GenerateTailCall(MacroAssembler* masm, Handle<Code> code); 507 static void GenerateTailCall(MacroAssembler* masm, Handle<Code> code);
514 508
515 private: 509 private:
516 Isolate* isolate_; 510 Isolate* isolate_;
511 const ExtraICState extra_ic_state_;
517 MacroAssembler masm_; 512 MacroAssembler masm_;
518 Failure* failure_; 513 Failure* failure_;
519 }; 514 };
520 515
521 516
522 enum FrontendCheckType { PERFORM_INITIAL_CHECKS, SKIP_INITIAL_CHECKS }; 517 enum FrontendCheckType { PERFORM_INITIAL_CHECKS, SKIP_INITIAL_CHECKS };
523 518
524 519
525 class BaseLoadStoreStubCompiler: public StubCompiler { 520 class BaseLoadStoreStubCompiler: public StubCompiler {
526 public: 521 public:
527 BaseLoadStoreStubCompiler(Isolate* isolate, 522 BaseLoadStoreStubCompiler(Isolate* isolate,
528 Code::Kind kind, 523 Code::Kind kind,
524 ExtraICState extra_ic_state = kNoExtraICState,
529 InlineCacheHolderFlag cache_holder = OWN_MAP) 525 InlineCacheHolderFlag cache_holder = OWN_MAP)
530 : StubCompiler(isolate), kind_(kind), cache_holder_(cache_holder) { 526 : StubCompiler(isolate, extra_ic_state),
527 kind_(kind),
528 cache_holder_(cache_holder) {
531 InitializeRegisters(); 529 InitializeRegisters();
532 } 530 }
533 virtual ~BaseLoadStoreStubCompiler() { } 531 virtual ~BaseLoadStoreStubCompiler() { }
534 532
535 Handle<Code> CompileMonomorphicIC(Handle<Type> type, 533 Handle<Code> CompileMonomorphicIC(Handle<Type> type,
536 Handle<Code> handler, 534 Handle<Code> handler,
537 Handle<Name> name); 535 Handle<Name> name);
538 536
539 Handle<Code> CompilePolymorphicIC(TypeHandleList* types, 537 Handle<Code> CompilePolymorphicIC(TypeHandleList* types,
540 CodeHandleList* handlers, 538 CodeHandleList* handlers,
(...skipping 10 matching lines...) Expand all
551 case Code::LOAD_IC: return Builtins::kLoadIC_Miss; 549 case Code::LOAD_IC: return Builtins::kLoadIC_Miss;
552 case Code::STORE_IC: return Builtins::kStoreIC_Miss; 550 case Code::STORE_IC: return Builtins::kStoreIC_Miss;
553 case Code::KEYED_LOAD_IC: return Builtins::kKeyedLoadIC_Miss; 551 case Code::KEYED_LOAD_IC: return Builtins::kKeyedLoadIC_Miss;
554 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Miss; 552 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Miss;
555 default: UNREACHABLE(); 553 default: UNREACHABLE();
556 } 554 }
557 return Builtins::kLoadIC_Miss; 555 return Builtins::kLoadIC_Miss;
558 } 556 }
559 557
560 protected: 558 protected:
561 virtual Register HandlerFrontendHeader(Handle<Object> object, 559 virtual Register HandlerFrontendHeader(Handle<Type> type,
562 Register object_reg, 560 Register object_reg,
563 Handle<JSObject> holder, 561 Handle<JSObject> holder,
564 Handle<Name> name, 562 Handle<Name> name,
565 Label* miss) = 0; 563 Label* miss) = 0;
566 564
567 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss) = 0; 565 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss) = 0;
568 566
569 Register HandlerFrontend(Handle<Object> object, 567 Register HandlerFrontend(Handle<Type> type,
570 Register object_reg, 568 Register object_reg,
571 Handle<JSObject> holder, 569 Handle<JSObject> holder,
572 Handle<Name> name); 570 Handle<Name> name);
573 571
574 Handle<Code> GetCode(Code::Kind kind, 572 Handle<Code> GetCode(Code::Kind kind,
575 Code::StubType type, 573 Code::StubType type,
576 Handle<Name> name); 574 Handle<Name> name);
577 575
578 Handle<Code> GetICCode(Code::Kind kind, 576 Handle<Code> GetICCode(Code::Kind kind,
579 Code::StubType type, 577 Code::StubType type,
(...skipping 12 matching lines...) Expand all
592 } else if (kind_ == Code::STORE_IC) { 590 } else if (kind_ == Code::STORE_IC) {
593 return code->ic_state() == MONOMORPHIC 591 return code->ic_state() == MONOMORPHIC
594 ? Logger::STORE_IC_TAG : Logger::STORE_POLYMORPHIC_IC_TAG; 592 ? Logger::STORE_IC_TAG : Logger::STORE_POLYMORPHIC_IC_TAG;
595 } else { 593 } else {
596 return code->ic_state() == MONOMORPHIC 594 return code->ic_state() == MONOMORPHIC
597 ? Logger::KEYED_STORE_IC_TAG : Logger::KEYED_STORE_POLYMORPHIC_IC_TAG; 595 ? Logger::KEYED_STORE_IC_TAG : Logger::KEYED_STORE_POLYMORPHIC_IC_TAG;
598 } 596 }
599 } 597 }
600 void JitEvent(Handle<Name> name, Handle<Code> code); 598 void JitEvent(Handle<Name> name, Handle<Code> code);
601 599
602 virtual Code::ExtraICState extra_state() { return Code::kNoExtraICState; }
603 virtual Register receiver() = 0; 600 virtual Register receiver() = 0;
604 virtual Register name() = 0; 601 virtual Register name() = 0;
605 virtual Register scratch1() = 0; 602 virtual Register scratch1() = 0;
606 virtual Register scratch2() = 0; 603 virtual Register scratch2() = 0;
607 virtual Register scratch3() = 0; 604 virtual Register scratch3() = 0;
608 605
609 void InitializeRegisters(); 606 void InitializeRegisters();
610 607
611 bool IncludesNumberType(TypeHandleList* types); 608 bool IncludesNumberType(TypeHandleList* types);
612 609
613 Code::Kind kind_; 610 Code::Kind kind_;
614 InlineCacheHolderFlag cache_holder_; 611 InlineCacheHolderFlag cache_holder_;
615 Register* registers_; 612 Register* registers_;
616 }; 613 };
617 614
618 615
619 class LoadStubCompiler: public BaseLoadStoreStubCompiler { 616 class LoadStubCompiler: public BaseLoadStoreStubCompiler {
620 public: 617 public:
621 LoadStubCompiler(Isolate* isolate, 618 LoadStubCompiler(Isolate* isolate,
619 ExtraICState extra_ic_state = kNoExtraICState,
622 InlineCacheHolderFlag cache_holder = OWN_MAP, 620 InlineCacheHolderFlag cache_holder = OWN_MAP,
623 Code::Kind kind = Code::LOAD_IC) 621 Code::Kind kind = Code::LOAD_IC)
624 : BaseLoadStoreStubCompiler(isolate, kind, cache_holder) { } 622 : BaseLoadStoreStubCompiler(isolate, kind, extra_ic_state,
623 cache_holder) { }
625 virtual ~LoadStubCompiler() { } 624 virtual ~LoadStubCompiler() { }
626 625
627 Handle<Code> CompileLoadField(Handle<Object> object, 626 Handle<Code> CompileLoadField(Handle<Type> type,
628 Handle<JSObject> holder, 627 Handle<JSObject> holder,
629 Handle<Name> name, 628 Handle<Name> name,
630 PropertyIndex index, 629 PropertyIndex index,
631 Representation representation); 630 Representation representation);
632 631
633 Handle<Code> CompileLoadCallback(Handle<Object> object, 632 Handle<Code> CompileLoadCallback(Handle<Type> type,
634 Handle<JSObject> holder, 633 Handle<JSObject> holder,
635 Handle<Name> name, 634 Handle<Name> name,
636 Handle<ExecutableAccessorInfo> callback); 635 Handle<ExecutableAccessorInfo> callback);
637 636
638 Handle<Code> CompileLoadCallback(Handle<Object> object, 637 Handle<Code> CompileLoadCallback(Handle<Type> type,
639 Handle<JSObject> holder, 638 Handle<JSObject> holder,
640 Handle<Name> name, 639 Handle<Name> name,
641 const CallOptimization& call_optimization); 640 const CallOptimization& call_optimization);
642 641
643 Handle<Code> CompileLoadConstant(Handle<Object> object, 642 Handle<Code> CompileLoadConstant(Handle<Type> type,
644 Handle<JSObject> holder, 643 Handle<JSObject> holder,
645 Handle<Name> name, 644 Handle<Name> name,
646 Handle<Object> value); 645 Handle<Object> value);
647 646
648 Handle<Code> CompileLoadInterceptor(Handle<Object> object, 647 Handle<Code> CompileLoadInterceptor(Handle<Type> type,
649 Handle<JSObject> holder, 648 Handle<JSObject> holder,
650 Handle<Name> name); 649 Handle<Name> name);
651 650
652 Handle<Code> CompileLoadViaGetter(Handle<Object> object, 651 Handle<Code> CompileLoadViaGetter(Handle<Type> type,
653 Handle<JSObject> holder, 652 Handle<JSObject> holder,
654 Handle<Name> name, 653 Handle<Name> name,
655 Handle<JSFunction> getter); 654 Handle<JSFunction> getter);
656 655
657 static void GenerateLoadViaGetter(MacroAssembler* masm, 656 static void GenerateLoadViaGetter(MacroAssembler* masm,
658 Register receiver, 657 Register receiver,
659 Handle<JSFunction> getter); 658 Handle<JSFunction> getter);
660 659
661 Handle<Code> CompileLoadNonexistent(Handle<Object> object, 660 Handle<Code> CompileLoadNonexistent(Handle<Type> type,
662 Handle<JSObject> last, 661 Handle<JSObject> last,
663 Handle<Name> name, 662 Handle<Name> name);
664 Handle<JSGlobalObject> global);
665 663
666 Handle<Code> CompileLoadGlobal(Handle<Object> object, 664 Handle<Code> CompileLoadGlobal(Handle<Type> type,
667 Handle<GlobalObject> holder, 665 Handle<GlobalObject> holder,
668 Handle<PropertyCell> cell, 666 Handle<PropertyCell> cell,
669 Handle<Name> name, 667 Handle<Name> name,
670 bool is_dont_delete); 668 bool is_dont_delete);
671 669
672 static Register* registers(); 670 static Register* registers();
673 671
674 protected: 672 protected:
675 virtual Register HandlerFrontendHeader(Handle<Object> object, 673 virtual Register HandlerFrontendHeader(Handle<Type> type,
676 Register object_reg, 674 Register object_reg,
677 Handle<JSObject> holder, 675 Handle<JSObject> holder,
678 Handle<Name> name, 676 Handle<Name> name,
679 Label* miss); 677 Label* miss);
680 678
681 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss); 679 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss);
682 680
683 Register CallbackHandlerFrontend(Handle<Object> object, 681 Register CallbackHandlerFrontend(Handle<Type> type,
684 Register object_reg, 682 Register object_reg,
685 Handle<JSObject> holder, 683 Handle<JSObject> holder,
686 Handle<Name> name, 684 Handle<Name> name,
687 Handle<Object> callback); 685 Handle<Object> callback);
688 void NonexistentHandlerFrontend(Handle<Object> object, 686 void NonexistentHandlerFrontend(Handle<Type> type,
689 Handle<JSObject> last, 687 Handle<JSObject> last,
690 Handle<Name> name, 688 Handle<Name> name);
691 Handle<JSGlobalObject> global);
692 689
693 void GenerateLoadField(Register reg, 690 void GenerateLoadField(Register reg,
694 Handle<JSObject> holder, 691 Handle<JSObject> holder,
695 PropertyIndex field, 692 PropertyIndex field,
696 Representation representation); 693 Representation representation);
697 void GenerateLoadConstant(Handle<Object> value); 694 void GenerateLoadConstant(Handle<Object> value);
698 void GenerateLoadCallback(Register reg, 695 void GenerateLoadCallback(Register reg,
699 Handle<ExecutableAccessorInfo> callback); 696 Handle<ExecutableAccessorInfo> callback);
700 void GenerateLoadCallback(const CallOptimization& call_optimization); 697 void GenerateLoadCallback(const CallOptimization& call_optimization);
701 void GenerateLoadInterceptor(Register holder_reg, 698 void GenerateLoadInterceptor(Register holder_reg,
(...skipping 11 matching lines...) Expand all
713 virtual Register scratch1() { return registers_[2]; } 710 virtual Register scratch1() { return registers_[2]; }
714 virtual Register scratch2() { return registers_[3]; } 711 virtual Register scratch2() { return registers_[3]; }
715 virtual Register scratch3() { return registers_[4]; } 712 virtual Register scratch3() { return registers_[4]; }
716 Register scratch4() { return registers_[5]; } 713 Register scratch4() { return registers_[5]; }
717 }; 714 };
718 715
719 716
720 class KeyedLoadStubCompiler: public LoadStubCompiler { 717 class KeyedLoadStubCompiler: public LoadStubCompiler {
721 public: 718 public:
722 KeyedLoadStubCompiler(Isolate* isolate, 719 KeyedLoadStubCompiler(Isolate* isolate,
720 ExtraICState extra_ic_state = kNoExtraICState,
723 InlineCacheHolderFlag cache_holder = OWN_MAP) 721 InlineCacheHolderFlag cache_holder = OWN_MAP)
724 : LoadStubCompiler(isolate, cache_holder, Code::KEYED_LOAD_IC) { } 722 : LoadStubCompiler(isolate, extra_ic_state, cache_holder,
723 Code::KEYED_LOAD_IC) { }
725 724
726 Handle<Code> CompileLoadElement(Handle<Map> receiver_map); 725 Handle<Code> CompileLoadElement(Handle<Map> receiver_map);
727 726
728 void CompileElementHandlers(MapHandleList* receiver_maps, 727 void CompileElementHandlers(MapHandleList* receiver_maps,
729 CodeHandleList* handlers); 728 CodeHandleList* handlers);
730 729
731 static void GenerateLoadDictionaryElement(MacroAssembler* masm); 730 static void GenerateLoadDictionaryElement(MacroAssembler* masm);
732 731
733 protected: 732 protected:
734 static Register* registers(); 733 static Register* registers();
735 734
736 private: 735 private:
737 virtual void GenerateNameCheck(Handle<Name> name, 736 virtual void GenerateNameCheck(Handle<Name> name,
738 Register name_reg, 737 Register name_reg,
739 Label* miss); 738 Label* miss);
740 friend class BaseLoadStoreStubCompiler; 739 friend class BaseLoadStoreStubCompiler;
741 }; 740 };
742 741
743 742
744 class StoreStubCompiler: public BaseLoadStoreStubCompiler { 743 class StoreStubCompiler: public BaseLoadStoreStubCompiler {
745 public: 744 public:
746 StoreStubCompiler(Isolate* isolate, 745 StoreStubCompiler(Isolate* isolate,
747 StrictModeFlag strict_mode, 746 ExtraICState extra_ic_state,
748 Code::Kind kind = Code::STORE_IC) 747 Code::Kind kind = Code::STORE_IC)
749 : BaseLoadStoreStubCompiler(isolate, kind), 748 : BaseLoadStoreStubCompiler(isolate, kind, extra_ic_state) {}
750 strict_mode_(strict_mode) { }
751 749
752 virtual ~StoreStubCompiler() { } 750 virtual ~StoreStubCompiler() { }
753 751
754 Handle<Code> CompileStoreTransition(Handle<JSObject> object, 752 Handle<Code> CompileStoreTransition(Handle<JSObject> object,
755 LookupResult* lookup, 753 LookupResult* lookup,
756 Handle<Map> transition, 754 Handle<Map> transition,
757 Handle<Name> name); 755 Handle<Name> name);
758 756
759 Handle<Code> CompileStoreField(Handle<JSObject> object, 757 Handle<Code> CompileStoreField(Handle<JSObject> object,
760 LookupResult* lookup, 758 LookupResult* lookup,
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 static Builtins::Name SlowBuiltin(Code::Kind kind) { 812 static Builtins::Name SlowBuiltin(Code::Kind kind) {
815 switch (kind) { 813 switch (kind) {
816 case Code::STORE_IC: return Builtins::kStoreIC_Slow; 814 case Code::STORE_IC: return Builtins::kStoreIC_Slow;
817 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Slow; 815 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Slow;
818 default: UNREACHABLE(); 816 default: UNREACHABLE();
819 } 817 }
820 return Builtins::kStoreIC_Slow; 818 return Builtins::kStoreIC_Slow;
821 } 819 }
822 820
823 protected: 821 protected:
824 virtual Register HandlerFrontendHeader(Handle<Object> object, 822 virtual Register HandlerFrontendHeader(Handle<Type> type,
825 Register object_reg, 823 Register object_reg,
826 Handle<JSObject> holder, 824 Handle<JSObject> holder,
827 Handle<Name> name, 825 Handle<Name> name,
828 Label* miss); 826 Label* miss);
829 827
830 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss); 828 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss);
831 void GenerateRestoreName(MacroAssembler* masm, 829 void GenerateRestoreName(MacroAssembler* masm,
832 Label* label, 830 Label* label,
833 Handle<Name> name); 831 Handle<Name> name);
834 832
835 virtual Register receiver() { return registers_[0]; } 833 virtual Register receiver() { return registers_[0]; }
836 virtual Register name() { return registers_[1]; } 834 virtual Register name() { return registers_[1]; }
837 Register value() { return registers_[2]; } 835 Register value() { return registers_[2]; }
838 virtual Register scratch1() { return registers_[3]; } 836 virtual Register scratch1() { return registers_[3]; }
839 virtual Register scratch2() { return registers_[4]; } 837 virtual Register scratch2() { return registers_[4]; }
840 virtual Register scratch3() { return registers_[5]; } 838 virtual Register scratch3() { return registers_[5]; }
841 StrictModeFlag strict_mode() { return strict_mode_; }
842 virtual Code::ExtraICState extra_state() { return strict_mode_; }
843 839
844 protected: 840 protected:
845 static Register* registers(); 841 static Register* registers();
846 842
847 private: 843 private:
848 StrictModeFlag strict_mode_;
849 friend class BaseLoadStoreStubCompiler; 844 friend class BaseLoadStoreStubCompiler;
850 }; 845 };
851 846
852 847
853 class KeyedStoreStubCompiler: public StoreStubCompiler { 848 class KeyedStoreStubCompiler: public StoreStubCompiler {
854 public: 849 public:
855 KeyedStoreStubCompiler(Isolate* isolate, 850 KeyedStoreStubCompiler(Isolate* isolate,
856 StrictModeFlag strict_mode, 851 ExtraICState extra_ic_state)
857 KeyedAccessStoreMode store_mode) 852 : StoreStubCompiler(isolate, extra_ic_state, Code::KEYED_STORE_IC) {}
858 : StoreStubCompiler(isolate, strict_mode, Code::KEYED_STORE_IC),
859 store_mode_(store_mode) { }
860 853
861 Handle<Code> CompileStoreElement(Handle<Map> receiver_map); 854 Handle<Code> CompileStoreElement(Handle<Map> receiver_map);
862 855
863 Handle<Code> CompileStorePolymorphic(MapHandleList* receiver_maps, 856 Handle<Code> CompileStorePolymorphic(MapHandleList* receiver_maps,
864 CodeHandleList* handler_stubs, 857 CodeHandleList* handler_stubs,
865 MapHandleList* transitioned_maps); 858 MapHandleList* transitioned_maps);
866 859
867 Handle<Code> CompileStoreElementPolymorphic(MapHandleList* receiver_maps); 860 Handle<Code> CompileStoreElementPolymorphic(MapHandleList* receiver_maps);
868 861
869 static void GenerateStoreDictionaryElement(MacroAssembler* masm); 862 static void GenerateStoreDictionaryElement(MacroAssembler* masm);
870 863
871 protected: 864 protected:
872 virtual Code::ExtraICState extra_state() { 865 static Register* registers();
873 return Code::ComputeExtraICState(store_mode_, strict_mode()); 866
867 KeyedAccessStoreMode store_mode() {
868 return KeyedStoreIC::GetKeyedAccessStoreMode(extra_state());
874 } 869 }
875 static Register* registers();
876 870
877 private: 871 private:
878 Register transition_map() { 872 Register transition_map() {
879 return registers()[3]; 873 return registers()[3];
880 } 874 }
881 875
882 virtual void GenerateNameCheck(Handle<Name> name, 876 virtual void GenerateNameCheck(Handle<Name> name,
883 Register name_reg, 877 Register name_reg,
884 Label* miss); 878 Label* miss);
885 KeyedAccessStoreMode store_mode_;
886 friend class BaseLoadStoreStubCompiler; 879 friend class BaseLoadStoreStubCompiler;
887 }; 880 };
888 881
889 882
890 // Subset of FUNCTIONS_WITH_ID_LIST with custom constant/global call 883 // Subset of FUNCTIONS_WITH_ID_LIST with custom constant/global call
891 // IC stubs. 884 // IC stubs.
892 #define CUSTOM_CALL_IC_GENERATORS(V) \ 885 #define CUSTOM_CALL_IC_GENERATORS(V) \
893 V(ArrayPush) \ 886 V(ArrayPush) \
894 V(ArrayPop) \ 887 V(ArrayPop) \
895 V(StringCharCodeAt) \ 888 V(StringCharCodeAt) \
896 V(StringCharAt) \ 889 V(StringCharAt) \
897 V(StringFromCharCode) \ 890 V(StringFromCharCode) \
898 V(MathFloor) \ 891 V(MathFloor) \
899 V(MathAbs) \ 892 V(MathAbs) \
900 V(ArrayCode) 893 V(ArrayCode)
901 894
902 895
903 #define SITE_SPECIFIC_CALL_GENERATORS(V) \ 896 #define SITE_SPECIFIC_CALL_GENERATORS(V) \
904 V(ArrayCode) 897 V(ArrayCode)
905 898
906 899
907 class CallStubCompiler: public StubCompiler { 900 class CallStubCompiler: public StubCompiler {
908 public: 901 public:
909 CallStubCompiler(Isolate* isolate, 902 CallStubCompiler(Isolate* isolate,
910 int argc, 903 int argc,
911 Code::Kind kind, 904 Code::Kind kind,
912 Code::ExtraICState extra_state, 905 ExtraICState extra_state,
913 InlineCacheHolderFlag cache_holder = OWN_MAP); 906 InlineCacheHolderFlag cache_holder = OWN_MAP);
914 907
915 Handle<Code> CompileCallField(Handle<JSObject> object, 908 Handle<Code> CompileCallField(Handle<JSObject> object,
916 Handle<JSObject> holder, 909 Handle<JSObject> holder,
917 PropertyIndex index, 910 PropertyIndex index,
918 Handle<Name> name); 911 Handle<Name> name);
919 912
920 void CompileHandlerFrontend(Handle<Object> object, 913 // Patch the global proxy over the global object if the global object is the
921 Handle<JSObject> holder, 914 // receiver.
922 Handle<Name> name, 915 void PatchGlobalProxy(Handle<Object> object);
923 CheckType check);
924 916
925 void CompileHandlerBackend(Handle<JSFunction> function); 917 // Returns the register containing the holder of |name|.
918 Register HandlerFrontendHeader(Handle<Object> object,
919 Handle<JSObject> holder,
920 Handle<Name> name,
921 CheckType check,
922 Label* miss);
923 void HandlerFrontendFooter(Label* miss);
924
925 void GenerateJumpFunctionIgnoreReceiver(Handle<JSFunction> function);
926 void GenerateJumpFunction(Handle<Object> object,
927 Handle<JSFunction> function);
928 void GenerateJumpFunction(Handle<Object> object,
929 Register function,
930 Label* miss);
931 // Use to call |actual_closure|, a closure with the same shared function info
932 // as |function|.
933 void GenerateJumpFunction(Handle<Object> object,
934 Register actual_closure,
935 Handle<JSFunction> function);
926 936
927 Handle<Code> CompileCallConstant(Handle<Object> object, 937 Handle<Code> CompileCallConstant(Handle<Object> object,
928 Handle<JSObject> holder, 938 Handle<JSObject> holder,
929 Handle<Name> name, 939 Handle<Name> name,
930 CheckType check, 940 CheckType check,
931 Handle<JSFunction> function); 941 Handle<JSFunction> function);
932 942
933 Handle<Code> CompileCallInterceptor(Handle<JSObject> object, 943 Handle<Code> CompileCallInterceptor(Handle<JSObject> object,
934 Handle<JSObject> holder, 944 Handle<JSObject> holder,
935 Handle<Name> name); 945 Handle<Name> name);
(...skipping 28 matching lines...) Expand all
964 CUSTOM_CALL_IC_GENERATORS(DECLARE_CALL_GENERATOR) 974 CUSTOM_CALL_IC_GENERATORS(DECLARE_CALL_GENERATOR)
965 #undef DECLARE_CALL_GENERATOR 975 #undef DECLARE_CALL_GENERATOR
966 976
967 Handle<Code> CompileFastApiCall(const CallOptimization& optimization, 977 Handle<Code> CompileFastApiCall(const CallOptimization& optimization,
968 Handle<Object> object, 978 Handle<Object> object,
969 Handle<JSObject> holder, 979 Handle<JSObject> holder,
970 Handle<Cell> cell, 980 Handle<Cell> cell,
971 Handle<JSFunction> function, 981 Handle<JSFunction> function,
972 Handle<String> name); 982 Handle<String> name);
973 983
984 CallKind call_kind();
985
974 Handle<Code> GetCode(Code::StubType type, Handle<Name> name); 986 Handle<Code> GetCode(Code::StubType type, Handle<Name> name);
975 Handle<Code> GetCode(Handle<JSFunction> function); 987 Handle<Code> GetCode(Handle<JSFunction> function);
976 988
977 const ParameterCount& arguments() { return arguments_; } 989 const ParameterCount& arguments() { return arguments_; }
978 990
979 void GenerateNameCheck(Handle<Name> name, Label* miss); 991 void GenerateNameCheck(Handle<Name> name, Label* miss);
980 992
981 void GenerateGlobalReceiverCheck(Handle<JSObject> object,
982 Handle<JSObject> holder,
983 Handle<Name> name,
984 Label* miss);
985
986 // Generates code to load the function from the cell checking that 993 // Generates code to load the function from the cell checking that
987 // it still contains the same function. 994 // it still contains the same function.
988 void GenerateLoadFunctionFromCell(Handle<Cell> cell, 995 void GenerateLoadFunctionFromCell(Handle<Cell> cell,
989 Handle<JSFunction> function, 996 Handle<JSFunction> function,
990 Label* miss); 997 Label* miss);
991 998
999 void GenerateFunctionCheck(Register function, Register scratch, Label* miss);
1000
992 // Generates a jump to CallIC miss stub. 1001 // Generates a jump to CallIC miss stub.
993 void GenerateMissBranch(); 1002 void GenerateMissBranch();
994 1003
995 const ParameterCount arguments_; 1004 const ParameterCount arguments_;
996 const Code::Kind kind_; 1005 const Code::Kind kind_;
997 const Code::ExtraICState extra_state_;
998 const InlineCacheHolderFlag cache_holder_; 1006 const InlineCacheHolderFlag cache_holder_;
999 }; 1007 };
1000 1008
1001 1009
1002 // Holds information about possible function call optimizations. 1010 // Holds information about possible function call optimizations.
1003 class CallOptimization BASE_EMBEDDED { 1011 class CallOptimization BASE_EMBEDDED {
1004 public: 1012 public:
1005 explicit CallOptimization(LookupResult* lookup); 1013 explicit CallOptimization(LookupResult* lookup);
1006 1014
1007 explicit CallOptimization(Handle<JSFunction> function); 1015 explicit CallOptimization(Handle<JSFunction> function);
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 Handle<JSFunction> constant_function_; 1058 Handle<JSFunction> constant_function_;
1051 bool is_simple_api_call_; 1059 bool is_simple_api_call_;
1052 Handle<FunctionTemplateInfo> expected_receiver_type_; 1060 Handle<FunctionTemplateInfo> expected_receiver_type_;
1053 Handle<CallHandlerInfo> api_call_info_; 1061 Handle<CallHandlerInfo> api_call_info_;
1054 }; 1062 };
1055 1063
1056 1064
1057 } } // namespace v8::internal 1065 } } // namespace v8::internal
1058 1066
1059 #endif // V8_STUB_CACHE_H_ 1067 #endif // V8_STUB_CACHE_H_
OLDNEW
« no previous file with comments | « src/smart-pointers.h ('k') | src/stub-cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698