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

Commit 84bc40b

Browse files
committed
Prefetch vals for callback info objects
1 parent 2296bb2 commit 84bc40b

25 files changed

+959
-409
lines changed

src/php_v8_callback_info.cc

Lines changed: 29 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -26,178 +26,66 @@ zend_class_entry *php_v8_callback_info_class_entry;
2626
static zend_object_handlers php_v8_callback_info_object_handlers;
2727

2828

29-
void php_v8_callback_info_invalidate(php_v8_callback_info_t *php_v8_callback_info) {
30-
if (php_v8_callback_info->php_v8_return_value) {
31-
php_v8_return_value_mark_expired(php_v8_callback_info->php_v8_return_value);
32-
}
33-
}
34-
35-
36-
static HashTable * php_v8_callback_info_gc(zval *object, zval **table, int *n) {
37-
PHP_V8_CALLBACK_INFO_FETCH_INTO(object, php_v8_callback_info);
38-
39-
int size = 2; // args + php_v8_return_value->this_ptr
40-
41-
if (php_v8_callback_info->gc_data_count < size) {
42-
php_v8_callback_info->gc_data = (zval *)safe_erealloc(php_v8_callback_info->gc_data, size, sizeof(zval), 0);
43-
}
44-
45-
php_v8_callback_info->gc_data_count = size;
46-
47-
ZVAL_COPY_VALUE(&php_v8_callback_info->gc_data[0], &php_v8_callback_info->args);
48-
ZVAL_COPY_VALUE(&php_v8_callback_info->gc_data[1], &php_v8_callback_info->php_v8_return_value->this_ptr);
49-
50-
*table = php_v8_callback_info->gc_data;
51-
*n = php_v8_callback_info->gc_data_count;
52-
53-
return zend_std_get_properties(object);
54-
}
55-
56-
void php_v8_callback_info_free(zend_object *object) {
57-
php_v8_callback_info_t *php_v8_callback_info = php_v8_callback_info_fetch_object(object);
58-
59-
if (php_v8_callback_info->length) {
60-
61-
for (int i=0; i< php_v8_callback_info->length; i++) {
62-
if (PHP_V8_ISOLATE_HAS_VALID_HANDLE(php_v8_callback_info)) {
63-
php_v8_callback_info->arguments[i]->Reset();
64-
}
65-
66-
delete php_v8_callback_info->arguments[i];
67-
}
68-
69-
efree(php_v8_callback_info->arguments);
70-
}
71-
72-
if (php_v8_callback_info->this_obj) {
73-
if (PHP_V8_ISOLATE_HAS_VALID_HANDLE(php_v8_callback_info)) {
74-
php_v8_callback_info->this_obj->Reset();
75-
}
76-
77-
delete php_v8_callback_info->this_obj;
78-
}
79-
80-
if (php_v8_callback_info->holder_obj) {
81-
if (PHP_V8_ISOLATE_HAS_VALID_HANDLE(php_v8_callback_info)) {
82-
php_v8_callback_info->holder_obj->Reset();
83-
}
84-
85-
delete php_v8_callback_info->holder_obj;
86-
}
87-
88-
if (php_v8_callback_info->php_v8_return_value) {
89-
if (!Z_ISUNDEF(php_v8_callback_info->php_v8_return_value->this_ptr)) {
90-
zval_ptr_dtor(&php_v8_callback_info->php_v8_return_value->this_ptr);
91-
}
92-
93-
php_v8_callback_info->php_v8_return_value = NULL;
94-
}
95-
96-
if (!Z_ISUNDEF(php_v8_callback_info->args)) {
97-
zval_ptr_dtor(&php_v8_callback_info->args);
98-
}
99-
100-
if (php_v8_callback_info->gc_data) {
101-
efree(php_v8_callback_info->gc_data);
102-
}
103-
104-
zend_object_std_dtor(&php_v8_callback_info->std);
105-
}
106-
107-
static zend_object * php_v8_callback_info_ctor(zend_class_entry *ce) {
108-
109-
php_v8_callback_info_t *php_v8_callback_info;
110-
111-
php_v8_callback_info = (php_v8_callback_info_t *) ecalloc(1, sizeof(php_v8_callback_info_t) + zend_object_properties_size(ce));
112-
113-
zend_object_std_init(&php_v8_callback_info->std, ce);
114-
object_properties_init(&php_v8_callback_info->std, ce);
115-
116-
php_v8_callback_info->this_obj = new v8::Persistent<v8::Object>();
117-
php_v8_callback_info->holder_obj = new v8::Persistent<v8::Object>();
118-
119-
php_v8_callback_info->std.handlers = &php_v8_callback_info_object_handlers;
120-
121-
return &php_v8_callback_info->std;
122-
}
123-
124-
12529
static PHP_METHOD(V8CallbackInfo, GetIsolate) {
30+
zval rv;
31+
zval *tmp;
32+
12633
if (zend_parse_parameters_none() == FAILURE) {
12734
return;
12835
}
12936

130-
PHP_V8_CALLBACK_INFO_FETCH_WITH_CHECK(getThis(), php_v8_callback_info);
131-
PHP_V8_V8_CALLBACK_INFO_CHECK_IN_CONTEXT(php_v8_callback_info);
132-
133-
ZVAL_OBJ(return_value, &php_v8_callback_info->php_v8_isolate->std);
134-
Z_ADDREF_P(return_value);
37+
tmp = zend_read_property(this_ce, getThis(), ZEND_STRL("isolate"), 0, &rv);
38+
ZVAL_COPY(return_value, tmp);
13539
}
13640

