iliaa Tue, 13 Sep 2011 16:36:29 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=316667
Log: Improve parameter handling cod Changed paths: U php/php-src/branches/PHP_5_4/ext/pdo/pdo_stmt.c U php/php-src/trunk/ext/pdo/pdo_stmt.c Modified: php/php-src/branches/PHP_5_4/ext/pdo/pdo_stmt.c =================================================================== --- php/php-src/branches/PHP_5_4/ext/pdo/pdo_stmt.c 2011-09-13 16:21:24 UTC (rev 316666) +++ php/php-src/branches/PHP_5_4/ext/pdo/pdo_stmt.c 2011-09-13 16:36:29 UTC (rev 316667) @@ -1333,16 +1333,15 @@ long how = PDO_FETCH_CLASS; long ori = PDO_FETCH_ORI_NEXT; long off = 0; - char *class_name; + char *class_name = NULL; int class_name_len; zend_class_entry *old_ce; - zval *old_ctor_args, *ctor_args; + zval *old_ctor_args, *ctor_args = NULL; int error = 0, old_arg_count; PHP_STMT_GET_OBJ; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sz", - &class_name, &class_name_len, &ctor_args)) { + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!a", &class_name, &class_name_len, &ctor_args)) { RETURN_FALSE; } @@ -1357,17 +1356,8 @@ old_arg_count = stmt->fetch.cls.fci.param_count; do_fetch_opt_finish(stmt, 0 TSRMLS_CC); - - switch(ZEND_NUM_ARGS()) { - case 0: - stmt->fetch.cls.ce = zend_standard_class_def; - break; - case 2: - if (Z_TYPE_P(ctor_args) != IS_NULL && Z_TYPE_P(ctor_args) != IS_ARRAY) { - pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "ctor_args must be either NULL or an array" TSRMLS_CC); - error = 1; - break; - } + + if (ctor_args) { if (Z_TYPE_P(ctor_args) == IS_ARRAY && zend_hash_num_elements(Z_ARRVAL_P(ctor_args))) { ALLOC_ZVAL(stmt->fetch.cls.ctor_args); *stmt->fetch.cls.ctor_args = *ctor_args; @@ -1375,15 +1365,16 @@ } else { stmt->fetch.cls.ctor_args = NULL; } - /* no break */ - case 1: + } + if (class_name && !error) { stmt->fetch.cls.ce = zend_fetch_class(class_name, class_name_len, ZEND_FETCH_CLASS_AUTO TSRMLS_CC); if (!stmt->fetch.cls.ce) { pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "Could not find user-supplied class" TSRMLS_CC); error = 1; - break; } + } else if (!error) { + stmt->fetch.cls.ce = zend_standard_class_def; } if (!error && !do_fetch(stmt, TRUE, return_value, how, ori, off, 0 TSRMLS_CC)) { Modified: php/php-src/trunk/ext/pdo/pdo_stmt.c =================================================================== --- php/php-src/trunk/ext/pdo/pdo_stmt.c 2011-09-13 16:21:24 UTC (rev 316666) +++ php/php-src/trunk/ext/pdo/pdo_stmt.c 2011-09-13 16:36:29 UTC (rev 316667) @@ -1333,16 +1333,15 @@ long how = PDO_FETCH_CLASS; long ori = PDO_FETCH_ORI_NEXT; long off = 0; - char *class_name; + char *class_name = NULL; int class_name_len; zend_class_entry *old_ce; - zval *old_ctor_args, *ctor_args; + zval *old_ctor_args, *ctor_args = NULL; int error = 0, old_arg_count; PHP_STMT_GET_OBJ; - if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sz", - &class_name, &class_name_len, &ctor_args)) { + if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!a", &class_name, &class_name_len, &ctor_args)) { RETURN_FALSE; } @@ -1357,17 +1356,8 @@ old_arg_count = stmt->fetch.cls.fci.param_count; do_fetch_opt_finish(stmt, 0 TSRMLS_CC); - - switch(ZEND_NUM_ARGS()) { - case 0: - stmt->fetch.cls.ce = zend_standard_class_def; - break; - case 2: - if (Z_TYPE_P(ctor_args) != IS_NULL && Z_TYPE_P(ctor_args) != IS_ARRAY) { - pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "ctor_args must be either NULL or an array" TSRMLS_CC); - error = 1; - break; - } + + if (ctor_args) { if (Z_TYPE_P(ctor_args) == IS_ARRAY && zend_hash_num_elements(Z_ARRVAL_P(ctor_args))) { ALLOC_ZVAL(stmt->fetch.cls.ctor_args); *stmt->fetch.cls.ctor_args = *ctor_args; @@ -1375,15 +1365,16 @@ } else { stmt->fetch.cls.ctor_args = NULL; } - /* no break */ - case 1: + } + if (class_name && !error) { stmt->fetch.cls.ce = zend_fetch_class(class_name, class_name_len, ZEND_FETCH_CLASS_AUTO TSRMLS_CC); if (!stmt->fetch.cls.ce) { pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "Could not find user-supplied class" TSRMLS_CC); error = 1; - break; } + } else if (!error) { + stmt->fetch.cls.ce = zend_standard_class_def; } if (!error && !do_fetch(stmt, TRUE, return_value, how, ori, off, 0 TSRMLS_CC)) {
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php