]> granicus.if.org Git - php/commitdiff
Promote warnings to Error in COM extension
authorGeorge Peter Banyard <girgias@php.net>
Wed, 16 Sep 2020 00:03:46 +0000 (02:03 +0200)
committerGeorge Peter Banyard <girgias@php.net>
Mon, 21 Sep 2020 13:32:00 +0000 (14:32 +0100)
Closes GH-6141

ext/com_dotnet/com_com.c
ext/com_dotnet/com_extension.stub.php
ext/com_dotnet/com_extension_arginfo.h
ext/com_dotnet/com_handlers.c
ext/com_dotnet/com_iterator.c
ext/com_dotnet/com_misc.c
ext/com_dotnet/com_saproxy.c
ext/com_dotnet/com_typeinfo.c
ext/com_dotnet/com_variant.c
ext/com_dotnet/tests/bug72498.phpt

index 45080ba39590a6e89b31cc63dc4fa59e20d52499..3282bd9e5043c9418dbf11736a13cf9e072959b9 100644 (file)
@@ -746,7 +746,8 @@ PHP_FUNCTION(com_event_sink)
 /* {{{ Print out a PHP class definition for a dispatchable interface */
 PHP_FUNCTION(com_print_typeinfo)
 {
-       zval *arg1;
+       zend_object *object_zpp;
+       zend_string *typelib_name_zpp = NULL;
        char *ifacename = NULL;
        char *typelibname = NULL;
        size_t ifacelen;
@@ -754,17 +755,18 @@ PHP_FUNCTION(com_print_typeinfo)
        php_com_dotnet_object *obj = NULL;
        ITypeInfo *typeinfo;
 
-       if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS(), "z/|s!b", &arg1, &ifacename,
-                               &ifacelen, &wantsink)) {
-               RETURN_THROWS();
-       }
+       ZEND_PARSE_PARAMETERS_START(1, 3)
+               Z_PARAM_OBJ_OF_CLASS_OR_STR(object_zpp, php_com_variant_class_entry, typelib_name_zpp)
+               Z_PARAM_OPTIONAL
+               Z_PARAM_STRING_OR_NULL(ifacename, ifacelen)
+               Z_PARAM_BOOL(wantsink)
+       ZEND_PARSE_PARAMETERS_END();
 
        php_com_initialize();
-       if (Z_TYPE_P(arg1) == IS_OBJECT) {
-               CDNO_FETCH_VERIFY(obj, arg1);
+       if (object_zpp) {
+               obj = (php_com_dotnet_object*)object_zpp;
        } else {
-               convert_to_string(arg1);
-               typelibname = Z_STRVAL_P(arg1);
+               typelibname = ZSTR_VAL(typelib_name_zpp);
        }
 
        typeinfo = php_com_locate_typeinfo(typelibname, obj, ifacename, wantsink ? 1 : 0);
@@ -772,9 +774,9 @@ PHP_FUNCTION(com_print_typeinfo)
                php_com_process_typeinfo(typeinfo, NULL, 1, NULL, obj ? obj->code_page : COMG(code_page));
                ITypeInfo_Release(typeinfo);
                RETURN_TRUE;
-       } else {
-               zend_error(E_WARNING, "Unable to find typeinfo using the parameters supplied");
        }
+
+       php_error_docref(NULL, E_WARNING, "Unable to find typeinfo using the parameters supplied");
        RETURN_FALSE;
 }
 /* }}} */
