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 731c4bd

Browse files
committed
Rework PromiseObject, closes #95
1 parent 401167f commit 731c4bd

15 files changed

+543
-326
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: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@
66

77
using namespace v8;
88

9+
10+
void then_fnc(const FunctionCallbackInfo<Value>& info) {
11+
info.GetReturnValue().Set(42);
12+
}
13+
914
int main(int argc, char* argv[]) {
1015
// Initialize V8.
11-
//v8::V8::InitializeICU();
12-
1316
std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
1417
v8::V8::InitializePlatform(platform.get());
1518

@@ -35,32 +38,21 @@ int main(int argc, char* argv[]) {
3538
// Enter the context for compiling and running the hello world script.
3639
Context::Scope context_scope(context);
3740

41+
Local<String> local_value = String::NewFromUtf8(isolate, "test");
3842

39-
test.Reset(isolate, String::NewFromUtf8(isolate, "Hello' + ', World!'"));
40-
test.SetWeak(&test, weak_callback, v8::WeakCallbackType::kParameter);
41-
// isolate->AdjustAmountOfExternalAllocatedMemory((1024*1024*1024));
43+
v8::MaybeLocal<v8::Promise::Resolver> maybe_local_resolver = v8::Promise::Resolver::New(context);
44+
v8::Local<v8::Promise::Resolver> local_resolver = maybe_local_resolver.ToLocalChecked();
4245

46+
v8::Local<v8::Function> local_then = v8::Function::New(context, then_fnc).ToLocalChecked();
4347

44-
// Create a string containing the JavaScript source code.
45-
// Local<String> source = String::NewFromUtf8(isolate, "(2+2*2) + ' ' + hw");
46-
Local<String> source = String::NewFromUtf8(isolate, "(2+2*2) + ' ' + 'Hello' + ', World!'");
48+
auto test1 = local_resolver->GetPromise()->Then(context, local_then).ToLocalChecked();
49+
auto test2 = test1->Then(context, local_then).ToLocalChecked();
50+
auto test3 = test2->Then(context, local_then).ToLocalChecked();
4751

48-
// v8::Local<v8::String> hw = v8::Local<v8::String>::New(isolate, test);
49-
// context->Global()->Set(String::NewFromUtf8(isolate, "hw"), hw);
50-
51-
// Compile the source code.
52-
Local<Script> script = Script::Compile(source);
53-
54-
// Run the script to get the result.
55-
Local<Value> result = script->Run();
56-
57-
// Convert the result to an UTF8 string and print it.
58-
String::Utf8Value utf8(isolate, result);
59-
printf("%s\n", *utf8);
52+
test2->Resolve(context, local_value);
53+
test3->Resolve(context, local_value);
6054
}
6155

62-
isolate->LowMemoryNotification();
63-
6456

6557
// Dispose the isolate and tear down V8.
6658
isolate->Dispose();

‎src/php_v8_promise.cc

Lines changed: 1 addition & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -38,67 +38,14 @@ static PHP_METHOD(Promise, __construct) {
3838

3939
v8::MaybeLocal<v8::Promise::Resolver> maybe_local_resolver = v8::Promise::Resolver::New(context);
4040

41-
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_EMPTY(maybe_local_resolver, "Failed to create Promise object");
41+
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_EMPTY(maybe_local_resolver, "Failed to create Resolver object");
4242

43-
// under the v8 hood v8::Promise::Resolver and v8::Promise are interchangable (with cast)
4443
v8::Local<v8::Promise::Resolver> local_resolver = maybe_local_resolver.ToLocalChecked();
4544
php_v8_object_store_self_ptr(php_v8_value, local_resolver);
4645

4746
php_v8_value->persistent->Reset(isolate, local_resolver);
4847
}
4948

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-
10249
static PHP_METHOD(Promise, catch) {
10350
zval *php_v8_context_zv;
10451
zval *php_v8_function_zv;
@@ -209,16 +156,6 @@ PHP_V8_ZEND_BEGIN_ARG_WITH_CONSTRUCTOR_INFO_EX(arginfo___construct, 1)
209156
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
210157
ZEND_END_ARG_INFO()
211158

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-
222159
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_catch, ZEND_RETURN_VALUE, 2, V8\\PromiseObject, 0)
223160
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
224161
ZEND_ARG_OBJ_INFO(0, handler, V8\\FunctionObject, 0)
@@ -241,8 +178,6 @@ ZEND_END_ARG_INFO()
241178

242179
static const zend_function_entry php_v8_promise_methods[] = {
243180
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)
246181
PHP_V8_ME(Promise, catch, ZEND_ACC_PUBLIC)
247182
PHP_V8_ME(Promise, then, ZEND_ACC_PUBLIC)
248183
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
*

0 commit comments

Comments
(0)

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