Skip to content
This repository was archived by the owner on Mar 29, 2024. It is now read-only.

Commit 9ece87f

Browse files
committed
Cleanup callback info creation and invalidation
1 parent d7b6b86 commit 9ece87f

9 files changed

+80
-58
lines changed

src/php_v8_callback_info.cc

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

4441
static 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,7 @@ 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);
190191
}
191192

192193

src/php_v8_callback_info.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
typedef struct _php_v8_callback_info_t php_v8_callback_info_t;
1919

20+
#include "php_v8_return_value.h"
2021
#include "php_v8_exceptions.h"
2122
#include "php_v8_context.h"
2223
#include "php_v8_isolate.h"
@@ -34,7 +35,7 @@ extern zend_class_entry* php_v8_callback_info_class_entry;
3435

3536

3637
extern php_v8_callback_info_t * php_v8_callback_info_fetch_object(zend_object *obj);
37-
extern void php_v8_callback_info_invalidate(zval *val);
38+
extern void php_v8_callback_info_invalidate(php_v8_callback_info_t *php_v8_callback_info);
3839

3940
#define PHP_V8_CALLBACK_INFO_FETCH(zv) php_v8_callback_info_fetch_object(Z_OBJ_P(zv))
4041
#define PHP_V8_CALLBACK_INFO_FETCH_INTO(pzval, into) php_v8_callback_info_t *(into) = PHP_V8_CALLBACK_INFO_FETCH((pzval));
@@ -51,7 +52,7 @@ extern void php_v8_callback_info_invalidate(zval *val);
5152