index 9b1edf9d38d23562ef3f48e8996f06203b90dbf1..7d451e5baf52557accc84c3b470c05f3e985aee9 100644 (file)
@@ -46,7 +46,7 @@ function variant_cmp(mixed $left, mixed $right, int $lcid = LOCALE_SYSTEM_DEFAUL
 
 function variant_date_to_timestamp(variant $variant): ?int {}
 
-function variant_date_from_timestamp(int $timestamp): variant|false {}
+function variant_date_from_timestamp(int $timestamp): variant {}
 
 function variant_get_type(variant $variant): int {}
 
index 3e583c321108bd1de985dc5094de8a45dd8f8eab..074cb8575006d42de8f63f359c14d7458c976cab 100644 (file)
@@ -1,5 +1,5 @@
 /* This is a generated file, edit the .stub.php file instead.
- * Stub hash: f78e9db58131f9d67021eaea4c3d4be75cafe2ac */
+ * Stub hash: 637bee9d71fb0d566ce38004eec8bc6f75656837 */
 
 ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_variant_set, 0, 2, IS_VOID, 0)
        ZEND_ARG_OBJ_INFO(0, variant, variant, 0)
@@ -63,7 +63,7 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_variant_date_to_timestamp, 0, 1,
        ZEND_ARG_OBJ_INFO(0, variant, variant, 0)
 ZEND_END_ARG_INFO()
 
-ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_variant_date_from_timestamp, 0, 1, variant, MAY_BE_FALSE)
+ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_variant_date_from_timestamp, 0, 1, variant, 0)
        ZEND_ARG_TYPE_INFO(0, timestamp, IS_LONG, 0)
 ZEND_END_ARG_INFO()
 
