Skip to content

Commit e501104

Browse files
committed
PHPC-1411: Simplify handling of 64-bit values on 32-bit architectures
1 parent a54fbcd commit e501104

File tree

4 files changed

+24
-90
lines changed

4 files changed

+24
-90
lines changed

src/BSON/Int64.c

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,8 @@ static bool php_phongo_int64_init(php_phongo_int64_t* intern, int64_t integer) /
4747
static bool php_phongo_int64_init_from_string(php_phongo_int64_t* intern, const char* s_integer, phongo_zpp_char_len s_integer_len TSRMLS_DC) /* {{{ */
4848
{
4949
int64_t integer;
50-
char* endptr = NULL;
5150

52-
/* bson_ascii_strtoll() sets errno if conversion fails. If conversion
53-
* succeeds, we still want to ensure that the entire string was parsed. */
54-
integer = bson_ascii_strtoll(s_integer, &endptr, 10);
55-
56-
if (errno || (endptr && endptr != ((const char*) s_integer + s_integer_len))) {
51+
if (!php_phongo_parse_int64(&integer, s_integer, s_integer_len)) {
5752
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Error parsing \"%s\" as 64-bit integer for %s initialization", s_integer, ZSTR_VAL(php_phongo_int64_ce->name));
5853
return false;
5954
}
@@ -88,39 +83,31 @@ static bool php_phongo_int64_init_from_hash(php_phongo_int64_t* intern, HashTabl
8883
static PHP_METHOD(Int64, __toString)
8984
{
9085
php_phongo_int64_t* intern;
91-
char s_integer[24];
92-
int s_integer_len;
9386

9487
if (zend_parse_parameters_none() == FAILURE) {
9588
return;
9689
}
9790

9891
intern = Z_INT64_OBJ_P(getThis());
9992

100-
s_integer_len = snprintf(s_integer, sizeof(s_integer), "%" PRId64, intern->integer);
101-
102-
PHONGO_RETVAL_STRINGL(s_integer, s_integer_len);
93+
php_phongo_int64_to_zval(intern->integer, return_value, false TSRMLS_CC);
10394
} /* }}} */
10495

10596
/* {{{ proto array MongoDB\BSON\Int64::jsonSerialize()
10697
*/
10798
static PHP_METHOD(Int64, jsonSerialize)
10899
{
109100
php_phongo_int64_t* intern;
110-
char s_integer[24];
111-
int s_integer_len;
112101

113102
if (zend_parse_parameters_none() == FAILURE) {
114103
return;
115104
}
116105

117106
intern = Z_INT64_OBJ_P(getThis());
118107

119-
s_integer_len = snprintf(s_integer, sizeof(s_integer), "%" PRId64, intern->integer);
120-
121108
array_init_size(return_value, 1);
122109

123-
ADD_ASSOC_STRINGL(return_value, "$numberLong", s_integer, s_integer_len);
110+
ADD_ASSOC_INT64_AS_STRING(return_value, "$numberLong", intern->integer);
124111
} /* }}} */
125112

126113
/* {{{ proto string MongoDB\BSON\Int64::serialize()
@@ -131,24 +118,20 @@ static PHP_METHOD(Int64, serialize)
131118
ZVAL_RETVAL_TYPE retval;
132119
php_serialize_data_t var_hash;
133120
smart_str buf = { 0 };
134-
char s_integer[24];
135-
int s_integer_len;
136121

137122
if (zend_parse_parameters_none() == FAILURE) {
138123
return;
139124
}
140125

141126
intern = Z_INT64_OBJ_P(getThis());
142127

143-
s_integer_len = snprintf(s_integer, sizeof(s_integer), "%" PRId64, intern->integer);
144-
145128
#if PHP_VERSION_ID >= 70000
146129
array_init_size(&retval, 1);
147-
ADD_ASSOC_STRINGL(&retval, "integer", s_integer, s_integer_len);
130+
ADD_ASSOC_INT64_AS_STRING(&retval, "integer", intern->integer);
148131
#else
149132
ALLOC_INIT_ZVAL(retval);
150133
array_init_size(retval, 1);
151-
ADD_ASSOC_STRINGL(retval, "integer", s_integer, s_integer_len);
134+
ADD_ASSOC_INT64_AS_STRING(retval, "integer", intern->integer);
152135
#endif
153136

154137
PHP_VAR_SERIALIZE_INIT(var_hash);
@@ -323,8 +306,6 @@ HashTable* php_phongo_int64_get_properties_hash(zval* object, bool is_debug TSRM
323306
{
324307
php_phongo_int64_t* intern;
325308
HashTable* props;
326-
char s_integer[24];
327-
int s_integer_len;
328309

329310
intern = Z_INT64_OBJ_P(object);
330311

@@ -334,21 +315,19 @@ HashTable* php_phongo_int64_get_properties_hash(zval* object, bool is_debug TSRM
334315
return props;
335316
}
336317

337-
s_integer_len = snprintf(s_integer, sizeof(s_integer), "%" PRId64, intern->integer);
338-
339318
#if PHP_VERSION_ID >= 70000
340319
{
341320
zval value;
342321

343-
ZVAL_STRINGL(&value, s_integer, s_integer_len);
322+
php_phongo_int64_to_zval(intern->integer, &value, false TSRMLS_CC);
344323
zend_hash_str_update(props, "integer", sizeof("integer") - 1, &value);
345324
}
346325
#else
347326
{
348327
zval* value;
349328

350329
MAKE_STD_ZVAL(value);
351-
ZVAL_STRINGL(value, s_integer, s_integer_len, 1);
330+
php_phongo_int64_to_zval(intern->integer, value, false TSRMLS_CC);
352331
zend_hash_update(props, "integer", sizeof("integer"), &value, sizeof(value), NULL);
353332
}
354333
#endif

src/BSON/Timestamp.c

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,21 +58,13 @@ static bool php_phongo_timestamp_init(php_phongo_timestamp_t* intern, int64_t in
5858
static bool php_phongo_timestamp_init_from_string(php_phongo_timestamp_t* intern, const char* s_increment, phongo_zpp_char_len s_increment_len, const char* s_timestamp, phongo_zpp_char_len s_timestamp_len TSRMLS_DC) /* {{{ */
5959
{
6060
int64_t increment, timestamp;
61-
char* endptr = NULL;
6261

63-
/* bson_ascii_strtoll() sets errno if conversion fails. If conversion
64-
* succeeds, we still want to ensure that the entire string was parsed. */
65-
66-
increment = bson_ascii_strtoll(s_increment, &endptr, 10);
67-
68-
if (errno || (endptr && endptr != ((const char*) s_increment + s_increment_len))) {
62+
if (!php_phongo_parse_int64(&increment, s_increment, s_increment_len)) {
6963
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Error parsing \"%s\" as 64-bit integer increment for %s initialization", s_increment, ZSTR_VAL(php_phongo_timestamp_ce->name));
7064
return false;
7165
}
7266

73-
timestamp = bson_ascii_strtoll(s_timestamp, &endptr, 10);
74-
75-
if (errno || (endptr && endptr != ((const char*) s_timestamp + s_timestamp_len))) {
67+
if (!php_phongo_parse_int64(&timestamp, s_timestamp, s_timestamp_len)) {
7668
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Error parsing \"%s\" as 64-bit integer timestamp for %s initialization", s_timestamp, ZSTR_VAL(php_phongo_timestamp_ce->name));
7769
return false;
7870
}

src/BSON/UTCDateTime.c

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,8 @@ static bool php_phongo_utcdatetime_init(php_phongo_utcdatetime_t* intern, int64_
5252
static bool php_phongo_utcdatetime_init_from_string(php_phongo_utcdatetime_t* intern, const char* s_milliseconds, phongo_zpp_char_len s_milliseconds_len TSRMLS_DC) /* {{{ */
5353
{
5454
int64_t milliseconds;
55-
char* endptr = NULL;
5655

57-
/* bson_ascii_strtoll() sets errno if conversion fails. If conversion
58-
* succeeds, we still want to ensure that the entire string was parsed. */
59-
60-
milliseconds = bson_ascii_strtoll(s_milliseconds, &endptr, 10);
61-
62-
if (errno || (endptr && endptr != ((const char*) s_milliseconds + s_milliseconds_len))) {
56+
if (!php_phongo_parse_int64(&milliseconds, s_milliseconds, s_milliseconds_len)) {
6357
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Error parsing \"%s\" as 64-bit integer for %s initialization", s_milliseconds, ZSTR_VAL(php_phongo_utcdatetime_ce->name));
6458
return false;
6559
}
@@ -217,18 +211,14 @@ static PHP_METHOD(UTCDateTime, __set_state)
217211
static PHP_METHOD(UTCDateTime, __toString)
218212
{
219213
php_phongo_utcdatetime_t* intern;
220-
char s_milliseconds[24];
221-
int s_milliseconds_len;
222214

223215
intern = Z_UTCDATETIME_OBJ_P(getThis());
224216

225217
if (zend_parse_parameters_none() == FAILURE) {
226218
return;
227219
}
228220

229-
s_milliseconds_len = snprintf(s_milliseconds, sizeof(s_milliseconds), "%" PRId64, intern->milliseconds);
230-
231-
PHONGO_RETVAL_STRINGL(s_milliseconds, s_milliseconds_len);
221+
php_phongo_int64_to_zval(intern->milliseconds, return_value, false TSRMLS_CC);
232222
} /* }}} */
233223

234224
/* {{{ proto DateTime MongoDB\BSON\UTCDateTime::toDateTime()
@@ -266,25 +256,21 @@ static PHP_METHOD(UTCDateTime, toDateTime)
266256
static PHP_METHOD(UTCDateTime, jsonSerialize)
267257
{
268258
php_phongo_utcdatetime_t* intern;
269-
char s_milliseconds[24];
270-
int s_milliseconds_len;
271259

272260
if (zend_parse_parameters_none() == FAILURE) {
273261
return;
274262
}
275263

276264
intern = Z_UTCDATETIME_OBJ_P(getThis());
277265

278-
s_milliseconds_len = snprintf(s_milliseconds, sizeof(s_milliseconds), "%" PRId64, intern->milliseconds);
279-
280266
array_init_size(return_value, 1);
281267

282268
#if PHP_VERSION_ID >= 70000
283269
{
284270
zval udt;
285271

286272
array_init_size(&udt, 1);
287-
ADD_ASSOC_STRINGL(&udt, "$numberLong", s_milliseconds, s_milliseconds_len);
273+
ADD_ASSOC_INT64_AS_STRING(&udt, "$numberLong", intern->milliseconds);
288274
ADD_ASSOC_ZVAL_EX(return_value, "$date", &udt);
289275
}
290276
#else
@@ -293,7 +279,7 @@ static PHP_METHOD(UTCDateTime, jsonSerialize)
293279

294280
MAKE_STD_ZVAL(udt);
295281
array_init_size(udt, 1);
296-
ADD_ASSOC_STRINGL(udt, "$numberLong", s_milliseconds, s_milliseconds_len);
282+
ADD_ASSOC_INT64_AS_STRING(udt, "$numberLong", intern->milliseconds);
297283
ADD_ASSOC_ZVAL_EX(return_value, "$date", udt);
298284
}
299285
#endif
@@ -307,24 +293,20 @@ static PHP_METHOD(UTCDateTime, serialize)
307293
ZVAL_RETVAL_TYPE retval;
308294
php_serialize_data_t var_hash;
309295
smart_str buf = { 0 };
310-
char s_milliseconds[24];
311-
int s_milliseconds_len;
312296

313297
intern = Z_UTCDATETIME_OBJ_P(getThis());
314298

315299
if (zend_parse_parameters_none() == FAILURE) {
316300
return;
317301
}
318302

319-
s_milliseconds_len = snprintf(s_milliseconds, sizeof(s_milliseconds), "%" PRId64, intern->milliseconds);
320-
321303
#if PHP_VERSION_ID >= 70000
322-
array_init_size(&retval, 2);
323-
ADD_ASSOC_STRINGL(&retval, "milliseconds", s_milliseconds, s_milliseconds_len);
304+
array_init_size(&retval, 1);
305+
ADD_ASSOC_INT64_AS_STRING(&retval, "milliseconds", intern->milliseconds);
324306
#else
325307
ALLOC_INIT_ZVAL(retval);
326-
array_init_size(retval, 2);
327-
ADD_ASSOC_STRINGL(retval, "milliseconds", s_milliseconds, s_milliseconds_len);
308+
array_init_size(retval, 1);
309+
ADD_ASSOC_INT64_AS_STRING(retval, "milliseconds", intern->milliseconds);
328310
#endif
329311

330312
PHP_VAR_SERIALIZE_INIT(var_hash);
@@ -509,32 +491,28 @@ static HashTable* php_phongo_utcdatetime_get_properties_hash(zval* object, bool
509491
{
510492
php_phongo_utcdatetime_t* intern;
511493
HashTable* props;
512-
char s_milliseconds[24];
513-
int s_milliseconds_len;
514494

515495
intern = Z_UTCDATETIME_OBJ_P(object);
516496

517-
PHONGO_GET_PROPERTY_HASH_INIT_PROPS(is_debug, intern, props, 2);
497+
PHONGO_GET_PROPERTY_HASH_INIT_PROPS(is_debug, intern, props, 1);
518498

519499
if (!intern->initialized) {
520500
return props;
521501
}
522502

523-
s_milliseconds_len = snprintf(s_milliseconds, sizeof(s_milliseconds), "%" PRId64, intern->milliseconds);
524-
525503
#if PHP_VERSION_ID >= 70000
526504
{
527505
zval milliseconds;
528506

529-
ZVAL_STRINGL(&milliseconds, s_milliseconds, s_milliseconds_len);
507+
php_phongo_int64_to_zval(intern->milliseconds, &milliseconds, false TSRMLS_CC);
530508
zend_hash_str_update(props, "milliseconds", sizeof("milliseconds") - 1, &milliseconds);
531509
}
532510
#else
533511
{
534512
zval* milliseconds;
535513

536514
MAKE_STD_ZVAL(milliseconds);
537-
ZVAL_STRINGL(milliseconds, s_milliseconds, s_milliseconds_len, 1);
515+
php_phongo_int64_to_zval(intern->milliseconds, milliseconds, false TSRMLS_CC);
538516
zend_hash_update(props, "milliseconds", sizeof("milliseconds"), &milliseconds, sizeof(milliseconds), NULL);
539517
}
540518
#endif

src/MongoDB/CursorId.c

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,8 @@ zend_class_entry* php_phongo_cursorid_ce;
3737
static bool php_phongo_cursorid_init_from_string(php_phongo_cursorid_t* intern, const char* s_id, phongo_zpp_char_len s_id_len TSRMLS_DC) /* {{{ */
3838
{
3939
int64_t id;
40-
char* endptr = NULL;
4140

42-
/* bson_ascii_strtoll() sets errno if conversion fails. If conversion
43-
* succeeds, we still want to ensure that the entire string was parsed. */
44-
id = bson_ascii_strtoll(s_id, &endptr, 10);
45-
46-
if (errno || (endptr && endptr != ((const char*) s_id + s_id_len))) {
41+
if (!php_phongo_parse_int64(&id, s_id, s_id_len)) {
4742
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Error parsing \"%s\" as 64-bit id for %s initialization", s_id, ZSTR_VAL(php_phongo_cursorid_ce->name));
4843
return false;
4944
}
@@ -101,24 +96,20 @@ static PHP_METHOD(CursorId, serialize)
10196
ZVAL_RETVAL_TYPE retval;
10297
php_serialize_data_t var_hash;
10398
smart_str buf = { 0 };
104-
char s_id[24];
105-
int s_id_len;
10699

107100
if (zend_parse_parameters_none() == FAILURE) {
108101
return;
109102
}
110103

111104
intern = Z_CURSORID_OBJ_P(getThis());
112105

113-
s_id_len = snprintf(s_id, sizeof(s_id), "%" PRId64, intern->id);
114-
115106
#if PHP_VERSION_ID >= 70000
116107
array_init_size(&retval, 1);
117-
ADD_ASSOC_STRINGL(&retval, "id", s_id, s_id_len);
108+
ADD_ASSOC_INT64_AS_STRING(&retval, "id", intern->id);
118109
#else
119110
ALLOC_INIT_ZVAL(retval);
120111
array_init_size(retval, 1);
121-
ADD_ASSOC_STRINGL(retval, "id", s_id, s_id_len);
112+
ADD_ASSOC_INT64_AS_STRING(retval, "id", intern->id);
122113
#endif
123114

124115
PHP_VAR_SERIALIZE_INIT(var_hash);
@@ -247,13 +238,7 @@ static HashTable* php_phongo_cursorid_get_debug_info(zval* object, int* is_temp
247238
array_init(&retval);
248239

249240
#if SIZEOF_LONG == 4
250-
{
251-
char tmp[24];
252-
int tmp_len;
253-
254-
tmp_len = snprintf(tmp, sizeof(tmp), "%" PRId64, intern->id);
255-
ADD_ASSOC_STRINGL(&retval, "id", tmp, tmp_len);
256-
}
241+
ADD_ASSOC_INT64_AS_STRING(&retval, "id", intern->id);
257242
#else
258243
ADD_ASSOC_LONG_EX(&retval, "id", intern->id);
259244
#endif

0 commit comments

Comments
 (0)