[vm] Cleanup script tags

VM creates Script objects with kKernelTag only, so this CL cleans up
all uses of script tags and Script::kind() along with code
which is no longer reachable.

Change-Id: Ia765e7757264aa614e18eddd16d21937f855c129
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/123889
Reviewed-by: Ryan Macnak <rmacnak@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
This commit is contained in:
Alexander Markov
2019-11-01 19:08:42 +00:00
committed by commit-bot@chromium.org
parent ebc6340e36
commit 8b67fcbbd1
13 changed files with 63 additions and 160 deletions
+2 -4
View File
@@ -1697,10 +1697,8 @@ DEFINE_NATIVE_ENTRY(DeclarationMirror_location, 0, 1) {
return Instance::null(); // No source.
}
const Array& scripts = Array::Handle(zone, lib.LoadedScripts());
for (intptr_t i = 0; i < scripts.Length(); i++) {
script ^= scripts.At(i);
if (script.kind() == RawScript::kLibraryTag) break;
}
ASSERT(scripts.Length() > 0);
script ^= scripts.At(scripts.Length() - 1);
ASSERT(!script.IsNull());
const String& uri = String::Handle(zone, script.url());
return CreateSourceLocation(uri, 1, 1);
+2 -2
View File
@@ -1100,7 +1100,7 @@ class ScriptSerializationCluster : public SerializationCluster {
WriteFromTo(script);
s->Write<int32_t>(script->ptr()->line_offset_);
s->Write<int32_t>(script->ptr()->col_offset_);
s->Write<uint8_t>(script->ptr()->kind_and_tags_);
s->Write<uint8_t>(script->ptr()->flags_);
s->Write<int32_t>(script->ptr()->kernel_script_index_);
}
}
@@ -1133,7 +1133,7 @@ class ScriptDeserializationCluster : public DeserializationCluster {
ReadFromTo(script);
script->ptr()->line_offset_ = d->Read<int32_t>();
script->ptr()->col_offset_ = d->Read<int32_t>();
script->ptr()->kind_and_tags_ = d->Read<uint8_t>();
script->ptr()->flags_ = d->Read<uint8_t>();
script->ptr()->kernel_script_index_ = d->Read<int32_t>();
script->ptr()->load_timestamp_ = 0;
}
@@ -1540,7 +1540,7 @@ RawObject* BytecodeReaderHelper::ReadObjectContents(uint32_t header) {
ReadSourceFile(uri, bytecode_component_->GetSourceFilesOffset() +
reader_.ReadUInt());
} else {
script = Script::New(uri, Object::null_string(), RawScript::kKernelTag);
script = Script::New(uri, Object::null_string());
}
script.set_kernel_program_info(H.GetKernelProgramInfo());
return script.raw();
@@ -1910,8 +1910,8 @@ RawScript* BytecodeReaderHelper::ReadSourceFile(const String& uri,
source = ReadString(/* is_canonical = */ false);
}
const Script& script = Script::Handle(
Z, Script::New(import_uri, uri, source, RawScript::kKernelTag));
const Script& script =
Script::Handle(Z, Script::New(import_uri, uri, source));
script.set_line_starts(line_starts);
if (source.IsNull() && line_starts.IsNull()) {
-3
View File
@@ -1053,7 +1053,6 @@ void ActivationFrame::ExtractTokenPositionFromAsyncClosure() {
}
ASSERT(!IsInterpreted());
ASSERT(script.kind() == RawScript::kKernelTag);
const intptr_t await_jump_var = GetAwaitJumpVariable();
if (await_jump_var < 0) {
return;
@@ -3063,7 +3062,6 @@ TokenPosition Debugger::ResolveBreakpointPos(bool in_bytecode,
const TokenPosition begin_pos = best_fit_pos;
TokenPosition end_of_line_pos;
ASSERT(script.kind() == RawScript::kKernelTag);
if (best_line == -1) {
script.GetTokenLocation(begin_pos, &best_line, NULL);
}
@@ -4379,7 +4377,6 @@ bool Debugger::IsAtAsyncJump(ActivationFrame* top_frame) {
}
ASSERT(!top_frame->IsInterpreted());
const Script& script = Script::Handle(zone, top_frame->SourceScript());
ASSERT(script.kind() == RawScript::kKernelTag);
const auto& yield_positions = GrowableObjectArray::Handle(
zone, script.GetYieldPositions(top_frame->function()));
// No yield statements
+1 -5
View File
@@ -822,11 +822,7 @@ void Exceptions::CreateAndThrowTypeError(TokenPosition location,
intptr_t column = -1;
ASSERT(!script.IsNull());
if (location.IsReal()) {
if (script.HasSource() || script.kind() == RawScript::kKernelTag) {
script.GetTokenLocation(location, &line, &column);
} else {
script.GetTokenLocation(location, &line, NULL);
}
script.GetTokenLocation(location, &line, &column);
}
// Initialize '_url', '_line', and '_column' arguments.
args.SetAt(0, String::Handle(zone, script.url()));
+2 -3
View File
@@ -2059,7 +2059,7 @@ RawScript* KernelLoader::LoadScriptAt(intptr_t index,
for (intptr_t i = 0; i < libs.Length(); i++) {
lib ^= libs.At(i);
script = lib.LookupScript(uri_string, /* useResolvedUri = */ true);
if (!script.IsNull() && script.kind() == RawScript::kKernelTag) {
if (!script.IsNull()) {
sources = script.Source();
line_starts = script.line_starts();
break;
@@ -2071,8 +2071,7 @@ RawScript* KernelLoader::LoadScriptAt(intptr_t index,
}
const Script& script =
Script::Handle(Z, Script::New(import_uri_string, uri_string, sources,
RawScript::kKernelTag));
Script::Handle(Z, Script::New(import_uri_string, uri_string, sources));
script.set_kernel_script_index(index);
script.set_kernel_program_info(kernel_program_info_);
script.set_line_starts(line_starts);
+41 -103
View File
@@ -8067,43 +8067,36 @@ RawString* Function::GetSource() const {
Zone* zone = Thread::Current()->zone();
const Script& func_script = Script::Handle(zone, script());
if (func_script.kind() == RawScript::kKernelTag) {
intptr_t from_line;
intptr_t from_col;
intptr_t to_line;
intptr_t to_col;
intptr_t to_length;
func_script.GetTokenLocation(token_pos(), &from_line, &from_col);
func_script.GetTokenLocation(end_token_pos(), &to_line, &to_col,
&to_length);
intptr_t from_line;
intptr_t from_col;
intptr_t to_line;
intptr_t to_col;
intptr_t to_length;
func_script.GetTokenLocation(token_pos(), &from_line, &from_col);
func_script.GetTokenLocation(end_token_pos(), &to_line, &to_col, &to_length);
if (to_length == 1) {
// Handle special cases for end tokens of closures (where we exclude the
// last token):
// (1) "foo(() => null, bar);": End token is `,', but we don't print it.
// (2) "foo(() => null);": End token is ')`, but we don't print it.
// (3) "var foo = () => null;": End token is `;', but in this case the
// token semicolon belongs to the assignment so we skip it.
const String& src = String::Handle(func_script.Source());
if (src.IsNull() || src.Length() == 0) {
return Symbols::OptimizedOut().raw();
}
uint16_t end_char = src.CharAt(end_token_pos().value());
if ((end_char == ',') || // Case 1.
(end_char == ')') || // Case 2.
(end_char == ';' &&
String::Handle(zone, name())
.Equals("<anonymous closure>"))) { // Case 3.
to_length = 0;
}
if (to_length == 1) {
// Handle special cases for end tokens of closures (where we exclude the
// last token):
// (1) "foo(() => null, bar);": End token is `,', but we don't print it.
// (2) "foo(() => null);": End token is ')`, but we don't print it.
// (3) "var foo = () => null;": End token is `;', but in this case the
// token semicolon belongs to the assignment so we skip it.
const String& src = String::Handle(func_script.Source());
if (src.IsNull() || src.Length() == 0) {
return Symbols::OptimizedOut().raw();
}
uint16_t end_char = src.CharAt(end_token_pos().value());
if ((end_char == ',') || // Case 1.
(end_char == ')') || // Case 2.
(end_char == ';' && String::Handle(zone, name())
.Equals("<anonymous closure>"))) { // Case 3.
to_length = 0;
}
return func_script.GetSnippet(from_line, from_col, to_line,
to_col + to_length);
}
UNREACHABLE();
return String::null();
return func_script.GetSnippet(from_line, from_col, to_line,
to_col + to_length);
}
// Construct fingerprint from token stream. The token stream contains also
@@ -9518,7 +9511,7 @@ void Script::LookupSourceAndLineStarts(Zone* zone) const {
for (intptr_t i = 0; i < libs.Length(); i++) {
lib ^= libs.At(i);
script = lib.LookupScript(uri, /* useResolvedUri = */ true);
if (!script.IsNull() && script.kind() == RawScript::kKernelTag) {
if (!script.IsNull()) {
const auto& source = String::Handle(zone, script.Source());
const auto& line_starts = TypedData::Handle(zone, script.line_starts());
if (!source.IsNull() || !line_starts.IsNull()) {
@@ -9534,7 +9527,6 @@ void Script::LookupSourceAndLineStarts(Zone* zone) const {
}
RawGrowableObjectArray* Script::GenerateLineNumberArray() const {
ASSERT(kind() == RawScript::kKernelTag);
Zone* zone = Thread::Current()->zone();
const GrowableObjectArray& info =
GrowableObjectArray::Handle(zone, GrowableObjectArray::New());
@@ -9589,25 +9581,6 @@ RawGrowableObjectArray* Script::GenerateLineNumberArray() const {
return info.raw();
}
const char* Script::GetKindAsCString() const {
switch (kind()) {
case RawScript::kScriptTag:
return "script";
case RawScript::kLibraryTag:
return "library";
case RawScript::kSourceTag:
return "source";
case RawScript::kEvaluateTag:
return "evaluate";
case RawScript::kKernelTag:
return "kernel";
default:
UNIMPLEMENTED();
}
UNREACHABLE();
return NULL;
}
void Script::set_url(const String& value) const {
StorePointer(&raw_ptr()->url_, value.raw());
}
@@ -9662,7 +9635,7 @@ RawTypedData* Script::line_starts() const {
RawArray* Script::debug_positions() const {
#if !defined(DART_PRECOMPILED_RUNTIME)
Array& debug_positions_array = Array::Handle(raw_ptr()->debug_positions_);
if (debug_positions_array.IsNull() && kind() == RawScript::kKernelTag) {
if (debug_positions_array.IsNull()) {
// This is created lazily. Now we need it.
kernel::CollectTokenPositionsFor(*this);
}
@@ -9670,23 +9643,17 @@ RawArray* Script::debug_positions() const {
return raw_ptr()->debug_positions_;
}
void Script::set_kind(RawScript::Kind value) const {
set_kind_and_tags(
RawScript::KindBits::update(value, raw_ptr()->kind_and_tags_));
}
void Script::set_kind_and_tags(uint8_t value) const {
StoreNonPointer(&raw_ptr()->kind_and_tags_, value);
void Script::set_flags(uint8_t value) const {
StoreNonPointer(&raw_ptr()->flags_, value);
}
void Script::SetLazyLookupSourceAndLineStarts(bool value) const {
set_kind_and_tags(RawScript::LazyLookupSourceAndLineStartsBit::update(
value, raw_ptr()->kind_and_tags_));
set_flags(RawScript::LazyLookupSourceAndLineStartsBit::update(
value, raw_ptr()->flags_));
}
bool Script::IsLazyLookupSourceAndLineStarts() const {
return RawScript::LazyLookupSourceAndLineStartsBit::decode(
raw_ptr()->kind_and_tags_);
return RawScript::LazyLookupSourceAndLineStartsBit::decode(raw_ptr()->flags_);
}
void Script::set_load_timestamp(int64_t value) const {
@@ -9715,31 +9682,12 @@ intptr_t Script::GetTokenLineUsingLineStarts(
return 0;
}
if (kind() == RawScript::kKernelTag) {
#if !defined(DART_PRECOMPILED_RUNTIME)
kernel::KernelLineStartsReader line_starts_reader(line_starts_data, zone);
return line_starts_reader.LineNumberForPosition(target_token_pos.value());
kernel::KernelLineStartsReader line_starts_reader(line_starts_data, zone);
return line_starts_reader.LineNumberForPosition(target_token_pos.value());
#else
return 0;
return 0;
#endif // !defined(DART_PRECOMPILED_RUNTIME)
} else {
ASSERT(line_starts_data.Length() > 0);
intptr_t offset = target_token_pos.Pos();
intptr_t min = 0;
intptr_t max = line_starts_data.Length() - 1;
// Binary search to find the line containing this offset.
while (min < max) {
int midpoint = (max - min + 1) / 2 + min;
int32_t token_pos = line_starts_data.GetInt32(midpoint * 4);
if (token_pos > offset) {
max = midpoint - 1;
} else {
min = midpoint;
}
}
return min + 1; // Line numbers start at 1.
}
}
#if !defined(DART_PRECOMPILED_RUNTIME)
@@ -9767,7 +9715,6 @@ void Script::GetTokenLocation(TokenPosition token_pos,
ASSERT(line != NULL);
Zone* zone = Thread::Current()->zone();
ASSERT(kind() == RawScript::kKernelTag);
LookupSourceAndLineStarts(zone);
if (line_starts() == TypedData::null()) {
// Scripts in the AOT snapshot do not have a line starts array.
@@ -9806,7 +9753,6 @@ void Script::GetTokenLocation(TokenPosition token_pos,
void Script::TokenRangeAtLine(intptr_t line_number,
TokenPosition* first_token_index,
TokenPosition* last_token_index) const {
ASSERT(kind() == RawScript::kKernelTag);
ASSERT(first_token_index != NULL && last_token_index != NULL);
ASSERT(line_number > 0);
@@ -9944,16 +9890,13 @@ RawScript* Script::New() {
return reinterpret_cast<RawScript*>(raw);
}
RawScript* Script::New(const String& url,
const String& source,
RawScript::Kind kind) {
return Script::New(url, url, source, kind);
RawScript* Script::New(const String& url, const String& source) {
return Script::New(url, url, source);
}
RawScript* Script::New(const String& url,
const String& resolved_url,
const String& source,
RawScript::Kind kind) {
const String& source) {
Thread* thread = Thread::Current();
Zone* zone = thread->zone();
const Script& result = Script::Handle(zone, Script::New());
@@ -9962,8 +9905,7 @@ RawScript* Script::New(const String& url,
String::Handle(zone, Symbols::New(thread, resolved_url)));
result.set_source(source);
result.SetLocationOffset(0, 0);
result.set_kind_and_tags(0);
result.set_kind(kind);
result.set_flags(0);
result.set_kernel_script_index(0);
result.set_load_timestamp(
FLAG_remove_script_timestamps_for_test ? 0 : OS::GetCurrentTimeMillis());
@@ -22009,11 +21951,7 @@ static void PrintStackTraceFrame(Zone* zone,
line = token_pos.value();
} else {
if (!script.IsNull() && token_pos.IsSourcePosition()) {
if (script.HasSource() || script.kind() == RawScript::kKernelTag) {
script.GetTokenLocation(token_pos.SourcePosition(), &line, &column);
} else {
script.GetTokenLocation(token_pos.SourcePosition(), &line, NULL);
}
script.GetTokenLocation(token_pos.SourcePosition(), &line, &column);
}
}
+3 -12
View File
@@ -3904,11 +3904,6 @@ class Script : public Object {
void LookupSourceAndLineStarts(Zone* zone) const;
RawGrowableObjectArray* GenerateLineNumberArray() const;
RawScript::Kind kind() const {
return RawScript::KindBits::decode(raw_ptr()->kind_and_tags_);
}
const char* GetKindAsCString() const;
intptr_t line_offset() const { return raw_ptr()->line_offset_; }
intptr_t col_offset() const { return raw_ptr()->col_offset_; }
@@ -3973,14 +3968,11 @@ class Script : public Object {
return RoundedAllocationSize(sizeof(RawScript));
}
static RawScript* New(const String& url,
const String& source,
RawScript::Kind kind);
static RawScript* New(const String& url, const String& source);
static RawScript* New(const String& url,
const String& resolved_url,
const String& source,
RawScript::Kind kind);
const String& source);
#if !defined(DART_PRECOMPILED_RUNTIME)
void LoadSourceFromKernel(const uint8_t* kernel_buffer,
@@ -3993,8 +3985,7 @@ class Script : public Object {
private:
void set_resolved_url(const String& value) const;
void set_source(const String& value) const;
void set_kind(RawScript::Kind value) const;
void set_kind_and_tags(uint8_t value) const;
void set_flags(uint8_t value) const;
void set_load_timestamp(int64_t value) const;
RawArray* debug_positions() const;
+1 -1
View File
@@ -426,7 +426,7 @@ void Script::PrintJSONImpl(JSONStream* stream, bool ref) const {
lib_id.ToCString(), encoded_uri, load_timestamp());
}
jsobj.AddPropertyStr("uri", uri);
jsobj.AddProperty("_kind", GetKindAsCString());
jsobj.AddProperty("_kind", "kernel");
if (ref) {
return;
}
+1 -2
View File
@@ -2262,8 +2262,7 @@ ISOLATE_UNIT_TEST_CASE(Script) {
const char* source_chars = "This will not compile.";
const String& url = String::Handle(String::New(url_chars));
const String& source = String::Handle(String::New(source_chars));
const Script& script =
Script::Handle(Script::New(url, source, RawScript::kScriptTag));
const Script& script = Script::Handle(Script::New(url, source));
EXPECT(!script.IsNull());
EXPECT(script.IsScript());
String& str = String::Handle(script.url());
+4 -8
View File
@@ -290,14 +290,10 @@ class ProfileStackWalker {
token_pos = token_pos.FromSynthetic();
}
String& str = String::Handle(zone);
if (script.kind() == RawScript::kKernelTag) {
intptr_t line = 0, column = 0, token_len = 0;
script.GetTokenLocation(token_pos, &line, &column, &token_len);
str = script.GetSnippet(line, column, line, column + token_len);
} else {
UNREACHABLE();
}
intptr_t line = 0, column = 0, token_len = 0;
script.GetTokenLocation(token_pos, &line, &column, &token_len);
const auto& str = String::Handle(
zone, script.GetSnippet(line, column, line, column + token_len));
return str.IsNull() ? NULL : str.ToCString();
}
+2 -12
View File
@@ -1139,17 +1139,8 @@ class RawField : public RawObject {
class RawScript : public RawObject {
public:
enum Kind {
kScriptTag = 0,
kLibraryTag,
kSourceTag,
kEvaluateTag,
kKernelTag,
};
enum {
kKindPos = 0,
kKindSize = 3,
kLazyLookupSourceAndLineStartsPos = kKindPos + kKindSize,
kLazyLookupSourceAndLineStartsPos = 0,
kLazyLookupSourceAndLineStartsSize = 1,
};
@@ -1185,13 +1176,12 @@ class RawScript : public RawObject {
int32_t line_offset_;
int32_t col_offset_;
using KindBits = BitField<uint8_t, Kind, kKindPos, kKindSize>;
using LazyLookupSourceAndLineStartsBit =
BitField<uint8_t,
bool,
kLazyLookupSourceAndLineStartsPos,
kLazyLookupSourceAndLineStartsSize>;
uint8_t kind_and_tags_;
uint8_t flags_;
intptr_t kernel_script_index_;
int64_t load_timestamp_;
+1 -2
View File
@@ -699,8 +699,7 @@ void AssemblerTest::Assemble() {
// assembler instructions that do runtime calls.
const char* kDummyScript = "assembler_test_dummy_function() {}";
const Script& script = Script::Handle(
Script::New(function_name, String::Handle(String::New(kDummyScript)),
RawScript::kSourceTag));
Script::New(function_name, String::Handle(String::New(kDummyScript))));
const Library& lib = Library::Handle(Library::CoreLibrary());
const Class& cls = Class::ZoneHandle(
Class::New(lib, function_name, script, TokenPosition::kMinSource));