In gc.c, I see:

  VALUE
  rb_newobj()
  {
      VALUE obj;

      if (!freelist) rb_gc();

      obj = (VALUE)freelist;
      freelist = freelist->as.free.next;
      MEMZERO((void*)obj, RVALUE, 1);
      return obj;
  }

Can the freelist still be 0 after calling rb_gc()?

Is it possible for this function to raise an exception?  (It's desirable
that it can't since that would mean that Data_Wrap_Struct can't raise
either, which makes my job as an extension writer easier).

Thanks,

Paul