13741
static PHP_METHOD(V8CallbackInfo, GetContext) {
42+
zval rv;
43+
zval *tmp;
44+
13845
if (zend_parse_parameters_none() == FAILURE) {
13946
return;
14047
}
14148

142-
PHP_V8_CALLBACK_INFO_FETCH_WITH_CHECK(getThis(), php_v8_callback_info);
143-
PHP_V8_V8_CALLBACK_INFO_CHECK_IN_CONTEXT(php_v8_callback_info);
144-
145-
ZVAL_OBJ(return_value, &php_v8_callback_info->php_v8_context->std);
146-
Z_ADDREF_P(return_value);
49+
tmp = zend_read_property(this_ce, getThis(), ZEND_STRL("context"), 0, &rv);
50+
ZVAL_COPY(return_value, tmp);
14751
}
14852

14953
static PHP_METHOD(V8CallbackInfo, This) {
54+
zval rv;
55+
zval *tmp;
56+
15057
if (zend_parse_parameters_none() == FAILURE) {
15158
return;
15259
}
15360

154-
PHP_V8_CALLBACK_INFO_FETCH_WITH_CHECK(getThis(), php_v8_callback_info);
155-
PHP_V8_V8_CALLBACK_INFO_CHECK_IN_CONTEXT(php_v8_callback_info);
156-
157-
v8::Isolate *isolate = php_v8_callback_info->php_v8_isolate->isolate;
158-
159-
v8::Local<v8::Object> local_object = v8::Local<v8::Object>::New(isolate, *php_v8_callback_info->this_obj);
160-
161-
php_v8_get_or_create_value(return_value, local_object, php_v8_callback_info->php_v8_isolate);
61+
tmp = zend_read_property(this_ce, getThis(), ZEND_STRL("this"), 0, &rv);
62+
ZVAL_COPY(return_value, tmp);
16263
}
16364

16465
static PHP_METHOD(V8CallbackInfo, Holder) {
66+
zval rv;
67+
zval *tmp;
68+
16569
if (zend_parse_parameters_none() == FAILURE) {
16670
return;
16771
}
16872

169-
PHP_V8_CALLBACK_INFO_FETCH_WITH_CHECK(getThis(), php_v8_callback_info);
170-
PHP_V8_V8_CALLBACK_INFO_CHECK_IN_CONTEXT(php_v8_callback_info);
171-
172-
v8::Isolate *isolate = php_v8_callback_info->php_v8_isolate->isolate;
173-
174-
v8::Local<v8::Object> local_object = v8::Local<v8::Object>::New(isolate, *php_v8_callback_info->holder_obj);
175-
176-
php_v8_get_or_create_value(return_value, local_object, php_v8_callback_info->php_v8_isolate);
73+
tmp = zend_read_property(this_ce, getThis(), ZEND_STRL("holder"), 0, &rv);
74+
ZVAL_COPY(return_value, tmp);
17775
}
17876

17977
static PHP_METHOD(V8CallbackInfo, GetReturnValue) {
180-
if (zend_parse_parameters_none() == FAILURE) {
181-
return;
182-
}
78+
zval rv;
79+
zval *tmp;
18380

184-
PHP_V8_CALLBACK_INFO_FETCH_WITH_CHECK(getThis(), php_v8_callback_info);
185-
PHP_V8_V8_CALLBACK_INFO_CHECK_IN_CONTEXT(php_v8_callback_info);
186-
187-
RETVAL_ZVAL(&php_v8_callback_info->php_v8_return_value->this_ptr, 1, 0);
188-
}
189-
190-
static PHP_METHOD(V8CallbackInfo, InContext) {
19181
if (zend_parse_parameters_none() == FAILURE) {
19282
return;
19383
}
19484

195-
PHP_V8_CALLBACK_INFO_FETCH_WITH_CHECK(getThis(), php_v8_callback_info);
196-
197-
RETURN_BOOL(PHP_V8_V8_CALLBACK_INFO_IN_CONTEXT(php_v8_callback_info));
85+
tmp = zend_read_property(this_ce, getThis(), ZEND_STRL("return_value"), 0, &rv);
86+
ZVAL_COPY(return_value, tmp);
19887
}
19988

