@@ -13,144 +13,150 @@ * file. */ #include "config.h" -.intel_syntax noprefix - -.globl _of_forward -.globl _of_forward_stret - -.section .text -_of_forward: - push ebp - mov ebp, esp - - push ebx - sub esp, 20 - - mov eax, [ebp+8] - mov [esp], eax - call _object_getClass - - mov [esp], eax - mov eax, offset sel_forwardingTargetForSelector_ - mov [esp+4], eax - call _class_respondsToSelector - - test eax, eax - jz short 0f - - mov eax, [ebp+8] - mov [esp], eax - mov eax, offset sel_forwardingTargetForSelector_ - mov [esp+4], eax - call _objc_msg_lookup - - mov edx, [ebp+8] - mov [esp], edx - mov edx, offset sel_forwardingTargetForSelector_ - mov [esp+4], edx - mov edx, [ebp+12] - mov [esp+8], edx - call eax - - test eax, eax - jz short 0f - cmp eax, [ebp+8] - je short 0f - - mov [ebp+8], eax - mov [esp], eax - mov eax, [ebp+12] - mov [esp+4], eax - call _objc_msg_lookup - - add esp, 20 - pop ebx - pop ebp - - jmp eax - -0: - add esp, 20 - pop ebx - pop ebp - - jmp _of_method_not_found - -_of_forward_stret: - push ebp - mov ebp, esp - - push ebx - sub esp, 20 - - mov eax, [ebp+12] - mov [esp], eax - call _object_getClass - - mov [esp], eax - mov eax, offset sel_forwardingTargetForSelector_ - mov [esp+4], eax - call _class_respondsToSelector - - test eax, eax - jz short 0f - - mov eax, [ebp+12] - mov [esp], eax - mov eax, offset sel_forwardingTargetForSelector_ - mov [esp+4], eax - call _objc_msg_lookup - - mov edx, [ebp+12] - mov [esp], edx - mov edx, offset sel_forwardingTargetForSelector_ - mov [esp+4], edx - mov edx, [ebp+16] - mov [esp+8], edx - call eax - - test eax, eax - jz short 0f - cmp eax, [ebp+12] - je short 0f - - mov [ebp+12], eax - mov [esp], eax - mov eax, [ebp+16] - mov [esp+4], eax - call _objc_msg_lookup_stret - - add esp, 20 - pop ebx - pop ebp - - jmp eax - -0: - add esp, 20 - pop ebx - pop ebp - - jmp _of_method_not_found_stret - -init: - push ebp - mov ebp, esp - - push ebx - sub esp, 4 - - mov eax, offset module - mov [esp], eax - call ___objc_exec_class - - add esp, 4 - pop ebx - pop ebp +.globl _OFForward +.globl _OFForward_stret + +.section .text +_OFForward: + pushl %ebp + movl %esp, %ebp + + pushl %ebx + subl $20, %esp + + movl 8(%ebp), %eax + movl %eax, (%esp) + call _object_getClass + + movl %eax, (%esp) + movl $sel_forwardingTargetForSelector_, %eax + movl %eax, 4(%esp) + call _class_respondsToSelector + + testl %eax, %eax + jz 0f + + movl 8(%ebp), %eax + movl %eax, (%esp) + movl $sel_forwardingTargetForSelector_, %eax + movl %eax, 4(%esp) + call _objc_msg_lookup + + movl 8(%ebp), %edx + movl %edx, (%esp) + movl $sel_forwardingTargetForSelector_, %edx + movl %edx, 4(%esp) + movl 12(%ebp), %edx + movl %edx, 8(%esp) + call *%eax + + testl %eax, %eax + jz 0f + cmpl 8(%ebp), %eax + je 0f + + movl %eax, 8(%ebp) + movl %eax, (%esp) + movl 12(%ebp), %eax + movl %eax, 4(%esp) + call _objc_msg_lookup + + addl $20, %esp + popl %ebx + popl %ebp + + jmp *%eax + +0: + addl $20, %esp + popl %ebx + popl %ebp + + jmp _OFMethodNotFound +.def _OFForward +.scl 2 +.type 32 +.endef + +_OFForward_stret: + pushl %ebp + movl %esp, %ebp + + pushl %ebx + subl $20, %esp + + movl 12(%ebp), %eax + movl %eax, (%esp) + call _object_getClass + + movl %eax, (%esp) + movl $sel_forwardingTargetForSelector_, %eax + movl %eax, 4(%esp) + call _class_respondsToSelector + + testl %eax, %eax + jz 0f + + movl 12(%ebp), %eax + movl %eax, (%esp) + movl $sel_forwardingTargetForSelector_, %eax + movl %eax, 4(%esp) + call _objc_msg_lookup + + movl 12(%ebp), %edx + movl %edx, (%esp) + movl $sel_forwardingTargetForSelector_, %edx + movl %edx, 4(%esp) + movl 16(%ebp), %edx + movl %edx, 8(%esp) + call *%eax + + testl %eax, %eax + jz 0f + cmpl 12(%ebp), %eax + je 0f + + movl %eax, 12(%ebp) + movl %eax, (%esp) + movl 16(%ebp), %eax + movl %eax, 4(%esp) + call _objc_msg_lookup_stret + + addl $20, %esp + popl %ebx + popl %ebp + + jmp *%eax + +0: + addl $20, %esp + popl %ebx + popl %ebp + + jmp _OFMethodNotFound_stret +.def _OFForward_stret +.scl 2 +.type 32 +.endef + +init: + pushl %ebp + movl %esp, %ebp + + pushl %ebx + subl $4, %esp + + movl $module, %eax + movl %eax, (%esp) + call ___objc_exec_class + + addl $4, %esp + popl %ebx + popl %ebp ret .section .ctors, "aw" .long init