[parser] Skipping inner funcs: use ZoneChunkList instead of ZoneDeque.

ZoneDeque is memory-inefficient, see
https://bugs.chromium.org/p/chromium/issues/detail?id=674287

As a downside, ZoneChunkList is not const correct, see

https: //bugs.chromium.org/p/v8/issues/detail?id=6473 .
Bug: v8:5516
Change-Id: I2db15006afd78aa932ab831cd9c0cff659229321
Reviewed-on: https://chromium-review.googlesource.com/750782
Reviewed-by: Toon Verwaest <verwaest@chromium.org>
Commit-Queue: Marja Hölttä <marja@chromium.org>
Cr-Commit-Position: refs/heads/master@{#49182}
This commit is contained in:
Marja Hölttä 2017-11-02 10:07:42 +01:00 committed by Commit Bot
parent 201a40d216
commit a0d1e58fdd
2 changed files with 11 additions and 11 deletions

View File

@ -102,16 +102,16 @@ void ProducedPreParsedScopeData::ByteData::WriteUint32(uint32_t data) {
} }
void ProducedPreParsedScopeData::ByteData::OverwriteFirstUint32(uint32_t data) { void ProducedPreParsedScopeData::ByteData::OverwriteFirstUint32(uint32_t data) {
size_t position = 0; auto it = backing_store_.begin();
#ifdef DEBUG #ifdef DEBUG
// Check that that position already holds an item of the expected size. // Check that that position already holds an item of the expected size.
DCHECK_GE(backing_store_.size(), kUint32Size); DCHECK_GE(backing_store_.size(), kUint32Size);
DCHECK_EQ(backing_store_[0], kUint32Size); DCHECK_EQ(*it, kUint32Size);
++position; ++it;
#endif #endif
const uint8_t* d = reinterpret_cast<uint8_t*>(&data); const uint8_t* d = reinterpret_cast<uint8_t*>(&data);
for (size_t i = 0; i < 4; ++i) { for (size_t i = 0; i < 4; ++i) {
backing_store_[position + i] = *d++; *it++ = *d++;
} }
} }
@ -143,7 +143,7 @@ void ProducedPreParsedScopeData::ByteData::WriteQuarter(uint8_t data) {
} }
Handle<PodArray<uint8_t>> ProducedPreParsedScopeData::ByteData::Serialize( Handle<PodArray<uint8_t>> ProducedPreParsedScopeData::ByteData::Serialize(
Isolate* isolate) const { Isolate* isolate) {
Handle<PodArray<uint8_t>> array = PodArray<uint8_t>::New( Handle<PodArray<uint8_t>> array = PodArray<uint8_t>::New(
isolate, static_cast<int>(backing_store_.size()), TENURED); isolate, static_cast<int>(backing_store_.size()), TENURED);
@ -275,7 +275,7 @@ bool ProducedPreParsedScopeData::ContainsInnerFunctions() const {
} }
MaybeHandle<PreParsedScopeData> ProducedPreParsedScopeData::Serialize( MaybeHandle<PreParsedScopeData> ProducedPreParsedScopeData::Serialize(
Isolate* isolate) const { Isolate* isolate) {
if (!previously_produced_preparsed_scope_data_.is_null()) { if (!previously_produced_preparsed_scope_data_.is_null()) {
DCHECK(!bailed_out_); DCHECK(!bailed_out_);
DCHECK_EQ(data_for_inner_functions_.size(), 0); DCHECK_EQ(data_for_inner_functions_.size(), 0);

View File

@ -13,7 +13,7 @@
#include "src/handles.h" #include "src/handles.h"
#include "src/objects/shared-function-info.h" #include "src/objects/shared-function-info.h"
#include "src/parsing/preparse-data.h" #include "src/parsing/preparse-data.h"
#include "src/zone/zone-containers.h" #include "src/zone/zone-chunk-list.h"
namespace v8 { namespace v8 {
namespace internal { namespace internal {
@ -79,12 +79,12 @@ class ProducedPreParsedScopeData : public ZoneObject {
// For overwriting previously written data at position 0. // For overwriting previously written data at position 0.
void OverwriteFirstUint32(uint32_t data); void OverwriteFirstUint32(uint32_t data);
Handle<PodArray<uint8_t>> Serialize(Isolate* isolate) const; Handle<PodArray<uint8_t>> Serialize(Isolate* isolate);
size_t size() const { return backing_store_.size(); } size_t size() const { return backing_store_.size(); }
private: private:
ZoneDeque<uint8_t> backing_store_; ZoneChunkList<uint8_t> backing_store_;
uint8_t free_quarters_in_last_byte_; uint8_t free_quarters_in_last_byte_;
}; };
@ -150,7 +150,7 @@ class ProducedPreParsedScopeData : public ZoneObject {
// If there is data (if the Scope contains skippable inner functions), move // If there is data (if the Scope contains skippable inner functions), move
// the data into the heap and return a Handle to it; otherwise return a null // the data into the heap and return a Handle to it; otherwise return a null
// MaybeHandle. // MaybeHandle.
MaybeHandle<PreParsedScopeData> Serialize(Isolate* isolate) const; MaybeHandle<PreParsedScopeData> Serialize(Isolate* isolate);
static bool ScopeNeedsData(Scope* scope); static bool ScopeNeedsData(Scope* scope);
static bool ScopeIsSkippableFunctionScope(Scope* scope); static bool ScopeIsSkippableFunctionScope(Scope* scope);
@ -168,7 +168,7 @@ class ProducedPreParsedScopeData : public ZoneObject {
ProducedPreParsedScopeData* parent_; ProducedPreParsedScopeData* parent_;
ByteData* byte_data_; ByteData* byte_data_;
ZoneDeque<ProducedPreParsedScopeData*> data_for_inner_functions_; ZoneChunkList<ProducedPreParsedScopeData*> data_for_inner_functions_;
// Whether we've given up producing the data for this function. // Whether we've given up producing the data for this function.
bool bailed_out_; bool bailed_out_;