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