Skip to content

Commit d93b094

Browse files
committed
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.
1 parent f107b67 commit d93b094

File tree

5 files changed

+57
-101
lines changed

5 files changed

+57
-101
lines changed

Zend/tests/009.phpt

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,11 @@ class foo {
99
}
1010
function testNull ()
1111
{
12-
var_dump(get_class(null));
12+
try {
13+
var_dump(get_class(null));
14+
} catch (TypeError $e) {
15+
echo $e->getMessage(), "\n";
16+
}
1317
}
1418
}
1519

@@ -23,7 +27,11 @@ $f1->bar();
2327
$f2->bar();
2428

2529
var_dump(get_class());
26-
var_dump(get_class("qwerty"));
30+
try {
31+
var_dump(get_class("qwerty"));
32+
} catch (TypeError $e) {
33+
echo $e->getMessage(), "\n";
34+
}
2735

2836
var_dump(get_class($f1));
2937
var_dump(get_class($f2));
@@ -38,12 +46,8 @@ string(3) "foo"
3846

3947
Warning: get_class() called without object from outside a class in %s on line %d
4048
bool(false)
41-
42-
Warning: get_class() expects parameter 1 to be object, string given in %s on line %d
43-
bool(false)
49+
get_class() expects parameter 1 to be object, string given
4450
string(3) "foo"
4551
string(4) "foo2"
46-
47-
Warning: get_class() expects parameter 1 to be object, null given in %s on line %d
48-
bool(false)
52+
get_class() expects parameter 1 to be object, null given
4953
Done

Zend/zend_builtin_functions.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -735,7 +735,7 @@ ZEND_FUNCTION(get_class)
735735
zval *obj = NULL;
736736

737737
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|o", &obj) == FAILURE) {
738-
RETURN_FALSE;
738+
return;
739739
}
740740

741741
if (!obj) {

Zend/zend_vm_def.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8654,8 +8654,8 @@ ZEND_VM_COLD_CONST_HANDLER(191, ZEND_GET_CLASS, UNUSED|CONST|TMPVAR|CV, UNUSED)
86548654
if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
86558655
ZVAL_UNDEFINED_OP1();
86568656
}
8657-
zend_error(E_WARNING, "get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
8658-
ZVAL_FALSE(EX_VAR(opline->result.var));
8657+
zend_type_error("get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
8658+
ZVAL_UNDEF(EX_VAR(opline->result.var));
86598659
}
86608660
break;
86618661
}

Zend/zend_vm_execute.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9596,8 +9596,8 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_CO
95969596
if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
95979597
ZVAL_UNDEFINED_OP1();
95989598
}
9599-
zend_error(E_WARNING, "get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
9600-
ZVAL_FALSE(EX_VAR(opline->result.var));
9599+
zend_type_error("get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
9600+
ZVAL_UNDEF(EX_VAR(opline->result.var));
96019601
}
96029602
break;
96039603
}
@@ -16725,8 +16725,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_TMPVAR_UNUSED_H
1672516725
if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
1672616726
ZVAL_UNDEFINED_OP1();
1672716727
}
16728-
zend_error(E_WARNING, "get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
16729-
ZVAL_FALSE(EX_VAR(opline->result.var));
16728+
zend_type_error("get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
16729+
ZVAL_UNDEF(EX_VAR(opline->result.var));
1673016730
}
1673116731
break;
1673216732
}
@@ -34885,8 +34885,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_UNUSED_UNUSED_H
3488534885
if (IS_UNUSED == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
3488634886
ZVAL_UNDEFINED_OP1();
3488734887
}
34888-
zend_error(E_WARNING, "get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
34889-
ZVAL_FALSE(EX_VAR(opline->result.var));
34888+
zend_type_error("get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
34889+
ZVAL_UNDEF(EX_VAR(opline->result.var));
3489034890
}
3489134891
break;
3489234892
}
@@ -47361,8 +47361,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_CLASS_SPEC_CV_UNUSED_HANDL
4736147361
if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(op1) == IS_UNDEF)) {
4736247362
ZVAL_UNDEFINED_OP1();
4736347363
}
47364-
zend_error(E_WARNING, "get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
47365-
ZVAL_FALSE(EX_VAR(opline->result.var));
47364+
zend_type_error("get_class() expects parameter 1 to be object, %s given", zend_get_type_by_const(Z_TYPE_P(op1)));
47365+
ZVAL_UNDEF(EX_VAR(opline->result.var));
4736647366
}
4736747367
break;
4736847368
}

