diff options
author | Andreas Gampe <agampe@google.com> | 2014-04-24 17:33:34 +0000 |
---|---|---|
committer | Andreas Gampe <agampe@google.com> | 2014-04-24 13:13:56 -0700 |
commit | 9c3b089519792245ab9f658865f44b8639b8d696 (patch) | |
tree | dafd82a7c3ccb42c69799389d43340e3f4eae447 | |
parent | 1b4e3d5bc1e2d604adeda4ebbd137f20ee041138 (diff) | |
download | art-9c3b089519792245ab9f658865f44b8639b8d696.zip art-9c3b089519792245ab9f658865f44b8639b8d696.tar.gz art-9c3b089519792245ab9f658865f44b8639b8d696.tar.bz2 |
Revert "Revert "ART: Extracts an utility function of the duplicated code""
This reverts commit b5a14d2a6c18c1ea3c019c53b10af2e8f5dea234.
Change-Id: Id09a4cc27ac22db940badf3a277848b38b173eae
-rw-r--r-- | compiler/dex/quick/gen_common.cc | 33 | ||||
-rw-r--r-- | runtime/mirror/object_array.h | 2 |
2 files changed, 16 insertions, 19 deletions
diff --git a/compiler/dex/quick/gen_common.cc b/compiler/dex/quick/gen_common.cc index aa9b2a4..313174d 100644 --- a/compiler/dex/quick/gen_common.cc +++ b/compiler/dex/quick/gen_common.cc @@ -19,12 +19,17 @@ #include "dex/quick/mir_to_lir-inl.h" #include "entrypoints/quick/quick_entrypoints.h" #include "mirror/array.h" +#include "mirror/object_array-inl.h" #include "mirror/object-inl.h" #include "verifier/method_verifier.h" #include <functional> namespace art { +// Shortcuts to repeatedly used long types. +typedef mirror::ObjectArray<mirror::Object> ObjArray; +typedef mirror::ObjectArray<mirror::Class> ClassArray; + /* * This source files contains "gen" codegen routines that should * be applicable to most targets. Only mid-level support utilities @@ -519,8 +524,8 @@ 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); + int32_t offset_of_field = ObjArray::OffsetOfElement(field_info.StorageIndex()).Int32Value(); + LoadRefDisp(r_base, offset_of_field, 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 +613,8 @@ 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); + int32_t offset_of_field = ObjArray::OffsetOfElement(field_info.StorageIndex()).Int32Value(); + LoadRefDisp(r_base, offset_of_field, 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 +870,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 = ClassArray::OffsetOfElement(type_idx).Int32Value(); Load32Disp(res_reg, offset_of_type, rl_result.reg); if (!cu_->compiler_driver->CanAssumeTypeIsPresentInDexCache(*cu_->dex_file, type_idx) || SLOW_TYPE_PATH) { @@ -914,8 +917,8 @@ 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::ObjectArray<mirror::String>::OffsetOfElement(string_idx). + Int32Value(); if (!cu_->compiler_driver->CanAssumeStringIsPresentInDexCache( *cu_->dex_file, string_idx) || SLOW_STRING_PATH) { // slow path, resolve string if not in dex cache @@ -1079,9 +1082,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 = ClassArray::OffsetOfElement(type_idx).Int32Value(); LoadRefDisp(check_class, offset_of_type, check_class); } @@ -1139,9 +1140,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 = ClassArray::OffsetOfElement(type_idx).Int32Value(); 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 +1274,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 = ClassArray::OffsetOfElement(type_idx).Int32Value(); 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 diff --git a/runtime/mirror/object_array.h b/runtime/mirror/object_array.h index 5ff0490..26b1fd1 100644 --- a/runtime/mirror/object_array.h +++ b/runtime/mirror/object_array.h @@ -83,9 +83,9 @@ class MANAGED ObjectArray : public Array { template<const bool kVisitClass, typename Visitor> void VisitReferences(const Visitor& visitor) NO_THREAD_SAFETY_ANALYSIS; - private: static MemberOffset OffsetOfElement(int32_t i); + private: DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectArray); }; |