Upgrade V8 to version 4.9.385.28
https://chromium.googlesource.com/v8/v8/+/4.9.385.28
FPIIM-449
Change-Id: I4b2e74289d4bf3667f2f3dc8aa2e541f63e26eb4
diff --git a/test/cctest/test-log.cc b/test/cctest/test-log.cc
index eee3e13..adbd1a5 100644
--- a/test/cctest/test-log.cc
+++ b/test/cctest/test-log.cc
@@ -36,10 +36,10 @@
#include "src/v8.h"
-#include "src/cpu-profiler.h"
#include "src/log.h"
#include "src/log-utils.h"
-#include "src/natives.h"
+#include "src/profiler/cpu-profiler.h"
+#include "src/snapshot/natives.h"
#include "src/utils.h"
#include "src/v8threads.h"
#include "src/version.h"
@@ -54,19 +54,26 @@
namespace {
+#define SETUP_FLAGS() \
+ bool saved_log = i::FLAG_log; \
+ bool saved_prof = i::FLAG_prof; \
+ i::FLAG_log = true; \
+ i::FLAG_prof = true; \
+ i::FLAG_logfile = i::Log::kLogToTemporaryFile; \
+ i::FLAG_logfile_per_isolate = false
+
+
class ScopedLoggerInitializer {
public:
- ScopedLoggerInitializer()
- : saved_log_(i::FLAG_log),
- saved_prof_(i::FLAG_prof),
+ ScopedLoggerInitializer(bool saved_log, bool saved_prof, v8::Isolate* isolate)
+ : saved_log_(saved_log),
+ saved_prof_(saved_prof),
temp_file_(NULL),
- // Need to run this prior to creating the scope.
- trick_to_run_init_flags_(init_flags_()),
- isolate_(v8::Isolate::New()),
- isolate_scope_(isolate_),
- scope_(isolate_),
- env_(v8::Context::New(isolate_)),
- logger_(reinterpret_cast<i::Isolate*>(isolate_)->logger()) {
+ isolate_(isolate),
+ isolate_scope_(isolate),
+ scope_(isolate),
+ env_(v8::Context::New(isolate)),
+ logger_(reinterpret_cast<i::Isolate*>(isolate)->logger()) {
env_->Enter();
}
@@ -78,7 +85,7 @@
i::FLAG_log = saved_log_;
}
- v8::Handle<v8::Context>& env() { return env_; }
+ v8::Local<v8::Context>& env() { return env_; }
v8::Isolate* isolate() { return isolate_; }
@@ -86,29 +93,20 @@
FILE* StopLoggingGetTempFile() {
temp_file_ = logger_->TearDown();
- CHECK_NE(NULL, temp_file_);
+ CHECK(temp_file_);
fflush(temp_file_);
rewind(temp_file_);
return temp_file_;
}
private:
- static bool init_flags_() {
- i::FLAG_log = true;
- i::FLAG_prof = true;
- i::FLAG_logfile = i::Log::kLogToTemporaryFile;
- i::FLAG_logfile_per_isolate = false;
- return false;
- }
-
const bool saved_log_;
const bool saved_prof_;
FILE* temp_file_;
- const bool trick_to_run_init_flags_;
v8::Isolate* isolate_;
v8::Isolate::Scope isolate_scope_;
v8::HandleScope scope_;
- v8::Handle<v8::Context> env_;
+ v8::Local<v8::Context> env_;
Logger* logger_;
DISALLOW_COPY_AND_ASSIGN(ScopedLoggerInitializer);
@@ -192,7 +190,7 @@
"var j; for (var i=0; i<10000; ++i) { j = Math.sin(i); }");
}
context.Dispose();
- i::OS::Sleep(1);
+ i::OS::Sleep(v8::base::TimeDelta::FromMilliseconds(1));
}
}
};
@@ -212,7 +210,7 @@
SignalRunning();
while (IsRunning()) {
i = std::sin(i);
- i::OS::Sleep(1);
+ i::OS::Sleep(v8::base::TimeDelta::FromMilliseconds(1));
}
}
};
@@ -309,18 +307,21 @@
TEST(Issue23768) {
v8::HandleScope scope(CcTest::isolate());
- v8::Handle<v8::Context> env = v8::Context::New(CcTest::isolate());
+ v8::Local<v8::Context> env = v8::Context::New(CcTest::isolate());
env->Enter();
SimpleExternalString source_ext_str("(function ext() {})();");
v8::Local<v8::String> source =
- v8::String::NewExternal(CcTest::isolate(), &source_ext_str);
+ v8::String::NewExternalTwoByte(CcTest::isolate(), &source_ext_str)
+ .ToLocalChecked();
// Script needs to have a name in order to trigger InitLineEnds execution.
- v8::Handle<v8::String> origin =
- v8::String::NewFromUtf8(CcTest::isolate(), "issue-23768-test");
- v8::Handle<v8::Script> evil_script = CompileWithOrigin(source, origin);
+ v8::Local<v8::String> origin =
+ v8::String::NewFromUtf8(CcTest::isolate(), "issue-23768-test",
+ v8::NewStringType::kNormal)
+ .ToLocalChecked();
+ v8::Local<v8::Script> evil_script = CompileWithOrigin(source, origin);
CHECK(!evil_script.IsEmpty());
- CHECK(!evil_script->Run().IsEmpty());
+ CHECK(!evil_script->Run(env).IsEmpty());
i::Handle<i::ExternalTwoByteString> i_source(
i::ExternalTwoByteString::cast(*v8::Utils::OpenHandle(*source)));
// This situation can happen if source was an external string disposed
@@ -337,23 +338,29 @@
TEST(LogCallbacks) {
- v8::Isolate* isolate;
+ SETUP_FLAGS();
+ v8::Isolate::CreateParams create_params;
+ create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
+ v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer initialize_logger;
- isolate = initialize_logger.isolate();
+ ScopedLoggerInitializer initialize_logger(saved_log, saved_prof, isolate);
Logger* logger = initialize_logger.logger();
v8::Local<v8::FunctionTemplate> obj = v8::Local<v8::FunctionTemplate>::New(
isolate, v8::FunctionTemplate::New(isolate));
obj->SetClassName(v8_str("Obj"));
- v8::Handle<v8::ObjectTemplate> proto = obj->PrototypeTemplate();
+ v8::Local<v8::ObjectTemplate> proto = obj->PrototypeTemplate();
v8::Local<v8::Signature> signature = v8::Signature::New(isolate, obj);
proto->Set(v8_str("method1"),
v8::FunctionTemplate::New(isolate, ObjMethod1,
- v8::Handle<v8::Value>(), signature),
+ v8::Local<v8::Value>(), signature),
static_cast<v8::PropertyAttribute>(v8::DontDelete));
- initialize_logger.env()->Global()->Set(v8_str("Obj"), obj->GetFunction());
+ initialize_logger.env()
+ ->Global()
+ ->Set(initialize_logger.env(), v8_str("Obj"),
+ obj->GetFunction(initialize_logger.env()).ToLocalChecked())
+ .FromJust();
CompileRun("Obj.prototype.method1.toString();");
logger->LogCompiledFunctions();
@@ -368,7 +375,7 @@
"code-creation,Callback,-2,0x%" V8PRIxPTR ",1,\"method1\"",
reinterpret_cast<intptr_t>(ObjMethod1));
- CHECK_NE(NULL, StrNStr(log.start(), ref_data.start(), log.length()));
+ CHECK(StrNStr(log.start(), ref_data.start(), log.length()));
log.Dispose();
}
isolate->Dispose();
@@ -390,16 +397,18 @@
TEST(LogAccessorCallbacks) {
- v8::Isolate* isolate;
+ SETUP_FLAGS();
+ v8::Isolate::CreateParams create_params;
+ create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
+ v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer initialize_logger;
- isolate = initialize_logger.isolate();
+ ScopedLoggerInitializer initialize_logger(saved_log, saved_prof, isolate);
Logger* logger = initialize_logger.logger();
v8::Local<v8::FunctionTemplate> obj = v8::Local<v8::FunctionTemplate>::New(
isolate, v8::FunctionTemplate::New(isolate));
obj->SetClassName(v8_str("Obj"));
- v8::Handle<v8::ObjectTemplate> inst = obj->InstanceTemplate();
+ v8::Local<v8::ObjectTemplate> inst = obj->InstanceTemplate();
inst->SetAccessor(v8_str("prop1"), Prop1Getter, Prop1Setter);
inst->SetAccessor(v8_str("prop2"), Prop2Getter);
@@ -414,22 +423,19 @@
i::SNPrintF(prop1_getter_record,
"code-creation,Callback,-2,0x%" V8PRIxPTR ",1,\"get prop1\"",
reinterpret_cast<intptr_t>(Prop1Getter));
- CHECK_NE(NULL,
- StrNStr(log.start(), prop1_getter_record.start(), log.length()));
+ CHECK(StrNStr(log.start(), prop1_getter_record.start(), log.length()));
EmbeddedVector<char, 100> prop1_setter_record;
i::SNPrintF(prop1_setter_record,
"code-creation,Callback,-2,0x%" V8PRIxPTR ",1,\"set prop1\"",
reinterpret_cast<intptr_t>(Prop1Setter));
- CHECK_NE(NULL,
- StrNStr(log.start(), prop1_setter_record.start(), log.length()));
+ CHECK(StrNStr(log.start(), prop1_setter_record.start(), log.length()));
EmbeddedVector<char, 100> prop2_getter_record;
i::SNPrintF(prop2_getter_record,
"code-creation,Callback,-2,0x%" V8PRIxPTR ",1,\"get prop2\"",
reinterpret_cast<intptr_t>(Prop2Getter));
- CHECK_NE(NULL,
- StrNStr(log.start(), prop2_getter_record.start(), log.length()));
+ CHECK(StrNStr(log.start(), prop2_getter_record.start(), log.length()));
log.Dispose();
}
isolate->Dispose();
@@ -449,10 +455,12 @@
// are using V8.
// Start with profiling to capture all code events from the beginning.
- v8::Isolate* isolate;
+ SETUP_FLAGS();
+ v8::Isolate::CreateParams create_params;
+ create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
+ v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer initialize_logger;
- isolate = initialize_logger.isolate();
+ ScopedLoggerInitializer initialize_logger(saved_log, saved_prof, isolate);
Logger* logger = initialize_logger.logger();
// Compile and run a function that creates other functions.
@@ -474,31 +482,39 @@
i::Vector<const char> log(
i::ReadFile(initialize_logger.StopLoggingGetTempFile(), &exists, true));
CHECK(exists);
- v8::Handle<v8::String> log_str = v8::String::NewFromUtf8(
- isolate, log.start(), v8::String::kNormalString, log.length());
- initialize_logger.env()->Global()->Set(v8_str("_log"), log_str);
+ v8::Local<v8::String> log_str =
+ v8::String::NewFromUtf8(isolate, log.start(),
+ v8::NewStringType::kNormal, log.length())
+ .ToLocalChecked();
+ initialize_logger.env()
+ ->Global()
+ ->Set(initialize_logger.env(), v8_str("_log"), log_str)
+ .FromJust();
i::Vector<const char> source = TestSources::GetScriptsSource();
- v8::Handle<v8::String> source_str = v8::String::NewFromUtf8(
- isolate, source.start(), v8::String::kNormalString, source.length());
- v8::TryCatch try_catch;
- v8::Handle<v8::Script> script = CompileWithOrigin(source_str, "");
+ v8::Local<v8::String> source_str =
+ v8::String::NewFromUtf8(isolate, source.start(),
+ v8::NewStringType::kNormal, source.length())
+ .ToLocalChecked();
+ v8::TryCatch try_catch(isolate);
+ v8::Local<v8::Script> script = CompileWithOrigin(source_str, "");
if (script.IsEmpty()) {
v8::String::Utf8Value exception(try_catch.Exception());
printf("compile: %s\n", *exception);
CHECK(false);
}
- v8::Handle<v8::Value> result = script->Run();
- if (result.IsEmpty()) {
+ v8::Local<v8::Value> result;
+ if (!script->Run(initialize_logger.env()).ToLocal(&result)) {
v8::String::Utf8Value exception(try_catch.Exception());
printf("run: %s\n", *exception);
CHECK(false);
}
// The result either be a "true" literal or problem description.
if (!result->IsTrue()) {
- v8::Local<v8::String> s = result->ToString(isolate);
+ v8::Local<v8::String> s =
+ result->ToString(initialize_logger.env()).ToLocalChecked();
i::ScopedVector<char> data(s->Utf8Length() + 1);
- CHECK_NE(NULL, data.start());
+ CHECK(data.start());
s->WriteUtf8(data.start());
printf("%s\n", data.start());
// Make sure that our output is written prior crash due to CHECK failure.
@@ -511,10 +527,12 @@
TEST(LogVersion) {
- v8::Isolate* isolate;
+ SETUP_FLAGS();
+ v8::Isolate::CreateParams create_params;
+ create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
+ v8::Isolate* isolate = v8::Isolate::New(create_params);
{
- ScopedLoggerInitializer initialize_logger;
- isolate = initialize_logger.isolate();
+ ScopedLoggerInitializer initialize_logger(saved_log, saved_prof, isolate);
bool exists = false;
i::Vector<const char> log(
i::ReadFile(initialize_logger.StopLoggingGetTempFile(), &exists, true));
@@ -523,8 +541,63 @@
i::SNPrintF(ref_data, "v8-version,%d,%d,%d,%d,%d", i::Version::GetMajor(),
i::Version::GetMinor(), i::Version::GetBuild(),
i::Version::GetPatch(), i::Version::IsCandidate());
- CHECK_NE(NULL, StrNStr(log.start(), ref_data.start(), log.length()));
+ CHECK(StrNStr(log.start(), ref_data.start(), log.length()));
log.Dispose();
}
isolate->Dispose();
}
+
+
+// https://crbug.com/539892
+// CodeCreateEvents with really large names should not crash.
+TEST(Issue539892) {
+ class : public i::CodeEventLogger {
+ public:
+ virtual void CodeMoveEvent(Address from, Address to) {}
+ virtual void CodeDeleteEvent(Address from) {}
+ virtual void CodeDisableOptEvent(i::Code* code,
+ i::SharedFunctionInfo* shared) {}
+
+ private:
+ virtual void LogRecordedBuffer(i::Code* code, i::SharedFunctionInfo* shared,
+ const char* name, int length) {}
+ } code_event_logger;
+ SETUP_FLAGS();
+ v8::Isolate::CreateParams create_params;
+ create_params.array_buffer_allocator = CcTest::array_buffer_allocator();
+ v8::Isolate* isolate = v8::Isolate::New(create_params);
+
+ {
+ ScopedLoggerInitializer initialize_logger(saved_log, saved_prof, isolate);
+ Logger* logger = initialize_logger.logger();
+ logger->addCodeEventListener(&code_event_logger);
+
+ // Function with a really large name.
+ const char* source_text =
+ "(function "
+ "baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac"
+ "(){})();";
+
+ CompileRun(source_text);
+
+ // Must not crash.
+ logger->LogCompiledFunctions();
+ }
+ isolate->Dispose();
+}