@@ -24,26 +24,6 @@ extern "C" {
2424#define unlikely (x ) (x)
2525#endif
2626
27- class mrb_string_buffer {
28- mrb_state* mrb;
29- mrb_value str;
30- public:
31-
32- mrb_string_buffer (mrb_state* mrb) : mrb(mrb)
33- {
34- this ->str = mrb_str_new (mrb, nullptr , 0 );
35- }
36-
37- void write (const char * data, size_t size) {
38- mrb_str_cat (this ->mrb , this ->str , data, size);
39- }
40-
41- mrb_value get ()
42- {
43- return this ->str ;
44- }
45- };
46-
4727template <typename Packer> static void mrb_msgpack_pack_value (mrb_state* mrb, mrb_value self, Packer& pk);
4828template <typename Packer> static void mrb_msgpack_pack_array_value (mrb_state* mrb, mrb_value self, Packer& pk);
4929template <typename Packer> static void mrb_msgpack_pack_hash_value (mrb_state* mrb, mrb_value self, Packer& pk);
@@ -238,10 +218,10 @@ static void mrb_msgpack_pack_value(mrb_state* mrb, mrb_value self, Packer& pk) {
238218static mrb_value
239219mrb_msgpack_pack_object (mrb_state* mrb, mrb_value self) {
240220 try {
241- mrb_string_buffer sbuf (mrb) ;
242- msgpack::packer<mrb_string_buffer > pk (&sbuf);
221+ msgpack::sbuffer sbuf;
222+ msgpack::packer<msgpack::sbuffer > pk (&sbuf);
243223 mrb_msgpack_pack_value (mrb, self, pk);
244- return sbuf.get ( );
224+ return mrb_str_new (mrb, sbuf.data (), sbuf. size () );
245225 } catch (const std::bad_alloc&) {
246226 mrb_exc_raise (mrb, mrb_obj_value (mrb->nomem_err ));
247227 } catch (const std::exception& e) {
@@ -253,10 +233,10 @@ mrb_msgpack_pack_object(mrb_state* mrb, mrb_value self) {
253233static mrb_value
254234mrb_msgpack_pack_string (mrb_state* mrb, mrb_value self) {
255235 try {
256- mrb_string_buffer sbuf (mrb) ;
257- msgpack::packer<mrb_string_buffer > pk (&sbuf);
236+ msgpack::sbuffer sbuf;
237+ msgpack::packer<msgpack::sbuffer > pk (&sbuf);
258238 mrb_msgpack_pack_string_value (mrb, self, pk);
259- return sbuf.get ( );
239+ return mrb_str_new (mrb, sbuf.data (), sbuf. size () );
260240 } catch (const std::bad_alloc&) {
261241 mrb_exc_raise (mrb, mrb_obj_value (mrb->nomem_err ));
262242 } catch (const std::exception& e) {
@@ -268,10 +248,10 @@ mrb_msgpack_pack_string(mrb_state* mrb, mrb_value self) {
268248static mrb_value
269249mrb_msgpack_pack_array (mrb_state* mrb, mrb_value self) {
270250 try {
271- mrb_string_buffer sbuf (mrb) ;
272- msgpack::packer<mrb_string_buffer > pk (&sbuf);
251+ msgpack::sbuffer sbuf;
252+ msgpack::packer<msgpack::sbuffer > pk (&sbuf);
273253 mrb_msgpack_pack_array_value (mrb, self, pk);
274- return sbuf.get ( );
254+ return mrb_str_new (mrb, sbuf.data (), sbuf. size () );
275255 } catch (const std::bad_alloc&) {
276256 mrb_exc_raise (mrb, mrb_obj_value (mrb->nomem_err ));
277257 } catch (const std::exception& e) {
@@ -284,10 +264,10 @@ mrb_msgpack_pack_array(mrb_state* mrb, mrb_value self) {
284264static mrb_value
285265mrb_msgpack_pack_hash (mrb_state* mrb, mrb_value self) {
286266 try {
287- mrb_string_buffer sbuf (mrb) ;
288- msgpack::packer<mrb_string_buffer > pk (&sbuf);
267+ msgpack::sbuffer sbuf;
268+ msgpack::packer<msgpack::sbuffer > pk (&sbuf);
289269 mrb_msgpack_pack_hash_value (mrb, self, pk);
290- return sbuf.get ( );
270+ return mrb_str_new (mrb, sbuf.data (), sbuf. size () );
291271 } catch (const std::bad_alloc&) {
292272 mrb_exc_raise (mrb, mrb_obj_value (mrb->nomem_err ));
293273 } catch (const std::exception& e) {
@@ -300,10 +280,10 @@ mrb_msgpack_pack_hash(mrb_state* mrb, mrb_value self) {
300280static mrb_value
301281mrb_msgpack_pack_float (mrb_state* mrb, mrb_value self) {
302282 try {
303- mrb_string_buffer sbuf (mrb) ;
304- msgpack::packer<mrb_string_buffer > pk (&sbuf);
283+ msgpack::sbuffer sbuf;
284+ msgpack::packer<msgpack::sbuffer > pk (&sbuf);
305285 mrb_msgpack_pack_float_value (mrb, self, pk);
306- return sbuf.get ( );
286+ return mrb_str_new (mrb, sbuf.data (), sbuf. size () );
307287 } catch (const std::bad_alloc&) {
308288 mrb_exc_raise (mrb, mrb_obj_value (mrb->nomem_err ));
309289 } catch (const std::exception& e) {
@@ -316,10 +296,10 @@ mrb_msgpack_pack_float(mrb_state* mrb, mrb_value self) {
316296static mrb_value
317297mrb_msgpack_pack_integer (mrb_state* mrb, mrb_value self) {
318298 try {
319- mrb_string_buffer sbuf (mrb) ;
320- msgpack::packer<mrb_string_buffer > pk (&sbuf);
299+ msgpack::sbuffer sbuf;
300+ msgpack::packer<msgpack::sbuffer > pk (&sbuf);
321301 mrb_msgpack_pack_integer_value (mrb, self, pk);
322- return sbuf.get ( );
302+ return mrb_str_new (mrb, sbuf.data (), sbuf. size () );
323303 } catch (const std::bad_alloc&) {
324304 mrb_exc_raise (mrb, mrb_obj_value (mrb->nomem_err ));
325305 } catch (const std::exception& e) {
@@ -331,10 +311,10 @@ mrb_msgpack_pack_integer(mrb_state* mrb, mrb_value self) {
331311static mrb_value
332312mrb_msgpack_pack_true (mrb_state* mrb, mrb_value self) {
333313 try {
334- mrb_string_buffer sbuf (mrb) ;
335- msgpack::packer<mrb_string_buffer > pk (&sbuf);
314+ msgpack::sbuffer sbuf;
315+ msgpack::packer<msgpack::sbuffer > pk (&sbuf);
336316 pk.pack_true ();
337- return sbuf.get ( );
317+ return mrb_str_new (mrb, sbuf.data (), sbuf. size () );
338318 } catch (const std::bad_alloc&) {
339319 mrb_exc_raise (mrb, mrb_obj_value (mrb->nomem_err ));
340320 } catch (const std::exception& e) {
@@ -346,10 +326,10 @@ mrb_msgpack_pack_true(mrb_state* mrb, mrb_value self) {
346326static mrb_value
347327mrb_msgpack_pack_false (mrb_state* mrb, mrb_value self) {
348328 try {
349- mrb_string_buffer sbuf (mrb) ;
350- msgpack::packer<mrb_string_buffer > pk (&sbuf);
329+ msgpack::sbuffer sbuf;
330+ msgpack::packer<msgpack::sbuffer > pk (&sbuf);
351331 pk.pack_false ();
352- return sbuf.get ( );
332+ return mrb_str_new (mrb, sbuf.data (), sbuf. size () );
353333 } catch (const std::bad_alloc&) {
354334 mrb_exc_raise (mrb, mrb_obj_value (mrb->nomem_err ));
355335 } catch (const std::exception& e) {
@@ -361,10 +341,10 @@ mrb_msgpack_pack_false(mrb_state* mrb, mrb_value self) {
361341static mrb_value
362342mrb_msgpack_pack_nil (mrb_state* mrb, mrb_value self) {
363343 try {
364- mrb_string_buffer sbuf (mrb) ;
365- msgpack::packer<mrb_string_buffer > pk (&sbuf);
344+ msgpack::sbuffer sbuf;
345+ msgpack::packer<msgpack::sbuffer > pk (&sbuf);
366346 pk.pack_nil ();
367- return sbuf.get ( );
347+ return mrb_str_new (mrb, sbuf.data (), sbuf. size () );
368348 } catch (const std::bad_alloc&) {
369349 mrb_exc_raise (mrb, mrb_obj_value (mrb->nomem_err ));
370350 } catch (const std::exception& e) {
@@ -378,10 +358,10 @@ MRB_API mrb_value
378358mrb_msgpack_pack (mrb_state *mrb, mrb_value object)
379359{
380360 try {
381- mrb_string_buffer sbuf (mrb) ;
382- msgpack::packer<mrb_string_buffer > pk (&sbuf);
361+ msgpack::sbuffer sbuf;
362+ msgpack::packer<msgpack::sbuffer > pk (&sbuf);
383363 mrb_msgpack_pack_value (mrb, object, pk);
384- return sbuf.get ( );
364+ return mrb_str_new (mrb, sbuf.data (), sbuf. size () );
385365 }
386366 catch (const std::exception &e) {
387367 mrb_raise (mrb, E_MSGPACK_ERROR, e.what ());
@@ -393,12 +373,12 @@ MRB_API mrb_value
393373mrb_msgpack_pack_argv (mrb_state *mrb, mrb_value *argv, mrb_int argv_len)
394374{
395375 try {
396- mrb_string_buffer sbuf (mrb) ;
397- msgpack::packer<mrb_string_buffer > pk (&sbuf);
376+ msgpack::sbuffer sbuf;
377+ msgpack::packer<msgpack::sbuffer > pk (&sbuf);
398378 pk.pack_array (static_cast <uint32_t >(argv_len));
399379 for (mrb_int i = 0 ; i < argv_len; ++i)
400380 mrb_msgpack_pack_value (mrb, argv[i], pk);
401- return sbuf.get ( );
381+ return mrb_str_new (mrb, sbuf.data (), sbuf. size () );
402382 }
403383 catch (const std::exception &e) {
404384 mrb_raise (mrb, E_MSGPACK_ERROR, e.what ());
@@ -542,7 +522,14 @@ mrb_unpack_msgpack_obj_map(mrb_state* mrb, mrb_value data, const msgpack::object
542522}
543523
544524bool my_reference_func (msgpack::type::object_type type, std::size_t length, void * user_data) {
545- return true ;
525+ switch (type) {
526+ case msgpack::type::BIN:
527+ case msgpack::type::EXT:
528+ case msgpack::type::STR:
529+ return true ;
530+ default :
531+ return false ;
532+ }
546533}
547534
548535MRB_API mrb_value
0 commit comments