@@ -31,20 +31,17 @@ php_v8_callback_info_t * php_v8_callback_info_fetch_object(zend_object *obj) {
3131 return (php_v8_callback_info_t *)((char *)obj - XtOffsetOf (php_v8_callback_info_t , std));
3232}
3333
34- void php_v8_callback_info_invalidate (zval *val) {
35- PHP_V8_CALLBACK_INFO_FETCH_INTO (val, php_v8_callback_info);
36- php_v8_callback_info->php_v8_isolate = NULL ;
37-
38- if (!Z_ISUNDEF (php_v8_callback_info->retval )) {
39- php_v8_return_value_mark_expired (&php_v8_callback_info->retval );
34+ void php_v8_callback_info_invalidate (php_v8_callback_info_t *php_v8_callback_info) {
35+ if (php_v8_callback_info->php_v8_return_value ) {
36+ php_v8_return_value_mark_expired (php_v8_callback_info->php_v8_return_value );
4037 }
4138}
4239
4340
4441static HashTable * php_v8_callback_info_gc (zval *object, zval **table, int *n) {
4542 PHP_V8_CALLBACK_INFO_FETCH_INTO (object, php_v8_callback_info);
4643
47- int size = 2 ; // args + retval
44+ int size = 2 ; // args + php_v8_return_value->this_ptr
4845
4946 if (php_v8_callback_info->gc_data_count < size) {
5047 php_v8_callback_info->gc_data = (zval *)safe_erealloc (php_v8_callback_info->gc_data , size, sizeof (zval), 0 );
@@ -53,7 +50,7 @@ static HashTable * php_v8_callback_info_gc(zval *object, zval **table, int *n) {
5350 php_v8_callback_info->gc_data_count = size;
5451
5552 ZVAL_COPY_VALUE (&php_v8_callback_info->gc_data [0 ], &php_v8_callback_info->args );
56- ZVAL_COPY_VALUE (&php_v8_callback_info->gc_data [1 ], &php_v8_callback_info->retval );
53+ ZVAL_COPY_VALUE (&php_v8_callback_info->gc_data [1 ], &php_v8_callback_info->php_v8_return_value -> this_ptr );
5754
5855 *table = php_v8_callback_info->gc_data ;
5956 *n = php_v8_callback_info->gc_data_count ;
@@ -93,8 +90,12 @@ void php_v8_callback_info_free(zend_object *object) {
9390 delete php_v8_callback_info->holder_obj ;
9491 }
9592
96- if (!Z_ISUNDEF (php_v8_callback_info->retval )) {
97- zval_ptr_dtor (&php_v8_callback_info->retval );
93+ if (php_v8_callback_info->php_v8_return_value ) {
94+ if (!Z_ISUNDEF (php_v8_callback_info->php_v8_return_value ->this_ptr )) {
95+ zval_ptr_dtor (&php_v8_callback_info->php_v8_return_value ->this_ptr );
96+ }
97+
98+ php_v8_callback_info->php_v8_return_value = NULL ;
9899 }
99100
100101 if (!Z_ISUNDEF (php_v8_callback_info->args )) {
@@ -186,7 +187,17 @@ static PHP_METHOD(V8CallbackInfo, GetReturnValue) {
186187 PHP_V8_CALLBACK_INFO_FETCH_WITH_CHECK (getThis (), php_v8_callback_info);
187188 PHP_V8_V8_CALLBACK_INFO_CHECK_IN_CONTEXT (php_v8_callback_info);
188189
189- RETVAL_ZVAL (&php_v8_callback_info->retval , 1 , 0 );
190+ RETVAL_ZVAL (&php_v8_callback_info->php_v8_return_value ->this_ptr , 1 , 0 );
191+ }
192+
193+ static PHP_METHOD (V8CallbackInfo, InContext) {
194+ if (zend_parse_parameters_none () == FAILURE) {
195+ return ;
196+ }
197+
198+ PHP_V8_CALLBACK_INFO_FETCH_WITH_CHECK (getThis (), php_v8_callback_info);
199+
200+ RETURN_BOOL (PHP_V8_V8_CALLBACK_INFO_IN_CONTEXT (php_v8_callback_info));
190201}
191202
192203
@@ -205,13 +216,17 @@ ZEND_END_ARG_INFO()
205216ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_callback_info_GetReturnValue, ZEND_RETURN_VALUE, 0 , IS_OBJECT, PHP_V8_NS " \\ ReturnValue" , 0 )
206217ZEND_END_ARG_INFO()
207218
219+ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_callback_info_InContext, ZEND_RETURN_VALUE, 0 , _IS_BOOL, NULL , 0 )
220+ ZEND_END_ARG_INFO()
221+
208222
209223static const zend_function_entry php_v8_callback_info_methods[] = {
210224 PHP_ME (V8CallbackInfo, This, arginfo_v8_callback_info_This, ZEND_ACC_PUBLIC)
211225 PHP_ME (V8CallbackInfo, Holder, arginfo_v8_callback_info_Holder, ZEND_ACC_PUBLIC)
212226 PHP_ME (V8CallbackInfo, GetIsolate, arginfo_v8_callback_info_GetIsolate, ZEND_ACC_PUBLIC)
213227 PHP_ME (V8CallbackInfo, GetContext, arginfo_v8_callback_info_GetContext, ZEND_ACC_PUBLIC)
214228 PHP_ME (V8CallbackInfo, GetReturnValue, arginfo_v8_callback_info_GetReturnValue, ZEND_ACC_PUBLIC)
229+ PHP_ME (V8CallbackInfo, InContext, arginfo_v8_callback_info_InContext, ZEND_ACC_PUBLIC)
215230 PHP_FE_END
216231};
217232
0 commit comments