%def op_invoke_polymorphic():
EXPORT_PC
// No need to fetch the target method.
// Load the first argument (the 'this' pointer).
movzwl 4(rPC), %r11d // arguments
andq $$0xf, %r11
movl (rFP, %r11, 4), %esi
// NullPointerException check.
movl (%esi), %eax
jmp NterpCommonInvokePolymorphic
%def op_invoke_polymorphic_range():
EXPORT_PC
// No need to fetch the target method.
// Load the first argument (the 'this' pointer).
movzwl 4(rPC), %r11d // arguments
movl (rFP, %r11, 4), %esi
// NullPointerException check.
movl (%esi), %eax
jmp NterpCommonInvokePolymorphicRange
%def invoke_interface(helper="", range=False):
% slow_path = add_slow_path(op_invoke_interface_slow_path)
EXPORT_PC
// Fast-path which gets the interface method from thread-local cache.
% fetch_from_thread_cache("%rax", miss_label=slow_path)
.L${opcode}_resume:
// First argument is the 'this' pointer.
movzwl 4(rPC), %r11d // arguments
% if not range:
andq $$0xf, %r11
movl (rFP, %r11, 4), %esi
movl MIRROR_OBJECT_CLASS_OFFSET(%esi), %edx
UNPOISON_HEAP_REF edx
// Test the first two bits of the fetched ArtMethod:
// - If the first bit is set, this is a method on j.l.Object
// - If the second bit is set, this is a default method.
testl $$3, %eax
jne 2f
movzw ART_METHOD_IMT_INDEX_OFFSET(%rax), %ecx 1:
movq MIRROR_CLASS_IMT_PTR_OFFSET_64(%edx), %rdx
movq (%rdx, %rcx, 8), %rdi
jmp $helper 2:
testl $$1, %eax
% if range:
jne NterpHandleInvokeInterfaceOnObjectMethodRange
% else:
jne NterpHandleInvokeInterfaceOnObjectMethod
// Default method
andq $$-4, %rax
movzw ART_METHOD_METHOD_INDEX_OFFSET(%rax), %ecx
andl $$ART_METHOD_IMT_MASK, %ecx
jmp 1b
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.