Overview
Comment: | More -[forwardingTargetForSelector:] tests. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
37ea76ea9da15fcce3a3d20d2299a419 |
User & Date: | js on 2013-07-25 22:54:09 |
Other Links: | manifest | tags |
Context
2013-07-25
| ||
23:21 | Forwarding: Save FP args when using MIPS/EABI. check-in: 3d98184cc2 user: js tags: trunk | |
22:54 | More -[forwardingTargetForSelector:] tests. check-in: 37ea76ea9d user: js tags: trunk | |
22:41 | Fix -[forwardingTargetForSelector:] on AMD64. check-in: a7409be2c4 user: js tags: trunk | |
Changes
Modified src/forwarding-mips-elf.S from [53faa6cc87] to [39560a8c6a].
︙ | ︙ | |||
20 21 22 23 24 25 26 27 28 29 30 31 32 33 | of_forward: #ifdef __PIC__ lui $gp, %hi(_gp_disp) addiu $gp, $gp, %lo(_gp_disp) addu $gp, $gp, $t9 #endif addiu $sp, -48 sw $gp, 0($sp) sw $ra, 4($sp) sw $a0, 8($sp) sw $a1, 12($sp) sw $a2, 16($sp) sw $a3, 20($sp) | > > > > > > > | 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | of_forward: #ifdef __PIC__ lui $gp, %hi(_gp_disp) addiu $gp, $gp, %lo(_gp_disp) addu $gp, $gp, $t9 #endif /* * The registers for floating point arguments don't need to be saved, * as the ABI specifies that all remaining arguments are passed in * integer registers if the first argument is passed in an integer * register. This is always the case, as the first argument is always * self. */ addiu $sp, -48 sw $gp, 0($sp) sw $ra, 4($sp) sw $a0, 8($sp) sw $a1, 12($sp) sw $a2, 16($sp) sw $a3, 20($sp) |
︙ | ︙ |
Modified tests/ForwardingTests.m from [821ca2e4ae] to [9c077ad9ee].
︙ | ︙ | |||
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <string.h> #import "OFString.h" #import "OFAutoreleasePool.h" #import "macros.h" #import "TestsAppDelegate.h" static OFString *module = @"Forwarding"; static size_t forwardings = 0; static bool success = false; static id target = nil; struct stret_test { char s[27]; }; @interface ForwardingTest: OFObject @end @interface ForwardingTest (Test) + (void)test; - (void)test; | > > > > > > > > > > > | > > | 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 58 59 60 61 62 63 64 65 | #include <string.h> #import "OFString.h" #import "OFAutoreleasePool.h" #import "macros.h" #import "OFNotImplementedException.h" #import "TestsAppDelegate.h" #define FMT @"%@ %@ %@ %@ %@ %@ %@ %@ %@ %g %g %g %g %g %g %g %g %g" #define ARGS @"a", @"b", @"c", @"d", @"e", @"f", @"g", @"h", @"i", \ 1.5, 2.25, 3.125, 4.0625, 5.03125, 6.5, 7.25, 8.0, 9.0 #define RESULT @"a b c d e f g h i 1.5 2.25 3.125 4.0625 5.03125 6.5 7.25 8 9" static OFString *module = @"Forwarding"; static size_t forwardings = 0; static bool success = false; static id target = nil; struct stret_test { char s[27]; }; @interface ForwardingTest: OFObject @end @interface ForwardingTest (Test) + (void)test; - (void)test; - (bool)forwardingTargetTest: (intptr_t)a0 : (intptr_t)a1 : (double)a2 : (double)a3; - (OFString*)forwardingTargetVarArgTest: (OFConstantString*)fmt, ...; - (long double)forwardingTargetFPRetTest; - (struct stret_test)forwardingTargetStRetTest; - (void)notExistant; - (struct stret_test)notExistantStRet; @end @interface ForwardingTarget: OFObject @end static void test(id self, SEL _cmd) |
︙ | ︙ | |||
81 82 83 84 85 86 87 | } return false; } - (id)forwardingTargetForSelector: (SEL)selector { | > > > > > > > > > > > > | > | > > > > > > > > > > > > > > > > > > > | | 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | } return false; } - (id)forwardingTargetForSelector: (SEL)selector { /* * Do some useless calculations in as many registers as possible to * check if the arguments are properly saved and restored. */ volatile register intptr_t r0 = 0, r1 = 1, r2 = 2, r3 = 3, r4 = 4, r5 = 5, r6 = 6, r7 = 7, r8 = 8, r9 = 9, r10 = 10, r11 = 11; volatile register double f0 = 0.5, f1 = 1.5, f2 = 2.5, f3 = 3.5, f4 = 4.5, f5 = 5.5, f6 = 6.5, f7 = 7.5, f8 = 8.5, f9 = 9.5, f10 = 10.5, f11 = 11.5; double add = r0 * r1 * r2 * r3 * r4 * r5 * r6 * r7 * r8 * r9 * r10 * r11 * f0 * f1 * f2 * f3 * f4 * f5 * f6 * f7 * f8 * f9 * f10 * f11; if (sel_isEqual(selector, @selector(forwardingTargetTest::::)) || sel_isEqual(selector, @selector(forwardingTargetVarArgTest:)) || sel_isEqual(selector, @selector(forwardingTargetFPRetTest)) || sel_isEqual(selector, @selector(forwardingTargetStRetTest))) return (id)((char*)target + (ptrdiff_t)add); return nil; } @end @implementation ForwardingTarget - (bool)forwardingTargetTest: (intptr_t)a0 : (intptr_t)a1 : (double)a2 : (double)a3 { OF_ENSURE(self == target); if (a0 != 0xDEADBEEF) return false; if (a1 != -1) return false; if (a2 != 1.25) return false; if (a3 != 2.75) return false; return true; } - (OFString*)forwardingTargetVarArgTest: (OFConstantString*)fmt, ... { va_list args; OFString *ret; OF_ENSURE(self == target); va_start(args, fmt); |
︙ | ︙ | |||
145 146 147 148 149 150 151 | TEST(@"Forwarding a message and adding an instance method", R([t test]) && success && R([t test]) && forwardings == 1); #ifdef OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR target = [[[ForwardingTarget alloc] init] autorelease]; TEST(@"-[forwardingTargetForSelector:]", | | | > > > | > > > > > > | 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 216 217 218 219 220 | TEST(@"Forwarding a message and adding an instance method", R([t test]) && success && R([t test]) && forwardings == 1); #ifdef OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR target = [[[ForwardingTarget alloc] init] autorelease]; TEST(@"-[forwardingTargetForSelector:]", [t forwardingTargetTest: 0xDEADBEEF : -1 : 1.25 : 2.75]) TEST(@"-[forwardingTargetForSelector:] with variable arguments", [([t forwardingTargetVarArgTest: FMT, ARGS]) isEqual: RESULT]) TEST(@"-[forwardingTargetForSelector:] with fp return", [t forwardingTargetFPRetTest] == 12345678.00006103515625) # ifdef OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR_STRET TEST(@"-[forwardingTargetForSelector:] with struct return", !memcmp([t forwardingTargetStRetTest].s, "abcdefghijklmnopqrstuvwxyz", 27)) # endif EXPECT_EXCEPTION(@"-[forwardingTargetForSelector:] with nil target", OFNotImplementedException, [t notExistant]) # ifdef OF_HAVE_FORWARDING_TARGET_FOR_SELECTOR_STRET EXPECT_EXCEPTION(@"-[forwardingTargetForSelector:] with nil target + " @"stret", OFNotImplementedException, [t notExistantStRet]) # endif #endif [pool drain]; } @end |