GitHub

Original file line numberDiff line numberDiff line change

@@ -1434,7 +1434,7 @@ MRB_INLINE void mrb_check_frozen(mrb_state *mrb, void *o)

14341434

{

14351435

if (mrb_frozen_p((struct RBasic*)o)) mrb_frozen_error(mrb, o);

14361436

}

1437-
1437+

MRB_API void mrb_check_frozen_value(mrb_state *mrb, mrb_value v);

14381438

MRB_API void mrb_define_alias(mrb_state *mrb, struct RClass *c, const char *a, const char *b);

14391439

MRB_API void mrb_define_alias_id(mrb_state *mrb, struct RClass *c, mrb_sym a, mrb_sym b);

14401440

MRB_API const char *mrb_class_name(mrb_state *mrb, struct RClass* klass);

Original file line numberDiff line numberDiff line change

@@ -756,7 +756,13 @@ mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_method_

756756
757757

MRB_CLASS_ORIGIN(c);

758758

h = c->mt;

759-

mrb_check_frozen(mrb, c);

759+

if (c->tt == MRB_TT_SCLASS && mrb_frozen_p(c)) {

760+

mrb_value v = mrb_iv_get(mrb, mrb_obj_value(c), MRB_SYM(__attached__));

761+

mrb_check_frozen_value(mrb, v);

762+

}

763+

else {

764+

mrb_check_frozen(mrb, c);

765+

}

760766

if (!h) h = c->mt = mt_new(mrb);

761767

if (MRB_METHOD_PROC_P(m)) {

762768

struct RProc *p = MRB_METHOD_PROC(m);

@@ -1011,10 +1017,7 @@ get_args_v(mrb_state *mrb, mrb_args_format format, void** ptr, va_list *ap)

10111017

if (i < argc) {

10121018

pickarg = &argv[i++];

10131019

if (needmodify && !mrb_nil_p(*pickarg)) {

1014-

if (mrb_immediate_p(*pickarg)) {

1015-

mrb_raisef(mrb, E_FROZEN_ERROR, "can't modify frozen %t", *pickarg);

1016-

}

1017-

mrb_check_frozen(mrb, mrb_obj_ptr(*pickarg));

1020+

mrb_check_frozen_value(mrb, *pickarg);

10181021

}

10191022

}

10201023

else {

Original file line numberDiff line numberDiff line change

@@ -518,10 +518,24 @@ mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_value args, char const* fmt,

518518

mrb_exc_raise(mrb, exc);

519519

}

520520
521+

static mrb_noreturn void

522+

frozen_error(mrb_state *mrb, mrb_value v)

523+

{

524+

mrb_raisef(mrb, E_FROZEN_ERROR, "can't modify frozen %t", v);

525+

}

526+
521527

MRB_API mrb_noreturn void

522528

mrb_frozen_error(mrb_state *mrb, void *frozen_obj)

523529

{

524-

mrb_raisef(mrb, E_FROZEN_ERROR, "can't modify frozen %t", mrb_obj_value(frozen_obj));

530+

frozen_error(mrb, mrb_obj_value(frozen_obj));

531+

}

532+
533+

MRB_API void

534+

mrb_check_frozen_value(mrb_state *mrb, mrb_value v)

535+

{

536+

if (mrb_immediate_p(v) || mrb_frozen_p(mrb_basic_ptr(v))) {

537+

frozen_error(mrb, v);

538+

}

525539

}

526540
527541

MRB_API mrb_noreturn void

Read the original on github.com ↗