summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-07-06 03:10:05 +0300
committerDmitry Stogov <dmitry@zend.com>2018-07-06 03:10:05 +0300
commitdcf7592076277be611f20cccf7865a66e62d1a5f (patch)
tree5cc7d2f27c861ba638b8c8edd98dc1758447f646
parentca40664ad62600f781f86755babdc61734b2fdbf (diff)
downloadphp-git-dcf7592076277be611f20cccf7865a66e62d1a5f.tar.gz
Optimize array to object casting
-rw-r--r--Zend/zend_vm_def.h14
-rw-r--r--Zend/zend_vm_execute.h56
2 files changed, 65 insertions, 5 deletions
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 4db0e7beba..e6d665a368 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -5309,7 +5309,7 @@ ZEND_VM_COLD_CONST_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
}
if (opline->extended_value == IS_ARRAY) {
- if (Z_TYPE_P(expr) != IS_OBJECT) {
+ if (OP1_TYPE == 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);
@@ -5321,6 +5321,18 @@ ZEND_VM_COLD_CONST_HANDLER(21, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
} 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);
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);