11// mruby-simplemsgpack C++ packer wrapper (msgpack::packer + msgpack::sbuffer)
22#define MSGPACK_NO_BOOST
3+ #define MSGPACK_DEFAULT_API_VERSION 3
34#include < msgpack.hpp>
45#include < mruby.h>
56#include < mruby/array.h>
@@ -438,13 +439,13 @@ mrb_msgpack_ext_packer_registered(mrb_state *mrb, mrb_value self)
438439}
439440
440441// Forward decls
441- static mrb_value mrb_unpack_msgpack_obj (mrb_state* mrb, mrb_value data, const msgpack::object& obj, bool referenced );
442- static mrb_value mrb_unpack_msgpack_obj_array (mrb_state* mrb, mrb_value data, const msgpack::object& obj, bool referenced );
443- static mrb_value mrb_unpack_msgpack_obj_map (mrb_state* mrb, mrb_value data, const msgpack::object& obj, bool referenced );
442+ static mrb_value mrb_unpack_msgpack_obj (mrb_state* mrb, const msgpack::object& obj);
443+ static mrb_value mrb_unpack_msgpack_obj_array (mrb_state* mrb, const msgpack::object& obj);
444+ static mrb_value mrb_unpack_msgpack_obj_map (mrb_state* mrb, const msgpack::object& obj);
444445
445446// --- Core dispatch ---
446447static mrb_value
447- mrb_unpack_msgpack_obj (mrb_state* mrb, mrb_value data, const msgpack::object& obj, bool referenced )
448+ mrb_unpack_msgpack_obj (mrb_state* mrb, const msgpack::object& obj)
448449{
449450 switch (obj.type ) {
450451 case msgpack::type::NIL:
@@ -466,21 +467,21 @@ mrb_unpack_msgpack_obj(mrb_state* mrb, mrb_value data, const msgpack::object& ob
466467# endif
467468#endif
468469 case msgpack::type::STR:
469- return mrb_str_substr (mrb, data, obj.via .str .ptr - RSTRING_PTR (data) , obj.via .str .size );
470+ return mrb_str_new (mrb, obj.via .str .ptr , obj.via .str .size );
470471 case msgpack::type::BIN:
471- return mrb_str_substr (mrb, data, obj.via .bin .ptr - RSTRING_PTR (data) , obj.via .bin .size );
472+ return mrb_str_new (mrb, obj.via .bin .ptr , obj.via .bin .size );
472473 case msgpack::type::ARRAY:
473- return mrb_unpack_msgpack_obj_array (mrb, data, obj, referenced );
474+ return mrb_unpack_msgpack_obj_array (mrb, obj);
474475 case msgpack::type::MAP:
475- return mrb_unpack_msgpack_obj_map (mrb, data, obj, referenced );
476+ return mrb_unpack_msgpack_obj_map (mrb, obj);
476477 case msgpack::type::EXT: {
477478 auto ext_type = obj.via .ext .type ();
478479
479480 mrb_value unpacker = mrb_hash_get (mrb,
480481 mrb_const_get (mrb, mrb_obj_value (mrb_module_get_id (mrb, MRB_SYM (MessagePack))), MRB_SYM (_ExtUnpackers)),
481482 mrb_int_value (mrb, ext_type));
482483 if (likely (mrb_type (unpacker) == MRB_TT_PROC)) {
483- return mrb_yield (mrb, unpacker, mrb_str_substr (mrb, data, obj.via .ext .data () - RSTRING_PTR (data ), obj.via .ext .size ));
484+ return mrb_yield (mrb, unpacker, mrb_str_new (mrb, obj.via .ext .data (), obj.via .ext .size ));
484485 } else {
485486 mrb_raisef (mrb, E_MSGPACK_ERROR, " Cannot unpack ext type %S" , mrb_int_value (mrb, ext_type));
486487 }
@@ -492,60 +493,43 @@ mrb_unpack_msgpack_obj(mrb_state* mrb, mrb_value data, const msgpack::object& ob
492493}
493494
494495static mrb_value
495- mrb_unpack_msgpack_obj_array (mrb_state* mrb, mrb_value data, const msgpack::object& obj, bool referenced )
496+ mrb_unpack_msgpack_obj_array (mrb_state* mrb, const msgpack::object& obj)
496497{
497498 if (obj.via .array .size == 0 ) return mrb_ary_new (mrb);
498499
499500 mrb_value ary = mrb_ary_new_capa (mrb, obj.via .array .size );
500501 mrb_int arena_index = mrb_gc_arena_save (mrb);
501- const msgpack::object* ptr = obj.via .array .ptr ;
502- const msgpack::object* end = ptr + obj.via .array .size ;
503- for (; ptr < end; ++ptr) {
504- mrb_ary_push (mrb, ary, mrb_unpack_msgpack_obj (mrb, data, *ptr, referenced));
502+ for (uint32_t i = 0 ; i < obj.via .array .size ; i++) {
503+ mrb_ary_push (mrb, ary, mrb_unpack_msgpack_obj (mrb, obj.via .array .ptr [i]));
505504 mrb_gc_arena_restore (mrb, arena_index);
506505 }
507506
508507 return ary;
509508}
510509
511510static mrb_value
512- mrb_unpack_msgpack_obj_map (mrb_state* mrb, mrb_value data, const msgpack::object& obj, bool referenced )
511+ mrb_unpack_msgpack_obj_map (mrb_state* mrb, const msgpack::object& obj)
513512{
514513 if (obj.via .map .size == 0 ) return mrb_hash_new (mrb);
515514
516515 mrb_value hash = mrb_hash_new_capa (mrb, obj.via .map .size );
517516 mrb_int arena_index = mrb_gc_arena_save (mrb);
518- const msgpack::object_kv* ptr = obj.via .map .ptr ;
519- const msgpack::object_kv* end = ptr + obj.via .map .size ;
520- for (; ptr < end; ++ptr) {
521- mrb_value key = mrb_unpack_msgpack_obj (mrb, data, ptr->key , referenced);
522- mrb_value val = mrb_unpack_msgpack_obj (mrb, data, ptr->val , referenced);
517+ for (uint32_t i = 0 ; i < obj.via .map .size ; i++) {
518+ mrb_value key = mrb_unpack_msgpack_obj (mrb, obj.via .map .ptr [i].key );
519+ mrb_value val = mrb_unpack_msgpack_obj (mrb, obj.via .map .ptr [i].val );
523520 mrb_hash_set (mrb, hash, key, val);
524521 mrb_gc_arena_restore (mrb, arena_index);
525522 }
526523 return hash;
527524}
528525
529- bool my_reference_func (msgpack::type::object_type type, std::size_t length, void * user_data) {
530- switch (type) {
531- case msgpack::type::STR:
532- case msgpack::type::BIN:
533- case msgpack::type::EXT:
534- return true ;
535- default :
536- return false ;
537- }
538- }
539-
540526MRB_API mrb_value
541527mrb_msgpack_unpack (mrb_state *mrb, mrb_value data)
542528{
543529 data = mrb_str_to_str (mrb, data);
544530 try {
545- std::size_t off = 0 ;
546- bool referenced = false ;
547- msgpack::object_handle oh = msgpack::unpack (RSTRING_PTR (data), RSTRING_LEN (data), off, referenced, my_reference_func);
548- return mrb_unpack_msgpack_obj (mrb, data, oh.get (), referenced);
531+ msgpack::object_handle oh = msgpack::unpack (RSTRING_PTR (data), RSTRING_LEN (data));
532+ return mrb_unpack_msgpack_obj (mrb, oh.get ());
549533 }
550534 catch (const std::exception &e) {
551535 mrb_raisef (mrb, E_MSGPACK_ERROR, " Can't unpack: %S" , mrb_str_new_cstr (mrb, e.what ()));
@@ -563,23 +547,22 @@ mrb_msgpack_unpack_m(mrb_state* mrb, mrb_value self)
563547 const char * buf = RSTRING_PTR (data);
564548 std::size_t len = RSTRING_LEN (data);
565549 std::size_t off = 0 ;
566- bool referenced = false ;
567550
568551 try {
569552 if (mrb_type (block) == MRB_TT_PROC) {
570553 while (off < len) {
571554 try {
572- msgpack::object_handle oh = msgpack::unpack (buf, len, off, referenced, my_reference_func );
573- mrb_yield (mrb, block, mrb_unpack_msgpack_obj (mrb, data, oh.get (), referenced ));
555+ msgpack::object_handle oh = msgpack::unpack (buf, len, off);
556+ mrb_yield (mrb, block, mrb_unpack_msgpack_obj (mrb, oh.get ()));
574557 }
575558 catch (const msgpack::insufficient_bytes&) {
576559 break ;
577560 }
578561 }
579562 return mrb_fixnum_value ((mrb_int)off);
580563 } else {
581- msgpack::object_handle oh = msgpack::unpack (buf, len, off, referenced, my_reference_func );
582- return mrb_unpack_msgpack_obj (mrb, data, oh.get (), referenced );
564+ msgpack::object_handle oh = msgpack::unpack (buf, len, off);
565+ return mrb_unpack_msgpack_obj (mrb, oh.get ());
583566 }
584567 }
585568 catch (const std::exception &e) {
@@ -591,13 +574,8 @@ mrb_msgpack_unpack_m(mrb_state* mrb, mrb_value self)
591574struct msgpack_object_handle {
592575 msgpack::object_handle oh;
593576 std::size_t off;
594- bool referenced;
595577
596- msgpack_object_handle ()
597- : oh(msgpack::object_handle()),
598- off (0 ),
599- referenced(false )
600- {}
578+ msgpack_object_handle () : oh(msgpack::object_handle()), off(0 ) {}
601579
602580};
603581
@@ -620,7 +598,7 @@ mrb_msgpack_object_handle_value(mrb_state *mrb, mrb_value self)
620598 if (unlikely (!handle)) {
621599 mrb_raise (mrb, E_MSGPACK_ERROR, " ObjectHandle is not initialized" );
622600 }
623- return mrb_unpack_msgpack_obj (mrb, mrb_iv_get (mrb, self, MRB_SYM (data)), handle->oh .get (), handle-> referenced );
601+ return mrb_unpack_msgpack_obj (mrb, handle->oh .get ());
624602}
625603
626604static mrb_value
@@ -633,7 +611,7 @@ mrb_msgpack_unpack_lazy_m(mrb_state *mrb, mrb_value self)
633611 try {
634612 mrb_value object_handle = mrb_obj_new (mrb, mrb_class_get_under_id (mrb, mrb_module_get_id (mrb, MRB_SYM (MessagePack)), MRB_SYM (ObjectHandle)), 1 , &data);
635613 msgpack_object_handle* handle = static_cast <msgpack_object_handle*>(DATA_PTR (object_handle));
636- msgpack::unpack (handle->oh , RSTRING_PTR (data), RSTRING_LEN (data), handle->off , handle-> referenced , my_reference_func );
614+ msgpack::unpack (handle->oh , RSTRING_PTR (data), RSTRING_LEN (data), handle->off );
637615
638616 return object_handle;
639617 }
@@ -673,12 +651,7 @@ mrb_msgpack_object_handle_at_pointer(mrb_state *mrb, mrb_value self)
673651 const msgpack::object *current = &handle->oh .get ();
674652
675653 if (pointer.empty () || pointer == " /" ) {
676- return mrb_unpack_msgpack_obj (
677- mrb,
678- mrb_iv_get (mrb, self, MRB_SYM (data)),
679- *current,
680- handle->referenced
681- );
654+ return mrb_unpack_msgpack_obj (mrb, *current);
682655 }
683656
684657 if (pointer.front () != ' /' ) {
@@ -739,17 +712,9 @@ mrb_msgpack_object_handle_at_pointer(mrb_state *mrb, mrb_value self)
739712 pointer.remove_prefix (pos + 1 );
740713 }
741714
742- return mrb_unpack_msgpack_obj (
743- mrb,
744- mrb_iv_get (mrb, self, MRB_SYM (data)),
745- *current,
746- handle->referenced
747- );
715+ return mrb_unpack_msgpack_obj (mrb, *current);
748716}
749717
750-
751-
752-
753718static mrb_value
754719mrb_msgpack_register_unpack_type (mrb_state* mrb, mrb_value self)
755720{
0 commit comments