diff options
author | 2022-11-22 15:18:43 +0000 | |
---|---|---|
committer | 2022-11-23 13:22:14 +0000 | |
commit | b9c73f8b8dacf7cb72b859a667326217a287ac69 (patch) | |
tree | be5651a77bde5152c5759409838690e8fe88cd20 /runtime/art_method-alloc-inl.h | |
parent | 5fa73a95fcfc638c155511305382ecbe4b75fe43 (diff) |
Add convenience helper `ArtMethod::NewObject()`.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Change-Id: I4961d4f121f782d47490f7e5e718ee28b3b87efa
Diffstat (limited to 'runtime/art_method-alloc-inl.h')
-rw-r--r-- | runtime/art_method-alloc-inl.h | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/runtime/art_method-alloc-inl.h b/runtime/art_method-alloc-inl.h new file mode 100644 index 0000000000..13051b156e --- /dev/null +++ b/runtime/art_method-alloc-inl.h @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ART_RUNTIME_ART_METHOD_ALLOC_INL_H_ +#define ART_RUNTIME_ART_METHOD_ALLOC_INL_H_ + +#include "art_method-inl.h" + +#include "handle.h" +#include "handle_scope.h" +#include "mirror/class-alloc-inl.h" + +namespace art { + +namespace detail { + +template <char Shorty> +struct HandleShortyTraits { + using Type = typename ShortyTraits<Shorty>::Type; + static Type Extract(Type value) ALWAYS_INLINE { return value; } +}; + +template <> struct HandleShortyTraits<'L'> { + using Type = Handle<mirror::Object>; + static typename ShortyTraits<'L'>::Type Extract(Type value) + REQUIRES_SHARED(Locks::mutator_lock_) ALWAYS_INLINE { + return value.Get(); + } +}; + +} // namespace detail + +template <char... ArgType, typename HandleScopeType> +inline Handle<mirror::Object> ArtMethod::NewObject( + HandleScopeType& hs, + Thread* self, + typename detail::HandleShortyTraits<ArgType>::Type... args) { + DCHECK(!GetDeclaringClass()->IsInterface()); + DCHECK(GetDeclaringClass()->IsInitialized()); + DCHECK(IsConstructor()); + DCHECK(!IsStatic()); + MutableHandle<mirror::Object> new_object = hs.NewHandle(GetDeclaringClass()->AllocObject(self)); + DCHECK_EQ(new_object == nullptr, self->IsExceptionPending()); + if (LIKELY(new_object != nullptr)) { + InvokeInstance<'V', ArgType...>( + self, new_object.Get(), detail::HandleShortyTraits<ArgType>::Extract(args)...); + if (UNLIKELY(self->IsExceptionPending())) { + new_object.Assign(nullptr); + } + } + return new_object; +} + +template <char... ArgType> +inline ObjPtr<mirror::Object> ArtMethod::NewObject( + Thread* self, typename detail::HandleShortyTraits<ArgType>::Type... args) { + StackHandleScope<1u> hs(self); + return NewObject<ArgType...>(hs, self, args...).Get(); +} + +} // namespace art + +#endif // ART_RUNTIME_ART_METHOD_ALLOC_INL_H_ |