diff options
Diffstat (limited to 'runtime/method_handles.h')
| -rw-r--r-- | runtime/method_handles.h | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/runtime/method_handles.h b/runtime/method_handles.h index a36b66db9a..5175dceed3 100644 --- a/runtime/method_handles.h +++ b/runtime/method_handles.h @@ -42,12 +42,13 @@ enum MethodHandleKind { kInvokeDirect, kInvokeStatic, kInvokeInterface, + kInvokeTransform, kInstanceGet, kInstancePut, kStaticGet, kStaticPut, kLastValidKind = kStaticPut, - kLastInvokeKind = kInvokeInterface + kLastInvokeKind = kInvokeTransform }; // Whether the given method handle kind is some variant of an invoke. @@ -55,21 +56,38 @@ inline bool IsInvoke(const MethodHandleKind handle_kind) { return handle_kind <= kLastInvokeKind; } +// Performs a single argument conversion from type |from| to a distinct +// type |to|. Returns true on success, false otherwise. +REQUIRES_SHARED(Locks::mutator_lock_) +bool ConvertJValue(Handle<mirror::Class> from, + Handle<mirror::Class> to, + const JValue& from_value, + JValue* to_value) ALWAYS_INLINE; + // Perform argument conversions between |callsite_type| (the type of the // incoming arguments) and |callee_type| (the type of the method being // invoked). These include widening and narrowing conversions as well as // boxing and unboxing. Returns true on success, on false on failure. A // pending exception will always be set on failure. template <bool is_range> REQUIRES_SHARED(Locks::mutator_lock_) -bool PerformArgumentConversions(Thread* self, - Handle<mirror::MethodType> callsite_type, - Handle<mirror::MethodType> callee_type, - const ShadowFrame& caller_frame, - uint32_t first_src_reg, - uint32_t first_dest_reg, - const uint32_t (&arg)[Instruction::kMaxVarArgRegs], - ShadowFrame* callee_frame, - JValue* result); +bool ConvertAndCopyArgumentsFromCallerFrame(Thread* self, + Handle<mirror::MethodType> callsite_type, + Handle<mirror::MethodType> callee_type, + const ShadowFrame& caller_frame, + uint32_t first_src_reg, + uint32_t first_dest_reg, + const uint32_t (&arg)[Instruction::kMaxVarArgRegs], + ShadowFrame* callee_frame); + +// Similar to |ConvertAndCopyArgumentsFromCallerFrame|, except that the +// arguments are copied from an |EmulatedStackFrame|. +template <bool is_range> REQUIRES_SHARED(Locks::mutator_lock_) +bool ConvertAndCopyArgumentsFromEmulatedStackFrame(Thread* self, + ObjPtr<mirror::Object> emulated_stack_frame, + Handle<mirror::MethodType> callee_type, + const uint32_t first_dest_reg, + ShadowFrame* callee_frame); + } // namespace art |