| OLD | NEW |
| 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_IC_H_ | 5 #ifndef V8_IC_H_ |
| 6 #define V8_IC_H_ | 6 #define V8_IC_H_ |
| 7 | 7 |
| 8 #include "src/ic/ic-state.h" | 8 #include "src/ic/ic-state.h" |
| 9 #include "src/macro-assembler.h" | 9 #include "src/macro-assembler.h" |
| 10 #include "src/messages.h" | 10 #include "src/messages.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 // JavaScript frames on the stack. | 28 // JavaScript frames on the stack. |
| 29 IC(FrameDepth depth, Isolate* isolate, FeedbackNexus* nexus = NULL); | 29 IC(FrameDepth depth, Isolate* isolate, FeedbackNexus* nexus = NULL); |
| 30 virtual ~IC() {} | 30 virtual ~IC() {} |
| 31 | 31 |
| 32 State state() const { return state_; } | 32 State state() const { return state_; } |
| 33 inline Address address() const; | 33 inline Address address() const; |
| 34 | 34 |
| 35 // Compute the current IC state based on the target stub, receiver and name. | 35 // Compute the current IC state based on the target stub, receiver and name. |
| 36 void UpdateState(Handle<Object> receiver, Handle<Object> name); | 36 void UpdateState(Handle<Object> receiver, Handle<Object> name); |
| 37 | 37 |
| 38 bool IsNameCompatibleWithPrototypeFailure(Handle<Object> name); | 38 bool RecomputeHandlerForName(Handle<Object> name); |
| 39 void MarkPrototypeFailure(Handle<Object> name) { | 39 void MarkRecomputeHandler(Handle<Object> name) { |
| 40 DCHECK(IsNameCompatibleWithPrototypeFailure(name)); | 40 DCHECK(RecomputeHandlerForName(name)); |
| 41 old_state_ = state_; | 41 old_state_ = state_; |
| 42 state_ = PROTOTYPE_FAILURE; | 42 state_ = RECOMPUTE_HANDLER; |
| 43 } | 43 } |
| 44 | 44 |
| 45 // Clear the inline cache to initial state. | 45 // Clear the inline cache to initial state. |
| 46 static void Clear(Isolate* isolate, Address address, Address constant_pool); | 46 static void Clear(Isolate* isolate, Address address, Address constant_pool); |
| 47 | 47 |
| 48 #ifdef DEBUG | 48 #ifdef DEBUG |
| 49 bool IsLoadStub() const { | 49 bool IsLoadStub() const { |
| 50 return target()->is_load_stub() || target()->is_keyed_load_stub(); | 50 return target()->is_load_stub() || target()->is_keyed_load_stub(); |
| 51 } | 51 } |
| 52 | 52 |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 if (kind_ == Code::KEYED_LOAD_IC) return Code::LOAD_IC; | 168 if (kind_ == Code::KEYED_LOAD_IC) return Code::LOAD_IC; |
| 169 DCHECK(kind_ == Code::LOAD_IC || kind_ == Code::STORE_IC || | 169 DCHECK(kind_ == Code::LOAD_IC || kind_ == Code::STORE_IC || |
| 170 kind_ == Code::KEYED_STORE_IC); | 170 kind_ == Code::KEYED_STORE_IC); |
| 171 return kind_; | 171 return kind_; |
| 172 } | 172 } |
| 173 virtual Handle<Code> megamorphic_stub() { | 173 virtual Handle<Code> megamorphic_stub() { |
| 174 UNREACHABLE(); | 174 UNREACHABLE(); |
| 175 return Handle<Code>::null(); | 175 return Handle<Code>::null(); |
| 176 } | 176 } |
| 177 | 177 |
| 178 bool TryRemoveInvalidPrototypeDependentStub(Handle<Object> receiver, | 178 bool ShouldRecomputeHandler(Handle<Object> receiver, Handle<String> name); |
| 179 Handle<String> name); | |
| 180 | 179 |
| 181 ExtraICState extra_ic_state() const { return extra_ic_state_; } | 180 ExtraICState extra_ic_state() const { return extra_ic_state_; } |
| 182 void set_extra_ic_state(ExtraICState state) { extra_ic_state_ = state; } | 181 void set_extra_ic_state(ExtraICState state) { extra_ic_state_ = state; } |
| 183 | 182 |
| 184 Handle<Map> receiver_map() { return receiver_map_; } | 183 Handle<Map> receiver_map() { return receiver_map_; } |
| 185 void update_receiver_map(Handle<Object> receiver) { | 184 void update_receiver_map(Handle<Object> receiver) { |
| 186 if (receiver->IsSmi()) { | 185 if (receiver->IsSmi()) { |
| 187 receiver_map_ = isolate_->factory()->heap_number_map(); | 186 receiver_map_ = isolate_->factory()->heap_number_map(); |
| 188 } else { | 187 } else { |
| 189 receiver_map_ = handle(HeapObject::cast(*receiver)->map()); | 188 receiver_map_ = handle(HeapObject::cast(*receiver)->map()); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 200 Map* FirstTargetMap() { | 199 Map* FirstTargetMap() { |
| 201 FindTargetMaps(); | 200 FindTargetMaps(); |
| 202 return target_maps_.length() > 0 ? *target_maps_.at(0) : NULL; | 201 return target_maps_.length() > 0 ? *target_maps_.at(0) : NULL; |
| 203 } | 202 } |
| 204 | 203 |
| 205 inline void UpdateTarget(); | 204 inline void UpdateTarget(); |
| 206 | 205 |
| 207 Handle<TypeFeedbackVector> vector() const { return nexus()->vector_handle(); } | 206 Handle<TypeFeedbackVector> vector() const { return nexus()->vector_handle(); } |
| 208 FeedbackVectorSlot slot() const { return nexus()->slot(); } | 207 FeedbackVectorSlot slot() const { return nexus()->slot(); } |
| 209 State saved_state() const { | 208 State saved_state() const { |
| 210 return state() == PROTOTYPE_FAILURE ? old_state_ : state(); | 209 return state() == RECOMPUTE_HANDLER ? old_state_ : state(); |
| 211 } | 210 } |
| 212 | 211 |
| 213 template <class NexusClass> | 212 template <class NexusClass> |
| 214 NexusClass* casted_nexus() { | 213 NexusClass* casted_nexus() { |
| 215 return static_cast<NexusClass*>(nexus_); | 214 return static_cast<NexusClass*>(nexus_); |
| 216 } | 215 } |
| 217 FeedbackNexus* nexus() const { return nexus_; } | 216 FeedbackNexus* nexus() const { return nexus_; } |
| 218 | 217 |
| 219 inline Code* get_host(); | 218 inline Code* get_host(); |
| 220 | 219 |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 DCHECK(nexus != NULL); | 308 DCHECK(nexus != NULL); |
| 310 DCHECK(IsLoadStub()); | 309 DCHECK(IsLoadStub()); |
| 311 } | 310 } |
| 312 | 311 |
| 313 bool ShouldThrowReferenceError(Handle<Object> receiver) { | 312 bool ShouldThrowReferenceError(Handle<Object> receiver) { |
| 314 return receiver->IsJSGlobalObject() && typeof_mode() == NOT_INSIDE_TYPEOF; | 313 return receiver->IsJSGlobalObject() && typeof_mode() == NOT_INSIDE_TYPEOF; |
| 315 } | 314 } |
| 316 | 315 |
| 317 // Code generator routines. | 316 // Code generator routines. |
| 318 | 317 |
| 319 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } | |
| 320 static void GenerateMiss(MacroAssembler* masm); | 318 static void GenerateMiss(MacroAssembler* masm); |
| 321 static void GenerateRuntimeGetProperty(MacroAssembler* masm); | 319 static void GenerateRuntimeGetProperty(MacroAssembler* masm); |
| 322 static void GenerateNormal(MacroAssembler* masm); | 320 static void GenerateNormal(MacroAssembler* masm); |
| 323 | 321 |
| 324 static Handle<Code> initialize_stub(Isolate* isolate, | 322 static Handle<Code> initialize_stub(Isolate* isolate, |
| 325 ExtraICState extra_state); | 323 ExtraICState extra_state); |
| 326 static Handle<Code> initialize_stub_in_optimized_code( | 324 static Handle<Code> initialize_stub_in_optimized_code( |
| 327 Isolate* isolate, ExtraICState extra_state, State initialization_state); | 325 Isolate* isolate, ExtraICState extra_state, State initialization_state); |
| 328 | 326 |
| 329 MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Object> object, | 327 MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Object> object, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 348 // Update the inline cache and the global stub cache based on the | 346 // Update the inline cache and the global stub cache based on the |
| 349 // lookup result. | 347 // lookup result. |
| 350 void UpdateCaches(LookupIterator* lookup); | 348 void UpdateCaches(LookupIterator* lookup); |
| 351 | 349 |
| 352 Handle<Code> CompileHandler(LookupIterator* lookup, Handle<Object> unused, | 350 Handle<Code> CompileHandler(LookupIterator* lookup, Handle<Object> unused, |
| 353 CacheHolderFlag cache_holder) override; | 351 CacheHolderFlag cache_holder) override; |
| 354 | 352 |
| 355 private: | 353 private: |
| 356 Handle<Code> SimpleFieldLoad(FieldIndex index); | 354 Handle<Code> SimpleFieldLoad(FieldIndex index); |
| 357 | 355 |
| 358 static void Clear(Isolate* isolate, Address address, Code* target, | |
| 359 Address constant_pool); | |
| 360 | |
| 361 friend class IC; | 356 friend class IC; |
| 362 }; | 357 }; |
| 363 | 358 |
| 364 | 359 |
| 365 class KeyedLoadIC : public LoadIC { | 360 class KeyedLoadIC : public LoadIC { |
| 366 public: | 361 public: |
| 367 // ExtraICState bits (building on IC) | 362 // ExtraICState bits (building on IC) |
| 368 class IcCheckTypeField | 363 class IcCheckTypeField |
| 369 : public BitField<IcCheckType, LoadICState::kNextBitFieldOffset, 1> {}; | 364 : public BitField<IcCheckType, LoadICState::kNextBitFieldOffset, 1> {}; |
| 370 | 365 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 384 DCHECK(nexus != NULL); | 379 DCHECK(nexus != NULL); |
| 385 DCHECK(target()->is_keyed_load_stub()); | 380 DCHECK(target()->is_keyed_load_stub()); |
| 386 } | 381 } |
| 387 | 382 |
| 388 MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Object> object, | 383 MUST_USE_RESULT MaybeHandle<Object> Load(Handle<Object> object, |
| 389 Handle<Object> key); | 384 Handle<Object> key); |
| 390 | 385 |
| 391 // Code generator routines. | 386 // Code generator routines. |
| 392 static void GenerateMiss(MacroAssembler* masm); | 387 static void GenerateMiss(MacroAssembler* masm); |
| 393 static void GenerateRuntimeGetProperty(MacroAssembler* masm); | 388 static void GenerateRuntimeGetProperty(MacroAssembler* masm); |
| 394 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } | |
| 395 static void GenerateMegamorphic(MacroAssembler* masm); | 389 static void GenerateMegamorphic(MacroAssembler* masm); |
| 396 | 390 |
| 397 // Bit mask to be tested against bit field for the cases when | 391 // Bit mask to be tested against bit field for the cases when |
| 398 // generic stub should go into slow case. | 392 // generic stub should go into slow case. |
| 399 // Access check is necessary explicitly since generic stub does not perform | 393 // Access check is necessary explicitly since generic stub does not perform |
| 400 // map checks. | 394 // map checks. |
| 401 static const int kSlowCaseBitFieldMask = | 395 static const int kSlowCaseBitFieldMask = |
| 402 (1 << Map::kIsAccessCheckNeeded) | (1 << Map::kHasIndexedInterceptor); | 396 (1 << Map::kIsAccessCheckNeeded) | (1 << Map::kHasIndexedInterceptor); |
| 403 | 397 |
| 404 static Handle<Code> initialize_stub(Isolate* isolate, | 398 static Handle<Code> initialize_stub(Isolate* isolate, |
| 405 ExtraICState extra_state); | 399 ExtraICState extra_state); |
| 406 static Handle<Code> initialize_stub_in_optimized_code( | 400 static Handle<Code> initialize_stub_in_optimized_code( |
| 407 Isolate* isolate, State initialization_state, ExtraICState extra_state); | 401 Isolate* isolate, State initialization_state, ExtraICState extra_state); |
| 408 static Handle<Code> ChooseMegamorphicStub(Isolate* isolate, | 402 static Handle<Code> ChooseMegamorphicStub(Isolate* isolate, |
| 409 ExtraICState extra_state); | 403 ExtraICState extra_state); |
| 410 | 404 |
| 411 static void Clear(Isolate* isolate, Code* host, KeyedLoadICNexus* nexus); | 405 static void Clear(Isolate* isolate, Code* host, KeyedLoadICNexus* nexus); |
| 412 | 406 |
| 413 protected: | 407 protected: |
| 414 // receiver is HeapObject because it could be a String or a JSObject | 408 // receiver is HeapObject because it could be a String or a JSObject |
| 415 Handle<Code> LoadElementStub(Handle<HeapObject> receiver); | 409 Handle<Code> LoadElementStub(Handle<HeapObject> receiver); |
| 416 | 410 |
| 417 private: | 411 private: |
| 418 static void Clear(Isolate* isolate, Address address, Code* target, | |
| 419 Address constant_pool); | |
| 420 | |
| 421 friend class IC; | 412 friend class IC; |
| 422 }; | 413 }; |
| 423 | 414 |
| 424 | 415 |
| 425 class StoreIC : public IC { | 416 class StoreIC : public IC { |
| 426 public: | 417 public: |
| 427 static ExtraICState ComputeExtraICState(LanguageMode flag) { | 418 static ExtraICState ComputeExtraICState(LanguageMode flag) { |
| 428 return StoreICState(flag).GetExtraICState(); | 419 return StoreICState(flag).GetExtraICState(); |
| 429 } | 420 } |
| 430 | 421 |
| 431 StoreIC(FrameDepth depth, Isolate* isolate, FeedbackNexus* nexus = NULL) | 422 StoreIC(FrameDepth depth, Isolate* isolate, FeedbackNexus* nexus = NULL) |
| 432 : IC(depth, isolate, nexus) { | 423 : IC(depth, isolate, nexus) { |
| 433 DCHECK(IsStoreStub()); | 424 DCHECK(IsStoreStub()); |
| 434 } | 425 } |
| 435 | 426 |
| 436 LanguageMode language_mode() const { | 427 LanguageMode language_mode() const { |
| 437 return StoreICState::GetLanguageMode(extra_ic_state()); | 428 return StoreICState::GetLanguageMode(extra_ic_state()); |
| 438 } | 429 } |
| 439 | 430 |
| 440 // Code generators for stub routines. Only called once at startup. | 431 // Code generators for stub routines. Only called once at startup. |
| 441 static void GenerateSlow(MacroAssembler* masm); | 432 static void GenerateSlow(MacroAssembler* masm); |
| 442 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } | |
| 443 static void GeneratePreMonomorphic(MacroAssembler* masm) { | |
| 444 GenerateMiss(masm); | |
| 445 } | |
| 446 static void GenerateMiss(MacroAssembler* masm); | 433 static void GenerateMiss(MacroAssembler* masm); |
| 447 static void GenerateMegamorphic(MacroAssembler* masm); | 434 static void GenerateMegamorphic(MacroAssembler* masm); |
| 448 static void GenerateNormal(MacroAssembler* masm); | 435 static void GenerateNormal(MacroAssembler* masm); |
| 449 static void GenerateRuntimeSetProperty(MacroAssembler* masm, | 436 static void GenerateRuntimeSetProperty(MacroAssembler* masm, |
| 450 LanguageMode language_mode); | 437 LanguageMode language_mode); |
| 451 | 438 |
| 452 static Handle<Code> initialize_stub(Isolate* isolate, | 439 static Handle<Code> initialize_stub(Isolate* isolate, |
| 453 LanguageMode language_mode, | 440 LanguageMode language_mode, |
| 454 State initialization_state); | 441 State initialization_state); |
| 455 static Handle<Code> initialize_stub_in_optimized_code( | 442 static Handle<Code> initialize_stub_in_optimized_code( |
| 456 Isolate* isolate, LanguageMode language_mode, State initialization_state); | 443 Isolate* isolate, LanguageMode language_mode, State initialization_state); |
| 457 | 444 |
| 458 MUST_USE_RESULT MaybeHandle<Object> Store( | 445 MUST_USE_RESULT MaybeHandle<Object> Store( |
| 459 Handle<Object> object, Handle<Name> name, Handle<Object> value, | 446 Handle<Object> object, Handle<Name> name, Handle<Object> value, |
| 460 JSReceiver::StoreFromKeyed store_mode = | 447 JSReceiver::StoreFromKeyed store_mode = |
| 461 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED); | 448 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED); |
| 462 | 449 |
| 463 bool LookupForWrite(LookupIterator* it, Handle<Object> value, | 450 bool LookupForWrite(LookupIterator* it, Handle<Object> value, |
| 464 JSReceiver::StoreFromKeyed store_mode); | 451 JSReceiver::StoreFromKeyed store_mode); |
| 465 | 452 |
| 466 static void Clear(Isolate* isolate, Code* host, StoreICNexus* nexus); | 453 static void Clear(Isolate* isolate, Code* host, StoreICNexus* nexus); |
| 467 | 454 |
| 468 protected: | 455 protected: |
| 469 // Stub accessors. | 456 // Stub accessors. |
| 470 Handle<Code> megamorphic_stub() override; | 457 Handle<Code> megamorphic_stub() override; |
| 471 Handle<Code> slow_stub() const; | 458 Handle<Code> slow_stub() const; |
| 472 | 459 |
| 473 virtual Handle<Code> pre_monomorphic_stub() const { | |
| 474 return pre_monomorphic_stub(isolate(), language_mode()); | |
| 475 } | |
| 476 | |
| 477 static Handle<Code> pre_monomorphic_stub(Isolate* isolate, | |
| 478 LanguageMode language_mode); | |
| 479 | |
| 480 // Update the inline cache and the global stub cache based on the | 460 // Update the inline cache and the global stub cache based on the |
| 481 // lookup result. | 461 // lookup result. |
| 482 void UpdateCaches(LookupIterator* lookup, Handle<Object> value, | 462 void UpdateCaches(LookupIterator* lookup, Handle<Object> value, |
| 483 JSReceiver::StoreFromKeyed store_mode); | 463 JSReceiver::StoreFromKeyed store_mode); |
| 484 Handle<Code> CompileHandler(LookupIterator* lookup, Handle<Object> value, | 464 Handle<Code> CompileHandler(LookupIterator* lookup, Handle<Object> value, |
| 485 CacheHolderFlag cache_holder) override; | 465 CacheHolderFlag cache_holder) override; |
| 486 | 466 |
| 487 private: | 467 private: |
| 488 inline void set_target(Code* code); | 468 inline void set_target(Code* code); |
| 489 | 469 |
| 490 static void Clear(Isolate* isolate, Address address, Code* target, | |
| 491 Address constant_pool); | |
| 492 | |
| 493 friend class IC; | 470 friend class IC; |
| 494 }; | 471 }; |
| 495 | 472 |
| 496 | 473 |
| 497 enum KeyedStoreCheckMap { kDontCheckMap, kCheckMap }; | 474 enum KeyedStoreCheckMap { kDontCheckMap, kCheckMap }; |
| 498 | 475 |
| 499 | 476 |
| 500 enum KeyedStoreIncrementLength { kDontIncrementLength, kIncrementLength }; | 477 enum KeyedStoreIncrementLength { kDontIncrementLength, kIncrementLength }; |
| 501 | 478 |
| 502 | 479 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 526 KeyedStoreICNexus* nexus = NULL) | 503 KeyedStoreICNexus* nexus = NULL) |
| 527 : StoreIC(depth, isolate, nexus) { | 504 : StoreIC(depth, isolate, nexus) { |
| 528 DCHECK(target()->is_keyed_store_stub()); | 505 DCHECK(target()->is_keyed_store_stub()); |
| 529 } | 506 } |
| 530 | 507 |
| 531 MUST_USE_RESULT MaybeHandle<Object> Store(Handle<Object> object, | 508 MUST_USE_RESULT MaybeHandle<Object> Store(Handle<Object> object, |
| 532 Handle<Object> name, | 509 Handle<Object> name, |
| 533 Handle<Object> value); | 510 Handle<Object> value); |
| 534 | 511 |
| 535 // Code generators for stub routines. Only called once at startup. | 512 // Code generators for stub routines. Only called once at startup. |
| 536 static void GenerateInitialize(MacroAssembler* masm) { GenerateMiss(masm); } | |
| 537 static void GeneratePreMonomorphic(MacroAssembler* masm) { | |
| 538 GenerateMiss(masm); | |
| 539 } | |
| 540 static void GenerateMiss(MacroAssembler* masm); | 513 static void GenerateMiss(MacroAssembler* masm); |
| 541 static void GenerateSlow(MacroAssembler* masm); | 514 static void GenerateSlow(MacroAssembler* masm); |
| 542 static void GenerateMegamorphic(MacroAssembler* masm, | 515 static void GenerateMegamorphic(MacroAssembler* masm, |
| 543 LanguageMode language_mode); | 516 LanguageMode language_mode); |
| 544 | 517 |
| 545 static Handle<Code> initialize_stub(Isolate* isolate, | 518 static Handle<Code> initialize_stub(Isolate* isolate, |
| 546 LanguageMode language_mode, | 519 LanguageMode language_mode, |
| 547 State initialization_state); | 520 State initialization_state); |
| 548 | 521 |
| 549 static Handle<Code> initialize_stub_in_optimized_code( | 522 static Handle<Code> initialize_stub_in_optimized_code( |
| 550 Isolate* isolate, LanguageMode language_mode, State initialization_state); | 523 Isolate* isolate, LanguageMode language_mode, State initialization_state); |
| 551 static Handle<Code> ChooseMegamorphicStub(Isolate* isolate, | 524 static Handle<Code> ChooseMegamorphicStub(Isolate* isolate, |
| 552 ExtraICState extra_state); | 525 ExtraICState extra_state); |
| 553 | 526 |
| 554 static void Clear(Isolate* isolate, Code* host, KeyedStoreICNexus* nexus); | 527 static void Clear(Isolate* isolate, Code* host, KeyedStoreICNexus* nexus); |
| 555 | 528 |
| 556 protected: | 529 protected: |
| 557 virtual Handle<Code> pre_monomorphic_stub() const { | |
| 558 return pre_monomorphic_stub(isolate(), language_mode()); | |
| 559 } | |
| 560 static Handle<Code> pre_monomorphic_stub(Isolate* isolate, | |
| 561 LanguageMode language_mode) { | |
| 562 if (is_strict(language_mode)) { | |
| 563 return isolate->builtins()->KeyedStoreIC_PreMonomorphic_Strict(); | |
| 564 } else { | |
| 565 return isolate->builtins()->KeyedStoreIC_PreMonomorphic(); | |
| 566 } | |
| 567 } | |
| 568 | |
| 569 Handle<Code> StoreElementStub(Handle<Map> receiver_map, | 530 Handle<Code> StoreElementStub(Handle<Map> receiver_map, |
| 570 KeyedAccessStoreMode store_mode); | 531 KeyedAccessStoreMode store_mode); |
| 571 | 532 |
| 572 private: | 533 private: |
| 573 inline void set_target(Code* code); | 534 inline void set_target(Code* code); |
| 574 | 535 |
| 575 static void Clear(Isolate* isolate, Address address, Code* target, | |
| 576 Address constant_pool); | |
| 577 | |
| 578 Handle<Map> ComputeTransitionedMap(Handle<Map> map, | 536 Handle<Map> ComputeTransitionedMap(Handle<Map> map, |
| 579 KeyedAccessStoreMode store_mode); | 537 KeyedAccessStoreMode store_mode); |
| 580 | 538 |
| 581 friend class IC; | 539 friend class IC; |
| 582 }; | 540 }; |
| 583 | 541 |
| 584 | 542 |
| 585 // Type Recording BinaryOpIC, that records the types of the inputs and outputs. | 543 // Type Recording BinaryOpIC, that records the types of the inputs and outputs. |
| 586 class BinaryOpIC : public IC { | 544 class BinaryOpIC : public IC { |
| 587 public: | 545 public: |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 634 | 592 |
| 635 // Helper for BinaryOpIC and CompareIC. | 593 // Helper for BinaryOpIC and CompareIC. |
| 636 enum InlinedSmiCheck { ENABLE_INLINED_SMI_CHECK, DISABLE_INLINED_SMI_CHECK }; | 594 enum InlinedSmiCheck { ENABLE_INLINED_SMI_CHECK, DISABLE_INLINED_SMI_CHECK }; |
| 637 void PatchInlinedSmiCode(Isolate* isolate, Address address, | 595 void PatchInlinedSmiCode(Isolate* isolate, Address address, |
| 638 InlinedSmiCheck check); | 596 InlinedSmiCheck check); |
| 639 | 597 |
| 640 } // namespace internal | 598 } // namespace internal |
| 641 } // namespace v8 | 599 } // namespace v8 |
| 642 | 600 |
| 643 #endif // V8_IC_H_ | 601 #endif // V8_IC_H_ |
| OLD | NEW |