@@ -41,10 +41,20 @@ stfd %f5, 72(%r1) stfd %f6, 80(%r1) stfd %f7, 88(%r1) stfd %f8, 96(%r1) + bl object_getClass@plt + + lis %r4, sel_forwardingTargetForSelector_@ha + la %r4, sel_forwardingTargetForSelector_@l(%r4) + bl class_respondsToSelector@plt + + cmpwi %r3, 0 + beq- fail + + lwz %r3, 8(%r1) lis %r4, sel_forwardingTargetForSelector_@ha la %r4, sel_forwardingTargetForSelector_@l(%r4) bl objc_msg_lookup@plt mtctr %r3 @@ -51,10 +61,17 @@ lwz %r3, 8(%r1) lis %r4, sel_forwardingTargetForSelector_@ha la %r4, sel_forwardingTargetForSelector_@l(%r4) lwz %r5, 12(%r1) bctrl + + cmpwi %r3, 0 + beq- fail + lwz %r4, 8(%r1) + cmpw %r3, %r4 + beq- fail + stw %r3, 8(%r1) lwz %r4, 12(%r1) bl objc_msg_lookup@plt mtctr %r3 @@ -81,10 +98,20 @@ lwz %r0, 116(%r1) mtlr %r0 addi %r1, %r1, 112 bctr + +fail: + lwz %r3, 8(%r1) + lwz %r4, 12(%r1) + + lwz %r0, 116(%r1) + mtlr %r0 + addi %r1, %r1, 112 + + b of_method_not_found@plt .type of_forward, %function .size of_forward, .-of_forward of_forward_stret: stwu %r1, -112(%r1) @@ -110,10 +137,20 @@ stfd %f6, 80(%r1) stfd %f7, 88(%r1) stfd %f8, 96(%r1) mr %r3, %r4 + bl object_getClass@plt + + lis %r4, sel_forwardingTargetForSelector_@ha + la %r4, sel_forwardingTargetForSelector_@l(%r4) + bl class_respondsToSelector@plt + + cmpwi %r3, 0 + beq- fail_stret + + lwz %r3, 12(%r1) lis %r4, sel_forwardingTargetForSelector_@ha la %r4, sel_forwardingTargetForSelector_@l(%r4) bl objc_msg_lookup@plt mtctr %r3 @@ -120,10 +157,17 @@ lwz %r3, 12(%r1) lis %r4, sel_forwardingTargetForSelector_@ha la %r4, sel_forwardingTargetForSelector_@l(%r4) lwz %r5, 16(%r1) bctrl + + cmpwi %r3, 0 + beq- fail_stret + lwz %r4, 12(%r1) + cmpw %r3, %r4 + beq- fail_stret + stw %r3, 12(%r1) lwz %r4, 16(%r1) bl objc_msg_lookup_stret@plt mtctr %r3 @@ -150,10 +194,21 @@ lwz %r0, 116(%r1) mtlr %r0 addi %r1, %r1, 112 bctr + +fail_stret: + lwz %r3, 8(%r1) + lwz %r4, 12(%r1) + lwz %r5, 16(%r1) + + lwz %r0, 116(%r1) + mtlr %r0 + addi %r1, %r1, 112 + + b of_method_not_found_stret@plt .type of_forward_stret, %function .size of_forward_stret, .-of_forward_stret init: lis %r3, module@ha