Make CodeItem fields private
Make code item fields private and use accessors. Added a hand full of
friend classes to reduce the size of the change.
Changed default to be nullable and removed CreateNullable.
CreateNullable was a bad API since it defaulted to the unsafe, may
add a CreateNonNullable if it's important for performance.
Motivation:
Have a different layout for code items in cdex.
Bug: 63756964
Test: test-art-host-gtest
Test: test/testrunner/testrunner.py --host
Test: art/tools/run-jdwp-tests.sh '--mode=host' '--variant=X32' --debug
Change-Id: I42bc7435e20358682075cb6de52713b595f95bf9
diff --git a/runtime/debugger.cc b/runtime/debugger.cc
index c85c233..2be00f5 100644
--- a/runtime/debugger.cc
+++ b/runtime/debugger.cc
@@ -278,11 +278,8 @@
}
private:
- static bool IsReturn(ArtMethod* method, uint32_t dex_pc)
- REQUIRES_SHARED(Locks::mutator_lock_) {
- const DexFile::CodeItem* code_item = method->GetCodeItem();
- const Instruction* instruction = Instruction::At(&code_item->insns_[dex_pc]);
- return instruction->IsReturn();
+ static bool IsReturn(ArtMethod* method, uint32_t dex_pc) REQUIRES_SHARED(Locks::mutator_lock_) {
+ return method->DexInstructions().InstructionAt(dex_pc).IsReturn();
}
static bool IsListeningToDexPcMoved() REQUIRES_SHARED(Locks::mutator_lock_) {
@@ -1535,15 +1532,15 @@
*/
static uint16_t MangleSlot(uint16_t slot, ArtMethod* m)
REQUIRES_SHARED(Locks::mutator_lock_) {
- const DexFile::CodeItem* code_item = m->GetCodeItem();
- if (code_item == nullptr) {
+ CodeItemDataAccessor accessor(m);
+ if (!accessor.HasCodeItem()) {
// We should not get here for a method without code (native, proxy or abstract). Log it and
// return the slot as is since all registers are arguments.
LOG(WARNING) << "Trying to mangle slot for method without code " << m->PrettyMethod();
return slot;
}
- uint16_t ins_size = code_item->ins_size_;
- uint16_t locals_size = code_item->registers_size_ - ins_size;
+ uint16_t ins_size = accessor.InsSize();
+ uint16_t locals_size = accessor.RegistersSize() - ins_size;
if (slot >= locals_size) {
return slot - locals_size;
} else {
@@ -1566,8 +1563,8 @@
*/
static uint16_t DemangleSlot(uint16_t slot, ArtMethod* m, JDWP::JdwpError* error)
REQUIRES_SHARED(Locks::mutator_lock_) {
- const DexFile::CodeItem* code_item = m->GetCodeItem();
- if (code_item == nullptr) {
+ CodeItemDataAccessor accessor(m);
+ if (!accessor.HasCodeItem()) {
// We should not get here for a method without code (native, proxy or abstract). Log it and
// return the slot as is since all registers are arguments.
LOG(WARNING) << "Trying to demangle slot for method without code "
@@ -1578,9 +1575,9 @@
return slot;
}
} else {
- if (slot < code_item->registers_size_) {
- uint16_t ins_size = code_item->ins_size_;
- uint16_t locals_size = code_item->registers_size_ - ins_size;
+ if (slot < accessor.RegistersSize()) {
+ uint16_t ins_size = accessor.InsSize();
+ uint16_t locals_size = accessor.RegistersSize() - ins_size;
*error = JDWP::ERR_NONE;
return (slot < ins_size) ? slot + locals_size : slot - ins_size;
}
@@ -1793,9 +1790,9 @@
if (m == nullptr) {
return JDWP::ERR_INVALID_METHODID;
}
- const DexFile::CodeItem* code_item = m->GetCodeItem();
- size_t byte_count = code_item->insns_size_in_code_units_ * 2;
- const uint8_t* begin = reinterpret_cast<const uint8_t*>(code_item->insns_);
+ CodeItemDataAccessor accessor(m);
+ size_t byte_count = accessor.InsnsSizeInCodeUnits() * 2;
+ const uint8_t* begin = reinterpret_cast<const uint8_t*>(accessor.Insns());
const uint8_t* end = begin + byte_count;
for (const uint8_t* p = begin; p != end; ++p) {
bytecodes->push_back(*p);
@@ -2978,9 +2975,8 @@
Handle<mirror::Throwable> pending_exception(hs.NewHandle(self->GetException()));
self->ClearException();
if (kIsDebugBuild && pending_exception != nullptr) {
- const DexFile::CodeItem* code_item = location.method->GetCodeItem();
- const Instruction* instr = Instruction::At(&code_item->insns_[location.dex_pc]);
- CHECK_EQ(Instruction::MOVE_EXCEPTION, instr->Opcode());
+ const Instruction& instr = location.method->DexInstructions().InstructionAt(location.dex_pc);
+ CHECK_EQ(Instruction::MOVE_EXCEPTION, instr.Opcode());
}
gJdwpState->PostLocationEvent(&location, this_object, event_flags, return_value);