Overview
Comment: | runtime: Work around compiler bug in Amiga library
This adds the same workaround for objc_enumerationMutation() as for |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
dff419362e42fd23c76845d6c6c0c376 |
User & Date: | js on 2018-05-05 17:46:52 |
Other Links: | manifest | tags |
Context
2018-05-05
| ||
18:06 | runtime: Let objc_get*Class return Class check-in: b3f32186dd user: js tags: trunk | |
17:46 | runtime: Work around compiler bug in Amiga library check-in: dff419362e user: js tags: trunk | |
17:05 | configure: Fix -O2 being dropped from OBJCFLAGS check-in: ae2aa3ef79 user: js tags: trunk | |
Changes
Modified src/runtime/ObjFW_RT.h from [209bda944a] to [4c021bd0e6].
︙ | ︙ | |||
270 271 272 273 274 275 276 | extern bool class_addMethod(Class _Nonnull cls OBJC_M68K_REG("a0"), SEL _Nonnull sel OBJC_M68K_REG("a1"), IMP _Nonnull imp OBJC_M68K_REG("a2"), const char *_Nullable types OBJC_M68K_REG("a3")); extern IMP _Nullable class_replaceMethod(Class _Nonnull cls OBJC_M68K_REG("a0"), SEL _Nonnull sel OBJC_M68K_REG("a1"), IMP _Nonnull imp OBJC_M68K_REG("a2"), const char *_Nullable types OBJC_M68K_REG("a3")); | | | | | 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 | extern bool class_addMethod(Class _Nonnull cls OBJC_M68K_REG("a0"), SEL _Nonnull sel OBJC_M68K_REG("a1"), IMP _Nonnull imp OBJC_M68K_REG("a2"), const char *_Nullable types OBJC_M68K_REG("a3")); extern IMP _Nullable class_replaceMethod(Class _Nonnull cls OBJC_M68K_REG("a0"), SEL _Nonnull sel OBJC_M68K_REG("a1"), IMP _Nonnull imp OBJC_M68K_REG("a2"), const char *_Nullable types OBJC_M68K_REG("a3")); extern Class _Nullable object_getClass(id _Nullable object OBJC_M68K_REG("a0")); extern Class _Nullable object_setClass(id _Nullable object OBJC_M68K_REG("a0"), Class _Nonnull OBJC_M68K_REG("a1")); extern const char *_Nullable object_getClassName( id _Nullable object OBJC_M68K_REG("a0")); extern const char *_Nonnull protocol_getName( Protocol *_Nonnull p OBJC_M68K_REG("a0")); extern bool protocol_isEqual(Protocol *_Nonnull a OBJC_M68K_REG("a0"), Protocol *_Nonnull b OBJC_M68K_REG("a1")); extern bool protocol_conformsToProtocol( Protocol *_Nonnull a OBJC_M68K_REG("a0"), Protocol *_Nonnull b OBJC_M68K_REG("a1")); |
︙ | ︙ | |||
300 301 302 303 304 305 306 | /* * 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. */ extern void __objc_exec_class(void *_Nonnull module); | | | > | | 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 | /* * 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. */ extern void __objc_exec_class(void *_Nonnull module); extern IMP _Nonnull objc_msg_lookup(id _Nullable object, SEL _Nonnull sel); extern IMP _Nonnull objc_msg_lookup_stret(id _Nullable object, SEL _Nonnull sel); extern IMP _Nonnull objc_msg_lookup_super(struct objc_super *_Nonnull super, SEL _Nonnull sel); extern IMP _Nonnull objc_msg_lookup_super_stret( struct objc_super *_Nonnull super, SEL _Nonnull sel); extern id _Nullable objc_lookUpClass(const char *_Nonnull name); extern id _Nullable objc_getClass(const char *_Nonnull name); extern id _Nonnull objc_getRequiredClass(const char *_Nonnull name); extern Class _Nullable objc_lookup_class(const char *_Nonnull name); extern Class _Nonnull objc_get_class(const char *_Nonnull name); extern void objc_exception_throw(id _Nullable object); extern int objc_sync_enter(id _Nullable object); extern int objc_sync_exit(id _Nullable object); extern id _Nullable objc_getProperty(id _Nonnull self, SEL _Nonnull _cmd, ptrdiff_t offset, bool atomic); extern void objc_setProperty(id _Nonnull self, SEL _Nonnull _cmd, ptrdiff_t offset, id _Nullable value, bool atomic, signed char copy); extern void objc_getPropertyStruct(void *_Nonnull dest, const void *_Nonnull src, ptrdiff_t size, bool atomic, bool strong); extern void objc_setPropertyStruct(void *_Nonnull dest, const void *_Nonnull src, ptrdiff_t size, bool atomic, bool strong); extern void objc_enumerationMutation(id _Nonnull object); # ifndef OBJC_NO_PERSONALITY_DECLARATION extern int __gnu_objc_personality_v0(int version, int actions, uint64_t ex_class, void *_Nonnull ex, void *_Nonnull ctx); # endif #ifdef __cplusplus } #endif #endif |
Modified src/runtime/linklib/linklib.m from [ca3819c013] to [c7c08d7d39].
︙ | ︙ | |||
212 213 214 215 216 217 218 | objc_setPropertyStruct(void *dest, const void *src, ptrdiff_t size, bool atomic, bool strong) { glue_objc_setPropertyStruct(dest, src, size, atomic, strong); } void | | > > > > > | > > > > > > | 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 | objc_setPropertyStruct(void *dest, const void *src, ptrdiff_t size, bool atomic, bool strong) { glue_objc_setPropertyStruct(dest, src, size, atomic, strong); } void objc_enumerationMutation(id object) { /* * This does not use the glue code to hack around a compiler bug. * * When using the generated inline stubs, the compiler does not emit * any frame information, making the unwind fail. As a result * objc_enumerationMutation() might throw an exception that could never * be caught. If, however, we're using a function pointer instead of * the inline stub, the compiler does generate a frame and everything * works fine. */ uintptr_t throw = (((uintptr_t)ObjFWRTBase) - 0x8A); ((void (*)(id OBJC_M68K_REG("a0")))throw)(object); } int __gnu_objc_personality_v0(int version, int actions, uint64_t ex_class, void *ex, void *ctx) { return glue___gnu_objc_personality_v0(version, actions, &ex_class, ex, ctx); } |
Modified src/runtime/private.h from [d94124ff8f] to [457aeb2c70].
︙ | ︙ | |||
185 186 187 188 189 190 191 | const char *_Nonnull name OBJC_M68K_REG("a0")); extern id _Nonnull glue_objc_getRequiredClass( const char *_Nonnull name OBJC_M68K_REG("a0")); extern Class _Nullable glue_objc_lookup_class( const char *_Nonnull name OBJC_M68K_REG("a0")); extern Class _Nonnull glue_objc_get_class( const char *_Nonnull name OBJC_M68K_REG("a0")); | < < | 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 | const char *_Nonnull name OBJC_M68K_REG("a0")); extern id _Nonnull glue_objc_getRequiredClass( const char *_Nonnull name OBJC_M68K_REG("a0")); extern Class _Nullable glue_objc_lookup_class( const char *_Nonnull name OBJC_M68K_REG("a0")); extern Class _Nonnull glue_objc_get_class( const char *_Nonnull name OBJC_M68K_REG("a0")); extern int glue_objc_sync_enter(id _Nullable object OBJC_M68K_REG("a0")); extern int glue_objc_sync_exit(id _Nullable object OBJC_M68K_REG("a0")); extern id _Nullable glue_objc_getProperty(id _Nonnull self OBJC_M68K_REG("a0"), SEL _Nonnull _cmd OBJC_M68K_REG("a1"), ptrdiff_t offset OBJC_M68K_REG("d0"), bool atomic OBJC_M68K_REG("d1")); extern void glue_objc_setProperty(id _Nonnull self OBJC_M68K_REG("a0"), SEL _Nonnull _cmd OBJC_M68K_REG("a1"), ptrdiff_t offset OBJC_M68K_REG("d0"), id _Nullable value OBJC_M68K_REG("a2"), bool atomic OBJC_M68K_REG("d1"), signed char copy OBJC_M68K_REG("d2")); extern void glue_objc_getPropertyStruct(void *_Nonnull dest OBJC_M68K_REG("a0"), const void *_Nonnull src OBJC_M68K_REG("a1"), ptrdiff_t size OBJC_M68K_REG("d0"), bool atomic OBJC_M68K_REG("d1"), bool strong OBJC_M68K_REG("d2")); extern void glue_objc_setPropertyStruct(void *_Nonnull dest OBJC_M68K_REG("a0"), const void *_Nonnull src OBJC_M68K_REG("a1"), ptrdiff_t size OBJC_M68K_REG("d0"), bool atomic OBJC_M68K_REG("d1"), bool strong OBJC_M68K_REG("d2")); extern int glue___gnu_objc_personality_v0(int version OBJC_M68K_REG("d0"), int actions OBJC_M68K_REG("d1"), uint64_t *_Nonnull ex_class OBJC_M68K_REG("d2"), void *_Nonnull ex OBJC_M68K_REG("a0"), void *_Nonnull ctx OBJC_M68K_REG("a1")); #endif |
︙ | ︙ |