@@ -625,7 +625,6 @@ static bool do_fetch_class_prepare(pdo_stmt_t *stmt) /* {{{ */
625
625
626
626
if (ce -> constructor ) {
627
627
ZVAL_UNDEF (& fci -> function_name );
628
- fci -> retval = & stmt -> fetch .cls .retval ;
629
628
fci -> param_count = 0 ;
630
629
fci -> params = NULL ;
631
630
@@ -839,18 +838,18 @@ static bool do_fetch(pdo_stmt_t *stmt, zval *return_value, enum pdo_fetch_type h
839
838
}
840
839
}
841
840
if (ce -> constructor && (flags & PDO_FETCH_PROPS_LATE )) {
841
+ zval retval_constructor_call ;
842
+ stmt -> fetch .cls .fci .retval = & retval_constructor_call ;
842
843
stmt -> fetch .cls .fci .object = Z_OBJ_P (return_value );
843
844
stmt -> fetch .cls .fcc .object = Z_OBJ_P (return_value );
844
- if (zend_call_function (& stmt -> fetch .cls .fci , & stmt -> fetch .cls .fcc ) == FAILURE ) {
845
- /* TODO Error? */
846
- pdo_raise_impl_error (stmt -> dbh , stmt , "HY000" , "could not call class constructor" );
847
- return 0 ;
848
- } else {
849
- if (!Z_ISUNDEF (stmt -> fetch .cls .retval )) {
850
- zval_ptr_dtor (& stmt -> fetch .cls .retval );
851
- ZVAL_UNDEF (& stmt -> fetch .cls .retval );
852
- }
845
+ zend_call_function (& stmt -> fetch .cls .fci , & stmt -> fetch .cls .fcc );
846
+ if (Z_TYPE (retval_constructor_call ) == IS_UNDEF ) {
847
+ /* Exception has happened */
848
+ zval_ptr_dtor (return_value );
849
+ return false;
853
850
}
851
+ zval_ptr_dtor (& retval_constructor_call );
852
+ ZVAL_UNDEF (stmt -> fetch .cls .fci .retval );
854
853
}
855
854
}
856
855
break ;
@@ -985,17 +984,18 @@ static bool do_fetch(pdo_stmt_t *stmt, zval *return_value, enum pdo_fetch_type h
985
984
switch (how ) {
986
985
case PDO_FETCH_CLASS :
987
986
if (ce -> constructor && !(flags & (PDO_FETCH_PROPS_LATE | PDO_FETCH_SERIALIZE ))) {
987
+ zval retval_constructor_call ;
988
+ stmt -> fetch .cls .fci .retval = & retval_constructor_call ;
988
989
stmt -> fetch .cls .fci .object = Z_OBJ_P (return_value );
989
990
stmt -> fetch .cls .fcc .object = Z_OBJ_P (return_value );
990
- if (zend_call_function (& stmt -> fetch .cls .fci , & stmt -> fetch .cls .fcc ) == FAILURE ) {
991
- /* TODO Error? */
992
- pdo_raise_impl_error (stmt -> dbh , stmt , "HY000" , "could not call class constructor" );
993
- return 0 ;
994
- } else {
995
- if (!Z_ISUNDEF (stmt -> fetch .cls .retval )) {
996
- zval_ptr_dtor (& stmt -> fetch .cls .retval );
997
- }
991
+ zend_call_function (& stmt -> fetch .cls .fci , & stmt -> fetch .cls .fcc );
992
+ if (Z_TYPE (retval_constructor_call ) == IS_UNDEF ) {
993
+ /* Exception has happened */
994
+ zval_ptr_dtor (return_value );
995
+ return false;
998
996
}
997
+ zval_ptr_dtor (& retval_constructor_call );
998
+ ZVAL_UNDEF (stmt -> fetch .cls .fci .retval );
999
999
}
1000
1000
if (flags & PDO_FETCH_CLASSTYPE ) {
1001
1001
do_fetch_opt_finish (stmt , 0 );
0 commit comments