200-
20189
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_callback_info_GetIsolate, ZEND_RETURN_VALUE, 0, V8\\Isolate, 0)
20290
ZEND_END_ARG_INFO()
20391

@@ -213,17 +101,12 @@ ZEND_END_ARG_INFO()
213101
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_callback_info_GetReturnValue, ZEND_RETURN_VALUE, 0, V8\\ReturnValue, 0)
214102
ZEND_END_ARG_INFO()
215103

216-
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_callback_info_InContext, ZEND_RETURN_VALUE, 0, _IS_BOOL, 0)
217-
ZEND_END_ARG_INFO()
218-
219-
220104
static const zend_function_entry php_v8_callback_info_methods[] = {
221105
PHP_ME(V8CallbackInfo, This, arginfo_v8_callback_info_This, ZEND_ACC_PUBLIC)
222106
PHP_ME(V8CallbackInfo, Holder, arginfo_v8_callback_info_Holder, ZEND_ACC_PUBLIC)
223107
PHP_ME(V8CallbackInfo, GetIsolate, arginfo_v8_callback_info_GetIsolate, ZEND_ACC_PUBLIC)
224108
PHP_ME(V8CallbackInfo, GetContext, arginfo_v8_callback_info_GetContext, ZEND_ACC_PUBLIC)
225109
PHP_ME(V8CallbackInfo, GetReturnValue, arginfo_v8_callback_info_GetReturnValue, ZEND_ACC_PUBLIC)
226-
PHP_ME(V8CallbackInfo, InContext, arginfo_v8_callback_info_InContext, ZEND_ACC_PUBLIC)
227110
PHP_FE_END
228111
};
229112

