summaryrefslogtreecommitdiff
path: root/Zend/zend_vm_execute.h
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r--Zend/zend_vm_execute.h56
1 files changed, 52 insertions, 4 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index f1cd5c17d7..147c57a0d3 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -3251,7 +3251,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_H
}
if (opline->extended_value == IS_ARRAY) {
- if (Z_TYPE_P(expr) != IS_OBJECT) {
+ if (IS_CONST == IS_CONST || Z_TYPE_P(expr) != IS_OBJECT || Z_OBJCE_P(expr) == zend_ce_closure) {
if (Z_TYPE_P(expr) != IS_NULL) {
ZVAL_ARR(result, zend_new_array(1));
expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr);
@@ -3263,6 +3263,18 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CONST_H
} else {
ZVAL_EMPTY_ARRAY(result);
}
+ } else if (Z_OBJ_HT_P(expr)->get_properties) {
+ HashTable *obj_ht = Z_OBJ_HT_P(expr)->get_properties(expr);
+ if (obj_ht) {
+ /* fast copy */
+ obj_ht = zend_proptable_to_symtable(obj_ht,
+ (Z_OBJCE_P(expr)->default_properties_count ||
+ Z_OBJ_P(expr)->handlers != &std_object_handlers ||
+ GC_IS_RECURSIVE(obj_ht)));
+ ZVAL_ARR(result, obj_ht);
+ } else {
+ ZVAL_EMPTY_ARRAY(result);
+ }
} else {
ZVAL_COPY_VALUE(result, expr);
Z_ADDREF_P(result);
@@ -18075,7 +18087,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC
}
if (opline->extended_value == IS_ARRAY) {
- if (Z_TYPE_P(expr) != IS_OBJECT) {
+ if (IS_TMP_VAR == IS_CONST || Z_TYPE_P(expr) != IS_OBJECT || Z_OBJCE_P(expr) == zend_ce_closure) {
if (Z_TYPE_P(expr) != IS_NULL) {
ZVAL_ARR(result, zend_new_array(1));
expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr);
@@ -18087,6 +18099,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_TMP_HANDLER(ZEND_OPC
} else {
ZVAL_EMPTY_ARRAY(result);
}
+ } else if (Z_OBJ_HT_P(expr)->get_properties) {
+ HashTable *obj_ht = Z_OBJ_HT_P(expr)->get_properties(expr);
+ if (obj_ht) {
+ /* fast copy */
+ obj_ht = zend_proptable_to_symtable(obj_ht,
+ (Z_OBJCE_P(expr)->default_properties_count ||
+ Z_OBJ_P(expr)->handlers != &std_object_handlers ||
+ GC_IS_RECURSIVE(obj_ht)));
+ ZVAL_ARR(result, obj_ht);
+ } else {
+ ZVAL_EMPTY_ARRAY(result);
+ }
} else {
ZVAL_COPY_VALUE(result, expr);
Z_ADDREF_P(result);
@@ -21118,7 +21142,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC
}
if (opline->extended_value == IS_ARRAY) {
- if (Z_TYPE_P(expr) != IS_OBJECT) {
+ if (IS_VAR == IS_CONST || Z_TYPE_P(expr) != IS_OBJECT || Z_OBJCE_P(expr) == zend_ce_closure) {
if (Z_TYPE_P(expr) != IS_NULL) {
ZVAL_ARR(result, zend_new_array(1));
expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr);
@@ -21130,6 +21154,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_VAR_HANDLER(ZEND_OPC
} else {
ZVAL_EMPTY_ARRAY(result);
}
+ } else if (Z_OBJ_HT_P(expr)->get_properties) {
+ HashTable *obj_ht = Z_OBJ_HT_P(expr)->get_properties(expr);
+ if (obj_ht) {
+ /* fast copy */
+ obj_ht = zend_proptable_to_symtable(obj_ht,
+ (Z_OBJCE_P(expr)->default_properties_count ||
+ Z_OBJ_P(expr)->handlers != &std_object_handlers ||
+ GC_IS_RECURSIVE(obj_ht)));
+ ZVAL_ARR(result, obj_ht);
+ } else {
+ ZVAL_EMPTY_ARRAY(result);
+ }
} else {
ZVAL_COPY_VALUE(result, expr);
Z_ADDREF_P(result);
@@ -37227,7 +37263,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO
}
if (opline->extended_value == IS_ARRAY) {
- if (Z_TYPE_P(expr) != IS_OBJECT) {
+ if (IS_CV == IS_CONST || Z_TYPE_P(expr) != IS_OBJECT || Z_OBJCE_P(expr) == zend_ce_closure) {
if (Z_TYPE_P(expr) != IS_NULL) {
ZVAL_ARR(result, zend_new_array(1));
expr = zend_hash_index_add_new(Z_ARRVAL_P(result), 0, expr);
@@ -37239,6 +37275,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_CAST_SPEC_CV_HANDLER(ZEND_OPCO
} else {
ZVAL_EMPTY_ARRAY(result);
}
+ } else if (Z_OBJ_HT_P(expr)->get_properties) {
+ HashTable *obj_ht = Z_OBJ_HT_P(expr)->get_properties(expr);
+ if (obj_ht) {
+ /* fast copy */
+ obj_ht = zend_proptable_to_symtable(obj_ht,
+ (Z_OBJCE_P(expr)->default_properties_count ||
+ Z_OBJ_P(expr)->handlers != &std_object_handlers ||
+ GC_IS_RECURSIVE(obj_ht)));
+ ZVAL_ARR(result, obj_ht);
+ } else {
+ ZVAL_EMPTY_ARRAY(result);
+ }
} else {
ZVAL_COPY_VALUE(result, expr);
Z_ADDREF_P(result);