From d93b09458430dae6fa6475d09811673520338597 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 27 Aug 2019 09:37:48 +0200 Subject: [PATCH] Throw TypeError from VM implementation of get_class() 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 | 20 +-- Zend/zend_builtin_functions.c | 2 +- Zend/zend_vm_def.h | 4 +- Zend/zend_vm_execute.h | 16 +-- .../class_object/get_class_variation_001.phpt | 116 +++++------------- 5 files changed, 57 insertions(+), 101 deletions(-) diff --git a/Zend/tests/009.phpt b/Zend/tests/009.phpt index 4a34fe4c84..15449df3d1 100644 --- a/Zend/tests/009.phpt +++ b/Zend/tests/009.phpt @@ -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 diff --git a/Zend/zend_builtin_functions.c b/Zend/zend_builtin_functions.c index be566ae681..cc372c4ee8 100644 --- a/Zend/zend_builtin_functions.c +++ b/Zend/zend_builtin_functions.c @@ -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) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index a0aead301c..8001dbe8fa 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -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; } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 29d6d3e778..dcb735b490 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -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; } diff --git a/ext/standard/tests/class_object/get_class_variation_001.phpt b/ext/standard/tests/class_object/get_class_variation_001.phpt index b142f8ace9..8c1543d711 100644 --- a/ext/standard/tests/class_object/get_class_variation_001.phpt +++ b/ext/standard/tests/class_object/get_class_variation_001.phpt @@ -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 -- 2.50.1