don't crash if user extends abstract classes
[m6w6/ext-http] / php_http_client_factory.c
index 45986c417d3f7ca81b604cc26ab1c75087620fcb..aba4b6444b9848d0049f7e90b18dc7703b8b9511 100644 (file)
@@ -55,7 +55,7 @@ static zend_class_entry *php_http_client_factory_get_class_entry(zval *this_ptr,
 #define PHP_HTTP_REQUEST_FACTORY_ALIAS(method, func)   PHP_HTTP_STATIC_ME_ALIAS(method, func, PHP_HTTP_ARGS(HttpClientFactory, method))
 #define PHP_HTTP_REQUEST_FACTORY_MALIAS(me, al, vis)   ZEND_FENTRY(me, ZEND_MN(HttpClientFactory_##al), PHP_HTTP_ARGS(HttpClientFactory, al), vis)
 
-PHP_HTTP_BEGIN_ARGS(__construct, 1)
+PHP_HTTP_BEGIN_ARGS(__construct, 0)
        PHP_HTTP_ARG_VAL(options, 0)
 PHP_HTTP_END_ARGS;
 PHP_HTTP_BEGIN_ARGS(createClient, 0)
@@ -116,7 +116,7 @@ PHP_METHOD(HttpClientFactory, createClient)
        with_error_handling(EH_THROW, php_http_exception_class_entry) {
                if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!", &options)) {
                        with_error_handling(EH_THROW, php_http_exception_class_entry) {
-                               zval *zdriver, *os;
+                               zval *zdriver;
                                zend_object_value ov;
                                zend_class_entry *class_entry = NULL;
                                php_http_client_t *req = NULL;
@@ -150,8 +150,7 @@ PHP_METHOD(HttpClientFactory, createClient)
 
                                                if (SUCCESS == php_http_new(&ov, class_entry, driver.client_ops->create_object, driver.client_ops->class_entry(), req, NULL TSRMLS_CC)) {
                                                        ZVAL_OBJVAL(return_value, ov, 0);
-
-                                                       zend_call_method_with_1_params(&return_value, Z_OBJCE_P(return_value), NULL, "__construct", NULL, options);
+                                                       zend_call_method(&return_value, Z_OBJCE_P(return_value), NULL, ZEND_STRL("__construct"), NULL, !!options, options, NULL TSRMLS_CC);
                                                } else {
                                                        php_http_client_free(&req);
                                                }
@@ -209,7 +208,7 @@ PHP_METHOD(HttpClientFactory, createPool)
                                                if (SUCCESS == php_http_new(&ov, class_entry, driver.client_pool_ops->create_object, driver.client_pool_ops->class_entry(), pool, NULL TSRMLS_CC)) {
                                                        ZVAL_OBJVAL(return_value, ov, 0);
                                                        for (i = 0; i < argc; ++i) {
-                                                               if (Z_TYPE_PP(argv[i]) == IS_OBJECT && instanceof_function(Z_OBJCE_PP(argv[i]), php_http_client_class_entry TSRMLS_CC)) {
+                                                               if (Z_TYPE_PP(argv[i]) == IS_OBJECT && instanceof_function(Z_OBJCE_PP(argv[i]), php_http_client_get_class_entry() TSRMLS_CC)) {
                                                                        php_http_client_pool_attach(pool, *(argv[i]));
                                                                }
                                                        }
@@ -270,7 +269,7 @@ PHP_METHOD(HttpClientFactory, createDataShare)
                                                if (SUCCESS == php_http_new(&ov, class_entry, driver.client_datashare_ops->create_object, driver.client_datashare_ops->class_entry(), share, NULL TSRMLS_CC)) {
                                                        ZVAL_OBJVAL(return_value, ov, 0);
                                                        for (i = 0; i < argc; ++i) {
-                                                               if (Z_TYPE_PP(argv[i]) == IS_OBJECT && instanceof_function(Z_OBJCE_PP(argv[i]), php_http_client_class_entry TSRMLS_CC)) {
+                                                               if (Z_TYPE_PP(argv[i]) == IS_OBJECT && instanceof_function(Z_OBJCE_PP(argv[i]), php_http_client_get_class_entry() TSRMLS_CC)) {
                                                                        php_http_client_datashare_attach(share, *(argv[i]));
                                                                }
                                                        }