1515extern " C" {
1616#include < mruby/internal.h>
1717}
18- #include < iostream>
1918
2019#if ((defined(__has_builtin) && __has_builtin(__builtin_expect))||(__GNUC__ >= 3) || (__INTEL_COMPILER >= 800) || defined(__clang__))
2120#define likely (x ) __builtin_expect(!!(x), 1 )
@@ -48,7 +47,6 @@ class mrb_string_buffer {
4847template <typename Packer> static void mrb_msgpack_pack_value (mrb_state* mrb, mrb_value self, Packer& pk);
4948template <typename Packer> static void mrb_msgpack_pack_array_value (mrb_state* mrb, mrb_value self, Packer& pk);
5049template <typename Packer> static void mrb_msgpack_pack_hash_value (mrb_state* mrb, mrb_value self, Packer& pk);
51- template <typename Packer> static mrb_bool mrb_msgpack_pack_ext_value (mrb_state* mrb, mrb_value self, Packer& pk);
5250
5351#define pack_integer_helper_ (x, pk, self ) pk.pack_int##x(static_cast <int ##x##_t>(mrb_integer(self)))
5452#define pack_integer_helper (x, pk, self ) pack_integer_helper_(x, pk, self)
@@ -88,30 +86,32 @@ static inline void mrb_msgpack_pack_string_value(mrb_state *mrb, mrb_value self,
8886template <typename Packer>
8987static void mrb_msgpack_pack_array_value (mrb_state* mrb, mrb_value self, Packer& pk) {
9088 mrb_int n = RARRAY_LEN (self);
89+ mrb_int arena_index = mrb_gc_arena_save (mrb);
9190 pk.pack_array (static_cast <uint32_t >(n));
9291 for (mrb_int i = 0 ; i < n; ++i) {
9392 mrb_msgpack_pack_value (mrb, mrb_ary_ref (mrb, self, i), pk);
93+ mrb_gc_arena_restore (mrb, arena_index);
9494 }
9595}
9696
9797template <typename Packer>
9898static void mrb_msgpack_pack_hash_value (mrb_state* mrb, mrb_value self, Packer& pk) {
9999 mrb_value keys = mrb_hash_keys (mrb, self);
100- int arena = mrb_gc_arena_save (mrb);
100+ mrb_int arena_index = mrb_gc_arena_save (mrb);
101101 mrb_int n = RARRAY_LEN (keys);
102102 pk.pack_map (static_cast <uint32_t >(n));
103103 for (mrb_int i = 0 ; i < n; ++i) {
104104 mrb_value key = mrb_ary_ref (mrb, keys, i);
105105 mrb_msgpack_pack_value (mrb, key, pk);
106106 mrb_msgpack_pack_value (mrb, mrb_hash_get (mrb, self, key), pk);
107- mrb_gc_arena_restore (mrb, arena );
107+ mrb_gc_arena_restore (mrb, arena_index );
108108 }
109109}
110110
111111static mrb_value
112112mrb_msgpack_get_ext_config (mrb_state* mrb, mrb_value obj)
113113{
114- int arena_index;
114+ mrb_int arena_index;
115115 mrb_value ext_type_classes;
116116 mrb_int classes_count;
117117
@@ -148,7 +148,7 @@ mrb_msgpack_get_ext_config(mrb_state* mrb, mrb_value obj)
148148
149149template <typename Packer>
150150static mrb_bool mrb_msgpack_pack_ext_value (mrb_state* mrb, mrb_value self, Packer& pk) {
151- int arena_index = mrb_gc_arena_save (mrb);
151+ mrb_int arena_index = mrb_gc_arena_save (mrb);
152152
153153 mrb_value ext_config = mrb_msgpack_get_ext_config (mrb, self);
154154 if (!mrb_hash_p (ext_config)) {
@@ -491,14 +491,12 @@ mrb_unpack_msgpack_obj(mrb_state* mrb, mrb_value data, const msgpack::object& ob
491491 return mrb_unpack_msgpack_obj_map (mrb, data, obj, referenced);
492492 case msgpack::type::EXT: {
493493 auto ext_type = obj.via .ext .type ();
494- auto ext_data = obj.via .ext .data ();
495- auto ext_size = obj.via .ext .size ;
496494
497495 mrb_value unpacker = mrb_hash_get (mrb,
498496 mrb_const_get (mrb, mrb_obj_value (mrb_module_get_id (mrb, MRB_SYM (MessagePack))), MRB_SYM (_ExtUnpackers)),
499497 mrb_int_value (mrb, ext_type));
500498 if (likely (mrb_type (unpacker) == MRB_TT_PROC)) {
501- return mrb_yield (mrb, unpacker, mrb_str_substr (mrb, data, ext_data - RSTRING_PTR (data), ext_size ));
499+ return mrb_yield (mrb, unpacker, mrb_str_substr (mrb, data, obj. via . ext . data () - RSTRING_PTR (data), obj. via . ext . size ));
502500 } else {
503501 mrb_raisef (mrb, E_MSGPACK_ERROR, " Cannot unpack ext type %S" , mrb_int_value (mrb, ext_type));
504502 }
@@ -508,52 +506,43 @@ mrb_unpack_msgpack_obj(mrb_state* mrb, mrb_value data, const msgpack::object& ob
508506 }
509507}
510508
511- // --- Array ---
512509static mrb_value
513510mrb_unpack_msgpack_obj_array (mrb_state* mrb, mrb_value data, const msgpack::object& obj, bool referenced)
514511{
515512 if (obj.via .array .size == 0 ) return mrb_ary_new (mrb);
516513
517514 mrb_value ary = mrb_ary_new_capa (mrb, obj.via .array .size );
518- int arena = mrb_gc_arena_save (mrb);
515+ mrb_int arena_index = mrb_gc_arena_save (mrb);
519516 const msgpack::object* ptr = obj.via .array .ptr ;
520517 const msgpack::object* end = ptr + obj.via .array .size ;
521518 for (; ptr < end; ++ptr) {
522519 mrb_ary_push (mrb, ary, mrb_unpack_msgpack_obj (mrb, data, *ptr, referenced));
523- mrb_gc_arena_restore (mrb, arena );
520+ mrb_gc_arena_restore (mrb, arena_index );
524521 }
525522
526523 return ary;
527524}
528525
529- // --- Map ---
530526static mrb_value
531527mrb_unpack_msgpack_obj_map (mrb_state* mrb, mrb_value data, const msgpack::object& obj, bool referenced)
532528{
533529 if (obj.via .map .size == 0 ) return mrb_hash_new (mrb);
534530
535531 mrb_value hash = mrb_hash_new_capa (mrb, obj.via .map .size );
536- int arena = mrb_gc_arena_save (mrb);
532+ mrb_int arena_index = mrb_gc_arena_save (mrb);
537533 const msgpack::object_kv* ptr = obj.via .map .ptr ;
538534 const msgpack::object_kv* end = ptr + obj.via .map .size ;
539535 for (; ptr < end; ++ptr) {
540536 mrb_value key = mrb_unpack_msgpack_obj (mrb, data, ptr->key , referenced);
541537 mrb_value val = mrb_unpack_msgpack_obj (mrb, data, ptr->val , referenced);
542538 mrb_hash_set (mrb, hash, key, val);
543- mrb_gc_arena_restore (mrb, arena );
539+ mrb_gc_arena_restore (mrb, arena_index );
544540 }
545541 return hash;
546542}
547543
548544bool my_reference_func (msgpack::type::object_type type, std::size_t length, void * user_data) {
549- switch (type) {
550- case msgpack::type::STR:
551- case msgpack::type::BIN:
552- case msgpack::type::EXT:
553- return true ;
554- default :
555- return false ;
556- }
545+ return true ;
557546}
558547
559548MRB_API mrb_value
@@ -581,10 +570,10 @@ mrb_msgpack_unpack_m(mrb_state* mrb, mrb_value self)
581570 const char * buf = RSTRING_PTR (data);
582571 std::size_t len = RSTRING_LEN (data);
583572 std::size_t off = 0 ;
573+ bool referenced = false ;
584574
585575 try {
586576 if (mrb_type (block) == MRB_TT_PROC) {
587- bool referenced = false ;
588577 while (off < len) {
589578 try {
590579 msgpack::object_handle oh = msgpack::unpack (buf, len, off, referenced, my_reference_func);
@@ -593,12 +582,9 @@ mrb_msgpack_unpack_m(mrb_state* mrb, mrb_value self)
593582 catch (const msgpack::insufficient_bytes&) {
594583 break ;
595584 }
596-
597585 }
598586 return mrb_fixnum_value ((mrb_int)off);
599587 } else {
600- std::size_t off = 0 ;
601- bool referenced = false ;
602588 msgpack::object_handle oh = msgpack::unpack (buf, len, off, referenced, my_reference_func);
603589 return mrb_unpack_msgpack_obj (mrb, data, oh.get (), referenced);
604590 }
0 commit comments