+
+ # Store catch stack in thread local storage
+ v.add_decl """
+#if defined(TARGET_OS_IPHONE)
+ // Use pthread_key_create and others for iOS
+ #include <pthread.h>
+
+ static pthread_key_t catch_stack_key;
+ static pthread_once_t catch_stack_key_created = PTHREAD_ONCE_INIT;
+
+ static void create_catch_stack()
+ {
+ pthread_key_create(&catch_stack_key, NULL);
+ }
+
+ struct catch_stack_t *getCatchStack()
+ {
+ pthread_once(&catch_stack_key_created, &create_catch_stack);
+ struct catch_stack_t *data = pthread_getspecific(catch_stack_key);
+ if (data == NULL) {
+ data = malloc(sizeof(struct catch_stack_t));
+ data->cursor = -1;
+ data->currentSize = 0;
+ data->envs = NULL;
+ pthread_setspecific(catch_stack_key, data);
+ }
+ return data;
+ }
+#else
+ // Use __thread when available
+ __thread struct catch_stack_t catchStack = {-1, 0, NULL};
+
+ struct catch_stack_t *getCatchStack()
+ {
+ return &catchStack;
+ }
+#endif
+"""