[ubsan] Port WeakFixedArray and subclasses
TransitionArray, NormalizedMapCache, DependentCode to the new design. Bug: v8:3770 Change-Id: I8bd56f231fb62b146e0fb05989418aedb62a628b Reviewed-on: https://chromium-review.googlesource.com/c/1350287 Commit-Queue: Jakob Kummerow <jkummerow@chromium.org> Reviewed-by: Hannes Payer <hpayer@chromium.org> Reviewed-by: Adam Klein <adamk@chromium.org> Cr-Commit-Position: refs/heads/master@{#57921}
This commit is contained in:
parent
ed2e7eb92d
commit
862266a2aa
@ -611,7 +611,7 @@ InlineCacheState FeedbackNexus::StateFromFeedback() const {
|
|||||||
if (heap_object->IsName()) {
|
if (heap_object->IsName()) {
|
||||||
DCHECK(IsKeyedLoadICKind(kind()) || IsKeyedStoreICKind(kind()));
|
DCHECK(IsKeyedLoadICKind(kind()) || IsKeyedStoreICKind(kind()));
|
||||||
Object* extra = GetFeedbackExtra()->GetHeapObjectAssumeStrong();
|
Object* extra = GetFeedbackExtra()->GetHeapObjectAssumeStrong();
|
||||||
WeakFixedArray* extra_array = WeakFixedArray::cast(extra);
|
WeakFixedArray extra_array = WeakFixedArray::cast(extra);
|
||||||
return extra_array->length() > 2 ? POLYMORPHIC : MONOMORPHIC;
|
return extra_array->length() > 2 ? POLYMORPHIC : MONOMORPHIC;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -923,7 +923,7 @@ int FeedbackNexus::ExtractMaps(MapHandles* maps) const {
|
|||||||
heap_object->IsWeakFixedArray()) ||
|
heap_object->IsWeakFixedArray()) ||
|
||||||
is_named_feedback) {
|
is_named_feedback) {
|
||||||
int found = 0;
|
int found = 0;
|
||||||
WeakFixedArray* array;
|
WeakFixedArray array;
|
||||||
if (is_named_feedback) {
|
if (is_named_feedback) {
|
||||||
array =
|
array =
|
||||||
WeakFixedArray::cast(GetFeedbackExtra()->GetHeapObjectAssumeStrong());
|
WeakFixedArray::cast(GetFeedbackExtra()->GetHeapObjectAssumeStrong());
|
||||||
@ -970,7 +970,7 @@ MaybeObjectHandle FeedbackNexus::FindHandlerForMap(Handle<Map> map) const {
|
|||||||
if ((feedback->GetHeapObjectIfStrong(&heap_object) &&
|
if ((feedback->GetHeapObjectIfStrong(&heap_object) &&
|
||||||
heap_object->IsWeakFixedArray()) ||
|
heap_object->IsWeakFixedArray()) ||
|
||||||
is_named_feedback) {
|
is_named_feedback) {
|
||||||
WeakFixedArray* array;
|
WeakFixedArray array;
|
||||||
if (is_named_feedback) {
|
if (is_named_feedback) {
|
||||||
array =
|
array =
|
||||||
WeakFixedArray::cast(GetFeedbackExtra()->GetHeapObjectAssumeStrong());
|
WeakFixedArray::cast(GetFeedbackExtra()->GetHeapObjectAssumeStrong());
|
||||||
@ -1017,7 +1017,7 @@ bool FeedbackNexus::FindHandlers(MaybeObjectHandles* code_list,
|
|||||||
if ((feedback->GetHeapObjectIfStrong(&heap_object) &&
|
if ((feedback->GetHeapObjectIfStrong(&heap_object) &&
|
||||||
heap_object->IsWeakFixedArray()) ||
|
heap_object->IsWeakFixedArray()) ||
|
||||||
is_named_feedback) {
|
is_named_feedback) {
|
||||||
WeakFixedArray* array;
|
WeakFixedArray array;
|
||||||
if (is_named_feedback) {
|
if (is_named_feedback) {
|
||||||
array =
|
array =
|
||||||
WeakFixedArray::cast(GetFeedbackExtra()->GetHeapObjectAssumeStrong());
|
WeakFixedArray::cast(GetFeedbackExtra()->GetHeapObjectAssumeStrong());
|
||||||
|
@ -328,7 +328,7 @@ class ConcurrentMarkingVisitor final
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int VisitTransitionArray(Map map, TransitionArray* array) {
|
int VisitTransitionArray(Map map, TransitionArray array) {
|
||||||
if (!ShouldVisit(array)) return 0;
|
if (!ShouldVisit(array)) return 0;
|
||||||
VisitMapPointer(array, array->map_slot());
|
VisitMapPointer(array, array->map_slot());
|
||||||
int size = TransitionArray::BodyDescriptor::SizeOf(map, array);
|
int size = TransitionArray::BodyDescriptor::SizeOf(map, array);
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include "src/compiler.h"
|
#include "src/compiler.h"
|
||||||
#include "src/conversions.h"
|
#include "src/conversions.h"
|
||||||
#include "src/counters.h"
|
#include "src/counters.h"
|
||||||
|
#include "src/heap/mark-compact-inl.h"
|
||||||
#include "src/interpreter/interpreter.h"
|
#include "src/interpreter/interpreter.h"
|
||||||
#include "src/isolate-inl.h"
|
#include "src/isolate-inl.h"
|
||||||
#include "src/macro-assembler.h"
|
#include "src/macro-assembler.h"
|
||||||
@ -22,6 +23,7 @@
|
|||||||
#include "src/objects/bigint.h"
|
#include "src/objects/bigint.h"
|
||||||
#include "src/objects/debug-objects-inl.h"
|
#include "src/objects/debug-objects-inl.h"
|
||||||
#include "src/objects/embedder-data-array-inl.h"
|
#include "src/objects/embedder-data-array-inl.h"
|
||||||
|
#include "src/objects/fixed-array-inl.h"
|
||||||
#include "src/objects/frame-array-inl.h"
|
#include "src/objects/frame-array-inl.h"
|
||||||
#include "src/objects/instance-type-inl.h"
|
#include "src/objects/instance-type-inl.h"
|
||||||
#include "src/objects/js-array-inl.h"
|
#include "src/objects/js-array-inl.h"
|
||||||
@ -2147,7 +2149,7 @@ Handle<WeakFixedArray> Factory::CopyWeakFixedArrayAndGrow(
|
|||||||
DCHECK_EQ(old_len, src->length());
|
DCHECK_EQ(old_len, src->length());
|
||||||
obj->set_map_after_allocation(src->map(), SKIP_WRITE_BARRIER);
|
obj->set_map_after_allocation(src->map(), SKIP_WRITE_BARRIER);
|
||||||
|
|
||||||
WeakFixedArray* result = WeakFixedArray::cast(obj);
|
WeakFixedArray result = WeakFixedArray::cast(obj);
|
||||||
result->set_length(new_len);
|
result->set_length(new_len);
|
||||||
|
|
||||||
// Copy the content.
|
// Copy the content.
|
||||||
|
@ -2668,14 +2668,14 @@ void Heap::RightTrimFixedArray(FixedArrayBase object, int elements_to_trim) {
|
|||||||
CreateFillerForArray<FixedArrayBase>(object, elements_to_trim, bytes_to_trim);
|
CreateFillerForArray<FixedArrayBase>(object, elements_to_trim, bytes_to_trim);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Heap::RightTrimWeakFixedArray(WeakFixedArray* object,
|
void Heap::RightTrimWeakFixedArray(WeakFixedArray object,
|
||||||
int elements_to_trim) {
|
int elements_to_trim) {
|
||||||
// This function is safe to use only at the end of the mark compact
|
// This function is safe to use only at the end of the mark compact
|
||||||
// collection: When marking, we record the weak slots, and shrinking
|
// collection: When marking, we record the weak slots, and shrinking
|
||||||
// invalidates them.
|
// invalidates them.
|
||||||
DCHECK_EQ(gc_state(), MARK_COMPACT);
|
DCHECK_EQ(gc_state(), MARK_COMPACT);
|
||||||
CreateFillerForArray<WeakFixedArray*>(object, elements_to_trim,
|
CreateFillerForArray<WeakFixedArray>(object, elements_to_trim,
|
||||||
elements_to_trim * kPointerSize);
|
elements_to_trim * kPointerSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -399,7 +399,7 @@ class Heap {
|
|||||||
|
|
||||||
// Trim the given array from the right.
|
// Trim the given array from the right.
|
||||||
void RightTrimFixedArray(FixedArrayBase obj, int elements_to_trim);
|
void RightTrimFixedArray(FixedArrayBase obj, int elements_to_trim);
|
||||||
void RightTrimWeakFixedArray(WeakFixedArray* obj, int elements_to_trim);
|
void RightTrimWeakFixedArray(WeakFixedArray obj, int elements_to_trim);
|
||||||
|
|
||||||
// Converts the given boolean condition to JavaScript boolean value.
|
// Converts the given boolean condition to JavaScript boolean value.
|
||||||
inline Oddball* ToBoolean(bool condition);
|
inline Oddball* ToBoolean(bool condition);
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include "src/objects/js-collection-inl.h"
|
#include "src/objects/js-collection-inl.h"
|
||||||
#include "src/objects/js-weak-refs-inl.h"
|
#include "src/objects/js-weak-refs-inl.h"
|
||||||
#include "src/objects/slots-inl.h"
|
#include "src/objects/slots-inl.h"
|
||||||
|
#include "src/transitions.h"
|
||||||
|
|
||||||
namespace v8 {
|
namespace v8 {
|
||||||
namespace internal {
|
namespace internal {
|
||||||
@ -168,7 +169,7 @@ template <FixedArrayVisitationMode fixed_array_mode,
|
|||||||
TraceRetainingPathMode retaining_path_mode, typename MarkingState>
|
TraceRetainingPathMode retaining_path_mode, typename MarkingState>
|
||||||
int MarkingVisitor<fixed_array_mode, retaining_path_mode,
|
int MarkingVisitor<fixed_array_mode, retaining_path_mode,
|
||||||
MarkingState>::VisitTransitionArray(Map map,
|
MarkingState>::VisitTransitionArray(Map map,
|
||||||
TransitionArray* array) {
|
TransitionArray array) {
|
||||||
int size = TransitionArray::BodyDescriptor::SizeOf(map, array);
|
int size = TransitionArray::BodyDescriptor::SizeOf(map, array);
|
||||||
TransitionArray::BodyDescriptor::IterateBody(map, array, size, this);
|
TransitionArray::BodyDescriptor::IterateBody(map, array, size, this);
|
||||||
collector_->AddTransitionArray(array);
|
collector_->AddTransitionArray(array);
|
||||||
@ -440,6 +441,10 @@ void MarkCompactCollector::RecordSlot(HeapObject* object, HeapObjectSlot slot,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MarkCompactCollector::AddTransitionArray(TransitionArray array) {
|
||||||
|
weak_objects_.transition_arrays.Push(kMainThread, array);
|
||||||
|
}
|
||||||
|
|
||||||
template <LiveObjectIterationMode mode>
|
template <LiveObjectIterationMode mode>
|
||||||
LiveObjectRange<mode>::iterator::iterator(MemoryChunk* chunk, Bitmap* bitmap,
|
LiveObjectRange<mode>::iterator::iterator(MemoryChunk* chunk, Bitmap* bitmap,
|
||||||
Address start)
|
Address start)
|
||||||
|
@ -1939,7 +1939,7 @@ void MarkCompactCollector::ClearPotentialSimpleMapTransition(Map map,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void MarkCompactCollector::ClearFullMapTransitions() {
|
void MarkCompactCollector::ClearFullMapTransitions() {
|
||||||
TransitionArray* array;
|
TransitionArray array;
|
||||||
while (weak_objects_.transition_arrays.Pop(kMainThread, &array)) {
|
while (weak_objects_.transition_arrays.Pop(kMainThread, &array)) {
|
||||||
int num_transitions = array->number_of_entries();
|
int num_transitions = array->number_of_entries();
|
||||||
if (num_transitions > 0) {
|
if (num_transitions > 0) {
|
||||||
@ -1964,7 +1964,7 @@ void MarkCompactCollector::ClearFullMapTransitions() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool MarkCompactCollector::CompactTransitionArray(
|
bool MarkCompactCollector::CompactTransitionArray(
|
||||||
Map map, TransitionArray* transitions, DescriptorArray* descriptors) {
|
Map map, TransitionArray transitions, DescriptorArray* descriptors) {
|
||||||
DCHECK(!map->is_prototype_map());
|
DCHECK(!map->is_prototype_map());
|
||||||
int num_transitions = transitions->number_of_entries();
|
int num_transitions = transitions->number_of_entries();
|
||||||
bool descriptors_owner_died = false;
|
bool descriptors_owner_died = false;
|
||||||
|
@ -415,7 +415,7 @@ typedef Worklist<Ephemeron, 64> EphemeronWorklist;
|
|||||||
|
|
||||||
// Weak objects encountered during marking.
|
// Weak objects encountered during marking.
|
||||||
struct WeakObjects {
|
struct WeakObjects {
|
||||||
Worklist<TransitionArray*, 64> transition_arrays;
|
Worklist<TransitionArray, 64> transition_arrays;
|
||||||
|
|
||||||
// Keep track of all EphemeronHashTables in the heap to process
|
// Keep track of all EphemeronHashTables in the heap to process
|
||||||
// them in the atomic pause.
|
// them in the atomic pause.
|
||||||
@ -653,9 +653,7 @@ class MarkCompactCollector final : public MarkCompactCollectorBase {
|
|||||||
|
|
||||||
WeakObjects* weak_objects() { return &weak_objects_; }
|
WeakObjects* weak_objects() { return &weak_objects_; }
|
||||||
|
|
||||||
void AddTransitionArray(TransitionArray* array) {
|
inline void AddTransitionArray(TransitionArray array);
|
||||||
weak_objects_.transition_arrays.Push(kMainThread, array);
|
|
||||||
}
|
|
||||||
|
|
||||||
void AddEphemeronHashTable(EphemeronHashTable table) {
|
void AddEphemeronHashTable(EphemeronHashTable table) {
|
||||||
weak_objects_.ephemeron_hash_tables.Push(kMainThread, table);
|
weak_objects_.ephemeron_hash_tables.Push(kMainThread, table);
|
||||||
@ -755,9 +753,6 @@ class MarkCompactCollector final : public MarkCompactCollectorBase {
|
|||||||
// otherwise they can die and try to deoptimize the underlying code.
|
// otherwise they can die and try to deoptimize the underlying code.
|
||||||
void ProcessTopOptimizedFrame(ObjectVisitor* visitor);
|
void ProcessTopOptimizedFrame(ObjectVisitor* visitor);
|
||||||
|
|
||||||
// Collects a list of dependent code from maps embedded in optimize code.
|
|
||||||
DependentCode* DependentCodeListFromNonLiveMaps();
|
|
||||||
|
|
||||||
// Drains the main thread marking work list. Will mark all pending objects
|
// Drains the main thread marking work list. Will mark all pending objects
|
||||||
// if no concurrent threads are running.
|
// if no concurrent threads are running.
|
||||||
void ProcessMarkingWorklist() override;
|
void ProcessMarkingWorklist() override;
|
||||||
@ -805,10 +800,10 @@ class MarkCompactCollector final : public MarkCompactCollectorBase {
|
|||||||
// Compact every array in the global list of transition arrays and
|
// Compact every array in the global list of transition arrays and
|
||||||
// trim the corresponding descriptor array if a transition target is non-live.
|
// trim the corresponding descriptor array if a transition target is non-live.
|
||||||
void ClearFullMapTransitions();
|
void ClearFullMapTransitions();
|
||||||
bool CompactTransitionArray(Map map, TransitionArray* transitions,
|
|
||||||
DescriptorArray* descriptors);
|
|
||||||
void TrimDescriptorArray(Map map, DescriptorArray* descriptors);
|
void TrimDescriptorArray(Map map, DescriptorArray* descriptors);
|
||||||
void TrimEnumCache(Map map, DescriptorArray* descriptors);
|
void TrimEnumCache(Map map, DescriptorArray* descriptors);
|
||||||
|
bool CompactTransitionArray(Map map, TransitionArray transitions,
|
||||||
|
DescriptorArray* descriptors);
|
||||||
|
|
||||||
// After all reachable objects have been marked those weak map entries
|
// After all reachable objects have been marked those weak map entries
|
||||||
// with an unreachable key are removed from all encountered weak maps.
|
// with an unreachable key are removed from all encountered weak maps.
|
||||||
@ -934,7 +929,7 @@ class MarkingVisitor final
|
|||||||
V8_INLINE int VisitJSDataView(Map map, JSDataView* object);
|
V8_INLINE int VisitJSDataView(Map map, JSDataView* object);
|
||||||
V8_INLINE int VisitJSTypedArray(Map map, JSTypedArray* object);
|
V8_INLINE int VisitJSTypedArray(Map map, JSTypedArray* object);
|
||||||
V8_INLINE int VisitMap(Map map, Map object);
|
V8_INLINE int VisitMap(Map map, Map object);
|
||||||
V8_INLINE int VisitTransitionArray(Map map, TransitionArray* object);
|
V8_INLINE int VisitTransitionArray(Map map, TransitionArray object);
|
||||||
V8_INLINE int VisitJSWeakCell(Map map, JSWeakCell* object);
|
V8_INLINE int VisitJSWeakCell(Map map, JSWeakCell* object);
|
||||||
|
|
||||||
// ObjectVisitor implementation.
|
// ObjectVisitor implementation.
|
||||||
|
@ -73,7 +73,7 @@ class WasmInstanceObject;
|
|||||||
V(SmallOrderedNameDictionary, SmallOrderedNameDictionary) \
|
V(SmallOrderedNameDictionary, SmallOrderedNameDictionary) \
|
||||||
V(Symbol, Symbol) \
|
V(Symbol, Symbol) \
|
||||||
V(ThinString, ThinString) \
|
V(ThinString, ThinString) \
|
||||||
V(TransitionArray, TransitionArray*) \
|
V(TransitionArray, TransitionArray) \
|
||||||
V(UncompiledDataWithoutPreParsedScope, UncompiledDataWithoutPreParsedScope*) \
|
V(UncompiledDataWithoutPreParsedScope, UncompiledDataWithoutPreParsedScope*) \
|
||||||
V(UncompiledDataWithPreParsedScope, UncompiledDataWithPreParsedScope*) \
|
V(UncompiledDataWithPreParsedScope, UncompiledDataWithPreParsedScope*) \
|
||||||
V(WasmInstanceObject, WasmInstanceObject*)
|
V(WasmInstanceObject, WasmInstanceObject*)
|
||||||
|
@ -1967,7 +1967,7 @@ void Script::ScriptVerify(Isolate* isolate) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NormalizedMapCache::NormalizedMapCacheVerify(Isolate* isolate) {
|
void NormalizedMapCache::NormalizedMapCacheVerify(Isolate* isolate) {
|
||||||
WeakFixedArray::cast(this)->WeakFixedArrayVerify(isolate);
|
WeakFixedArray::cast(*this)->WeakFixedArrayVerify(isolate);
|
||||||
if (FLAG_enable_slow_asserts) {
|
if (FLAG_enable_slow_asserts) {
|
||||||
for (int i = 0; i < length(); i++) {
|
for (int i = 0; i < length(); i++) {
|
||||||
MaybeObject e = WeakFixedArray::Get(i);
|
MaybeObject e = WeakFixedArray::Get(i);
|
||||||
|
@ -501,6 +501,11 @@ OBJECT_CONSTRUCTORS_IMPL(SmallOrderedNameDictionary,
|
|||||||
OBJECT_CONSTRUCTORS_IMPL(RegExpMatchInfo, FixedArray)
|
OBJECT_CONSTRUCTORS_IMPL(RegExpMatchInfo, FixedArray)
|
||||||
OBJECT_CONSTRUCTORS_IMPL(ScopeInfo, FixedArray)
|
OBJECT_CONSTRUCTORS_IMPL(ScopeInfo, FixedArray)
|
||||||
|
|
||||||
|
NormalizedMapCache::NormalizedMapCache(Address ptr) : WeakFixedArray(ptr) {
|
||||||
|
// TODO(jkummerow): Introduce IsNormalizedMapCache() and use
|
||||||
|
// OBJECT_CONSTRUCTORS_IMPL macro?
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------
|
// ------------------------------------
|
||||||
// Cast operations
|
// Cast operations
|
||||||
|
|
||||||
@ -521,7 +526,7 @@ CAST_ACCESSOR(HeapNumber)
|
|||||||
CAST_ACCESSOR(MutableHeapNumber)
|
CAST_ACCESSOR(MutableHeapNumber)
|
||||||
CAST_ACCESSOR2(OrderedNameDictionary)
|
CAST_ACCESSOR2(OrderedNameDictionary)
|
||||||
CAST_ACCESSOR2(NameDictionary)
|
CAST_ACCESSOR2(NameDictionary)
|
||||||
CAST_ACCESSOR(NormalizedMapCache)
|
CAST_ACCESSOR2(NormalizedMapCache)
|
||||||
CAST_ACCESSOR2(NumberDictionary)
|
CAST_ACCESSOR2(NumberDictionary)
|
||||||
CAST_ACCESSOR(Object)
|
CAST_ACCESSOR(Object)
|
||||||
CAST_ACCESSOR2(ObjectHashSet)
|
CAST_ACCESSOR2(ObjectHashSet)
|
||||||
@ -965,7 +970,7 @@ Handle<Object> Oddball::ToNumber(Isolate* isolate, Handle<Oddball> input) {
|
|||||||
|
|
||||||
ACCESSORS(Cell, value, Object, kValueOffset)
|
ACCESSORS(Cell, value, Object, kValueOffset)
|
||||||
ACCESSORS(FeedbackCell, value, HeapObject, kValueOffset)
|
ACCESSORS(FeedbackCell, value, HeapObject, kValueOffset)
|
||||||
ACCESSORS(PropertyCell, dependent_code, DependentCode, kDependentCodeOffset)
|
ACCESSORS2(PropertyCell, dependent_code, DependentCode, kDependentCodeOffset)
|
||||||
ACCESSORS2(PropertyCell, name, Name, kNameOffset)
|
ACCESSORS2(PropertyCell, name, Name, kNameOffset)
|
||||||
ACCESSORS(PropertyCell, value, Object, kValueOffset)
|
ACCESSORS(PropertyCell, value, Object, kValueOffset)
|
||||||
ACCESSORS(PropertyCell, property_details_raw, Object, kDetailsOffset)
|
ACCESSORS(PropertyCell, property_details_raw, Object, kDetailsOffset)
|
||||||
@ -1565,7 +1570,7 @@ int HeapObject::SizeFromMap(Map map) const {
|
|||||||
if (IsInRange(instance_type, FIRST_WEAK_FIXED_ARRAY_TYPE,
|
if (IsInRange(instance_type, FIRST_WEAK_FIXED_ARRAY_TYPE,
|
||||||
LAST_WEAK_FIXED_ARRAY_TYPE)) {
|
LAST_WEAK_FIXED_ARRAY_TYPE)) {
|
||||||
return WeakFixedArray::SizeFor(
|
return WeakFixedArray::SizeFor(
|
||||||
reinterpret_cast<const WeakFixedArray*>(this)->synchronized_length());
|
WeakFixedArray::unchecked_cast(this)->synchronized_length());
|
||||||
}
|
}
|
||||||
if (instance_type == WEAK_ARRAY_LIST_TYPE) {
|
if (instance_type == WEAK_ARRAY_LIST_TYPE) {
|
||||||
return WeakArrayList::SizeForCapacity(
|
return WeakArrayList::SizeForCapacity(
|
||||||
|
@ -1080,7 +1080,7 @@ void WeakArrayList::WeakArrayListPrint(std::ostream& os) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TransitionArray::TransitionArrayPrint(std::ostream& os) { // NOLINT
|
void TransitionArray::TransitionArrayPrint(std::ostream& os) { // NOLINT
|
||||||
HeapObject::PrintHeader(os, "TransitionArray");
|
PrintHeader(os, "TransitionArray");
|
||||||
PrintInternal(os);
|
PrintInternal(os);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14143,10 +14143,11 @@ int SharedFunctionInfo::FindIndexInScript(Isolate* isolate) const {
|
|||||||
Object* script_obj = script();
|
Object* script_obj = script();
|
||||||
if (!script_obj->IsScript()) return FunctionLiteral::kIdTypeInvalid;
|
if (!script_obj->IsScript()) return FunctionLiteral::kIdTypeInvalid;
|
||||||
|
|
||||||
WeakFixedArray* shared_info_list =
|
WeakFixedArray shared_info_list =
|
||||||
Script::cast(script_obj)->shared_function_infos();
|
Script::cast(script_obj)->shared_function_infos();
|
||||||
SharedFunctionInfo::ScriptIterator iterator(
|
SharedFunctionInfo::ScriptIterator iterator(
|
||||||
isolate, Handle<WeakFixedArray>(&shared_info_list));
|
isolate,
|
||||||
|
Handle<WeakFixedArray>(reinterpret_cast<Address*>(&shared_info_list)));
|
||||||
|
|
||||||
for (SharedFunctionInfo shared = iterator.Next(); !shared.is_null();
|
for (SharedFunctionInfo shared = iterator.Next(); !shared.is_null();
|
||||||
shared = iterator.Next()) {
|
shared = iterator.Next()) {
|
||||||
@ -15326,7 +15327,7 @@ void JSArray::SetLength(Handle<JSArray> array, uint32_t new_length) {
|
|||||||
array->GetElementsAccessor()->SetLength(array, new_length);
|
array->GetElementsAccessor()->SetLength(array, new_length);
|
||||||
}
|
}
|
||||||
|
|
||||||
DependentCode* DependentCode::GetDependentCode(Handle<HeapObject> object) {
|
DependentCode DependentCode::GetDependentCode(Handle<HeapObject> object) {
|
||||||
if (object->IsMap()) {
|
if (object->IsMap()) {
|
||||||
return Handle<Map>::cast(object)->dependent_code();
|
return Handle<Map>::cast(object)->dependent_code();
|
||||||
} else if (object->IsPropertyCell()) {
|
} else if (object->IsPropertyCell()) {
|
||||||
@ -17548,7 +17549,7 @@ int SearchLiteralsMapEntry(CompilationCacheTable cache, int cache_entry,
|
|||||||
// object used to be a FixedArray here).
|
// object used to be a FixedArray here).
|
||||||
DCHECK(!obj->IsFixedArray());
|
DCHECK(!obj->IsFixedArray());
|
||||||
if (obj->IsWeakFixedArray()) {
|
if (obj->IsWeakFixedArray()) {
|
||||||
WeakFixedArray* literals_map = WeakFixedArray::cast(obj);
|
WeakFixedArray literals_map = WeakFixedArray::cast(obj);
|
||||||
int length = literals_map->length();
|
int length = literals_map->length();
|
||||||
for (int i = 0; i < length; i += kLiteralEntryLength) {
|
for (int i = 0; i < length; i += kLiteralEntryLength) {
|
||||||
DCHECK(literals_map->Get(i + kLiteralContextOffset)->IsWeakOrCleared());
|
DCHECK(literals_map->Get(i + kLiteralContextOffset)->IsWeakOrCleared());
|
||||||
@ -17635,8 +17636,7 @@ FeedbackCell* SearchLiteralsMap(CompilationCacheTable cache, int cache_entry,
|
|||||||
FeedbackCell* result = nullptr;
|
FeedbackCell* result = nullptr;
|
||||||
int entry = SearchLiteralsMapEntry(cache, cache_entry, native_context);
|
int entry = SearchLiteralsMapEntry(cache, cache_entry, native_context);
|
||||||
if (entry >= 0) {
|
if (entry >= 0) {
|
||||||
WeakFixedArray* literals_map =
|
WeakFixedArray literals_map = WeakFixedArray::cast(cache->get(cache_entry));
|
||||||
WeakFixedArray::cast(cache->get(cache_entry));
|
|
||||||
DCHECK_LE(entry + kLiteralEntryLength, literals_map->length());
|
DCHECK_LE(entry + kLiteralEntryLength, literals_map->length());
|
||||||
MaybeObject object = literals_map->Get(entry + kLiteralLiteralsOffset);
|
MaybeObject object = literals_map->Get(entry + kLiteralLiteralsOffset);
|
||||||
|
|
||||||
|
@ -1569,7 +1569,7 @@ class PropertyCell : public HeapObject {
|
|||||||
DECL_ACCESSORS(value, Object)
|
DECL_ACCESSORS(value, Object)
|
||||||
// [dependent_code]: dependent code that depends on the type of the global
|
// [dependent_code]: dependent code that depends on the type of the global
|
||||||
// property.
|
// property.
|
||||||
DECL_ACCESSORS(dependent_code, DependentCode)
|
DECL_ACCESSORS2(dependent_code, DependentCode)
|
||||||
|
|
||||||
inline PropertyDetails property_details() const;
|
inline PropertyDetails property_details() const;
|
||||||
inline void set_property_details(PropertyDetails details);
|
inline void set_property_details(PropertyDetails details);
|
||||||
|
@ -25,7 +25,7 @@ ACCESSORS(AllocationSite, nested_site, Object, kNestedSiteOffset)
|
|||||||
INT32_ACCESSORS(AllocationSite, pretenure_data, kPretenureDataOffset)
|
INT32_ACCESSORS(AllocationSite, pretenure_data, kPretenureDataOffset)
|
||||||
INT32_ACCESSORS(AllocationSite, pretenure_create_count,
|
INT32_ACCESSORS(AllocationSite, pretenure_create_count,
|
||||||
kPretenureCreateCountOffset)
|
kPretenureCreateCountOffset)
|
||||||
ACCESSORS(AllocationSite, dependent_code, DependentCode, kDependentCodeOffset)
|
ACCESSORS2(AllocationSite, dependent_code, DependentCode, kDependentCodeOffset)
|
||||||
ACCESSORS_CHECKED(AllocationSite, weak_next, Object, kWeakNextOffset,
|
ACCESSORS_CHECKED(AllocationSite, weak_next, Object, kWeakNextOffset,
|
||||||
HasWeakNext())
|
HasWeakNext())
|
||||||
ACCESSORS(AllocationMemento, allocation_site, Object, kAllocationSiteOffset)
|
ACCESSORS(AllocationMemento, allocation_site, Object, kAllocationSiteOffset)
|
||||||
|
@ -48,7 +48,7 @@ class AllocationSite : public Struct, public NeverReadOnlySpaceObject {
|
|||||||
DECL_INT32_ACCESSORS(pretenure_data)
|
DECL_INT32_ACCESSORS(pretenure_data)
|
||||||
|
|
||||||
DECL_INT32_ACCESSORS(pretenure_create_count)
|
DECL_INT32_ACCESSORS(pretenure_create_count)
|
||||||
DECL_ACCESSORS(dependent_code, DependentCode)
|
DECL_ACCESSORS2(dependent_code, DependentCode)
|
||||||
|
|
||||||
// heap->allocation_site_list() points to the last AllocationSite which form
|
// heap->allocation_site_list() points to the last AllocationSite which form
|
||||||
// a linked list through the weak_next property. The GC might remove elements
|
// a linked list through the weak_next property. The GC might remove elements
|
||||||
|
@ -25,6 +25,7 @@ namespace internal {
|
|||||||
OBJECT_CONSTRUCTORS_IMPL(DeoptimizationData, FixedArray)
|
OBJECT_CONSTRUCTORS_IMPL(DeoptimizationData, FixedArray)
|
||||||
OBJECT_CONSTRUCTORS_IMPL(BytecodeArray, FixedArrayBase)
|
OBJECT_CONSTRUCTORS_IMPL(BytecodeArray, FixedArrayBase)
|
||||||
OBJECT_CONSTRUCTORS_IMPL(AbstractCode, HeapObjectPtr)
|
OBJECT_CONSTRUCTORS_IMPL(AbstractCode, HeapObjectPtr)
|
||||||
|
OBJECT_CONSTRUCTORS_IMPL(DependentCode, WeakFixedArray)
|
||||||
|
|
||||||
NEVER_READ_ONLY_SPACE_IMPL(AbstractCode)
|
NEVER_READ_ONLY_SPACE_IMPL(AbstractCode)
|
||||||
|
|
||||||
@ -32,7 +33,7 @@ CAST_ACCESSOR2(AbstractCode)
|
|||||||
CAST_ACCESSOR2(BytecodeArray)
|
CAST_ACCESSOR2(BytecodeArray)
|
||||||
CAST_ACCESSOR2(Code)
|
CAST_ACCESSOR2(Code)
|
||||||
CAST_ACCESSOR(CodeDataContainer)
|
CAST_ACCESSOR(CodeDataContainer)
|
||||||
CAST_ACCESSOR(DependentCode)
|
CAST_ACCESSOR2(DependentCode)
|
||||||
CAST_ACCESSOR2(DeoptimizationData)
|
CAST_ACCESSOR2(DeoptimizationData)
|
||||||
CAST_ACCESSOR(SourcePositionTableWithFrameCache)
|
CAST_ACCESSOR(SourcePositionTableWithFrameCache)
|
||||||
|
|
||||||
@ -146,11 +147,11 @@ BytecodeArray AbstractCode::GetBytecodeArray() {
|
|||||||
return BytecodeArray::cast(*this);
|
return BytecodeArray::cast(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
DependentCode* DependentCode::next_link() {
|
DependentCode DependentCode::next_link() {
|
||||||
return DependentCode::cast(Get(kNextLinkIndex)->GetHeapObjectAssumeStrong());
|
return DependentCode::cast(Get(kNextLinkIndex)->GetHeapObjectAssumeStrong());
|
||||||
}
|
}
|
||||||
|
|
||||||
void DependentCode::set_next_link(DependentCode* next) {
|
void DependentCode::set_next_link(DependentCode next) {
|
||||||
Set(kNextLinkIndex, HeapObjectReference::Strong(next));
|
Set(kNextLinkIndex, HeapObjectReference::Strong(next));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -594,7 +594,7 @@ class AbstractCode : public HeapObjectPtr {
|
|||||||
|
|
||||||
class DependentCode : public WeakFixedArray {
|
class DependentCode : public WeakFixedArray {
|
||||||
public:
|
public:
|
||||||
DECL_CAST(DependentCode)
|
DECL_CAST2(DependentCode)
|
||||||
|
|
||||||
enum DependencyGroup {
|
enum DependencyGroup {
|
||||||
// Group of code that embed a transition to this map, and depend on being
|
// Group of code that embed a transition to this map, and depend on being
|
||||||
@ -635,13 +635,13 @@ class DependentCode : public WeakFixedArray {
|
|||||||
inline DependencyGroup group();
|
inline DependencyGroup group();
|
||||||
inline MaybeObject object_at(int i);
|
inline MaybeObject object_at(int i);
|
||||||
inline int count();
|
inline int count();
|
||||||
inline DependentCode* next_link();
|
inline DependentCode next_link();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const char* DependencyGroupName(DependencyGroup group);
|
static const char* DependencyGroupName(DependencyGroup group);
|
||||||
|
|
||||||
// Get/Set {object}'s {DependentCode}.
|
// Get/Set {object}'s {DependentCode}.
|
||||||
static DependentCode* GetDependentCode(Handle<HeapObject> object);
|
static DependentCode GetDependentCode(Handle<HeapObject> object);
|
||||||
static void SetDependentCode(Handle<HeapObject> object,
|
static void SetDependentCode(Handle<HeapObject> object,
|
||||||
Handle<DependentCode> dep);
|
Handle<DependentCode> dep);
|
||||||
|
|
||||||
@ -669,7 +669,7 @@ class DependentCode : public WeakFixedArray {
|
|||||||
static const int kFlagsIndex = 1;
|
static const int kFlagsIndex = 1;
|
||||||
static const int kCodesStartIndex = 2;
|
static const int kCodesStartIndex = 2;
|
||||||
|
|
||||||
inline void set_next_link(DependentCode* next);
|
inline void set_next_link(DependentCode next);
|
||||||
inline void set_count(int value);
|
inline void set_count(int value);
|
||||||
inline void set_object_at(int i, MaybeObject object);
|
inline void set_object_at(int i, MaybeObject object);
|
||||||
inline void clear_at(int i);
|
inline void clear_at(int i);
|
||||||
@ -680,6 +680,8 @@ class DependentCode : public WeakFixedArray {
|
|||||||
class GroupField : public BitField<int, 0, 3> {};
|
class GroupField : public BitField<int, 0, 3> {};
|
||||||
class CountField : public BitField<int, 3, 27> {};
|
class CountField : public BitField<int, 3, 27> {};
|
||||||
STATIC_ASSERT(kGroupCount <= GroupField::kMax + 1);
|
STATIC_ASSERT(kGroupCount <= GroupField::kMax + 1);
|
||||||
|
|
||||||
|
OBJECT_CONSTRUCTORS(DependentCode, WeakFixedArray)
|
||||||
};
|
};
|
||||||
|
|
||||||
// BytecodeArray represents a sequence of interpreter bytecodes.
|
// BytecodeArray represents a sequence of interpreter bytecodes.
|
||||||
|
@ -29,6 +29,7 @@ OBJECT_CONSTRUCTORS_IMPL(FixedTypedArrayBase, FixedArrayBase)
|
|||||||
OBJECT_CONSTRUCTORS_IMPL(ArrayList, FixedArray)
|
OBJECT_CONSTRUCTORS_IMPL(ArrayList, FixedArray)
|
||||||
OBJECT_CONSTRUCTORS_IMPL(ByteArray, FixedArrayBase)
|
OBJECT_CONSTRUCTORS_IMPL(ByteArray, FixedArrayBase)
|
||||||
OBJECT_CONSTRUCTORS_IMPL(TemplateList, FixedArray)
|
OBJECT_CONSTRUCTORS_IMPL(TemplateList, FixedArray)
|
||||||
|
OBJECT_CONSTRUCTORS_IMPL(WeakFixedArray, HeapObjectPtr)
|
||||||
|
|
||||||
FixedArrayBase::FixedArrayBase(Address ptr, AllowInlineSmiStorage allow_smi)
|
FixedArrayBase::FixedArrayBase(Address ptr, AllowInlineSmiStorage allow_smi)
|
||||||
: HeapObjectPtr(ptr, allow_smi) {
|
: HeapObjectPtr(ptr, allow_smi) {
|
||||||
@ -51,7 +52,7 @@ CAST_ACCESSOR2(FixedArrayBase)
|
|||||||
CAST_ACCESSOR2(FixedDoubleArray)
|
CAST_ACCESSOR2(FixedDoubleArray)
|
||||||
CAST_ACCESSOR2(FixedTypedArrayBase)
|
CAST_ACCESSOR2(FixedTypedArrayBase)
|
||||||
CAST_ACCESSOR2(TemplateList)
|
CAST_ACCESSOR2(TemplateList)
|
||||||
CAST_ACCESSOR(WeakFixedArray)
|
CAST_ACCESSOR2(WeakFixedArray)
|
||||||
CAST_ACCESSOR(WeakArrayList)
|
CAST_ACCESSOR(WeakArrayList)
|
||||||
|
|
||||||
SMI_ACCESSORS(FixedArrayBase, length, kLengthOffset)
|
SMI_ACCESSORS(FixedArrayBase, length, kLengthOffset)
|
||||||
@ -290,11 +291,11 @@ void WeakFixedArray::Set(int index, MaybeObject value, WriteBarrierMode mode) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
MaybeObjectSlot WeakFixedArray::data_start() {
|
MaybeObjectSlot WeakFixedArray::data_start() {
|
||||||
return HeapObject::RawMaybeWeakField(this, kHeaderSize);
|
return RawMaybeWeakField(kHeaderSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
MaybeObjectSlot WeakFixedArray::RawFieldOfElementAt(int index) {
|
MaybeObjectSlot WeakFixedArray::RawFieldOfElementAt(int index) {
|
||||||
return HeapObject::RawMaybeWeakField(this, OffsetOfElementAt(index));
|
return RawMaybeWeakField(OffsetOfElementAt(index));
|
||||||
}
|
}
|
||||||
|
|
||||||
MaybeObject WeakArrayList::Get(int index) const {
|
MaybeObject WeakArrayList::Get(int index) const {
|
||||||
|
@ -270,9 +270,9 @@ class FixedDoubleArray : public FixedArrayBase {
|
|||||||
|
|
||||||
// WeakFixedArray describes fixed-sized arrays with element type
|
// WeakFixedArray describes fixed-sized arrays with element type
|
||||||
// MaybeObject.
|
// MaybeObject.
|
||||||
class WeakFixedArray : public HeapObject {
|
class WeakFixedArray : public HeapObjectPtr {
|
||||||
public:
|
public:
|
||||||
DECL_CAST(WeakFixedArray)
|
DECL_CAST2(WeakFixedArray)
|
||||||
|
|
||||||
inline MaybeObject Get(int index) const;
|
inline MaybeObject Get(int index) const;
|
||||||
|
|
||||||
@ -327,7 +327,7 @@ class WeakFixedArray : public HeapObject {
|
|||||||
|
|
||||||
static const int kFirstIndex = 1;
|
static const int kFirstIndex = 1;
|
||||||
|
|
||||||
DISALLOW_IMPLICIT_CONSTRUCTORS(WeakFixedArray);
|
OBJECT_CONSTRUCTORS(WeakFixedArray, HeapObjectPtr);
|
||||||
};
|
};
|
||||||
|
|
||||||
// WeakArrayList is like a WeakFixedArray with static convenience methods for
|
// WeakArrayList is like a WeakFixedArray with static convenience methods for
|
||||||
|
@ -694,7 +694,7 @@ void Map::SetBackPointer(Object* value, WriteBarrierMode mode) {
|
|||||||
set_constructor_or_backpointer(value, mode);
|
set_constructor_or_backpointer(value, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
ACCESSORS(Map, dependent_code, DependentCode, kDependentCodeOffset)
|
ACCESSORS2(Map, dependent_code, DependentCode, kDependentCodeOffset)
|
||||||
ACCESSORS(Map, prototype_validity_cell, Object, kPrototypeValidityCellOffset)
|
ACCESSORS(Map, prototype_validity_cell, Object, kPrototypeValidityCellOffset)
|
||||||
ACCESSORS(Map, constructor_or_backpointer, Object,
|
ACCESSORS(Map, constructor_or_backpointer, Object,
|
||||||
kConstructorOrBackPointerOffset)
|
kConstructorOrBackPointerOffset)
|
||||||
@ -763,6 +763,8 @@ int Map::SlackForArraySize(int old_size, int size_limit) {
|
|||||||
return Min(max_slack, old_size / 4);
|
return Min(max_slack, old_size / 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NEVER_READ_ONLY_SPACE_IMPL(NormalizedMapCache)
|
||||||
|
|
||||||
int NormalizedMapCache::GetIndex(Handle<Map> map) {
|
int NormalizedMapCache::GetIndex(Handle<Map> map) {
|
||||||
return map->Hash() % NormalizedMapCache::kEntries;
|
return map->Hash() % NormalizedMapCache::kEntries;
|
||||||
}
|
}
|
||||||
@ -774,8 +776,7 @@ bool NormalizedMapCache::IsNormalizedMapCache(const HeapObject* obj) {
|
|||||||
}
|
}
|
||||||
#ifdef VERIFY_HEAP
|
#ifdef VERIFY_HEAP
|
||||||
if (FLAG_verify_heap) {
|
if (FLAG_verify_heap) {
|
||||||
NormalizedMapCache* cache =
|
NormalizedMapCache cache = NormalizedMapCache::cast(obj);
|
||||||
reinterpret_cast<NormalizedMapCache*>(const_cast<HeapObject*>(obj));
|
|
||||||
cache->NormalizedMapCacheVerify(cache->GetIsolate());
|
cache->NormalizedMapCacheVerify(cache->GetIsolate());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -592,7 +592,7 @@ class Map : public HeapObjectPtr {
|
|||||||
LayoutDescriptor layout_descriptor);
|
LayoutDescriptor layout_descriptor);
|
||||||
|
|
||||||
// [dependent code]: list of optimized codes that weakly embed this map.
|
// [dependent code]: list of optimized codes that weakly embed this map.
|
||||||
DECL_ACCESSORS(dependent_code, DependentCode)
|
DECL_ACCESSORS2(dependent_code, DependentCode)
|
||||||
|
|
||||||
// [prototype_validity_cell]: Cell containing the validity bit for prototype
|
// [prototype_validity_cell]: Cell containing the validity bit for prototype
|
||||||
// chains or Smi(0) if uninitialized.
|
// chains or Smi(0) if uninitialized.
|
||||||
@ -975,16 +975,16 @@ class Map : public HeapObjectPtr {
|
|||||||
// The cache for maps used by normalized (dictionary mode) objects.
|
// The cache for maps used by normalized (dictionary mode) objects.
|
||||||
// Such maps do not have property descriptors, so a typical program
|
// Such maps do not have property descriptors, so a typical program
|
||||||
// needs very limited number of distinct normalized maps.
|
// needs very limited number of distinct normalized maps.
|
||||||
class NormalizedMapCache : public WeakFixedArray,
|
class NormalizedMapCache : public WeakFixedArray {
|
||||||
public NeverReadOnlySpaceObject {
|
|
||||||
public:
|
public:
|
||||||
|
NEVER_READ_ONLY_SPACE
|
||||||
static Handle<NormalizedMapCache> New(Isolate* isolate);
|
static Handle<NormalizedMapCache> New(Isolate* isolate);
|
||||||
|
|
||||||
V8_WARN_UNUSED_RESULT MaybeHandle<Map> Get(Handle<Map> fast_map,
|
V8_WARN_UNUSED_RESULT MaybeHandle<Map> Get(Handle<Map> fast_map,
|
||||||
PropertyNormalizationMode mode);
|
PropertyNormalizationMode mode);
|
||||||
void Set(Handle<Map> fast_map, Handle<Map> normalized_map);
|
void Set(Handle<Map> fast_map, Handle<Map> normalized_map);
|
||||||
|
|
||||||
DECL_CAST(NormalizedMapCache)
|
DECL_CAST2(NormalizedMapCache)
|
||||||
|
|
||||||
static inline bool IsNormalizedMapCache(const HeapObject* obj);
|
static inline bool IsNormalizedMapCache(const HeapObject* obj);
|
||||||
|
|
||||||
@ -998,6 +998,8 @@ class NormalizedMapCache : public WeakFixedArray,
|
|||||||
// The following declarations hide base class methods.
|
// The following declarations hide base class methods.
|
||||||
Object* get(int index);
|
Object* get(int index);
|
||||||
void set(int index, Object* value);
|
void set(int index, Object* value);
|
||||||
|
|
||||||
|
OBJECT_CONSTRUCTORS(NormalizedMapCache, WeakFixedArray)
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
@ -32,8 +32,8 @@ ACCESSORS_CHECKED(Script, eval_from_shared_or_wrapped_arguments, Object,
|
|||||||
this->type() != TYPE_WASM)
|
this->type() != TYPE_WASM)
|
||||||
SMI_ACCESSORS_CHECKED(Script, eval_from_position, kEvalFromPositionOffset,
|
SMI_ACCESSORS_CHECKED(Script, eval_from_position, kEvalFromPositionOffset,
|
||||||
this->type() != TYPE_WASM)
|
this->type() != TYPE_WASM)
|
||||||
ACCESSORS(Script, shared_function_infos, WeakFixedArray,
|
ACCESSORS2(Script, shared_function_infos, WeakFixedArray,
|
||||||
kSharedFunctionInfosOffset)
|
kSharedFunctionInfosOffset)
|
||||||
SMI_ACCESSORS(Script, flags, kFlagsOffset)
|
SMI_ACCESSORS(Script, flags, kFlagsOffset)
|
||||||
ACCESSORS(Script, source_url, Object, kSourceUrlOffset)
|
ACCESSORS(Script, source_url, Object, kSourceUrlOffset)
|
||||||
ACCESSORS(Script, source_mapping_url, Object, kSourceMappingUrlOffset)
|
ACCESSORS(Script, source_mapping_url, Object, kSourceMappingUrlOffset)
|
||||||
|
@ -83,7 +83,7 @@ class Script : public Struct, public NeverReadOnlySpaceObject {
|
|||||||
|
|
||||||
// [shared_function_infos]: weak fixed array containing all shared
|
// [shared_function_infos]: weak fixed array containing all shared
|
||||||
// function infos created from this script.
|
// function infos created from this script.
|
||||||
DECL_ACCESSORS(shared_function_infos, WeakFixedArray)
|
DECL_ACCESSORS2(shared_function_infos, WeakFixedArray)
|
||||||
|
|
||||||
// [flags]: Holds an exciting bitfield.
|
// [flags]: Holds an exciting bitfield.
|
||||||
DECL_INT_ACCESSORS(flags)
|
DECL_INT_ACCESSORS(flags)
|
||||||
|
@ -995,7 +995,7 @@ void V8HeapExplorer::ExtractMapReferences(HeapEntry* entry, Map map) {
|
|||||||
} else if (maybe_raw_transitions_or_prototype_info->GetHeapObjectIfStrong(
|
} else if (maybe_raw_transitions_or_prototype_info->GetHeapObjectIfStrong(
|
||||||
&raw_transitions_or_prototype_info)) {
|
&raw_transitions_or_prototype_info)) {
|
||||||
if (raw_transitions_or_prototype_info->IsTransitionArray()) {
|
if (raw_transitions_or_prototype_info->IsTransitionArray()) {
|
||||||
TransitionArray* transitions =
|
TransitionArray transitions =
|
||||||
TransitionArray::cast(raw_transitions_or_prototype_info);
|
TransitionArray::cast(raw_transitions_or_prototype_info);
|
||||||
if (map->CanTransition() && transitions->HasPrototypeTransitions()) {
|
if (map->CanTransition() && transitions->HasPrototypeTransitions()) {
|
||||||
TagObject(transitions->GetPrototypeTransitions(),
|
TagObject(transitions->GetPrototypeTransitions(),
|
||||||
@ -1264,7 +1264,7 @@ void V8HeapExplorer::ExtractDescriptorArrayReferences(HeapEntry* entry,
|
|||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void V8HeapExplorer::ExtractWeakArrayReferences(int header_size,
|
void V8HeapExplorer::ExtractWeakArrayReferences(int header_size,
|
||||||
HeapEntry* entry, T* array) {
|
HeapEntry* entry, T array) {
|
||||||
for (int i = 0; i < array->length(); ++i) {
|
for (int i = 0; i < array->length(); ++i) {
|
||||||
MaybeObject object = array->Get(i);
|
MaybeObject object = array->Get(i);
|
||||||
HeapObject* heap_object;
|
HeapObject* heap_object;
|
||||||
|
@ -381,7 +381,7 @@ class V8HeapExplorer : public HeapEntriesAllocator {
|
|||||||
void ExtractDescriptorArrayReferences(HeapEntry* entry,
|
void ExtractDescriptorArrayReferences(HeapEntry* entry,
|
||||||
DescriptorArray* array);
|
DescriptorArray* array);
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void ExtractWeakArrayReferences(int header_size, HeapEntry* entry, T* array);
|
void ExtractWeakArrayReferences(int header_size, HeapEntry* entry, T array);
|
||||||
void ExtractPropertyReferences(JSObject* js_obj, HeapEntry* entry);
|
void ExtractPropertyReferences(JSObject* js_obj, HeapEntry* entry);
|
||||||
void ExtractAccessorPairProperty(HeapEntry* entry, Name key,
|
void ExtractAccessorPairProperty(HeapEntry* entry, Name key,
|
||||||
Object* callback_obj, int field_offset = -1);
|
Object* callback_obj, int field_offset = -1);
|
||||||
|
@ -206,7 +206,7 @@ class RootVisitor;
|
|||||||
V(PropertyCell*, empty_property_cell, EmptyPropertyCell) \
|
V(PropertyCell*, empty_property_cell, EmptyPropertyCell) \
|
||||||
V(NameDictionary, empty_property_dictionary, EmptyPropertyDictionary) \
|
V(NameDictionary, empty_property_dictionary, EmptyPropertyDictionary) \
|
||||||
V(InterceptorInfo*, noop_interceptor_info, NoOpInterceptorInfo) \
|
V(InterceptorInfo*, noop_interceptor_info, NoOpInterceptorInfo) \
|
||||||
V(WeakFixedArray*, empty_weak_fixed_array, EmptyWeakFixedArray) \
|
V(WeakFixedArray, empty_weak_fixed_array, EmptyWeakFixedArray) \
|
||||||
V(WeakArrayList*, empty_weak_array_list, EmptyWeakArrayList) \
|
V(WeakArrayList*, empty_weak_array_list, EmptyWeakArrayList) \
|
||||||
/* Special numbers */ \
|
/* Special numbers */ \
|
||||||
V(HeapNumber*, nan_value, NanValue) \
|
V(HeapNumber*, nan_value, NanValue) \
|
||||||
|
@ -19,18 +19,20 @@
|
|||||||
namespace v8 {
|
namespace v8 {
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
TransitionArray* TransitionsAccessor::transitions() {
|
TransitionArray TransitionsAccessor::transitions() {
|
||||||
DCHECK_EQ(kFullTransitionArray, encoding());
|
DCHECK_EQ(kFullTransitionArray, encoding());
|
||||||
return TransitionArray::cast(raw_transitions_->GetHeapObjectAssumeStrong());
|
return TransitionArray::cast(raw_transitions_->GetHeapObjectAssumeStrong());
|
||||||
}
|
}
|
||||||
|
|
||||||
CAST_ACCESSOR(TransitionArray)
|
OBJECT_CONSTRUCTORS_IMPL(TransitionArray, WeakFixedArray)
|
||||||
|
|
||||||
|
CAST_ACCESSOR2(TransitionArray)
|
||||||
|
|
||||||
bool TransitionArray::HasPrototypeTransitions() {
|
bool TransitionArray::HasPrototypeTransitions() {
|
||||||
return Get(kPrototypeTransitionsIndex) != MaybeObject::FromSmi(Smi::zero());
|
return Get(kPrototypeTransitionsIndex) != MaybeObject::FromSmi(Smi::zero());
|
||||||
}
|
}
|
||||||
|
|
||||||
WeakFixedArray* TransitionArray::GetPrototypeTransitions() {
|
WeakFixedArray TransitionArray::GetPrototypeTransitions() {
|
||||||
DCHECK(HasPrototypeTransitions()); // Callers must check first.
|
DCHECK(HasPrototypeTransitions()); // Callers must check first.
|
||||||
Object* prototype_transitions =
|
Object* prototype_transitions =
|
||||||
Get(kPrototypeTransitionsIndex)->GetHeapObjectAssumeStrong();
|
Get(kPrototypeTransitionsIndex)->GetHeapObjectAssumeStrong();
|
||||||
@ -42,14 +44,14 @@ HeapObjectSlot TransitionArray::GetKeySlot(int transition_number) {
|
|||||||
return HeapObjectSlot(RawFieldOfElementAt(ToKeyIndex(transition_number)));
|
return HeapObjectSlot(RawFieldOfElementAt(ToKeyIndex(transition_number)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransitionArray::SetPrototypeTransitions(WeakFixedArray* transitions) {
|
void TransitionArray::SetPrototypeTransitions(WeakFixedArray transitions) {
|
||||||
DCHECK(transitions->IsWeakFixedArray());
|
DCHECK(transitions->IsWeakFixedArray());
|
||||||
WeakFixedArray::Set(kPrototypeTransitionsIndex,
|
WeakFixedArray::Set(kPrototypeTransitionsIndex,
|
||||||
HeapObjectReference::Strong(transitions));
|
HeapObjectReference::Strong(transitions));
|
||||||
}
|
}
|
||||||
|
|
||||||
int TransitionArray::NumberOfPrototypeTransitions(
|
int TransitionArray::NumberOfPrototypeTransitions(
|
||||||
WeakFixedArray* proto_transitions) {
|
WeakFixedArray proto_transitions) {
|
||||||
if (proto_transitions->length() == 0) return 0;
|
if (proto_transitions->length() == 0) return 0;
|
||||||
MaybeObject raw =
|
MaybeObject raw =
|
||||||
proto_transitions->Get(kProtoTransitionNumberOfEntriesOffset);
|
proto_transitions->Get(kProtoTransitionNumberOfEntriesOffset);
|
||||||
|
@ -127,7 +127,7 @@ void TransitionsAccessor::Insert(Handle<Name> name, Handle<Map> target,
|
|||||||
|
|
||||||
{
|
{
|
||||||
DisallowHeapAllocation no_gc;
|
DisallowHeapAllocation no_gc;
|
||||||
TransitionArray* array = transitions();
|
TransitionArray array = transitions();
|
||||||
number_of_transitions = array->number_of_transitions();
|
number_of_transitions = array->number_of_transitions();
|
||||||
new_nof = number_of_transitions;
|
new_nof = number_of_transitions;
|
||||||
|
|
||||||
@ -170,7 +170,7 @@ void TransitionsAccessor::Insert(Handle<Name> name, Handle<Map> target,
|
|||||||
// result copy if needed, and recompute variables.
|
// result copy if needed, and recompute variables.
|
||||||
Reload();
|
Reload();
|
||||||
DisallowHeapAllocation no_gc;
|
DisallowHeapAllocation no_gc;
|
||||||
TransitionArray* array = transitions();
|
TransitionArray array = transitions();
|
||||||
if (array->number_of_transitions() != number_of_transitions) {
|
if (array->number_of_transitions() != number_of_transitions) {
|
||||||
DCHECK(array->number_of_transitions() < number_of_transitions);
|
DCHECK(array->number_of_transitions() < number_of_transitions);
|
||||||
|
|
||||||
@ -313,7 +313,7 @@ bool TransitionsAccessor::IsMatchingMap(Map target, Name name,
|
|||||||
|
|
||||||
// static
|
// static
|
||||||
bool TransitionArray::CompactPrototypeTransitionArray(Isolate* isolate,
|
bool TransitionArray::CompactPrototypeTransitionArray(Isolate* isolate,
|
||||||
WeakFixedArray* array) {
|
WeakFixedArray array) {
|
||||||
const int header = kProtoTransitionHeaderSize;
|
const int header = kProtoTransitionHeaderSize;
|
||||||
int number_of_transitions = NumberOfPrototypeTransitions(array);
|
int number_of_transitions = NumberOfPrototypeTransitions(array);
|
||||||
if (number_of_transitions == 0) {
|
if (number_of_transitions == 0) {
|
||||||
@ -344,7 +344,6 @@ bool TransitionArray::CompactPrototypeTransitionArray(Isolate* isolate,
|
|||||||
return new_number_of_transitions < number_of_transitions;
|
return new_number_of_transitions < number_of_transitions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// static
|
// static
|
||||||
Handle<WeakFixedArray> TransitionArray::GrowPrototypeTransitionArray(
|
Handle<WeakFixedArray> TransitionArray::GrowPrototypeTransitionArray(
|
||||||
Handle<WeakFixedArray> array, int new_capacity, Isolate* isolate) {
|
Handle<WeakFixedArray> array, int new_capacity, Isolate* isolate) {
|
||||||
@ -399,7 +398,7 @@ void TransitionsAccessor::PutPrototypeTransition(Handle<Object> prototype,
|
|||||||
Handle<Map> TransitionsAccessor::GetPrototypeTransition(
|
Handle<Map> TransitionsAccessor::GetPrototypeTransition(
|
||||||
Handle<Object> prototype) {
|
Handle<Object> prototype) {
|
||||||
DisallowHeapAllocation no_gc;
|
DisallowHeapAllocation no_gc;
|
||||||
WeakFixedArray* cache = GetPrototypeTransitions();
|
WeakFixedArray cache = GetPrototypeTransitions();
|
||||||
int length = TransitionArray::NumberOfPrototypeTransitions(cache);
|
int length = TransitionArray::NumberOfPrototypeTransitions(cache);
|
||||||
for (int i = 0; i < length; i++) {
|
for (int i = 0; i < length; i++) {
|
||||||
MaybeObject target =
|
MaybeObject target =
|
||||||
@ -416,7 +415,7 @@ Handle<Map> TransitionsAccessor::GetPrototypeTransition(
|
|||||||
return Handle<Map>();
|
return Handle<Map>();
|
||||||
}
|
}
|
||||||
|
|
||||||
WeakFixedArray* TransitionsAccessor::GetPrototypeTransitions() {
|
WeakFixedArray TransitionsAccessor::GetPrototypeTransitions() {
|
||||||
if (encoding() != kFullTransitionArray ||
|
if (encoding() != kFullTransitionArray ||
|
||||||
!transitions()->HasPrototypeTransitions()) {
|
!transitions()->HasPrototypeTransitions()) {
|
||||||
return ReadOnlyRoots(isolate_).empty_weak_fixed_array();
|
return ReadOnlyRoots(isolate_).empty_weak_fixed_array();
|
||||||
@ -426,7 +425,7 @@ WeakFixedArray* TransitionsAccessor::GetPrototypeTransitions() {
|
|||||||
|
|
||||||
// static
|
// static
|
||||||
void TransitionArray::SetNumberOfPrototypeTransitions(
|
void TransitionArray::SetNumberOfPrototypeTransitions(
|
||||||
WeakFixedArray* proto_transitions, int value) {
|
WeakFixedArray proto_transitions, int value) {
|
||||||
DCHECK_NE(proto_transitions->length(), 0);
|
DCHECK_NE(proto_transitions->length(), 0);
|
||||||
proto_transitions->Set(kProtoTransitionNumberOfEntriesOffset,
|
proto_transitions->Set(kProtoTransitionNumberOfEntriesOffset,
|
||||||
MaybeObject::FromSmi(Smi::FromInt(value)));
|
MaybeObject::FromSmi(Smi::FromInt(value)));
|
||||||
@ -472,7 +471,7 @@ void TransitionArray::Zap(Isolate* isolate) {
|
|||||||
|
|
||||||
void TransitionsAccessor::ReplaceTransitions(MaybeObject new_transitions) {
|
void TransitionsAccessor::ReplaceTransitions(MaybeObject new_transitions) {
|
||||||
if (encoding() == kFullTransitionArray) {
|
if (encoding() == kFullTransitionArray) {
|
||||||
TransitionArray* old_transitions = transitions();
|
TransitionArray old_transitions = transitions();
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
CheckNewTransitionsAreConsistent(
|
CheckNewTransitionsAreConsistent(
|
||||||
old_transitions, new_transitions->GetHeapObjectAssumeStrong());
|
old_transitions, new_transitions->GetHeapObjectAssumeStrong());
|
||||||
@ -531,7 +530,7 @@ void TransitionsAccessor::TraverseTransitionTreeInternal(
|
|||||||
}
|
}
|
||||||
case kFullTransitionArray: {
|
case kFullTransitionArray: {
|
||||||
if (transitions()->HasPrototypeTransitions()) {
|
if (transitions()->HasPrototypeTransitions()) {
|
||||||
WeakFixedArray* proto_trans = transitions()->GetPrototypeTransitions();
|
WeakFixedArray proto_trans = transitions()->GetPrototypeTransitions();
|
||||||
int length = TransitionArray::NumberOfPrototypeTransitions(proto_trans);
|
int length = TransitionArray::NumberOfPrototypeTransitions(proto_trans);
|
||||||
for (int i = 0; i < length; ++i) {
|
for (int i = 0; i < length; ++i) {
|
||||||
int index = TransitionArray::kProtoTransitionHeaderSize + i;
|
int index = TransitionArray::kProtoTransitionHeaderSize + i;
|
||||||
@ -557,10 +556,10 @@ void TransitionsAccessor::TraverseTransitionTreeInternal(
|
|||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
void TransitionsAccessor::CheckNewTransitionsAreConsistent(
|
void TransitionsAccessor::CheckNewTransitionsAreConsistent(
|
||||||
TransitionArray* old_transitions, Object* transitions) {
|
TransitionArray old_transitions, Object* transitions) {
|
||||||
// This function only handles full transition arrays.
|
// This function only handles full transition arrays.
|
||||||
DCHECK_EQ(kFullTransitionArray, encoding());
|
DCHECK_EQ(kFullTransitionArray, encoding());
|
||||||
TransitionArray* new_transitions = TransitionArray::cast(transitions);
|
TransitionArray new_transitions = TransitionArray::cast(transitions);
|
||||||
for (int i = 0; i < old_transitions->number_of_transitions(); i++) {
|
for (int i = 0; i < old_transitions->number_of_transitions(); i++) {
|
||||||
Map target = old_transitions->GetTarget(i);
|
Map target = old_transitions->GetTarget(i);
|
||||||
if (target->instance_descriptors() == map_->instance_descriptors()) {
|
if (target->instance_descriptors() == map_->instance_descriptors()) {
|
||||||
|
@ -123,7 +123,7 @@ class TransitionsAccessor {
|
|||||||
DisallowHeapAllocation* no_gc);
|
DisallowHeapAllocation* no_gc);
|
||||||
#endif
|
#endif
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
void CheckNewTransitionsAreConsistent(TransitionArray* old_transitions,
|
void CheckNewTransitionsAreConsistent(TransitionArray old_transitions,
|
||||||
Object* transitions);
|
Object* transitions);
|
||||||
bool IsConsistentWithBackPointers();
|
bool IsConsistentWithBackPointers();
|
||||||
bool IsSortedNoDuplicates();
|
bool IsSortedNoDuplicates();
|
||||||
@ -177,12 +177,12 @@ class TransitionsAccessor {
|
|||||||
|
|
||||||
void EnsureHasFullTransitionArray();
|
void EnsureHasFullTransitionArray();
|
||||||
void SetPrototypeTransitions(Handle<WeakFixedArray> proto_transitions);
|
void SetPrototypeTransitions(Handle<WeakFixedArray> proto_transitions);
|
||||||
WeakFixedArray* GetPrototypeTransitions();
|
WeakFixedArray GetPrototypeTransitions();
|
||||||
|
|
||||||
void TraverseTransitionTreeInternal(TraverseCallback callback, void* data,
|
void TraverseTransitionTreeInternal(TraverseCallback callback, void* data,
|
||||||
DisallowHeapAllocation* no_gc);
|
DisallowHeapAllocation* no_gc);
|
||||||
|
|
||||||
inline TransitionArray* transitions();
|
inline TransitionArray transitions();
|
||||||
|
|
||||||
Isolate* isolate_;
|
Isolate* isolate_;
|
||||||
Handle<Map> map_handle_;
|
Handle<Map> map_handle_;
|
||||||
@ -210,9 +210,9 @@ class TransitionsAccessor {
|
|||||||
// [3 + number of transitions * kTransitionSize]: start of slack
|
// [3 + number of transitions * kTransitionSize]: start of slack
|
||||||
class TransitionArray : public WeakFixedArray {
|
class TransitionArray : public WeakFixedArray {
|
||||||
public:
|
public:
|
||||||
DECL_CAST(TransitionArray)
|
DECL_CAST2(TransitionArray)
|
||||||
|
|
||||||
inline WeakFixedArray* GetPrototypeTransitions();
|
inline WeakFixedArray GetPrototypeTransitions();
|
||||||
inline bool HasPrototypeTransitions();
|
inline bool HasPrototypeTransitions();
|
||||||
|
|
||||||
// Accessors for fetching instance transition at transition number.
|
// Accessors for fetching instance transition at transition number.
|
||||||
@ -282,11 +282,11 @@ class TransitionArray : public WeakFixedArray {
|
|||||||
static const int kProtoTransitionHeaderSize = 1;
|
static const int kProtoTransitionHeaderSize = 1;
|
||||||
static const int kMaxCachedPrototypeTransitions = 256;
|
static const int kMaxCachedPrototypeTransitions = 256;
|
||||||
|
|
||||||
inline void SetPrototypeTransitions(WeakFixedArray* prototype_transitions);
|
inline void SetPrototypeTransitions(WeakFixedArray prototype_transitions);
|
||||||
|
|
||||||
static inline int NumberOfPrototypeTransitions(
|
static inline int NumberOfPrototypeTransitions(
|
||||||
WeakFixedArray* proto_transitions);
|
WeakFixedArray proto_transitions);
|
||||||
static void SetNumberOfPrototypeTransitions(WeakFixedArray* proto_transitions,
|
static void SetNumberOfPrototypeTransitions(WeakFixedArray proto_transitions,
|
||||||
int value);
|
int value);
|
||||||
|
|
||||||
static const int kProtoTransitionNumberOfEntriesOffset = 0;
|
static const int kProtoTransitionNumberOfEntriesOffset = 0;
|
||||||
@ -313,7 +313,7 @@ class TransitionArray : public WeakFixedArray {
|
|||||||
inline int number_of_transitions() const;
|
inline int number_of_transitions() const;
|
||||||
|
|
||||||
static bool CompactPrototypeTransitionArray(Isolate* isolate,
|
static bool CompactPrototypeTransitionArray(Isolate* isolate,
|
||||||
WeakFixedArray* array);
|
WeakFixedArray array);
|
||||||
|
|
||||||
static Handle<WeakFixedArray> GrowPrototypeTransitionArray(
|
static Handle<WeakFixedArray> GrowPrototypeTransitionArray(
|
||||||
Handle<WeakFixedArray> array, int new_capacity, Isolate* isolate);
|
Handle<WeakFixedArray> array, int new_capacity, Isolate* isolate);
|
||||||
@ -341,7 +341,7 @@ class TransitionArray : public WeakFixedArray {
|
|||||||
|
|
||||||
void Zap(Isolate* isolate);
|
void Zap(Isolate* isolate);
|
||||||
|
|
||||||
DISALLOW_IMPLICIT_CONSTRUCTORS(TransitionArray);
|
OBJECT_CONSTRUCTORS(TransitionArray, WeakFixedArray);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace internal
|
} // namespace internal
|
||||||
|
@ -3641,7 +3641,7 @@ TEST(EnsureAllocationSiteDependentCodesProcessed) {
|
|||||||
.ToLocalChecked())));
|
.ToLocalChecked())));
|
||||||
|
|
||||||
int dependency_group_count = 0;
|
int dependency_group_count = 0;
|
||||||
DependentCode* dependency = site->dependent_code();
|
DependentCode dependency = site->dependent_code();
|
||||||
while (dependency != ReadOnlyRoots(heap).empty_weak_fixed_array()) {
|
while (dependency != ReadOnlyRoots(heap).empty_weak_fixed_array()) {
|
||||||
CHECK(dependency->group() ==
|
CHECK(dependency->group() ==
|
||||||
DependentCode::kAllocationSiteTransitionChangedGroup ||
|
DependentCode::kAllocationSiteTransitionChangedGroup ||
|
||||||
|
@ -22194,7 +22194,7 @@ THREADED_TEST(ReadOnlyIndexedProperties) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int CountLiveMapsInMapCache(i::Context context) {
|
static int CountLiveMapsInMapCache(i::Context context) {
|
||||||
i::WeakFixedArray* map_cache = i::WeakFixedArray::cast(context->map_cache());
|
i::WeakFixedArray map_cache = i::WeakFixedArray::cast(context->map_cache());
|
||||||
int length = map_cache->length();
|
int length = map_cache->length();
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (int i = 0; i < length; i++) {
|
for (int i = 0; i < length; i++) {
|
||||||
|
@ -3616,7 +3616,7 @@ TEST(SerializationStats) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckSFIsAreWeak(WeakFixedArray* sfis, Isolate* isolate) {
|
void CheckSFIsAreWeak(WeakFixedArray sfis, Isolate* isolate) {
|
||||||
CHECK_GT(sfis->length(), 0);
|
CHECK_GT(sfis->length(), 0);
|
||||||
int no_of_weak = 0;
|
int no_of_weak = 0;
|
||||||
for (int i = 0; i < sfis->length(); ++i) {
|
for (int i = 0; i < sfis->length(); ++i) {
|
||||||
@ -3675,7 +3675,7 @@ TEST(WeakArraySerializizationInSnapshot) {
|
|||||||
Handle<JSFunction>::cast(v8::Utils::OpenHandle(*x));
|
Handle<JSFunction>::cast(v8::Utils::OpenHandle(*x));
|
||||||
|
|
||||||
// Verify that the pointers in shared_function_infos are weak.
|
// Verify that the pointers in shared_function_infos are weak.
|
||||||
WeakFixedArray* sfis =
|
WeakFixedArray sfis =
|
||||||
Script::cast(function->shared()->script())->shared_function_infos();
|
Script::cast(function->shared()->script())->shared_function_infos();
|
||||||
CheckSFIsAreWeak(sfis, CcTest::i_isolate());
|
CheckSFIsAreWeak(sfis, CcTest::i_isolate());
|
||||||
}
|
}
|
||||||
@ -3705,7 +3705,7 @@ TEST(WeakArraySerializationInCodeCache) {
|
|||||||
isolate, src, src, cache, v8::ScriptCompiler::kConsumeCodeCache);
|
isolate, src, src, cache, v8::ScriptCompiler::kConsumeCodeCache);
|
||||||
|
|
||||||
// Verify that the pointers in shared_function_infos are weak.
|
// Verify that the pointers in shared_function_infos are weak.
|
||||||
WeakFixedArray* sfis = Script::cast(copy->script())->shared_function_infos();
|
WeakFixedArray sfis = Script::cast(copy->script())->shared_function_infos();
|
||||||
CheckSFIsAreWeak(sfis, isolate);
|
CheckSFIsAreWeak(sfis, isolate);
|
||||||
|
|
||||||
delete cache;
|
delete cache;
|
||||||
|
Loading…
Reference in New Issue
Block a user