diff options
Diffstat (limited to 'runtime/art_method.h')
| -rw-r--r-- | runtime/art_method.h | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/runtime/art_method.h b/runtime/art_method.h index cac40e011a..7ffd585f1a 100644 --- a/runtime/art_method.h +++ b/runtime/art_method.h @@ -458,12 +458,15 @@ class ArtMethod FINAL { SetDataPtrSize(table, pointer_size); } - ProfilingInfo* GetProfilingInfo(PointerSize pointer_size) { + ProfilingInfo* GetProfilingInfo(PointerSize pointer_size) REQUIRES_SHARED(Locks::mutator_lock_) { // Don't do a read barrier in the DCHECK, as GetProfilingInfo is called in places // where the declaring class is treated as a weak reference (accessing it with // a read barrier would either prevent unloading the class, or crash the runtime if // the GC wants to unload it). DCHECK(!IsNative<kWithoutReadBarrier>()); + if (UNLIKELY(IsProxyMethod())) { + return nullptr; + } return reinterpret_cast<ProfilingInfo*>(GetDataPtrSize(pointer_size)); } @@ -726,9 +729,13 @@ class ArtMethod FINAL { // Short cuts to declaring_class_->dex_cache_ member for fast compiled code access. mirror::MethodDexCacheType* dex_cache_resolved_methods_; - // Pointer to JNI function registered to this method, or a function to resolve the JNI function, - // or the profiling data for non-native methods, or an ImtConflictTable, or the - // single-implementation of an abstract/interface method. + // Depending on the method type, the data is + // - native method: pointer to the JNI function registered to this method + // or a function to resolve the JNI function, + // - conflict method: ImtConflictTable, + // - abstract/interface method: the single-implementation if any, + // - proxy method: the original interface method or constructor, + // - other methods: the profiling data. void* data_; // Method dispatch from quick compiled code invokes this pointer which may cause bridging into |