@@ -968,7 +968,11 @@ void object_to_bson(zval *object, php_phongo_bson_flags_t flags, const char *key
968968 return ;
969969 }
970970
971+ #if PHP_VERSION_ID >= 70000
972+ phongo_throw_exception (PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC , "Unexpected %s instance: %s" , ZSTR_VAL (php_phongo_type_ce -> name ), ZSTR_VAL (Z_OBJCE_P (object )-> name ));
973+ #else
971974 phongo_throw_exception (PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC , "Unexpected %s instance: %s" , php_phongo_type_ce -> name , Z_OBJCE_P (object )-> name );
975+ #endif
972976 return ;
973977 }
974978
@@ -1037,25 +1041,52 @@ void phongo_bson_append(bson_t *bson, php_phongo_bson_flags_t flags, const char
10371041 object_to_bson (entry , flags , key , key_len , bson TSRMLS_CC );
10381042 break ;
10391043
1044+ #if PHP_VERSION_ID >= 70000
1045+ case IS_INDIRECT :
1046+ phongo_bson_append (bson , flags , key , key_len , Z_TYPE_P (Z_INDIRECT_P (entry )), Z_INDIRECT_P (entry ) TSRMLS_DC );
1047+ break ;
1048+ #endif
1049+
10401050 default :
1041- phongo_throw_exception (PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC , "Got unsupported type '%s'" , zend_get_type_by_const (entry_type ));
1051+ phongo_throw_exception (PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC , "Got unsupported type %d '%s'" , entry_type , zend_get_type_by_const (entry_type ));
10421052 }
10431053}
10441054
1055+ #if PHP_VERSION_ID >= 70000
1056+ static bool is_public_property (zend_class_entry * ce , zend_string * name , zend_string * * member TSRMLS_DC ) /* {{{ */
1057+ #else
10451058static bool is_public_property (zend_class_entry * ce , const char * prop_name , int prop_name_len TSRMLS_DC ) /* {{{ */
1059+ #endif
10461060{
1047- zend_property_info * property_info ;
1048- zval member ;
1061+ zend_property_info * property_info = NULL ;
10491062
10501063#if PHP_VERSION_ID >= 70000
1051- ZVAL_STRINGL (& member , prop_name , prop_name_len );
1052- property_info = zend_get_property_info (ce , Z_STR (member ), 1 TSRMLS_CC );
1064+ if (ZSTR_VAL (name )[0 ] == 0 ) {
1065+ const char * prop_name ,
1066+ * class_name ;
1067+ size_t prop_name_len ;
1068+
1069+ zend_unmangle_property_name_ex (name ,
1070+ & class_name , & prop_name , & prop_name_len );
1071+ (* member ) = zend_string_init (prop_name , prop_name_len , 0 );
1072+ } else (* member ) = zend_string_copy (name );
1073+ property_info = zend_get_property_info (ce , (* member ), 1 TSRMLS_CC );
1074+
1075+ if (!property_info ) /* undefined property */
1076+ return true;
1077+
1078+ if (property_info == ZEND_WRONG_PROPERTY_INFO ) {
1079+ return false;
1080+ }
1081+
1082+ return (property_info -> flags & ZEND_ACC_PUBLIC );
10531083#else
1084+ zval member ;
10541085 ZVAL_STRINGL (& member , prop_name , prop_name_len , 0 );
10551086 property_info = zend_get_property_info (ce , & member , 1 TSRMLS_CC );
1056- #endif
10571087
10581088 return (property_info && (property_info -> flags & ZEND_ACC_PUBLIC ));
1089+ #endif
10591090}
10601091/* }}} */
10611092
@@ -1137,7 +1168,11 @@ PHONGO_API void zval_to_bson(zval *data, php_phongo_bson_flags_t flags, bson_t *
11371168 }
11381169
11391170 if (instanceof_function (Z_OBJCE_P (data ), php_phongo_type_ce TSRMLS_CC )) {
1171+ #if PHP_VERSION_ID >= 70000
1172+ phongo_throw_exception (PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC , "%s instance %s cannot be serialized as a root element" , ZSTR_VAL (php_phongo_type_ce -> name ), ZSTR_VAL (Z_OBJCE_P (data )-> name ));
1173+ #else
11401174 phongo_throw_exception (PHONGO_ERROR_UNEXPECTED_VALUE TSRMLS_CC , "%s instance %s cannot be serialized as a root element" , php_phongo_type_ce -> name , Z_OBJCE_P (data )-> name );
1175+ #endif
11411176
11421177 break ;
11431178 }
@@ -1170,29 +1205,36 @@ PHONGO_API void zval_to_bson(zval *data, php_phongo_bson_flags_t flags, bson_t *
11701205 ZEND_HASH_FOREACH_KEY_VAL (ht_data , num_key , key , value ) {
11711206 if (key ) {
11721207 if (Z_TYPE_P (data ) == IS_OBJECT ) {
1173- const char * skey ;
1174- size_t skey_len = 0 ;
1175- const char * class_name ;
1176- zend_unmangle_property_name_ex (key , & class_name , & skey , & skey_len );
1177-
1208+ zend_string * member = NULL ;
1209+
11781210 /* Ignore non-public properties */
1179- if (!is_public_property (Z_OBJCE_P (data ), skey , skey_len TSRMLS_CC )) {
1211+ if (!instanceof_function (Z_OBJCE_P (data ), php_phongo_serializable_ce ) &&
1212+ !is_public_property (Z_OBJCE_P (data ), key , & member TSRMLS_CC )) {
1213+ if (member )
1214+ zend_string_release (member );
11801215 continue ;
11811216 }
11821217
11831218 if (flags & PHONGO_BSON_ADD_ID ) {
1184- if (!strncmp (skey , "_id" , sizeof ("_id" )- 1 )) {
1219+ if (!strncmp (member ? ZSTR_VAL ( member ) : ZSTR_VAL ( key ) , "_id" , sizeof ("_id" )- 1 )) {
11851220 flags &= ~PHONGO_BSON_ADD_ID ;
11861221 }
11871222 }
1188- phongo_bson_append (bson , flags & ~PHONGO_BSON_ADD_ID , skey , skey_len , Z_TYPE_P (value ), value TSRMLS_CC );
1223+
1224+ phongo_bson_append (bson , flags & ~PHONGO_BSON_ADD_ID ,
1225+ member ? ZSTR_VAL (member ) : ZSTR_VAL (key ),
1226+ member ? ZSTR_LEN (member ) : ZSTR_LEN (key ),
1227+ Z_TYPE_P (value ), value TSRMLS_CC );
1228+
1229+ if (member )
1230+ zend_string_release (member );
11891231 } else {
11901232 if (flags & PHONGO_BSON_ADD_ID ) {
1191- if (!strncmp (key -> val , "_id" , sizeof ("_id" )- 1 )) {
1233+ if (!strncmp (ZSTR_VAL ( key ) , "_id" , sizeof ("_id" )- 1 )) {
11921234 flags &= ~PHONGO_BSON_ADD_ID ;
11931235 }
11941236 }
1195- phongo_bson_append (bson , flags & ~PHONGO_BSON_ADD_ID , key -> val , key -> len , Z_TYPE_P (value ), value TSRMLS_CC );
1237+ phongo_bson_append (bson , flags & ~PHONGO_BSON_ADD_ID , ZSTR_VAL ( key ), ZSTR_LEN ( key ) , Z_TYPE_P (value ), value TSRMLS_CC );
11961238 }
11971239 } else {
11981240 char numbuf [32 ];
@@ -1264,8 +1306,12 @@ PHONGO_API void zval_to_bson(zval *data, php_phongo_bson_flags_t flags, bson_t *
12641306 }
12651307 }
12661308 if (!Z_ISUNDEF (obj_data )) {
1267- #if PHP_VERSION_ID < 70000
1268- zval_ptr_dtor (& obj_data );
1309+ #if PHP_VERSION_ID >= 70000
1310+ if (Z_TYPE_P (data ) == IS_OBJECT && instanceof_function (Z_OBJCE_P (data ), php_phongo_serializable_ce TSRMLS_CC )) {
1311+ #endif
1312+ zval_ptr_dtor (& obj_data );
1313+ #if PHP_VERSION_ID >= 70000
1314+ }
12691315#endif
12701316 }
12711317}
@@ -1282,7 +1328,7 @@ int bson_to_zval(const unsigned char *data, int data_len, zval **zv)
12821328
12831329 retval = bson_to_zval_ex (data , data_len , & state );
12841330#if PHP_VERSION_ID >= 70000
1285- ZVAL_COPY (zv , & state .zchild );
1331+ ZVAL_ZVAL (zv , & state .zchild , 1 , 1 );
12861332#else
12871333 * zv = state .zchild ;
12881334#endif
0 commit comments