Skip to content

Commit 1a304d3

Browse files
committed
More accurate get_properties() usage.
1 parent b7f0588 commit 1a304d3

File tree

2 files changed

+50
-35
lines changed

2 files changed

+50
-35
lines changed

Zend/zend_vm_def.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6014,22 +6014,25 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET_R, CONST|TMP|VAR|CV, JMP_ADDR)
60146014
} else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
60156015
zend_object *zobj = Z_OBJ_P(array_ptr);
60166016
if (!zobj->ce->get_iterator) {
6017+
HashTable *properties;
6018+
60176019
result = EX_VAR(opline->result.var);
60186020
ZVAL_OBJ(result, zobj);
60196021
if (OP1_TYPE != IS_TMP_VAR) {
60206022
GC_ADDREF(zobj);
60216023
}
6022-
if (zobj->properties) {
6023-
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
6024-
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
6025-
GC_DELREF(zobj->properties);
6024+
properties = zobj->properties;
6025+
if (properties) {
6026+
if (UNEXPECTED(GC_REFCOUNT(properties) > 1)) {
6027+
if (EXPECTED(!(GC_FLAGS(properties) & IS_ARRAY_IMMUTABLE))) {
6028+
GC_DELREF(properties);
60266029
}
6027-
zobj->properties = zend_array_dup(zobj->properties);
6030+
properties = zobj->properties = zend_array_dup(properties);
60286031
}
60296032
} else {
6030-
zobj->properties = zobj->handlers->get_properties(zobj);
6033+
properties = zobj->handlers->get_properties(zobj);
60316034
}
6032-
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(zobj->properties, 0);
6035+
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(properties, 0);
60336036

60346037
FREE_OP1_IF_VAR();
60356038
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();

Zend/zend_vm_execute.h

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3252,22 +3252,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CONST_HANDLER(
32523252
} else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
32533253
zend_object *zobj = Z_OBJ_P(array_ptr);
32543254
if (!zobj->ce->get_iterator) {
3255+
HashTable *properties;
3256+
32553257
result = EX_VAR(opline->result.var);
32563258
ZVAL_OBJ(result, zobj);
32573259
if (IS_CONST != IS_TMP_VAR) {
32583260
GC_ADDREF(zobj);
32593261
}
3260-
if (zobj->properties) {
3261-
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
3262-
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
3263-
GC_DELREF(zobj->properties);
3262+
properties = zobj->properties;
3263+
if (properties) {
3264+
if (UNEXPECTED(GC_REFCOUNT(properties) > 1)) {
3265+
if (EXPECTED(!(GC_FLAGS(properties) & IS_ARRAY_IMMUTABLE))) {
3266+
GC_DELREF(properties);
32643267
}
3265-
zobj->properties = zend_array_dup(zobj->properties);
3268+
properties = zobj->properties = zend_array_dup(properties);
32663269
}
32673270
} else {
3268-
zobj->properties = zobj->handlers->get_properties(zobj);
3271+
properties = zobj->handlers->get_properties(zobj);
32693272
}
3270-
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(zobj->properties, 0);
3273+
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(properties, 0);
32713274

32723275
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
32733276
} else {
@@ -19518,22 +19521,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_TMP_HANDLER(ZE
1951819521
} else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
1951919522
zend_object *zobj = Z_OBJ_P(array_ptr);
1952019523
if (!zobj->ce->get_iterator) {
19524+
HashTable *properties;
19525+
1952119526
result = EX_VAR(opline->result.var);
1952219527
ZVAL_OBJ(result, zobj);
1952319528
if (IS_TMP_VAR != IS_TMP_VAR) {
1952419529
GC_ADDREF(zobj);
1952519530
}
19526-
if (zobj->properties) {
19527-
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
19528-
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
19529-
GC_DELREF(zobj->properties);
19531+
properties = zobj->properties;
19532+
if (properties) {
19533+
if (UNEXPECTED(GC_REFCOUNT(properties) > 1)) {
19534+
if (EXPECTED(!(GC_FLAGS(properties) & IS_ARRAY_IMMUTABLE))) {
19535+
GC_DELREF(properties);
1953019536
}
19531-
zobj->properties = zend_array_dup(zobj->properties);
19537+
properties = zobj->properties = zend_array_dup(properties);
1953219538
}
1953319539
} else {
19534-
zobj->properties = zobj->handlers->get_properties(zobj);
19540+
properties = zobj->handlers->get_properties(zobj);
1953519541
}
19536-
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(zobj->properties, 0);
19542+
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(properties, 0);
1953719543

1953819544
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
1953919545
} else {
@@ -23022,22 +23028,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_VAR_HANDLER(ZE
2302223028
} else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
2302323029
zend_object *zobj = Z_OBJ_P(array_ptr);
2302423030
if (!zobj->ce->get_iterator) {
23031+
HashTable *properties;
23032+
2302523033
result = EX_VAR(opline->result.var);
2302623034
ZVAL_OBJ(result, zobj);
2302723035
if (IS_VAR != IS_TMP_VAR) {
2302823036
GC_ADDREF(zobj);
2302923037
}
23030-
if (zobj->properties) {
23031-
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
23032-
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
23033-
GC_DELREF(zobj->properties);
23038+
properties = zobj->properties;
23039+
if (properties) {
23040+
if (UNEXPECTED(GC_REFCOUNT(properties) > 1)) {
23041+
if (EXPECTED(!(GC_FLAGS(properties) & IS_ARRAY_IMMUTABLE))) {
23042+
GC_DELREF(properties);
2303423043
}
23035-
zobj->properties = zend_array_dup(zobj->properties);
23044+
properties = zobj->properties = zend_array_dup(properties);
2303623045
}
2303723046
} else {
23038-
zobj->properties = zobj->handlers->get_properties(zobj);
23047+
properties = zobj->handlers->get_properties(zobj);
2303923048
}
23040-
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(zobj->properties, 0);
23049+
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(properties, 0);
2304123050

2304223051
zval_ptr_dtor_nogc(free_op1);
2304323052
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
@@ -42154,22 +42163,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_R_SPEC_CV_HANDLER(ZEN
4215442163
} else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) {
4215542164
zend_object *zobj = Z_OBJ_P(array_ptr);
4215642165
if (!zobj->ce->get_iterator) {
42166+
HashTable *properties;
42167+
4215742168
result = EX_VAR(opline->result.var);
4215842169
ZVAL_OBJ(result, zobj);
4215942170
if (IS_CV != IS_TMP_VAR) {
4216042171
GC_ADDREF(zobj);
4216142172
}
42162-
if (zobj->properties) {
42163-
if (UNEXPECTED(GC_REFCOUNT(zobj->properties) > 1)) {
42164-
if (EXPECTED(!(GC_FLAGS(zobj->properties) & IS_ARRAY_IMMUTABLE))) {
42165-
GC_DELREF(zobj->properties);
42173+
properties = zobj->properties;
42174+
if (properties) {
42175+
if (UNEXPECTED(GC_REFCOUNT(properties) > 1)) {
42176+
if (EXPECTED(!(GC_FLAGS(properties) & IS_ARRAY_IMMUTABLE))) {
42177+
GC_DELREF(properties);
4216642178
}
42167-
zobj->properties = zend_array_dup(zobj->properties);
42179+
properties = zobj->properties = zend_array_dup(properties);
4216842180
}
4216942181
} else {
42170-
zobj->properties = zobj->handlers->get_properties(zobj);
42182+
properties = zobj->handlers->get_properties(zobj);
4217142183
}
42172-
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(zobj->properties, 0);
42184+
Z_FE_ITER_P(EX_VAR(opline->result.var)) = zend_hash_iterator_add(properties, 0);
4217342185

4217442186
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
4217542187
} else {

0 commit comments

Comments
 (0)