index 4ff80d96e929218aabb5547aabf4b0c63dc0a62a..fb4af4efec2c490cb2a11e54b2682723d19688e9 100644 (file)
@@ -203,18 +203,19 @@ static int com_property_exists(zend_object *object, zend_string *member, int che
 
 static int com_dimension_exists(zend_object *object, zval *member, int check_empty)
 {
-       php_error_docref(NULL, E_WARNING, "Operation not yet supported on a COM object");
+       /* TODO Add support */
+       zend_throw_error(NULL, "Cannot check dimension on a COM object");
        return 0;
 }
 
 static void com_property_delete(zend_object *object, zend_string *member, void **cache_slot)
 {
-       php_error_docref(NULL, E_WARNING, "Cannot delete properties from a COM object");
+       zend_throw_error(NULL, "Cannot delete properties from a COM object");
 }
 
 static void com_dimension_delete(zend_object *object, zval *offset)
 {
-       php_error_docref(NULL, E_WARNING, "Cannot delete properties from a COM object");
+       zend_throw_error(NULL, "Cannot delete dimension from a COM object");
 }
 
 static HashTable *com_properties_get(zend_object *object)
index 6126e958d5a4d3a2a40a8574e026cb3e16ef662f..66f885a9056ca50ca84420700d3d1515e713c3fa 100644 (file)
@@ -149,6 +149,7 @@ zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object, int b
        obj = CDNO_FETCH(object);
 
        if (V_VT(&obj->v) != VT_DISPATCH && !V_ISARRAY(&obj->v)) {
+               /* TODO Promote to TypeError? */
                php_error_docref(NULL, E_WARNING, "Variant is not an object or array VT=%d", V_VT(&obj->v));
                return NULL;
        }
@@ -172,6 +173,7 @@ zend_object_iterator *php_com_iter_get(zend_class_entry *ce, zval *object, int b
                dims = SafeArrayGetDim(V_ARRAY(&obj->v));
 
                if (dims != 1) {
+                       /* TODO Promote to ValueError? */
                        php_error_docref(NULL, E_WARNING,
                                   "Can only handle single dimension variant arrays (this array has %d)", dims);
                        goto fail;
index 24230761c167ff3ad1eaabd73d01d54297861c35..7f1ee3562de668de2e3c7866ceb0860dc3fb399e 100644 (file)
@@ -105,6 +105,7 @@ PHP_COM_DOTNET_API int php_com_safearray_get_elem(VARIANT *array, VARIANT *dest,
        dims = SafeArrayGetDim(V_ARRAY(array));
 
        if (dims != 1) {
+               /* TODO Promote to ValueError? */
                php_error_docref(NULL, E_WARNING,
                           "Can only handle single dimension variant arrays (this array has %d)", dims);
                return 0;
index 56f7fc684653fddc623dfb4718ab2f8e2f2b5b17..a138f796c3798ff629f3cadfb11bf987ff2359bd 100644 (file)
@@ -288,18 +288,19 @@ static int saproxy_property_exists(zend_object *object, zend_string *member, int
 
 static int saproxy_dimension_exists(zend_object *object, zval *member, int check_empty)
 {
-       php_error_docref(NULL, E_WARNING, "Operation not yet supported on a COM object");
+       /* TODO Add support */
+       zend_throw_error(NULL, "Cannot check dimension on a COM object");
        return 0;
 }
 
 static void saproxy_property_delete(zend_object *object, zend_string *member, void **cache_slot)
 {
-       php_error_docref(NULL, E_WARNING, "Cannot delete properties from a COM object");
+       zend_throw_error(NULL, "Cannot delete properties from a COM object");
 }
 
 static void saproxy_dimension_delete(zend_object *object, zval *offset)
 {
-       php_error_docref(NULL, E_WARNING, "Cannot delete properties from a COM object");
+       zend_throw_error(NULL, "Cannot delete dimension from a COM object");
 }
 
 static HashTable *saproxy_properties_get(zend_object *object)
index 4112b0ce06902929b38a6aaa3bacac3d622938fc..a036526d8bed643e81159ab1c7866f4b1e4d0e7b 100644 (file)
@@ -633,7 +633,7 @@ int php_com_process_typeinfo(ITypeInfo *typeinfo, HashTable *id_to_name, int pri
 
                ret = 1;
        } else {
-               zend_error(E_WARNING, "That's not a dispatchable interface!! type kind = %08x", attr->typekind);
+               zend_throw_error(NULL, "Type kind must be dispatchable, %08x given", attr->typekind);
        }
 
        ITypeInfo_ReleaseTypeAttr(typeinfo, attr);
index 949f3ca1dd5b48f26bc8bde083530640f6659811..1acae5242412a3a42337834aa2948e144ebc3ee9 100644 (file)
@@ -964,8 +964,8 @@ PHP_FUNCTION(variant_date_from_timestamp)
        }
 
        if (timestamp < 0) {
-               php_error_docref(NULL, E_WARNING, "Timestamp value must be a positive value.");
-               RETURN_FALSE;
+               zend_argument_value_error(1, "must be greater than or equal to 0");
+               RETURN_THROWS();
        }
 
        VariantInit(&res);
@@ -975,8 +975,8 @@ PHP_FUNCTION(variant_date_from_timestamp)
 
        /* Invalid after 23:59:59, December 31, 3000, UTC */
        if (!tmv) {
-               php_error_docref(NULL, E_WARNING, "Invalid timestamp " ZEND_LONG_FMT, timestamp);
-               RETURN_FALSE;
+               zend_argument_value_error(1, "must not go past 23:59:59, December 31, 3000, UTC");
+               RETURN_THROWS();
        }
 
        memset(&systime, 0, sizeof(systime));
index e43251bd3c7470f01d44d60759981265c78e248f..b9bd498af31a2f3a83d469e1847ddf5ec8aa879a 100644 (file)
@@ -8,8 +8,12 @@ if (!extension_loaded("com_dotnet")) print "skip COM/.Net support not present";
 <?php
 
 $v1 = PHP_INT_MAX;
-var_dump(variant_date_from_timestamp($v1));
+
+try {
+    var_dump(variant_date_from_timestamp($v1));
+} catch (\ValueError $e) {
+    echo $e->getMessage() . \PHP_EOL;
+}
 ?>
---EXPECTF--
-Warning: variant_date_from_timestamp(): Invalid timestamp %d in %sbug72498.php on line %d
-bool(false)
+--EXPECT--
+variant_date_from_timestamp(): Argument #1 ($timestamp) must not go past 23:59:59, December 31, 3000, UTC