Changes In Branch 0.90 Through [892e623e3a] Excluding Merge-Ins
This is equivalent to a diff from 636098dbdd to 892e623e3a
2017-09-26
| ||
00:06 | Fix a few missing nullable check-in: cfb4a7ab76 user: js tags: 0.90 | |
2017-09-24
| ||
01:21 | OFTCPSocket: Retain exception for async connect check-in: 892e623e3a user: js tags: 0.90 | |
2017-08-20
| ||
19:30 | ChangeLog: Add 0.90.1 check-in: 5c0bf046cc user: js tags: 0.90.1-release, 0.90 | |
2017-07-29
| ||
10:50 | Set version to 0.90-dev as 0.90 has been branched check-in: 7e614ef5c0 user: js tags: trunk | |
10:22 | Create 0.90 branch check-in: f934699959 user: js tags: 0.90 | |
2017-07-24
| ||
20:33 | runtime: Don't depend on platform.h in ObjFW-RT.h check-in: 636098dbdd user: js tags: trunk | |
20:29 | OFINIFile: Always use \r\n check-in: 1248c00475 user: js tags: trunk | |
Modified ChangeLog from [22a812d84f] to [f57f7a2cc8].
1 2 3 4 5 6 7 8 9 10 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | Legend: * Changes of existing features or bugfixes + New features This file only contains the most significant changes. ObjFW 0.90 -> ObjFW 0.90.1, 20.08.2017 * OFData: Fix -[description] * OFFileManager: Set errno to 0 before readdir() * OFDate: Add -[localMinute] * OFTarArchiveEntry: Fix prefix handling for ustar * OFZIPArchive: Fix uncompressed + data descriptor * OFArray: Fix MessagePack encoding * of_asprintf: Don't require set up OFLocalization * OFGZIPStream: Add missing documentation * Fix a linker warning on OpenBSD/SPARC64 * Remove the OFFile b modes from MorphOS (they were already removed for all other OSes) ObjFW 0.8.1 -> ObjFW 0.90, 01.08.2017 + New classes: OFFileManager, OFGZIPStream, OFTarArchive, OFTarArchiveEntry OFHMAC, OFSandbox, OFHTTPCookie, OFHTTPCookieManager, OFLocalization + New platforms: Nintendo 3DS, MorphOS + New lookup assembly for platforms: SPARC64/ELF, ARM64/ELF + New forwarding for: ARM64/ELF + New tools: objfw-new (to create boilerplate code) + New options: --disable-unicode-tables * Required GCC version increased to 4.6 * OFDataArray was split into OFData and OFMutableData * OFURL was split into OFURL and OFMutableURL * Most properties are now nonatomic (this changes from returned retained + autoreleased to +0 retained) * Correct handling of encoding on Win32 console (stream is read and written in UTF-8 and translated to UTF-16 on the fly) * Runtime is now built as a separate library + More encodings for strings * Reworked OFOptionsParser API * Refactored OFKernelEventObserver * Better randomization of HTTP header order * Allow overriding all HTTP headers * Definition of thread priorities changed + Key Value Coding + Exceptions in ObjC++ * OFHash was renamed to OFCryptoHash + PBKDF2 + scrypt + Xcode project to build for iOS + String decomposition to NFD * OFFile modes simplified ('b' removed) ObjFW 0.8 -> ObjFW 0.8.1, 04.10.2015 * Adjust to __nullable / __nonnull being changed to _Nullable / _Nonnull in Clang 3.7 (this fixes compilation with Clang 3.7) * Blocks: Proper handling when called from a byref handler * Fix compilation on Solaris * Fix compilation for Wii, PSP and Nintendo DS |
︙ |
Modified configure.ac from [12f3d4bae6] to [cbc3ad562a].
| 1 2 3 4 5 6 7 8 | - + |
|
︙ | |||
21 22 23 24 25 26 27 | 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | - | *-morphos*) AS_IF([test x"$with_ixemul" != x"yes"], [ OBJCFLAGS="$OBJCFLAGS -noixemul" LDFLAGS="$LDFLAGS -noixemul" enable_files="yes" # Required for reading ENV: AC_SUBST(NOIXEMUL, -noixemul) |
︙ | |||
653 654 655 656 657 658 659 | 652 653 654 655 656 657 658 659 660 661 662 663 664 665 | - - | ]) AS_IF([test x"$enable_static" = x"yes" -o x"$enable_shared" = x"no"], [ AC_SUBST(ENCODINGS_A, "encodings.a") AC_SUBST(ENCODINGS_ENCODINGS_A, "encodings/encodings.a") ]) ]) |
︙ | |||
1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 | 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 | + | AC_DEFINE(HAVE_EPOLL, 1, [Whether we have epoll]) AC_SUBST(OFKERNELEVENTOBSERVER_EPOLL_M, "OFKernelEventObserver_epoll.m") break ]) AS_IF([test x"$with_wii" = x"yes"], [ AC_DEFINE(HAVE_POLL, 1, [Whether we have poll()]) AC_SUBST(OFKERNELEVENTOBSERVER_POLL_M, "OFKernelEventObserver_poll.m") ], [ AC_CHECK_HEADERS(poll.h) AC_CHECK_FUNC(poll, [ AC_DEFINE(HAVE_POLL, 1, [Whether we have poll()]) AC_SUBST(OFKERNELEVENTOBSERVER_POLL_M, |
︙ |
Modified extra.mk.in from [130d0ab22e] to [f18de84cc5].
1 2 3 4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | - + - | OBJFW_SHARED_LIB = @OBJFW_SHARED_LIB@ OBJFW_STATIC_LIB = @OBJFW_STATIC_LIB@ # When changing: Be sure to also change these in the Xcode project! OBJFW_LIB_MAJOR = 8 |
︙ |
Modified src/OFApplication.m from [c9d4f7d315] to [a37acbc186].
︙ | |||
67 68 69 70 71 72 73 | 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | - - - - - - | #ifdef OF_NINTENDO_DS # define asm __asm__ # include <nds.h> # undef asm #endif |
︙ | |||
505 506 507 508 509 510 511 | 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 | - - - - - + - - - - - - - - - - - - - - | - (id <OFApplicationDelegate>)delegate { return _delegate; } - (void)setDelegate: (id <OFApplicationDelegate>)delegate { |
︙ |
Modified src/OFArray.m from [15022d3186] to [bc7d3f13f5].
︙ | |||
672 673 674 675 676 677 678 | 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 | - + | uint8_t type = 0xDC; uint16_t tmp = OF_BSWAP16_IF_LE((uint16_t)count); [data addItem: &type]; [data addItems: &tmp count: sizeof(tmp)]; } else if (count <= UINT32_MAX) { |
︙ |
Modified src/OFData.h from [ef14e3ba64] to [9086a3be08].
︙ | |||
30 31 32 33 34 35 36 | 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | - + | * * For security reasons, serialization and deserialization is only implemented * for OFData with item size 1. */ @interface OFData: OFObject <OFCopying, OFMutableCopying, OFComparing, OFSerialization, OFMessagePackRepresentation> { |
︙ |
Modified src/OFData.m from [ab1e932258] to [945c020d4d].
︙ | |||
181 182 183 184 185 186 187 | 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 | - + | { self = [super init]; @try { if (itemSize == 0) @throw [OFInvalidArgumentException exception]; |
︙ |
Modified src/OFDate.h from [7c2a95ab3f] to [fcd33a4a3b].
︙ | |||
184 185 186 187 188 189 190 191 192 193 194 195 196 197 | 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 | + + + + + + + | /*! * @brief Returns the minute of the date. * * @return The minute of the date */ - (uint8_t)minute; /*! * @brief Returns the minute of the date in local time. * * @return The minute of the date in local time */ - (uint8_t)localMinute; /*! * @brief Returns the hour of the date. * * @return The hour of the date */ - (uint8_t)hour; |
︙ |
Modified src/OFDate.m from [388aebd154] to [618922b043].
︙ | |||
449 450 451 452 453 454 455 456 457 458 459 460 461 462 | 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 | + + + + + | GMTIME_RET(tm_sec) } - (uint8_t)minute { GMTIME_RET(tm_min) } - (uint8_t)localMinute { LOCALTIME_RET(tm_min) } - (uint8_t)hour { GMTIME_RET(tm_hour) } - (uint8_t)localHour |
︙ |
Modified src/OFFile.m from [afef5a8ffe] to [44dc0ec6b9].
︙ | |||
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - | static int parseMode(const char *mode, bool *append) { *append = false; if (strcmp(mode, "r") == 0) return MODE_OLDFILE; if (strcmp(mode, "r+") == 0) return MODE_OLDFILE; if (strcmp(mode, "w") == 0) return MODE_NEWFILE; if (strcmp(mode, "wx") == 0) return MODE_NEWFILE; if (strcmp(mode, "w+") == 0) return MODE_NEWFILE; if (strcmp(mode, "w+x") == 0) return MODE_NEWFILE; if (strcmp(mode, "a") == 0) { *append = true; return MODE_READWRITE; } |
︙ |
Modified src/OFFileManager.m from [7bb3d63d81] to [f7096a9a7b].
︙ | |||
569 570 571 572 573 574 575 576 577 578 579 580 581 582 | 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 | + | exceptionWithObject: self requestedLength: 0 errNo: errno]; if (dirent == NULL) break; # else errno = 0; if ((dirent = readdir(dir)) == NULL) { if (errno == 0) break; else @throw [OFReadFailedException exceptionWithObject: self requestedLength: 0 |
︙ |
Modified src/OFGZIPStream.h from [9ece715a6e] to [28a3137a76].
︙ | |||
17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | + + + + + + | #import "OFStream.h" #import "OFDate.h" @class OFInflateStream; OF_ASSUME_NONNULL_BEGIN /*! * @class OFGZIPStream OFGZIPStream.h ObjFW/OFGZIPStream.h * * @brief A class that handles GZIP compression and decompression transparently * for an underlying stream. */ @interface OFGZIPStream: OFStream { OFStream *_stream; OFInflateStream *_inflateStream; enum of_gzip_stream_state { OF_GZIP_STREAM_ID1, OF_GZIP_STREAM_ID2, |
︙ | |||
70 71 72 73 74 75 76 77 78 79 80 81 82 | 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | + + + + + + + + + + + + + + + | size_t _bytesRead; uint8_t _buffer[4]; OFDate *_modificationDate; uint16_t _extraLength; uint32_t _CRC32, _uncompressedSize; } /*! * @brief Creates a new OFGZIPStream with the specified underlying stream. * * @param stream The underlying stream for the OFGZIPStream * @return A new, autoreleased OFGZIPStream */ + (instancetype)streamWithStream: (OFStream *)stream; - init OF_UNAVAILABLE; /*! * @brief Initializes an already allocated OFGZIPStream with the specified * underlying stream. * * @param stream The underlying stream for the OFGZIPStream * @return An initialized OFGZIPStream */ - initWithStream: (OFStream *)stream OF_DESIGNATED_INITIALIZER; @end OF_ASSUME_NONNULL_END |
Modified src/OFMutableURL.m from [60a5553f44] to [d83d33a394].
︙ | |||
14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | + | * file. */ #include "config.h" #import "OFMutableURL.h" #import "OFURL+Private.h" #import "OFString.h" @implementation OFMutableURL @dynamic scheme, host, port, user, password, path, parameters, query, fragment; + (instancetype)URL { return [[[self alloc] init] autorelease]; |
︙ |
Modified src/OFRunLoop.m from [50df1150e8] to [2bcc651795].
︙ | |||
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | + + + | * LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this * file. */ #include "config.h" #include <assert.h> #include <errno.h> #import "OFRunLoop.h" #import "OFRunLoop+Private.h" #import "OFDictionary.h" #ifdef OF_HAVE_SOCKETS # import "OFKernelEventObserver.h" #endif #import "OFThread.h" #ifdef OF_HAVE_THREADS # import "OFMutex.h" # import "OFCondition.h" #endif #import "OFSortedList.h" #import "OFTimer.h" #import "OFTimer+Private.h" #import "OFDate.h" #import "OFObserveFailedException.h" static OFRunLoop *mainRunLoop = nil; #ifdef OF_HAVE_SOCKETS @interface OFRunLoop_QueueItem: OFObject { @public |
︙ | |||
715 716 717 718 719 720 721 | 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 | + - - + + + + + + + - + + + + + | timeout = [[nextTimer earlierDate: deadline] timeIntervalSinceNow]; if (timeout < 0) timeout = 0; #if defined(OF_HAVE_SOCKETS) @try { |
︙ |
Modified src/OFStream.m from [d30563e398] to [e48fbb2fa9].
︙ | |||
54 55 56 57 58 59 60 | 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | - + | #import "of_asprintf.h" #define MIN_READ_SIZE 512 @implementation OFStream @synthesize of_waitingForDelimiter = _waitingForDelimiter; |
︙ |
Modified src/OFString.h from [f5efa5d129] to [bb11f44cdb].
︙ | |||
16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | + + + + + + | #ifndef __STDC_LIMIT_MACROS # define __STDC_LIMIT_MACROS #endif #ifndef __STDC_CONSTANT_MACROS # define __STDC_CONSTANT_MACROS #endif #import "objfw-defs.h" #ifdef OF_HAVE_SYS_TYPES_H # include <sys/types.h> #endif #include <stdarg.h> #include <stdint.h> #import "OFObject.h" #import "OFSerialization.h" #import "OFJSONRepresentation.h" |
︙ |
Modified src/OFTCPSocket.m from [56b097e84a] to [9870a76e72].
︙ | |||
181 182 183 184 185 186 187 | 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 | - + | { void *pool = objc_autoreleasePoolPush(); @try { [_socket connectToHost: _host port: _port]; } @catch (OFException *e) { |
︙ |
Modified src/OFTarArchiveEntry.m from [e3da7730a5] to [1b943dcfae].
︙ | |||
84 85 86 87 88 89 90 | 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | - + + + + - - - - + + + + + | _type = header[156]; _targetFileName = [stringFromBuffer(header + 157, 100) copy]; if (_type == '\0') _type = OF_TAR_ARCHIVE_ENTRY_TYPE_FILE; if (memcmp(header + 257, "ustar\0" "00", 8) == 0) { |
︙ |
Modified src/OFZIPArchive.m from [8c3891b987] to [65a1aa4c22].
︙ | |||
69 70 71 72 73 74 75 | 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | - + - - + - + | - initWithStream: (OFStream *)stream; - (bool)matchesEntry: (OFZIPArchiveEntry *)entry; @end @interface OFZIPArchive_FileStream: OFStream { OFStream *_stream, *_decompressedStream; |
︙ | |||
356 357 358 359 360 361 362 | 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 | - + | @throw [OFUnsupportedVersionException exceptionWithVersion: version]; } _lastReturnedStream = [[OFZIPArchive_FileStream alloc] initWithStream: _stream |
︙ | |||
449 450 451 452 453 454 455 | 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 | - + - + - + - - - + + - + - + - - - - + - - + - - - - - - + - - - - - + - - + - - - - - - + + + + + - - - - - - + + + + - - + - - - - + - | return true; } @end @implementation OFZIPArchive_FileStream - initWithStream: (OFStream *)stream |
Modified src/of_asprintf.m from [3e2fecec3f] to [e20ce9de33].
︙ | |||
556 557 558 559 560 561 562 | 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 | - + + + - - + + | void *pool = objc_autoreleasePoolPush(); char *tmp2; @try { OFMutableString *tmpStr = [OFMutableString stringWithUTF8String: tmp length: tmpLen]; |
︙ |
Modified src/runtime/Makefile from [80fa148287] to [34e6bcc419].
1 2 3 4 5 6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 | - | include ../../extra.mk SUBDIRS = lookup-asm SHARED_LIB = ${OBJFW_RT_SHARED_LIB} STATIC_LIB = ${OBJFW_RT_STATIC_LIB} |
︙ | |||
27 28 29 30 31 32 33 | 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | - - - - - - - - - | SRCS_THREADS = threading.m \ ../threading.m INCLUDES = ObjFW-RT.h includesubdir = ObjFW-RT OBJS_EXTRA = ${LOOKUP_ASM_LOOKUP_ASM_A} LIB_OBJS_EXTRA = ${LOOKUP_ASM_LOOKUP_ASM_LIB_A} |
Modified src/runtime/ObjFW-RT.h from [8577ac8d70] to [aad7cef107].
︙ | |||
195 196 197 198 199 200 201 | 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 | - - + - + | struct objc_protocol_list { struct objc_protocol_list *_Nullable next; long count; Protocol *__unsafe_unretained _Nonnull list[1]; }; |
︙ | |||
237 238 239 240 241 242 243 | 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 | - - + - - - - - - - - - - - - - - - - - - | extern _Nullable objc_uncaught_exception_handler objc_setUncaughtExceptionHandler( objc_uncaught_exception_handler _Nullable); extern void objc_setForwardHandler(IMP _Nullable, IMP _Nullable); extern void objc_setEnumerationMutationHandler( objc_enumeration_mutation_handler _Nullable); extern void objc_zero_weak_references(id _Nonnull); |
︙ |
Modified src/runtime/lookup-asm/lookup-asm-sparc64-elf.S from [03722104be] to [44cfec8a34].
︙ | |||
48 49 50 51 52 53 54 | 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | - + + + + + + | #ifdef OF_SELUID24 ldx [%o2 + %o3], %o2 #endif ldx [%o2 + %o4], %o2 ldx [%o2 + %o5], %o2 cmp %o2, 0 |
︙ |
Deleted src/runtime/morphos-library.m version [90367d03a6].
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
|
Modified tests/OFBlockTests.m from [b51076c2c2] to [57afcae22d].
︙ | |||
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | + + + + + + | void (^m)(void); int (^v)(void); TEST(@"Class of stack block", (Class)&_NSConcreteStackBlock == objc_getClass("OFStackBlock") && [s isKindOfClass: [OFBlock class]]) #if !defined(OF_WINDOWS) || !defined(__clang__) /* * Causes a linker error on Windows with Clang when compiling as a * static library. This is a bug in Clang. */ TEST(@"Class of global block", (Class)&_NSConcreteGlobalBlock == objc_getClass("OFGlobalBlock") && [g isKindOfClass: [OFBlock class]]) #endif TEST(@"Class of a malloc block", (Class)&_NSConcreteMallocBlock == objc_getClass("OFMallocBlock")) TEST(@"Copying a stack block", (m = [[s copy] autorelease]) && [m class] == objc_getClass("OFMallocBlock") && |
︙ |
Modified tests/OFKernelEventObserverTests.m from [f2b6e225cb] to [a33e059e26].
︙ | |||
18 19 20 21 22 23 24 | 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | - - - + - - + + + + - - + + | #import "OFKernelEventObserver.h" #import "OFString.h" #import "OFDate.h" #import "OFTCPSocket.h" #import "OFAutoreleasePool.h" |
︙ | |||
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 | 199 200 201 202 203 204 205 206 207 208 209 210 211 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 242 243 244 245 246 247 248 | + + + - - + - - + - + - - | } } @end @implementation TestsAppDelegate (OFKernelEventObserverTests) - (void)kernelEventObserverTestsWithClass: (Class)class { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; ObserverTest *test; module = [class className]; test = [[[ObserverTest alloc] initWithTestsAppDelegate: self] autorelease]; TEST(@"+[observer]", (test->_observer = [OFKernelEventObserver observer])) [test->_observer setDelegate: test]; TEST(@"-[addObjectForReading:]", R([test->_observer addObjectForReading: test->_server])) [test run]; _fails += test->_fails; [pool drain]; } - (void)kernelEventObserverTests { |