2/5 doesn't seem right, prepare_push_constant_buffer() is a client side function and can't be called from the CS. Maybe "prepare" is a misleading name and should be fixed.
I guess the problem here is that we have a NULL buffer in this case. Instead of creating the buffer anyway I think we should just skip loading constants.
I think I ran into that with GLSL and fixed it there, but forgot about arb :-/
Wrt 3/5, if only for the sake of curiosity, what does the recursion stack look like?