| Index: test/cctest/test-debug.cc
|
| diff --git a/test/cctest/test-debug.cc b/test/cctest/test-debug.cc
|
| index 3b4f79a9ad05313e3e4de98525edc6981de46e60..440c6f15c490254016b5789fda65c6b508ceb19a 100644
|
| --- a/test/cctest/test-debug.cc
|
| +++ b/test/cctest/test-debug.cc
|
| @@ -6081,48 +6081,53 @@
|
| ::v8::internal::EmbeddedVector<uint16_t, 1> empty_;
|
| };
|
|
|
| -TEST(DebugScriptLineEndsAreAscending) {
|
| - DebugLocalContext env;
|
| - v8::Isolate* isolate = env->GetIsolate();
|
| - v8::HandleScope scope(isolate);
|
| +
|
| +TEST(DebugGetLoadedScripts) {
|
| + DebugLocalContext env;
|
| + v8::HandleScope scope(env->GetIsolate());
|
| env.ExposeDebug();
|
|
|
| - // Compile a test script.
|
| - v8::Local<v8::String> script = v8_str(isolate,
|
| - "function f() {\n"
|
| - " debugger;\n"
|
| - "}\n");
|
| -
|
| - v8::ScriptOrigin origin1 = v8::ScriptOrigin(v8_str(isolate, "name"));
|
| - v8::Local<v8::Script> script1 =
|
| - v8::Script::Compile(env.context(), script, &origin1).ToLocalChecked();
|
| - USE(script1);
|
| -
|
| - 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;
|
| - }
|
| - }
|
| + 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);
|
| +
|
| + 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;
|
| +
|
| + // 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);
|
| }
|
|
|
|
|
|
|