mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Use mrb_immediate_p() in mrb_obj_freeze() and mrb_obj_frozen()
This commit is contained in:
@@ -167,6 +167,7 @@ mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f)
|
||||
|
||||
v.value.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class);
|
||||
v.value.fp->f = f;
|
||||
MRB_SET_FROZEN_FLAG(v.value.bp);
|
||||
return v;
|
||||
}
|
||||
|
||||
@@ -177,6 +178,7 @@ mrb_word_boxing_float_pool(mrb_state *mrb, mrb_float f)
|
||||
nf->tt = MRB_TT_FLOAT;
|
||||
nf->c = mrb->float_class;
|
||||
nf->f = f;
|
||||
MRB_SET_FROZEN_FLAG(nf);
|
||||
return mrb_obj_value(nf);
|
||||
}
|
||||
#endif /* MRB_WITHOUT_FLOAT */
|
||||
|
||||
+6
-38
@@ -434,24 +434,11 @@ mrb_obj_extend_m(mrb_state *mrb, mrb_value self)
|
||||
static mrb_value
|
||||
mrb_obj_freeze(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
struct RBasic *b;
|
||||
|
||||
switch (mrb_type(self)) {
|
||||
case MRB_TT_FALSE:
|
||||
case MRB_TT_TRUE:
|
||||
case MRB_TT_FIXNUM:
|
||||
case MRB_TT_SYMBOL:
|
||||
#ifndef MRB_WITHOUT_FLOAT
|
||||
case MRB_TT_FLOAT:
|
||||
#endif
|
||||
return self;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
b = mrb_basic_ptr(self);
|
||||
if (!MRB_FROZEN_P(b)) {
|
||||
MRB_SET_FROZEN_FLAG(b);
|
||||
if (!mrb_immediate_p(self)) {
|
||||
struct RBasic *b = mrb_basic_ptr(self);
|
||||
if (!MRB_FROZEN_P(b)) {
|
||||
MRB_SET_FROZEN_FLAG(b);
|
||||
}
|
||||
}
|
||||
return self;
|
||||
}
|
||||
@@ -459,26 +446,7 @@ mrb_obj_freeze(mrb_state *mrb, mrb_value self)
|
||||
static mrb_value
|
||||
mrb_obj_frozen(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
struct RBasic *b;
|
||||
|
||||
switch (mrb_type(self)) {
|
||||
case MRB_TT_FALSE:
|
||||
case MRB_TT_TRUE:
|
||||
case MRB_TT_FIXNUM:
|
||||
case MRB_TT_SYMBOL:
|
||||
#ifndef MRB_WITHOUT_FLOAT
|
||||
case MRB_TT_FLOAT:
|
||||
#endif
|
||||
return mrb_true_value();
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
b = mrb_basic_ptr(self);
|
||||
if (!MRB_FROZEN_P(b)) {
|
||||
return mrb_false_value();
|
||||
}
|
||||
return mrb_true_value();
|
||||
return mrb_bool_value(mrb_immediate_p(self) || MRB_FROZEN_P(mrb_basic_ptr(self)));
|
||||
}
|
||||
|
||||
/* 15.3.1.3.15 */
|
||||
|
||||
@@ -247,6 +247,23 @@ assert('Kernel#freeze') do
|
||||
assert_equal obj, obj.freeze
|
||||
assert_equal 0, 0.freeze
|
||||
assert_equal :a, :a.freeze
|
||||
assert_equal true, true.freeze
|
||||
assert_equal false, false.freeze
|
||||
assert_equal nil, nil.freeze
|
||||
skip unless Object.const_defined?(:Float)
|
||||
assert_equal 0.0, 0.0.freeze
|
||||
end
|
||||
|
||||
assert('Kernel#frozen?') do
|
||||
assert_false "".frozen?
|
||||
assert_true "".freeze.frozen?
|
||||
assert_true 0.frozen?
|
||||
assert_true :a.frozen?
|
||||
assert_true true.frozen?
|
||||
assert_true false.frozen?
|
||||
assert_true nil.frozen?
|
||||
skip unless Object.const_defined?(:Float)
|
||||
assert_true 0.0.frozen?
|
||||
end
|
||||
|
||||
assert('Kernel#global_variables', '15.3.1.3.14') do
|
||||
|
||||
Reference in New Issue
Block a user