mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* include/ruby/ruby.h: freeze nil/true/false.
* gc.c (should_be_finalizable): check frozen after checkin FL_ABLE. * object.c (rb_obj_taint): check OBJ_TAINTABLE(obj). * object.c (rb_obj_freeze): remove immediate_frozen_tbl because all of immediate values are frozen. YAY! * object.c (rb_obj_frozen_p): ditto. * test/ruby/test_eval.rb: skip instance_variable_set for frozen objects. * test/ruby/test_weakmap.rb: check ArgumentError instead of RuntimeError. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47523 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d2d4017d80
commit
cc3088ea51
6 changed files with 34 additions and 24 deletions
20
ChangeLog
20
ChangeLog
|
@ -1,3 +1,23 @@
|
||||||
|
Thu Sep 11 14:31:57 2014 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
|
* include/ruby/ruby.h: freeze nil/true/false.
|
||||||
|
|
||||||
|
* gc.c (should_be_finalizable): check frozen after checkin FL_ABLE.
|
||||||
|
|
||||||
|
* object.c (rb_obj_taint): check
|
||||||
|
OBJ_TAINTABLE(obj).
|
||||||
|
|
||||||
|
* object.c (rb_obj_freeze): remove immediate_frozen_tbl
|
||||||
|
because all of immediate values are frozen. YAY!
|
||||||
|
|
||||||
|
* object.c (rb_obj_frozen_p): ditto.
|
||||||
|
|
||||||
|
* test/ruby/test_eval.rb: skip instance_variable_set for
|
||||||
|
frozen objects.
|
||||||
|
|
||||||
|
* test/ruby/test_weakmap.rb: check ArgumentError instead of
|
||||||
|
RuntimeError.
|
||||||
|
|
||||||
Thu Sep 11 10:03:16 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
|
Thu Sep 11 10:03:16 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
|
||||||
|
|
||||||
* lib/rdoc.rb, lib/rdoc, test/rdoc: Update to RDoc 4.2.0.alpha(21b241a)
|
* lib/rdoc.rb, lib/rdoc, test/rdoc: Update to RDoc 4.2.0.alpha(21b241a)
|
||||||
|
|
2
gc.c
2
gc.c
|
@ -2286,11 +2286,11 @@ should_be_callable(VALUE block)
|
||||||
static void
|
static void
|
||||||
should_be_finalizable(VALUE obj)
|
should_be_finalizable(VALUE obj)
|
||||||
{
|
{
|
||||||
rb_check_frozen(obj);
|
|
||||||
if (!FL_ABLE(obj)) {
|
if (!FL_ABLE(obj)) {
|
||||||
rb_raise(rb_eArgError, "cannot define finalizer for %s",
|
rb_raise(rb_eArgError, "cannot define finalizer for %s",
|
||||||
rb_obj_classname(obj));
|
rb_obj_classname(obj));
|
||||||
}
|
}
|
||||||
|
rb_check_frozen(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1126,7 +1126,7 @@ struct RStruct {
|
||||||
(OBJ_TAINTABLE(x) && FL_ABLE(s)) ? \
|
(OBJ_TAINTABLE(x) && FL_ABLE(s)) ? \
|
||||||
RBASIC(x)->flags |= RBASIC(s)->flags & FL_TAINT : 0)
|
RBASIC(x)->flags |= RBASIC(s)->flags & FL_TAINT : 0)
|
||||||
|
|
||||||
#define OBJ_FROZEN(x) (!!(FL_ABLE(x)?(RBASIC(x)->flags&(FL_FREEZE)):(FIXNUM_P(x)||FLONUM_P(x)||STATIC_SYM_P(x))))
|
#define OBJ_FROZEN(x) (FL_ABLE(x) ? !!(RBASIC(x)->flags&FL_FREEZE) : 1)
|
||||||
#define OBJ_FREEZE(x) FL_SET((x), FL_FREEZE)
|
#define OBJ_FREEZE(x) FL_SET((x), FL_FREEZE)
|
||||||
|
|
||||||
#if USE_RGENGC
|
#if USE_RGENGC
|
||||||
|
|
16
object.c
16
object.c
|
@ -980,7 +980,7 @@ rb_obj_tainted(VALUE obj)
|
||||||
VALUE
|
VALUE
|
||||||
rb_obj_taint(VALUE obj)
|
rb_obj_taint(VALUE obj)
|
||||||
{
|
{
|
||||||
if (!OBJ_TAINTED(obj)) {
|
if (!OBJ_TAINTED(obj) && OBJ_TAINTABLE(obj)) {
|
||||||
rb_check_frozen(obj);
|
rb_check_frozen(obj);
|
||||||
OBJ_TAINT(obj);
|
OBJ_TAINT(obj);
|
||||||
}
|
}
|
||||||
|
@ -1057,8 +1057,6 @@ rb_obj_infect(VALUE obj1, VALUE obj2)
|
||||||
OBJ_INFECT(obj1, obj2);
|
OBJ_INFECT(obj1, obj2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static st_table *immediate_frozen_tbl = 0;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* obj.freeze -> obj
|
* obj.freeze -> obj
|
||||||
|
@ -1089,10 +1087,7 @@ rb_obj_freeze(VALUE obj)
|
||||||
if (!OBJ_FROZEN(obj)) {
|
if (!OBJ_FROZEN(obj)) {
|
||||||
OBJ_FREEZE(obj);
|
OBJ_FREEZE(obj);
|
||||||
if (SPECIAL_CONST_P(obj)) {
|
if (SPECIAL_CONST_P(obj)) {
|
||||||
if (!immediate_frozen_tbl) {
|
rb_bug("special consts should be frozen.");
|
||||||
immediate_frozen_tbl = st_init_numtable();
|
|
||||||
}
|
|
||||||
st_insert(immediate_frozen_tbl, obj, (st_data_t)Qtrue);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return obj;
|
return obj;
|
||||||
|
@ -1112,12 +1107,7 @@ rb_obj_freeze(VALUE obj)
|
||||||
VALUE
|
VALUE
|
||||||
rb_obj_frozen_p(VALUE obj)
|
rb_obj_frozen_p(VALUE obj)
|
||||||
{
|
{
|
||||||
if (OBJ_FROZEN(obj)) return Qtrue;
|
return OBJ_FROZEN(obj) ? Qtrue : Qfalse;
|
||||||
if (SPECIAL_CONST_P(obj)) {
|
|
||||||
if (!immediate_frozen_tbl) return Qfalse;
|
|
||||||
if (st_lookup(immediate_frozen_tbl, obj, 0)) return Qtrue;
|
|
||||||
}
|
|
||||||
return Qfalse;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@ class TestEval < Test::Unit::TestCase
|
||||||
def forall_TYPE
|
def forall_TYPE
|
||||||
objects = [Object.new, [], nil, true, false] # TODO: check
|
objects = [Object.new, [], nil, true, false] # TODO: check
|
||||||
objects.each do |obj|
|
objects.each do |obj|
|
||||||
obj.instance_variable_set :@ivar, 12
|
obj.instance_variable_set :@ivar, 12 unless obj.frozen?
|
||||||
yield obj
|
yield obj
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -145,7 +145,7 @@ class TestEval < Test::Unit::TestCase
|
||||||
assert_equal :sym, o.instance_eval(":sym")
|
assert_equal :sym, o.instance_eval(":sym")
|
||||||
|
|
||||||
assert_equal 11, o.instance_eval("11")
|
assert_equal 11, o.instance_eval("11")
|
||||||
assert_equal 12, o.instance_eval("@ivar")
|
assert_equal 12, o.instance_eval("@ivar") unless o.frozen?
|
||||||
assert_equal 13, o.instance_eval("@@cvar")
|
assert_equal 13, o.instance_eval("@@cvar")
|
||||||
assert_equal 14, o.instance_eval("$gvar__eval")
|
assert_equal 14, o.instance_eval("$gvar__eval")
|
||||||
assert_equal 15, o.instance_eval("Const")
|
assert_equal 15, o.instance_eval("Const")
|
||||||
|
@ -155,7 +155,7 @@ class TestEval < Test::Unit::TestCase
|
||||||
assert_equal "19", o.instance_eval(%q("1#{9}"))
|
assert_equal "19", o.instance_eval(%q("1#{9}"))
|
||||||
|
|
||||||
1.times {
|
1.times {
|
||||||
assert_equal 12, o.instance_eval("@ivar")
|
assert_equal 12, o.instance_eval("@ivar") unless o.frozen?
|
||||||
assert_equal 13, o.instance_eval("@@cvar")
|
assert_equal 13, o.instance_eval("@@cvar")
|
||||||
assert_equal 14, o.instance_eval("$gvar__eval")
|
assert_equal 14, o.instance_eval("$gvar__eval")
|
||||||
assert_equal 15, o.instance_eval("Const")
|
assert_equal 15, o.instance_eval("Const")
|
||||||
|
@ -173,7 +173,7 @@ class TestEval < Test::Unit::TestCase
|
||||||
assert_equal :sym, o.instance_eval { :sym }
|
assert_equal :sym, o.instance_eval { :sym }
|
||||||
|
|
||||||
assert_equal 11, o.instance_eval { 11 }
|
assert_equal 11, o.instance_eval { 11 }
|
||||||
assert_equal 12, o.instance_eval { @ivar }
|
assert_equal 12, o.instance_eval { @ivar } unless o.frozen?
|
||||||
assert_equal 13, o.instance_eval { @@cvar }
|
assert_equal 13, o.instance_eval { @@cvar }
|
||||||
assert_equal 14, o.instance_eval { $gvar__eval }
|
assert_equal 14, o.instance_eval { $gvar__eval }
|
||||||
assert_equal 15, o.instance_eval { Const }
|
assert_equal 15, o.instance_eval { Const }
|
||||||
|
@ -183,7 +183,7 @@ class TestEval < Test::Unit::TestCase
|
||||||
assert_equal "19", o.instance_eval { "1#{9}" }
|
assert_equal "19", o.instance_eval { "1#{9}" }
|
||||||
|
|
||||||
1.times {
|
1.times {
|
||||||
assert_equal 12, o.instance_eval { @ivar }
|
assert_equal 12, o.instance_eval { @ivar } unless o.frozen?
|
||||||
assert_equal 13, o.instance_eval { @@cvar }
|
assert_equal 13, o.instance_eval { @@cvar }
|
||||||
assert_equal 14, o.instance_eval { $gvar__eval }
|
assert_equal 14, o.instance_eval { $gvar__eval }
|
||||||
assert_equal 15, o.instance_eval { Const }
|
assert_equal 15, o.instance_eval { Const }
|
||||||
|
|
|
@ -19,13 +19,13 @@ class TestWeakMap < Test::Unit::TestCase
|
||||||
assert_raise(ArgumentError) {@wm[true] = x}
|
assert_raise(ArgumentError) {@wm[true] = x}
|
||||||
assert_raise(ArgumentError) {@wm[false] = x}
|
assert_raise(ArgumentError) {@wm[false] = x}
|
||||||
assert_raise(ArgumentError) {@wm[nil] = x}
|
assert_raise(ArgumentError) {@wm[nil] = x}
|
||||||
assert_raise(RuntimeError) {@wm[42] = x}
|
assert_raise(ArgumentError) {@wm[42] = x}
|
||||||
assert_raise(RuntimeError) {@wm[:foo] = x}
|
assert_raise(ArgumentError) {@wm[:foo] = x}
|
||||||
assert_raise(ArgumentError) {@wm[x] = true}
|
assert_raise(ArgumentError) {@wm[x] = true}
|
||||||
assert_raise(ArgumentError) {@wm[x] = false}
|
assert_raise(ArgumentError) {@wm[x] = false}
|
||||||
assert_raise(ArgumentError) {@wm[x] = nil}
|
assert_raise(ArgumentError) {@wm[x] = nil}
|
||||||
assert_raise(RuntimeError) {@wm[x] = 42}
|
assert_raise(ArgumentError) {@wm[x] = 42}
|
||||||
assert_raise(RuntimeError) {@wm[x] = :foo}
|
assert_raise(ArgumentError) {@wm[x] = :foo}
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_include?
|
def test_include?
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue