From 815873ecc312b1d231acce71e1a16f42cdaf09f2 Mon Sep 17 00:00:00 2001 From: Mathieu Chartier Date: Thu, 13 Feb 2014 18:02:13 -0800 Subject: Change root visitor to use Object**. Simplifies code and improves the performance of root visiting since we usually don't need to check to see if the object moved. Change-Id: Iba998f5a15ae1fa1b53ca5226dd2168a411196cf --- runtime/transaction.cc | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'runtime/transaction.cc') diff --git a/runtime/transaction.cc b/runtime/transaction.cc index 6adcfec..019a322 100644 --- a/runtime/transaction.cc +++ b/runtime/transaction.cc @@ -173,7 +173,8 @@ void Transaction::VisitObjectLogs(RootCallback* callback, void* arg) { for (auto it : object_logs_) { it.second.VisitRoots(callback, arg); mirror::Object* old_root = it.first; - mirror::Object* new_root = callback(old_root, arg, 0, kRootUnknown); + mirror::Object* new_root = old_root; + callback(&new_root, arg, 0, kRootUnknown); if (new_root != old_root) { moving_roots.push_back(std::make_pair(old_root, new_root)); } @@ -201,7 +202,8 @@ void Transaction::VisitArrayLogs(RootCallback* callback, void* arg) { if (old_root->IsObjectArray()) { it.second.VisitRoots(callback, arg); } - mirror::Array* new_root = down_cast(callback(old_root, arg, 0, kRootUnknown)); + mirror::Array* new_root = old_root; + callback(reinterpret_cast(&new_root), arg, 0, kRootUnknown); if (new_root != old_root) { moving_roots.push_back(std::make_pair(old_root, new_root)); } @@ -306,8 +308,10 @@ void Transaction::ObjectLog::VisitRoots(RootCallback* callback, void* arg) { for (auto it : field_values_) { FieldValue& field_value = it.second; if (field_value.kind == ObjectLog::kReference) { - mirror::Object* obj = reinterpret_cast(static_cast(field_value.value)); - field_value.value = reinterpret_cast(callback(obj, arg, 0, kRootUnknown)); + mirror::Object* obj = + reinterpret_cast(static_cast(field_value.value)); + callback(&obj, arg, 0, kRootUnknown); + field_value.value = reinterpret_cast(obj); } } } @@ -350,7 +354,7 @@ void Transaction::InternStringLog::Undo(InternTable* intern_table) { } void Transaction::InternStringLog::VisitRoots(RootCallback* callback, void* arg) { - str_ = down_cast(callback(str_, arg, 0, kRootInternedString)); + callback(reinterpret_cast(&str_), arg, 0, kRootInternedString); } void Transaction::ArrayLog::LogValue(size_t index, uint64_t value) { @@ -412,7 +416,8 @@ void Transaction::ArrayLog::UndoArrayWrite(mirror::Array* array, Primitive::Type void Transaction::ArrayLog::VisitRoots(RootCallback* callback, void* arg) { for (auto& it : array_values_) { mirror::Object* obj = reinterpret_cast(static_cast(it.second)); - it.second = reinterpret_cast(callback(obj, arg, 0, kRootUnknown)); + callback(&obj, arg, 0, kRootUnknown); + it.second = reinterpret_cast(obj); } } -- cgit v1.1