ref_push_string(MK_STRING("_datarowdesc"));
That's more or less what push_text does. I think. Possibly MK_STRING is better optimized via cmod? push_text seems to recreate the shared pointer every time.
f_arrow(2); datarowdesc=Pike_sp[-1].u.array; pop_stack();
Possibly you either want to increase the reference counter of the array, or use Pike_sp--; instead of pop. (But maybe you do that already, or cmod does it magically for you?)
Incidentally, it's these silly things like, when to use push_string or when to use ref_push_string and the same for push_object vs. ref_push_object which take time to figure out.
Yes. :p