]> granicus.if.org Git - php/commitdiff
Throw TypeError from VM implementation of get_class()
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 27 Aug 2019 07:37:48 +0000 (09:37 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 27 Aug 2019 07:37:48 +0000 (09:37 +0200)
The normal function already throws TypeError through the usual zpp
mechanism, but the VM implementation handles this manually and has
not been updated.

Zend/tests/009.phpt
Zend/zend_builtin_functions.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h
ext/standard/tests/class_object/get_class_variation_001.phpt

index 4a34fe4c84b4542710d15b87088efba04d6655c2..15449df3d1fa893571bdb6f7c50d7eb645f32ee2 100644 (file)
@@ -9,7 +9,11 @@ class foo {
        }
     function testNull ()
     {
-        var_dump(get_class(null));
+        try {
+            var_dump(get_class(null));
+        } catch (TypeError $e) {
+            echo $e->getMessage(), "\n";
+        }
     }
 }
 
@@ -23,7 +27,11 @@ $f1->bar();
 $f2->bar();
 
 var_dump(get_class());
-var_dump(get_class("qwerty"));
+try {
+    var_dump(get_class("qwerty"));
+} catch (TypeError $e) {
+    echo $e->getMessage(), "\n";
+}
 
 var_dump(get_class($f1));
 var_dump(get_class($f2));
@@ -38,12 +46,8 @@ string(3) "foo"
 
 Warning: get_class() called without object from outside a class in %s on line %d
 bool(false)
-
-Warning: get_class() expects parameter 1 to be object, string given in %s on line %d
-bool(false)
+get_class() expects parameter 1 to be object, string given
 string(3) "foo"
 string(4) "foo2"
-
-Warning: get_class() expects parameter 1 to be object, null given in %s on line %d
-bool(false)
+get_class() expects parameter 1 to be object, null given
 Done
index be566ae681e95f44701c5f5216b72a43a7560124..cc372c4ee82a8d27a786c7df197e4acaaea8713c 100644 (file)
@@ -735,7 +735,7 @@ ZEND_FUNCTION(get_class)
        zval *obj = NULL;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS(), "|o", &obj) == FAILURE) {
-               RETURN_FALSE;
+               return;
        }
 
        if (!obj) {
index a0aead301ce745f54341d5bbe9769d8ff89f9da8..8001dbe8fa388451614fcf43b724653e60693bd9 100644 (file)
@@ -8654,8 +8654,8 @@ ZEND_VM_COLD_CONST_HANDLER(191, ZEND_GET_CLASS, UNUSED|CONST|TMPVAR|CV, UNUSED)
                                if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
                                        ZVAL_UNDEFINED_OP1();
                                }
-                               zend_error(E_WARNING, "get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
-                               ZVAL_FALSE(EX_VAR(opline->result.var));
+                               zend_type_error("get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                        }
                        break;
                }
index 29d6d3e778985ebfb39b1cf82775723836f6271b..dcb735b49073109f8885d73857db4c5682a1208e 100644 (file)
@@ -9596,8 +9596,8 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_CO
                                if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
                                        ZVAL_UNDEFINED_OP1();
                                }
-                               zend_error(E_WARNING, "get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
-                               ZVAL_FALSE(EX_VAR(opline->result.var));
+                               zend_type_error("get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                        }
                        break;
                }
@@ -16725,8 +16725,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED_H
                                if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
                                        ZVAL_UNDEFINED_OP1();
                                }
-                               zend_error(E_WARNING, "get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
-                               ZVAL_FALSE(EX_VAR(opline->result.var));
+                               zend_type_error("get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                        }
                        break;
                }
@@ -34885,8 +34885,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_UNUSED_UNUSED_H
                                if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
                                        ZVAL_UNDEFINED_OP1();
                                }
-                               zend_error(E_WARNING, "get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
-                               ZVAL_FALSE(EX_VAR(opline->result.var));
+                               zend_type_error("get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                        }
                        break;
                }
@@ -47361,8 +47361,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_CV_UNUSED_HANDL
                                if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
                                        ZVAL_UNDEFINED_OP1();
                                }
-                               zend_error(E_WARNING, "get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
-                               ZVAL_FALSE(EX_VAR(opline->result.var));
+                               zend_type_error("get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
+                               ZVAL_UNDEF(EX_VAR(opline->result.var));
                        }
                        break;
                }
