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

Add new methods #4

Merged
merged 10 commits into from
Aug 21, 2016
Merged
13 changes: 10 additions & 3 deletions config.m4
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ if test "$PHP_V8" != "no"; then
AC_LANG_SAVE
AC_LANG_CPLUSPLUS


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

V8_MIN_API_VERSION_STR=5.4.420

if test "$ac_cv_v8_version" != "NONE"; then
ac_IFS=$IFS
IFS=.
set $ac_cv_v8_version
IFS=$ac_IFS
V8_API_VERSION=`expr [$]1 \* 1000000 + [$]2 \* 1000 + [$]3`
if test "$V8_API_VERSION" -lt 501000 ; then
AC_MSG_ERROR([libv8 must be version 5.1.0 or greater])
IFS=.
set $V8_MIN_API_VERSION_STR
IFS=$ac_IFS
V8_MIN_API_VERSION=`expr [$]1 \* 1000000 + [$]2 \* 1000 + [$]3`
if test "$V8_API_VERSION" -lt $V8_MIN_API_VERSION ; then
AC_MSG_ERROR([libv8 must be version $V8_MIN_API_VERSION_STR or greater])
fi
AC_DEFINE_UNQUOTED([PHP_V8_LIBV8_API_VERSION], $V8_API_VERSION, [ ])
AC_DEFINE_UNQUOTED([PHP_V8_LIBV8_VERSION], "$ac_cv_v8_version", [ ])
Expand Down Expand Up @@ -209,6 +215,7 @@ if test "$PHP_V8" != "no"; then
src/php_v8_integer.cc \
src/php_v8_int32.cc \
src/php_v8_uint32.cc \
src/php_v8_integrity_level.cc \
src/php_v8_object.cc \
src/php_v8_function.cc \
src/php_v8_array.cc \
Expand Down
30 changes: 30 additions & 0 deletions scripts/replace_expect.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/usr/bin/env php
<?php

$tests_dir = realpath(__DIR__ . '/../tests');
$iterator = new GlobIterator($tests_dir . '/*.out', FilesystemIterator::KEY_AS_FILENAME);

foreach ($iterator as $item) {
//var_dump($item);
$out_file = $iterator->key();
$base_name = preg_replace('/\.out$/i', '', $iterator->key());
$test_file = $base_name .'.phpt';

$test_content = file_get_contents($tests_dir . '/' . $test_file);

if (false !== ($pos = strpos($test_content, '--EXPECT--'))) {
printf("--EXPECT-- [%s]".PHP_EOL, $iterator->key());

$test_content = substr($test_content, 0, $pos);
$test_content .= '--EXPECT--'.PHP_EOL;
$test_content .= file_get_contents($tests_dir . '/' . $out_file);
$test_content .= PHP_EOL;
file_put_contents($tests_dir . '/' . $test_file, $test_content);

foreach (['.diff', '.exp', '.log', '.mem', '.out', '.php', '.sh'] as $ext) {
@unlink($tests_dir. '/'.$base_name . $ext);
}
} else {
printf("please, edit manually [%s]".PHP_EOL, $iterator->key());
}
}
37 changes: 26 additions & 11 deletions src/php_v8_callback_info.cc
Original file line number Diff line number Diff line change
Expand Up @@ -31,20 +31,17 @@ php_v8_callback_info_t * php_v8_callback_info_fetch_object(zend_object *obj) {
return (php_v8_callback_info_t *)((char *)obj - XtOffsetOf(php_v8_callback_info_t, std));
}

