Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
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

Lines changed: 1 addition & 1 deletion
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

Lines changed: 2 additions & 1 deletion
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

Lines changed: 6 additions & 0 deletions
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

Lines changed: 0 additions & 64 deletions
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

Lines changed: 0 additions & 1 deletion
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

Lines changed: 137 additions & 0 deletions
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 <pinepain@gmail.com>
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

Lines changed: 32 additions & 0 deletions
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 <pinepain@gmail.com>
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

Lines changed: 0 additions & 20 deletions
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
*
Lines changed: 51 additions & 0 deletions
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 <pinepain@gmail.com>
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)

AltStyle によって変換されたページ (->オリジナル) /