diff options
Diffstat (limited to 'src/v8/0004-Generalize-external-object-resources.patch')
-rw-r--r-- | src/v8/0004-Generalize-external-object-resources.patch | 272 |
1 files changed, 136 insertions, 136 deletions
diff --git a/src/v8/0004-Generalize-external-object-resources.patch b/src/v8/0004-Generalize-external-object-resources.patch index a05aad0889..004380168d 100644 --- a/src/v8/0004-Generalize-external-object-resources.patch +++ b/src/v8/0004-Generalize-external-object-resources.patch @@ -1,7 +1,7 @@ -From 4827116b12c50f6662794017c5a662b5dbb2da0b Mon Sep 17 00:00:00 2001 +From f9368b52060c31e9532ef26f6cca1a2cb0283f51 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy <aaron.kennedy@nokia.com> Date: Mon, 23 May 2011 16:55:35 +1000 -Subject: [PATCH 04/16] Generalize external object resources +Subject: [PATCH 04/15] Generalize external object resources V8 was already able to manage and finalize an external string resource. This change generalizes that mechanism to handle a @@ -31,13 +31,13 @@ object space. 11 files changed, 280 insertions(+), 115 deletions(-) diff --git a/include/v8.h b/include/v8.h -index 85452aa..7f06ae7 100644 +index bb31ea0..205e856 100644 --- a/include/v8.h +++ b/include/v8.h -@@ -1630,6 +1630,25 @@ class Object : public Value { +@@ -1631,6 +1631,25 @@ class Object : public Value { /** Sets a native pointer in an internal field. */ V8EXPORT void SetPointerInInternalField(int index, void* value); - + + class V8EXPORT ExternalResource { // NOLINT + public: + ExternalResource() {} @@ -60,10 +60,10 @@ index 85452aa..7f06ae7 100644 // Testers for local properties. V8EXPORT bool HasRealNamedProperty(Handle<String> key); V8EXPORT bool HasRealIndexedProperty(uint32_t index); -@@ -2331,6 +2350,12 @@ class V8EXPORT ObjectTemplate : public Template { +@@ -2332,6 +2351,12 @@ class V8EXPORT ObjectTemplate : public Template { */ void SetInternalFieldCount(int value); - + + /** + * Sets whether the object can store an "external resource" object. + */ @@ -79,8 +79,8 @@ index 8b0b32a..1a6fbbb 100644 +++ b/src/api.cc @@ -1294,6 +1294,34 @@ void ObjectTemplate::SetInternalFieldCount(int value) { } - - + + +bool ObjectTemplate::HasExternalResource() +{ + if (IsDeadCheck(Utils::OpenHandle(this)->GetIsolate(), @@ -110,12 +110,12 @@ index 8b0b32a..1a6fbbb 100644 + + // --- S c r i p t D a t a --- - - + + @@ -3652,6 +3680,34 @@ void v8::Object::SetPointerInInternalField(int index, void* value) { } - - + + +void v8::Object::SetExternalResource(v8::Object::ExternalResource *resource) { + i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate(); + ENTER_V8(isolate); @@ -145,8 +145,8 @@ index 8b0b32a..1a6fbbb 100644 + + // --- E n v i r o n m e n t --- - - + + @@ -4144,7 +4200,7 @@ Local<String> v8::String::NewExternal( LOG_API(isolate, "String::NewExternal"); ENTER_V8(isolate); @@ -155,7 +155,7 @@ index 8b0b32a..1a6fbbb 100644 + isolate->heap()->external_resource_table()->AddString(*result); return Utils::ToLocal(result); } - + @@ -4162,7 +4218,7 @@ bool v8::String::MakeExternal(v8::String::ExternalStringResource* resource) { } bool result = obj->MakeExternal(resource); @@ -173,7 +173,7 @@ index 8b0b32a..1a6fbbb 100644 + isolate->heap()->external_resource_table()->AddString(*result); return Utils::ToLocal(result); } - + @@ -4194,7 +4250,7 @@ bool v8::String::MakeExternal( } bool result = obj->MakeExternal(resource); @@ -211,7 +211,7 @@ index dcdc645..d530a75 100644 +++ b/src/factory.cc @@ -997,15 +997,21 @@ Handle<JSFunction> Factory::CreateApiFunction( Handle<Code> construct_stub = isolate()->builtins()->JSConstructStubApi(); - + int internal_field_count = 0; + bool has_external_resource = false; + @@ -224,7 +224,7 @@ index dcdc645..d530a75 100644 + has_external_resource = + !instance_template->has_external_resource()->IsUndefined(); } - + int instance_size = kPointerSize * internal_field_count; + if (has_external_resource) instance_size += kPointerSize; + @@ -232,9 +232,9 @@ index dcdc645..d530a75 100644 switch (instance_type) { case JavaScriptObject: @@ -1040,6 +1046,11 @@ Handle<JSFunction> Factory::CreateApiFunction( - + Handle<Map> map = Handle<Map>(result->initial_map()); - + + // Mark as having external data object if needed + if (has_external_resource) { + map->set_has_external_resource(true); @@ -249,8 +249,8 @@ index f4fce7b..58e7adf 100644 +++ b/src/heap-inl.h @@ -205,21 +205,36 @@ MaybeObject* Heap::NumberFromUint32(uint32_t value) { } - - + + -void Heap::FinalizeExternalString(String* string) { - ASSERT(string->IsExternalString()); - v8::String::ExternalStringResourceBase** resource_addr = @@ -277,7 +277,7 @@ index f4fce7b..58e7adf 100644 + if (*resource_addr != NULL) { + (*resource_addr)->Dispose(); + } - + - // Clear the resource pointer in the string. - *resource_addr = NULL; + // Clear the resource pointer in the string. @@ -290,18 +290,18 @@ index f4fce7b..58e7adf 100644 + resource = reinterpret_cast<v8::Object::ExternalResource*>(Internals::GetExternalPointerFromSmi(value)); + } else if (value->IsProxy()) { + resource = reinterpret_cast<v8::Object::ExternalResource*>(Proxy::cast(value)->proxy()); -+ } ++ } + if (resource) { + resource->Dispose(); + } + } } - - + + @@ -556,53 +571,63 @@ inline bool Heap::allow_allocation(bool new_state) { #endif - - + + -void ExternalStringTable::AddString(String* string) { - ASSERT(string->IsExternalString()); +void ExternalResourceTable::AddString(String* string) { @@ -324,8 +324,8 @@ index f4fce7b..58e7adf 100644 + old_space_objects_.Add(object); } } - - + + -void ExternalStringTable::Iterate(ObjectVisitor* v) { - if (!new_space_strings_.is_empty()) { - Object** start = &new_space_strings_[0]; @@ -343,8 +343,8 @@ index f4fce7b..58e7adf 100644 + v->VisitPointers(start, start + old_space_objects_.length()); } } - - + + // Verify() is inline to avoid ifdef-s around its calls in release // mode. -void ExternalStringTable::Verify() { @@ -366,8 +366,8 @@ index f4fce7b..58e7adf 100644 } #endif } - - + + -void ExternalStringTable::AddOldString(String* string) { - ASSERT(string->IsExternalString()); - ASSERT(!heap_->InNewSpace(string)); @@ -377,15 +377,15 @@ index f4fce7b..58e7adf 100644 + ASSERT(!heap_->InNewSpace(object)); + old_space_objects_.Add(object); } - - + + -void ExternalStringTable::ShrinkNewStrings(int position) { - new_space_strings_.Rewind(position); +void ExternalResourceTable::ShrinkNewObjects(int position) { + new_space_objects_.Rewind(position); Verify(); } - + diff --git a/src/heap.cc b/src/heap.cc index 900f462..bf2940e 100644 --- a/src/heap.cc @@ -397,68 +397,68 @@ index 900f462..bf2940e 100644 - external_string_table_.heap_ = this; + external_resource_table_.heap_ = this; } - - + + @@ -1030,8 +1030,8 @@ void Heap::Scavenge() { - + new_space_front = DoScavenge(&scavenge_visitor, new_space_front); - + - UpdateNewSpaceReferencesInExternalStringTable( - &UpdateNewSpaceReferenceInExternalStringTableEntry); + UpdateNewSpaceReferencesInExternalResourceTable( + &UpdateNewSpaceReferenceInExternalResourceTableEntry); - + LiveObjectList::UpdateReferencesForScavengeGC(); isolate()->runtime_profiler()->UpdateSamplesAfterScavenge(); @@ -1053,38 +1053,38 @@ void Heap::Scavenge() { } - - + + -String* Heap::UpdateNewSpaceReferenceInExternalStringTableEntry(Heap* heap, - Object** p) { +HeapObject* Heap::UpdateNewSpaceReferenceInExternalResourceTableEntry(Heap* heap, + Object** p) { MapWord first_word = HeapObject::cast(*p)->map_word(); - + if (!first_word.IsForwardingAddress()) { // Unreachable external string can be finalized. - heap->FinalizeExternalString(String::cast(*p)); + heap->FinalizeExternalString(HeapObject::cast(*p)); return NULL; } - + // String is still reachable. - return String::cast(first_word.ToForwardingAddress()); + return HeapObject::cast(first_word.ToForwardingAddress()); } - - + + -void Heap::UpdateNewSpaceReferencesInExternalStringTable( - ExternalStringTableUpdaterCallback updater_func) { - external_string_table_.Verify(); +void Heap::UpdateNewSpaceReferencesInExternalResourceTable( + ExternalResourceTableUpdaterCallback updater_func) { + external_resource_table_.Verify(); - + - if (external_string_table_.new_space_strings_.is_empty()) return; + if (external_resource_table_.new_space_objects_.is_empty()) return; - + - Object** start = &external_string_table_.new_space_strings_[0]; - Object** end = start + external_string_table_.new_space_strings_.length(); + Object** start = &external_resource_table_.new_space_objects_[0]; + Object** end = start + external_resource_table_.new_space_objects_.length(); Object** last = start; - + for (Object** p = start; p < end; ++p) { ASSERT(InFromSpace(*p)); - String* target = updater_func(this, p); + HeapObject* target = updater_func(this, p); - + if (target == NULL) continue; - + - ASSERT(target->IsExternalString()); + ASSERT(target->IsExternalString() || target->map()->has_external_resource()); - + if (InNewSpace(target)) { // String is still in new space. Update the table entry. @@ -1092,12 +1092,12 @@ void Heap::UpdateNewSpaceReferencesInExternalStringTable( @@ -469,13 +469,13 @@ index 900f462..bf2940e 100644 + external_resource_table_.AddOldObject(target); } } - + ASSERT(last <= end); - external_string_table_.ShrinkNewStrings(static_cast<int>(last - start)); + external_resource_table_.ShrinkNewObjects(static_cast<int>(last - start)); } - - + + @@ -4468,7 +4468,7 @@ void Heap::IterateWeakRoots(ObjectVisitor* v, VisitMode mode) { v->Synchronize("symbol_table"); if (mode != VISIT_ALL_IN_SCAVENGE) { @@ -486,18 +486,18 @@ index 900f462..bf2940e 100644 v->Synchronize("external_string_table"); } @@ -4970,7 +4970,7 @@ void Heap::TearDown() { - + isolate_->global_handles()->TearDown(); - + - external_string_table_.TearDown(); + external_resource_table_.TearDown(); - + new_space_.TearDown(); - + @@ -5835,31 +5835,31 @@ void TranscendentalCache::Clear() { } - - + + -void ExternalStringTable::CleanUp() { +void ExternalResourceTable::CleanUp() { int last = 0; @@ -530,8 +530,8 @@ index 900f462..bf2940e 100644 + old_space_objects_.Rewind(last); Verify(); } - - + + -void ExternalStringTable::TearDown() { - new_space_strings_.Free(); - old_space_strings_.Free(); @@ -539,33 +539,33 @@ index 900f462..bf2940e 100644 + new_space_objects_.Free(); + old_space_objects_.Free(); } - - + + diff --git a/src/heap.h b/src/heap.h index ae4e9e7..8cbf378 100644 --- a/src/heap.h +++ b/src/heap.h @@ -237,8 +237,8 @@ class Isolate; class WeakObjectRetainer; - - + + -typedef String* (*ExternalStringTableUpdaterCallback)(Heap* heap, - Object** pointer); +typedef HeapObject* (*ExternalResourceTableUpdaterCallback)(Heap* heap, + Object** pointer); - + typedef bool (*DirtyRegionCallback)(Heap* heap, Address start, @@ -284,43 +284,45 @@ class PromotionQueue { }; - - + + -// External strings table is a place where all external strings are -// registered. We need to keep track of such strings to properly -// finalize them. -class ExternalStringTable { +// External resource table is a place where all external strings and -+// objects with an external resource are registered. We need to keep ++// objects with an external resource are registered. We need to keep +// track of such strings to properly finalize them. +class ExternalResourceTable { public: @@ -573,95 +573,95 @@ index ae4e9e7..8cbf378 100644 inline void AddString(String* string); + // Registers an external object. + inline void AddObject(HeapObject* object); - + inline void Iterate(ObjectVisitor* v); - + // Restores internal invariant and gets rid of collected strings. - // Must be called after each Iterate() that modified the strings. + // Must be called after each Iterate() that modified the objects. void CleanUp(); - + // Destroys all allocated memory. void TearDown(); - + private: - ExternalStringTable() { } + ExternalResourceTable() { } - + friend class Heap; - + inline void Verify(); - + - inline void AddOldString(String* string); + inline void AddOldObject(HeapObject* object); - + // Notifies the table that only a prefix of the new list is valid. - inline void ShrinkNewStrings(int position); + inline void ShrinkNewObjects(int position); - + // To speed up scavenge collections new space string are kept // separate from old space strings. - List<Object*> new_space_strings_; - List<Object*> old_space_strings_; + List<Object*> new_space_objects_; + List<Object*> old_space_objects_; - + Heap* heap_; - + - DISALLOW_COPY_AND_ASSIGN(ExternalStringTable); + DISALLOW_COPY_AND_ASSIGN(ExternalResourceTable); }; - - + + @@ -753,7 +755,7 @@ class Heap { - + // Finalizes an external string by deleting the associated external // data and clearing the resource pointer. - inline void FinalizeExternalString(String* string); + inline void FinalizeExternalString(HeapObject* string); - + // Allocates an uninitialized object. The memory is non-executable if the // hardware and OS allow. @@ -1191,8 +1193,8 @@ class Heap { survived_since_last_expansion_ += survived; } - + - void UpdateNewSpaceReferencesInExternalStringTable( - ExternalStringTableUpdaterCallback updater_func); + void UpdateNewSpaceReferencesInExternalResourceTable( + ExternalResourceTableUpdaterCallback updater_func); - + void ProcessWeakReferences(WeakObjectRetainer* retainer); - + @@ -1228,8 +1230,8 @@ class Heap { return &mark_compact_collector_; } - + - ExternalStringTable* external_string_table() { - return &external_string_table_; + ExternalResourceTable* external_resource_table() { + return &external_resource_table_; } - + inline Isolate* isolate(); @@ -1462,7 +1464,7 @@ class Heap { // Performs a minor collection in new generation. void Scavenge(); - + - static String* UpdateNewSpaceReferenceInExternalStringTableEntry( + static HeapObject* UpdateNewSpaceReferenceInExternalResourceTableEntry( Heap* heap, Object** pointer); - + @@ -1593,7 +1595,7 @@ class Heap { // configured through the API until it is setup. bool configured_; - + - ExternalStringTable external_string_table_; + ExternalResourceTable external_resource_table_; - + bool is_safe_to_read_maps_; - + diff --git a/src/liveobjectlist.cc b/src/liveobjectlist.cc index 5795a6b..8866e58 100644 --- a/src/liveobjectlist.cc @@ -685,26 +685,26 @@ index 5795a6b..8866e58 100644 } else { delete resource; diff --git a/src/mark-compact.cc b/src/mark-compact.cc -index 68a5062..1b1e361 100644 +index 68a5062..775f787 100644 --- a/src/mark-compact.cc +++ b/src/mark-compact.cc @@ -163,7 +163,7 @@ void MarkCompactCollector::Finish() { // objects (empty string, illegal builtin). heap()->isolate()->stub_cache()->Clear(); - + - heap()->external_string_table_.CleanUp(); + heap()->external_resource_table_.CleanUp(); - + // If we've just compacted old space there's no reason to check the // fragmentation limit. Just return. @@ -1019,8 +1019,9 @@ class SymbolTableCleaner : public ObjectVisitor { - + // Since no objects have yet been moved we can safely access the map of // the object. - if ((*p)->IsExternalString()) { - heap_->FinalizeExternalString(String::cast(*p)); + if ((*p)->IsExternalString() || -+ (*p)->IsHeapObject() && HeapObject::cast(*p)->map()->has_external_resource()) { ++ ((*p)->IsHeapObject() && HeapObject::cast(*p)->map()->has_external_resource())) { + heap_->FinalizeExternalString(HeapObject::cast(*p)); } // Set the entry to null_value (as deleted). @@ -717,13 +717,13 @@ index 68a5062..1b1e361 100644 - heap()->external_string_table_.CleanUp(); + heap()->external_resource_table_.Iterate(&v); + heap()->external_resource_table_.CleanUp(); - + // Process the weak references. MarkCompactWeakObjectRetainer mark_compact_object_retainer; @@ -1948,11 +1949,11 @@ static void UpdatePointerToNewGen(HeapObject** p) { } - - + + -static String* UpdateNewSpaceReferenceInExternalStringTableEntry(Heap* heap, - Object** p) { +static HeapObject* UpdateNewSpaceReferenceInExternalResourceTableEntry(Heap* heap, @@ -733,17 +733,17 @@ index 68a5062..1b1e361 100644 - return String::cast(HeapObject::FromAddress(new_addr)); + return HeapObject::FromAddress(new_addr); } - - + + @@ -2083,8 +2084,8 @@ static void SweepNewSpace(Heap* heap, NewSpace* space) { updating_visitor.VisitPointer(heap->global_contexts_list_address()); - + // Update pointers from external string table. - heap->UpdateNewSpaceReferencesInExternalStringTable( - &UpdateNewSpaceReferenceInExternalStringTableEntry); + heap->UpdateNewSpaceReferencesInExternalResourceTable( + &UpdateNewSpaceReferenceInExternalResourceTableEntry); - + // All pointers were updated. Update auxiliary allocation info. heap->IncrementYoungSurvivorsCounter(survivors_size); diff --git a/src/objects-inl.h b/src/objects-inl.h @@ -757,15 +757,15 @@ index 6aaca2f..231b835 100644 - map()->inobject_properties(); + map()->inobject_properties() - map()->has_external_resource()?1:0; } - - + + int JSObject::GetInternalFieldOffset(int index) { ASSERT(index < GetInternalFieldCount() && index >= 0); - return GetHeaderSize() + (kPointerSize * index); + return GetHeaderSize() + (kPointerSize * (index + map()->has_external_resource()?1:0)); } - - + + @@ -1407,7 +1407,7 @@ Object* JSObject::GetInternalField(int index) { // Internal objects do follow immediately after the header, whereas in-object // properties are at the end of the object. Therefore there is no need @@ -773,8 +773,8 @@ index 6aaca2f..231b835 100644 - return READ_FIELD(this, GetHeaderSize() + (kPointerSize * index)); + return READ_FIELD(this, GetHeaderSize() + (kPointerSize * (index + map()->has_external_resource()?1:0))); } - - + + @@ -1416,12 +1416,29 @@ void JSObject::SetInternalField(int index, Object* value) { // Internal objects do follow immediately after the header, whereas in-object // properties are at the end of the object. Therefore there is no need @@ -784,8 +784,8 @@ index 6aaca2f..231b835 100644 WRITE_FIELD(this, offset, value); WRITE_BARRIER(this, offset); } - - + + +void JSObject::SetExternalResourceObject(Object *value) { + ASSERT(map()->has_external_resource()); + int offset = GetHeaderSize(); @@ -794,7 +794,7 @@ index 6aaca2f..231b835 100644 +} + + -+Object *JSObject::GetExternalResourceObject() { ++Object *JSObject::GetExternalResourceObject() { + if (map()->has_external_resource()) { + return READ_FIELD(this, GetHeaderSize()); + } else { @@ -808,8 +808,8 @@ index 6aaca2f..231b835 100644 // properties stored in the properties array. @@ -2521,6 +2538,20 @@ bool Map::is_shared() { } - - + + +void Map::set_has_external_resource(bool value) { + if (value) { + set_bit_field3(bit_field3() | (1 << kHasExternalResource)); @@ -822,7 +822,7 @@ index 6aaca2f..231b835 100644 +{ + return ((1 << kHasExternalResource) & bit_field3()) != 0; +} -+ ++ + void Map::set_named_interceptor_is_fallback(bool value) { @@ -831,9 +831,9 @@ index 6aaca2f..231b835 100644 ACCESSORS(ObjectTemplateInfo, constructor, Object, kConstructorOffset) ACCESSORS(ObjectTemplateInfo, internal_field_count, Object, kInternalFieldCountOffset) -+ACCESSORS(ObjectTemplateInfo, has_external_resource, Object, ++ACCESSORS(ObjectTemplateInfo, has_external_resource, Object, + kHasExternalResourceOffset) - + ACCESSORS(SignatureInfo, receiver, Object, kReceiverOffset) ACCESSORS(SignatureInfo, args, Object, kArgsOffset) diff --git a/src/objects.h b/src/objects.h @@ -843,7 +843,7 @@ index a209cd0..1bdb5c7 100644 @@ -1636,6 +1636,9 @@ class JSObject: public HeapObject { inline Object* GetInternalField(int index); inline void SetInternalField(int index, Object* value); - + + inline void SetExternalResourceObject(Object *); + inline Object *GetExternalResourceObject(); + @@ -853,22 +853,22 @@ index a209cd0..1bdb5c7 100644 @@ -3715,6 +3718,12 @@ class Map: public HeapObject { inline void set_is_access_check_needed(bool access_check_needed); inline bool is_access_check_needed(); - + + + // Tells whether the instance has the space for an external resource + // object + inline void set_has_external_resource(bool value); + inline bool has_external_resource(); + - + // Whether the named interceptor is a fallback interceptor or not inline void set_named_interceptor_is_fallback(bool value); @@ -3912,6 +3921,7 @@ class Map: public HeapObject { - + // Bit positions for bit field 3 static const int kNamedInterceptorIsFallback = 0; + static const int kHasExternalResource = 1; - + // Layout of the default cache. It holds alternating name and code objects. static const int kCodeCacheEntrySize = 2; @@ -6426,6 +6436,7 @@ class ObjectTemplateInfo: public TemplateInfo { @@ -876,9 +876,9 @@ index a209cd0..1bdb5c7 100644 DECL_ACCESSORS(constructor, Object) DECL_ACCESSORS(internal_field_count, Object) + DECL_ACCESSORS(has_external_resource, Object) - + static inline ObjectTemplateInfo* cast(Object* obj); - + @@ -6442,7 +6453,8 @@ class ObjectTemplateInfo: public TemplateInfo { static const int kConstructorOffset = TemplateInfo::kHeaderSize; static const int kInternalFieldCountOffset = @@ -887,8 +887,8 @@ index a209cd0..1bdb5c7 100644 + static const int kHasExternalResourceOffset = kInternalFieldCountOffset + kPointerSize; + static const int kSize = kHasExternalResourceOffset + kPointerSize; }; - - --- -1.7.6 + + +-- +1.7.4.4 |