Skip to content

Commit caa49d6

Browse files
committed
Merge pull request #858
2 parents 72cf685 + 0f07beb commit caa49d6

31 files changed

+1008
-73
lines changed

config.m4

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ if test "$PHP_MONGODB" != "no"; then
110110
src/BSON/DBPointer.c \
111111
src/BSON/Decimal128.c \
112112
src/BSON/Decimal128Interface.c \
113+
src/BSON/Int64.c \
113114
src/BSON/Javascript.c \
114115
src/BSON/JavascriptInterface.c \
115116
src/BSON/MaxKey.c \

config.w32

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ if (PHP_MONGODB != "no") {
8888

8989
EXTENSION("mongodb", "php_phongo.c phongo_compat.c", null, PHP_MONGODB_CFLAGS);
9090
ADD_SOURCES(configure_module_dirname + "/src", "bson.c bson-encode.c", "mongodb");
91-
ADD_SOURCES(configure_module_dirname + "/src/BSON", "Binary.c BinaryInterface.c DBPointer.c Decimal128.c Decimal128Interface.c Javascript.c JavascriptInterface.c MaxKey.c MaxKeyInterface.c MinKey.c MinKeyInterface.c ObjectId.c ObjectIdInterface.c Persistable.c Regex.c RegexInterface.c Serializable.c Symbol.c Timestamp.c TimestampInterface.c Type.c Undefined.c Unserializable.c UTCDateTime.c UTCDateTimeInterface.c functions.c", "mongodb");
91+
ADD_SOURCES(configure_module_dirname + "/src/BSON", "Binary.c BinaryInterface.c DBPointer.c Decimal128.c Decimal128Interface.c Int64.c Javascript.c JavascriptInterface.c MaxKey.c MaxKeyInterface.c MinKey.c MinKeyInterface.c ObjectId.c ObjectIdInterface.c Persistable.c Regex.c RegexInterface.c Serializable.c Symbol.c Timestamp.c TimestampInterface.c Type.c Undefined.c Unserializable.c UTCDateTime.c UTCDateTimeInterface.c functions.c", "mongodb");
9292
ADD_SOURCES(configure_module_dirname + "/src/MongoDB", "BulkWrite.c Command.c Cursor.c CursorId.c Manager.c Query.c ReadConcern.c ReadPreference.c Server.c Session.c WriteConcern.c WriteConcernError.c WriteError.c WriteResult.c", "mongodb");
9393
ADD_SOURCES(configure_module_dirname + "/src/MongoDB/Exception", "AuthenticationException.c BulkWriteException.c CommandException.c ConnectionException.c ConnectionTimeoutException.c Exception.c ExecutionTimeoutException.c InvalidArgumentException.c LogicException.c RuntimeException.c ServerException.c SSLConnectionException.c UnexpectedValueException.c WriteException.c", "mongodb");
9494
ADD_SOURCES(configure_module_dirname + "/src/MongoDB/Monitoring", "CommandFailedEvent.c CommandStartedEvent.c CommandSubscriber.c CommandSucceededEvent.c Subscriber.c functions.c", "mongodb");

phongo_compat.h

Lines changed: 59 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -159,31 +159,70 @@
159159
#endif
160160

161161
#if SIZEOF_PHONGO_LONG == 8
162-
#define ADD_INDEX_INT64(zval, index, value) add_index_long(zval, index, value)
163-
#define ADD_NEXT_INDEX_INT64(zval, value) add_next_index_long(zval, value)
164-
#define ADD_ASSOC_INT64(zval, key, value) add_assoc_long(zval, key, value)
162+
#define ADD_INDEX_INT64(_zv, _index, _value) add_index_long((_zv), (_index), (_value))
163+
#define ADD_NEXT_INDEX_INT64(_zv, _value) add_next_index_long((_zv), (_value))
164+
#define ADD_ASSOC_INT64(_zv, _key, _value) add_assoc_long((_zv), (_key), (_value))
165165
#elif SIZEOF_PHONGO_LONG == 4
166-
#define ADD_INDEX_INT64(zval, index, value) \
167-
if ((value) > INT32_MAX || (value) < INT32_MIN) { \
168-
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Integer overflow detected on your platform: %lld", (value)); \
169-
} else { \
170-
add_index_long(zval, index, (value)); \
166+
#if PHP_VERSION_ID >= 70000
167+
#define ADD_INDEX_INT64(_zv, _index, _value) \
168+
if ((_value) > INT32_MAX || (_value) < INT32_MIN) { \
169+
zval zchild; \
170+
php_phongo_new_int64(&zchild, (_value) TSRMLS_CC); \
171+
add_index_zval((_zv), (_index), &zchild); \
172+
} else { \
173+
add_index_long((_zv), (_index), (_value)); \
171174
}
172-
#define ADD_NEXT_INDEX_INT64(zval, value) \
173-
if ((value) > INT32_MAX || (value) < INT32_MIN) { \
174-
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Integer overflow detected on your platform: %lld", (value)); \
175-
} else { \
176-
add_next_index_long(zval, (value)); \
175+
#define ADD_NEXT_INDEX_INT64(_zv, _value) \
176+
if ((_value) > INT32_MAX || (_value) < INT32_MIN) { \
177+
zval zchild; \
178+
php_phongo_new_int64(&zchild, (_value) TSRMLS_CC); \
179+
add_next_index_zval((_zv), &zchild); \
180+
} else { \
181+
add_next_index_long((_zv), (_value)); \
177182
}
178-
#define ADD_ASSOC_INT64(zval, key, value) \
179-
if ((value) > INT32_MAX || (value) < INT32_MIN) { \
180-
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Integer overflow detected on your platform: %lld", (value)); \
181-
} else { \
182-
add_assoc_long(zval, key, (value)); \
183+
#define ADD_ASSOC_INT64(_zv, _key, _value) \
184+
if ((_value) > INT32_MAX || (_value) < INT32_MIN) { \
185+
zval zchild; \
186+
php_phongo_new_int64(&zchild, (_value) TSRMLS_CC); \
187+
add_assoc_zval((_zv), (_key), &zchild); \
188+
} else { \
189+
add_assoc_long((_zv), (_key), (_value)); \
183190
}
184-
#else
191+
#else /* PHP_VERSION_ID < 70000 */
192+
#define ADD_INDEX_INT64(_zv, _index, _value) \
193+
if ((_value) > INT32_MAX || (_value) < INT32_MIN) { \
194+
zval* zchild = NULL; \
195+
TSRMLS_FETCH(); \
196+
MAKE_STD_ZVAL(zchild); \
197+
php_phongo_new_int64(zchild, (_value) TSRMLS_CC); \
198+
add_index_zval((_zv), (_index), zchild); \
199+
} else { \
200+
add_index_long((_zv), (_index), (_value)); \
201+
}
202+
#define ADD_NEXT_INDEX_INT64(_zv, _value) \
203+
if ((_value) > INT32_MAX || (_value) < INT32_MIN) { \
204+
zval* zchild = NULL; \
205+
TSRMLS_FETCH(); \
206+
MAKE_STD_ZVAL(zchild); \
207+
php_phongo_new_int64(zchild, (_value) TSRMLS_CC); \
208+
add_next_index_zval((_zv), zchild); \
209+
} else { \
210+
add_next_index_long((_zv), (_value)); \
211+
}
212+
#define ADD_ASSOC_INT64(_zv, _key, _value) \
213+
if ((_value) > INT32_MAX || (_value) < INT32_MIN) { \
214+
zval* zchild = NULL; \
215+
TSRMLS_FETCH(); \
216+
MAKE_STD_ZVAL(zchild); \
217+
php_phongo_new_int64(zchild, (_value) TSRMLS_CC); \
218+
add_assoc_zval((_zv), (_key), zchild); \
219+
} else { \
220+
add_assoc_long((_zv), (_key), (_value)); \
221+
}
222+
#endif /* PHP_VERSION_ID */
223+
#else /* SIZEOF_PHONGO_LONG != 8 && SIZEOF_PHONGO_LONG != 4 */
185224
#error Unsupported architecture (integers are neither 32-bit nor 64-bit)
186-
#endif
225+
#endif /* SIZEOF_PHONGO_LONG */
187226

188227
void phongo_add_exception_prop(const char* prop, int prop_len, zval* value TSRMLS_DC);
189228
zend_bool php_phongo_zend_hash_apply_protection_begin(HashTable* ht);

php_phongo.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2528,6 +2528,17 @@ void php_phongo_new_decimal128(zval* object, const bson_decimal128_t* decimal TS
25282528
intern->initialized = true;
25292529
} /* }}} */
25302530

2531+
void php_phongo_new_int64(zval* object, int64_t integer TSRMLS_DC) /* {{{ */
2532+
{
2533+
php_phongo_int64_t* intern;
2534+
2535+
object_init_ex(object, php_phongo_int64_ce);
2536+
2537+
intern = Z_INT64_OBJ_P(object);
2538+
intern->integer = integer;
2539+
intern->initialized = true;
2540+
} /* }}} */
2541+
25312542
/* qsort() compare callback for alphabetizing regex flags upon initialization */
25322543
static int php_phongo_regex_compare_flags(const void* f1, const void* f2)
25332544
{
@@ -2835,6 +2846,7 @@ PHP_MINIT_FUNCTION(mongodb)
28352846
php_phongo_binary_init_ce(INIT_FUNC_ARGS_PASSTHRU);
28362847
php_phongo_dbpointer_init_ce(INIT_FUNC_ARGS_PASSTHRU);
28372848
php_phongo_decimal128_init_ce(INIT_FUNC_ARGS_PASSTHRU);
2849+
php_phongo_int64_init_ce(INIT_FUNC_ARGS_PASSTHRU);
28382850
php_phongo_javascript_init_ce(INIT_FUNC_ARGS_PASSTHRU);
28392851
php_phongo_maxkey_init_ce(INIT_FUNC_ARGS_PASSTHRU);
28402852
php_phongo_minkey_init_ce(INIT_FUNC_ARGS_PASSTHRU);

php_phongo.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ void php_phongo_new_javascript_from_javascript(int init, zval* object, const cha
169169
void php_phongo_new_javascript_from_javascript_and_scope(int init, zval* object, const char* code, size_t code_len, const bson_t* scope TSRMLS_DC);
170170
void php_phongo_new_binary_from_binary_and_type(zval* object, const char* data, size_t data_len, bson_subtype_t type TSRMLS_DC);
171171
void php_phongo_new_decimal128(zval* object, const bson_decimal128_t* decimal TSRMLS_DC);
172+
void php_phongo_new_int64(zval* object, int64_t integer TSRMLS_DC);
172173
void php_phongo_new_regex_from_regex_and_options(zval* object, const char* pattern, const char* flags TSRMLS_DC);
173174
void php_phongo_new_symbol(zval* object, const char* symbol, size_t symbol_len TSRMLS_DC);
174175
void php_phongo_new_dbpointer(zval* object, const char* namespace, size_t namespace_len, const bson_oid_t* oid TSRMLS_DC);

php_phongo_classes.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,10 @@ static inline php_phongo_decimal128_t* php_decimal128_fetch_object(zend_object*
9393
{
9494
return (php_phongo_decimal128_t*) ((char*) obj - XtOffsetOf(php_phongo_decimal128_t, std));
9595
}
96+
static inline php_phongo_int64_t* php_int64_fetch_object(zend_object* obj)
97+
{
98+
return (php_phongo_int64_t*) ((char*) obj - XtOffsetOf(php_phongo_int64_t, std));
99+
}
96100
static inline php_phongo_javascript_t* php_javascript_fetch_object(zend_object* obj)
97101
{
98102
return (php_phongo_javascript_t*) ((char*) obj - XtOffsetOf(php_phongo_javascript_t, std));
@@ -159,6 +163,7 @@ static inline php_phongo_commandsucceededevent_t* php_commandsucceededevent_fetc
159163
#define Z_BINARY_OBJ_P(zv) (php_binary_fetch_object(Z_OBJ_P(zv)))
160164
#define Z_DBPOINTER_OBJ_P(zv) (php_dbpointer_fetch_object(Z_OBJ_P(zv)))
161165
#define Z_DECIMAL128_OBJ_P(zv) (php_decimal128_fetch_object(Z_OBJ_P(zv)))
166+
#define Z_INT64_OBJ_P(zv) (php_int64_fetch_object(Z_OBJ_P(zv)))
162167
#define Z_JAVASCRIPT_OBJ_P(zv) (php_javascript_fetch_object(Z_OBJ_P(zv)))
163168
#define Z_MAXKEY_OBJ_P(zv) (php_maxkey_fetch_object(Z_OBJ_P(zv)))
164169
#define Z_MINKEY_OBJ_P(zv) (php_minkey_fetch_object(Z_OBJ_P(zv)))
@@ -189,6 +194,7 @@ static inline php_phongo_commandsucceededevent_t* php_commandsucceededevent_fetc
189194
#define Z_OBJ_BINARY(zo) (php_binary_fetch_object(zo))
190195
#define Z_OBJ_DBPOINTER(zo) (php_dbpointer_fetch_object(zo))
191196
#define Z_OBJ_DECIMAL128(zo) (php_decimal128_fetch_object(zo))
197+
#define Z_OBJ_INT64(zo) (php_int64_fetch_object(zo))
192198
#define Z_OBJ_JAVASCRIPT(zo) (php_javascript_fetch_object(zo))
193199
#define Z_OBJ_MAXKEY(zo) (php_maxkey_fetch_object(zo))
194200
#define Z_OBJ_MINKEY(zo) (php_minkey_fetch_object(zo))
@@ -221,6 +227,7 @@ static inline php_phongo_commandsucceededevent_t* php_commandsucceededevent_fetc
221227
#define Z_BINARY_OBJ_P(zv) ((php_phongo_binary_t*) zend_object_store_get_object(zv TSRMLS_CC))
222228
#define Z_DBPOINTER_OBJ_P(zv) ((php_phongo_dbpointer_t*) zend_object_store_get_object(zv TSRMLS_CC))
223229
#define Z_DECIMAL128_OBJ_P(zv) ((php_phongo_decimal128_t*) zend_object_store_get_object(zv TSRMLS_CC))
230+
#define Z_INT64_OBJ_P(zv) ((php_phongo_int64_t*) zend_object_store_get_object(zv TSRMLS_CC))
224231
#define Z_JAVASCRIPT_OBJ_P(zv) ((php_phongo_javascript_t*) zend_object_store_get_object(zv TSRMLS_CC))
225232
#define Z_MAXKEY_OBJ_P(zv) ((php_phongo_maxkey_t*) zend_object_store_get_object(zv TSRMLS_CC))
226233
#define Z_MINKEY_OBJ_P(zv) ((php_phongo_minkey_t*) zend_object_store_get_object(zv TSRMLS_CC))
@@ -251,6 +258,7 @@ static inline php_phongo_commandsucceededevent_t* php_commandsucceededevent_fetc
251258
#define Z_OBJ_BINARY(zo) ((php_phongo_binary_t*) zo)
252259
#define Z_OBJ_DBPOINTER(zo) ((php_phongo_dbpointer_t*) zo)
253260
#define Z_OBJ_DECIMAL128(zo) ((php_phongo_decimal128_t*) zo)
261+
#define Z_OBJ_INT64(zo) ((php_phongo_int64_t*) zo)
254262
#define Z_OBJ_JAVASCRIPT(zo) ((php_phongo_javascript_t*) zo)
255263
#define Z_OBJ_MAXKEY(zo) ((php_phongo_maxkey_t*) zo)
256264
#define Z_OBJ_MINKEY(zo) ((php_phongo_minkey_t*) zo)
@@ -308,6 +316,7 @@ extern zend_class_entry* php_phongo_serializable_ce;
308316
extern zend_class_entry* php_phongo_binary_ce;
309317
extern zend_class_entry* php_phongo_dbpointer_ce;
310318
extern zend_class_entry* php_phongo_decimal128_ce;
319+
extern zend_class_entry* php_phongo_int64_ce;
311320
extern zend_class_entry* php_phongo_javascript_ce;
312321
extern zend_class_entry* php_phongo_maxkey_ce;
313322
extern zend_class_entry* php_phongo_minkey_ce;
@@ -337,6 +346,7 @@ extern zend_class_entry* php_phongo_subscriber_ce;
337346
extern void php_phongo_binary_init_ce(INIT_FUNC_ARGS);
338347
extern void php_phongo_dbpointer_init_ce(INIT_FUNC_ARGS);
339348
extern void php_phongo_decimal128_init_ce(INIT_FUNC_ARGS);
349+
extern void php_phongo_int64_init_ce(INIT_FUNC_ARGS);
340350
extern void php_phongo_javascript_init_ce(INIT_FUNC_ARGS);
341351
extern void php_phongo_maxkey_init_ce(INIT_FUNC_ARGS);
342352
extern void php_phongo_minkey_init_ce(INIT_FUNC_ARGS);

php_phongo_structs.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,14 @@ typedef struct {
176176
PHONGO_ZEND_OBJECT_POST
177177
} php_phongo_decimal128_t;
178178

179+
typedef struct {
180+
PHONGO_ZEND_OBJECT_PRE
181+
bool initialized;
182+
int64_t integer;
183+
HashTable* properties;
184+
PHONGO_ZEND_OBJECT_POST
185+
} php_phongo_int64_t;
186+
179187
typedef struct {
180188
PHONGO_ZEND_OBJECT_PRE
181189
char* code;

scripts/convert-bson-corpus-tests.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@
1515
];
1616

1717
$for64bitOnly = [
18-
'Int64 type: MinValue' => "Can't represent 64-bit ints on a 32-bit platform",
19-
'Int64 type: MaxValue' => "Can't represent 64-bit ints on a 32-bit platform",
18+
/* Note: Although 64-bit integers be represented by the Int64 class, these
19+
* tests fail on 32-bit platforms due to json_canonicalize() roundtripping
20+
* values through PHP, which converts large integers to floats. */
21+
'Int64 type: MinValue' => "Can't represent 64-bit ints on a 32-bit platform",
22+
'Int64 type: MaxValue' => "Can't represent 64-bit ints on a 32-bit platform",
2023
];
2124

2225
$outputPath = realpath(__DIR__ . '/../tests') . '/bson-corpus/';

0 commit comments

Comments
 (0)