index b142f8ace9d5f7de70544037424685784857d25b..8c1543d71153a8b347fa116151777d90f6430b6e 100644 (file)
@@ -67,8 +67,12 @@ $values = array(
 // loop through each element of the array for object
 
 foreach($values as $value) {
-      echo @"\nArg value: $value (type: " . gettype($value) . ")\n";
-      var_dump( get_class($value) );
+    echo @"\nArg value: $value (type: " . gettype($value) . ")\n";
+    try {
+        var_dump( get_class($value) );
+    } catch (TypeError $e) {
+        echo $e->getMessage(), "\n";
+    }
 };
 
 echo "Done";
@@ -76,137 +80,85 @@ echo "Done";
 --EXPECTF--
 *** Testing get_class() : usage variations ***
 
-Notice: Undefined variable: undefined_var in %sget_class_variation_001.php on line 58
+Notice: Undefined variable: undefined_var in %s on line %d
 
-Notice: Undefined variable: unset_var in %sget_class_variation_001.php on line 61
+Notice: Undefined variable: unset_var in %s on line %d
 
 Arg value: 0 (type: integer)
-
-Warning: get_class() expects parameter 1 to be object, int given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, int given
 
 Arg value: 1 (type: integer)
-
-Warning: get_class() expects parameter 1 to be object, int given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, int given
 
 Arg value: 12345 (type: integer)
-
-Warning: get_class() expects parameter 1 to be object, int given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, int given
 
 Arg value: -2345 (type: integer)
-
-Warning: get_class() expects parameter 1 to be object, int given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, int given
 
 Arg value: 10.5 (type: double)
-
-Warning: get_class() expects parameter 1 to be object, float given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, float given
 
 Arg value: -10.5 (type: double)
-
-Warning: get_class() expects parameter 1 to be object, float given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, float given
 
 Arg value: 101234567000 (type: double)
-
-Warning: get_class() expects parameter 1 to be object, float given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, float given
 
 Arg value: 1.07654321E-9 (type: double)
-
-Warning: get_class() expects parameter 1 to be object, float given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, float given
 
 Arg value: 0.5 (type: double)
-
-Warning: get_class() expects parameter 1 to be object, float given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, float given
 
 Arg value: Array (type: array)
-
-Warning: get_class() expects parameter 1 to be object, array given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, array given
 
 Arg value: Array (type: array)
-
-Warning: get_class() expects parameter 1 to be object, array given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, array given
 
 Arg value: Array (type: array)
-
-Warning: get_class() expects parameter 1 to be object, array given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, array given
 
 Arg value: Array (type: array)
-
-Warning: get_class() expects parameter 1 to be object, array given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, array given
 
 Arg value: Array (type: array)
-
-Warning: get_class() expects parameter 1 to be object, array given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, array given
 
 Arg value:  (type: NULL)
-
-Warning: get_class() expects parameter 1 to be object, null given in %s on line %d
-bool(false)
+get_class() expects parameter 1 to be object, null given
 
 Arg value:  (type: NULL)
-
-Warning: get_class() expects parameter 1 to be object, null given in %s on line %d
-bool(false)
+get_class() expects parameter 1 to be object, null given
 
 Arg value: 1 (type: boolean)
-
-Warning: get_class() expects parameter 1 to be object, bool given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, bool given
 
 Arg value:  (type: boolean)
-
-Warning: get_class() expects parameter 1 to be object, bool given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, bool given
 
 Arg value: 1 (type: boolean)
-
-Warning: get_class() expects parameter 1 to be object, bool given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, bool given
 
 Arg value:  (type: boolean)
-
-Warning: get_class() expects parameter 1 to be object, bool given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, bool given
 
 Arg value:  (type: string)
-
-Warning: get_class() expects parameter 1 to be object, string given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, string given
 
 Arg value:  (type: string)
-
-Warning: get_class() expects parameter 1 to be object, string given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, string given
 
 Arg value: string (type: string)
-
-Warning: get_class() expects parameter 1 to be object, string given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, string given
 
 Arg value: string (type: string)
-
-Warning: get_class() expects parameter 1 to be object, string given in %sget_class_variation_001.php on line %d
-bool(false)
+get_class() expects parameter 1 to be object, string given
 
 Arg value:  (type: NULL)
-
-Warning: get_class() expects parameter 1 to be object, null given in %s on line %d
-bool(false)
+get_class() expects parameter 1 to be object, null given
 
 Arg value:  (type: NULL)
-
-Warning: get_class() expects parameter 1 to be object, null given in %s on line %d
-bool(false)
+get_class() expects parameter 1 to be object, null given
 Done