fptr doesn't take a va_list, it takes the actual arguments. Also this would leave useless objc_msgSend stack frames at every other level of the stack. There's no way to force the compiler to generate a tail call from inside C. Additionally, you'd have to have callers unbox primitives when fptr returns a C type - the language specifies being a superset of C, so all the C types that the compiler otherwise supports have to work. "id" is not a supertype of int, float, etc.
And yes, it is significantly faster. Avoiding writing assembly seems like an awfully odd goal to have for a language runtime.
And yes, it is significantly faster. Avoiding writing assembly seems like an awfully odd goal to have for a language runtime.