Skip to content

Commit d264057

Browse files
committed
Factor out object cast
1 parent d81b1b8 commit d264057

File tree

4 files changed

+29
-105
lines changed

4 files changed

+29
-105
lines changed

Zend/zend_ast.c

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -754,21 +754,8 @@ ZEND_API zend_result ZEND_FASTCALL zend_ast_evaluate_inner(
754754
}
755755
break;
756756
case IS_OBJECT:
757-
/* Adapted from VM */
758-
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
759-
if (Z_TYPE(op1) == IS_ARRAY) {
760-
HashTable *ht = zend_symtable_to_proptable(Z_ARR(op1));
761-
if (GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) {
762-
/* TODO: try not to duplicate immutable arrays as well ??? */
763-
ht = zend_array_dup(ht);
764-
}
765-
Z_OBJ_P(result)->properties = ht;
766-
zval_ptr_dtor_nogc(&op1);
767-
} else if (Z_TYPE(op1) != IS_NULL) {
768-
HashTable *ht = zend_new_array(1);
769-
Z_OBJ_P(result)->properties = ht;
770-
zend_hash_add_new(ht, ZSTR_KNOWN(ZEND_STR_SCALAR), &op1);
771-
}
757+
zend_cast_zval_to_object(result, &op1, IS_VAR);
758+
Z_TRY_DELREF(op1);
772759
break;
773760
EMPTY_SWITCH_DEFAULT_CASE();
774761
}

Zend/zend_execute.h

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,28 @@ static zend_always_inline void zend_safe_assign_to_variable_noref(zval *variable
219219
}
220220
}
221221

222+
static zend_always_inline void zend_cast_zval_to_object(zval *result, zval *expr, uint8_t op1_type) {
223+
HashTable *ht;
224+
225+
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
226+
if (Z_TYPE_P(expr) == IS_ARRAY) {
227+
ht = zend_symtable_to_proptable(Z_ARR_P(expr));
228+
if (GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) {
229+
/* TODO: try not to duplicate immutable arrays as well ??? */
230+
ht = zend_array_dup(ht);
231+
}
232+
Z_OBJ_P(result)->properties = ht;
233+
} else if (Z_TYPE_P(expr) != IS_NULL) {
234+
Z_OBJ_P(result)->properties = ht = zend_new_array(1);
235+
expr = zend_hash_add_new(ht, ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
236+
if (op1_type == IS_CONST) {
237+
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
238+
} else {
239+
if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
240+
}
241+
}
242+
}
243+
222244
ZEND_API zend_result ZEND_FASTCALL zval_update_constant(zval *pp);
223245
ZEND_API zend_result ZEND_FASTCALL zval_update_constant_ex(zval *pp, zend_class_entry *scope);
224246
ZEND_API zend_result ZEND_FASTCALL zval_update_constant_with_ctx(zval *pp, zend_class_entry *scope, zend_ast_evaluate_ctx *ctx);

Zend/zend_vm_def.h

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6460,7 +6460,6 @@ ZEND_VM_COLD_CONST_HANDLER(51, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
64606460
USE_OPLINE
64616461
zval *expr;
64626462
zval *result = EX_VAR(opline->result.var);
6463-
HashTable *ht;
64646463

64656464
SAVE_OPLINE();
64666465
expr = GET_OP1_ZVAL_PTR(BP_VAR_R);
@@ -6524,23 +6523,7 @@ ZEND_VM_COLD_CONST_HANDLER(51, ZEND_CAST, CONST|TMP|VAR|CV, ANY, TYPE)
65246523
}
65256524
} else {
65266525
ZEND_ASSERT(opline->extended_value == IS_OBJECT);
6527-
ZVAL_OBJ(result, zend_objects_new(zend_standard_class_def));
6528-
if (Z_TYPE_P(expr) == IS_ARRAY) {
6529-
ht = zend_symtable_to_proptable(Z_ARR_P(expr));
6530-
if (GC_FLAGS(ht) & IS_ARRAY_IMMUTABLE) {
6531-
/* TODO: try not to duplicate immutable arrays as well ??? */
6532-
ht = zend_array_dup(ht);
6533-
}
6534-
Z_OBJ_P(result)->properties = ht;
6535-
} else if (Z_TYPE_P(expr) != IS_NULL) {
6536-
Z_OBJ_P(result)->properties = ht = zend_new_array(1);
6537-
expr = zend_hash_add_new(ht, ZSTR_KNOWN(ZEND_STR_SCALAR), expr);
6538-
if (OP1_TYPE == IS_CONST) {
6539-
if (UNEXPECTED(Z_OPT_REFCOUNTED_P(expr))) Z_ADDREF_P(expr);
6540-
} else {
6541-
if (Z_OPT_REFCOUNTED_P(expr)) Z_ADDREF_P(expr);
6542-
}
6543-
}
6526+
zend_cast_zval_to_object(result, expr, OP1_TYPE);
65446527
}
65456528
}
65466529

Zend/zend_vm_execute.h

Lines changed: 4 additions & 72 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)