Forwarding-hook.html 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <!-- Copyright (C) 1988-2017 Free Software Foundation, Inc.
  4. Permission is granted to copy, distribute and/or modify this document
  5. under the terms of the GNU Free Documentation License, Version 1.3 or
  6. any later version published by the Free Software Foundation; with the
  7. Invariant Sections being "Funding Free Software", the Front-Cover
  8. Texts being (a) (see below), and with the Back-Cover Texts being (b)
  9. (see below). A copy of the license is included in the section entitled
  10. "GNU Free Documentation License".
  11. (a) The FSF's Front-Cover Text is:
  12. A GNU Manual
  13. (b) The FSF's Back-Cover Text is:
  14. You have freedom to copy and modify this GNU Manual, like GNU
  15. software. Copies published by the Free Software Foundation raise
  16. funds for GNU development. -->
  17. <!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
  18. <head>
  19. <title>Using the GNU Compiler Collection (GCC): Forwarding hook</title>
  20. <meta name="description" content="Using the GNU Compiler Collection (GCC): Forwarding hook">
  21. <meta name="keywords" content="Using the GNU Compiler Collection (GCC): Forwarding hook">
  22. <meta name="resource-type" content="document">
  23. <meta name="distribution" content="global">
  24. <meta name="Generator" content="makeinfo">
  25. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  26. <link href="index.html#Top" rel="start" title="Top">
  27. <link href="Option-Index.html#Option-Index" rel="index" title="Option Index">
  28. <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
  29. <link href="Messaging-with-the-GNU-Objective_002dC-runtime.html#Messaging-with-the-GNU-Objective_002dC-runtime" rel="up" title="Messaging with the GNU Objective-C runtime">
  30. <link href="Compatibility.html#Compatibility" rel="next" title="Compatibility">
  31. <link href="Dynamically-registering-methods.html#Dynamically-registering-methods" rel="prev" title="Dynamically registering methods">
  32. <style type="text/css">
  33. <!--
  34. a.summary-letter {text-decoration: none}
  35. blockquote.smallquotation {font-size: smaller}
  36. div.display {margin-left: 3.2em}
  37. div.example {margin-left: 3.2em}
  38. div.indentedblock {margin-left: 3.2em}
  39. div.lisp {margin-left: 3.2em}
  40. div.smalldisplay {margin-left: 3.2em}
  41. div.smallexample {margin-left: 3.2em}
  42. div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
  43. div.smalllisp {margin-left: 3.2em}
  44. kbd {font-style:oblique}
  45. pre.display {font-family: inherit}
  46. pre.format {font-family: inherit}
  47. pre.menu-comment {font-family: serif}
  48. pre.menu-preformatted {font-family: serif}
  49. pre.smalldisplay {font-family: inherit; font-size: smaller}
  50. pre.smallexample {font-size: smaller}
  51. pre.smallformat {font-family: inherit; font-size: smaller}
  52. pre.smalllisp {font-size: smaller}
  53. span.nocodebreak {white-space:nowrap}
  54. span.nolinebreak {white-space:nowrap}
  55. span.roman {font-family:serif; font-weight:normal}
  56. span.sansserif {font-family:sans-serif; font-weight:normal}
  57. ul.no-bullet {list-style: none}
  58. -->
  59. </style>
  60. </head>
  61. <body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
  62. <a name="Forwarding-hook"></a>
  63. <div class="header">
  64. <p>
  65. Previous: <a href="Dynamically-registering-methods.html#Dynamically-registering-methods" accesskey="p" rel="prev">Dynamically registering methods</a>, Up: <a href="Messaging-with-the-GNU-Objective_002dC-runtime.html#Messaging-with-the-GNU-Objective_002dC-runtime" accesskey="u" rel="up">Messaging with the GNU Objective-C runtime</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
  66. </div>
  67. <hr>
  68. <a name="Forwarding-Hook"></a>
  69. <h4 class="subsection">8.10.2 Forwarding Hook</h4>
  70. <p>The GNU Objective-C runtime provides a hook, called
  71. <code>__objc_msg_forward2</code>, which is called by
  72. <code>objc_msg_lookup()</code> when it cannot find a method implementation in
  73. the runtime tables and after calling <code>+resolveInstanceMethod:</code>
  74. and <code>+resolveClassMethod:</code> has been attempted and did not succeed
  75. in dynamically registering the method.
  76. </p>
  77. <p>To configure the hook, you set the global variable
  78. <code>__objc_msg_forward2</code> to a function with the same argument and
  79. return types of <code>objc_msg_lookup()</code>. When
  80. <code>objc_msg_lookup()</code> can not find a method implementation, it
  81. invokes the hook function you provided to get a method implementation
  82. to return. So, in practice <code>__objc_msg_forward2</code> allows you to
  83. extend <code>objc_msg_lookup()</code> by adding some custom code that is
  84. called to do a further lookup when no standard method implementation
  85. can be found using the normal lookup.
  86. </p>
  87. <p>This hook is generally reserved for &ldquo;Foundation&rdquo; libraries such as
  88. GNUstep Base, which use it to implement their high-level method
  89. forwarding API, typically based around the <code>forwardInvocation:</code>
  90. method. So, unless you are implementing your own &ldquo;Foundation&rdquo;
  91. library, you should not set this hook.
  92. </p>
  93. <p>In a typical forwarding implementation, the <code>__objc_msg_forward2</code>
  94. hook function determines the argument and return type of the method
  95. that is being looked up, and then creates a function that takes these
  96. arguments and has that return type, and returns it to the caller.
  97. Creating this function is non-trivial and is typically performed using
  98. a dedicated library such as <code>libffi</code>.
  99. </p>
  100. <p>The forwarding method implementation thus created is returned by
  101. <code>objc_msg_lookup()</code> and is executed as if it was a normal method
  102. implementation. When the forwarding method implementation is called,
  103. it is usually expected to pack all arguments into some sort of object
  104. (typically, an <code>NSInvocation</code> in a &ldquo;Foundation&rdquo; library), and
  105. hand it over to the programmer (<code>forwardInvocation:</code>) who is then
  106. allowed to manipulate the method invocation using a high-level API
  107. provided by the &ldquo;Foundation&rdquo; library. For example, the programmer
  108. may want to examine the method invocation arguments and name and
  109. potentially change them before forwarding the method invocation to one
  110. or more local objects (<code>performInvocation:</code>) or even to remote
  111. objects (by using Distributed Objects or some other mechanism). When
  112. all this completes, the return value is passed back and must be
  113. returned correctly to the original caller.
  114. </p>
  115. <p>Note that the GNU Objective-C runtime currently provides no support
  116. for method forwarding or method invocations other than the
  117. <code>__objc_msg_forward2</code> hook.
  118. </p>
  119. <p>If the forwarding hook does not exist or returns <code>NULL</code>, the
  120. runtime currently attempts forwarding using an older, deprecated API,
  121. and if that fails, it aborts the program. In future versions of the
  122. GNU Objective-C runtime, the runtime will immediately abort.
  123. </p>
  124. <hr>
  125. <div class="header">
  126. <p>
  127. Previous: <a href="Dynamically-registering-methods.html#Dynamically-registering-methods" accesskey="p" rel="prev">Dynamically registering methods</a>, Up: <a href="Messaging-with-the-GNU-Objective_002dC-runtime.html#Messaging-with-the-GNU-Objective_002dC-runtime" accesskey="u" rel="up">Messaging with the GNU Objective-C runtime</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html#Option-Index" title="Index" rel="index">Index</a>]</p>
  128. </div>
  129. </body>
  130. </html>