Skip to content

Commit 0f68944

Browse files
committed
Merge branch 'support-native-scalar'
2 parents 7241d3d + 7be328a commit 0f68944

File tree

6 files changed

+126
-93
lines changed

6 files changed

+126
-93
lines changed

core.c

Lines changed: 106 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ static int single_property_name_default_len = sizeof("_properties");
1111
static char *unknown_property_name_default = "_unknown";
1212
static 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

1716
int 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);

core.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ int php_protocolbuffers_get_scheme_container(const char *klass, size_t klass_len
7676

7777
int php_protocolbuffers_get_scheme_container_ex(const char *klass, size_t klass_len, int throws_exception, php_protocolbuffers_scheme_container **result TSRMLS_DC);
7878

79-
void php_protocolbuffers_format_string(zval *result, pbf *payload TSRMLS_DC);
79+
void php_protocolbuffers_format_string(zval *result, pbf *payload, int use_string TSRMLS_DC);
8080

8181
void php_protocolbuffers_execute_wakeup(zval *obj, php_protocolbuffers_scheme_container *container TSRMLS_DC);
8282

0 commit comments

Comments
 (0)