summaryrefslogtreecommitdiff
path: root/chromium/v8/src
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/v8/src')
-rw-r--r--chromium/v8/src/api.cc13
-rw-r--r--chromium/v8/src/d8.cc14
-rw-r--r--chromium/v8/src/d8.gyp2
-rw-r--r--chromium/v8/src/heap/mark-compact.cc41
-rw-r--r--chromium/v8/src/preparser.h14
-rw-r--r--chromium/v8/src/startup-data-util.cc110
-rw-r--r--chromium/v8/src/startup-data-util.h40
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_