/*-1* Copyright (c) 2014 David T Chisnall2* All rights reserved.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9* 2. Redistributions in binary form must reproduce the above copyright10* notice, this list of conditions and the following disclaimer in the11* documentation and/or other materials provided with the distribution.12*13* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND14* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE15* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE16* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE17* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL18* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS19* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)20* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT21* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY22* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF23* SUCH DAMAGE.24*/2526#ifdef __BLOCKS__27/**28* Declares a block variable. This macro is defined in the trivial way for29* compilers that support blocks and exposing the ABI in the source for other30* compilers.31*/32#define DECLARE_BLOCK(retTy, name, argTys, ...)\33retTy(^name)(argTys, ## __VA_ARGS__)34/**35* Calls a block variable. This macro is defined in the trivial way for36* compilers that support blocks and exposing the ABI in the source for other37* compilers.38*/39#define CALL_BLOCK(name, ...) (name)(__VA_ARGS__)40#else // !__BLOCKS__41#define DECLARE_BLOCK(retTy, name, argTys, ...)\42struct {\43void *isa;\44int flags;\45int reserved;\46retTy (*invoke)(void *, ...);\47} *name48#define CALL_BLOCK(name, ...) (name)->invoke(name, __VA_ARGS__)49#endif // __BLOCKS__50/**51* Returns the pointer to the block-invoke function. This is used for passing52* blocks to functions that want a function pointer and a data pointer.53*/54#define GET_BLOCK_FUNCTION(x) \55(((struct {\56void *isa;\57int flags;\58int reserved;\59void (*invoke)(void *, ...);\60}*)(void*)x)->invoke)616263