brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.9 KiB · 91d8d8a Raw
180 lines · c
1/*2 * Block_private.h3 *4 * Copyright 2008-2010 Apple, Inc. Permission is hereby granted, free of charge,5 * to any person obtaining a copy of this software and associated documentation6 * files (the "Software"), to deal in the Software without restriction,7 * including without limitation the rights to use, copy, modify, merge, publish,8 * distribute, sublicense, and/or sell copies of the Software, and to permit9 * persons to whom the Software is furnished to do so, subject to the following10 * conditions:11 * 12 * The above copyright notice and this permission notice shall be included in13 * all copies or substantial portions of the Software.14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE18 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE21 * SOFTWARE.22 *23 */24 25#ifndef _BLOCK_PRIVATE_H_26#define _BLOCK_PRIVATE_H_27 28#if !defined(BLOCK_EXPORT)29#   if defined(__cplusplus)30#       define BLOCK_EXPORT extern "C"31#   else32#       define BLOCK_EXPORT extern33#   endif34#endif35 36#ifndef _MSC_VER37#include <stdbool.h>38#else39/* MSVC doesn't have <stdbool.h>. Compensate. */40typedef char bool;41#define true (bool)142#define false (bool)043#endif44 45#if defined(__cplusplus)46extern "C" {47#endif48 49 50enum {51    BLOCK_REFCOUNT_MASK =     (0xffff),52    BLOCK_NEEDS_FREE =        (1 << 24),53    BLOCK_HAS_COPY_DISPOSE =  (1 << 25),54    BLOCK_HAS_CTOR =          (1 << 26), /* Helpers have C++ code. */55    BLOCK_IS_GC =             (1 << 27),56    BLOCK_IS_GLOBAL =         (1 << 28),57    BLOCK_HAS_DESCRIPTOR =    (1 << 29)58};59 60 61/* Revised new layout. */62struct Block_descriptor {63    unsigned long int reserved;64    unsigned long int size;65    void (*copy)(void *dst, void *src);66    void (*dispose)(void *);67};68 69 70struct Block_layout {71    void *isa;72    int flags;73    int reserved; 74    void (*invoke)(void *, ...);75    struct Block_descriptor *descriptor;76    /* Imported variables. */77};78 79 80struct Block_byref {81    void *isa;82    struct Block_byref *forwarding;83    int flags; /* refcount; */84    int size;85    void (*byref_keep)(struct Block_byref *dst, struct Block_byref *src);86    void (*byref_destroy)(struct Block_byref *);87    /* long shared[0]; */88};89 90 91struct Block_byref_header {92    void *isa;93    struct Block_byref *forwarding;94    int flags;95    int size;96};97 98 99/* Runtime support functions used by compiler when generating copy/dispose helpers. */100 101enum {102    /* See function implementation for a more complete description of these fields and combinations */103    BLOCK_FIELD_IS_OBJECT   =  3,  /* id, NSObject, __attribute__((NSObject)), block, ... */104    BLOCK_FIELD_IS_BLOCK    =  7,  /* a block variable */105    BLOCK_FIELD_IS_BYREF    =  8,  /* the on stack structure holding the __block variable */106    BLOCK_FIELD_IS_WEAK     = 16,  /* declared __weak, only used in byref copy helpers */107    BLOCK_BYREF_CALLER      = 128  /* called from __block (byref) copy/dispose support routines. */108};109 110/* Runtime entry point called by compiler when assigning objects inside copy helper routines */111BLOCK_EXPORT void _Block_object_assign(void *destAddr, const void *object, const int flags);112    /* BLOCK_FIELD_IS_BYREF is only used from within block copy helpers */113 114 115/* runtime entry point called by the compiler when disposing of objects inside dispose helper routine */116BLOCK_EXPORT void _Block_object_dispose(const void *object, const int flags);117 118 119 120/* Other support functions */121 122/* Runtime entry to get total size of a closure */123BLOCK_EXPORT unsigned long int Block_size(void *block_basic);124 125 126 127/* the raw data space for runtime classes for blocks */128/* class+meta used for stack, malloc, and collectable based blocks */129BLOCK_EXPORT void * _NSConcreteStackBlock[32];130BLOCK_EXPORT void * _NSConcreteMallocBlock[32];131BLOCK_EXPORT void * _NSConcreteAutoBlock[32];132BLOCK_EXPORT void * _NSConcreteFinalizingBlock[32];133BLOCK_EXPORT void * _NSConcreteGlobalBlock[32];134BLOCK_EXPORT void * _NSConcreteWeakBlockVariable[32];135 136 137/* the intercept routines that must be used under GC */138BLOCK_EXPORT void _Block_use_GC( void *(*alloc)(const unsigned long, const bool isOne, const bool isObject),139                                  void (*setHasRefcount)(const void *, const bool),140                                  void (*gc_assign_strong)(void *, void **),141                                  void (*gc_assign_weak)(const void *, void *),142                                  void (*gc_memmove)(void *, void *, unsigned long));143 144/* earlier version, now simply transitional */145BLOCK_EXPORT void _Block_use_GC5( void *(*alloc)(const unsigned long, const bool isOne, const bool isObject),146                                  void (*setHasRefcount)(const void *, const bool),147                                  void (*gc_assign_strong)(void *, void **),148                                  void (*gc_assign_weak)(const void *, void *));149 150BLOCK_EXPORT void _Block_use_RR( void (*retain)(const void *),151                                 void (*release)(const void *));152 153/* make a collectable GC heap based Block.  Not useful under non-GC. */154BLOCK_EXPORT void *_Block_copy_collectable(const void *aBlock);155 156/* thread-unsafe diagnostic */157BLOCK_EXPORT const char *_Block_dump(const void *block);158 159 160/* Obsolete */161 162/* first layout */163struct Block_basic {164    void *isa;165    int Block_flags;  /* int32_t */166    int Block_size;  /* XXX should be packed into Block_flags */167    void (*Block_invoke)(void *);168    void (*Block_copy)(void *dst, void *src);  /* iff BLOCK_HAS_COPY_DISPOSE */169    void (*Block_dispose)(void *);             /* iff BLOCK_HAS_COPY_DISPOSE */170    /* long params[0];  // where const imports, __block storage references, etc. get laid down */171};172 173 174#if defined(__cplusplus)175}176#endif177 178 179#endif /* _BLOCK_PRIVATE_H_ */180