@@ -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