Artifact 33b194a33a07718362929ca3f85ec412eb5a40a8766a3904b8dfae0a08f1e542:
- File
src/runtime/runtime.h
— part of check-in
[f57765b5c6]
at
2017-01-08 20:14:08
on branch trunk
— Clean up the dllexport mess a little
For many of those, it's not actually required to declare them dllexport.
Declaring them at all is enough to prevent Clang from using its implicit
declaration that is dllimport. (user: js, size: 7057) [annotate] [blame] [check-ins using]
/* * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 * Jonathan Schleifer <js@heap.zone> * * All rights reserved. * * This file is part of ObjFW. It may be distributed under the terms of the * Q Public License 1.0, which can be found in the file LICENSE.QPL included in * the packaging of this file. * * Alternatively, it may be distributed under the terms of the GNU General * Public License, either version 2 or 3, which can be found in the file * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #ifndef __OBJFW_RUNTIME_H__ #define __OBJFW_RUNTIME_H__ #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS #endif #ifndef __STDC_CONSTANT_MACROS # define __STDC_CONSTANT_MACROS #endif #include <stdbool.h> #include <stddef.h> #include <stdint.h> #ifndef __has_feature # define __has_feature(x) 0 #endif #ifndef __has_attribute # define __has_attribute(x) 0 #endif #if __has_feature(objc_arc) # define OBJC_UNSAFE_UNRETAINED __unsafe_unretained #else # define OBJC_UNSAFE_UNRETAINED #endif #if __has_attribute(__objc_root_class__) # define OBJC_ROOT_CLASS __attribute__((__objc_root_class__)) #else # define OBJC_ROOT_CLASS #endif #define Nil (Class)0 #define nil (id)0 #define YES (BOOL)1 #define NO (BOOL)0 typedef struct objc_class* Class; typedef struct objc_object* id; typedef const struct objc_selector* SEL; typedef signed char BOOL; typedef id (*IMP)(id, SEL, ...); typedef void (*objc_uncaught_exception_handler)(id); struct objc_class { Class isa; Class superclass; const char *name; unsigned long version; unsigned long info; long instance_size; struct objc_ivar_list *ivars; struct objc_method_list *methodlist; struct objc_dtable *dtable; Class *subclass_list; void *sibling_class; struct objc_protocol_list *protocols; void *gc_object_type; unsigned long abi_version; int32_t **ivar_offsets; struct objc_property_list *properties; }; enum objc_class_info { OBJC_CLASS_INFO_CLASS = 0x001, OBJC_CLASS_INFO_METACLASS = 0x002, OBJC_CLASS_INFO_NEW_ABI = 0x010, OBJC_CLASS_INFO_SETUP = 0x100, OBJC_CLASS_INFO_LOADED = 0x200, OBJC_CLASS_INFO_DTABLE = 0x400, OBJC_CLASS_INFO_INITIALIZED = 0x800 }; struct objc_object { Class isa; }; struct objc_selector { uintptr_t uid; const char *types; }; struct objc_super { id OBJC_UNSAFE_UNRETAINED self; Class cls; }; struct objc_method { struct objc_selector sel; IMP imp; }; struct objc_method_list { struct objc_method_list *next; unsigned int count; struct objc_method methods[1]; }; struct objc_category { const char *category_name; const char *class_name; struct objc_method_list *instance_methods; struct objc_method_list *class_methods; struct objc_protocol_list *protocols; }; struct objc_ivar { const char *name; const char *type; unsigned int offset; }; struct objc_ivar_list { unsigned int count; struct objc_ivar ivars[1]; }; enum objc_property_attributes { OBJC_PROPERTY_READONLY = 0x01, OBJC_PROPERTY_GETTER = 0x02, OBJC_PROPERTY_ASSIGN = 0x04, OBJC_PROPERTY_READWRITE = 0x08, OBJC_PROPERTY_RETAIN = 0x10, OBJC_PROPERTY_COPY = 0x20, OBJC_PROPERTY_NONATOMIC = 0x40, OBJC_PROPERTY_SETTER = 0x80 }; enum objc_property_extended_attributes { OBJC_PROPERTY_SYNTHESIZE = 0x1, OBJC_PROPERTY_DYNAMIC = 0x2, OBJC_PROPERTY_PROTOCOL = 0x3, OBJC_PROPERTY_ATOMIC = 0x4, OBJC_PROPERTY_WEAK = 0x8, OBJC_PROPERTY_STRONG = 0x10, OBJC_PROPERTY_UNSAFE_UNRETAINED = 0x20 }; struct objc_property { const char *name; unsigned char attributes, extended_attributes; struct { const char *name; const char *type; } getter, setter; }; struct objc_property_list { unsigned int count; struct objc_property_list *next; struct objc_property properties[1]; }; #ifdef __OBJC__ OBJC_ROOT_CLASS @interface Protocol { @public #else typedef struct { #endif Class isa; const char *name; struct objc_protocol_list *protocol_list; struct objc_abi_method_description_list *instance_methods; struct objc_abi_method_description_list *class_methods; #ifdef __OBJC__ } @end #else } Protocol; #endif struct objc_protocol_list { struct objc_protocol_list *next; long count; Protocol *OBJC_UNSAFE_UNRETAINED list[1]; }; #ifdef __cplusplus extern "C" { #endif extern SEL sel_registerName(const char*); extern const char* sel_getName(SEL); extern bool sel_isEqual(SEL, SEL); extern Class objc_allocateClassPair(Class, const char*, size_t); extern void objc_registerClassPair(Class); extern id objc_lookUpClass(const char*); extern id objc_getClass(const char*); extern id objc_getRequiredClass(const char*); extern unsigned int objc_getClassList(Class*, unsigned int); extern Class* objc_copyClassList(unsigned int*); extern bool class_isMetaClass(Class); extern const char* class_getName(Class); extern Class class_getSuperclass(Class); extern unsigned long class_getInstanceSize(Class); extern bool class_respondsToSelector(Class, SEL); extern bool class_conformsToProtocol(Class, Protocol*); extern IMP class_getMethodImplementation(Class, SEL); extern IMP class_getMethodImplementation_stret(Class, SEL); extern const char* class_getMethodTypeEncoding(Class, SEL); extern bool class_addMethod(Class, SEL, IMP, const char*); extern IMP class_replaceMethod(Class, SEL, IMP, const char*); extern Class object_getClass(id); extern Class object_setClass(id, Class); extern const char* object_getClassName(id); extern const char* protocol_getName(Protocol*); extern bool protocol_isEqual(Protocol*, Protocol*); extern bool protocol_conformsToProtocol(Protocol*, Protocol*); extern void objc_exit(void); extern objc_uncaught_exception_handler objc_setUncaughtExceptionHandler( objc_uncaught_exception_handler); extern void objc_setForwardHandler(IMP, IMP); extern id objc_autorelease(id); extern void* objc_autoreleasePoolPush(void); extern void objc_autoreleasePoolPop(void*); extern id _objc_rootAutorelease(id); extern void objc_zero_weak_references(id); /* * Used by the compiler, but can also be called manually. * * These declarations are also required to prevent Clang's implicit * declarations which include __declspec(dllimport) on Windows. */ struct objc_abi_module; extern void __objc_exec_class(struct objc_abi_module*); extern IMP objc_msg_lookup(id, SEL); extern IMP objc_msg_lookup_stret(id, SEL); extern IMP objc_msg_lookup_super(struct objc_super*, SEL); extern IMP objc_msg_lookup_super_stret(struct objc_super*, SEL); extern void objc_exception_throw(id); extern int objc_sync_enter(id); extern int objc_sync_exit(id); extern id objc_getProperty(id, SEL, ptrdiff_t, BOOL); extern void objc_setProperty(id, SEL, ptrdiff_t, id, BOOL, signed char); extern void objc_getPropertyStruct(void*, const void*, ptrdiff_t, BOOL, BOOL); extern void objc_setPropertyStruct(void*, const void*, ptrdiff_t, BOOL, BOOL); extern void objc_enumerationMutation(id); extern void objc_setEnumerationMutationHandler(void (*handler)(id)); #ifdef __cplusplus } #endif #undef OBJC_UNSAFE_UNRETAINED #undef OBJC_ROOT_CLASS #endif