diff options
author | Joshua Haberman <jhaberman@gmail.com> | 2016-03-04 17:31:11 -0800 |
---|---|---|
committer | Joshua Haberman <jhaberman@gmail.com> | 2016-03-04 17:31:11 -0800 |
commit | e70f9256af79af6092eae4ce22a61b1b6651f37d (patch) | |
tree | 5d9bdbb84c876d6e6d34fef8348ad4ed282e0336 /ruby/ext/google/protobuf_c/encode_decode.c | |
parent | 37663e861b3fe0288d10e67d387fdcf0e43a6d72 (diff) | |
parent | f654d49dd61c096c247b87186e59b611490e66e4 (diff) | |
download | protobuf-e70f9256af79af6092eae4ce22a61b1b6651f37d.tar.gz protobuf-e70f9256af79af6092eae4ce22a61b1b6651f37d.tar.bz2 protobuf-e70f9256af79af6092eae4ce22a61b1b6651f37d.zip |
Merge pull request #1139 from haberman/rubyjsoncamel
Changed Ruby to properly camelCase its JSON by default.
Diffstat (limited to 'ruby/ext/google/protobuf_c/encode_decode.c')
-rw-r--r-- | ruby/ext/google/protobuf_c/encode_decode.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/ruby/ext/google/protobuf_c/encode_decode.c b/ruby/ext/google/protobuf_c/encode_decode.c index 1c48281f..c2c369eb 100644 --- a/ruby/ext/google/protobuf_c/encode_decode.c +++ b/ruby/ext/google/protobuf_c/encode_decode.c @@ -640,6 +640,14 @@ static const upb_pbdecodermethod *msgdef_decodermethod(Descriptor* desc) { return desc->fill_method; } +static const upb_json_parsermethod *msgdef_jsonparsermethod(Descriptor* desc) { + if (desc->json_fill_method == NULL) { + desc->json_fill_method = + upb_json_parsermethod_new(desc->msgdef, &desc->json_fill_method); + } + return desc->json_fill_method; +} + // Stack-allocated context during an encode/decode operation. Contains the upb // environment and its stack-based allocator, an initial buffer for allocations @@ -752,13 +760,14 @@ VALUE Message_decode_json(VALUE klass, VALUE data) { TypedData_Get_Struct(msg_rb, MessageHeader, &Message_type, msg); { + const upb_json_parsermethod* method = msgdef_jsonparsermethod(desc); stackenv se; upb_sink sink; upb_json_parser* parser; stackenv_init(&se, "Error occurred during parsing: %s"); upb_sink_reset(&sink, get_fill_handlers(desc), msg); - parser = upb_json_parser_create(&se.env, &sink); + parser = upb_json_parser_create(&se.env, method, &sink); upb_bufsrc_putbuf(RSTRING_PTR(data), RSTRING_LEN(data), upb_json_parser_input(parser)); @@ -1041,6 +1050,7 @@ static void putmsg(VALUE msg_rb, const Descriptor* desc, !upb_msg_field_done(&i); upb_msg_field_next(&i)) { upb_fielddef *f = upb_msg_iter_field(&i); + bool is_matching_oneof = false; uint32_t offset = desc->layout->fields[upb_fielddef_index(f)].offset + sizeof(MessageHeader); @@ -1057,6 +1067,7 @@ static void putmsg(VALUE msg_rb, const Descriptor* desc, } // Otherwise, fall through to the appropriate singular-field handler // below. + is_matching_oneof = true; } if (is_map_field(f)) { @@ -1071,7 +1082,7 @@ static void putmsg(VALUE msg_rb, const Descriptor* desc, } } else if (upb_fielddef_isstring(f)) { VALUE str = DEREF(msg, offset, VALUE); - if (RSTRING_LEN(str) > 0) { + if (is_matching_oneof || RSTRING_LEN(str) > 0) { putstr(str, f, sink); } } else if (upb_fielddef_issubmsg(f)) { @@ -1082,7 +1093,7 @@ static void putmsg(VALUE msg_rb, const Descriptor* desc, #define T(upbtypeconst, upbtype, ctype, default_value) \ case upbtypeconst: { \ ctype value = DEREF(msg, offset, ctype); \ - if (value != default_value) { \ + if (is_matching_oneof || value != default_value) { \ upb_sink_put##upbtype(sink, sel, value); \ } \ } \ @@ -1189,7 +1200,7 @@ VALUE Message_encode_json(VALUE klass, VALUE msg_rb) { putmsg(msg_rb, desc, upb_json_printer_input(printer), 0); - ret = rb_str_new(sink.ptr, sink.len); + ret = rb_enc_str_new(sink.ptr, sink.len, rb_utf8_encoding()); stackenv_uninit(&se); stringsink_uninit(&sink); |