void php_v8_callback_info_invalidate(zval *val) {
PHP_V8_CALLBACK_INFO_FETCH_INTO(val, php_v8_callback_info);
php_v8_callback_info->php_v8_isolate = NULL;

if (!Z_ISUNDEF(php_v8_callback_info->retval)) {
php_v8_return_value_mark_expired(&php_v8_callback_info->retval);
void php_v8_callback_info_invalidate(php_v8_callback_info_t *php_v8_callback_info) {
if (php_v8_callback_info->php_v8_return_value) {
php_v8_return_value_mark_expired(php_v8_callback_info->php_v8_return_value);
}
}


static HashTable * php_v8_callback_info_gc(zval *object, zval **table, int *n) {
PHP_V8_CALLBACK_INFO_FETCH_INTO(object, php_v8_callback_info);

int size = 2; // args + retval
int size = 2; // args + php_v8_return_value->this_ptr

if (php_v8_callback_info->gc_data_count < size) {
php_v8_callback_info->gc_data = (zval *)safe_erealloc(php_v8_callback_info->gc_data, size, sizeof(zval), 0);
Expand All @@ -53,7 +50,7 @@ static HashTable * php_v8_callback_info_gc(zval *object, zval **table, int *n) {
php_v8_callback_info->gc_data_count = size;

ZVAL_COPY_VALUE(&php_v8_callback_info->gc_data[0], &php_v8_callback_info->args);
ZVAL_COPY_VALUE(&php_v8_callback_info->gc_data[1], &php_v8_callback_info->retval);
ZVAL_COPY_VALUE(&php_v8_callback_info->gc_data[1], &php_v8_callback_info->php_v8_return_value->this_ptr);

*table = php_v8_callback_info->gc_data;
*n = php_v8_callback_info->gc_data_count;
Expand Down Expand Up @@ -93,8 +90,12 @@ void php_v8_callback_info_free(zend_object *object) {
delete php_v8_callback_info->holder_obj;
}

if (!Z_ISUNDEF(php_v8_callback_info->retval)) {
zval_ptr_dtor(&php_v8_callback_info->retval);
if (php_v8_callback_info->php_v8_return_value) {
if (!Z_ISUNDEF(php_v8_callback_info->php_v8_return_value->this_ptr)) {
zval_ptr_dtor(&php_v8_callback_info->php_v8_return_value->this_ptr);
}

php_v8_callback_info->php_v8_return_value = NULL;
}

if (!Z_ISUNDEF(php_v8_callback_info->args)) {
Expand Down Expand Up @@ -186,7 +187,17 @@ static PHP_METHOD(V8CallbackInfo, GetReturnValue) {
PHP_V8_CALLBACK_INFO_FETCH_WITH_CHECK(getThis(), php_v8_callback_info);
PHP_V8_V8_CALLBACK_INFO_CHECK_IN_CONTEXT(php_v8_callback_info);

RETVAL_ZVAL(&php_v8_callback_info->retval, 1, 0);
RETVAL_ZVAL(&php_v8_callback_info->php_v8_return_value->this_ptr, 1, 0);
}

static PHP_METHOD(V8CallbackInfo, InContext) {
if (zend_parse_parameters_none() == FAILURE) {
return;
}

PHP_V8_CALLBACK_INFO_FETCH_WITH_CHECK(getThis(), php_v8_callback_info);

RETURN_BOOL(PHP_V8_V8_CALLBACK_INFO_IN_CONTEXT(php_v8_callback_info));
}


Expand All @@ -205,13 +216,17 @@ ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_callback_info_GetReturnValue, ZEND_RETURN_VALUE, 0, IS_OBJECT, PHP_V8_NS "\\ReturnValue", 0)
ZEND_END_ARG_INFO()

ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_callback_info_InContext, ZEND_RETURN_VALUE, 0, _IS_BOOL, NULL, 0)
ZEND_END_ARG_INFO()


static const zend_function_entry php_v8_callback_info_methods[] = {
PHP_ME(V8CallbackInfo, This, arginfo_v8_callback_info_This, ZEND_ACC_PUBLIC)
PHP_ME(V8CallbackInfo, Holder, arginfo_v8_callback_info_Holder, ZEND_ACC_PUBLIC)
PHP_ME(V8CallbackInfo, GetIsolate, arginfo_v8_callback_info_GetIsolate, ZEND_ACC_PUBLIC)
PHP_ME(V8CallbackInfo, GetContext, arginfo_v8_callback_info_GetContext, ZEND_ACC_PUBLIC)
PHP_ME(V8CallbackInfo, GetReturnValue, arginfo_v8_callback_info_GetReturnValue, ZEND_ACC_PUBLIC)
PHP_ME(V8CallbackInfo, InContext, arginfo_v8_callback_info_InContext, ZEND_ACC_PUBLIC)
PHP_FE_END
};

Expand Down
9 changes: 5 additions & 4 deletions src/php_v8_callback_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

typedef struct _php_v8_callback_info_t php_v8_callback_info_t;

#include "php_v8_return_value.h"
#include "php_v8_exceptions.h"
#include "php_v8_context.h"
#include "php_v8_isolate.h"
Expand All @@ -34,7 +35,7 @@ extern zend_class_entry* php_v8_callback_info_class_entry;


extern php_v8_callback_info_t * php_v8_callback_info_fetch_object(zend_object *obj);
extern void php_v8_callback_info_invalidate(zval *val);
extern void php_v8_callback_info_invalidate(php_v8_callback_info_t *php_v8_callback_info);

#define PHP_V8_CALLBACK_INFO_FETCH(zv) php_v8_callback_info_fetch_object(Z_OBJ_P(zv))
#define PHP_V8_CALLBACK_INFO_FETCH_INTO(pzval, into) php_v8_callback_info_t *(into) = PHP_V8_CALLBACK_INFO_FETCH((pzval));
Expand All @@ -48,10 +49,10 @@ extern void php_v8_callback_info_invalidate(zval *val);
PHP_V8_CALLBACK_INFO_FETCH_INTO(pzval, into); \
PHP_V8_CHECK_EMPTY_CALLBACK_INFO_HANDLER(into);

#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))

// TODO: suggest better naming
#define PHP_V8_V8_CALLBACK_INFO_CHECK_IN_CONTEXT(value) \
if ((value)->php_v8_isolate == NULL) { \
if (!PHP_V8_V8_CALLBACK_INFO_IN_CONTEXT(value)) { \
PHP_V8_THROW_EXCEPTION("Attempt to use callback info object out of callback context"); \
return; \
}
Expand All @@ -69,7 +70,7 @@ struct _php_v8_callback_info_t {
v8::Persistent<v8::Object> *holder_obj;
bool is_construct_call;

zval retval;
php_v8_return_value_t *php_v8_return_value;
zval args;

zval *gc_data;
Expand Down
Loading