@@ -232,13 +115,14 @@ PHP_MINIT_FUNCTION (php_v8_callback_info) {
232115

233116
INIT_NS_CLASS_ENTRY(ce, PHP_V8_NS, "CallbackInfo", php_v8_callback_info_methods);
234117
this_ce = zend_register_internal_class(&ce);
235-
this_ce->create_object = php_v8_callback_info_ctor;
236118

237119
memcpy(&php_v8_callback_info_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
238120

239-
php_v8_callback_info_object_handlers.offset = XtOffsetOf(php_v8_callback_info_t, std);
240-
php_v8_callback_info_object_handlers.free_obj = php_v8_callback_info_free;
241-
php_v8_callback_info_object_handlers.get_gc = php_v8_callback_info_gc;
121+
zend_declare_property_null(this_ce, ZEND_STRL("isolate"), ZEND_ACC_PRIVATE);
122+
zend_declare_property_null(this_ce, ZEND_STRL("context"), ZEND_ACC_PRIVATE);
123+
zend_declare_property_null(this_ce, ZEND_STRL("this"), ZEND_ACC_PRIVATE);
124+
zend_declare_property_null(this_ce, ZEND_STRL("holder"), ZEND_ACC_PRIVATE);
125+
zend_declare_property_null(this_ce, ZEND_STRL("return_value"), ZEND_ACC_PRIVATE);
242126

243127
return SUCCESS;
244128
}

src/php_v8_callback_info.h

Lines changed: 0 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,6 @@
1313
#ifndef PHP_V8_CALLBACK_INFO_H
1414
#define PHP_V8_CALLBACK_INFO_H
1515

16-
typedef struct _php_v8_callback_info_t php_v8_callback_info_t;
17-
18-
#include "php_v8_return_value.h"
19-
#include "php_v8_exceptions.h"
20-
#include "php_v8_context.h"
21-
#include "php_v8_isolate.h"
22-
#include <v8.h>
23-
2416
extern "C" {
2517
#include "php.h"
2618

@@ -32,55 +24,6 @@ extern "C" {
3224
extern zend_class_entry* php_v8_callback_info_class_entry;
3325

3426

35-
inline php_v8_callback_info_t * php_v8_callback_info_fetch_object(zend_object *obj);
36-
extern void php_v8_callback_info_invalidate(php_v8_callback_info_t *php_v8_callback_info);
37-
38-
#define PHP_V8_CALLBACK_INFO_FETCH(zv) php_v8_callback_info_fetch_object(Z_OBJ_P(zv))
39-
#define PHP_V8_CALLBACK_INFO_FETCH_INTO(pzval, into) php_v8_callback_info_t *(into) = PHP_V8_CALLBACK_INFO_FETCH((pzval));
40-
41-
42-
#define PHP_V8_EMPTY_CALLBACK_INFO_MSG "CallbackInfo" PHP_V8_EMPTY_HANDLER_MSG_PART
43-
#define PHP_V8_CHECK_EMPTY_CALLBACK_INFO_HANDLER_MSG(val, message) if (NULL == (val)->php_v8_isolate) { PHP_V8_THROW_EXCEPTION(message); return; }
44-
#define PHP_V8_CHECK_EMPTY_CALLBACK_INFO_HANDLER(val) PHP_V8_CHECK_EMPTY_CALLBACK_INFO_HANDLER_MSG((val), PHP_V8_EMPTY_CALLBACK_INFO_MSG)
45-
46-
#define PHP_V8_CALLBACK_INFO_FETCH_WITH_CHECK(pzval, into) \
47-
PHP_V8_CALLBACK_INFO_FETCH_INTO(pzval, into); \
48-
PHP_V8_CHECK_EMPTY_CALLBACK_INFO_HANDLER(into);
49-
50-
#define PHP_V8_V8_CALLBACK_INFO_IN_CONTEXT(value) ((value)->php_v8_return_value != NULL && PHP_V8_RETURN_VALUE_IN_CONTEXT((value)->php_v8_return_value))
51-
52-
#define PHP_V8_V8_CALLBACK_INFO_CHECK_IN_CONTEXT(value) \
53-
if (!PHP_V8_V8_CALLBACK_INFO_IN_CONTEXT(value)) { \
54-
PHP_V8_THROW_EXCEPTION("Attempt to use callback info object out of callback context"); \
55-
return; \
56-
}
57-
58-
59-
struct _php_v8_callback_info_t {
60-
php_v8_isolate_t *php_v8_isolate;
61-
php_v8_context_t *php_v8_context;
62-
uint32_t isolate_handle;
63-
64-
int length;
65-
// TODO: find something for V8_INLINE Local<Value> operator[](int i) const;
66-
v8::Persistent<v8::Value> **arguments;
67-
v8::Persistent<v8::Object> *this_obj;
68-
v8::Persistent<v8::Object> *holder_obj;
69-
bool is_construct_call;
70-
71-
php_v8_return_value_t *php_v8_return_value;
72-
zval args;
73-
74-
zval *gc_data;
75-
int gc_data_count;
76-
77-
zend_object std;
78-
};
79-
80-
inline php_v8_callback_info_t * php_v8_callback_info_fetch_object(zend_object *obj) {
81-
return (php_v8_callback_info_t *)((char *)obj - XtOffsetOf(php_v8_callback_info_t, std));
82-
}
83-
8427
PHP_MINIT_FUNCTION(php_v8_callback_info);
8528

8629
#endif //PHP_V8_CALLBACK_INFO_H

src/php_v8_callbacks.cc

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -277,21 +277,22 @@ void php_v8_callback_call_from_bucket_with_zargs(size_t index, v8::Local<v8::Val
277277
template<class T, class M>
278278
void php_v8_callback_call_from_bucket_with_zargs(size_t index, const T &info, M rv, zval *args) {
279279
zval callback_info;
280-
php_v8_callback_info_t *php_v8_callback_info;
280+
php_v8_return_value_t *php_v8_return_value;
281281
// Wrap callback info
282-
php_v8_callback_info = php_v8_callback_info_create_from_info(&callback_info, info);
283282

284-
if (!php_v8_callback_info) {
283+
php_v8_return_value = php_v8_callback_info_create_from_info(&callback_info, info);
284+
285+
if (!php_v8_return_value) {
285286
return;
286287
}
287288

288289
add_next_index_zval(args, &callback_info);
289290

290-
php_v8_callback_set_retval_from_callback_info(&rv, php_v8_callback_info->php_v8_return_value);
291+
php_v8_callback_set_retval_from_callback_info(&rv, php_v8_return_value);
291292

292293
php_v8_callback_call_from_bucket_with_zargs(index, info.Data(), args, NULL);
293294

294-
php_v8_callback_info_invalidate(php_v8_callback_info);
295+
php_v8_return_value_mark_expired(php_v8_return_value);
295296
}
296297

297298

0 commit comments

Comments
 (0)