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();
+}