···11+#ifndef OBJC_RETURN_H
22+#define OBJC_RETURN_H
33+44+// Does nothing, but given it's signature, it will actually return
55+// the last return value (contents of eax/rax on x86)
66+extern "C" void* returnReturn();
77+88+#endif
99+
+8
src/libobjcdarwin/new/return.nasm
···11+section .note.GNU-stack noalloc noexec nowrite progbits
22+section text
33+44+global returnReturn
55+66+returnReturn:
77+ ret
88+
···11+#ifndef OBJC_EXCEPTIONS_H
22+#define OBJC_EXCEPTIONS_H
33+#include <objc/runtime.h>
44+#include <setjmp.h>
55+#include "../visibility.h"
66+77+// Apple 32-bit ObjC ABI doesn't use Itanium ABI zero-cost exceptions.
88+// Instead, every try block is registered and deregistered, every catch
99+// block is tested for usability with a runtime function call and if no
1010+// match is found, the exception is thrown again to traverse the try
1111+// block chain.
1212+1313+struct TryBlock
1414+{
1515+ jmp_buf buffer;
1616+1717+ union
1818+ {
1919+ void* fourPointers[4];
2020+2121+ struct
2222+ {
2323+ objc_object* exceptionObject;
2424+ TryBlock* previousBlock;
2525+ };
2626+ };
2727+};
2828+2929+extern "C" {
3030+3131+// This function is called repeatedly until a handler is found
3232+DARLING_VISIBLE void __darwin_objc_exception_throw(objc_object* object);
3333+3434+// Called on every @try {
3535+DARLING_VISIBLE void objc_exception_try_enter(TryBlock* state);
3636+3737+// Called on every } of a @try block
3838+DARLING_VISIBLE void objc_exception_try_exit(TryBlock* state);
3939+4040+// Called to get the exception object
4141+DARLING_VISIBLE void* objc_exception_extract(TryBlock* state);
4242+4343+// Called to check if the handler's type is appropriate for the exception object
4444+DARLING_VISIBLE int objc_exception_match(objc_class* cls, objc_object* object);
4545+4646+}
4747+4848+#endif
4949+