diff options
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r-- | Zend/zend_vm_execute.h | 56 |
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); |