Skip to content

Commit e42c7a6

Browse files
committed
prepare for a release
1 parent 959958f commit e42c7a6

File tree

1 file changed

+13
-27
lines changed

1 file changed

+13
-27
lines changed

src/mrb_msgpack.cpp

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
extern "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 {
4847
template <typename Packer> static void mrb_msgpack_pack_value(mrb_state* mrb, mrb_value self, Packer& pk);
4948
template <typename Packer> static void mrb_msgpack_pack_array_value(mrb_state* mrb, mrb_value self, Packer& pk);
5049
template <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,
8886
template <typename Packer>
8987
static 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

9797
template <typename Packer>
9898
static 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

111111
static mrb_value
112112
mrb_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

149149
template <typename Packer>
150150
static 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 ---
512509
static mrb_value
513510
mrb_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 ---
530526
static mrb_value
531527
mrb_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

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

559548
MRB_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

Comments
 (0)