| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See http://swift.org/LICENSE.txt for license information |
| // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| |
| |
| #ifndef _Block_H_ |
| #define _Block_H_ |
| |
| #if !defined(BLOCK_EXPORT) |
| # if defined(__cplusplus) |
| # define BLOCK_EXPORT extern "C" |
| # else |
| # define BLOCK_EXPORT extern |
| # endif |
| #endif |
| |
| #if __cplusplus |
| extern "C" { |
| #endif |
| |
| // Create a heap based copy of a Block or simply add a reference to an existing one. |
| // This must be paired with Block_release to recover memory, even when running |
| // under Objective-C Garbage Collection. |
| BLOCK_EXPORT void *_Block_copy(const void *aBlock); |
| |
| // Lose the reference, and if heap based and last reference, recover the memory |
| BLOCK_EXPORT void _Block_release(const void *aBlock); |
| |
| // Used by the compiler. Do not call this function yourself. |
| BLOCK_EXPORT void _Block_object_assign(void *, const void *, const int); |
| |
| // Used by the compiler. Do not call this function yourself. |
| BLOCK_EXPORT void _Block_object_dispose(const void *, const int); |
| |
| // Used by the compiler. Do not use these variables yourself. |
| BLOCK_EXPORT void * _NSConcreteGlobalBlock[32]; |
| BLOCK_EXPORT void * _NSConcreteStackBlock[32]; |
| |
| #if __cplusplus |
| } |
| #endif |
| |
| // Type correct macros |
| |
| #define Block_copy(...) ((__typeof(__VA_ARGS__))_Block_copy((const void *)(__VA_ARGS__))) |
| #define Block_release(...) _Block_release((const void *)(__VA_ARGS__)) |
| |
| |
| #endif |