ObjC Bool
From Lazarus wiki
Jump to navigationJump to search
Objective-C
Source code
#import <Foundation/Foundation.h>
@interface BoolTest: NSObject
-(void) testcbool: (_Bool) avalue;
-(void) testobjcbool: (BOOL) avalue;
@end
@implementation BoolTest
-(void) testcbool: (_Bool) avalue
{
NSLog(@" cbool %s", avalue ? "true" : "false");
}
-(void) testobjcbool: (BOOL) avalue
{
NSLog(@" objcbool %s", avalue ? "true" : "false");
}
@end
void simpleC(_Bool avalue)
{
NSLog(@" plainc %s", avalue ? "true" : "false");
return;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
int a = 10;
int b = 10;
BoolTest* tt = [[BoolTest alloc] init];
[tt testcbool:(a==b)];
[tt testobjcbool:(a==b)];
simpleC(a==b);
}
return 0;
}
Disassembly x86_54
Boolean parameters, no matter BOOL (signed char) or _Bool are always passed in the entired register
0x100000e5d <+93>: movl -0x14(%rbp), %edx
0x100000e60 <+96>: cmpl -0x18(%rbp), %edx
0x100000e63 <+99>: sete %r8b
0x100000e67 <+103>: movq 0x31a(%rip), %rsi ; "testcbool:"
0x100000e6e <+110>: andb $0x1, %r8b
0x100000e72 <+114>: movzbl %r8b, %edx
0x100000e76 <+118>: movq 0x183(%rip), %rcx ; (void *)0x00007fff7e936e80: objc_msgSend
0x100000e7d <+125>: movq %rax, %rdi
0x100000e80 <+128>: callq *%rcx
0x100000e82 <+130>: movq -0x20(%rbp), %rax
0x100000e86 <+134>: movl -0x14(%rbp), %edx
0x100000e89 <+137>: cmpl -0x18(%rbp), %edx
0x100000e8c <+140>: sete %r8b
0x100000e90 <+144>: andb $0x1, %r8b
0x100000e94 <+148>: movzbl %r8b, %edx
0x100000e98 <+152>: movb %dl, %r8b
0x100000e9b <+155>: movq 0x2ee(%rip), %rsi ; "testobjcbool:"
0x100000ea2 <+162>: movq %rax, %rdi
0x100000ea5 <+165>: movsbl %r8b, %edx
0x100000ea9 <+169>: callq 0x100000ef8 ; symbol stub for: objc_msgSend
0x100000eae <+174>: movl -0x14(%rbp), %edx
0x100000eb1 <+177>: cmpl -0x18(%rbp), %edx
0x100000eb4 <+180>: sete %r8b
0x100000eb8 <+184>: andb $0x1, %r8b
0x100000ebc <+188>: movzbl %r8b, %edi
0x100000ec0 <+192>: callq 0x100000db0 ; simpleC at main.m:29