Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 9d7bb9a

Browse files
committed
Merge pull request #64
2 parents 914aaba + 888b5dc commit 9d7bb9a

15 files changed

+1028
-207
lines changed

‎config.m4‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,12 @@ if test "$MONGODB" != "no"; then
111111
PHP_CHECK_GCC_ARG(-Wdeclaration-after-statement, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wdeclaration-after-statement")
112112
dnl PHP_CHECK_GCC_ARG(-Werror, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Werror")
113113

114+
PHP_MONGODB_FOUND_VERSION=`${PHP_CONFIG} --version`
115+
PHP_MONGODB_FOUND_VERNUM=`echo "${PHP_MONGODB_FOUND_VERSION}" | $AWK 'BEGIN { FS = "."; } { printf "%d", ([$]1 * 100 + [$]2) * 100 + [$]3;}'`
116+
117+
if test "$PHP_MONGODB_FOUND_VERNUM" -ge "50400"; then
118+
PHP_CHECK_GCC_ARG(-Wno-cast-qual, _MAINTAINER_CFLAGS="$_MAINTAINER_CFLAGS -Wno-cast-qual")
119+
fi
114120

115121
MAINTAINER_CFLAGS="-Wextra $_MAINTAINER_CFLAGS -Wno-unused-parameter -Wno-unused-but-set-variable -Wno-missing-field-initializers"
116122
STD_CFLAGS="-g -O0 -Wall"

‎phongo_compat.h‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@
1717
zend_hash_copy(*_std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
1818
#endif
1919

20+
#if PHP_VERSION_ID < 50400
21+
# define str_efree(s) efree((char*)s)
22+
#else
23+
# include <Zend/zend_string.h>
24+
#endif
25+
2026
#if PHP_VERSION_ID >= 50500
2127
#define ITERATOR_GET_CURRENT_KEY(it, z) \
2228
(it).funcs->get_current_key(&(it), z TSRMLS_CC);

‎src/BSON/Binary.c‎

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@
4444

4545
PHONGO_API zend_class_entry *php_phongo_binary_ce;
4646

47+
zend_object_handlers php_phongo_handler_binary;
48+
4749
/* {{{ proto BSON\Binary Binary::__construct(string $data, int $subtype)
4850
Construct a new BSON Binary type */
4951
PHP_METHOD(Binary, __construct)
@@ -152,10 +154,25 @@ zend_object_value php_phongo_binary_create_object(zend_class_entry *class_type T
152154
object_properties_init(&intern->std, class_type);
153155

154156
retval.handle = zend_objects_store_put(intern, (zend_objects_store_dtor_t) zend_objects_destroy_object, php_phongo_binary_free_object, NULL TSRMLS_CC);
155-
retval.handlers = phongo_get_std_object_handlers();
157+
retval.handlers = &php_phongo_handler_binary;
156158

157159
return retval;
158160
} /* }}} */
161+
162+
HashTable *php_phongo_binary_get_debug_info(zval *object, int *is_temp TSRMLS_DC) /* {{{ */
163+
{
164+
php_phongo_binary_t *intern;
165+
zval retval = zval_used_for_init;
166+
167+
intern = (php_phongo_binary_t *)zend_object_store_get_object(object TSRMLS_CC);
168+
*is_temp = 1;
169+
array_init_size(&retval, 2);
170+
171+
add_assoc_stringl_ex(&retval, ZEND_STRS("data"), intern->data, intern->data_len, 1);
172+
add_assoc_long_ex(&retval, ZEND_STRS("subtype"), intern->subtype);
173+
174+
return Z_ARRVAL(retval);
175+
} /* }}} */
159176
/* }}} */
160177

161178
/* {{{ PHP_MINIT_FUNCTION */
@@ -170,6 +187,9 @@ PHP_MINIT_FUNCTION(Binary)
170187

171188
zend_class_implements(php_phongo_binary_ce TSRMLS_CC, 1, php_phongo_type_ce);
172189

190+
memcpy(&php_phongo_handler_binary, phongo_get_std_object_handlers(), sizeof(zend_object_handlers));
191+
php_phongo_handler_binary.get_debug_info = php_phongo_binary_get_debug_info;
192+
173193
zend_declare_class_constant_long(php_phongo_binary_ce, ZEND_STRL("TYPE_GENERIC"), BSON_SUBTYPE_BINARY TSRMLS_CC);
174194
zend_declare_class_constant_long(php_phongo_binary_ce, ZEND_STRL("TYPE_FUNCTION"), BSON_SUBTYPE_FUNCTION TSRMLS_CC);
175195
zend_declare_class_constant_long(php_phongo_binary_ce, ZEND_STRL("TYPE_OLD_BINARY"), BSON_SUBTYPE_BINARY_DEPRECATED TSRMLS_CC);

‎src/bson.c‎

Lines changed: 103 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,9 @@
6262

6363
#define PHONGO_ODM_FIELD_NAME "__pclass"
6464

65+
#define PHONGO_IS_CLASS_INSTANTIATABLE(ce) \
66+
(!(ce->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)))
67+
6568
PHP_MINIT_FUNCTION(bson)
6669
{
6770
(void)type; /* We don't care if we are loaded via dl() or extension= */
@@ -211,8 +214,12 @@ bool php_phongo_bson_visit_binary(const bson_iter_t *iter ARG_UNUSED, const char
211214
zval *zchild = NULL;
212215
TSRMLS_FETCH();
213216

214-
if (v_subtype == 0x80 && strcmp(key, PHONGO_ODM_FIELD_NAME) ==0) {
215-
((php_phongo_bson_state *)data)->odm = zend_fetch_class((char *)v_binary, v_binary_len, ZEND_FETCH_CLASS_AUTO|ZEND_FETCH_CLASS_SILENT TSRMLS_CC);
217+
if (v_subtype == 0x80 && strcmp(key, PHONGO_ODM_FIELD_NAME) == 0) {
218+
zend_class_entry *found_ce = zend_fetch_class((char *)v_binary, v_binary_len, ZEND_FETCH_CLASS_AUTO|ZEND_FETCH_CLASS_SILENT TSRMLS_CC);
219+
220+
if (found_ce && PHONGO_IS_CLASS_INSTANTIATABLE(found_ce) && instanceof_function(found_ce, php_phongo_persistable_ce TSRMLS_CC)) {
221+
((php_phongo_bson_state *)data)->odm = found_ce;
222+
}
216223
}
217224

218225
MAKE_STD_ZVAL(zchild);
@@ -463,26 +470,28 @@ bool php_phongo_bson_visit_document(const bson_iter_t *iter ARG_UNUSED, const ch
463470
array_init(state.zchild);
464471

465472
if (!bson_iter_visit_all(&child, &php_bson_visitors, &state)) {
466-
if (state.odm) {
473+
/* If php_phongo_bson_visit_binary() finds an ODM class, it should
474+
* supersede a default type map and named document class. */
475+
if (state.odm && state.map.document_type == PHONGO_TYPEMAP_NONE) {
467476
state.map.document_type = PHONGO_TYPEMAP_CLASS;
468477
}
478+
469479
switch(state.map.document_type) {
470480
case PHONGO_TYPEMAP_NATIVE_ARRAY:
471481
add_assoc_zval(retval, key, state.zchild);
472482
Z_SET_REFCOUNT_P(state.zchild, 1);
473483
break;
474484

475-
case PHONGO_TYPEMAP_CLASS:
476-
if (instanceof_function(state.odm ? state.odm : state.map.document, php_phongo_unserializable_ce TSRMLS_CC)) {
477-
zval *obj = NULL;
485+
case PHONGO_TYPEMAP_CLASS: {
486+
zval *obj = NULL;
478487

479-
MAKE_STD_ZVAL(obj);
480-
object_init_ex(obj, state.odm ? state.odm : state.map.document);
481-
zend_call_method_with_1_params(&obj, NULL, NULL, BSON_UNSERIALIZE_FUNC_NAME, NULL, state.zchild);
482-
add_assoc_zval(retval, key, obj);
483-
zval_ptr_dtor(&state.zchild);
484-
break;
485-
}
488+
MAKE_STD_ZVAL(obj);
489+
object_init_ex(obj, state.odm ? state.odm : state.map.document);
490+
zend_call_method_with_1_params(&obj, NULL, NULL, BSON_UNSERIALIZE_FUNC_NAME, NULL, state.zchild);
491+
add_assoc_zval(retval, key, obj);
492+
zval_ptr_dtor(&state.zchild);
493+
break;
494+
}
486495

487496
case PHONGO_TYPEMAP_NATIVE_OBJECT:
488497
default:
@@ -514,23 +523,17 @@ bool php_phongo_bson_visit_array(const bson_iter_t *iter ARG_UNUSED, const char
514523
if (!bson_iter_visit_all(&child, &php_bson_visitors, &state)) {
515524

516525
switch(state.map.array_type) {
517-
case PHONGO_TYPEMAP_CLASS:
518-
if (instanceof_function(state.map.array, php_phongo_unserializable_ce TSRMLS_CC)) {
519-
zval *obj = NULL;
520-
521-
MAKE_STD_ZVAL(obj);
522-
object_init_ex(obj, state.map.array);
523-
zend_call_method_with_1_params(&obj, NULL, NULL, BSON_UNSERIALIZE_FUNC_NAME, NULL, state.zchild);
524-
add_assoc_zval(retval, key, obj);
525-
zval_ptr_dtor(&state.zchild);
526-
break;
527-
}
528-
/* If the object someehow doesn't implement php_phongo_unserializable_ce then use stdclass.
529-
* This is needed as we need to know how to pass the state.zchild to the class to populate it.
530-
* Not all classes have ctor that accepts first parameter array of values.
531-
*/
526+
case PHONGO_TYPEMAP_CLASS: {
527+
zval *obj = NULL;
528+
529+
MAKE_STD_ZVAL(obj);
530+
object_init_ex(obj, state.map.array);
531+
zend_call_method_with_1_params(&obj, NULL, NULL, BSON_UNSERIALIZE_FUNC_NAME, NULL, state.zchild);
532+
add_assoc_zval(retval, key, obj);
533+
zval_ptr_dtor(&state.zchild);
534+
break;
535+
}
532536

533-
/* break intentionally omitted */
534537
case PHONGO_TYPEMAP_NATIVE_OBJECT:
535538
object_and_properties_init(state.zchild, zend_standard_class_def, Z_ARRVAL_P(state.zchild));
536539
add_assoc_zval(retval, key, state.zchild);
@@ -617,8 +620,8 @@ void object_to_bson(zval *object, php_phongo_bson_flags_t flags, const char *key
617620
return;
618621
}
619622

620-
if (Z_TYPE_P(obj_data) != IS_ARRAY) {
621-
phongo_throw_exception(PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC, "Expected %s() to return an array, %s given", BSON_SERIALIZE_FUNC_NAME, zend_get_type_by_const(Z_TYPE_P(obj_data)));
623+
if (Z_TYPE_P(obj_data) != IS_ARRAY&& !(Z_TYPE_P(obj_data) ==IS_OBJECT&&instanceof_function(Z_OBJCE_P(obj_data), zend_standard_class_defTSRMLS_CC))) {
624+
phongo_throw_exception(PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC, "Expected %s::%s() to return an array or stdClass, %s given", Z_OBJCE_P(object)->name, BSON_SERIALIZE_FUNC_NAME, (Z_TYPE_P(obj_data) ==IS_OBJECT ? Z_OBJCE_P(obj_data)->name : zend_get_type_by_const(Z_TYPE_P(obj_data))));
622625
zval_ptr_dtor(&obj_data);
623626

624627
return;
@@ -630,14 +633,22 @@ void object_to_bson(zval *object, php_phongo_bson_flags_t flags, const char *key
630633
tmp_ht->nApplyCount++;
631634
}
632635

633-
bson_append_document_begin(bson, key, key_len, &child);
634-
if (instanceof_function(Z_OBJCE_P(object), php_phongo_persistable_ce TSRMLS_CC)) {
635-
if (flags & PHONGO_BSON_ADD_CHILD_ODS) {
636-
bson_append_binary(&child, PHONGO_ODM_FIELD_NAME, -1, 0x80, (const uint8_t *)Z_OBJCE_P(object)->name, strlen(Z_OBJCE_P(object)->name));
636+
/* Persistable objects must always be serialized as BSON documents;
637+
* otherwise, infer based on bsonSerialize()'s return value. */
638+
if (instanceof_function(Z_OBJCE_P(object), php_phongo_persistable_ce TSRMLS_CC) || php_phongo_is_array_or_document(&obj_data TSRMLS_CC) == IS_OBJECT) {
639+
bson_append_document_begin(bson, key, key_len, &child);
640+
if (instanceof_function(Z_OBJCE_P(object), php_phongo_persistable_ce TSRMLS_CC)) {
641+
if (flags & PHONGO_BSON_ADD_CHILD_ODS) {
642+
bson_append_binary(&child, PHONGO_ODM_FIELD_NAME, -1, 0x80, (const uint8_t *)Z_OBJCE_P(object)->name, strlen(Z_OBJCE_P(object)->name));
643+
}
637644
}
645+
zval_to_bson(obj_data, flags, &child, NULL TSRMLS_CC);
646+
bson_append_document_end(bson, &child);
647+
} else {
648+
bson_append_array_begin(bson, key, key_len, &child);
649+
zval_to_bson(obj_data, flags, &child, NULL TSRMLS_CC);
650+
bson_append_array_end(bson, &child);
638651
}
639-
zval_to_bson(obj_data, flags, &child, NULL TSRMLS_CC);
640-
bson_append_document_end(bson, &child);
641652

642653
if (tmp_ht) {
643654
tmp_ht->nApplyCount--;
@@ -779,8 +790,8 @@ PHONGO_API void zval_to_bson(zval *data, php_phongo_bson_flags_t flags, bson_t *
779790
break;
780791
}
781792

782-
if (Z_TYPE_P(obj_data) != IS_ARRAY) {
783-
phongo_throw_exception(PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC, "Expected %s() to return an array, %s given", BSON_SERIALIZE_FUNC_NAME, zend_get_type_by_const(Z_TYPE_P(obj_data)));
793+
if (Z_TYPE_P(obj_data) != IS_ARRAY&& !(Z_TYPE_P(obj_data) ==IS_OBJECT&&instanceof_function(Z_OBJCE_P(obj_data), zend_standard_class_defTSRMLS_CC))) {
794+
phongo_throw_exception(PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC, "Expected %s::%s() to return an array or stdClass, %s given", Z_OBJCE_P(data)->name, BSON_SERIALIZE_FUNC_NAME, (Z_TYPE_P(obj_data) ==IS_OBJECT ? Z_OBJCE_P(obj_data)->name : zend_get_type_by_const(Z_TYPE_P(obj_data))));
784795

785796
break;
786797
}
@@ -902,9 +913,9 @@ int bson_to_zval(const unsigned char *data, int data_len, php_phongo_bson_state
902913
array_init(state->zchild);
903914
bson_iter_visit_all(&iter, &php_bson_visitors, state);
904915

905-
/* If php_phongo_bson_visit_binary() finds an ODM class, it supersedes our
906-
* document type. */
907-
if (state->odm) {
916+
/* If php_phongo_bson_visit_binary() finds an ODM class, it should supersede
917+
* a default type map and named root class. */
918+
if (state->odm&&state->map.root_type==PHONGO_TYPEMAP_NONE) {
908919
state->map.root_type = PHONGO_TYPEMAP_CLASS;
909920
}
910921

@@ -913,19 +924,16 @@ int bson_to_zval(const unsigned char *data, int data_len, php_phongo_bson_state
913924
/* Nothing to do here */
914925
break;
915926

916-
case PHONGO_TYPEMAP_CLASS:
917-
/* If the class implements Unserializable, initialize the object
918-
* from our array data; otherwise, fall through to native object. */
919-
if (instanceof_function(state->odm ? state->odm : state->map.root, php_phongo_unserializable_ce TSRMLS_CC)) {
920-
zval *obj = NULL;
921-
922-
MAKE_STD_ZVAL(obj);
923-
object_init_ex(obj, state->odm ? state->odm : state->map.root);
924-
zend_call_method_with_1_params(&obj, NULL, NULL, BSON_UNSERIALIZE_FUNC_NAME, NULL, state->zchild);
925-
zval_ptr_dtor(&state->zchild);
926-
state->zchild = obj;
927-
break;
928-
}
927+
case PHONGO_TYPEMAP_CLASS: {
928+
zval *obj = NULL;
929+
930+
MAKE_STD_ZVAL(obj);
931+
object_init_ex(obj, state->odm ? state->odm : state->map.root);
932+
zend_call_method_with_1_params(&obj, NULL, NULL, BSON_UNSERIALIZE_FUNC_NAME, NULL, state->zchild);
933+
zval_ptr_dtor(&state->zchild);
934+
state->zchild = obj;
935+
break;
936+
}
929937

930938
case PHONGO_TYPEMAP_NATIVE_OBJECT:
931939
default:
@@ -964,71 +972,63 @@ PHP_FUNCTION(fromPHP)
964972
}
965973
/* }}} */
966974

975+
static void apply_classname_to_state(const char *classname, int classname_len, php_phongo_bson_typemap_types *type, zend_class_entry **type_ce TSRMLS_DC)
976+
{
977+
if (!strcasecmp(classname, "array")) {
978+
*type = PHONGO_TYPEMAP_NATIVE_ARRAY;
979+
*type_ce = NULL;
980+
} else if (!strcasecmp(classname, "stdclass") || !strcasecmp(classname, "object")) {
981+
*type = PHONGO_TYPEMAP_NATIVE_OBJECT;
982+
*type_ce = NULL;
983+
} else {
984+
zend_class_entry *found_ce = zend_fetch_class(classname, classname_len, ZEND_FETCH_CLASS_AUTO|ZEND_FETCH_CLASS_SILENT TSRMLS_CC);
985+
986+
if (!found_ce) {
987+
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Class %s does not exist", classname);
988+
} else if (!PHONGO_IS_CLASS_INSTANTIATABLE(found_ce)) {
989+
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Class %s is not instantiatable", classname);
990+
} else if (!instanceof_function(found_ce, php_phongo_unserializable_ce TSRMLS_CC)) {
991+
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Class %s does not implement %s\\Unserializable", classname, BSON_NAMESPACE);
992+
} else {
993+
*type = PHONGO_TYPEMAP_CLASS;
994+
*type_ce = found_ce;
995+
}
996+
}
997+
}
998+
967999
void php_phongo_bson_typemap_to_state(zval *typemap, php_phongo_bson_typemap *map TSRMLS_DC)
9681000
{
9691001
if (typemap) {
970-
char *classname;
971-
int classname_len;
972-
zend_bool classname_free = 0;
1002+
char *classname;
1003+
int classname_len;
1004+
zend_bool classname_free = 0;
9731005

9741006
classname = php_array_fetchl_string(typemap, "array", sizeof("array")-1, &classname_len, &classname_free);
9751007
if (classname_len) {
976-
if (!strcasecmp(classname, "array")) {
977-
map->array_type = PHONGO_TYPEMAP_NATIVE_ARRAY;
978-
} else if (!strcasecmp(classname, "stdclass") || !strcasecmp(classname, "object")) {
979-
map->array_type = PHONGO_TYPEMAP_NATIVE_OBJECT;
980-
} else {
981-
zend_class_entry *array_ce = zend_fetch_class(classname, classname_len, ZEND_FETCH_CLASS_AUTO TSRMLS_CC);
982-
map->array_type = PHONGO_TYPEMAP_CLASS;
983-
984-
if (instanceof_function(array_ce, php_phongo_unserializable_ce TSRMLS_CC)) {
985-
map->array = array_ce;
986-
}
987-
}
988-
if (classname_free) {
989-
efree(classname);
990-
}
1008+
apply_classname_to_state(classname, classname_len, &map->array_type, &map->array TSRMLS_CC);
1009+
}
1010+
if (classname_free) {
1011+
str_efree(classname);
9911012
}
9921013

9931014
classname = php_array_fetchl_string(typemap, "document", sizeof("document")-1, &classname_len, &classname_free);
9941015
if (classname_len) {
995-
if (!strcasecmp(classname, "array")) {
996-
map->document_type = PHONGO_TYPEMAP_NATIVE_ARRAY;
997-
} else if (!strcasecmp(classname, "stdclass") || !strcasecmp(classname, "object")) {
998-
map->document_type = PHONGO_TYPEMAP_NATIVE_OBJECT;
999-
} else {
1000-
zend_class_entry *document_ce = zend_fetch_class(classname, classname_len, ZEND_FETCH_CLASS_AUTO TSRMLS_CC);
1001-
map->document_type = PHONGO_TYPEMAP_CLASS;
1002-
1003-
if (instanceof_function(document_ce, php_phongo_unserializable_ce TSRMLS_CC)) {
1004-
map->document = document_ce;
1005-
}
1006-
}
1007-
if (classname_free) {
1008-
efree(classname);
1009-
}
1016+
apply_classname_to_state(classname, classname_len, &map->document_type, &map->document TSRMLS_CC);
1017+
}
1018+
if (classname_free) {
1019+
str_efree(classname);
10101020
}
10111021

10121022
classname = php_array_fetchl_string(typemap, "root", sizeof("root")-1, &classname_len, &classname_free);
10131023
if (classname_len) {
1014-
if (!strcasecmp(classname, "array")) {
1015-
map->root_type = PHONGO_TYPEMAP_NATIVE_ARRAY;
1016-
} else if (!strcasecmp(classname, "stdclass") || !strcasecmp(classname, "object")) {
1017-
map->root_type = PHONGO_TYPEMAP_NATIVE_OBJECT;
1018-
} else {
1019-
zend_class_entry *root_ce = zend_fetch_class(classname, classname_len, ZEND_FETCH_CLASS_AUTO TSRMLS_CC);
1020-
map->root_type = PHONGO_TYPEMAP_CLASS;
1021-
1022-
if (instanceof_function(root_ce, php_phongo_unserializable_ce TSRMLS_CC)) {
1023-
map->root = root_ce;
1024-
}
1025-
}
1026-
if (classname_free) {
1027-
efree(classname);
1028-
}
1024+
apply_classname_to_state(classname, classname_len, &map->root_type, &map->root TSRMLS_CC);
1025+
}
1026+
if (classname_free) {
1027+
str_efree(classname);
10291028
}
10301029
}
10311030
}
1031+
10321032
/* {{{ proto array|object BSON\toPHP(string $bson [, array $typemap = array()])
10331033
Returns the PHP representation of a BSON value, optionally converting it into a custom class */
10341034
PHP_FUNCTION(toPHP)

‎tests/bson/bson-encode-002.phpt‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ $bson = fromPHP(array('embed' => new NumericArray));
6767
echo toJSON($bson), "\n";
6868
echo "Encoded BSON:\n";
6969
hex_dump($bson);
70-
$value = toPHP($bson, array("document" => 'NumericArray'));
70+
$value = toPHP($bson, array("array" => 'NumericArray'));
7171
echo "Decoded BSON:\n";
7272
var_dump($value);
7373

@@ -131,9 +131,9 @@ object(NumericArray)#%d (0) {
131131
}
132132

133133
Testing embedded NumericArray:
134-
{ "embed" : { "0" : 1, "1" : 2, "2" : 3 } }
134+
{ "embed" : [ 1, 2, 3 ] }
135135
Encoded BSON:
136-
0 : 26 00 00 00 03 65 6d 62 65 64 00 1a 00 00 00 10 [&....embed......]
136+
0 : 26 00 00 00 04 65 6d 62 65 64 00 1a 00 00 00 10 [&....embed......]
137137
10 : 30 00 01 00 00 00 10 31 00 02 00 00 00 10 32 00 [0......1......2.]
138138
20 : 03 00 00 00 00 00 [......]
139139
NumericArray::bsonUnserialize() was called with data:

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /