@@ -502,9 +502,10 @@ mrb_msgpack_register_pack_type(mrb_state* mrb, mrb_value self)
502502 mrb_raise (mrb, E_TYPE_ERROR, " not a block" );
503503 }
504504
505+ mrb_msgpack_ctx* ctx = MRB_MSGPACK_CONTEXT (mrb);
505506 if (mrb_class_ptr (mrb_class) == mrb->symbol_class ) {
506507 mrb_raise (mrb, E_ARGUMENT_ERROR,
507- " cannot register ext packer for Symbols" );
508+ " cannot register ext packer for Symbols, use the new MessagePack.sym_strategy function. " );
508509 }
509510
510511 ext_packers = mrb_const_get (mrb, self, MRB_SYM (_ExtPackers));
@@ -517,6 +518,7 @@ mrb_msgpack_register_pack_type(mrb_state* mrb, mrb_value self)
517518 return mrb_nil_value ();
518519}
519520
521+
520522static mrb_value
521523mrb_msgpack_ext_packer_registered (mrb_state *mrb, mrb_value self)
522524{
@@ -930,6 +932,16 @@ mrb_msgpack_register_unpack_type(mrb_state* mrb, mrb_value self)
930932 mrb_raise (mrb, E_TYPE_ERROR, " not a block" );
931933 }
932934
935+ mrb_msgpack_ctx* ctx = MRB_MSGPACK_CONTEXT (mrb);
936+
937+ // If the user is using an ext-based symbol strategy,
938+ // forbid overriding the symbol ext type.
939+ if (ctx->sym_unpacker != nullptr && type == ctx->ext_type ) {
940+ mrb_raise (mrb, E_ARGUMENT_ERROR,
941+ " cannot register ext unpacker for Symbols, use MessagePack.sym_strategy instead." );
942+ }
943+
944+ // Otherwise: safe to register
933945 mrb_hash_set (mrb,
934946 mrb_const_get (mrb, self, MRB_SYM (_ExtUnpackers)),
935947 mrb_int_value (mrb, type),
@@ -938,6 +950,7 @@ mrb_msgpack_register_unpack_type(mrb_state* mrb, mrb_value self)
938950 return mrb_nil_value ();
939951}
940952
953+
941954static mrb_value
942955mrb_msgpack_ext_unpacker_registered (mrb_state *mrb, mrb_value self)
943956{
0 commit comments