@@ -11,8 +11,7 @@ static int single_property_name_default_len = sizeof("_properties");
1111static char * unknown_property_name_default = "_unknown" ;
1212static int unknown_property_name_default_len = sizeof ("_unknown" );
1313
14- static const char * php_protocolbuffers_decode_message (INTERNAL_FUNCTION_PARAMETERS , const char * data , const char * data_end , php_protocolbuffers_scheme_container * container , zval * * result );
15-
14+ const char * php_protocolbuffers_decode_message (INTERNAL_FUNCTION_PARAMETERS , const char * data , const char * data_end , php_protocolbuffers_scheme_container * container , int native_scalars , zval * * result );
1615
1716int php_protocolbuffers_read_protected_property (zval * instance , char * name , size_t name_len , zval * * result TSRMLS_DC )
1817{
@@ -256,76 +255,107 @@ void php_protocolbuffers_process_unknown_field_bytes(INTERNAL_FUNCTION_PARAMETER
256255 }
257256}
258257
259- void php_protocolbuffers_format_string (zval * result , pbf * payload TSRMLS_DC )
258+ void php_protocolbuffers_format_string (zval * result , pbf * payload , int native_scalars TSRMLS_DC )
260259{
261260 char __buffer [64 ] = {0 };
262261 char * buffer = __buffer ;
263262 int free = 0 ;
264263 size_t size = 0 ;
265264
266- switch (payload -> type ) {
267- case TYPE_SINT32 :
268- case TYPE_INT32 :
269- size = snprintf (buffer , sizeof (__buffer ), "%d" , payload -> value .int32 );
270- break ;
271- case TYPE_UINT32 :
272- size = snprintf (buffer , sizeof (__buffer ), "%u" , payload -> value .uint32 );
273- break ;
274- case TYPE_UINT64 :
275- size = snprintf (buffer , sizeof (__buffer ), "%llu" , payload -> value .uint64 );
276- break ;
277- case TYPE_SINT64 :
278- case TYPE_INT64 :
279- size = snprintf (buffer , sizeof (__buffer ), "%lld" , payload -> value .int64 );
280- break ;
281- case TYPE_FLOAT :{
282- char * p = 0 ;
283- free = 1 ;
284-
285- /* Note: this is safe */
286- buffer = emalloc (MAX_LENGTH_OF_DOUBLE + EG (precision ) + 1 );
287- size = zend_sprintf (buffer , "%f" , payload -> value .f );
288-
289- // remove trailing zeros
290- p = strchr (buffer ,'.' );
291- if (p != NULL ) {
292- while (* ++ p );
293-
294- while ('0' == * -- p ){
295- * p = '\0' ;
296- size -- ;
297- }
265+ if (native_scalars == 1 ) {
266+ switch (payload -> type ) {
267+ case TYPE_SINT32 :
268+ case TYPE_INT32 :
269+ ZVAL_LONG (result , payload -> value .int32 );
270+ break ;
271+ case TYPE_UINT32 :
272+ ZVAL_LONG (result , payload -> value .uint32 );
273+ break ;
274+ case TYPE_UINT64 :
275+ ZVAL_LONG (result , payload -> value .uint64 );
276+ break ;
277+ case TYPE_SINT64 :
278+ case TYPE_INT64 :
279+ ZVAL_LONG (result , payload -> value .int64 );
280+ break ;
281+ break ;
282+ case TYPE_FLOAT :
283+ ZVAL_DOUBLE (result , payload -> value .f );
284+ break ;
285+ case TYPE_DOUBLE :
286+ ZVAL_DOUBLE (result , payload -> value .d );
287+ break ;
288+ break ;
289+ default :
290+ zend_throw_exception_ex (spl_ce_InvalidArgumentException , 0 TSRMLS_CC , "the type %d does not support. maybe this is bug" , payload -> type );
291+ return ;
292+ break ;
293+ }
294+ } else {
295+ switch (payload -> type ) {
296+ case TYPE_SINT32 :
297+ case TYPE_INT32 :
298+ size = snprintf (buffer , sizeof (__buffer ), "%d" , payload -> value .int32 );
299+ break ;
300+ case TYPE_UINT32 :
301+ size = snprintf (buffer , sizeof (__buffer ), "%u" , payload -> value .uint32 );
302+ break ;
303+ case TYPE_UINT64 :
304+ size = snprintf (buffer , sizeof (__buffer ), "%llu" , payload -> value .uint64 );
305+ break ;
306+ case TYPE_SINT64 :
307+ case TYPE_INT64 :
308+ size = snprintf (buffer , sizeof (__buffer ), "%lld" , payload -> value .int64 );
309+ break ;
310+ case TYPE_FLOAT :{
311+ char * p = 0 ;
312+ free = 1 ;
313+
314+ /* Note: this is safe */
315+ buffer = emalloc (MAX_LENGTH_OF_DOUBLE + EG (precision ) + 1 );
316+ size = zend_sprintf (buffer , "%f" , payload -> value .f );
317+
318+ // remove trailing zeros
319+ p = strchr (buffer ,'.' );
320+ if (p != NULL ) {
321+ while (* ++ p );
322+
323+ while ('0' == * -- p ){
324+ * p = '\0' ;
325+ size -- ;
326+ }
298327
299- if (* p == '.' ){
300- * p = '\0' ;
301- size -- ;
328+ if (* p == '.' ){
329+ * p = '\0' ;
330+ size -- ;
331+ }
332+ break ;
302333 }
303- break ;
334+ }
335+ break ;
336+ case TYPE_DOUBLE :{
337+ free = 1 ;
338+ /* Note: this is safe */
339+ buffer = emalloc (MAX_LENGTH_OF_DOUBLE + EG (precision ) + 1 );
340+ size = zend_sprintf (buffer , "%.*G" , (int )EG (precision ), payload -> value .d );
304341 }
342+ break ;
343+ default :
344+ zend_throw_exception_ex (spl_ce_InvalidArgumentException , 0 TSRMLS_CC , "the type %d does not support. maybe this is bug" , payload -> type );
345+ return ;
346+ break ;
305347 }
306- break ;
307- case TYPE_DOUBLE :{
308- free = 1 ;
309- /* Note: this is safe */
310- buffer = emalloc (MAX_LENGTH_OF_DOUBLE + EG (precision ) + 1 );
311- size = zend_sprintf (buffer , "%.*G" , (int )EG (precision ), payload -> value .d );
312- }
313- break ;
314- default :
315- zend_throw_exception_ex (spl_ce_InvalidArgumentException , 0 TSRMLS_CC , "the type %d does not support. maybe this is bug" , payload -> type );
316- return ;
317- break ;
318- }
319348
320- if (buffer != NULL ) {
321- ZVAL_STRINGL (result , buffer , size , 1 );
322- }
323- if (free ) {
324- efree (buffer );
349+ if (buffer != NULL ) {
350+ ZVAL_STRINGL (result , buffer , size , 1 );
351+ }
352+ if (free ) {
353+ efree (buffer );
354+ }
325355 }
326356}
327357
328- const char * php_protocolbuffers_decode_message (INTERNAL_FUNCTION_PARAMETERS , const char * data , const char * data_end , php_protocolbuffers_scheme_container * container , zval * * result )
358+ const char * php_protocolbuffers_decode_message (INTERNAL_FUNCTION_PARAMETERS , const char * data , const char * data_end , php_protocolbuffers_scheme_container * container , int native_scalars , zval * * result )
329359{
330360 uint32_t payload = 0 , tag = 0 , wiretype = 0 ;
331361 uint64_t value = 0 ;
@@ -380,14 +410,14 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
380410 case WIRETYPE_VARINT :
381411 {
382412 data = ReadVarint64FromArray (data , & value , data_end );
383- if (!php_protocolbuffers_process_varint (INTERNAL_FUNCTION_PARAM_PASSTHRU , wiretype , tag , container , s , value , hresult )) {
413+ if (!php_protocolbuffers_process_varint (INTERNAL_FUNCTION_PARAM_PASSTHRU , wiretype , tag , container , s , value , hresult , native_scalars )) {
384414 return NULL ;
385415 }
386416 }
387417 break ;
388418 case WIRETYPE_FIXED64 :
389- if (!php_protocolbuffers_process_fixed64 (INTERNAL_FUNCTION_PARAM_PASSTHRU , wiretype , tag , container , s , data , hresult )) {
390- return NULL ;
419+ if (!php_protocolbuffers_process_fixed64 (INTERNAL_FUNCTION_PARAM_PASSTHRU , wiretype , tag , container , s , data , hresult , native_scalars )) {
420+ return NULL ;
391421 }
392422 data += 8 ;
393423 break ;
@@ -461,7 +491,7 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
461491 }
462492 }
463493
464- php_protocolbuffers_decode_message (INTERNAL_FUNCTION_PARAM_PASSTHRU , data , n_buffer_end , c_container , & z_obj );
494+ php_protocolbuffers_decode_message (INTERNAL_FUNCTION_PARAM_PASSTHRU , data , n_buffer_end , c_container , PBG ( native_scalars ), & z_obj );
465495
466496 if (c_container -> use_wakeup_and_sleep > 0 ) {
467497 php_protocolbuffers_execute_wakeup (z_obj , c_container TSRMLS_CC );
@@ -510,7 +540,7 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
510540 MAKE_STD_ZVAL (dz );
511541
512542 __payload .type = TYPE_DOUBLE ;__payload .value .d = d ;
513- php_protocolbuffers_format_string (dz , & __payload TSRMLS_CC );
543+ php_protocolbuffers_format_string (dz , & __payload , native_scalars TSRMLS_CC );
514544 php_protocolbuffers_decode_add_value_and_consider_repeated (container , s , hresult , dz TSRMLS_CC );
515545
516546 data += 8 ;
@@ -527,7 +557,7 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
527557 MAKE_STD_ZVAL (dz );
528558
529559 __payload .type = TYPE_DOUBLE ;__payload .value .d = a ;
530- php_protocolbuffers_format_string (dz , & __payload TSRMLS_CC );
560+ php_protocolbuffers_format_string (dz , & __payload , native_scalars TSRMLS_CC );
531561
532562 php_protocolbuffers_decode_add_value_and_consider_repeated (container , s , hresult , dz TSRMLS_CC );
533563
@@ -542,7 +572,7 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
542572 MAKE_STD_ZVAL (dz );
543573
544574 __payload .type = TYPE_INT64 ;__payload .value .int64 = v2 ;
545- php_protocolbuffers_format_string (dz , & __payload TSRMLS_CC );
575+ php_protocolbuffers_format_string (dz , & __payload , native_scalars TSRMLS_CC );
546576
547577 php_protocolbuffers_decode_add_value_and_consider_repeated (container , s , hresult , dz TSRMLS_CC );
548578 }
@@ -555,7 +585,7 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
555585 MAKE_STD_ZVAL (dz );
556586
557587 __payload .type = TYPE_UINT64 ;__payload .value .uint64 = v2 ;
558- php_protocolbuffers_format_string (dz , & __payload TSRMLS_CC );
588+ php_protocolbuffers_format_string (dz , & __payload , native_scalars TSRMLS_CC );
559589
560590 php_protocolbuffers_decode_add_value_and_consider_repeated (container , s , hresult , dz TSRMLS_CC );
561591 }
@@ -567,7 +597,7 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
567597 MAKE_STD_ZVAL (dz );
568598
569599 __payload .type = TYPE_INT32 ;__payload .value .int32 = (int32_t )payload ;
570- php_protocolbuffers_format_string (dz , & __payload TSRMLS_CC );
600+ php_protocolbuffers_format_string (dz , & __payload , native_scalars TSRMLS_CC );
571601
572602 php_protocolbuffers_decode_add_value_and_consider_repeated (container , s , hresult , dz TSRMLS_CC );
573603 break ;
@@ -578,7 +608,7 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
578608
579609 MAKE_STD_ZVAL (dz );
580610 __payload .type = TYPE_UINT64 ;__payload .value .uint64 = l ;
581- php_protocolbuffers_format_string (dz , & __payload TSRMLS_CC );
611+ php_protocolbuffers_format_string (dz , & __payload , native_scalars TSRMLS_CC );
582612
583613 php_protocolbuffers_decode_add_value_and_consider_repeated (container , s , hresult , dz TSRMLS_CC );
584614 data += 8 ;
@@ -591,7 +621,7 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
591621
592622 MAKE_STD_ZVAL (dz );
593623 __payload .type = TYPE_UINT32 ;__payload .value .uint32 = l ;
594- php_protocolbuffers_format_string (dz , & __payload TSRMLS_CC );
624+ php_protocolbuffers_format_string (dz , & __payload , native_scalars TSRMLS_CC );
595625
596626 php_protocolbuffers_decode_add_value_and_consider_repeated (container , s , hresult , dz TSRMLS_CC );
597627
@@ -611,7 +641,7 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
611641
612642 MAKE_STD_ZVAL (dz );
613643 __payload .type = TYPE_UINT32 ;__payload .value .uint32 = (uint32_t )payload ;
614- php_protocolbuffers_format_string (dz , & __payload TSRMLS_CC );
644+ php_protocolbuffers_format_string (dz , & __payload , native_scalars TSRMLS_CC );
615645
616646 php_protocolbuffers_decode_add_value_and_consider_repeated (container , s , hresult , dz TSRMLS_CC );
617647 break ;
@@ -631,7 +661,7 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
631661 MAKE_STD_ZVAL (dz );
632662
633663 __payload .type = TYPE_INT32 ;__payload .value .int32 = l ;
634- php_protocolbuffers_format_string (dz , & __payload TSRMLS_CC );
664+ php_protocolbuffers_format_string (dz , & __payload , native_scalars TSRMLS_CC );
635665
636666 php_protocolbuffers_decode_add_value_and_consider_repeated (container , s , hresult , dz TSRMLS_CC );
637667 data += 4 ;
@@ -644,7 +674,7 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
644674
645675 MAKE_STD_ZVAL (dz );
646676 __payload .type = TYPE_INT64 ;__payload .value .int64 = l ;
647- php_protocolbuffers_format_string (dz , & __payload TSRMLS_CC );
677+ php_protocolbuffers_format_string (dz , & __payload , native_scalars TSRMLS_CC );
648678
649679 php_protocolbuffers_decode_add_value_and_consider_repeated (container , s , hresult , dz TSRMLS_CC );
650680
@@ -656,7 +686,7 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
656686
657687 MAKE_STD_ZVAL (dz );
658688 __payload .type = TYPE_INT32 ;__payload .value .int32 = (int32_t )zigzag_decode32 (payload );
659- php_protocolbuffers_format_string (dz , & __payload TSRMLS_CC );
689+ php_protocolbuffers_format_string (dz , & __payload , native_scalars TSRMLS_CC );
660690
661691 php_protocolbuffers_decode_add_value_and_consider_repeated (container , s , hresult , dz TSRMLS_CC );
662692 break ;
@@ -668,7 +698,7 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
668698 MAKE_STD_ZVAL (dz );
669699
670700 __payload .type = TYPE_SINT64 ;__payload .value .int64 = (int64_t )zigzag_decode64 (v2 );
671- php_protocolbuffers_format_string (dz , & __payload TSRMLS_CC );
701+ php_protocolbuffers_format_string (dz , & __payload , native_scalars TSRMLS_CC );
672702
673703 php_protocolbuffers_decode_add_value_and_consider_repeated (container , s , hresult , dz TSRMLS_CC );
674704 }
@@ -687,7 +717,7 @@ const char* php_protocolbuffers_decode_message(INTERNAL_FUNCTION_PARAMETERS, con
687717 data += payload ;
688718 break ;
689719 case WIRETYPE_FIXED32 : {
690- if (!php_protocolbuffers_process_fixed32 (INTERNAL_FUNCTION_PARAM_PASSTHRU , wiretype , tag , container , s , data , hresult )) {
720+ if (!php_protocolbuffers_process_fixed32 (INTERNAL_FUNCTION_PARAM_PASSTHRU , wiretype , tag , container , s , data , hresult , native_scalars )) {
691721 return NULL ;
692722 }
693723 data += 4 ;
@@ -827,7 +857,7 @@ int php_protocolbuffers_decode(INTERNAL_FUNCTION_PARAMETERS, const char *data, i
827857 efree (unknown_name );
828858 }
829859
830- res = php_protocolbuffers_decode_message (INTERNAL_FUNCTION_PARAM_PASSTHRU , data , data_end , container , & obj );
860+ res = php_protocolbuffers_decode_message (INTERNAL_FUNCTION_PARAM_PASSTHRU , data , data_end , container , PBG ( native_scalars ), & obj );
831861 if (res == NULL ) {
832862 if (obj != NULL ) {
833863 zval_ptr_dtor (& obj );
0 commit comments