marshal.c: lazy compat_tbl allocation

In some common cases, compat_tbl is unused in dump_arg/load_arg,
so avoid malloc/free costs for the unused table.

ruby -e 'h = {a: :b}; 600000.times { Marshal.load(Marshal.dump(h)) }'

before:
	real    0m2.458s
	user    0m2.450s
	sys     0m0.006s

after:
	real    0m2.122s
	user    0m2.110s
	sys     0m0.011s

* marshal.c (w_class): check dump_arg->compat_tbl before lookup
  (w_object): lazy init ->compat_tbl before insert
  (obj_alloc_by_class): ditto
  (clear_dump_arg): free only non-NULL ->compat_tbl
  (clear_load_arg): ditto for ->compat_tbl
  (marshal_dump): ->compat_tbl defaults to zero
  (marshal_load): ditto for ->compat_tbl
  (r_entry0): check l->compat_tbl before lookup
  (r_fixup_compat): ditto

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47756 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
* 2014-10-02

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47757 b2dd03c8-39d4-4d8f-98ff-823fe69b080e