@@ -396,6 +396,106 @@ ZEND_METHOD(Exception, __wakeup)
396
396
}
397
397
/* }}} */
398
398
399
+ ZEND_METHOD (Exception , __unserialize )
400
+ {
401
+ HashTable * ht ;
402
+
403
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "h" , & ht ) == FAILURE ) {
404
+ RETURN_THROWS ();
405
+ }
406
+
407
+ zval * tmp = zend_hash_str_find (ht , ZEND_STRL ("0円*0円message" ));
408
+ if (tmp ) {
409
+ if (Z_TYPE_P (tmp ) != IS_STRING ) {
410
+ zend_type_error ("Cannot assign %s to property %s::$message of type string" ,
411
+ zend_zval_type_name (tmp ), ZSTR_VAL (Z_OBJCE_P (ZEND_THIS )-> name ));
412
+ RETURN_THROWS ();
413
+ }
414
+ zend_update_property_num_checked (NULL , Z_OBJ_P (ZEND_THIS ), ZEND_EXCEPTION_MESSAGE_OFF , ZSTR_KNOWN (ZEND_STR_MESSAGE ), tmp );
415
+ zval_add_ref (tmp );
416
+ if (UNEXPECTED (EG (exception ))) {
417
+ RETURN_THROWS ();
418
+ }
419
+ }
420
+
421
+ tmp = zend_hash_str_find (ht , ZEND_STRL ("0円*0円code" ));
422
+ if (tmp ) {
423
+ if (Z_TYPE_P (tmp ) != IS_LONG ) {
424
+ zend_type_error ("Cannot assign %s to property %s::$code of type int" ,
425
+ zend_zval_type_name (tmp ), ZSTR_VAL (Z_OBJCE_P (ZEND_THIS )-> name ));
426
+ RETURN_THROWS ();
427
+ }
428
+ zend_update_property_num_checked (NULL , Z_OBJ_P (ZEND_THIS ), ZEND_EXCEPTION_CODE_OFF , ZSTR_KNOWN (ZEND_STR_CODE ), tmp );
429
+ if (UNEXPECTED (EG (exception ))) {
430
+ RETURN_THROWS ();
431
+ }
432
+ }
433
+
434
+ tmp = zend_hash_str_find (ht , ZEND_STRL ("0円*0円file" ));
435
+ if (tmp ) {
436
+ if (Z_TYPE_P (tmp ) != IS_STRING ) {
437
+ zend_type_error ("Cannot assign %s to property %s::$file of type string" ,
438
+ zend_zval_type_name (tmp ), ZSTR_VAL (Z_OBJCE_P (ZEND_THIS )-> name ));
439
+ RETURN_THROWS ();
440
+ }
441
+ zend_update_property_num_checked (NULL , Z_OBJ_P (ZEND_THIS ), ZEND_EXCEPTION_FILE_OFF , ZSTR_KNOWN (ZEND_STR_FILE ), tmp );
442
+ zval_add_ref (tmp );
443
+ if (UNEXPECTED (EG (exception ))) {
444
+ RETURN_THROWS ();
445
+ }
446
+ }
447
+
448
+ tmp = zend_hash_str_find (ht , ZEND_STRL ("0円*0円line" ));
449
+ if (tmp ) {
450
+ if (Z_TYPE_P (tmp ) != IS_LONG ) {
451
+ zend_type_error ("Cannot assign %s to property %s::$line of type int" ,
452
+ zend_zval_type_name (tmp ), ZSTR_VAL (Z_OBJCE_P (ZEND_THIS )-> name ));
453
+ RETURN_THROWS ();
454
+ }
455
+ zend_update_property_num_checked (NULL , Z_OBJ_P (ZEND_THIS ), ZEND_EXCEPTION_LINE_OFF , ZSTR_KNOWN (ZEND_STR_LINE ), tmp );
456
+ if (UNEXPECTED (EG (exception ))) {
457
+ RETURN_THROWS ();
458
+ }
459
+ }
460
+
461
+ if (instanceof_function (Z_OBJCE_P (ZEND_THIS ), zend_ce_exception )) {
462
+ tmp = zend_hash_str_find (ht , ZEND_STRL ("0円Exception0円trace" ));
463
+ } else {
464
+ tmp = zend_hash_str_find (ht , ZEND_STRL ("0円Error0円trace" ));
465
+ }
466
+ if (tmp ) {
467
+ if (Z_TYPE_P (tmp ) != IS_ARRAY ) {
468
+ zend_type_error ("Cannot assign %s to property %s::$trace of type array" ,
469
+ zend_zval_type_name (tmp ), ZSTR_VAL (Z_OBJCE_P (ZEND_THIS )-> name ));
470
+ RETURN_THROWS ();
471
+ }
472
+ zend_update_property_num_checked (NULL , Z_OBJ_P (ZEND_THIS ), ZEND_EXCEPTION_TRACE_OFF , ZSTR_KNOWN (ZEND_STR_TRACE ), tmp );
473
+ zval_add_ref (tmp );
474
+ if (UNEXPECTED (EG (exception ))) {
475
+ RETURN_THROWS ();
476
+ }
477
+ }
478
+
479
+ if (instanceof_function (Z_OBJCE_P (ZEND_THIS ), zend_ce_exception )) {
480
+ tmp = zend_hash_str_find (ht , ZEND_STRL ("0円Exception0円previous" ));
481
+ } else {
482
+ tmp = zend_hash_str_find (ht , ZEND_STRL ("0円Error0円previous" ));
483
+ }
484
+ if (tmp ) {
485
+ if (Z_TYPE_P (tmp ) != IS_NULL && !instanceof_function (Z_OBJCE_P (tmp ), zend_ce_throwable )) {
486
+ zend_type_error ("Cannot assign %s to property %s::$previous of type ?Throwable" ,
487
+ zend_zval_type_name (tmp ), ZSTR_VAL (Z_OBJCE_P (ZEND_THIS )-> name ));
488
+ RETURN_THROWS ();
489
+ }
490
+ zend_update_property_num_checked (NULL , Z_OBJ_P (ZEND_THIS ), ZEND_EXCEPTION_PREVIOUS_OFF , ZSTR_KNOWN (ZEND_STR_PREVIOUS ), tmp );
491
+ zval_add_ref (tmp );
492
+ if (UNEXPECTED (EG (exception ))) {
493
+ RETURN_THROWS ();
494
+ }
495
+ }
496
+ }
497
+ /* }}} */
498
+
399
499
/* {{{ ErrorException constructor */
400
500
ZEND_METHOD (ErrorException , __construct )
401
501
{
0 commit comments