Use ArrayRef<> instead of ArraySlice<> in JVMTI.
And clean up ArrayRef<> a little bit.
Test: m test-art-host-gtest
Test: testrunner.py --host
Change-Id: I4832006b991fc87b2baec9aa605ff70653b029b3
diff --git a/runtime/base/array_ref.h b/runtime/base/array_ref.h
index 00b9bad..630a036 100644
--- a/runtime/base/array_ref.h
+++ b/runtime/base/array_ref.h
@@ -40,17 +40,17 @@
template <typename T>
class ArrayRef {
public:
- typedef T value_type;
- typedef T& reference;
- typedef const T& const_reference;
- typedef T* pointer;
- typedef const T* const_pointer;
- typedef T* iterator;
- typedef const T* const_iterator;
- typedef std::reverse_iterator<iterator> reverse_iterator;
- typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- typedef ptrdiff_t difference_type;
- typedef size_t size_type;
+ using value_type = T;
+ using reference = T&;
+ using const_reference = const T&;
+ using pointer = T*;
+ using const_pointer = const T*;
+ using iterator = T*;
+ using const_iterator = const T*;
+ using reverse_iterator = std::reverse_iterator<iterator>;
+ using const_reverse_iterator = std::reverse_iterator<const_iterator>;
+ using difference_type = ptrdiff_t;
+ using size_type = size_t;
// Constructors.
@@ -140,22 +140,22 @@
}
reference front() {
- DCHECK_NE(size_, 0u);
+ DCHECK(!empty());
return array_[0];
}
const_reference front() const {
- DCHECK_NE(size_, 0u);
+ DCHECK(!empty());
return array_[0];
}
reference back() {
- DCHECK_NE(size_, 0u);
+ DCHECK(!empty());
return array_[size_ - 1u];
}
const_reference back() const {
- DCHECK_NE(size_, 0u);
+ DCHECK(!empty());
return array_[size_ - 1u];
}
@@ -165,14 +165,17 @@
ArrayRef SubArray(size_type pos) {
return SubArray(pos, size() - pos);
}
+
ArrayRef<const T> SubArray(size_type pos) const {
return SubArray(pos, size() - pos);
}
+
ArrayRef SubArray(size_type pos, size_type length) {
DCHECK_LE(pos, size());
DCHECK_LE(length, size() - pos);
return ArrayRef(data() + pos, length);
}
+
ArrayRef<const T> SubArray(size_type pos, size_type length) const {
DCHECK_LE(pos, size());
DCHECK_LE(length, size() - pos);
diff --git a/runtime/openjdkjvmti/art_jvmti.h b/runtime/openjdkjvmti/art_jvmti.h
index 2a2aa4c..c6f53a6 100644
--- a/runtime/openjdkjvmti/art_jvmti.h
+++ b/runtime/openjdkjvmti/art_jvmti.h
@@ -37,7 +37,6 @@
#include <jni.h>
-#include "base/array_slice.h"
#include "base/casts.h"
#include "base/logging.h"
#include "base/macros.h"
diff --git a/runtime/openjdkjvmti/ti_class.cc b/runtime/openjdkjvmti/ti_class.cc
index 0aa93df..d67769e 100644
--- a/runtime/openjdkjvmti/ti_class.cc
+++ b/runtime/openjdkjvmti/ti_class.cc
@@ -37,6 +37,7 @@
#include <unordered_set>
#include "art_jvmti.h"
+#include "base/array_ref.h"
#include "base/macros.h"
#include "class_table-inl.h"
#include "class_linker.h"
@@ -83,7 +84,7 @@
REQUIRES_SHARED(art::Locks::mutator_lock_) {
// Make the mmap
std::string error_msg;
- art::ArraySlice<const unsigned char> final_data(final_dex_data, final_len);
+ art::ArrayRef<const unsigned char> final_data(final_dex_data, final_len);
std::unique_ptr<art::MemMap> map(Redefiner::MoveDataToMemMap(orig_location,
final_data,
&error_msg));
diff --git a/runtime/openjdkjvmti/ti_class_definition.cc b/runtime/openjdkjvmti/ti_class_definition.cc
index 180895b..8e8ab19 100644
--- a/runtime/openjdkjvmti/ti_class_definition.cc
+++ b/runtime/openjdkjvmti/ti_class_definition.cc
@@ -56,7 +56,7 @@
// be that agents were removed in the mean-time so we still have a different dex file. The dex
// checksum means this is likely to be fairly fast.
return static_cast<jint>(original_dex_file_.size()) != dex_len_ ||
- memcmp(&original_dex_file_.At(0), dex_data_.get(), dex_len_) != 0;
+ memcmp(original_dex_file_.data(), dex_data_.get(), dex_len_) != 0;
}
jvmtiError ArtClassDefinition::InitCommon(ArtJvmTiEnv* env, jclass klass) {
@@ -152,12 +152,12 @@
unsigned char* original_data_memory = nullptr;
res = CopyDataIntoJvmtiBuffer(env, dex_data_.get(), dex_len_, &original_data_memory);
original_dex_file_memory_ = MakeJvmtiUniquePtr(env, original_data_memory);
- original_dex_file_ = art::ArraySlice<const unsigned char>(original_data_memory, dex_len_);
+ original_dex_file_ = art::ArrayRef<const unsigned char>(original_data_memory, dex_len_);
} else {
// We know that we have been redefined at least once (there is an original_dex_file set in
// the class) so we can just use the current dex file directly.
const art::DexFile& dex_file = m_klass->GetDexFile();
- original_dex_file_ = art::ArraySlice<const unsigned char>(dex_file.Begin(), dex_file.Size());
+ original_dex_file_ = art::ArrayRef<const unsigned char>(dex_file.Begin(), dex_file.Size());
}
return res;
}
@@ -168,7 +168,7 @@
return res;
}
unsigned char* new_data = nullptr;
- original_dex_file_ = art::ArraySlice<const unsigned char>(def.class_bytes, def.class_byte_count);
+ original_dex_file_ = art::ArrayRef<const unsigned char>(def.class_bytes, def.class_byte_count);
redefined_ = true;
dex_len_ = def.class_byte_count;
res = CopyDataIntoJvmtiBuffer(env, def.class_bytes, def.class_byte_count, /*out*/ &new_data);
diff --git a/runtime/openjdkjvmti/ti_class_definition.h b/runtime/openjdkjvmti/ti_class_definition.h
index 43d0c3f..2c268dd 100644
--- a/runtime/openjdkjvmti/ti_class_definition.h
+++ b/runtime/openjdkjvmti/ti_class_definition.h
@@ -34,6 +34,8 @@
#include "art_jvmti.h"
+#include "base/array_ref.h"
+
namespace openjdkjvmti {
// A struct that stores data needed for redefining/transforming classes. This structure should only
@@ -68,12 +70,12 @@
}
}
- art::ArraySlice<const unsigned char> GetNewOriginalDexFile() const {
+ art::ArrayRef<const unsigned char> GetNewOriginalDexFile() const {
DCHECK(IsInitialized());
if (redefined_) {
return original_dex_file_;
} else {
- return art::ArraySlice<const unsigned char>();
+ return art::ArrayRef<const unsigned char>();
}
}
@@ -103,9 +105,9 @@
return protection_domain_;
}
- art::ArraySlice<const unsigned char> GetDexData() const {
+ art::ArrayRef<const unsigned char> GetDexData() const {
DCHECK(IsInitialized());
- return art::ArraySlice<const unsigned char>(dex_data_.get(), dex_len_);
+ return art::ArrayRef<const unsigned char>(dex_data_.get(), dex_len_);
}
private:
@@ -118,7 +120,7 @@
jint dex_len_;
JvmtiUniquePtr<unsigned char> dex_data_;
JvmtiUniquePtr<unsigned char> original_dex_file_memory_;
- art::ArraySlice<const unsigned char> original_dex_file_;
+ art::ArrayRef<const unsigned char> original_dex_file_;
bool redefined_;
DISALLOW_COPY_AND_ASSIGN(ArtClassDefinition);
diff --git a/runtime/openjdkjvmti/ti_class_loader.cc b/runtime/openjdkjvmti/ti_class_loader.cc
index 5544dde..205046c 100644
--- a/runtime/openjdkjvmti/ti_class_loader.cc
+++ b/runtime/openjdkjvmti/ti_class_loader.cc
@@ -37,7 +37,6 @@
#include "art_field-inl.h"
#include "art_jvmti.h"
-#include "base/array_slice.h"
#include "base/logging.h"
#include "dex_file.h"
#include "dex_file_types.h"
diff --git a/runtime/openjdkjvmti/ti_redefine.cc b/runtime/openjdkjvmti/ti_redefine.cc
index b382a3e..341de0d 100644
--- a/runtime/openjdkjvmti/ti_redefine.cc
+++ b/runtime/openjdkjvmti/ti_redefine.cc
@@ -38,7 +38,7 @@
#include "art_field-inl.h"
#include "art_method-inl.h"
#include "art_jvmti.h"
-#include "base/array_slice.h"
+#include "base/array_ref.h"
#include "base/logging.h"
#include "class_linker-inl.h"
#include "debugger.h"
@@ -265,7 +265,7 @@
// Moves dex data to an anonymous, read-only mmap'd region.
std::unique_ptr<art::MemMap> Redefiner::MoveDataToMemMap(const std::string& original_location,
- art::ArraySlice<const unsigned char> data,
+ art::ArrayRef<const unsigned char> data,
std::string* error_msg) {
std::unique_ptr<art::MemMap> map(art::MemMap::MapAnonymous(
StringPrintf("%s-transformed", original_location.c_str()).c_str(),
@@ -278,7 +278,7 @@
if (map == nullptr) {
return map;
}
- memcpy(map->Begin(), &data.At(0), data.size());
+ memcpy(map->Begin(), data.data(), data.size());
// Make the dex files mmap read only. This matches how other DexFiles are mmaped and prevents
// programs from corrupting it.
map->Protect(PROT_READ);
@@ -290,7 +290,7 @@
jclass klass,
const art::DexFile* redefined_dex_file,
const char* class_sig,
- art::ArraySlice<const unsigned char> orig_dex_file) :
+ art::ArrayRef<const unsigned char> orig_dex_file) :
driver_(driver),
klass_(klass),
dex_file_(redefined_dex_file),
@@ -493,7 +493,7 @@
if (original_dex_file_.size() != 0) {
return art::mirror::ByteArray::AllocateAndFill(
driver_->self_,
- reinterpret_cast<const signed char*>(&original_dex_file_.At(0)),
+ reinterpret_cast<const signed char*>(original_dex_file_.data()),
original_dex_file_.size());
}
diff --git a/runtime/openjdkjvmti/ti_redefine.h b/runtime/openjdkjvmti/ti_redefine.h
index 5e31627..ec4a8b2 100644
--- a/runtime/openjdkjvmti/ti_redefine.h
+++ b/runtime/openjdkjvmti/ti_redefine.h
@@ -38,7 +38,7 @@
#include "art_jvmti.h"
#include "art_method.h"
-#include "base/array_slice.h"
+#include "base/array_ref.h"
#include "class_linker.h"
#include "dex_file.h"
#include "gc_root-inl.h"
@@ -95,7 +95,7 @@
static jvmtiError IsModifiableClass(jvmtiEnv* env, jclass klass, jboolean* is_redefinable);
static std::unique_ptr<art::MemMap> MoveDataToMemMap(const std::string& original_location,
- art::ArraySlice<const unsigned char> data,
+ art::ArrayRef<const unsigned char> data,
std::string* error_msg);
private:
@@ -105,7 +105,7 @@
jclass klass,
const art::DexFile* redefined_dex_file,
const char* class_sig,
- art::ArraySlice<const unsigned char> orig_dex_file)
+ art::ArrayRef<const unsigned char> orig_dex_file)
REQUIRES_SHARED(art::Locks::mutator_lock_);
// NO_THREAD_SAFETY_ANALYSIS so we can unlock the class in the destructor.
@@ -205,7 +205,7 @@
jclass klass_;
std::unique_ptr<const art::DexFile> dex_file_;
std::string class_sig_;
- art::ArraySlice<const unsigned char> original_dex_file_;
+ art::ArrayRef<const unsigned char> original_dex_file_;
};
jvmtiError result_;
diff --git a/runtime/openjdkjvmti/transform.cc b/runtime/openjdkjvmti/transform.cc
index 15d8dd0..1d7f137 100644
--- a/runtime/openjdkjvmti/transform.cc
+++ b/runtime/openjdkjvmti/transform.cc
@@ -35,6 +35,7 @@
#include "transform.h"
#include "art_method.h"
+#include "base/array_ref.h"
#include "class_linker.h"
#include "dex_file.h"
#include "dex_file_types.h"
@@ -70,7 +71,7 @@
for (ArtClassDefinition& def : *definitions) {
jint new_len = -1;
unsigned char* new_data = nullptr;
- art::ArraySlice<const unsigned char> dex_data = def.GetDexData();
+ art::ArrayRef<const unsigned char> dex_data = def.GetDexData();
event_handler->DispatchEvent<ArtJvmtiEvent::kClassFileLoadHookRetransformable>(
self,
GetJniEnv(env),
@@ -79,7 +80,7 @@
def.GetName().c_str(),
def.GetProtectionDomain(),
static_cast<jint>(dex_data.size()),
- &dex_data.At(0),
+ dex_data.data(),
/*out*/&new_len,
/*out*/&new_data);
def.SetNewDexData(env, new_len, new_data);