John W. Kennedy wrote:

> It also has to Fixnum.new the result.  (And eventually, it has to GC 
> every intermediate result.)

Actually, Fixnums are not allocated, but rather stored within the VALUE 
itself. From ruby.h:

#define FIXNUM_FLAG 0x01
#define INT2FIX(i) ((VALUE)(((long)(i))<<1 | FIXNUM_FLAG))
#define LONG2FIX(i) INT2FIX(i)
#define rb_fix_new(v) INT2FIX(v)