@@ -396,6 +396,88 @@ 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 ("Message property must be of type string" );
411+ RETURN_THROWS ();
412+ }
413+ zend_update_property_num_checked (NULL , Z_OBJ_P (ZEND_THIS ), ZEND_EXCEPTION_MESSAGE_OFF , ZSTR_KNOWN (ZEND_STR_MESSAGE ), tmp );
414+ zval_add_ref (tmp );
415+ if (UNEXPECTED (EG (exception ))) {
416+ RETURN_THROWS ();
417+ }
418+ }
419+
420+ tmp = zend_hash_str_find (ht , ZEND_STRL ("\0*\0code" ));
421+ if (tmp ) {
422+ if (Z_TYPE_P (tmp ) != IS_LONG ) {
423+ zend_type_error ("Code property must be of type int" );
424+ RETURN_THROWS ();
425+ }
426+ zend_update_property_num_checked (NULL , Z_OBJ_P (ZEND_THIS ), ZEND_EXCEPTION_CODE_OFF , ZSTR_KNOWN (ZEND_STR_CODE ), tmp );
427+ if (UNEXPECTED (EG (exception ))) {
428+ RETURN_THROWS ();
429+ }
430+ }
431+
432+ tmp = zend_hash_str_find (ht , ZEND_STRL ("\0*\0file" ));
433+ if (tmp ) {
434+ if (Z_TYPE_P (tmp ) != IS_STRING ) {
435+ zend_type_error ("File property must be of type string" );
436+ RETURN_THROWS ();
437+ }
438+ zend_update_property_num_checked (NULL , Z_OBJ_P (ZEND_THIS ), ZEND_EXCEPTION_FILE_OFF , ZSTR_KNOWN (ZEND_STR_FILE ), tmp );
439+ zval_add_ref (tmp );
440+ if (UNEXPECTED (EG (exception ))) {
441+ RETURN_THROWS ();
442+ }
443+ }
444+
445+ tmp = zend_hash_str_find (ht , ZEND_STRL ("\0*\0line" ));
446+ if (tmp ) {
447+ zend_update_property_num_checked (NULL , Z_OBJ_P (ZEND_THIS ), ZEND_EXCEPTION_LINE_OFF , ZSTR_KNOWN (ZEND_STR_LINE ), tmp );
448+ if (UNEXPECTED (EG (exception ))) {
449+ RETURN_THROWS ();
450+ }
451+ }
452+
453+ if (instanceof_function (Z_OBJCE_P (ZEND_THIS ), zend_ce_exception )) {
454+ tmp = zend_hash_str_find (ht , ZEND_STRL ("\0Exception\0trace" ));
455+ } else {
456+ tmp = zend_hash_str_find (ht , ZEND_STRL ("\0Error\0trace" ));
457+ }
458+ if (tmp ) {
459+ zend_update_property_num_checked (NULL , Z_OBJ_P (ZEND_THIS ), ZEND_EXCEPTION_TRACE_OFF , ZSTR_KNOWN (ZEND_STR_TRACE ), tmp );
460+ zval_add_ref (tmp );
461+ if (UNEXPECTED (EG (exception ))) {
462+ RETURN_THROWS ();
463+ }
464+ }
465+
466+ if (instanceof_function (Z_OBJCE_P (ZEND_THIS ), zend_ce_exception )) {
467+ tmp = zend_hash_str_find (ht , ZEND_STRL ("\0Exception\0previous" ));
468+ } else {
469+ tmp = zend_hash_str_find (ht , ZEND_STRL ("\0Error\0previous" ));
470+ }
471+ if (tmp ) {
472+ zend_update_property_num_checked (NULL , Z_OBJ_P (ZEND_THIS ), ZEND_EXCEPTION_PREVIOUS_OFF , ZSTR_KNOWN (ZEND_STR_PREVIOUS ), tmp );
473+ zval_add_ref (tmp );
474+ if (UNEXPECTED (EG (exception ))) {
475+ RETURN_THROWS ();
476+ }
477+ }
478+ }
479+ /* }}} */
480+
399481/* {{{ ErrorException constructor */
400482ZEND_METHOD (ErrorException , __construct )
401483{
0 commit comments