1/* 2 * Copyright (c) 2010 Apple Inc. All rights reserved. 3 * 4 * @APPLE_LLVM_LICENSE_HEADER@ 5 */ 6 7struct objc_selector; struct objc_class; 8#ifndef OBJC_SUPER 9struct objc_super { struct objc_object *object; struct objc_object *superClass; objc_super(struct objc_object *o, struct objc_object *s) : object(o), superClass(s) {} }; 10#define OBJC_SUPER 11#endif 12#ifndef _REWRITER_typedef_Protocol 13typedef struct objc_object Protocol; 14#define _REWRITER_typedef_Protocol 15#endif 16#define __OBJC_RW_EXTERN extern "C" __declspec(dllimport) 17__OBJC_RW_EXTERN struct objc_object *objc_msgSend(struct objc_object *, struct objc_selector *, ...); 18__OBJC_RW_EXTERN struct objc_object *objc_msgSendSuper(struct objc_super *, struct objc_selector *, ...); 19__OBJC_RW_EXTERN struct objc_object *objc_msgSend_stret(struct objc_object *, struct objc_selector *, ...); 20__OBJC_RW_EXTERN struct objc_object *objc_msgSendSuper_stret(struct objc_super *, struct objc_selector *, ...); 21__OBJC_RW_EXTERN double objc_msgSend_fpret(struct objc_object *, struct objc_selector *, ...); 22__OBJC_RW_EXTERN struct objc_object *objc_getClass(const char *); 23__OBJC_RW_EXTERN struct objc_object *objc_getMetaClass(const char *); 24__OBJC_RW_EXTERN void objc_exception_throw(struct objc_object *); 25__OBJC_RW_EXTERN void objc_exception_try_enter(void *); 26__OBJC_RW_EXTERN void objc_exception_try_exit(void *); 27__OBJC_RW_EXTERN struct objc_object *objc_exception_extract(void *); 28__OBJC_RW_EXTERN int objc_exception_match(struct objc_class *, struct objc_object *); 29__OBJC_RW_EXTERN void objc_sync_enter(struct objc_object *); 30__OBJC_RW_EXTERN void objc_sync_exit(struct objc_object *); 31__OBJC_RW_EXTERN Protocol *objc_getProtocol(const char *); 32#ifndef __FASTENUMERATIONSTATE 33struct __objcFastEnumerationState { 34 unsigned long state; 35 void **itemsPtr; 36 unsigned long *mutationsPtr; 37 unsigned long extra[5]; 38}; 39__OBJC_RW_EXTERN void objc_enumerationMutation(struct objc_object *); 40#define __FASTENUMERATIONSTATE 41#endif 42#ifndef __NSCONSTANTSTRINGIMPL 43struct __NSConstantStringImpl { 44 int *isa; 45 int flags; 46 char *str; 47 long length; 48}; 49#ifdef CF_EXPORT_CONSTANT_STRING 50extern "C" __declspec(dllexport) int __CFConstantStringClassReference[]; 51#else 52__OBJC_RW_EXTERN int __CFConstantStringClassReference[]; 53#endif 54#define __NSCONSTANTSTRINGIMPL 55#endif 56#ifndef BLOCK_IMPL 57#define BLOCK_IMPL 58struct __block_impl { 59 void *isa; 60 int Flags; 61 int Size; 62 void *FuncPtr; 63}; 64enum { 65 BLOCK_HAS_COPY_DISPOSE = (1<<25), 66 BLOCK_IS_GLOBAL = (1<<28) 67}; 68// Runtime copy/destroy helper functions 69__OBJC_RW_EXTERN void _Block_copy_assign(void *, void *); 70__OBJC_RW_EXTERN void _Block_byref_assign_copy(void *, void *); 71__OBJC_RW_EXTERN void _Block_destroy(void *); 72__OBJC_RW_EXTERN void _Block_byref_release(void *); 73__OBJC_RW_EXTERN void *_NSConcreteGlobalBlock; 74__OBJC_RW_EXTERN void *_NSConcreteStackBlock; 75#endif 76#undef __OBJC_RW_EXTERN 77#define __attribute__(X) 78// ..\clang -rewrite-objc -fms-extensions simpleblock.c 79 80 81 82#include <iostream> 83using namespace std; 84#include "Block.h" 85 86 87 88 89struct __main_block_impl_0 { 90 struct __block_impl impl; 91 __main_block_impl_0(void *fp, int flags=0) { 92 impl.isa = 0/*&_NSConcreteStackBlock*/; 93 impl.Size = sizeof(__main_block_impl_0); 94 impl.Flags = flags; 95 impl.FuncPtr = fp; 96 } 97}; 98static void __main_block_func_0(struct __main_block_impl_0 *__cself, int x) { 99 100 101 cout << "Hello, " << x << endl; 102 103 } 104int main(int argc, char **argv) { 105 106 void(*aBlock)(int x); 107 108 void(*bBlock)(int x); 109 110 111 112 aBlock = (void (*)(int))&__main_block_impl_0((void *)__main_block_func_0); 113 114 115 116 ((void (*)(struct __block_impl *, int))((struct __block_impl *)aBlock)->FuncPtr)((struct __block_impl *)aBlock, 42); 117 118 119 120 bBlock = (void *)Block_copy(aBlock); 121 122 123 124 ((void (*)(struct __block_impl *, int))((struct __block_impl *)bBlock)->FuncPtr)((struct __block_impl *)bBlock, 46); 125 126 127 128 Block_release(bBlock); 129 130 131 132 return 0; 133 134} 135 136