diff options
author | 2024-06-19 14:15:23 +0100 | |
---|---|---|
committer | 2024-06-20 10:13:31 +0000 | |
commit | daf65911a4e8126d10a0d98b9e3bcb363d373a30 (patch) | |
tree | 664ce9f432c4100ecf205ef51d4dbefb688293b0 | |
parent | 7d4ebce2d8e15260ecdbfc6b3c67df3b5a7a09b4 (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.cc | 2 | ||||
-rw-r--r-- | compiler/jni/jni_compiler_test.cc | 3 | ||||
-rw-r--r-- | runtime/common_throws.cc | 3 | ||||
-rw-r--r-- | runtime/interpreter/unstarted_runtime.cc | 3 | ||||
-rw-r--r-- | runtime/native/dalvik_system_VMStack.cc | 4 | ||||
-rw-r--r-- | runtime/native/java_lang_StackStreamFactory.cc | 2 | ||||
-rw-r--r-- | runtime/native/java_lang_Throwable.cc | 2 | ||||
-rw-r--r-- | runtime/native/org_apache_harmony_dalvik_ddmc_DdmVmInternal.cc | 5 | ||||
-rw-r--r-- | runtime/thread.cc | 11 | ||||
-rw-r--r-- | runtime/thread.h | 3 |
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 |