OSDN Git Service

ART: Extracts an utility function of the duplicated code
authorDmitry Petrochenko <dmitry.petrochenko@intel.com>
Fri, 18 Apr 2014 07:53:09 +0000 (14:53 +0700)
committerAndreas Gampe <agampe@google.com>
Thu, 24 Apr 2014 15:35:30 +0000 (08:35 -0700)
This patch introduces an utility function 'DataOffsetOfType' in
'mirror::Array' class that calculates the data offset at given index
in an array of given type.

Change-Id: Idb19558653c70a129245f220f0fbb553f898865b
Signed-off-by: Dmitry Petrochenko <dmitry.petrochenko@intel.com>
compiler/dex/quick/gen_common.cc
runtime/mirror/array.h

index aa9b2a4..bd662b7 100644 (file)
@@ -519,8 +519,7 @@ void Mir2Lir::GenSput(MIR* mir, RegLocation rl_src, bool is_long_or_double,
       r_base = TargetReg(kArg0);
       LockTemp(r_base);
       LoadRefDisp(r_method, mirror::ArtMethod::DexCacheResolvedTypesOffset().Int32Value(), r_base);
-      LoadRefDisp(r_base, mirror::Array::DataOffset(sizeof(mirror::Object*)).Int32Value() +
-                   sizeof(int32_t*) * field_info.StorageIndex(), r_base);
+      LoadRefDisp(r_base, mirror::Array::DataOffsetOfType<mirror::Object>(field_info.StorageIndex()), r_base);
       // r_base now points at static storage (Class*) or NULL if the type is not yet resolved.
       if (!field_info.IsInitialized() &&
           (mir->optimization_flags & MIR_IGNORE_CLINIT_CHECK) == 0) {
@@ -608,8 +607,7 @@ void Mir2Lir::GenSget(MIR* mir, RegLocation rl_dest,
       r_base = TargetReg(kArg0);
       LockTemp(r_base);
       LoadRefDisp(r_method, mirror::ArtMethod::DexCacheResolvedTypesOffset().Int32Value(), r_base);
-      LoadRefDisp(r_base, mirror::Array::DataOffset(sizeof(mirror::Object*)).Int32Value() +
-                  sizeof(int32_t*) * field_info.StorageIndex(), r_base);
+      LoadRefDisp(r_base, mirror::Array::DataOffsetOfType<mirror::Object>(field_info.StorageIndex()), r_base);
       // r_base now points at static storage (Class*) or NULL if the type is not yet resolved.
       if (!field_info.IsInitialized() &&
           (mir->optimization_flags & MIR_IGNORE_CLINIT_CHECK) == 0) {
@@ -865,9 +863,7 @@ void Mir2Lir::GenConstClass(uint32_t type_idx, RegLocation rl_dest) {
     int32_t dex_cache_offset =
         mirror::ArtMethod::DexCacheResolvedTypesOffset().Int32Value();
     Load32Disp(rl_method.reg, dex_cache_offset, res_reg);
-    int32_t offset_of_type =
-        mirror::Array::DataOffset(sizeof(mirror::Class*)).Int32Value() + (sizeof(mirror::Class*)
-                          * type_idx);
+    int32_t offset_of_type = mirror::Array::DataOffsetOfType<mirror::Class>(type_idx);
     Load32Disp(res_reg, offset_of_type, rl_result.reg);
     if (!cu_->compiler_driver->CanAssumeTypeIsPresentInDexCache(*cu_->dex_file,
         type_idx) || SLOW_TYPE_PATH) {
@@ -914,8 +910,7 @@ void Mir2Lir::GenConstClass(uint32_t type_idx, RegLocation rl_dest) {
 
 void Mir2Lir::GenConstString(uint32_t string_idx, RegLocation rl_dest) {
   /* NOTE: Most strings should be available at compile time */
-  int32_t offset_of_string = mirror::Array::DataOffset(sizeof(mirror::String*)).Int32Value() +
-                 (sizeof(mirror::String*) * string_idx);
+  int32_t offset_of_string = mirror::Array::DataOffsetOfType<mirror::String>(string_idx);
   if (!cu_->compiler_driver->CanAssumeStringIsPresentInDexCache(
       *cu_->dex_file, string_idx) || SLOW_STRING_PATH) {
     // slow path, resolve string if not in dex cache
@@ -1079,9 +1074,7 @@ void Mir2Lir::GenInstanceofFinal(bool use_declaring_class, uint32_t type_idx, Re
     LoadRefDisp(check_class, mirror::ArtMethod::DexCacheResolvedTypesOffset().Int32Value(),
                 check_class);
     LoadRefDisp(object.reg,  mirror::Object::ClassOffset().Int32Value(), object_class);
-    int32_t offset_of_type =
-      mirror::Array::DataOffset(sizeof(mirror::Class*)).Int32Value() +
-      (sizeof(mirror::Class*) * type_idx);
+    int32_t offset_of_type = mirror::Array::DataOffsetOfType<mirror::Class>(type_idx);
     LoadRefDisp(check_class, offset_of_type, check_class);
   }
 
@@ -1139,9 +1132,7 @@ void Mir2Lir::GenInstanceofCallingHelper(bool needs_access_check, bool type_know
     LoadValueDirectFixed(rl_src, TargetReg(kArg0));  // kArg0 <= ref
     LoadRefDisp(TargetReg(kArg1), mirror::ArtMethod::DexCacheResolvedTypesOffset().Int32Value(),
                 class_reg);
-    int32_t offset_of_type =
-        mirror::Array::DataOffset(sizeof(mirror::Class*)).Int32Value() + (sizeof(mirror::Class*)
-        * type_idx);
+    int32_t offset_of_type = mirror::Array::DataOffsetOfType<mirror::Class>(type_idx);
     LoadRefDisp(class_reg, offset_of_type, class_reg);
     if (!can_assume_type_is_in_dex_cache) {
       // Need to test presence of type in dex cache at runtime
@@ -1275,9 +1266,7 @@ void Mir2Lir::GenCheckCast(uint32_t insn_idx, uint32_t type_idx, RegLocation rl_
     // Load dex cache entry into class_reg (kArg2)
     LoadRefDisp(TargetReg(kArg1), mirror::ArtMethod::DexCacheResolvedTypesOffset().Int32Value(),
                 class_reg);
-    int32_t offset_of_type =
-        mirror::Array::DataOffset(sizeof(mirror::Class*)).Int32Value() +
-        (sizeof(mirror::Class*) * type_idx);
+    int32_t offset_of_type = mirror::Array::DataOffsetOfType<mirror::Class>(type_idx);
     LoadRefDisp(class_reg, offset_of_type, class_reg);
     if (!cu_->compiler_driver->CanAssumeTypeIsPresentInDexCache(*cu_->dex_file, type_idx)) {
       // Need to test presence of type in dex cache at runtime
index 772d303..a9dcfe6 100644 (file)
@@ -68,6 +68,12 @@ class MANAGED Array : public Object {
     }
   }
 
+  template<class MirrorType>
+  static int32_t DataOffsetOfType(uint32_t index) {
+    return DataOffset(sizeof(HeapReference<MirrorType>)).Int32Value() +
+           (sizeof(HeapReference<MirrorType>) * index);
+  }
+
   void* GetRawData(size_t component_size, int32_t index)
       SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) {
     intptr_t data = reinterpret_cast<intptr_t>(this) + DataOffset(component_size).Int32Value() +