diff options
Diffstat (limited to 'chromium/v8/src')
-rw-r--r-- | chromium/v8/src/api.cc | 13 | ||||
-rw-r--r-- | chromium/v8/src/d8.cc | 14 | ||||
-rw-r--r-- | chromium/v8/src/d8.gyp | 2 | ||||
-rw-r--r-- | chromium/v8/src/heap/mark-compact.cc | 41 | ||||
-rw-r--r-- | chromium/v8/src/preparser.h | 14 | ||||
-rw-r--r-- | chromium/v8/src/startup-data-util.cc | 110 | ||||
-rw-r--r-- | chromium/v8/src/startup-data-util.h | 40 |
7 files changed, 130 insertions, 104 deletions
diff --git a/chromium/v8/src/api.cc b/chromium/v8/src/api.cc index 5ff8ccbae51..593aea641b2 100644 --- a/chromium/v8/src/api.cc +++ b/chromium/v8/src/api.cc @@ -49,6 +49,7 @@ #include "src/simulator.h" #include "src/snapshot/natives.h" #include "src/snapshot/snapshot.h" +#include "src/startup-data-util.h" #include "src/unicode-inl.h" #include "src/v8threads.h" #include "src/version.h" @@ -5398,11 +5399,23 @@ HeapObjectStatistics::HeapObjectStatistics() object_count_(0), object_size_(0) {} + bool v8::V8::InitializeICU(const char* icu_data_file) { return i::InitializeICU(icu_data_file); } +void v8::V8::InitializeExternalStartupData(const char* directory_path) { + i::InitializeExternalStartupData(directory_path); +} + + +void v8::V8::InitializeExternalStartupData(const char* natives_blob, + const char* snapshot_blob) { + i::InitializeExternalStartupData(natives_blob, snapshot_blob); +} + + const char* v8::V8::GetVersion() { return i::Version::GetVersion(); } diff --git a/chromium/v8/src/d8.cc b/chromium/v8/src/d8.cc index 7db6f3ed9e4..45bf33167fd 100644 --- a/chromium/v8/src/d8.cc +++ b/chromium/v8/src/d8.cc @@ -50,10 +50,6 @@ #include "src/v8.h" #endif // !V8_SHARED -#ifdef V8_USE_EXTERNAL_STARTUP_DATA -#include "src/startup-data-util.h" -#endif // V8_USE_EXTERNAL_STARTUP_DATA - #if !defined(_WIN32) && !defined(_WIN64) #include <unistd.h> // NOLINT #else @@ -2316,10 +2312,12 @@ int Shell::Main(int argc, char* argv[]) { g_platform = v8::platform::CreateDefaultPlatform(); v8::V8::InitializePlatform(g_platform); v8::V8::Initialize(); -#ifdef V8_USE_EXTERNAL_STARTUP_DATA - v8::StartupDataHandler startup_data(argv[0], options.natives_blob, - options.snapshot_blob); -#endif + if (options.natives_blob || options.snapshot_blob) { + v8::V8::InitializeExternalStartupData(options.natives_blob, + options.snapshot_blob); + } else { + v8::V8::InitializeExternalStartupData(argv[0]); + } SetFlagsFromString("--trace-hydrogen-file=hydrogen.cfg"); SetFlagsFromString("--trace-turbo-cfg-file=turbo.cfg"); SetFlagsFromString("--redirect-code-traces-to=code.asm"); diff --git a/chromium/v8/src/d8.gyp b/chromium/v8/src/d8.gyp index 548459a7901..e92a3219908 100644 --- a/chromium/v8/src/d8.gyp +++ b/chromium/v8/src/d8.gyp @@ -50,8 +50,6 @@ 'sources': [ 'd8.h', 'd8.cc', - 'startup-data-util.h', - 'startup-data-util.cc' ], 'conditions': [ [ 'want_separate_host_toolset==1', { diff --git a/chromium/v8/src/heap/mark-compact.cc b/chromium/v8/src/heap/mark-compact.cc index 8bbfeb173f7..9ca06cf2e64 100644 --- a/chromium/v8/src/heap/mark-compact.cc +++ b/chromium/v8/src/heap/mark-compact.cc @@ -3058,11 +3058,18 @@ bool MarkCompactCollector::TryPromoteObject(HeapObject* object, bool MarkCompactCollector::IsSlotInBlackObject(Page* p, Address slot, HeapObject** out_object) { - // This function does not support large objects right now. Space* owner = p->owner(); if (owner == heap_->lo_space() || owner == NULL) { - *out_object = NULL; - return true; + Object* large_object = heap_->lo_space()->FindObject(slot); + // This object has to exist, otherwise we would not have recorded a slot + // for it. + CHECK(large_object->IsHeapObject()); + HeapObject* large_heap_object = HeapObject::cast(large_object); + if (IsMarked(large_heap_object)) { + *out_object = large_heap_object; + return true; + } + return false; } uint32_t mark_bit_index = p->AddressToMarkbitIndex(slot); @@ -3179,13 +3186,8 @@ bool MarkCompactCollector::IsSlotInLiveObject(Address slot) { return false; } - // |object| is NULL only when the slot belongs to large object space. - DCHECK(object != NULL || - Page::FromAnyPointerAddress(heap_, slot)->owner() == - heap_->lo_space()); - // We don't need to check large objects' layout descriptor since it can't - // contain in-object fields anyway. - if (object != NULL) { + DCHECK(object != NULL); + switch (object->ContentType()) { case HeapObjectContents::kTaggedValues: return true; @@ -3214,9 +3216,7 @@ bool MarkCompactCollector::IsSlotInLiveObject(Address slot) { } } UNREACHABLE(); - } - - return true; + return true; } @@ -4444,12 +4444,10 @@ void SlotsBuffer::RemoveInvalidSlots(Heap* heap, SlotsBuffer* buffer) { ObjectSlot slot = slots[slot_idx]; if (!IsTypedSlot(slot)) { Object* object = *slot; - if (object->IsHeapObject()) { - if (heap->InNewSpace(object) || - !heap->mark_compact_collector()->IsSlotInLiveObject( - reinterpret_cast<Address>(slot))) { - slots[slot_idx] = kRemovedEntry; - } + if ((object->IsHeapObject() && heap->InNewSpace(object)) || + !heap->mark_compact_collector()->IsSlotInLiveObject( + reinterpret_cast<Address>(slot))) { + slots[slot_idx] = kRemovedEntry; } } else { ++slot_idx; @@ -4506,9 +4504,10 @@ void SlotsBuffer::VerifySlots(Heap* heap, SlotsBuffer* buffer) { if (!IsTypedSlot(slot)) { Object* object = *slot; if (object->IsHeapObject()) { + HeapObject* heap_object = HeapObject::cast(object); CHECK(!heap->InNewSpace(object)); - CHECK(heap->mark_compact_collector()->IsSlotInLiveObject( - reinterpret_cast<Address>(slot))); + heap->mark_compact_collector()->VerifyIsSlotInLiveObject( + reinterpret_cast<Address>(slot), heap_object); } } else { ++slot_idx; diff --git a/chromium/v8/src/preparser.h b/chromium/v8/src/preparser.h index 9ebc132d92b..d9ef1ea31ec 100644 --- a/chromium/v8/src/preparser.h +++ b/chromium/v8/src/preparser.h @@ -2939,6 +2939,7 @@ ParserBase<Traits>::ParseConditionalExpression(bool accept_IN, ExpressionT expression = this->ParseBinaryExpression(4, accept_IN, classifier, CHECK_OK); if (peek() != Token::CONDITIONAL) return expression; + ArrowFormalParametersUnexpectedToken(classifier); BindingPatternUnexpectedToken(classifier); Consume(Token::CONDITIONAL); // In parsing the first assignment expression in conditional @@ -2964,6 +2965,7 @@ ParserBase<Traits>::ParseBinaryExpression(int prec, bool accept_IN, // prec1 >= 4 while (Precedence(peek(), accept_IN) == prec1) { BindingPatternUnexpectedToken(classifier); + ArrowFormalParametersUnexpectedToken(classifier); Token::Value op = Next(); Scanner::Location op_location = scanner()->location(); int pos = position(); @@ -3026,6 +3028,7 @@ ParserBase<Traits>::ParseUnaryExpression(ExpressionClassifier* classifier, Token::Value op = peek(); if (Token::IsUnaryOp(op)) { BindingPatternUnexpectedToken(classifier); + ArrowFormalParametersUnexpectedToken(classifier); op = Next(); int pos = position(); @@ -3048,6 +3051,7 @@ ParserBase<Traits>::ParseUnaryExpression(ExpressionClassifier* classifier, return this->BuildUnaryExpression(expression, op, pos, factory()); } else if (Token::IsCountOp(op)) { BindingPatternUnexpectedToken(classifier); + ArrowFormalParametersUnexpectedToken(classifier); op = Next(); Scanner::Location lhs_location = scanner()->peek_location(); ExpressionT expression = this->ParseUnaryExpression(classifier, CHECK_OK); @@ -3080,6 +3084,7 @@ ParserBase<Traits>::ParsePostfixExpression(ExpressionClassifier* classifier, if (!scanner()->HasAnyLineTerminatorBeforeNext() && Token::IsCountOp(peek())) { BindingPatternUnexpectedToken(classifier); + ArrowFormalParametersUnexpectedToken(classifier); expression = this->CheckAndRewriteReferenceExpression( expression, lhs_location, MessageTemplate::kInvalidLhsInPostfixOp, @@ -3111,6 +3116,7 @@ ParserBase<Traits>::ParseLeftHandSideExpression( switch (peek()) { case Token::LBRACK: { BindingPatternUnexpectedToken(classifier); + ArrowFormalParametersUnexpectedToken(classifier); Consume(Token::LBRACK); int pos = position(); ExpressionT index = ParseExpression(true, classifier, CHECK_OK); @@ -3121,6 +3127,7 @@ ParserBase<Traits>::ParseLeftHandSideExpression( case Token::LPAREN: { BindingPatternUnexpectedToken(classifier); + ArrowFormalParametersUnexpectedToken(classifier); if (is_strong(language_mode()) && this->IsIdentifier(result) && this->IsEval(this->AsIdentifier(result))) { @@ -3172,6 +3179,7 @@ ParserBase<Traits>::ParseLeftHandSideExpression( case Token::PERIOD: { BindingPatternUnexpectedToken(classifier); + ArrowFormalParametersUnexpectedToken(classifier); Consume(Token::PERIOD); int pos = position(); IdentifierT name = ParseIdentifierName(CHECK_OK); @@ -3184,6 +3192,7 @@ ParserBase<Traits>::ParseLeftHandSideExpression( case Token::TEMPLATE_SPAN: case Token::TEMPLATE_TAIL: { BindingPatternUnexpectedToken(classifier); + ArrowFormalParametersUnexpectedToken(classifier); result = ParseTemplateLiteral(result, position(), classifier, CHECK_OK); break; } @@ -3221,6 +3230,7 @@ ParserBase<Traits>::ParseMemberWithNewPrefixesExpression( if (peek() == Token::NEW) { BindingPatternUnexpectedToken(classifier); + ArrowFormalParametersUnexpectedToken(classifier); Consume(Token::NEW); int new_pos = position(); ExpressionT result = this->EmptyExpression(); @@ -3274,6 +3284,7 @@ ParserBase<Traits>::ParseMemberExpression(ExpressionClassifier* classifier, ExpressionT result = this->EmptyExpression(); if (peek() == Token::FUNCTION) { BindingPatternUnexpectedToken(classifier); + ArrowFormalParametersUnexpectedToken(classifier); Consume(Token::FUNCTION); int function_token_position = position(); @@ -3523,6 +3534,7 @@ ParserBase<Traits>::ParseMemberExpressionContinuation( switch (peek()) { case Token::LBRACK: { BindingPatternUnexpectedToken(classifier); + ArrowFormalParametersUnexpectedToken(classifier); Consume(Token::LBRACK); int pos = position(); @@ -3536,6 +3548,7 @@ ParserBase<Traits>::ParseMemberExpressionContinuation( } case Token::PERIOD: { BindingPatternUnexpectedToken(classifier); + ArrowFormalParametersUnexpectedToken(classifier); Consume(Token::PERIOD); int pos = position(); @@ -3550,6 +3563,7 @@ ParserBase<Traits>::ParseMemberExpressionContinuation( case Token::TEMPLATE_SPAN: case Token::TEMPLATE_TAIL: { BindingPatternUnexpectedToken(classifier); + ArrowFormalParametersUnexpectedToken(classifier); int pos; if (scanner()->current_token() == Token::IDENTIFIER) { pos = position(); diff --git a/chromium/v8/src/startup-data-util.cc b/chromium/v8/src/startup-data-util.cc index 1b2f7ed7e95..92c4b5b3e98 100644 --- a/chromium/v8/src/startup-data-util.cc +++ b/chromium/v8/src/startup-data-util.cc @@ -8,66 +8,41 @@ #include <string.h> #include "src/base/logging.h" +#include "src/base/platform/platform.h" namespace v8 { +namespace internal { #ifdef V8_USE_EXTERNAL_STARTUP_DATA -StartupDataHandler::StartupDataHandler(const char* exec_path, - const char* natives_blob, - const char* snapshot_blob) { - // If we have (at least one) explicitly given blob, use those. - // If not, use the default blob locations next to the d8 binary. - if (natives_blob || snapshot_blob) { - LoadFromFiles(natives_blob, snapshot_blob); - } else { - char* natives; - char* snapshot; - LoadFromFiles(RelativePath(&natives, exec_path, "natives_blob.bin"), - RelativePath(&snapshot, exec_path, "snapshot_blob.bin")); +namespace { - free(natives); - free(snapshot); - } -} +v8::StartupData g_natives; +v8::StartupData g_snapshot; -StartupDataHandler::~StartupDataHandler() { - delete[] natives_.data; - delete[] snapshot_.data; +void ClearStartupData(v8::StartupData* data) { + data->data = nullptr; + data->raw_size = 0; } -char* StartupDataHandler::RelativePath(char** buffer, const char* exec_path, - const char* name) { - DCHECK(exec_path); - const char* last_slash = strrchr(exec_path, '/'); - if (last_slash) { - int after_slash = static_cast<int>(last_slash - exec_path + 1); - int name_length = static_cast<int>(strlen(name)); - *buffer = reinterpret_cast<char*>(calloc(after_slash + name_length + 1, 1)); - strncpy(*buffer, exec_path, after_slash); - strncat(*buffer, name, name_length); - } else { - *buffer = strdup(name); - } - return *buffer; +void DeleteStartupData(v8::StartupData* data) { + delete[] data->data; + ClearStartupData(data); } -void StartupDataHandler::LoadFromFiles(const char* natives_blob, - const char* snapshot_blob) { - Load(natives_blob, &natives_, v8::V8::SetNativesDataBlob); - Load(snapshot_blob, &snapshot_, v8::V8::SetSnapshotDataBlob); +void FreeStartupData() { + DeleteStartupData(&g_natives); + DeleteStartupData(&g_snapshot); } -void StartupDataHandler::Load(const char* blob_file, - v8::StartupData* startup_data, - void (*setter_fn)(v8::StartupData*)) { - startup_data->data = NULL; - startup_data->raw_size = 0; +void Load(const char* blob_file, v8::StartupData* startup_data, + void (*setter_fn)(v8::StartupData*)) { + ClearStartupData(startup_data); if (!blob_file) return; @@ -86,6 +61,57 @@ void StartupDataHandler::Load(const char* blob_file, if (startup_data->raw_size == read_size) (*setter_fn)(startup_data); } + +void LoadFromFiles(const char* natives_blob, const char* snapshot_blob) { + Load(natives_blob, &g_natives, v8::V8::SetNativesDataBlob); + Load(snapshot_blob, &g_snapshot, v8::V8::SetSnapshotDataBlob); + + atexit(&FreeStartupData); +} + + +char* RelativePath(char** buffer, const char* exec_path, const char* name) { + DCHECK(exec_path); + int path_separator = static_cast<int>(strlen(exec_path)) - 1; + while (path_separator >= 0 && + !base::OS::isDirectorySeparator(exec_path[path_separator])) { + path_separator--; + } + if (path_separator >= 0) { + int name_length = static_cast<int>(strlen(name)); + *buffer = + reinterpret_cast<char*>(calloc(path_separator + name_length + 2, 1)); + *buffer[0] = '\0'; + strncat(*buffer, exec_path, path_separator + 1); + strncat(*buffer, name, name_length); + } else { + *buffer = strdup(name); + } + return *buffer; +} + +} // namespace #endif // V8_USE_EXTERNAL_STARTUP_DATA + +void InitializeExternalStartupData(const char* directory_path) { +#ifdef V8_USE_EXTERNAL_STARTUP_DATA + char* natives; + char* snapshot; + LoadFromFiles(RelativePath(&natives, directory_path, "natives_blob.bin"), + RelativePath(&snapshot, directory_path, "snapshot_blob.bin")); + free(natives); + free(snapshot); +#endif // V8_USE_EXTERNAL_STARTUP_DATA +} + + +void InitializeExternalStartupData(const char* natives_blob, + const char* snapshot_blob) { +#ifdef V8_USE_EXTERNAL_STARTUP_DATA + LoadFromFiles(natives_blob, snapshot_blob); +#endif // V8_USE_EXTERNAL_STARTUP_DATA +} + +} // namespace internal } // namespace v8 diff --git a/chromium/v8/src/startup-data-util.h b/chromium/v8/src/startup-data-util.h index 79b4171343a..7cb51e362a9 100644 --- a/chromium/v8/src/startup-data-util.h +++ b/chromium/v8/src/startup-data-util.h @@ -9,43 +9,21 @@ #include "include/v8.h" namespace v8 { +namespace internal { -#ifdef V8_USE_EXTERNAL_STARTUP_DATA -// Helper class to load the startup data files from disk. +// Helper functions to load external startup data. // // This is meant as a convenience for stand-alone binaries like d8, cctest, // unittest. A V8 embedder would likely either handle startup data on their // own or just disable the feature if they don't want to handle it at all, -// while tools like cctest need to work in either configuration. Hence this is -// not meant for inclusion in the general v8 library. -class StartupDataHandler { - public: - // Load startup data, and call the v8::V8::Set*DataBlob API functions. - // - // natives_blob and snapshot_blob will be loaded realitive to exec_path, - // which would usually be the equivalent of argv[0]. - StartupDataHandler(const char* exec_path, const char* natives_blob, - const char* snapshot_blob); - ~StartupDataHandler(); - - private: - static char* RelativePath(char** buffer, const char* exec_path, - const char* name); - - void LoadFromFiles(const char* natives_blob, const char* snapshot_blob); - - void Load(const char* blob_file, v8::StartupData* startup_data, - void (*setter_fn)(v8::StartupData*)); - - v8::StartupData natives_; - v8::StartupData snapshot_; - - // Disallow copy & assign. - StartupDataHandler(const StartupDataHandler& other); - void operator=(const StartupDataHandler& other); -}; -#endif // V8_USE_EXTERNAL_STARTUP_DATA +// while tools like cctest need to work in either configuration. +void InitializeExternalStartupData(const char* directory_path); + +void InitializeExternalStartupData(const char* natives_blob, + const char* snapshot_blob); + +} // namespace internal } // namespace v8 #endif // V8_STARTUP_DATA_UTIL_H_ |