diff options
author | Paul Yang <TeBoring@users.noreply.github.com> | 2017-08-25 08:49:34 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-25 08:49:34 -0700 |
commit | c7457ef65a7a8584b1e3bd396c401ccf8e275ffa (patch) | |
tree | a142f1ed092807b1bd38683f57e37bcf852f665a /php/ext/google/protobuf/encode_decode.c | |
parent | 98a3734b5aa680f565af10a5fd4430baa4b4aa10 (diff) | |
download | protobuf-c7457ef65a7a8584b1e3bd396c401ccf8e275ffa.tar.gz protobuf-c7457ef65a7a8584b1e3bd396c401ccf8e275ffa.tar.bz2 protobuf-c7457ef65a7a8584b1e3bd396c401ccf8e275ffa.zip |
Add any support in php runtime. (#3486)
* Add any support in php runtime.
* Remove unused file in config.m4
* Fix comments
* Fix error for tsrmls build
* Add newly added file to Makefile.am
Diffstat (limited to 'php/ext/google/protobuf/encode_decode.c')
-rw-r--r-- | php/ext/google/protobuf/encode_decode.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/php/ext/google/protobuf/encode_decode.c b/php/ext/google/protobuf/encode_decode.c index 89e75d6a..93a5e9c4 100644 --- a/php/ext/google/protobuf/encode_decode.c +++ b/php/ext/google/protobuf/encode_decode.c @@ -1445,9 +1445,9 @@ static const upb_handlers* msgdef_json_serialize_handlers( // PHP encode/decode methods // ----------------------------------------------------------------------------- -PHP_METHOD(Message, serializeToString) { +void serialize_to_string(zval* val, zval* return_value TSRMLS_DC) { Descriptor* desc = - UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(Z_OBJCE_P(getThis()))); + UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(Z_OBJCE_P(val))); stringsink sink; stringsink_init(&sink); @@ -1461,7 +1461,7 @@ PHP_METHOD(Message, serializeToString) { stackenv_init(&se, "Error occurred during encoding: %s"); encoder = upb_pb_encoder_create(&se.env, serialize_handlers, &sink.sink); - putmsg(getThis(), desc, upb_pb_encoder_input(encoder), 0 TSRMLS_CC); + putmsg(val, desc, upb_pb_encoder_input(encoder), 0 TSRMLS_CC); PHP_PROTO_RETVAL_STRINGL(sink.ptr, sink.len, 1); @@ -1470,6 +1470,26 @@ PHP_METHOD(Message, serializeToString) { } } +PHP_METHOD(Message, serializeToString) { + serialize_to_string(getThis(), return_value TSRMLS_CC); +} + +void merge_from_string(const char* data, int data_len, const Descriptor* desc, + MessageHeader* msg) { + const upb_pbdecodermethod* method = msgdef_decodermethod(desc); + const upb_handlers* h = upb_pbdecodermethod_desthandlers(method); + stackenv se; + upb_sink sink; + upb_pbdecoder* decoder; + stackenv_init(&se, "Error occurred during parsing: %s"); + + upb_sink_reset(&sink, h, msg); + decoder = upb_pbdecoder_create(&se.env, method, &sink); + upb_bufsrc_putbuf(data, data_len, upb_pbdecoder_input(decoder)); + + stackenv_uninit(&se); +} + PHP_METHOD(Message, mergeFromString) { Descriptor* desc = UNBOX_HASHTABLE_VALUE(Descriptor, get_ce_obj(Z_OBJCE_P(getThis()))); @@ -1483,20 +1503,7 @@ PHP_METHOD(Message, mergeFromString) { return; } - { - const upb_pbdecodermethod* method = msgdef_decodermethod(desc); - const upb_handlers* h = upb_pbdecodermethod_desthandlers(method); - stackenv se; - upb_sink sink; - upb_pbdecoder* decoder; - stackenv_init(&se, "Error occurred during parsing: %s"); - - upb_sink_reset(&sink, h, msg); - decoder = upb_pbdecoder_create(&se.env, method, &sink); - upb_bufsrc_putbuf(data, data_len, upb_pbdecoder_input(decoder)); - - stackenv_uninit(&se); - } + merge_from_string(data, data_len, desc, msg); } PHP_METHOD(Message, serializeToJsonString) { |