5253
// TODO: suggest better naming
5354
#define PHP_V8_V8_CALLBACK_INFO_CHECK_IN_CONTEXT(value) \
54-
if ((value)->php_v8_isolate == NULL) { \
55+
if ((value)->php_v8_return_value == NULL || PHP_V8_RETVAL_ACCEPTS_INVALID == (value)->php_v8_return_value->accepts) { \
5556
PHP_V8_THROW_EXCEPTION("Attempt to use callback info object out of callback context"); \
5657
return; \
5758
}
@@ -69,7 +70,7 @@ struct _php_v8_callback_info_t {
6970
v8::Persistent<v8::Object> *holder_obj;
7071
bool is_construct_call;
7172

72-
zval retval;
73+
php_v8_return_value_t *php_v8_return_value;
7374
zval args;
7475

7576
zval *gc_data;

src/php_v8_callbacks.cc

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -419,16 +419,21 @@ void php_v8_callback_call_from_bucket_with_zargs(size_t index, v8::Local<v8::Val
419419
template<class T>
420420
void php_v8_callback_call_from_bucket_with_zargs(size_t index, const T &info, zval *args) {
421421
zval callback_info;
422-
422+
php_v8_callback_info_t *php_v8_callback_info;
423423
// Wrap callback info
424-
php_v8_callback_info_create_from_info(&callback_info, info);
424+
php_v8_callback_info = php_v8_callback_info_create_from_info(&callback_info, info);
425+
426+
if (!php_v8_callback_info) {
427+
return;
428+
}
429+
425430
add_next_index_zval(args, &callback_info);
426431

427432
php_v8_callback_call_from_bucket_with_zargs(index, info.Data(), args, NULL);
428433

429-
php_v8_callback_set_retval_from_callback_info(info.GetReturnValue(), PHP_V8_RETURN_VALUE_FETCH(&PHP_V8_CALLBACK_INFO_FETCH(&callback_info)->retval));
434+
php_v8_callback_set_retval_from_callback_info(info.GetReturnValue(), php_v8_callback_info->php_v8_return_value);
430435

431-
php_v8_callback_info_invalidate(&callback_info);
436+
php_v8_callback_info_invalidate(php_v8_callback_info);
432437
}
433438

434439

src/php_v8_function_callback_info.cc

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,14 @@ zend_class_entry* php_v8_function_callback_info_class_entry;
2727
#define this_ce php_v8_function_callback_info_class_entry
2828

2929

30-
void php_v8_callback_info_create_from_info(zval *this_ptr, const v8::FunctionCallbackInfo<v8::Value> &args) {
30+
php_v8_callback_info_t *php_v8_callback_info_create_from_info(zval *this_ptr, const v8::FunctionCallbackInfo<v8::Value> &args) {
31+
zval retval;
3132
v8::Isolate *isolate = args.GetIsolate();
3233
v8::Local<v8::Context> context = isolate->GetCurrentContext();
3334

3435
if (context.IsEmpty()) {
3536
PHP_V8_THROW_EXCEPTION("Internal exception: no calling context found");
36-
return;
37+
return NULL;
3738
}
3839

3940
object_init_ex(this_ptr, this_ce);
@@ -42,15 +43,15 @@ void php_v8_callback_info_create_from_info(zval *this_ptr, const v8::FunctionCal
4243
php_v8_callback_info->php_v8_isolate = PHP_V8_ISOLATE_FETCH_REFERENCE(isolate);
4344
php_v8_callback_info->php_v8_context = php_v8_context_get_reference(context);
4445

45-
PHP_V8_COPY_ISOLATE_OBJECT_HANDLE(php_v8_callback_info->php_v8_isolate, php_v8_callback_info);
46-
4746
php_v8_callback_info->this_obj->Reset(isolate, args.This());
4847
php_v8_callback_info->holder_obj->Reset(isolate, args.Holder());
4948

50-
php_v8_return_value_create_from_return_value(&php_v8_callback_info->retval,
51-
php_v8_callback_info->php_v8_isolate,
52-
php_v8_callback_info->php_v8_context,
53-
PHP_V8_RETVAL_ACCEPTS_ANY);
49+
php_v8_callback_info->php_v8_return_value = php_v8_return_value_create_from_return_value(
50+
&retval,
51+
php_v8_callback_info->php_v8_isolate,
52+
php_v8_callback_info->php_v8_context,
53+
PHP_V8_RETVAL_ACCEPTS_ANY
54+
);
5455

5556
/* function callback specific part */
5657
php_v8_callback_info->length = args.Length();
@@ -62,6 +63,8 @@ void php_v8_callback_info_create_from_info(zval *this_ptr, const v8::FunctionCal
6263
}
6364

6465
php_v8_callback_info->is_construct_call = args.IsConstructCall();
66+
67+
return php_v8_callback_info;
6568
}
6669

6770

src/php_v8_function_callback_info.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#ifndef PHP_V8_FUNCTION_CALLBACK_INFO_H
1616
#define PHP_V8_FUNCTION_CALLBACK_INFO_H
1717

18+
#include "php_v8_callback_info.h"
1819
#include <v8.h>
1920

2021
extern "C" {
@@ -27,7 +28,7 @@ extern "C" {
2728

2829
extern zend_class_entry* php_v8_function_callback_info_class_entry;
2930

30-
extern void php_v8_callback_info_create_from_info(zval *this_ptr, const v8::FunctionCallbackInfo<v8::Value>&args);
31+
extern php_v8_callback_info_t *php_v8_callback_info_create_from_info(zval *this_ptr, const v8::FunctionCallbackInfo<v8::Value>&args);
3132

3233

3334
PHP_MINIT_FUNCTION (php_v8_function_callback_info);

src/php_v8_property_callback_info.cc

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,37 +26,38 @@ zend_class_entry *php_v8_property_callback_info_class_entry;
2626

2727

2828
template<class T>
29-
void php_v8_callback_info_create_from_info_meta(zval *this_ptr, const v8::PropertyCallbackInfo<T> &info, int accepts);
29+
php_v8_callback_info_t *php_v8_callback_info_create_from_info_meta(zval *this_ptr, const v8::PropertyCallbackInfo<T> &info, int accepts);
3030

3131

32-
void php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Value> &info) {
33-
php_v8_callback_info_create_from_info_meta(this_ptr, info, PHP_V8_RETVAL_ACCEPTS_ANY);
32+
php_v8_callback_info_t *php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Value> &info) {
33+
return php_v8_callback_info_create_from_info_meta(this_ptr, info, PHP_V8_RETVAL_ACCEPTS_ANY);
3434
}
3535

36-
void php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Array> &info) {
37-
php_v8_callback_info_create_from_info_meta(this_ptr, info, PHP_V8_RETVAL_ACCEPTS_ARRAY);
36+
php_v8_callback_info_t *php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Array> &info) {
37+
return php_v8_callback_info_create_from_info_meta(this_ptr, info, PHP_V8_RETVAL_ACCEPTS_ARRAY);
3838
}
3939

40-
void php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Integer> &info) {
41-
php_v8_callback_info_create_from_info_meta(this_ptr, info, PHP_V8_RETVAL_ACCEPTS_INTEGER);
40+
php_v8_callback_info_t *php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Integer> &info) {
41+
return php_v8_callback_info_create_from_info_meta(this_ptr, info, PHP_V8_RETVAL_ACCEPTS_INTEGER);
4242
}
4343

44-
void php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Boolean> &info) {
45-
php_v8_callback_info_create_from_info_meta(this_ptr, info, PHP_V8_RETVAL_ACCEPTS_BOOLEAN);
44+
php_v8_callback_info_t *php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Boolean> &info) {
45+
return php_v8_callback_info_create_from_info_meta(this_ptr, info, PHP_V8_RETVAL_ACCEPTS_BOOLEAN);
4646
}
4747

48-
void php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<void> &info) {
49-
php_v8_callback_info_create_from_info_meta(this_ptr, info, PHP_V8_RETVAL_ACCEPTS_VOID);
48+
php_v8_callback_info_t *php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<void> &info) {
49+
return php_v8_callback_info_create_from_info_meta(this_ptr, info, PHP_V8_RETVAL_ACCEPTS_VOID);
5050
}
5151

5252
template<class T>
53-
void php_v8_callback_info_create_from_info_meta(zval *this_ptr, const v8::PropertyCallbackInfo<T> &info, int accepts) {
53+
php_v8_callback_info_t *php_v8_callback_info_create_from_info_meta(zval *this_ptr, const v8::PropertyCallbackInfo<T> &info, int accepts) {
54+
zval retval;
5455
v8::Isolate *isolate = info.GetIsolate();
5556
v8::Local<v8::Context> context = isolate->GetCurrentContext();
5657

5758
if (context.IsEmpty()) {
5859
PHP_V8_THROW_EXCEPTION("Internal exception: no calling context found");
59-
return;
60+
return NULL;
6061
}
6162

6263
object_init_ex(this_ptr, this_ce);
@@ -65,15 +66,17 @@ void php_v8_callback_info_create_from_info_meta(zval *this_ptr, const v8::Proper
6566
php_v8_callback_info->php_v8_isolate = PHP_V8_ISOLATE_FETCH_REFERENCE(isolate);
6667
php_v8_callback_info->php_v8_context = php_v8_context_get_reference(context);
6768

68-
PHP_V8_COPY_ISOLATE_OBJECT_HANDLE(php_v8_callback_info->php_v8_isolate, php_v8_callback_info);
69-
7069
php_v8_callback_info->this_obj->Reset(isolate, info.This());
7170
php_v8_callback_info->holder_obj->Reset(isolate, info.Holder());
7271

73-
php_v8_return_value_create_from_return_value(&php_v8_callback_info->retval,
74-
php_v8_callback_info->php_v8_isolate,
75-
php_v8_callback_info->php_v8_context,
76-
accepts);
72+
php_v8_callback_info->php_v8_return_value = php_v8_return_value_create_from_return_value(
73+
&retval,
74+
php_v8_callback_info->php_v8_isolate,
75+
php_v8_callback_info->php_v8_context,
76+
accepts
77+
);
78+
79+
return php_v8_callback_info;
7780
}
7881

7982
static const zend_function_entry php_v8_property_callback_info_methods[] = {

src/php_v8_property_callback_info.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#ifndef PHP_V8_PROPERTY_CALLBACK_INFO_H
1616
#define PHP_V8_PROPERTY_CALLBACK_INFO_H
1717

18+
#include "php_v8_callback_info.h"
1819
#include <v8.h>
1920

2021
extern "C" {
@@ -27,11 +28,11 @@ extern "C" {
2728

2829
extern zend_class_entry* php_v8_property_callback_info_class_entry;
2930

30-
extern void php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Value> &info);
31-
extern void php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Array> &info);
32-
extern void php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Integer> &info);
33-
extern void php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Boolean> &info);
34-
extern void php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<void> &info);
31+
extern php_v8_callback_info_t *php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Value> &info);
32+
extern php_v8_callback_info_t *php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Array> &info);
33+
extern php_v8_callback_info_t *php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Integer> &info);
34+
extern php_v8_callback_info_t *php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<v8::Boolean> &info);
35+
extern php_v8_callback_info_t *php_v8_callback_info_create_from_info(zval *this_ptr, const v8::PropertyCallbackInfo<void> &info);
3536

