@@ -265,11 +265,11 @@ ZEND_API void zend_clear_exception(void) /* {{{ */
265
265
/* Same as writing to OBJ_PROP_NUM() when there are no hooks,
266
266
* but checks the offset is correct when Zend is built in debug mode.
267
267
* This is faster than going through the regular property write routine when the offset is known at compile time. */
268
- static void zend_update_property_num_checked (zend_object * object , uint32_t prop_num , zend_string * member , zval * value )
268
+ static void zend_update_property_num_checked (zend_class_entry * scope , zend_object * object , uint32_t prop_num , zend_string * member , zval * value )
269
269
{
270
270
if (UNEXPECTED (object -> ce -> num_hooked_props > 0 )) {
271
271
/* Property may have been overridden with a hook. */
272
- zend_update_property_ex (object -> ce , object , member , value );
272
+ zend_update_property_ex (scope != NULL ? scope : object -> ce , object , member , value );
273
273
zval_ptr_dtor (value );
274
274
return ;
275
275
}
@@ -302,19 +302,19 @@ static zend_object *zend_default_exception_new(zend_class_entry *class_type) /*
302
302
ZVAL_EMPTY_ARRAY (& trace );
303
303
}
304
304
305
- zend_update_property_num_checked (object , ZEND_EXCEPTION_TRACE_OFF , ZSTR_KNOWN (ZEND_STR_TRACE ), & trace );
305
+ zend_update_property_num_checked (NULL , object , ZEND_EXCEPTION_TRACE_OFF , ZSTR_KNOWN (ZEND_STR_TRACE ), & trace );
306
306
307
307
if (EXPECTED ((class_type != zend_ce_parse_error && class_type != zend_ce_compile_error )
308
308
|| !(filename = zend_get_compiled_filename ()))) {
309
309
ZVAL_STRING (& tmp , zend_get_executed_filename ());
310
- zend_update_property_num_checked (object , ZEND_EXCEPTION_FILE_OFF , ZSTR_KNOWN (ZEND_STR_FILE ), & tmp );
310
+ zend_update_property_num_checked (NULL , object , ZEND_EXCEPTION_FILE_OFF , ZSTR_KNOWN (ZEND_STR_FILE ), & tmp );
311
311
ZVAL_LONG (& tmp , zend_get_executed_lineno ());
312
- zend_update_property_num_checked (object , ZEND_EXCEPTION_LINE_OFF , ZSTR_KNOWN (ZEND_STR_LINE ), & tmp );
312
+ zend_update_property_num_checked (NULL , object , ZEND_EXCEPTION_LINE_OFF , ZSTR_KNOWN (ZEND_STR_LINE ), & tmp );
313
313
} else {
314
314
ZVAL_STR_COPY (& tmp , filename );
315
- zend_update_property_num_checked (object , ZEND_EXCEPTION_FILE_OFF , ZSTR_KNOWN (ZEND_STR_FILE ), & tmp );
315
+ zend_update_property_num_checked (NULL , object , ZEND_EXCEPTION_FILE_OFF , ZSTR_KNOWN (ZEND_STR_FILE ), & tmp );
316
316
ZVAL_LONG (& tmp , zend_get_compiled_lineno ());
317
- zend_update_property_num_checked (object , ZEND_EXCEPTION_LINE_OFF , ZSTR_KNOWN (ZEND_STR_LINE ), & tmp );
317
+ zend_update_property_num_checked (NULL , object , ZEND_EXCEPTION_LINE_OFF , ZSTR_KNOWN (ZEND_STR_LINE ), & tmp );
318
318
}
319
319
320
320
return object ;
@@ -344,17 +344,26 @@ ZEND_METHOD(Exception, __construct)
344
344
345
345
if (message ) {
346
346
ZVAL_STR_COPY (& tmp , message );
347
- zend_update_property_num_checked (Z_OBJ_P (object ), ZEND_EXCEPTION_MESSAGE_OFF , ZSTR_KNOWN (ZEND_STR_MESSAGE ), & tmp );
347
+ zend_update_property_num_checked (NULL , Z_OBJ_P (object ), ZEND_EXCEPTION_MESSAGE_OFF , ZSTR_KNOWN (ZEND_STR_MESSAGE ), & tmp );
348
+ if (UNEXPECTED (EG (exception ))) {
349
+ RETURN_THROWS ();
350
+ }
348
351
}
349
352
350
353
if (code ) {
351
354
ZVAL_LONG (& tmp , code );
352
- zend_update_property_num_checked (Z_OBJ_P (object ), ZEND_EXCEPTION_CODE_OFF , ZSTR_KNOWN (ZEND_STR_CODE ), & tmp );
355
+ zend_update_property_num_checked (NULL , Z_OBJ_P (object ), ZEND_EXCEPTION_CODE_OFF , ZSTR_KNOWN (ZEND_STR_CODE ), & tmp );
356
+ if (UNEXPECTED (EG (exception ))) {
357
+ RETURN_THROWS ();
358
+ }
353
359
}
354
360
355
361
if (previous ) {
356
362
Z_ADDREF_P (previous );
357
- zend_update_property_num_checked (Z_OBJ_P (object ), ZEND_EXCEPTION_PREVIOUS_OFF , ZSTR_KNOWN (ZEND_STR_PREVIOUS ), previous );
363
+ zend_update_property_num_checked (zend_ce_exception , Z_OBJ_P (object ), ZEND_EXCEPTION_PREVIOUS_OFF , ZSTR_KNOWN (ZEND_STR_PREVIOUS ), previous );
364
+ if (UNEXPECTED (EG (exception ))) {
365
+ RETURN_THROWS ();
366
+ }
358
367
}
359
368
}
360
369
/* }}} */
@@ -394,33 +403,54 @@ ZEND_METHOD(ErrorException, __construct)
394
403
395
404
if (message ) {
396
405
ZVAL_STR_COPY (& tmp , message );
397
- zend_update_property_num_checked (Z_OBJ_P (object ), ZEND_EXCEPTION_MESSAGE_OFF , ZSTR_KNOWN (ZEND_STR_MESSAGE ), & tmp );
406
+ zend_update_property_num_checked (NULL , Z_OBJ_P (object ), ZEND_EXCEPTION_MESSAGE_OFF , ZSTR_KNOWN (ZEND_STR_MESSAGE ), & tmp );
407
+ if (UNEXPECTED (EG (exception ))) {
408
+ RETURN_THROWS ();
409
+ }
398
410
}
399
411
400
412
if (code ) {
401
413
ZVAL_LONG (& tmp , code );
402
- zend_update_property_num_checked (Z_OBJ_P (object ), ZEND_EXCEPTION_CODE_OFF , ZSTR_KNOWN (ZEND_STR_CODE ), & tmp );
414
+ zend_update_property_num_checked (NULL , Z_OBJ_P (object ), ZEND_EXCEPTION_CODE_OFF , ZSTR_KNOWN (ZEND_STR_CODE ), & tmp );
415
+ if (UNEXPECTED (EG (exception ))) {
416
+ RETURN_THROWS ();
417
+ }
403
418
}
404
419
405
420
if (previous ) {
406
421
Z_ADDREF_P (previous );
407
- zend_update_property_num_checked (Z_OBJ_P (object ), ZEND_EXCEPTION_PREVIOUS_OFF , ZSTR_KNOWN (ZEND_STR_PREVIOUS ), previous );
422
+ zend_update_property_num_checked (zend_ce_exception , Z_OBJ_P (object ), ZEND_EXCEPTION_PREVIOUS_OFF , ZSTR_KNOWN (ZEND_STR_PREVIOUS ), previous );
423
+ if (UNEXPECTED (EG (exception ))) {
424
+ RETURN_THROWS ();
425
+ }
408
426
}
409
427
410
428
ZVAL_LONG (& tmp , severity );
411
- zend_update_property_num_checked (Z_OBJ_P (object ), ZEND_EXCEPTION_SEVERITY_OFF , ZSTR_KNOWN (ZEND_STR_SEVERITY ), & tmp );
429
+ zend_update_property_num_checked (NULL , Z_OBJ_P (object ), ZEND_EXCEPTION_SEVERITY_OFF , ZSTR_KNOWN (ZEND_STR_SEVERITY ), & tmp );
430
+ if (UNEXPECTED (EG (exception ))) {
431
+ RETURN_THROWS ();
432
+ }
412
433
413
434
if (filename ) {
414
435
ZVAL_STR_COPY (& tmp , filename );
415
- zend_update_property_num_checked (Z_OBJ_P (object ), ZEND_EXCEPTION_FILE_OFF , ZSTR_KNOWN (ZEND_STR_FILE ), & tmp );
436
+ zend_update_property_num_checked (NULL , Z_OBJ_P (object ), ZEND_EXCEPTION_FILE_OFF , ZSTR_KNOWN (ZEND_STR_FILE ), & tmp );
437
+ if (UNEXPECTED (EG (exception ))) {
438
+ RETURN_THROWS ();
439
+ }
416
440
}
417
441
418
442
if (!lineno_is_null ) {
419
443
ZVAL_LONG (& tmp , lineno );
420
- zend_update_property_num_checked (Z_OBJ_P (object ), ZEND_EXCEPTION_LINE_OFF , ZSTR_KNOWN (ZEND_STR_LINE ), & tmp );
444
+ zend_update_property_num_checked (NULL , Z_OBJ_P (object ), ZEND_EXCEPTION_LINE_OFF , ZSTR_KNOWN (ZEND_STR_LINE ), & tmp );
445
+ if (UNEXPECTED (EG (exception ))) {
446
+ RETURN_THROWS ();
447
+ }
421
448
} else if (filename ) {
422
449
ZVAL_LONG (& tmp , 0 );
423
- zend_update_property_num_checked (Z_OBJ_P (object ), ZEND_EXCEPTION_LINE_OFF , ZSTR_KNOWN (ZEND_STR_LINE ), & tmp );
450
+ zend_update_property_num_checked (NULL , Z_OBJ_P (object ), ZEND_EXCEPTION_LINE_OFF , ZSTR_KNOWN (ZEND_STR_LINE ), & tmp );
451
+ if (UNEXPECTED (EG (exception ))) {
452
+ RETURN_THROWS ();
453
+ }
424
454
}
425
455
}
426
456
/* }}} */
0 commit comments