@@ -1097,6 +1097,22 @@ ZEND_API zend_result zend_try_assign_typed_ref_res(zend_reference *ref, zend_res
1097
1097
ZEND_API zend_result zend_try_assign_typed_ref_zval (zend_reference * ref , zval * zv );
1098
1098
ZEND_API zend_result zend_try_assign_typed_ref_zval_ex (zend_reference * ref , zval * zv , bool strict );
1099
1099
1100
+ #define ZEND_SAFE_ASSIGN_VALUE (zv , value ) do { \
1101
+ zval *_zv = zv; \
1102
+ zval *_value = value; \
1103
+ if (Z_REFCOUNTED_P(_zv)) { \
1104
+ zend_refcounted *rc = Z_COUNTED_P(_zv); \
1105
+ ZVAL_COPY_VALUE(_zv, _value); \
1106
+ if (!GC_DELREF(rc)) { \
1107
+ rc_dtor_func(rc); \
1108
+ } else { \
1109
+ gc_check_possible_root(rc); \
1110
+ } \
1111
+ } else { \
1112
+ ZVAL_COPY_VALUE(_zv, _value); \
1113
+ } \
1114
+ } while (0)
1115
+
1100
1116
#define _ZEND_TRY_ASSIGN_NULL (zv , is_ref ) do { \
1101
1117
zval *_zv = zv; \
1102
1118
if (is_ref || UNEXPECTED(Z_ISREF_P(_zv))) { \
@@ -1107,7 +1123,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1107
1123
} \
1108
1124
_zv = &ref->val; \
1109
1125
} \
1110
- zval_ptr_dtor (_zv); \
1126
+ zval_ptr_safe_dtor (_zv); \
1111
1127
ZVAL_NULL(_zv); \
1112
1128
} while (0)
1113
1129
@@ -1129,7 +1145,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1129
1145
} \
1130
1146
_zv = &ref->val; \
1131
1147
} \
1132
- zval_ptr_dtor (_zv); \
1148
+ zval_ptr_safe_dtor (_zv); \
1133
1149
ZVAL_FALSE(_zv); \
1134
1150
} while (0)
1135
1151
@@ -1151,7 +1167,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1151
1167
} \
1152
1168
_zv = &ref->val; \
1153
1169
} \
1154
- zval_ptr_dtor (_zv); \
1170
+ zval_ptr_safe_dtor (_zv); \
1155
1171
ZVAL_TRUE(_zv); \
1156
1172
} while (0)
1157
1173
@@ -1173,7 +1189,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1173
1189
} \
1174
1190
_zv = &ref->val; \
1175
1191
} \
1176
- zval_ptr_dtor (_zv); \
1192
+ zval_ptr_safe_dtor (_zv); \
1177
1193
ZVAL_BOOL(_zv, bval); \
1178
1194
} while (0)
1179
1195
@@ -1195,7 +1211,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1195
1211
} \
1196
1212
_zv = &ref->val; \
1197
1213
} \
1198
- zval_ptr_dtor (_zv); \
1214
+ zval_ptr_safe_dtor (_zv); \
1199
1215
ZVAL_LONG(_zv, lval); \
1200
1216
} while (0)
1201
1217
@@ -1217,7 +1233,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1217
1233
} \
1218
1234
_zv = &ref->val; \
1219
1235
} \
1220
- zval_ptr_dtor (_zv); \
1236
+ zval_ptr_safe_dtor (_zv); \
1221
1237
ZVAL_DOUBLE(_zv, dval); \
1222
1238
} while (0)
1223
1239
@@ -1239,7 +1255,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1239
1255
} \
1240
1256
_zv = &ref->val; \
1241
1257
} \
1242
- zval_ptr_dtor (_zv); \
1258
+ zval_ptr_safe_dtor (_zv); \
1243
1259
ZVAL_EMPTY_STRING(_zv); \
1244
1260
} while (0)
1245
1261
@@ -1261,7 +1277,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1261
1277
} \
1262
1278
_zv = &ref->val; \
1263
1279
} \
1264
- zval_ptr_dtor (_zv); \
1280
+ zval_ptr_safe_dtor (_zv); \
1265
1281
ZVAL_STR(_zv, str); \
1266
1282
} while (0)
1267
1283
@@ -1283,7 +1299,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1283
1299
} \
1284
1300
_zv = &ref->val; \
1285
1301
} \
1286
- zval_ptr_dtor (_zv); \
1302
+ zval_ptr_safe_dtor (_zv); \
1287
1303
ZVAL_NEW_STR(_zv, str); \
1288
1304
} while (0)
1289
1305
@@ -1305,7 +1321,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1305
1321
} \
1306
1322
_zv = &ref->val; \
1307
1323
} \
1308
- zval_ptr_dtor (_zv); \
1324
+ zval_ptr_safe_dtor (_zv); \
1309
1325
ZVAL_STRING(_zv, string); \
1310
1326
} while (0)
1311
1327
@@ -1327,7 +1343,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1327
1343
} \
1328
1344
_zv = &ref->val; \
1329
1345
} \
1330
- zval_ptr_dtor (_zv); \
1346
+ zval_ptr_safe_dtor (_zv); \
1331
1347
ZVAL_STRINGL(_zv, string, len); \
1332
1348
} while (0)
1333
1349
@@ -1349,7 +1365,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1349
1365
} \
1350
1366
_zv = &ref->val; \
1351
1367
} \
1352
- zval_ptr_dtor (_zv); \
1368
+ zval_ptr_safe_dtor (_zv); \
1353
1369
ZVAL_ARR(_zv, arr); \
1354
1370
} while (0)
1355
1371
@@ -1371,7 +1387,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1371
1387
} \
1372
1388
_zv = &ref->val; \
1373
1389
} \
1374
- zval_ptr_dtor (_zv); \
1390
+ zval_ptr_safe_dtor (_zv); \
1375
1391
ZVAL_RES(_zv, res); \
1376
1392
} while (0)
1377
1393
@@ -1393,7 +1409,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1393
1409
} \
1394
1410
_zv = &ref->val; \
1395
1411
} \
1396
- zval_ptr_dtor (_zv); \
1412
+ zval_ptr_safe_dtor (_zv); \
1397
1413
ZVAL_COPY_VALUE(_zv, other_zv); \
1398
1414
} while (0)
1399
1415
@@ -1415,7 +1431,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1415
1431
} \
1416
1432
_zv = &ref->val; \
1417
1433
} \
1418
- zval_ptr_dtor (_zv); \
1434
+ zval_ptr_safe_dtor (_zv); \
1419
1435
ZVAL_COPY_VALUE(_zv, other_zv); \
1420
1436
} while (0)
1421
1437
@@ -1447,7 +1463,7 @@ ZEND_API zend_result zend_try_assign_typed_ref_zval_ex(zend_reference *ref, zval
1447
1463
} \
1448
1464
_zv = &ref->val; \
1449
1465
} \
1450
- zval_ptr_dtor (_zv); \
1466
+ zval_ptr_safe_dtor (_zv); \
1451
1467
ZVAL_COPY_VALUE(_zv, other_zv); \
1452
1468
} while (0)
1453
1469
@@ -1485,10 +1501,7 @@ static zend_always_inline zval *zend_try_array_init_size(zval *zv, uint32_t size
1485
1501
}
1486
1502
zv = & ref -> val ;
1487
1503
}
1488
- zval garbage ;
1489
- ZVAL_COPY_VALUE (& garbage , zv );
1490
- ZVAL_NULL (zv );
1491
- zval_ptr_dtor (& garbage );
1504
+ zval_ptr_safe_dtor (zv );
1492
1505
ZVAL_ARR (zv , arr );
1493
1506
return zv ;
1494
1507
}
0 commit comments