Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strange "selector mangling" in Objective-C method with Boolean arguments

I need to recover method names dynamically, via reflection calls at runtime. But get strange results for some.

My TestClass contains a method like:

- (void)testMethod6_NSRect:(NSRect)a1 int:(int)a2 int:(int)a3 bool:(Boolean)a4 {
    ...
}

When enumerating the above classes methods using class_copyMethodList() and fetching the method selectors via method_getName(), I get:

"testMethod6_NSRect:int:int:_Bool:" 

Thus, the selector was rewritten somehow (by gcc?) to make "_Bool" from "bool". As far as I tested yet, this seems to be done only for a "bool" selector-part - if I change it to int:(int), as in:

- (void)testMethod1_int:(int)a1 int:(int)a2 int:(int)a3 int:(int)a4 {
    ...
}

I get the expected:

"testMethod1_int:int:int:int:"

Q: Does anyone know the rules or a pointer to where I could find them for this "selector rewriting", or am I missing something? Is this only done for "bool"? I also need to know if this behavior is depending on the gcc-version, osx-version or runtime library version.

I am using (gcc --version): i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3) on a (uname -a) 10.8.0 Darwin Kernel Version 10.8.0:

like image 590
blabla999 Avatar asked Dec 30 '25 10:12

blabla999


1 Answers

The problem lies in an ugly piece of preprocessor magic in the C99 standard header <stdbool.h>:

#define bool _Bool

C99 defines a type named _Bool which behaves like C++'s bool type. The define is there to be able to use it in C but with the C++ identifier.

Solution:

#undef bool
like image 113
Nikolai Ruhe Avatar answered Jan 02 '26 03:01

Nikolai Ruhe