summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Nicolas Geoffray <ngeoffray@google.com> 2024-06-19 14:15:23 +0100
committer Nicolas Geoffray <ngeoffray@google.com> 2024-06-20 10:13:31 +0000
commitdaf65911a4e8126d10a0d98b9e3bcb363d373a30 (patch)
tree664ce9f432c4100ecf205ef51d4dbefb688293b0
parent7d4ebce2d8e15260ecdbfc6b3c67df3b5a7a09b4 (diff)
Change CreateInternalStackTrace to return a mirror::Object.
It might be called in a context where there isn't a JNI frame (for example when throwing in the runtime). So return a mirror::Object instead of jobject. Test: 107-int-math2 with gcstress Change-Id: I72ea87db8cf5092e636901d1114034e81de13146
-rw-r--r--compiler/exception_test.cc2
-rw-r--r--compiler/jni/jni_compiler_test.cc3
-rw-r--r--runtime/common_throws.cc3
-rw-r--r--runtime/interpreter/unstarted_runtime.cc3
-rw-r--r--runtime/native/dalvik_system_VMStack.cc4
-rw-r--r--runtime/native/java_lang_StackStreamFactory.cc2
-rw-r--r--runtime/native/java_lang_Throwable.cc2
-rw-r--r--runtime/native/org_apache_harmony_dalvik_ddmc_DdmVmInternal.cc5
-rw-r--r--runtime/thread.cc11
-rw-r--r--runtime/thread.h3
10 files changed, 20 insertions, 18 deletions
diff --git a/compiler/exception_test.cc b/compiler/exception_test.cc
index 89fe56dda0..0e289353c7 100644
--- a/compiler/exception_test.cc
+++ b/compiler/exception_test.cc
@@ -241,7 +241,7 @@ TEST_F(ExceptionTest, StackTraceElement) {
// Set up thread to appear as if we called out of method_g_ at given pc dex.
thread->SetTopOfStack(reinterpret_cast<ArtMethod**>(&fake_stack[0]));
- jobject internal = thread->CreateInternalStackTrace(soa);
+ jobject internal = soa.AddLocalReference<jobject>(thread->CreateInternalStackTrace(soa));
ASSERT_TRUE(internal != nullptr);
jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
ASSERT_TRUE(ste_array != nullptr);
diff --git a/compiler/jni/jni_compiler_test.cc b/compiler/jni/jni_compiler_test.cc
index 8a096d0744..2f4a1b5f44 100644
--- a/compiler/jni/jni_compiler_test.cc
+++ b/compiler/jni/jni_compiler_test.cc
@@ -1374,7 +1374,8 @@ jint Java_MyClassNatives_nativeUpCall(JNIEnv* env, jobject thisObj, jint i) {
ScopedObjectAccess soa(env);
// Build stack trace
- jobject internal = Thread::Current()->CreateInternalStackTrace(soa);
+ jobject internal =
+ soa.AddLocalReference<jobject>(Thread::Current()->CreateInternalStackTrace(soa));
jobjectArray ste_array = Thread::InternalStackTraceToStackTraceElementArray(soa, internal);
ObjPtr<mirror::ObjectArray<mirror::StackTraceElement>> trace_array =
soa.Decode<mirror::ObjectArray<mirror::StackTraceElement>>(ste_array);
diff --git a/runtime/common_throws.cc b/runtime/common_throws.cc
index 3724866556..feddd5c2e3 100644
--- a/runtime/common_throws.cc
+++ b/runtime/common_throws.cc
@@ -765,8 +765,7 @@ void ThrowStackOverflowError(Thread* self) {
// stackState is set as result of fillInStackTrace. fillInStackTrace calls
// nativeFillInStackTrace.
- ObjPtr<mirror::Object> stack_state_val =
- soa.Decode<mirror::Object>(self->CreateInternalStackTrace(soa));
+ ObjPtr<mirror::Object> stack_state_val = self->CreateInternalStackTrace(soa);
if (stack_state_val != nullptr) {
WellKnownClasses::java_lang_Throwable_stackState
->SetObject</*kTransactionActive=*/ false>(exc.Get(), stack_state_val);
diff --git a/runtime/interpreter/unstarted_runtime.cc b/runtime/interpreter/unstarted_runtime.cc
index 43e0692eee..745779de36 100644
--- a/runtime/interpreter/unstarted_runtime.cc
+++ b/runtime/interpreter/unstarted_runtime.cc
@@ -2099,8 +2099,7 @@ void UnstartedRuntime::UnstartedJNIThrowableNativeFillInStackTrace(
[[maybe_unused]] uint32_t* args,
JValue* result) {
ScopedObjectAccessUnchecked soa(self);
- ScopedLocalRef<jobject> stack_trace(self->GetJniEnv(), self->CreateInternalStackTrace(soa));
- result->SetL(soa.Decode<mirror::Object>(stack_trace.get()));
+ result->SetL(self->CreateInternalStackTrace(soa));
}
void UnstartedRuntime::UnstartedJNIUnsafeCompareAndSwapInt(
diff --git a/runtime/native/dalvik_system_VMStack.cc b/runtime/native/dalvik_system_VMStack.cc
index 366059bd17..f55e2b5c18 100644
--- a/runtime/native/dalvik_system_VMStack.cc
+++ b/runtime/native/dalvik_system_VMStack.cc
@@ -76,7 +76,7 @@ static jint VMStack_fillStackTraceElements(JNIEnv* env, jclass, jobject javaThre
ScopedFastNativeObjectAccess soa(env);
auto fn = [](Thread* thread, const ScopedFastNativeObjectAccess& soaa)
REQUIRES_SHARED(Locks::mutator_lock_) -> jobject {
- return thread->CreateInternalStackTrace(soaa);
+ return soaa.AddLocalReference<jobject>(thread->CreateInternalStackTrace(soaa));
};
jobject trace = GetThreadStack(soa, javaThread, fn);
if (trace == nullptr) {
@@ -143,7 +143,7 @@ static jobjectArray VMStack_getThreadStackTrace(JNIEnv* env, jclass, jobject jav
ScopedFastNativeObjectAccess soa(env);
auto fn = [](Thread* thread, const ScopedFastNativeObjectAccess& soaa)
REQUIRES_SHARED(Locks::mutator_lock_) -> jobject {
- return thread->CreateInternalStackTrace(soaa);
+ return soaa.AddLocalReference<jobject>(thread->CreateInternalStackTrace(soaa));
};
jobject trace = GetThreadStack(soa, javaThread, fn);
if (trace == nullptr) {
diff --git a/runtime/native/java_lang_StackStreamFactory.cc b/runtime/native/java_lang_StackStreamFactory.cc
index 24d903047d..78e38a0914 100644
--- a/runtime/native/java_lang_StackStreamFactory.cc
+++ b/runtime/native/java_lang_StackStreamFactory.cc
@@ -27,7 +27,7 @@ namespace art HIDDEN {
static jobject StackStreamFactory_nativeGetStackAnchor(JNIEnv* env, jclass) {
ScopedFastNativeObjectAccess soa(env);
- return soa.Self()->CreateInternalStackTrace(soa);
+ return soa.AddLocalReference<jobject>(soa.Self()->CreateInternalStackTrace(soa));
}
static jint StackStreamFactory_nativeFetchStackFrameInfo(JNIEnv* env, jclass,
diff --git a/runtime/native/java_lang_Throwable.cc b/runtime/native/java_lang_Throwable.cc
index 091ad03bb2..45496b1a3c 100644
--- a/runtime/native/java_lang_Throwable.cc
+++ b/runtime/native/java_lang_Throwable.cc
@@ -27,7 +27,7 @@ namespace art HIDDEN {
static jobject Throwable_nativeFillInStackTrace(JNIEnv* env, jclass) {
ScopedFastNativeObjectAccess soa(env);
- return soa.Self()->CreateInternalStackTrace(soa);
+ return soa.AddLocalReference<jobject>(soa.Self()->CreateInternalStackTrace(soa));
}
static jobjectArray Throwable_nativeGetStackTrace(JNIEnv* env, jclass, jobject javaStackState) {
diff --git a/runtime/native/org_apache_harmony_dalvik_ddmc_DdmVmInternal.cc b/runtime/native/org_apache_harmony_dalvik_ddmc_DdmVmInternal.cc
index 2ba10fa7e3..e26d804daa 100644
--- a/runtime/native/org_apache_harmony_dalvik_ddmc_DdmVmInternal.cc
+++ b/runtime/native/org_apache_harmony_dalvik_ddmc_DdmVmInternal.cc
@@ -55,7 +55,7 @@ static jobjectArray DdmVmInternal_getStackTraceById(JNIEnv* env, jclass, jint th
if (static_cast<uint32_t>(thin_lock_id) == self->GetThreadId()) {
// No need to suspend ourself to build stacktrace.
ScopedObjectAccess soa(env);
- jobject internal_trace = self->CreateInternalStackTrace(soa);
+ jobject internal_trace = soa.AddLocalReference<jobject>(self->CreateInternalStackTrace(soa));
trace = Thread::InternalStackTraceToStackTraceElementArray(soa, internal_trace);
} else {
ThreadList* thread_list = Runtime::Current()->GetThreadList();
@@ -70,7 +70,8 @@ static jobjectArray DdmVmInternal_getStackTraceById(JNIEnv* env, jclass, jint th
if (thread != nullptr) {
{
ScopedObjectAccess soa(env);
- jobject internal_trace = thread->CreateInternalStackTrace(soa);
+ jobject internal_trace =
+ soa.AddLocalReference<jobject>(thread->CreateInternalStackTrace(soa));
trace = Thread::InternalStackTraceToStackTraceElementArray(soa, internal_trace);
}
// Restart suspended thread.
diff --git a/runtime/thread.cc b/runtime/thread.cc
index 445fe5650a..6d8b6fb3f0 100644
--- a/runtime/thread.cc
+++ b/runtime/thread.cc
@@ -3070,7 +3070,8 @@ class BuildInternalStackTraceVisitor : public StackVisitor {
DISALLOW_COPY_AND_ASSIGN(BuildInternalStackTraceVisitor);
};
-jobject Thread::CreateInternalStackTrace(const ScopedObjectAccessAlreadyRunnable& soa) const {
+ObjPtr<mirror::ObjectArray<mirror::Object>> Thread::CreateInternalStackTrace(
+ const ScopedObjectAccessAlreadyRunnable& soa) const {
// Compute depth of stack, save frames if possible to avoid needing to recompute many.
constexpr size_t kMaxSavedFrames = 256;
std::unique_ptr<ArtMethodDexPcPair[]> saved_frames(new ArtMethodDexPcPair[kMaxSavedFrames]);
@@ -3107,7 +3108,7 @@ jobject Thread::CreateInternalStackTrace(const ScopedObjectAccessAlreadyRunnable
CHECK(method != nullptr);
}
}
- return soa.AddLocalReference<jobject>(trace);
+ return trace;
}
bool Thread::IsExceptionThrownByCurrentMethod(ObjPtr<mirror::Throwable> exception) const {
@@ -3660,9 +3661,9 @@ void Thread::ThrowNewWrappedException(const char* exception_class_descriptor,
if (cause.get() != nullptr) {
exception->SetCause(DecodeJObject(cause.get())->AsThrowable());
}
- ScopedLocalRef<jobject> trace(GetJniEnv(), CreateInternalStackTrace(soa));
- if (trace.get() != nullptr) {
- exception->SetStackState(DecodeJObject(trace.get()).Ptr());
+ ObjPtr<mirror::ObjectArray<mirror::Object>> trace = CreateInternalStackTrace(soa);
+ if (trace != nullptr) {
+ exception->SetStackState(trace.Ptr());
}
SetException(exception.Get());
} else {
diff --git a/runtime/thread.h b/runtime/thread.h
index 35e8fe8716..912015a07f 100644
--- a/runtime/thread.h
+++ b/runtime/thread.h
@@ -860,7 +860,8 @@ class EXPORT Thread {
// Create the internal representation of a stack trace, that is more time
// and space efficient to compute than the StackTraceElement[].
- jobject CreateInternalStackTrace(const ScopedObjectAccessAlreadyRunnable& soa) const
+ ObjPtr<mirror::ObjectArray<mirror::Object>> CreateInternalStackTrace(
+ const ScopedObjectAccessAlreadyRunnable& soa) const
REQUIRES_SHARED(Locks::mutator_lock_);
// Convert an internal stack trace representation (returned by CreateInternalStackTrace) to a