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

Side by Side Diff: src/objects.h

Issue 1846963002: Use a dictionary-mode code cache on the map rather than a dual system. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Addressed comment Created 4 years, 8 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
« no previous file with comments | « src/mips64/code-stubs-mips64.cc ('k') | src/objects.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 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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_OBJECTS_H_ 5 #ifndef V8_OBJECTS_H_
6 #define V8_OBJECTS_H_ 6 #define V8_OBJECTS_H_
7 7
8 #include <iosfwd> 8 #include <iosfwd>
9 9
10 #include "src/assert-scope.h" 10 #include "src/assert-scope.h"
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 V(ACCESS_CHECK_INFO_TYPE) \ 391 V(ACCESS_CHECK_INFO_TYPE) \
392 V(INTERCEPTOR_INFO_TYPE) \ 392 V(INTERCEPTOR_INFO_TYPE) \
393 V(CALL_HANDLER_INFO_TYPE) \ 393 V(CALL_HANDLER_INFO_TYPE) \
394 V(FUNCTION_TEMPLATE_INFO_TYPE) \ 394 V(FUNCTION_TEMPLATE_INFO_TYPE) \
395 V(OBJECT_TEMPLATE_INFO_TYPE) \ 395 V(OBJECT_TEMPLATE_INFO_TYPE) \
396 V(SIGNATURE_INFO_TYPE) \ 396 V(SIGNATURE_INFO_TYPE) \
397 V(TYPE_SWITCH_INFO_TYPE) \ 397 V(TYPE_SWITCH_INFO_TYPE) \
398 V(ALLOCATION_MEMENTO_TYPE) \ 398 V(ALLOCATION_MEMENTO_TYPE) \
399 V(ALLOCATION_SITE_TYPE) \ 399 V(ALLOCATION_SITE_TYPE) \
400 V(SCRIPT_TYPE) \ 400 V(SCRIPT_TYPE) \
401 V(CODE_CACHE_TYPE) \
402 V(POLYMORPHIC_CODE_CACHE_TYPE) \
403 V(TYPE_FEEDBACK_INFO_TYPE) \ 401 V(TYPE_FEEDBACK_INFO_TYPE) \
404 V(ALIASED_ARGUMENTS_ENTRY_TYPE) \ 402 V(ALIASED_ARGUMENTS_ENTRY_TYPE) \
405 V(BOX_TYPE) \ 403 V(BOX_TYPE) \
406 V(PROTOTYPE_INFO_TYPE) \ 404 V(PROTOTYPE_INFO_TYPE) \
407 V(SLOPPY_BLOCK_WITH_EVAL_CONTEXT_EXTENSION_TYPE) \ 405 V(SLOPPY_BLOCK_WITH_EVAL_CONTEXT_EXTENSION_TYPE) \
408 \ 406 \
409 V(FIXED_ARRAY_TYPE) \ 407 V(FIXED_ARRAY_TYPE) \
410 V(FIXED_DOUBLE_ARRAY_TYPE) \ 408 V(FIXED_DOUBLE_ARRAY_TYPE) \
411 V(SHARED_FUNCTION_INFO_TYPE) \ 409 V(SHARED_FUNCTION_INFO_TYPE) \
412 V(WEAK_CELL_TYPE) \ 410 V(WEAK_CELL_TYPE) \
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
507 V(ACCESSOR_INFO, AccessorInfo, accessor_info) \ 505 V(ACCESSOR_INFO, AccessorInfo, accessor_info) \
508 V(ACCESSOR_PAIR, AccessorPair, accessor_pair) \ 506 V(ACCESSOR_PAIR, AccessorPair, accessor_pair) \
509 V(ACCESS_CHECK_INFO, AccessCheckInfo, access_check_info) \ 507 V(ACCESS_CHECK_INFO, AccessCheckInfo, access_check_info) \
510 V(INTERCEPTOR_INFO, InterceptorInfo, interceptor_info) \ 508 V(INTERCEPTOR_INFO, InterceptorInfo, interceptor_info) \
511 V(CALL_HANDLER_INFO, CallHandlerInfo, call_handler_info) \ 509 V(CALL_HANDLER_INFO, CallHandlerInfo, call_handler_info) \
512 V(FUNCTION_TEMPLATE_INFO, FunctionTemplateInfo, function_template_info) \ 510 V(FUNCTION_TEMPLATE_INFO, FunctionTemplateInfo, function_template_info) \
513 V(OBJECT_TEMPLATE_INFO, ObjectTemplateInfo, object_template_info) \ 511 V(OBJECT_TEMPLATE_INFO, ObjectTemplateInfo, object_template_info) \
514 V(SCRIPT, Script, script) \ 512 V(SCRIPT, Script, script) \
515 V(ALLOCATION_SITE, AllocationSite, allocation_site) \ 513 V(ALLOCATION_SITE, AllocationSite, allocation_site) \
516 V(ALLOCATION_MEMENTO, AllocationMemento, allocation_memento) \ 514 V(ALLOCATION_MEMENTO, AllocationMemento, allocation_memento) \
517 V(CODE_CACHE, CodeCache, code_cache) \
518 V(POLYMORPHIC_CODE_CACHE, PolymorphicCodeCache, polymorphic_code_cache) \
519 V(TYPE_FEEDBACK_INFO, TypeFeedbackInfo, type_feedback_info) \ 515 V(TYPE_FEEDBACK_INFO, TypeFeedbackInfo, type_feedback_info) \
520 V(ALIASED_ARGUMENTS_ENTRY, AliasedArgumentsEntry, aliased_arguments_entry) \ 516 V(ALIASED_ARGUMENTS_ENTRY, AliasedArgumentsEntry, aliased_arguments_entry) \
521 V(DEBUG_INFO, DebugInfo, debug_info) \ 517 V(DEBUG_INFO, DebugInfo, debug_info) \
522 V(BREAK_POINT_INFO, BreakPointInfo, break_point_info) \ 518 V(BREAK_POINT_INFO, BreakPointInfo, break_point_info) \
523 V(PROTOTYPE_INFO, PrototypeInfo, prototype_info) \ 519 V(PROTOTYPE_INFO, PrototypeInfo, prototype_info) \
524 V(SLOPPY_BLOCK_WITH_EVAL_CONTEXT_EXTENSION, \ 520 V(SLOPPY_BLOCK_WITH_EVAL_CONTEXT_EXTENSION, \
525 SloppyBlockWithEvalContextExtension, \ 521 SloppyBlockWithEvalContextExtension, \
526 sloppy_block_with_eval_context_extension) 522 sloppy_block_with_eval_context_extension)
527 523
528 // We use the full 8 bits of the instance_type field to encode heap object 524 // We use the full 8 bits of the instance_type field to encode heap object
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 ACCESS_CHECK_INFO_TYPE, 674 ACCESS_CHECK_INFO_TYPE,
679 INTERCEPTOR_INFO_TYPE, 675 INTERCEPTOR_INFO_TYPE,
680 CALL_HANDLER_INFO_TYPE, 676 CALL_HANDLER_INFO_TYPE,
681 FUNCTION_TEMPLATE_INFO_TYPE, 677 FUNCTION_TEMPLATE_INFO_TYPE,
682 OBJECT_TEMPLATE_INFO_TYPE, 678 OBJECT_TEMPLATE_INFO_TYPE,
683 SIGNATURE_INFO_TYPE, 679 SIGNATURE_INFO_TYPE,
684 TYPE_SWITCH_INFO_TYPE, 680 TYPE_SWITCH_INFO_TYPE,
685 ALLOCATION_SITE_TYPE, 681 ALLOCATION_SITE_TYPE,
686 ALLOCATION_MEMENTO_TYPE, 682 ALLOCATION_MEMENTO_TYPE,
687 SCRIPT_TYPE, 683 SCRIPT_TYPE,
688 CODE_CACHE_TYPE,
689 POLYMORPHIC_CODE_CACHE_TYPE,
690 TYPE_FEEDBACK_INFO_TYPE, 684 TYPE_FEEDBACK_INFO_TYPE,
691 ALIASED_ARGUMENTS_ENTRY_TYPE, 685 ALIASED_ARGUMENTS_ENTRY_TYPE,
692 BOX_TYPE, 686 BOX_TYPE,
693 DEBUG_INFO_TYPE, 687 DEBUG_INFO_TYPE,
694 BREAK_POINT_INFO_TYPE, 688 BREAK_POINT_INFO_TYPE,
695 FIXED_ARRAY_TYPE, 689 FIXED_ARRAY_TYPE,
696 SHARED_FUNCTION_INFO_TYPE, 690 SHARED_FUNCTION_INFO_TYPE,
697 CELL_TYPE, 691 CELL_TYPE,
698 WEAK_CELL_TYPE, 692 WEAK_CELL_TYPE,
699 TRANSITION_ARRAY_TYPE, 693 TRANSITION_ARRAY_TYPE,
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
974 V(JSWeakMap) \ 968 V(JSWeakMap) \
975 V(JSWeakSet) \ 969 V(JSWeakSet) \
976 V(JSRegExp) \ 970 V(JSRegExp) \
977 V(HashTable) \ 971 V(HashTable) \
978 V(Dictionary) \ 972 V(Dictionary) \
979 V(StringTable) \ 973 V(StringTable) \
980 V(StringSet) \ 974 V(StringSet) \
981 V(NormalizedMapCache) \ 975 V(NormalizedMapCache) \
982 V(CompilationCacheTable) \ 976 V(CompilationCacheTable) \
983 V(CodeCacheHashTable) \ 977 V(CodeCacheHashTable) \
984 V(PolymorphicCodeCacheHashTable) \
985 V(MapCache) \ 978 V(MapCache) \
986 V(JSGlobalObject) \ 979 V(JSGlobalObject) \
987 V(JSGlobalProxy) \ 980 V(JSGlobalProxy) \
988 V(Undetectable) \ 981 V(Undetectable) \
989 V(AccessCheckNeeded) \ 982 V(AccessCheckNeeded) \
990 V(Callable) \ 983 V(Callable) \
991 V(Function) \ 984 V(Function) \
992 V(Constructor) \ 985 V(Constructor) \
993 V(TemplateInfo) \ 986 V(TemplateInfo) \
994 V(Filler) \ 987 V(Filler) \
(...skipping 3939 matching lines...) Expand 10 before | Expand all | Expand 10 after
4934 #undef DEFINE_CODE_KIND_ENUM 4927 #undef DEFINE_CODE_KIND_ENUM
4935 NUMBER_OF_KINDS 4928 NUMBER_OF_KINDS
4936 }; 4929 };
4937 4930
4938 // No more than 32 kinds. The value is currently encoded in five bits in 4931 // No more than 32 kinds. The value is currently encoded in five bits in
4939 // Flags. 4932 // Flags.
4940 STATIC_ASSERT(NUMBER_OF_KINDS <= 32); 4933 STATIC_ASSERT(NUMBER_OF_KINDS <= 32);
4941 4934
4942 static const char* Kind2String(Kind kind); 4935 static const char* Kind2String(Kind kind);
4943 4936
4944 // Types of stubs.
4945 enum StubType {
4946 NORMAL,
4947 FAST
4948 };
4949
4950 static const int kPrologueOffsetNotSet = -1; 4937 static const int kPrologueOffsetNotSet = -1;
4951 4938
4952 #ifdef ENABLE_DISASSEMBLER 4939 #ifdef ENABLE_DISASSEMBLER
4953 // Printing 4940 // Printing
4954 static const char* ICState2String(InlineCacheState state); 4941 static const char* ICState2String(InlineCacheState state);
4955 static const char* StubType2String(StubType type);
4956 static void PrintExtraICState(std::ostream& os, // NOLINT 4942 static void PrintExtraICState(std::ostream& os, // NOLINT
4957 Kind kind, ExtraICState extra); 4943 Kind kind, ExtraICState extra);
4958 void Disassemble(const char* name, std::ostream& os); // NOLINT 4944 void Disassemble(const char* name, std::ostream& os); // NOLINT
4959 #endif // ENABLE_DISASSEMBLER 4945 #endif // ENABLE_DISASSEMBLER
4960 4946
4961 // [instruction_size]: Size of the native instructions 4947 // [instruction_size]: Size of the native instructions
4962 inline int instruction_size() const; 4948 inline int instruction_size() const;
4963 inline void set_instruction_size(int value); 4949 inline void set_instruction_size(int value);
4964 4950
4965 // [relocation_info]: Code relocation information 4951 // [relocation_info]: Code relocation information
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
5015 5001
5016 // [flags]: Various code flags. 5002 // [flags]: Various code flags.
5017 inline Flags flags(); 5003 inline Flags flags();
5018 inline void set_flags(Flags flags); 5004 inline void set_flags(Flags flags);
5019 5005
5020 // [flags]: Access to specific code flags. 5006 // [flags]: Access to specific code flags.
5021 inline Kind kind(); 5007 inline Kind kind();
5022 inline InlineCacheState ic_state(); // Only valid for IC stubs. 5008 inline InlineCacheState ic_state(); // Only valid for IC stubs.
5023 inline ExtraICState extra_ic_state(); // Only valid for IC stubs. 5009 inline ExtraICState extra_ic_state(); // Only valid for IC stubs.
5024 5010
5025 inline StubType type(); // Only valid for monomorphic IC stubs.
5026
5027 // Testers for IC stub kinds. 5011 // Testers for IC stub kinds.
5028 inline bool is_inline_cache_stub(); 5012 inline bool is_inline_cache_stub();
5029 inline bool is_debug_stub(); 5013 inline bool is_debug_stub();
5030 inline bool is_handler(); 5014 inline bool is_handler();
5031 inline bool is_load_stub(); 5015 inline bool is_load_stub();
5032 inline bool is_keyed_load_stub(); 5016 inline bool is_keyed_load_stub();
5033 inline bool is_store_stub(); 5017 inline bool is_store_stub();
5034 inline bool is_keyed_store_stub(); 5018 inline bool is_keyed_store_stub();
5035 inline bool is_call_stub(); 5019 inline bool is_call_stub();
5036 inline bool is_binary_op_stub(); 5020 inline bool is_binary_op_stub();
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
5172 // deserialization. The deserializer will overwrite some pointers, rather 5156 // deserialization. The deserializer will overwrite some pointers, rather
5173 // like a runtime linker, but the random allocation addresses used in the 5157 // like a runtime linker, but the random allocation addresses used in the
5174 // mksnapshot process would still be present in the unlinked snapshot data, 5158 // mksnapshot process would still be present in the unlinked snapshot data,
5175 // which would make snapshot production non-reproducible. This method wipes 5159 // which would make snapshot production non-reproducible. This method wipes
5176 // out the to-be-overwritten header data for reproducible snapshots. 5160 // out the to-be-overwritten header data for reproducible snapshots.
5177 inline void WipeOutHeader(); 5161 inline void WipeOutHeader();
5178 5162
5179 // Flags operations. 5163 // Flags operations.
5180 static inline Flags ComputeFlags( 5164 static inline Flags ComputeFlags(
5181 Kind kind, InlineCacheState ic_state = UNINITIALIZED, 5165 Kind kind, InlineCacheState ic_state = UNINITIALIZED,
5182 ExtraICState extra_ic_state = kNoExtraICState, StubType type = NORMAL, 5166 ExtraICState extra_ic_state = kNoExtraICState,
5183 CacheHolderFlag holder = kCacheOnReceiver); 5167 CacheHolderFlag holder = kCacheOnReceiver);
5184 5168
5185 static inline Flags ComputeMonomorphicFlags( 5169 static inline Flags ComputeMonomorphicFlags(
5186 Kind kind, ExtraICState extra_ic_state = kNoExtraICState, 5170 Kind kind, ExtraICState extra_ic_state = kNoExtraICState,
5187 CacheHolderFlag holder = kCacheOnReceiver, StubType type = NORMAL); 5171 CacheHolderFlag holder = kCacheOnReceiver);
5188 5172
5189 static inline Flags ComputeHandlerFlags( 5173 static inline Flags ComputeHandlerFlags(
5190 Kind handler_kind, StubType type = NORMAL, 5174 Kind handler_kind, CacheHolderFlag holder = kCacheOnReceiver);
5191 CacheHolderFlag holder = kCacheOnReceiver);
5192 5175
5193 static inline InlineCacheState ExtractICStateFromFlags(Flags flags); 5176 static inline InlineCacheState ExtractICStateFromFlags(Flags flags);
5194 static inline StubType ExtractTypeFromFlags(Flags flags);
5195 static inline CacheHolderFlag ExtractCacheHolderFromFlags(Flags flags); 5177 static inline CacheHolderFlag ExtractCacheHolderFromFlags(Flags flags);
5196 static inline Kind ExtractKindFromFlags(Flags flags); 5178 static inline Kind ExtractKindFromFlags(Flags flags);
5197 static inline ExtraICState ExtractExtraICStateFromFlags(Flags flags); 5179 static inline ExtraICState ExtractExtraICStateFromFlags(Flags flags);
5198 5180
5199 static inline Flags RemoveTypeFromFlags(Flags flags); 5181 static inline Flags RemoveHolderFromFlags(Flags flags);
5200 static inline Flags RemoveTypeAndHolderFromFlags(Flags flags);
5201 5182
5202 // Convert a target address into a code object. 5183 // Convert a target address into a code object.
5203 static inline Code* GetCodeFromTargetAddress(Address address); 5184 static inline Code* GetCodeFromTargetAddress(Address address);
5204 5185
5205 // Convert an entry address into an object. 5186 // Convert an entry address into an object.
5206 static inline Object* GetObjectFromEntryAddress(Address location_of_address); 5187 static inline Object* GetObjectFromEntryAddress(Address location_of_address);
5207 5188
5208 // Returns the address of the first instruction. 5189 // Returns the address of the first instruction.
5209 inline byte* instruction_start(); 5190 inline byte* instruction_start();
5210 5191
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
5355 class FullCodeFlagsHasDeoptimizationSupportField: 5336 class FullCodeFlagsHasDeoptimizationSupportField:
5356 public BitField<bool, 0, 1> {}; // NOLINT 5337 public BitField<bool, 0, 1> {}; // NOLINT
5357 class FullCodeFlagsHasDebugBreakSlotsField: public BitField<bool, 1, 1> {}; 5338 class FullCodeFlagsHasDebugBreakSlotsField: public BitField<bool, 1, 1> {};
5358 class FullCodeFlagsHasRelocInfoForSerialization 5339 class FullCodeFlagsHasRelocInfoForSerialization
5359 : public BitField<bool, 2, 1> {}; 5340 : public BitField<bool, 2, 1> {};
5360 // Bit 3 in this bitfield is unused. 5341 // Bit 3 in this bitfield is unused.
5361 class ProfilerTicksField : public BitField<int, 4, 28> {}; 5342 class ProfilerTicksField : public BitField<int, 4, 28> {};
5362 5343
5363 // Flags layout. BitField<type, shift, size>. 5344 // Flags layout. BitField<type, shift, size>.
5364 class ICStateField : public BitField<InlineCacheState, 0, 3> {}; 5345 class ICStateField : public BitField<InlineCacheState, 0, 3> {};
5365 class TypeField : public BitField<StubType, 3, 1> {}; 5346 class CacheHolderField : public BitField<CacheHolderFlag, 3, 2> {};
5366 class CacheHolderField : public BitField<CacheHolderFlag, 4, 2> {}; 5347 class KindField : public BitField<Kind, 5, 5> {};
5367 class KindField : public BitField<Kind, 6, 5> {};
5368 class ExtraICStateField 5348 class ExtraICStateField
5369 : public BitField<ExtraICState, 11, PlatformSmiTagging::kSmiValueSize - 5349 : public BitField<ExtraICState, 10, PlatformSmiTagging::kSmiValueSize -
5370 11 + 1> {}; // NOLINT 5350 10 + 1> {}; // NOLINT
5371 5351
5372 // KindSpecificFlags1 layout (STUB, BUILTIN and OPTIMIZED_FUNCTION) 5352 // KindSpecificFlags1 layout (STUB, BUILTIN and OPTIMIZED_FUNCTION)
5373 static const int kStackSlotsFirstBit = 0; 5353 static const int kStackSlotsFirstBit = 0;
5374 static const int kStackSlotsBitCount = 24; 5354 static const int kStackSlotsBitCount = 24;
5375 static const int kMarkedForDeoptimizationBit = 5355 static const int kMarkedForDeoptimizationBit =
5376 kStackSlotsFirstBit + kStackSlotsBitCount; 5356 kStackSlotsFirstBit + kStackSlotsBitCount;
5377 static const int kIsTurbofannedBit = kMarkedForDeoptimizationBit + 1; 5357 static const int kIsTurbofannedBit = kMarkedForDeoptimizationBit + 1;
5378 static const int kCanHaveWeakObjects = kIsTurbofannedBit + 1; 5358 static const int kCanHaveWeakObjects = kIsTurbofannedBit + 1;
5379 5359
5380 STATIC_ASSERT(kStackSlotsFirstBit + kStackSlotsBitCount <= 32); 5360 STATIC_ASSERT(kStackSlotsFirstBit + kStackSlotsBitCount <= 32);
(...skipping 29 matching lines...) Expand all
5410 class BackEdgeTableOffsetField: public BitField<int, 5390 class BackEdgeTableOffsetField: public BitField<int,
5411 kIsCrankshaftedBit + 1, 27> {}; // NOLINT 5391 kIsCrankshaftedBit + 1, 27> {}; // NOLINT
5412 class AllowOSRAtLoopNestingLevelField: public BitField<int, 5392 class AllowOSRAtLoopNestingLevelField: public BitField<int,
5413 kIsCrankshaftedBit + 1 + 27, 4> {}; // NOLINT 5393 kIsCrankshaftedBit + 1 + 27, 4> {}; // NOLINT
5414 STATIC_ASSERT(AllowOSRAtLoopNestingLevelField::kMax >= kMaxLoopNestingMarker); 5394 STATIC_ASSERT(AllowOSRAtLoopNestingLevelField::kMax >= kMaxLoopNestingMarker);
5415 5395
5416 static const int kArgumentsBits = 16; 5396 static const int kArgumentsBits = 16;
5417 static const int kMaxArguments = (1 << kArgumentsBits) - 1; 5397 static const int kMaxArguments = (1 << kArgumentsBits) - 1;
5418 5398
5419 // This constant should be encodable in an ARM instruction. 5399 // This constant should be encodable in an ARM instruction.
5420 static const int kFlagsNotUsedInLookup = 5400 static const int kFlagsNotUsedInLookup = CacheHolderField::kMask;
5421 TypeField::kMask | CacheHolderField::kMask;
5422 5401
5423 private: 5402 private:
5424 friend class RelocIterator; 5403 friend class RelocIterator;
5425 friend class Deoptimizer; // For FindCodeAgeSequence. 5404 friend class Deoptimizer; // For FindCodeAgeSequence.
5426 5405
5427 void ClearInlineCaches(Kind* kind); 5406 void ClearInlineCaches(Kind* kind);
5428 5407
5429 // Code aging 5408 // Code aging
5430 byte* FindCodeAgeSequence(); 5409 byte* FindCodeAgeSequence();
5431 static void GetCodeAgeAndParity(Code* code, Age* age, 5410 static void GetCodeAgeAndParity(Code* code, Age* age,
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after
6071 6050
6072 // Extend the descriptor array of the map with the list of descriptors. 6051 // Extend the descriptor array of the map with the list of descriptors.
6073 // In case of duplicates, the latest descriptor is used. 6052 // In case of duplicates, the latest descriptor is used.
6074 static void AppendCallbackDescriptors(Handle<Map> map, 6053 static void AppendCallbackDescriptors(Handle<Map> map,
6075 Handle<Object> descriptors); 6054 Handle<Object> descriptors);
6076 6055
6077 static inline int SlackForArraySize(int old_size, int size_limit); 6056 static inline int SlackForArraySize(int old_size, int size_limit);
6078 6057
6079 static void EnsureDescriptorSlack(Handle<Map> map, int slack); 6058 static void EnsureDescriptorSlack(Handle<Map> map, int slack);
6080 6059
6081 // Returns the found code or undefined if absent. 6060 Code* LookupInCodeCache(Name* name, Code::Flags code);
6082 Object* FindInCodeCache(Name* name, Code::Flags flags);
6083
6084 // Returns the non-negative index of the code object if it is in the
6085 // cache and -1 otherwise.
6086 int IndexInCodeCache(Object* name, Code* code);
6087
6088 // Removes a code object from the code cache at the given index.
6089 void RemoveFromCodeCache(Name* name, Code* code, int index);
6090 6061
6091 // Computes a hash value for this map, to be used in HashTables and such. 6062 // Computes a hash value for this map, to be used in HashTables and such.
6092 int Hash(); 6063 int Hash();
6093 6064
6094 // Returns the map that this map transitions to if its elements_kind 6065 // Returns the map that this map transitions to if its elements_kind
6095 // is changed to |elements_kind|, or NULL if no such map is cached yet. 6066 // is changed to |elements_kind|, or NULL if no such map is cached yet.
6096 // |safe_to_add_transitions| is set to false if adding transitions is not 6067 // |safe_to_add_transitions| is set to false if adding transitions is not
6097 // allowed. 6068 // allowed.
6098 Map* LookupElementsTransitionMap(ElementsKind elements_kind); 6069 Map* LookupElementsTransitionMap(ElementsKind elements_kind);
6099 6070
(...skipping 2022 matching lines...) Expand 10 before | Expand all | Expand 10 after
8122 void Age(); 8093 void Age();
8123 static const int kHashGenerations = 10; 8094 static const int kHashGenerations = 10;
8124 8095
8125 DECLARE_CAST(CompilationCacheTable) 8096 DECLARE_CAST(CompilationCacheTable)
8126 8097
8127 private: 8098 private:
8128 DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationCacheTable); 8099 DISALLOW_IMPLICIT_CONSTRUCTORS(CompilationCacheTable);
8129 }; 8100 };
8130 8101
8131 8102
8132 class CodeCache: public Struct {
8133 public:
8134 DECL_ACCESSORS(default_cache, FixedArray)
8135 DECL_ACCESSORS(normal_type_cache, Object)
8136
8137 // Add the code object to the cache.
8138 static void Update(
8139 Handle<CodeCache> cache, Handle<Name> name, Handle<Code> code);
8140
8141 // Lookup code object in the cache. Returns code object if found and undefined
8142 // if not.
8143 Object* Lookup(Name* name, Code::Flags flags);
8144
8145 // Get the internal index of a code object in the cache. Returns -1 if the
8146 // code object is not in that cache. This index can be used to later call
8147 // RemoveByIndex. The cache cannot be modified between a call to GetIndex and
8148 // RemoveByIndex.
8149 int GetIndex(Object* name, Code* code);
8150
8151 // Remove an object from the cache with the provided internal index.
8152 void RemoveByIndex(Object* name, Code* code, int index);
8153
8154 DECLARE_CAST(CodeCache)
8155
8156 // Dispatched behavior.
8157 DECLARE_PRINTER(CodeCache)
8158 DECLARE_VERIFIER(CodeCache)
8159
8160 static const int kDefaultCacheOffset = HeapObject::kHeaderSize;
8161 static const int kNormalTypeCacheOffset =
8162 kDefaultCacheOffset + kPointerSize;
8163 static const int kSize = kNormalTypeCacheOffset + kPointerSize;
8164
8165 private:
8166 static void UpdateDefaultCache(
8167 Handle<CodeCache> code_cache, Handle<Name> name, Handle<Code> code);
8168 static void UpdateNormalTypeCache(
8169 Handle<CodeCache> code_cache, Handle<Name> name, Handle<Code> code);
8170 Object* LookupDefaultCache(Name* name, Code::Flags flags);
8171 Object* LookupNormalTypeCache(Name* name, Code::Flags flags);
8172
8173 // Code cache layout of the default cache. Elements are alternating name and
8174 // code objects for non normal load/store/call IC's.
8175 static const int kCodeCacheEntrySize = 2;
8176 static const int kCodeCacheEntryNameOffset = 0;
8177 static const int kCodeCacheEntryCodeOffset = 1;
8178
8179 DISALLOW_IMPLICIT_CONSTRUCTORS(CodeCache);
8180 };
8181
8182
8183 class CodeCacheHashTableShape : public BaseShape<HashTableKey*> { 8103 class CodeCacheHashTableShape : public BaseShape<HashTableKey*> {
8184 public: 8104 public:
8185 static inline bool IsMatch(HashTableKey* key, Object* value) { 8105 static inline bool IsMatch(HashTableKey* key, Object* value) {
8186 return key->IsMatch(value); 8106 return key->IsMatch(value);
8187 } 8107 }
8188 8108
8189 static inline uint32_t Hash(HashTableKey* key) { 8109 static inline uint32_t Hash(HashTableKey* key) {
8190 return key->Hash(); 8110 return key->Hash();
8191 } 8111 }
8192 8112
8193 static inline uint32_t HashForObject(HashTableKey* key, Object* object) { 8113 static inline uint32_t HashForObject(HashTableKey* key, Object* object) {
8194 return key->HashForObject(object); 8114 return key->HashForObject(object);
8195 } 8115 }
8196 8116
8197 static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key); 8117 static inline Handle<Object> AsHandle(Isolate* isolate, HashTableKey* key);
8198 8118
8199 static const int kPrefixSize = 0; 8119 static const int kPrefixSize = 0;
8200 static const int kEntrySize = 2; 8120 // The both the key (name + flags) and value (code object) can be derived from
8121 // the fixed array that stores both the name and code.
8122 // TODO(verwaest): Don't allocate a fixed array but inline name and code.
8123 // Rewrite IsMatch to get table + index as input rather than just the raw key.
8124 static const int kEntrySize = 1;
8201 }; 8125 };
8202 8126
8203 8127
8204 class CodeCacheHashTable: public HashTable<CodeCacheHashTable, 8128 class CodeCacheHashTable: public HashTable<CodeCacheHashTable,
8205 CodeCacheHashTableShape, 8129 CodeCacheHashTableShape,
8206 HashTableKey*> { 8130 HashTableKey*> {
8207 public: 8131 public:
8208 Object* Lookup(Name* name, Code::Flags flags);
8209 static Handle<CodeCacheHashTable> Put( 8132 static Handle<CodeCacheHashTable> Put(
8210 Handle<CodeCacheHashTable> table, 8133 Handle<CodeCacheHashTable> table,
8211 Handle<Name> name, 8134 Handle<Name> name,
8212 Handle<Code> code); 8135 Handle<Code> code);
8213 8136
8214 int GetIndex(Name* name, Code::Flags flags); 8137 Code* Lookup(Name* name, Code::Flags flags);
8215 void RemoveByIndex(int index);
8216 8138
8217 DECLARE_CAST(CodeCacheHashTable) 8139 DECLARE_CAST(CodeCacheHashTable)
8218 8140
8219 // Initial size of the fixed array backing the hash table. 8141 // Initial size of the fixed array backing the hash table.
8220 static const int kInitialSize = 64; 8142 static const int kInitialSize = 16;
8221 8143
8222 private: 8144 private:
8223 DISALLOW_IMPLICIT_CONSTRUCTORS(CodeCacheHashTable); 8145 DISALLOW_IMPLICIT_CONSTRUCTORS(CodeCacheHashTable);
8224 }; 8146 };
8225 8147
8226 8148
8227 class PolymorphicCodeCache: public Struct {
8228 public:
8229 DECL_ACCESSORS(cache, Object)
8230
8231 static void Update(Handle<PolymorphicCodeCache> cache,
8232 MapHandleList* maps,
8233 Code::Flags flags,
8234 Handle<Code> code);
8235
8236
8237 // Returns an undefined value if the entry is not found.
8238 Handle<Object> Lookup(MapHandleList* maps, Code::Flags flags);
8239
8240 DECLARE_CAST(PolymorphicCodeCache)
8241
8242 // Dispatched behavior.
8243 DECLARE_PRINTER(PolymorphicCodeCache)
8244 DECLARE_VERIFIER(PolymorphicCodeCache)
8245
8246 static const int kCacheOffset = HeapObject::kHeaderSize;
8247 static const int kSize = kCacheOffset + kPointerSize;
8248
8249 private:
8250 DISALLOW_IMPLICIT_CONSTRUCTORS(PolymorphicCodeCache);
8251 };
8252
8253
8254 class PolymorphicCodeCacheHashTable
8255 : public HashTable<PolymorphicCodeCacheHashTable,
8256 CodeCacheHashTableShape,
8257 HashTableKey*> {
8258 public:
8259 Object* Lookup(MapHandleList* maps, int code_kind);
8260
8261 static Handle<PolymorphicCodeCacheHashTable> Put(
8262 Handle<PolymorphicCodeCacheHashTable> hash_table,
8263 MapHandleList* maps,
8264 int code_kind,
8265 Handle<Code> code);
8266
8267 DECLARE_CAST(PolymorphicCodeCacheHashTable)
8268
8269 static const int kInitialSize = 64;
8270 private:
8271 DISALLOW_IMPLICIT_CONSTRUCTORS(PolymorphicCodeCacheHashTable);
8272 };
8273
8274
8275 class TypeFeedbackInfo: public Struct { 8149 class TypeFeedbackInfo: public Struct {
8276 public: 8150 public:
8277 inline int ic_total_count(); 8151 inline int ic_total_count();
8278 inline void set_ic_total_count(int count); 8152 inline void set_ic_total_count(int count);
8279 8153
8280 inline int ic_with_type_info_count(); 8154 inline int ic_with_type_info_count();
8281 inline void change_ic_with_type_info_count(int delta); 8155 inline void change_ic_with_type_info_count(int delta);
8282 8156
8283 inline int ic_generic_count(); 8157 inline int ic_generic_count();
8284 inline void change_ic_generic_count(int delta); 8158 inline void change_ic_generic_count(int delta);
(...skipping 2633 matching lines...) Expand 10 before | Expand all | Expand 10 after
10918 } 10792 }
10919 return value; 10793 return value;
10920 } 10794 }
10921 }; 10795 };
10922 10796
10923 10797
10924 } // NOLINT, false-positive due to second-order macros. 10798 } // NOLINT, false-positive due to second-order macros.
10925 } // NOLINT, false-positive due to second-order macros. 10799 } // NOLINT, false-positive due to second-order macros.
10926 10800
10927 #endif // V8_OBJECTS_H_ 10801 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/mips64/code-stubs-mips64.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698