Index: runtime/vm/dart_api_impl.cc |
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc |
index 638a4bf8dfed2312441630f99494df03e05262c2..61daa777f0707c8bb892261a75b4ce4fd34818c1 100644 |
--- a/runtime/vm/dart_api_impl.cc |
+++ b/runtime/vm/dart_api_impl.cc |
@@ -36,7 +36,6 @@ |
#include "vm/port.h" |
#include "vm/precompiler.h" |
#include "vm/profiler.h" |
-#include "vm/program_visitor.h" |
#include "vm/resolver.h" |
#include "vm/reusable_handles.h" |
#include "vm/service_event.h" |
@@ -113,9 +112,9 @@ const char* CanonicalFunction(const char* func) { |
// An object visitor which will iterate over all the function objects in the |
// heap and check if the result type and parameter types are canonicalized |
// or not. An assertion is raised if a type is not canonicalized. |
-class CheckFunctionTypesVisitor : public ObjectVisitor { |
+class FunctionVisitor : public ObjectVisitor { |
public: |
- explicit CheckFunctionTypesVisitor(Thread* thread) |
+ explicit FunctionVisitor(Thread* thread) |
: classHandle_(Class::Handle(thread->zone())), |
funcHandle_(Function::Handle(thread->zone())), |
typeHandle_(AbstractType::Handle(thread->zone())) {} |
@@ -1573,7 +1572,7 @@ Dart_CreateSnapshot(uint8_t** vm_isolate_snapshot_buffer, |
#if defined(DEBUG) |
I->heap()->CollectAllGarbage(); |
- CheckFunctionTypesVisitor check_canonical(T); |
+ FunctionVisitor check_canonical(T); |
I->heap()->IterateObjects(&check_canonical); |
#endif // #if defined(DEBUG) |
@@ -1612,7 +1611,7 @@ static Dart_Handle createLibrarySnapshot(Dart_Handle library, |
#if defined(DEBUG) |
I->heap()->CollectAllGarbage(); |
- CheckFunctionTypesVisitor check_canonical(T); |
+ FunctionVisitor check_canonical(T); |
I->heap()->IterateObjects(&check_canonical); |
#endif // #if defined(DEBUG) |
@@ -6427,175 +6426,47 @@ DART_EXPORT void Dart_SetThreadName(const char* name) { |
} |
-DART_EXPORT |
-Dart_Handle Dart_SaveJITFeedback(uint8_t** buffer, intptr_t* buffer_length) { |
-#if defined(DART_PRECOMPILED_RUNTIME) |
- return Api::NewError("No JIT feedback to save on an AOT runtime."); |
-#elif defined(PRODUCT) |
- // TOOD(rmacnak): We'd need to include the JSON printing code again. |
- return Api::NewError("Dart_SaveJITFeedback not supported in PRODUCT mode."); |
-#else |
- Thread* thread = Thread::Current(); |
- DARTSCOPE(thread); |
- Isolate* isolate = thread->isolate(); |
- Zone* zone = thread->zone(); |
+// The precompiler is included in dart_bootstrap and dart_noopt, and |
+// excluded from dart and dart_precompiled_runtime. |
+#if !defined(DART_PRECOMPILER) |
- if (buffer == NULL) { |
- RETURN_NULL_ERROR(buffer); |
- } |
- if (buffer_length == NULL) { |
- RETURN_NULL_ERROR(buffer_length); |
- } |
- |
- JSONStream js_stream; |
- { |
- JSONObject js_profile(&js_stream); |
- js_profile.AddProperty("vmVersion", Version::CommitString()); |
- js_profile.AddProperty("asserts", FLAG_enable_asserts); |
- js_profile.AddProperty("typeChecks", FLAG_enable_type_checks); |
- |
- { |
- JSONArray js_scripts(&js_profile, "scripts"); |
- |
- const GrowableObjectArray& libraries = GrowableObjectArray::Handle( |
- zone, isolate->object_store()->libraries()); |
- Library& library = Library::Handle(zone); |
- Array& scripts = Array::Handle(zone); |
- Script& script = Script::Handle(zone); |
- String& uri = String::Handle(zone); |
- for (intptr_t i = 0; i < libraries.Length(); i++) { |
- library ^= libraries.At(i); |
- scripts = library.LoadedScripts(); |
- for (intptr_t j = 0; j < scripts.Length(); j++) { |
- script ^= scripts.At(j); |
- JSONObject js_script(&js_scripts); |
- uri = script.url(); |
- js_script.AddProperty("uri", uri.ToCString()); |
- int64_t fp = script.SourceFingerprint(); |
- js_script.AddProperty64("checksum", fp); |
- } |
- } |
- } |
+DART_EXPORT Dart_Handle |
+Dart_Precompile(Dart_QualifiedFunctionName entry_points[], bool reset_fields) { |
+ return Api::NewError( |
+ "This VM was built without support for AOT compilation."); |
+} |
- { |
- JSONArray js_classes(&js_profile, "classes"); |
- |
- ClassTable* classes = isolate->class_table(); |
- Class& cls = Class::Handle(zone); |
- Library& library = Library::Handle(zone); |
- String& uri = String::Handle(zone); |
- String& name = String::Handle(zone); |
- for (intptr_t cid = kNumPredefinedCids; cid < classes->NumCids(); cid++) { |
- if (!classes->HasValidClassAt(cid)) continue; |
- cls ^= classes->At(cid); |
- library = cls.library(); |
- JSONObject js_class(&js_classes); |
- js_class.AddProperty("cid", cid); |
- uri = library.url(); |
- js_class.AddProperty("uri", uri.ToCString()); |
- name = cls.Name(); |
- name = String::RemovePrivateKey(name); |
- js_class.AddProperty("name", name.ToCString()); |
- } |
- } |
- { |
- JSONArray js_functions(&js_profile, "functions"); |
- |
- class JITFeedbackFunctionVisitor : public FunctionVisitor { |
- public: |
- JITFeedbackFunctionVisitor(JSONArray* js_functions, Zone* zone) |
- : js_functions_(js_functions), |
- function_(Function::Handle(zone)), |
- owner_(Class::Handle(zone)), |
- name_(String::Handle(zone)), |
- ic_datas_(Array::Handle(zone)), |
- ic_data_(ICData::Handle(zone)), |
- entry_(Object::Handle(zone)) {} |
- |
- void Visit(const Function& function) { |
- if (function.usage_counter() == 0) return; |
- |
- JSONObject js_function(js_functions_); |
- name_ = function.name(); |
- name_ = String::RemovePrivateKey(name_); |
- js_function.AddProperty("name", name_.ToCString()); |
- owner_ ^= function.Owner(); |
- js_function.AddProperty("class", owner_.id()); |
- js_function.AddProperty("tokenPos", function.token_pos().value()); |
- js_function.AddProperty("kind", |
- static_cast<intptr_t>(function.kind())); |
- intptr_t usage = function.usage_counter(); |
- if (usage < 0) { |
- // Function was in the background compiler's queue. |
- usage = FLAG_optimization_counter_threshold; |
- } |
- js_function.AddProperty("usageCounter", usage); |
- |
- ic_datas_ = function.ic_data_array(); |
- JSONArray js_icdatas(&js_function, "ics"); |
- if (ic_datas_.IsNull()) return; |
- |
- for (intptr_t j = 0; j < ic_datas_.Length(); j++) { |
- entry_ = ic_datas_.At(j); |
- if (!entry_.IsICData()) continue; // Skip edge counters. |
- ic_data_ ^= entry_.raw(); |
- |
- JSONObject js_icdata(&js_icdatas); |
- js_icdata.AddProperty("deoptId", ic_data_.deopt_id()); |
- name_ = ic_data_.target_name(); |
- name_ = String::RemovePrivateKey(name_); |
- js_icdata.AddProperty("selector", name_.ToCString()); |
- js_icdata.AddProperty("isStaticCall", ic_data_.is_static_call()); |
- intptr_t num_args_checked = ic_data_.NumArgsTested(); |
- js_icdata.AddProperty("argsTested", num_args_checked); |
- JSONArray js_entries(&js_icdata, "entries"); |
- for (intptr_t check = 0; check < ic_data_.NumberOfChecks(); |
- check++) { |
- GrowableArray<intptr_t> class_ids(num_args_checked); |
- ic_data_.GetClassIdsAt(check, &class_ids); |
- for (intptr_t k = 0; k < num_args_checked; k++) { |
- ASSERT(class_ids[k] != kIllegalCid); |
- js_entries.AddValue(class_ids[k]); |
- } |
- js_entries.AddValue(ic_data_.GetCountAt(check)); |
- } |
- } |
- } |
+DART_EXPORT Dart_Handle |
+Dart_CreatePrecompiledSnapshotAssembly(uint8_t** assembly_buffer, |
+ intptr_t* assembly_size) { |
+ return Api::NewError( |
+ "This VM was built without support for AOT compilation."); |
+ return 0; |
+} |
- private: |
- JSONArray* js_functions_; |
- Function& function_; |
- Class& owner_; |
- String& name_; |
- Array& ic_datas_; |
- ICData& ic_data_; |
- Object& entry_; |
- }; |
- |
- JITFeedbackFunctionVisitor visitor(&js_functions, zone); |
- ProgramVisitor::VisitFunctions(&visitor); |
- } |
- } |
- js_stream.Steal(reinterpret_cast<char**>(buffer), buffer_length); |
- return Api::Success(); |
-#endif |
+DART_EXPORT Dart_Handle |
+Dart_CreatePrecompiledSnapshotBlob(uint8_t** vm_isolate_snapshot_buffer, |
+ intptr_t* vm_isolate_snapshot_size, |
+ uint8_t** isolate_snapshot_buffer, |
+ intptr_t* isolate_snapshot_size, |
+ uint8_t** instructions_blob_buffer, |
+ intptr_t* instructions_blob_size, |
+ uint8_t** rodata_blob_buffer, |
+ intptr_t* rodata_blob_size) { |
+ return Api::NewError( |
+ "This VM was built without support for AOT compilation."); |
} |
+#else // DART_PRECOMPILER |
DART_EXPORT Dart_Handle |
-Dart_Precompile(Dart_QualifiedFunctionName entry_points[], |
- bool reset_fields, |
- uint8_t* jit_feedback, |
- intptr_t jit_feedback_length) { |
+Dart_Precompile(Dart_QualifiedFunctionName entry_points[], bool reset_fields) { |
#if defined(TARGET_ARCH_IA32) |
- return Api::NewError("AOT compilation is not supported on IA32."); |
+ return Api::NewError("Precompilation is not supported on IA32."); |
#elif defined(TARGET_ARCH_DBC) |
- return Api::NewError("AOT compilation is not supported on DBC."); |
-#elif !defined(DART_PRECOMPILER) |
- return Api::NewError( |
- "This VM was built without support for AOT compilation."); |
+ return Api::NewError("Precompilation is not supported on DBC."); |
#else |
API_TIMELINE_BEGIN_END; |
DARTSCOPE(Thread::Current()); |
@@ -6607,8 +6478,8 @@ Dart_Precompile(Dart_QualifiedFunctionName entry_points[], |
return result; |
} |
CHECK_CALLBACK_STATE(T); |
- const Error& error = Error::Handle(Precompiler::CompileAll( |
- entry_points, reset_fields, jit_feedback, jit_feedback_length)); |
+ const Error& error = |
+ Error::Handle(Precompiler::CompileAll(entry_points, reset_fields)); |
if (!error.IsNull()) { |
return Api::NewHandle(T, error.raw()); |
} |
@@ -6621,12 +6492,9 @@ DART_EXPORT Dart_Handle |
Dart_CreatePrecompiledSnapshotAssembly(uint8_t** assembly_buffer, |
intptr_t* assembly_size) { |
#if defined(TARGET_ARCH_IA32) |
- return Api::NewError("AOT compilation is not supported on IA32."); |
+ return Api::NewError("Precompilation is not supported on IA32."); |
#elif defined(TARGET_ARCH_DBC) |
- return Api::NewError("AOT compilation is not supported on DBC."); |
-#elif !defined(DART_PRECOMPILER) |
- return Api::NewError( |
- "This VM was built without support for AOT compilation."); |
+ return Api::NewError("Precompilation is not supported on DBC."); |
#else |
API_TIMELINE_DURATION; |
DARTSCOPE(Thread::Current()); |
@@ -6672,12 +6540,9 @@ Dart_CreatePrecompiledSnapshotBlob(uint8_t** vm_isolate_snapshot_buffer, |
uint8_t** rodata_blob_buffer, |
intptr_t* rodata_blob_size) { |
#if defined(TARGET_ARCH_IA32) |
- return Api::NewError("AOT compilation is not supported on IA32."); |
+ return Api::NewError("Precompilation is not supported on IA32."); |
#elif defined(TARGET_ARCH_DBC) |
- return Api::NewError("AOT compilation is not supported on DBC."); |
-#elif !defined(DART_PRECOMPILER) |
- return Api::NewError( |
- "This VM was built without support for AOT compilation."); |
+ return Api::NewError("Precompilation is not supported on DBC."); |
#else |
API_TIMELINE_DURATION; |
DARTSCOPE(Thread::Current()); |
@@ -6731,6 +6596,7 @@ Dart_CreatePrecompiledSnapshotBlob(uint8_t** vm_isolate_snapshot_buffer, |
return Api::Success(); |
#endif |
} |
+#endif // DART_PRECOMPILER |
DART_EXPORT Dart_Handle Dart_PrecompileJIT() { |