@@ -43,8 +43,15 @@ void php_v8_try_catch_create_from_try_catch(zval *return_value, php_v8_isolate_t
4343
4444    if  (try_catch && !try_catch->Exception ().IsEmpty ()) {
4545        zval exception_zv;
46-         php_v8_get_or_create_value (&exception_zv, try_catch->Exception (), php_v8_isolate);
46+         php_v8_value_t  * php_v8_value =  php_v8_get_or_create_value (&exception_zv, try_catch->Exception (), php_v8_isolate);
4747        zend_update_property (this_ce, return_value, ZEND_STRL (" exception"  ), &exception_zv);
48+ 
49+         if  (!Z_ISUNDEF (php_v8_value->exception )) {
50+             zend_update_property (this_ce, return_value, ZEND_STRL (" external_exception"  ), &php_v8_value->exception );
51+             zval_ptr_dtor (&php_v8_value->exception );
52+             ZVAL_UNDEF (&php_v8_value->exception );
53+         }
54+ 
4855        zval_ptr_dtor (&exception_zv);
4956    }
5057
@@ -71,18 +78,20 @@ static PHP_METHOD(V8TryCatch, __construct) {
7178    zval *php_v8_exception_zv = NULL ;
7279    zval *php_v8_stack_trace_zv = NULL ;
7380    zval *php_v8_message_zv = NULL ;
81+     zval *external_exception_zv = NULL ;
7482
7583    zend_bool can_continue = ' \0 '  ;
7684    zend_bool has_terminated = ' \0 '  ;
7785
78-     if  (zend_parse_parameters (ZEND_NUM_ARGS (), " oo|o!o!o!bb "  ,
86+     if  (zend_parse_parameters (ZEND_NUM_ARGS (), " oo|o!o!o!bbo! "  ,
7987                              &php_v8_isolate_zv,
8088                              &php_v8_context_zv,
8189                              &php_v8_exception_zv,
8290                              &php_v8_stack_trace_zv,
8391                              &php_v8_message_zv,
8492                              &can_continue,
85-                               &has_terminated) == FAILURE) {
93+                               &has_terminated,
94+                               &external_exception_zv) == FAILURE) {
8695        return ;
8796    }
8897
@@ -114,6 +123,10 @@ static PHP_METHOD(V8TryCatch, __construct) {
114123
115124    zend_update_property_bool (this_ce, getThis (), ZEND_STRL (" can_continue"  ), can_continue);
116125    zend_update_property_bool (this_ce, getThis (), ZEND_STRL (" has_terminated"  ), has_terminated);
126+ 
127+     if  (external_exception_zv != NULL ) {
128+         zend_update_property (this_ce, getThis (), ZEND_STRL (" external_exception"  ), external_exception_zv);
129+     }
117130}
118131
119132static  PHP_METHOD (V8TryCatch, GetIsolate)
@@ -203,6 +216,18 @@ static PHP_METHOD(V8TryCatch, HasTerminated)
203216}
204217
205218
219+ static  PHP_METHOD (V8TryCatch, getExternalException)
220+ {
221+     zval rv;
222+ 
223+     if  (zend_parse_parameters_none () == FAILURE) {
224+         return ;
225+     }
226+ 
227+     RETVAL_ZVAL (zend_read_property (this_ce, getThis (), ZEND_STRL (" external_exception"  ), 0 , &rv), 1 , 0 );
228+ }
229+ 
230+ 
206231ZEND_BEGIN_ARG_INFO_EX (arginfo_v8_try_catch___construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 2 )
207232                ZEND_ARG_OBJ_INFO(0 , isolate, V8\\Isolate, 0 )
208233                ZEND_ARG_OBJ_INFO(0 , context, V8\\Context, 0 )
@@ -211,6 +236,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_v8_try_catch___construct, ZEND_SEND_BY_VAL, ZEND_
211236                ZEND_ARG_OBJ_INFO(0 , message, V8\\Message, 1 )
212237                ZEND_ARG_TYPE_INFO(0 , can_continue, _IS_BOOL, 0 )
213238                ZEND_ARG_TYPE_INFO(0 , has_terminated, _IS_BOOL, 0 )
239+                 ZEND_ARG_OBJ_INFO(0 , external_exception, Throwable, 1 )
214240ZEND_END_ARG_INFO()
215241
216242PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_try_catch_GetIsolate, ZEND_RETURN_VALUE, 0 , V8\\Isolate, 0 )
@@ -234,6 +260,9 @@ ZEND_END_ARG_INFO()
234260PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_try_catch_HasTerminated, ZEND_RETURN_VALUE, 0 , _IS_BOOL, 0 )
235261ZEND_END_ARG_INFO()
236262
263+ PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_try_catch_getExternalException, ZEND_RETURN_VALUE, 0 , Throwable, 1 )
264+ ZEND_END_ARG_INFO()
265+ 
237266
238267static const  zend_function_entry php_v8_try_catch_methods[] = {
239268        PHP_ME (V8TryCatch, __construct,     arginfo_v8_try_catch___construct,     ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
@@ -248,6 +277,8 @@ static const zend_function_entry php_v8_try_catch_methods[] = {
248277        PHP_ME (V8TryCatch, CanContinue,     arginfo_v8_try_catch_CanContinue,   ZEND_ACC_PUBLIC)
249278        PHP_ME (V8TryCatch, HasTerminated,   arginfo_v8_try_catch_HasTerminated, ZEND_ACC_PUBLIC)
250279
280+         PHP_ME (V8TryCatch, getExternalException, arginfo_v8_try_catch_getExternalException, ZEND_ACC_PUBLIC)
281+ 
251282        PHP_FE_END
252283};
253284
@@ -266,5 +297,7 @@ PHP_MINIT_FUNCTION (php_v8_try_catch) {
266297    zend_declare_property_null (this_ce, ZEND_STRL (" can_continue"  ), ZEND_ACC_PRIVATE);
267298    zend_declare_property_null (this_ce, ZEND_STRL (" has_terminated"  ), ZEND_ACC_PRIVATE);
268299
300+     zend_declare_property_null (this_ce, ZEND_STRL (" external_exception"  ), ZEND_ACC_PRIVATE);
301+ 
269302    return  SUCCESS;
270303}
0 commit comments