diff options
author | Sebastien Hertz <shertz@google.com> | 2015-04-07 15:16:13 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-04-07 15:16:13 +0000 |
commit | 9b87d4a2f96bf935640f67b66d7d4cce867ceece (patch) | |
tree | 305b448ca47d180c8c63e580a574d7cb70af126f /runtime/debugger.cc | |
parent | caff30245889729f102af87e79705893401251ef (diff) | |
parent | 2c3e77a0b91b2225fcdd3b34d8a734b85eec0579 (diff) | |
download | art-9b87d4a2f96bf935640f67b66d7d4cce867ceece.tar.gz art-9b87d4a2f96bf935640f67b66d7d4cce867ceece.tar.bz2 art-9b87d4a2f96bf935640f67b66d7d4cce867ceece.zip |
Merge "JDWP: clear exception when allocation fails"
Diffstat (limited to 'runtime/debugger.cc')
-rw-r--r-- | runtime/debugger.cc | 49 |
1 files changed, 39 insertions, 10 deletions
diff --git a/runtime/debugger.cc b/runtime/debugger.cc index 3f67f9e72d..6759c4d9c3 100644 --- a/runtime/debugger.cc +++ b/runtime/debugger.cc @@ -1283,18 +1283,37 @@ JDWP::JdwpError Dbg::SetArrayElements(JDWP::ObjectId array_id, int offset, int c return JDWP::ERR_NONE; } -JDWP::ObjectId Dbg::CreateString(const std::string& str) { - return gRegistry->Add(mirror::String::AllocFromModifiedUtf8(Thread::Current(), str.c_str())); +JDWP::JdwpError Dbg::CreateString(const std::string& str, JDWP::ObjectId* new_string_id) { + Thread* self = Thread::Current(); + mirror::String* new_string = mirror::String::AllocFromModifiedUtf8(self, str.c_str()); + if (new_string == nullptr) { + DCHECK(self->IsExceptionPending()); + self->ClearException(); + LOG(ERROR) << "Could not allocate string"; + *new_string_id = 0; + return JDWP::ERR_OUT_OF_MEMORY; + } + *new_string_id = gRegistry->Add(new_string); + return JDWP::ERR_NONE; } -JDWP::JdwpError Dbg::CreateObject(JDWP::RefTypeId class_id, JDWP::ObjectId* new_object) { +JDWP::JdwpError Dbg::CreateObject(JDWP::RefTypeId class_id, JDWP::ObjectId* new_object_id) { JDWP::JdwpError error; mirror::Class* c = DecodeClass(class_id, &error); if (c == nullptr) { - *new_object = 0; + *new_object_id = 0; return error; } - *new_object = gRegistry->Add(c->AllocObject(Thread::Current())); + Thread* self = Thread::Current(); + mirror::Object* new_object = c->AllocObject(self); + if (new_object == nullptr) { + DCHECK(self->IsExceptionPending()); + self->ClearException(); + LOG(ERROR) << "Could not allocate object of type " << PrettyDescriptor(c); + *new_object_id = 0; + return JDWP::ERR_OUT_OF_MEMORY; + } + *new_object_id = gRegistry->Add(new_object); return JDWP::ERR_NONE; } @@ -1302,16 +1321,26 @@ JDWP::JdwpError Dbg::CreateObject(JDWP::RefTypeId class_id, JDWP::ObjectId* new_ * Used by Eclipse's "Display" view to evaluate "new byte[5]" to get "(byte[]) [0, 0, 0, 0, 0]". */ JDWP::JdwpError Dbg::CreateArrayObject(JDWP::RefTypeId array_class_id, uint32_t length, - JDWP::ObjectId* new_array) { + JDWP::ObjectId* new_array_id) { JDWP::JdwpError error; mirror::Class* c = DecodeClass(array_class_id, &error); if (c == nullptr) { - *new_array = 0; + *new_array_id = 0; return error; } - *new_array = gRegistry->Add(mirror::Array::Alloc<true>(Thread::Current(), c, length, - c->GetComponentSizeShift(), - Runtime::Current()->GetHeap()->GetCurrentAllocator())); + Thread* self = Thread::Current(); + gc::Heap* heap = Runtime::Current()->GetHeap(); + mirror::Array* new_array = mirror::Array::Alloc<true>(self, c, length, + c->GetComponentSizeShift(), + heap->GetCurrentAllocator()); + if (new_array == nullptr) { + DCHECK(self->IsExceptionPending()); + self->ClearException(); + LOG(ERROR) << "Could not allocate array of type " << PrettyDescriptor(c); + *new_array_id = 0; + return JDWP::ERR_OUT_OF_MEMORY; + } + *new_array_id = gRegistry->Add(new_array); return JDWP::ERR_NONE; } |