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

Commit 17bbe95

Browse files
committed
Rework PromiseObject, closes #95
1 parent bbeb82e commit 17bbe95

15 files changed

+534
-302
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ on top of php-v8 extension and makes embedding JavaScript in PHP easier.
100100
### Requirements
101101

102102
#### V8
103-
You will need a recent v8 Google JavaScript engine version installed. At this time v8 >= 6.6.275 required.
103+
You will need a recent v8 Google JavaScript engine version installed. At this time v8 >= 6.6.313 required.
104104

105105
#### PHP
106106
This extension is PHP7-only. It works and tested with both PHP 7.0 and PHP 7.1.

config.m4

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ if test "$PHP_V8" != "no"; then
1919
SEARCH_PATH="/usr/local /usr"
2020
SEARCH_FOR="include/v8.h"
2121

22-
V8_MIN_API_VERSION_STR=6.6.275
22+
V8_MIN_API_VERSION_STR=6.6.313
2323

2424
DESIRED_V8_VERSION=`echo "${V8_MIN_API_VERSION_STR}" | $AWK 'BEGIN { FS = "."; } { printf "%s.%s", [$]1, [$]2;}'`
2525

@@ -204,6 +204,7 @@ if test "$PHP_V8" != "no"; then
204204
src/php_v8_date.cc \
205205
src/php_v8_regexp.cc \
206206
src/php_v8_promise.cc \
207+
src/php_v8_promise_resolver.cc \
207208
src/php_v8_proxy.cc \
208209
src/php_v8_number_object.cc \
209210
src/php_v8_boolean_object.cc \

scripts/test_v8/hello_world.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66

77
using namespace v8;
88

9+
void weak_callback(const v8::WeakCallbackInfo<v8::Persistent<v8::String>>& data) {
10+
printf("Weak callback called\n");
11+
data.GetParameter()->Reset();
12+
// data.GetIsolate()->AdjustAmountOfExternalAllocatedMemory(-(1024*1024*1024));
13+
}
14+
915
int main(int argc, char* argv[]) {
1016
// Initialize V8.
1117
//v8::V8::InitializeICU();

src/php_v8_promise.cc

-64
Original file line numberDiff line numberDiff line change
@@ -47,58 +47,6 @@ static PHP_METHOD(Promise, __construct) {
4747
php_v8_value->persistent->Reset(isolate, local_resolver);
4848
}
4949

50-
static PHP_METHOD(Promise, resolve) {
51-
zval *php_v8_context_zv;
52-
zval *php_v8_rvalue_zv;
53-
54-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "oo", &php_v8_context_zv, &php_v8_rvalue_zv) == FAILURE) {
55-
return;
56-
}
57-
58-
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
59-
PHP_V8_CONTEXT_FETCH_WITH_CHECK(php_v8_context_zv, php_v8_context);
60-
PHP_V8_VALUE_FETCH_WITH_CHECK(php_v8_rvalue_zv, php_v8_rvalue);
61-
62-
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_context);
63-
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_rvalue);
64-
65-
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
66-
PHP_V8_ENTER_CONTEXT(php_v8_context);
67-
68-
v8::Local<v8::Promise::Resolver> local_resolver = php_v8_value_get_local_as<v8::Promise::Resolver>(php_v8_value);
69-
v8::Local<v8::Value> local_rvalue = php_v8_value_get_local_as<v8::Value>(php_v8_rvalue);
70-
71-
v8::Maybe<bool> maybe_resolved = local_resolver->Resolve(context, local_rvalue);
72-
73-
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_NOTHING(maybe_resolved, "Failed to resolve a promise");
74-
}
75-
76-
static PHP_METHOD(Promise, reject) {
77-
zval *php_v8_context_zv;
78-
zval *php_v8_rvalue_zv;
79-
80-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "oo", &php_v8_context_zv, &php_v8_rvalue_zv) == FAILURE) {
81-
return;
82-
}
83-
84-
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
85-
PHP_V8_CONTEXT_FETCH_WITH_CHECK(php_v8_context_zv, php_v8_context);
86-
PHP_V8_VALUE_FETCH_WITH_CHECK(php_v8_rvalue_zv, php_v8_rvalue);
87-
88-
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_context);
89-
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_rvalue);
90-
91-
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
92-
PHP_V8_ENTER_CONTEXT(php_v8_context);
93-
94-
v8::Local<v8::Promise::Resolver> local_resolver = php_v8_value_get_local_as<v8::Promise::Resolver>(php_v8_value);
95-
v8::Local<v8::Value> local_rvalue = php_v8_value_get_local_as<v8::Value>(php_v8_rvalue);
96-
97-
v8::Maybe<bool> maybe_rejected = local_resolver->Reject(context, local_rvalue);
98-
99-
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_NOTHING(maybe_rejected, "Failed to reject a promise");
100-
}
101-
10250
static PHP_METHOD(Promise, catch) {
10351
zval *php_v8_context_zv;
10452
zval *php_v8_function_zv;
@@ -209,16 +157,6 @@ PHP_V8_ZEND_BEGIN_ARG_WITH_CONSTRUCTOR_INFO_EX(arginfo___construct, 1)
209157
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
210158
ZEND_END_ARG_INFO()
211159

212-
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_VOID_INFO_EX(arginfo_resolve, 2)
213-
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
214-
ZEND_ARG_OBJ_INFO(0, value, V8\\Value, 0)
215-
ZEND_END_ARG_INFO()
216-
217-
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_VOID_INFO_EX(arginfo_reject, 2)
218-
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
219-
ZEND_ARG_OBJ_INFO(0, value, V8\\Value, 0)
220-
ZEND_END_ARG_INFO()
221-
222160
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_catch, ZEND_RETURN_VALUE, 2, V8\\PromiseObject, 0)
223161
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
224162
ZEND_ARG_OBJ_INFO(0, handler, V8\\FunctionObject, 0)
@@ -241,8 +179,6 @@ ZEND_END_ARG_INFO()
241179

