Merge V8 5.3.332.45. DO NOT MERGE
Test: Manual
FPIIM-449
Change-Id: Id3254828b068abdea3cb10442e0172a8c9a98e03
(cherry picked from commit 13e2dadd00298019ed862f2b2fc5068bba730bcf)
diff --git a/test/cctest/test-debug.cc b/test/cctest/test-debug.cc
index 440c6f1..3ed6ec8 100644
--- a/test/cctest/test-debug.cc
+++ b/test/cctest/test-debug.cc
@@ -6081,53 +6081,48 @@
::v8::internal::EmbeddedVector<uint16_t, 1> empty_;
};
-
-TEST(DebugGetLoadedScripts) {
+TEST(DebugScriptLineEndsAreAscending) {
DebugLocalContext env;
- v8::HandleScope scope(env->GetIsolate());
+ v8::Isolate* isolate = env->GetIsolate();
+ v8::HandleScope scope(isolate);
env.ExposeDebug();
- v8::Local<v8::Context> context = env.context();
- EmptyExternalStringResource source_ext_str;
- v8::Local<v8::String> source =
- v8::String::NewExternalTwoByte(env->GetIsolate(), &source_ext_str)
- .ToLocalChecked();
- CHECK(v8::Script::Compile(context, source).IsEmpty());
- Handle<i::ExternalTwoByteString> i_source(
- i::ExternalTwoByteString::cast(*v8::Utils::OpenHandle(*source)));
- // This situation can happen if source was an external string disposed
- // by its owner.
- i_source->set_resource(0);
+ // Compile a test script.
+ v8::Local<v8::String> script = v8_str(isolate,
+ "function f() {\n"
+ " debugger;\n"
+ "}\n");
- bool allow_natives_syntax = i::FLAG_allow_natives_syntax;
- i::FLAG_allow_natives_syntax = true;
- EnableDebugger(env->GetIsolate());
- v8::MaybeLocal<v8::Value> result =
- CompileRun(env.context(),
- "var scripts = %DebugGetLoadedScripts();"
- "var count = scripts.length;"
- "for (var i = 0; i < count; ++i) {"
- " var lines = scripts[i].lineCount();"
- " if (lines < 1) throw 'lineCount';"
- " var last = -1;"
- " for (var j = 0; j < lines; ++j) {"
- " var end = scripts[i].lineEnd(j);"
- " if (last >= end) throw 'lineEnd';"
- " last = end;"
- " }"
- "}");
- CHECK(!result.IsEmpty());
- DisableDebugger(env->GetIsolate());
- // Must not crash while accessing line_ends.
- i::FLAG_allow_natives_syntax = allow_natives_syntax;
+ v8::ScriptOrigin origin1 = v8::ScriptOrigin(v8_str(isolate, "name"));
+ v8::Local<v8::Script> script1 =
+ v8::Script::Compile(env.context(), script, &origin1).ToLocalChecked();
+ USE(script1);
- // Some scripts are retrieved - at least the number of native scripts.
- CHECK_GT(env->Global()
- ->Get(context, v8_str(env->GetIsolate(), "count"))
- .ToLocalChecked()
- ->Int32Value(context)
- .FromJust(),
- 8);
+ Handle<v8::internal::FixedArray> instances;
+ {
+ v8::internal::Debug* debug = CcTest::i_isolate()->debug();
+ v8::internal::DebugScope debug_scope(debug);
+ CHECK(!debug_scope.failed());
+ instances = debug->GetLoadedScripts();
+ }
+
+ CHECK_GT(instances->length(), 0);
+ for (int i = 0; i < instances->length(); i++) {
+ Handle<v8::internal::Script> script = Handle<v8::internal::Script>(
+ v8::internal::Script::cast(instances->get(i)));
+
+ v8::internal::Script::InitLineEnds(script);
+ v8::internal::FixedArray* ends =
+ v8::internal::FixedArray::cast(script->line_ends());
+ CHECK_GT(ends->length(), 0);
+
+ int prev_end = -1;
+ for (int j = 0; j < ends->length(); j++) {
+ const int curr_end = v8::internal::Smi::cast(ends->get(j))->value();
+ CHECK_GT(curr_end, prev_end);
+ prev_end = curr_end;
+ }
+ }
}
@@ -7185,6 +7180,40 @@
CHECK(context.IsEmpty());
}
+static void DebugEventCheckContext(
+ const v8::Debug::EventDetails& event_details) {
+ if (event_details.GetEvent() == v8::Break) {
+ v8::Isolate* isolate = event_details.GetIsolate();
+ CHECK(v8::Debug::GetDebuggedContext(isolate)
+ .ToLocalChecked()
+ ->Global()
+ ->Equals(isolate->GetCurrentContext(),
+ event_details.GetEventContext()->Global())
+ .FromJust());
+ }
+}
+
+static void CheckContext(const v8::FunctionCallbackInfo<v8::Value>& args) {
+ CHECK(v8::Debug::GetDebuggedContext(args.GetIsolate()).IsEmpty());
+}
+
+TEST(DebuggedContext) {
+ DebugLocalContext env;
+ v8::Isolate* isolate = env->GetIsolate();
+
+ v8::Debug::SetDebugEventListener(isolate, DebugEventCheckContext);
+
+ v8::Local<v8::Function> foo =
+ CompileFunction(&env, "function foo(){bar=0;}", "foo");
+
+ SetBreakPoint(foo, 0);
+ foo->Call(env.context(), env->Global(), 0, nullptr).ToLocalChecked();
+
+ v8::Local<v8::Function> fun = v8::FunctionTemplate::New(isolate, CheckContext)
+ ->GetFunction(env.context())
+ .ToLocalChecked();
+ fun->Call(env.context(), env->Global(), 0, nullptr).ToLocalChecked();
+}
static v8::Local<v8::Value> expected_callback_data;
static void DebugEventContextChecker(const v8::Debug::EventDetails& details) {