ext/standard/tests/class_object/get_class_variation_001.phpt

Lines changed: 34 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -67,146 +67,98 @@ $values = array(
6767
// loop through each element of the array for object
6868

6969
foreach($values as $value) {
70-
echo @"\nArg value: $value (type: " . gettype($value) . ")\n";
71-
var_dump( get_class($value) );
70+
echo @"\nArg value: $value (type: " . gettype($value) . ")\n";
71+
try {
72+
var_dump( get_class($value) );
73+
} catch (TypeError $e) {
74+
echo $e->getMessage(), "\n";
75+
}
7276
};
7377

7478
echo "Done";
7579
?>
7680
--EXPECTF--
7781
*** Testing get_class() : usage variations ***
7882

79-
Notice: Undefined variable: undefined_var in %sget_class_variation_001.php on line 58
83+
Notice: Undefined variable: undefined_var in %s on line %d
8084

81-
Notice: Undefined variable: unset_var in %sget_class_variation_001.php on line 61
85+
Notice: Undefined variable: unset_var in %s on line %d
8286

8387
Arg value: 0 (type: integer)
84-
85-
Warning: get_class() expects parameter 1 to be object, int given in %sget_class_variation_001.php on line %d
86-
bool(false)
88+
get_class() expects parameter 1 to be object, int given
8789

8890
Arg value: 1 (type: integer)
89-
90-
Warning: get_class() expects parameter 1 to be object, int given in %sget_class_variation_001.php on line %d
91-
bool(false)
91+
get_class() expects parameter 1 to be object, int given
9292

9393
Arg value: 12345 (type: integer)
94-
95-
Warning: get_class() expects parameter 1 to be object, int given in %sget_class_variation_001.php on line %d
96-
bool(false)
94+
get_class() expects parameter 1 to be object, int given
9795

9896
Arg value: -2345 (type: integer)
99-
100-
Warning: get_class() expects parameter 1 to be object, int given in %sget_class_variation_001.php on line %d
101-
bool(false)
97+
get_class() expects parameter 1 to be object, int given
10298

10399
Arg value: 10.5 (type: double)
104-
105-
Warning: get_class() expects parameter 1 to be object, float given in %sget_class_variation_001.php on line %d
106-
bool(false)
100+
get_class() expects parameter 1 to be object, float given
107101

108102
Arg value: -10.5 (type: double)
109-
110-
Warning: get_class() expects parameter 1 to be object, float given in %sget_class_variation_001.php on line %d
111-
bool(false)
103+
get_class() expects parameter 1 to be object, float given
112104

113105
Arg value: 101234567000 (type: double)
114-
115-
Warning: get_class() expects parameter 1 to be object, float given in %sget_class_variation_001.php on line %d
116-
bool(false)
106+
get_class() expects parameter 1 to be object, float given
117107

118108
Arg value: 1.07654321E-9 (type: double)
119-
120-
Warning: get_class() expects parameter 1 to be object, float given in %sget_class_variation_001.php on line %d
121-
bool(false)
109+
get_class() expects parameter 1 to be object, float given
122110

123111
Arg value: 0.5 (type: double)
124-
125-
Warning: get_class() expects parameter 1 to be object, float given in %sget_class_variation_001.php on line %d
126-
bool(false)
112+
get_class() expects parameter 1 to be object, float given
127113

128114
Arg value: Array (type: array)
129-
130-
Warning: get_class() expects parameter 1 to be object, array given in %sget_class_variation_001.php on line %d
131-
bool(false)
115+
get_class() expects parameter 1 to be object, array given
132116

133117
Arg value: Array (type: array)
134-
135-
Warning: get_class() expects parameter 1 to be object, array given in %sget_class_variation_001.php on line %d
136-
bool(false)
118+
get_class() expects parameter 1 to be object, array given
137119

138120
Arg value: Array (type: array)
139-
140-
Warning: get_class() expects parameter 1 to be object, array given in %sget_class_variation_001.php on line %d
141-
bool(false)
121+
get_class() expects parameter 1 to be object, array given
142122

143123
Arg value: Array (type: array)
144-
145-
Warning: get_class() expects parameter 1 to be object, array given in %sget_class_variation_001.php on line %d
146-
bool(false)
124+
get_class() expects parameter 1 to be object, array given
147125

148126
Arg value: Array (type: array)
149-
150-
Warning: get_class() expects parameter 1 to be object, array given in %sget_class_variation_001.php on line %d
151-
bool(false)
127+
get_class() expects parameter 1 to be object, array given
152128

153129
Arg value: (type: NULL)
154-
155-
Warning: get_class() expects parameter 1 to be object, null given in %s on line %d
156-
bool(false)
130+
get_class() expects parameter 1 to be object, null given
157131

158132
Arg value: (type: NULL)
159-
160-
Warning: get_class() expects parameter 1 to be object, null given in %s on line %d
161-
bool(false)
133+
get_class() expects parameter 1 to be object, null given
162134

163135
Arg value: 1 (type: boolean)
164-
165-
Warning: get_class() expects parameter 1 to be object, bool given in %sget_class_variation_001.php on line %d
166-
bool(false)
136+
get_class() expects parameter 1 to be object, bool given
167137

168138
Arg value: (type: boolean)
169-
170-
Warning: get_class() expects parameter 1 to be object, bool given in %sget_class_variation_001.php on line %d
171-
bool(false)
139+
get_class() expects parameter 1 to be object, bool given
172140

173141
Arg value: 1 (type: boolean)
174-
175-
Warning: get_class() expects parameter 1 to be object, bool given in %sget_class_variation_001.php on line %d
176-
bool(false)
142+
get_class() expects parameter 1 to be object, bool given
177143

178144
Arg value: (type: boolean)
179-
180-
Warning: get_class() expects parameter 1 to be object, bool given in %sget_class_variation_001.php on line %d
181-
bool(false)
145+
get_class() expects parameter 1 to be object, bool given
182146

183147
Arg value: (type: string)
184-
185-
Warning: get_class() expects parameter 1 to be object, string given in %sget_class_variation_001.php on line %d
186-
bool(false)
148+
get_class() expects parameter 1 to be object, string given
187149

188150
Arg value: (type: string)
189-
190-
Warning: get_class() expects parameter 1 to be object, string given in %sget_class_variation_001.php on line %d
191-
bool(false)
151+
get_class() expects parameter 1 to be object, string given
192152

193153
Arg value: string (type: string)
194-
195-
Warning: get_class() expects parameter 1 to be object, string given in %sget_class_variation_001.php on line %d
196-
bool(false)
154+
get_class() expects parameter 1 to be object, string given
197155

198156
Arg value: string (type: string)
199-
200-
Warning: get_class() expects parameter 1 to be object, string given in %sget_class_variation_001.php on line %d
201-
bool(false)
157+
get_class() expects parameter 1 to be object, string given
202158

203159
Arg value: (type: NULL)
204-
205-
Warning: get_class() expects parameter 1 to be object, null given in %s on line %d
206-
bool(false)
160+
get_class() expects parameter 1 to be object, null given
207161

208162
Arg value: (type: NULL)
209-
210-
Warning: get_class() expects parameter 1 to be object, null given in %s on line %d
211-
bool(false)
163+
get_class() expects parameter 1 to be object, null given
212164
Done

0 commit comments

Comments
 (0)