zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = RT_CONSTANT(opline, opline->op1);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = RT_CONSTANT(opline, opline->op1);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = RT_CONSTANT(opline, opline->op1);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = RT_CONSTANT(opline, opline->op1);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
zval *container;
zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = RT_CONSTANT(opline, opline->op1);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = RT_CONSTANT(opline, opline->op1);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_tmp(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
zval *container;
zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
zval *container;
zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_R(opline->op1.var EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_INFO_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
zend_string_release(property_name);
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_R, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_R, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval);
zval *container;
zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_cv_BP_VAR_IS(opline->op1.var EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CONST == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CONST == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
zval *container;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if (IS_CV == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if (IS_CV == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);
zval *container;
zend_free_op free_op2;
zval *offset;
+ void **cache_slot = NULL;
SAVE_OPLINE();
container = _get_zval_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC);
zend_object *zobj = Z_OBJ_P(container);
zval *retval;
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST &&
- EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) {
- uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*));
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ cache_slot = CACHE_ADDR(Z_CACHE_SLOT_P(offset));
- if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
- retval = OBJ_PROP(zobj, prop_offset);
- if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
- }
- } else if (EXPECTED(zobj->properties != NULL)) {
- retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
- if (EXPECTED(retval)) {
- ZVAL_COPY(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) {
+ uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR_EX(cache_slot + 1);
+
+ if (EXPECTED(IS_VALID_PROPERTY_OFFSET(prop_offset))) {
+ retval = OBJ_PROP(zobj, prop_offset);
+ if (EXPECTED(Z_TYPE_P(retval) != IS_UNDEF)) {
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
+ } else if (EXPECTED(zobj->properties != NULL)) {
+ if (!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET(prop_offset)) {
+ uint32_t idx = ZEND_DECODE_DYN_PROP_OFFSET(prop_offset);
+
+ if (EXPECTED(idx < zobj->properties->nNumUsed)) {
+ Bucket *p = zobj->properties->arData + idx;
+
+ if (EXPECTED(Z_TYPE(p->val) != IS_UNDEF) &&
+ (EXPECTED(p->key == Z_STR_P(offset)) ||
+ (EXPECTED(p->h == ZSTR_H(Z_STR_P(offset))) &&
+ EXPECTED(p->key != NULL) &&
+ EXPECTED(ZSTR_LEN(p->key) == Z_STRLEN_P(offset)) &&
+ EXPECTED(memcmp(ZSTR_VAL(p->key), Z_STRVAL_P(offset), Z_STRLEN_P(offset)) == 0)))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), &p->val);
+ break;
+ }
+ }
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_DYNAMIC_PROPERTY_OFFSET);
+ }
+ retval = zend_hash_find(zobj->properties, Z_STR_P(offset));
+ if (EXPECTED(retval)) {
+ uint32_t idx = ((char*)retval - (char*)zobj->properties->arData) / sizeof(Bucket);
+ CACHE_PTR_EX(cache_slot + 1, (void*)(uintptr_t)ZEND_ENCODE_DYN_PROP_OFFSET(idx));
+ ZVAL_COPY(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
}
}
ZVAL_NULL(EX_VAR(opline->result.var));
} else {
- retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var));
+ retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, cache_slot, EX_VAR(opline->result.var));
if (retval != EX_VAR(opline->result.var)) {
ZVAL_COPY(EX_VAR(opline->result.var), retval);