Skip to content

Commit

Permalink
Frozen objects in WeakMap
Browse files Browse the repository at this point in the history
* gc.c (wmap_aset): bypass check for frozen and allow frozen
  object in WeakMap.  [Bug #13498]
  • Loading branch information
nobu committed Jun 22, 2019
1 parent f5e2904 commit f3c81b4
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
13 changes: 10 additions & 3 deletions gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -2937,13 +2937,20 @@ should_be_callable(VALUE block)
rb_obj_class(block));
}
}

static void
should_be_finalizable(VALUE obj)
should_be_finalizable_internal(VALUE obj)
{
if (!FL_ABLE(obj)) {
rb_raise(rb_eArgError, "cannot define finalizer for %s",
rb_obj_classname(obj));
}
}

static void
should_be_finalizable(VALUE obj)
{
should_be_finalizable_internal(obj);
rb_check_frozen(obj);
}

Expand Down Expand Up @@ -10399,8 +10406,8 @@ wmap_aset(VALUE self, VALUE wmap, VALUE orig)
struct weakmap *w;

TypedData_Get_Struct(self, struct weakmap, &weakmap_type, w);
should_be_finalizable(orig);
should_be_finalizable(wmap);
should_be_finalizable_internal(orig);
should_be_finalizable_internal(wmap);
define_final0(orig, w->final);
define_final0(wmap, w->final);
st_update(w->obj2wmap, (st_data_t)orig, wmap_aset_update, wmap);
Expand Down
6 changes: 6 additions & 0 deletions test/ruby/test_weakmap.rb
Original file line number Diff line number Diff line change
Expand Up @@ -141,4 +141,10 @@ def test_size
assert_equal(2, @wm.__send__(m))
end
alias test_length test_size

def test_frozen_object
o = Object.new.freeze
assert_nothing_raised(FrozenError) {@wm[o] = 'foo'}
assert_nothing_raised(FrozenError) {@wm['foo'] = o}
end
end

0 comments on commit f3c81b4

Please sign in to comment.