@@ -968,7 +968,11 @@ void object_to_bson(zval *object, php_phongo_bson_flags_t flags, const char *key
968
968
return ;
969
969
}
970
970
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
971
974
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
972
976
return ;
973
977
}
974
978
@@ -1037,25 +1041,52 @@ void phongo_bson_append(bson_t *bson, php_phongo_bson_flags_t flags, const char
1037
1041
object_to_bson (entry , flags , key , key_len , bson TSRMLS_CC );
1038
1042
break ;
1039
1043
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
+
1040
1050
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 ));
1042
1052
}
1043
1053
}
1044
1054
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
1045
1058
static bool is_public_property (zend_class_entry * ce , const char * prop_name , int prop_name_len TSRMLS_DC ) /* {{{ */
1059
+ #endif
1046
1060
{
1047
- zend_property_info * property_info ;
1048
- zval member ;
1061
+ zend_property_info * property_info = NULL ;
1049
1062
1050
1063
#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 );
1053
1083
#else
1084
+ zval member ;
1054
1085
ZVAL_STRINGL (& member , prop_name , prop_name_len , 0 );
1055
1086
property_info = zend_get_property_info (ce , & member , 1 TSRMLS_CC );
1056
- #endif
1057
1087
1058
1088
return (property_info && (property_info -> flags & ZEND_ACC_PUBLIC ));
1089
+ #endif
1059
1090
}
1060
1091
/* }}} */
1061
1092
@@ -1137,7 +1168,11 @@ PHONGO_API void zval_to_bson(zval *data, php_phongo_bson_flags_t flags, bson_t *
1137
1168
}
1138
1169
1139
1170
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
1140
1174
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
1141
1176
1142
1177
break ;
1143
1178
}
@@ -1170,29 +1205,36 @@ PHONGO_API void zval_to_bson(zval *data, php_phongo_bson_flags_t flags, bson_t *
1170
1205
ZEND_HASH_FOREACH_KEY_VAL (ht_data , num_key , key , value ) {
1171
1206
if (key ) {
1172
1207
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
+
1178
1210
/* 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 );
1180
1215
continue ;
1181
1216
}
1182
1217
1183
1218
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 )) {
1185
1220
flags &= ~PHONGO_BSON_ADD_ID ;
1186
1221
}
1187
1222
}
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 );
1189
1231
} else {
1190
1232
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 )) {
1192
1234
flags &= ~PHONGO_BSON_ADD_ID ;
1193
1235
}
1194
1236
}
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 );
1196
1238
}
1197
1239
} else {
1198
1240
char numbuf [32 ];
@@ -1264,8 +1306,12 @@ PHONGO_API void zval_to_bson(zval *data, php_phongo_bson_flags_t flags, bson_t *
1264
1306
}
1265
1307
}
1266
1308
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
+ }
1269
1315
#endif
1270
1316
}
1271
1317
}
@@ -1282,7 +1328,7 @@ int bson_to_zval(const unsigned char *data, int data_len, zval **zv)
1282
1328
1283
1329
retval = bson_to_zval_ex (data , data_len , & state );
1284
1330
#if PHP_VERSION_ID >= 70000
1285
- ZVAL_COPY (zv , & state .zchild );
1331
+ ZVAL_ZVAL (zv , & state .zchild , 1 , 1 );
1286
1332
#else
1287
1333
* zv = state .zchild ;
1288
1334
#endif
0 commit comments