Chromium Code Reviews| Index: runtime/vm/source_report.h |
| diff --git a/runtime/vm/source_report.h b/runtime/vm/source_report.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..5ea51db9f980e4bda91e61668cf5d99dbd2855cb |
| --- /dev/null |
| +++ b/runtime/vm/source_report.h |
| @@ -0,0 +1,110 @@ |
| +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| +// for details. All rights reserved. Use of this source code is governed by a |
| +// BSD-style license that can be found in the LICENSE file. |
| + |
| +#ifndef VM_SOURCE_REPORT_H_ |
| +#define VM_SOURCE_REPORT_H_ |
| + |
| +#include "vm/allocation.h" |
| +#include "vm/flags.h" |
| +#include "vm/hash_map.h" |
| +#include "vm/object.h" |
| + |
| +namespace dart { |
| + |
| +// A SourceReport object is used to generate reports about the program |
| +// source code, with information associated with source token |
| +// positions. There are multiple possible kinds of reports. |
| +class SourceReport { |
| + public: |
| + enum ReportKind { |
| + kCallSites, |
| + kCoverage, |
| + }; |
| + |
| + enum CompileMode { |
| + kNoCompile, |
| + kForceCompile |
| + }; |
| + |
| + explicit SourceReport(ReportKind report_kind, |
| + CompileMode compile = kNoCompile); |
| + |
| + // Generate a source report for all scripts in an isolate. |
| + void PrintJSON(JSONStream* js); |
| + |
| + // Generate a source report for (some subrange of) a script. |
| + void PrintJSONForScript(JSONStream* js, const Script& script, |
| + intptr_t start_pos = -1, intptr_t end_pos = -1); |
| + |
| + private: |
| + void Init(Thread* thread, const Script* script, |
| + intptr_t start_pos, intptr_t end_pos); |
| + |
| + Thread* thread() const { return thread_; } |
| + Zone* zone() const { return thread_->zone(); } |
| + |
| + bool ShouldSkipFunction(const Function& func); |
| + intptr_t GetScriptIndex(const Script& script); |
| + bool ScriptIsLoadedByLibrary(const Script& script, const Library& lib); |
| + |
| + void PrintCallSitesData(JSONObject* jsobj, |
| + const Function& func, const Code& code); |
| + void PrintCoverageData(JSONObject* jsobj, |
| + const Function& func, const Code& code); |
| + void PrintScriptTable(JSONArray* jsarr); |
| + |
| + void VisitFunction(JSONArray* jsarr, const Function& func); |
| + void VisitLibrary(JSONArray* jsarr, const Library& lib); |
| + void VisitClosures(JSONArray* jsarr); |
| + |
| + // An entry in the script table. |
| + struct ScriptTableEntry { |
| + ScriptTableEntry() { |
| + key = NULL; |
|
Cutch
2015/12/17 21:31:07
use initializer list syntax instead..
: key(NULL).
turnidge
2015/12/17 21:48:01
Done.
|
| + index = -1; |
| + script = NULL; |
| + } |
| + |
| + const String* key; |
| + intptr_t index; |
| + const Script* script; |
| + }; |
| + |
| + // Needed for DirectChainedHashMap. |
| + struct ScriptTableTrait { |
| + typedef ScriptTableEntry* Value; |
| + typedef const String* Key; |
| + typedef ScriptTableEntry* Pair; |
| + |
| + static Key KeyOf(Pair kv) { |
| + return kv->key; |
| + } |
| + |
| + static Value ValueOf(Pair kv) { |
| + return kv; |
| + } |
| + |
| + static inline intptr_t Hashcode(Key key) { |
| + return key->Hash(); |
| + } |
| + |
| + static inline bool IsKeyEqual(Pair kv, Key key) { |
| + return kv->key->Equals(*key); |
| + } |
| + }; |
| + |
| + ReportKind report_kind_; |
| + CompileMode compile_mode_; |
| + Thread* thread_; |
| + const Script* script_; |
| + intptr_t start_pos_; |
| + intptr_t end_pos_; |
| + GrowableArray<ScriptTableEntry> script_table_entries_; |
| + DirectChainedHashMap<ScriptTableTrait> script_table_; |
| + intptr_t next_script_index_; |
| +}; |
| + |
| +} // namespace dart |
| + |
| +#endif // VM_SOURCE_REPORT_H_ |