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

Commit 5b51ced

Browse files
authored
Merge pull request #4 from pinepain/add_new_methods
Add new methods
2 parents 84edd91 + 2d12144 commit 5b51ced

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1372
-480
lines changed

config.m4

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ if test "$PHP_V8" != "no"; then
101101
AC_LANG_SAVE
102102
AC_LANG_CPLUSPLUS
103103

104-
104+
# NOTE: it is possible to get version string from headers with simple regexp match
105105
AC_CACHE_CHECK(for V8 version, ac_cv_v8_version, [
106106
AC_TRY_RUN([
107107
#include <v8.h>
@@ -123,14 +123,20 @@ if test "$PHP_V8" != "no"; then
123123
], [ac_cv_v8_version=`cat ./conftestval|awk '{print $1}'`], [ac_cv_v8_version=NONE], [ac_cv_v8_version=NONE])
124124
])
125125

126+
V8_MIN_API_VERSION_STR=5.4.420
127+
126128
if test "$ac_cv_v8_version" != "NONE"; then
127129
ac_IFS=$IFS
128130
IFS=.
129131
set $ac_cv_v8_version
130132
IFS=$ac_IFS
131133
V8_API_VERSION=`expr [$]1 \* 1000000 + [$]2 \* 1000 + [$]3`
132-
if test "$V8_API_VERSION" -lt 501000 ; then
133-
AC_MSG_ERROR([libv8 must be version 5.1.0 or greater])
134+
IFS=.
135+
set $V8_MIN_API_VERSION_STR
136+
IFS=$ac_IFS
137+
V8_MIN_API_VERSION=`expr [$]1 \* 1000000 + [$]2 \* 1000 + [$]3`
138+
if test "$V8_API_VERSION" -lt $V8_MIN_API_VERSION ; then
139+
AC_MSG_ERROR([libv8 must be version $V8_MIN_API_VERSION_STR or greater])
134140
fi
135141
AC_DEFINE_UNQUOTED([PHP_V8_LIBV8_API_VERSION], $V8_API_VERSION, [ ])
136142
AC_DEFINE_UNQUOTED([PHP_V8_LIBV8_VERSION], "$ac_cv_v8_version", [ ])
@@ -209,6 +215,7 @@ if test "$PHP_V8" != "no"; then
209215
src/php_v8_integer.cc \
210216
src/php_v8_int32.cc \
211217
src/php_v8_uint32.cc \
218+
src/php_v8_integrity_level.cc \
212219
src/php_v8_object.cc \
213220
src/php_v8_function.cc \
214221
src/php_v8_array.cc \

scripts/replace_expect.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#!/usr/bin/env php
2+
<?php
3+
4+
$tests_dir = realpath(__DIR__ . '/../tests');
5+
$iterator = new GlobIterator($tests_dir . '/*.out', FilesystemIterator::KEY_AS_FILENAME);
6+
7+
foreach ($iterator as $item) {
8+
//var_dump($item);
9+
$out_file = $iterator->key();
10+
$base_name = preg_replace('/\.out$/i', '', $iterator->key());
11+
$test_file = $base_name .'.phpt';
12+
13+
$test_content = file_get_contents($tests_dir . '/' . $test_file);
14+
15+
if (false !== ($pos = strpos($test_content, '--EXPECT--'))) {
16+
printf("--EXPECT-- [%s]".PHP_EOL, $iterator->key());
17+
18+
$test_content = substr($test_content, 0, $pos);
19+
$test_content .= '--EXPECT--'.PHP_EOL;
20+
$test_content .= file_get_contents($tests_dir . '/' . $out_file);
21+
$test_content .= PHP_EOL;
22+
file_put_contents($tests_dir . '/' . $test_file, $test_content);
23+
24+
foreach (['.diff', '.exp', '.log', '.mem', '.out', '.php', '.sh'] as $ext) {
25+
@unlink($tests_dir. '/'.$base_name . $ext);
26+
}
27+
} else {
28+
printf("please, edit manually [%s]".PHP_EOL, $iterator->key());
29+
}
30+
}

src/php_v8_callback_info.cc

Lines changed: 26 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,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()
205216
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_callback_info_GetReturnValue, ZEND_RETURN_VALUE, 0, IS_OBJECT, PHP_V8_NS "\\ReturnValue", 0)
206217
ZEND_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

209223
static 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

src/php_v8_callback_info.h

Lines changed: 5 additions & 4 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));
@@ -48,10 +49,10 @@ extern void php_v8_callback_info_invalidate(zval *val);
4849
PHP_V8_CALLBACK_INFO_FETCH_INTO(pzval, into); \
4950
PHP_V8_CHECK_EMPTY_CALLBACK_INFO_HANDLER(into);
5051

52+
#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))
5153

52-
// TODO: suggest better naming
5354
#define PHP_V8_V8_CALLBACK_INFO_CHECK_IN_CONTEXT(value) \
54-
if ((value)->php_v8_isolate == NULL) { \
55+
if (!PHP_V8_V8_CALLBACK_INFO_IN_CONTEXT(value)) { \
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;

0 commit comments

Comments
 (0)