@@ -43,8 +43,15 @@ void php_v8_try_catch_create_from_try_catch(zval *return_value, php_v8_isolate_t
43
43
44
44
if (try_catch && !try_catch->Exception ().IsEmpty ()) {
45
45
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);
47
47
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
+
48
55
zval_ptr_dtor (&exception_zv);
49
56
}
50
57
@@ -71,18 +78,20 @@ static PHP_METHOD(V8TryCatch, __construct) {
71
78
zval *php_v8_exception_zv = NULL ;
72
79
zval *php_v8_stack_trace_zv = NULL ;
73
80
zval *php_v8_message_zv = NULL ;
81
+ zval *external_exception_zv = NULL ;
74
82
75
83
zend_bool can_continue = ' \0 ' ;
76
84
zend_bool has_terminated = ' \0 ' ;
77
85
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! " ,
79
87
&php_v8_isolate_zv,
80
88
&php_v8_context_zv,
81
89
&php_v8_exception_zv,
82
90
&php_v8_stack_trace_zv,
83
91
&php_v8_message_zv,
84
92
&can_continue,
85
- &has_terminated) == FAILURE) {
93
+ &has_terminated,
94
+ &external_exception_zv) == FAILURE) {
86
95
return ;
87
96
}
88
97
@@ -114,6 +123,10 @@ static PHP_METHOD(V8TryCatch, __construct) {
114
123
115
124
zend_update_property_bool (this_ce, getThis (), ZEND_STRL (" can_continue" ), can_continue);
116
125
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
+ }
117
130
}
118
131
119
132
static PHP_METHOD (V8TryCatch, GetIsolate)
@@ -203,6 +216,18 @@ static PHP_METHOD(V8TryCatch, HasTerminated)
203
216
}
204
217
205
218
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
+
206
231
ZEND_BEGIN_ARG_INFO_EX (arginfo_v8_try_catch___construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 2 )
207
232
ZEND_ARG_OBJ_INFO(0 , isolate, V8\\Isolate, 0 )
208
233
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_
211
236
ZEND_ARG_OBJ_INFO(0 , message, V8\\Message, 1 )
212
237
ZEND_ARG_TYPE_INFO(0 , can_continue, _IS_BOOL, 0 )
213
238
ZEND_ARG_TYPE_INFO(0 , has_terminated, _IS_BOOL, 0 )
239
+ ZEND_ARG_OBJ_INFO(0 , external_exception, Throwable, 1 )
214
240
ZEND_END_ARG_INFO()
215
241
216
242
PHP_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()
234
260
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_try_catch_HasTerminated, ZEND_RETURN_VALUE, 0 , _IS_BOOL, 0 )
235
261
ZEND_END_ARG_INFO()
236
262
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
+
237
266
238
267
static const zend_function_entry php_v8_try_catch_methods[] = {
239
268
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[] = {
248
277
PHP_ME (V8TryCatch, CanContinue, arginfo_v8_try_catch_CanContinue, ZEND_ACC_PUBLIC)
249
278
PHP_ME (V8TryCatch, HasTerminated, arginfo_v8_try_catch_HasTerminated, ZEND_ACC_PUBLIC)
250
279
280
+ PHP_ME (V8TryCatch, getExternalException, arginfo_v8_try_catch_getExternalException, ZEND_ACC_PUBLIC)
281
+
251
282
PHP_FE_END
252
283
};
253
284
@@ -266,5 +297,7 @@ PHP_MINIT_FUNCTION (php_v8_try_catch) {
266
297
zend_declare_property_null (this_ce, ZEND_STRL (" can_continue" ), ZEND_ACC_PRIVATE);
267
298
zend_declare_property_null (this_ce, ZEND_STRL (" has_terminated" ), ZEND_ACC_PRIVATE);
268
299
300
+ zend_declare_property_null (this_ce, ZEND_STRL (" external_exception" ), ZEND_ACC_PRIVATE);
301
+
269
302
return SUCCESS;
270
303
}
0 commit comments