@@ -396,6 +396,106 @@ ZEND_METHOD(Exception, __wakeup)
396396}
397397/* }}} */
398398
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*\0message" ));
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*\0code" ));
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*\0file" ));
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*\0line" ));
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 ("\0Exception\0trace" ));
463+ } else {
464+ tmp = zend_hash_str_find (ht , ZEND_STRL ("\0Error\0trace" ));
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 ("\0Exception\0previous" ));
481+ } else {
482+ tmp = zend_hash_str_find (ht , ZEND_STRL ("\0Error\0previous" ));
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+
399499/* {{{ ErrorException constructor */
400500ZEND_METHOD (ErrorException , __construct )
401501{
0 commit comments