242180
static const zend_function_entry php_v8_promise_methods[] = {
243181
PHP_V8_ME(Promise, __construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
244-
PHP_V8_ME(Promise, resolve, ZEND_ACC_PUBLIC)
245-
PHP_V8_ME(Promise, reject, ZEND_ACC_PUBLIC)
246182
PHP_V8_ME(Promise, catch, ZEND_ACC_PUBLIC)
247183
PHP_V8_ME(Promise, then, ZEND_ACC_PUBLIC)
248184
PHP_V8_ME(Promise, hasHandler, ZEND_ACC_PUBLIC)

src/php_v8_promise.h

-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ extern "C" {
2525
}
2626

2727
extern zend_class_entry* php_v8_promise_class_entry;
28-
extern zend_class_entry* php_v8_promise_flags_class_entry;
2928

3029

3130
PHP_MINIT_FUNCTION(php_v8_promise);

src/php_v8_promise_resolver.cc

+137
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
/*
2+
* This file is part of the pinepain/php-v8 PHP extension.
3+
*
4+
* Copyright (c) 2015-2018 Bogdan Padalko <[email protected]>
5+
*
6+
* Licensed under the MIT license: http://opensource.org/licenses/MIT
7+
*
8+
* For the full copyright and license information, please view the
9+
* LICENSE file that was distributed with this source or visit
10+
* http://opensource.org/licenses/MIT
11+
*/
12+
13+
#ifdef HAVE_CONFIG_H
14+
#include "config.h"
15+
#endif
16+
17+
#include "php_v8_promise_resolver.h"
18+
#include "php_v8_promise.h"
19+
#include "php_v8_object.h"
20+
#include "php_v8_string.h"
21+
#include "php_v8_value.h"
22+
#include "php_v8_context.h"
23+
#include "php_v8.h"
24+
25+
zend_class_entry *php_v8_promise_resolver_class_entry;
26+
27+
#define this_ce php_v8_promise_resolver_class_entry
28+
29+
30+
static PHP_METHOD(Resolver, __construct) {
31+
zval rv;
32+
zval *php_v8_context_zv;
33+
34+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &php_v8_context_zv) == FAILURE) {
35+
return;
36+
}
37+
38+
PHP_V8_OBJECT_CONSTRUCT(getThis(), php_v8_context_zv, php_v8_context, php_v8_value);
39+
40+
v8::MaybeLocal<v8::Promise::Resolver> maybe_local_resolver = v8::Promise::Resolver::New(context);
41+
42+
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_EMPTY(maybe_local_resolver, "Failed to create Resolver object");
43+
44+
v8::Local<v8::Promise::Resolver> local_resolver = maybe_local_resolver.ToLocalChecked();
45+
php_v8_object_store_self_ptr(php_v8_value, local_resolver);
46+
47+
php_v8_value->persistent->Reset(isolate, local_resolver);
48+
}
49+
50+
static PHP_METHOD(Resolver, resolve) {
51+
zval *php_v8_context_zv;
52+
zval *php_v8_rvalue_zv;
53+
54+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "oo", &php_v8_context_zv, &php_v8_rvalue_zv) == FAILURE) {
55+
return;
56+
}
57+
58+
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
59+
PHP_V8_CONTEXT_FETCH_WITH_CHECK(php_v8_context_zv, php_v8_context);
60+
PHP_V8_VALUE_FETCH_WITH_CHECK(php_v8_rvalue_zv, php_v8_rvalue);
61+
62+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_context);
63+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_rvalue);
64+
65+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
66+
PHP_V8_ENTER_CONTEXT(php_v8_context);
67+
68+
v8::Local<v8::Promise::Resolver> local_resolver = php_v8_value_get_local_as<v8::Promise::Resolver>(php_v8_value);
69+
v8::Local<v8::Value> local_rvalue = php_v8_value_get_local_as<v8::Value>(php_v8_rvalue);
70+
71+
v8::Maybe<bool> maybe_resolved = local_resolver->Resolve(context, local_rvalue);
72+
73+
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_NOTHING(maybe_resolved, "Failed to resolve a promise");
74+
}
75+
76+
static PHP_METHOD(Resolver, reject) {
77+
zval *php_v8_context_zv;
78+
zval *php_v8_rvalue_zv;
79+
80+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "oo", &php_v8_context_zv, &php_v8_rvalue_zv) == FAILURE) {
81+
return;
82+
}
83+
84+
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
85+
PHP_V8_CONTEXT_FETCH_WITH_CHECK(php_v8_context_zv, php_v8_context);
86+
PHP_V8_VALUE_FETCH_WITH_CHECK(php_v8_rvalue_zv, php_v8_rvalue);
87+
88+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_context);
89+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_rvalue);
90+
91+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
92+
PHP_V8_ENTER_CONTEXT(php_v8_context);
93+
94+
v8::Local<v8::Promise::Resolver> local_resolver = php_v8_value_get_local_as<v8::Promise::Resolver>(php_v8_value);
95+
v8::Local<v8::Value> local_rvalue = php_v8_value_get_local_as<v8::Value>(php_v8_rvalue);
96+
97+
v8::Maybe<bool> maybe_rejected = local_resolver->Reject(context, local_rvalue);
98+
99+
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_NOTHING(maybe_rejected, "Failed to reject a promise");
100+
}
101+
102+
103+
PHP_V8_ZEND_BEGIN_ARG_WITH_CONSTRUCTOR_INFO_EX(arginfo___construct, 1)
104+
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
105+
ZEND_END_ARG_INFO()
106+
107+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_VOID_INFO_EX(arginfo_resolve, 2)
108+
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
109+
ZEND_ARG_OBJ_INFO(0, value, V8\\Value, 0)
110+
ZEND_END_ARG_INFO()
111+
112+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_VOID_INFO_EX(arginfo_reject, 2)
113+
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
114+
ZEND_ARG_OBJ_INFO(0, value, V8\\Value, 0)
115+
ZEND_END_ARG_INFO()
116+
117+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_getPromise, ZEND_RETURN_VALUE, 1, V8\\PromiseObject, 0)
118+
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
119+
ZEND_END_ARG_INFO()
120+
121+
122+
static const zend_function_entry php_v8_promise_resolver_methods[] = {
123+
PHP_V8_ME(Resolver, __construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
124+
PHP_V8_ME(Resolver, resolve, ZEND_ACC_PUBLIC)
125+
PHP_V8_ME(Resolver, reject, ZEND_ACC_PUBLIC)
126+
127+
PHP_FE_END
128+
};
129+
130+
131+
PHP_MINIT_FUNCTION(php_v8_promise_resolver) {
132+
zend_class_entry ce;
133+
INIT_NS_CLASS_ENTRY(ce, PHP_V8_NS "\\PromiseObject", "ResolverObject", php_v8_promise_resolver_methods);
134+
this_ce = zend_register_internal_class_ex(&ce, php_v8_promise_class_entry);
135+
136+
return SUCCESS;
137+
}

src/php_v8_promise_resolver.h

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* This file is part of the pinepain/php-v8 PHP extension.
3+
*
4+
* Copyright (c) 2015-2018 Bogdan Padalko <[email protected]>
5+
*
6+
* Licensed under the MIT license: http://opensource.org/licenses/MIT
7+
*
8+
* For the full copyright and license information, please view the
9+
* LICENSE file that was distributed with this source or visit
10+
* http://opensource.org/licenses/MIT
11+
*/
12+
13+
#ifndef PHP_V8_PROMISE_RESOLVER_H
14+
#define PHP_V8_PROMISE_RESOLVER_H
15+
16+
#include "php_v8_value.h"
17+
#include <v8.h>
18+
19+
extern "C" {
20+
#include "php.h"
21+
22+
#ifdef ZTS
23+
#include "TSRM.h"
24+
#endif
25+
}
26+
27+
extern zend_class_entry* php_v8_promise_resolver_class_entry;
28+
29+
30+
PHP_MINIT_FUNCTION(php_v8_promise_resolver);
31+
32+
#endif //PHP_V8_PROMISE_RESOLVER_H

stubs/src/PromiseObject.php

-20
Original file line numberDiff line numberDiff line change
@@ -29,26 +29,6 @@ public function __construct(Context $context)
2929
{
3030
}
3131

32-
/**
33-
* Resolve the promise with a given value. Ignored if the promise is no longer pending.
34-
*
35-
* @param Context $context
36-
* @param Value $value
37-
*/
38-
public function resolve(Context $context, Value $value)
39-
{
40-
}
41-
42-
/**
43-
* Reject the promise with a given value. Ignored if the promise is no longer pending.
44-
*
45-
* @param Context $context
46-
* @param Value $value
47-
*/
48-
public function reject(Context $context, Value $value)
49-
{
50-
}
51-
5232
/**
5333
* Register a resolution/rejection handler with the promise.
5434
*
+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php declare(strict_types=1);
2+
3+
/**
4+
* This file is part of the pinepain/php-v8 PHP extension.
5+
*
6+
* Copyright (c) 2015-2018 Bogdan Padalko <[email protected]>
7+
*
8+
* Licensed under the MIT license: http://opensource.org/licenses/MIT
9+
*
10+
* For the full copyright and license information, please view the
11+
* LICENSE file that was distributed with this source or visit
12+
* http://opensource.org/licenses/MIT
13+
*/
14+
15+
16+
namespace V8\PromiseObject;
17+
18+
use V8\Context;
19+
use V8\PromiseObject;
20+
use V8\Value;
21+
22+
23+
class ResolverObject extends PromiseObject
24+
{
25+
/**
26+
* @param Context $context
27+
*/
28+
public function __construct(Context $context)
29+
{
30+
}
31+
32+
/**
33+
* Resolve the promise with a given value. Ignored if the promise is no longer pending.
34+
*
35+
* @param Context $context
36+
* @param Value $value
37+
*/
38+
public function resolve(Context $context, Value $value)
39+
{
40+
}
41+
42+
/**
43+
* Reject the promise with a given value. Ignored if the promise is no longer pending.
44+
*
45+
* @param Context $context
46+
* @param Value $value
47+
*/
48+
public function reject(Context $context, Value $value)
49+
{
50+
}
51+
}

0 commit comments

Comments
 (0)