Skip to content

Commit 808d7f3

Browse files
committed
remove lock file and use mruby functions to test if a string is utf8 or binary.
1 parent b07b6b5 commit 808d7f3

File tree

4 files changed

+18
-13
lines changed

4 files changed

+18
-13
lines changed

Diff for: .gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,4 @@ build/
3636
.rvmrc
3737

3838
/mruby/
39+
/build_config.rb.lock

Diff for: build_config.rb.lock

-5
This file was deleted.

Diff for: mrbgem.rake

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,10 @@ MRuby::Gem::Specification.new('mruby-simplemsgpack') do |spec|
88
spec.version = MessagePack::VERSION
99
spec.add_dependency 'mruby-errno'
1010
spec.add_dependency 'mruby-error'
11+
spec.add_dependency 'mruby-string-is-utf8'
1112
spec.add_conflict 'mruby-msgpack'
1213

13-
if build.is_a?(MRuby::CrossBuild)
14+
if build.is_a?(MRuby::CrossBuild)
1415
unless File.exist?("#{spec.build_dir}/lib/libmsgpackc.a")
1516
cmake_opts = "-DCMAKE_SYSTEM_NAME=\"#{build.build_target}\" -DCMAKE_HOST_SYSTEM_NAME=\"#{build.host_target}\" -DCMAKE_INSTALL_PREFIX=\"#{spec.build_dir}\" -DCMAKE_CXX_COMPILER=\"#{spec.cxx.command}\" -DCMAKE_CXX_COMPILER_AR=\"#{spec.archiver.command}\" -DCMAKE_CXX_FLAGS=\"#{spec.cxx.flags.join(' ')}\" -DCMAKE_C_COMPILER=\"#{spec.cc.command}\" -DCMAKE_C_COMPILER_AR=\"#{spec.archiver.command}\" -DCMAKE_C_FLAGS=\"#{spec.cc.flags.join(' ')}\" -DCMAKE_LINKER=\"#{spec.linker.command}\" -DCMAKE_MODULE_LINKER_FLAGS=\"#{spec.linker.flags.join(' ')}\""
1617
sh "mkdir -p #{spec.build_dir}/build && cd #{spec.build_dir}/build && cmake #{cmake_opts} #{spec.dir}/deps/msgpack-c/ && cmake --build . && cmake --build . --target install"

Diff for: src/mrb_msgpack.c

+15-7
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
#include <mruby/throw.h>
1313
#include <mruby/variable.h>
1414
#include <mruby/numeric.h>
15+
#include <mruby/internal.h>
1516
#include "mruby/msgpack.h"
17+
#include <mruby/string_is_utf8.h>
1618

1719
typedef struct {
1820
mrb_state* mrb;
@@ -37,6 +39,7 @@ mrb_msgpack_data_write(void* data, const char* buf, size_t len)
3739
return 0;
3840
}
3941
}
42+
4043
#define pack_integer_helper_(x, pk, self) msgpack_pack_int##x(pk, mrb_integer(self))
4144
#define pack_integer_helper(x, pk, self) pack_integer_helper_(x, pk, self)
4245
#define mrb_msgpack_pack_int(pk, self) pack_integer_helper(MRB_INT_BIT, pk, self)
@@ -69,14 +72,18 @@ static void
6972
mrb_msgpack_pack_string_value(mrb_state *mrb, mrb_value self, msgpack_packer* pk)
7073
{
7174
int rc;
72-
if (memchr(RSTRING_PTR(self), '\0', RSTRING_LEN(self))) {
73-
rc = msgpack_pack_bin(pk, RSTRING_LEN(self));
74-
if (likely(rc == 0))
75-
rc = msgpack_pack_bin_body(pk, RSTRING_PTR(self), RSTRING_LEN(self));
76-
} else {
75+
#ifdef MRB_UTF8_STRING
76+
if (RSTRING_LEN(self) == mrb_utf8_strlen(RSTRING_PTR(self), RSTRING_LEN(self))) {
77+
#else
78+
if (mrb_str_is_utf8(self)) {
79+
#endif
7780
rc = msgpack_pack_str(pk, RSTRING_LEN(self));
7881
if (likely(rc == 0))
7982
rc = msgpack_pack_str_body(pk, RSTRING_PTR(self), RSTRING_LEN(self));
83+
} else {
84+
rc = msgpack_pack_bin(pk, RSTRING_LEN(self));
85+
if (likely(rc == 0))
86+
rc = msgpack_pack_bin_body(pk, RSTRING_PTR(self), RSTRING_LEN(self));
8087
}
8188
if (unlikely(rc < 0)) {
8289
mrb_raise(mrb, E_MSGPACK_ERROR, "cannot pack string");
@@ -568,8 +575,10 @@ mrb_msgpack_unpack_m_cb(mrb_state *mrb, mrb_value self_data_block_result)
568575
msgpack_unpacked_init(result);
569576
if (mrb_type(block) == MRB_TT_PROC) {
570577
ret = msgpack_unpack_next(result, str, str_len, &off);
578+
int arena_index = mrb_gc_arena_save(mrb);
571579
while(ret == MSGPACK_UNPACK_SUCCESS) {
572580
mrb_yield(mrb, block, mrb_unpack_msgpack_obj(mrb, result->data));
581+
mrb_gc_arena_restore(mrb, arena_index);
573582
ret = msgpack_unpack_next(result, str, str_len, &off);
574583
}
575584
switch (ret) {
@@ -616,8 +625,7 @@ mrb_msgpack_unpack(mrb_state *mrb, mrb_value data)
616625
msgpack_unpacked result;
617626
mrb_msgpack_unpack_m_cb_data cb_data = {data, RSTRING_PTR(data), RSTRING_LEN(data), mrb_nil_value(), &result};
618627
mrb_value cb_data_cptr = mrb_cptr_value(mrb, &cb_data);
619-
mrb_value unpack_return = mrb_ensure(mrb, mrb_msgpack_unpack_m_cb, cb_data_cptr, mrb_msgpack_unpack_m_ensure, cb_data_cptr);
620-
return unpack_return;
628+
return mrb_ensure(mrb, mrb_msgpack_unpack_m_cb, cb_data_cptr, mrb_msgpack_unpack_m_ensure, cb_data_cptr);
621629
}
622630

623631
static mrb_value

0 commit comments

Comments
 (0)