Skip to content

Commit f64b28f

Browse files
committed
use msgpack sbuffer
1 parent ca7013d commit f64b28f

File tree

1 file changed

+41
-54
lines changed

1 file changed

+41
-54
lines changed

src/mrb_msgpack.cpp

Lines changed: 41 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
4727
template <typename Packer> static void mrb_msgpack_pack_value(mrb_state* mrb, mrb_value self, Packer& pk);
4828
template <typename Packer> static void mrb_msgpack_pack_array_value(mrb_state* mrb, mrb_value self, Packer& pk);
4929
template <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) {
238218
static mrb_value
239219
mrb_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) {
253233
static mrb_value
254234
mrb_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) {
268248
static mrb_value
269249
mrb_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) {
284264
static mrb_value
285265
mrb_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) {
300280
static mrb_value
301281
mrb_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) {
316296
static mrb_value
317297
mrb_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) {
331311
static mrb_value
332312
mrb_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) {
346326
static mrb_value
347327
mrb_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) {
361341
static mrb_value
362342
mrb_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
378358
mrb_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
393373
mrb_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

544524
bool 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

548535
MRB_API mrb_value

0 commit comments

Comments
 (0)