checkKeepAlive is called after invokeNativeFunction/invokeNativeMethod. So, imagine a native function that caches its argument and then throws an exception for some reason. In that case NativeFunction<>::call will handle the exception, but NativeFunction<>::operator() will fail to store the argument into keepAlive_.
It's not an issue for me, actually, but I think it's worth highlighting in the documentation or fixing it.