3637

3738
PHP_MINIT_FUNCTION (php_v8_property_callback_info);

src/php_v8_return_value.cc

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ static void php_v8_return_value_free(zend_object *object) {
6565
zval_ptr_dtor(&php_v8_return_value->value.php_v8_value_zv);
6666
}
6767

68+
if (!Z_ISUNDEF(php_v8_return_value->this_ptr)) {
69+
zval_ptr_dtor(&php_v8_return_value->this_ptr);
70+
}
71+
6872
if (php_v8_return_value->gc_data) {
6973
efree(php_v8_return_value->gc_data);
7074
}
@@ -87,19 +91,21 @@ static zend_object * php_v8_return_value_ctor(zend_class_entry *ce) {
8791
}
8892

8993

90-
void php_v8_return_value_create_from_return_value(zval *this_ptr, php_v8_isolate_t *php_v8_isolate, php_v8_context_t *php_v8_context, int accepts) {
94+
php_v8_return_value_t *php_v8_return_value_create_from_return_value(zval *this_ptr, php_v8_isolate_t *php_v8_isolate, php_v8_context_t *php_v8_context, int accepts) {
9195
object_init_ex(this_ptr, this_ce);
9296

9397
PHP_V8_RETURN_VALUE_FETCH_INTO(this_ptr, php_v8_return_value);
9498

9599
php_v8_return_value->php_v8_isolate = php_v8_isolate;
96100
php_v8_return_value->php_v8_context = php_v8_context;
97101
php_v8_return_value->accepts = accepts;
98-
}
99102

100-
void php_v8_return_value_mark_expired(zval *this_ptr) {
101-
PHP_V8_RETURN_VALUE_FETCH_INTO(this_ptr, php_v8_return_value);
103+
ZVAL_COPY_VALUE(&php_v8_return_value->this_ptr, this_ptr);
104+
105+
return php_v8_return_value;
106+
}
102107

108+
void php_v8_return_value_mark_expired(php_v8_return_value_t *php_v8_return_value) {
103109
php_v8_return_value->accepts = PHP_V8_RETVAL_ACCEPTS_INVALID;
104110
}
105111

src/php_v8_return_value.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,9 @@ extern "C" {
3232

3333
extern zend_class_entry *php_v8_return_value_class_entry;
3434

35-
extern void php_v8_return_value_create_from_return_value(zval *this_ptr, php_v8_isolate_t *php_v8_isolate, php_v8_context_t *php_v8_context, int accepts);
36-
extern void php_v8_return_value_mark_expired(zval *this_ptr);
37-
extern php_v8_return_value_t * php_v8_return_value_fetch_object(zend_object *obj);
35+
extern php_v8_return_value_t *php_v8_return_value_create_from_return_value(zval *this_ptr, php_v8_isolate_t *php_v8_isolate, php_v8_context_t *php_v8_context, int accepts);
36+
extern void php_v8_return_value_mark_expired(php_v8_return_value_t *php_v8_return_value);
37+
extern php_v8_return_value_t *php_v8_return_value_fetch_object(zend_object *obj);
3838

3939

4040
#define PHP_V8_RETURN_VALUE_FETCH(zv) php_v8_return_value_fetch_object(Z_OBJ_P(zv))
@@ -128,6 +128,7 @@ struct _php_v8_return_value_t {
128128
zval *gc_data;
129129
int gc_data_count;
130130

131+
zval this_ptr;
131132
zend_object std;
132133
};
133134

0 commit comments

Comments
 (0)