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..69529d3934aea122f25358b35d0c474220d0e7e6 |
--- /dev/null |
+++ b/runtime/vm/source_report.h |
@@ -0,0 +1,106 @@ |
+// 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 (some subrange of) a script. |
+ // |
+ // If script is null, then the report is generated for all scripts |
+ // in the isolate. |
+ void PrintJSON(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), 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_ |