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 70fa967

Browse files
committed
Add V8\SetObject
1 parent ffa8f19 commit 70fa967

File tree

7 files changed

+785
-0
lines changed

7 files changed

+785
-0
lines changed

‎config.m4‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ if test "$PHP_V8" != "no"; then
202202
src/php_v8_function.cc \
203203
src/php_v8_array.cc \
204204
src/php_v8_map.cc \
205+
src/php_v8_set.cc \
205206
src/php_v8_date.cc \
206207
src/php_v8_regexp.cc \
207208
src/php_v8_number_object.cc \

‎src/php_v8_set.cc‎

Lines changed: 242 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,242 @@
1+
/*
2+
* This file is part of the pinepain/php-v8 PHP extension.
3+
*
4+
* Copyright (c) 2015-2017 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_set.h"
18+
#include "php_v8_object.h"
19+
#include "php_v8_context.h"
20+
#include "php_v8_value.h"
21+
#include "php_v8.h"
22+
23+
zend_class_entry *php_v8_set_class_entry;
24+
#define this_ce php_v8_set_class_entry
25+
26+
v8::Local<v8::Set> php_v8_value_get_set_local(v8::Isolate *isolate, php_v8_value_t *php_v8_value) {
27+
return v8::Local<v8::Set>::Cast(php_v8_value_get_value_local(isolate, php_v8_value));
28+
};
29+
30+
static PHP_METHOD(V8Set, __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::Local<v8::Set> local_set = v8::Set::New(isolate);
41+
42+
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_EMPTY(local_set, "Failed to create Map value");
43+
44+
ZVAL_COPY_VALUE(&php_v8_value->this_ptr, getThis());
45+
php_v8_object_store_self_ptr(isolate, local_set, php_v8_value);
46+
47+
php_v8_value->persistent->Reset(isolate, local_set);
48+
}
49+
50+
static PHP_METHOD(V8Set, Size) {
51+
if (zend_parse_parameters_none() == FAILURE) {
52+
return;
53+
}
54+
55+
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
56+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
57+
PHP_V8_ENTER_STORED_CONTEXT(php_v8_value);
58+
59+
RETURN_DOUBLE(php_v8_value_get_set_local(isolate, php_v8_value)->Size());
60+
}
61+
62+
static PHP_METHOD(V8Set, Clear) {
63+
if (zend_parse_parameters_none() == FAILURE) {
64+
return;
65+
}
66+
67+
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
68+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
69+
PHP_V8_ENTER_STORED_CONTEXT(php_v8_value);
70+
71+
php_v8_value_get_set_local(isolate, php_v8_value)->Clear();
72+
}
73+
74+
static PHP_METHOD(V8Set, Add) {
75+
zval *php_v8_context_zv;
76+
zval *php_v8_key_zv;
77+
78+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "oo", &php_v8_context_zv, &php_v8_key_zv) == FAILURE) {
79+
return;
80+
}
81+
82+
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
83+
PHP_V8_VALUE_FETCH_WITH_CHECK(php_v8_key_zv, php_v8_key);
84+
PHP_V8_CONTEXT_FETCH_WITH_CHECK(php_v8_context_zv, php_v8_context);
85+
86+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_context);
87+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_key);
88+
89+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
90+
PHP_V8_ENTER_CONTEXT(php_v8_context);
91+
92+
v8::Local<v8::Set> local_set = php_v8_value_get_set_local(isolate, php_v8_value);
93+
v8::Local<v8::Value> local_key = php_v8_value_get_value_local(isolate, php_v8_key);
94+
95+
PHP_V8_TRY_CATCH(isolate);
96+
PHP_V8_INIT_ISOLATE_LIMITS_ON_OBJECT_VALUE(php_v8_value);
97+
98+
v8::MaybeLocal<v8::Set> maybe_local_res = local_set->Add(context, local_key);
99+
100+
PHP_V8_MAYBE_CATCH(php_v8_context, try_catch);
101+
PHP_V8_THROW_EXCEPTION_WHEN_EMPTY(maybe_local_res, "Failed to add");
102+
103+
RETVAL_ZVAL(&php_v8_value->this_ptr, 1, 0);
104+
}
105+
106+
static PHP_METHOD(V8Set, Has) {
107+
zval *php_v8_context_zv;
108+
zval *php_v8_key_zv;
109+
110+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "oo", &php_v8_context_zv, &php_v8_key_zv) == FAILURE) {
111+
return;
112+
}
113+
114+
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
115+
PHP_V8_VALUE_FETCH_WITH_CHECK(php_v8_key_zv, php_v8_key);
116+
PHP_V8_CONTEXT_FETCH_WITH_CHECK(php_v8_context_zv, php_v8_context);
117+
118+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_context);
119+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_key);
120+
121+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
122+
PHP_V8_ENTER_CONTEXT(php_v8_context);
123+
124+
v8::Local<v8::Set> local_set = php_v8_value_get_set_local(isolate, php_v8_value);
125+
v8::Local<v8::Value> local_key = php_v8_value_get_value_local(isolate, php_v8_key);
126+
127+
PHP_V8_TRY_CATCH(isolate);
128+
PHP_V8_INIT_ISOLATE_LIMITS_ON_OBJECT_VALUE(php_v8_value);
129+
130+
v8::Maybe<bool> maybe_res = local_set->Has(context, local_key);
131+
132+
PHP_V8_MAYBE_CATCH(php_v8_context, try_catch);
133+
PHP_V8_THROW_EXCEPTION_WHEN_NOTHING(maybe_res, "Failed to check");
134+
135+
RETURN_BOOL(maybe_res.FromJust());
136+
}
137+
138+
static PHP_METHOD(V8Set, Delete) {
139+
zval *php_v8_context_zv;
140+
zval *php_v8_key_zv;
141+
142+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "oo", &php_v8_context_zv, &php_v8_key_zv) == FAILURE) {
143+
return;
144+
}
145+
146+
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
147+
PHP_V8_VALUE_FETCH_WITH_CHECK(php_v8_key_zv, php_v8_key);
148+
PHP_V8_CONTEXT_FETCH_WITH_CHECK(php_v8_context_zv, php_v8_context);
149+
150+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_context);
151+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_key);
152+
153+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
154+
PHP_V8_ENTER_CONTEXT(php_v8_context);
155+
156+
v8::Local<v8::Set> local_set = php_v8_value_get_set_local(isolate, php_v8_value);
157+
v8::Local<v8::Value> local_key = php_v8_value_get_value_local(isolate, php_v8_key);
158+
159+
PHP_V8_TRY_CATCH(isolate);
160+
PHP_V8_INIT_ISOLATE_LIMITS_ON_OBJECT_VALUE(php_v8_value);
161+
162+
v8::Maybe<bool> maybe_res = local_set->Delete(context, local_key);
163+
164+
PHP_V8_MAYBE_CATCH(php_v8_context, try_catch);
165+
PHP_V8_THROW_EXCEPTION_WHEN_NOTHING(maybe_res, "Failed to delete");
166+
167+
RETURN_BOOL(maybe_res.FromJust());
168+
}
169+
170+
static PHP_METHOD(V8Set, AsArray) {
171+
if (zend_parse_parameters_none() == FAILURE) {
172+
return;
173+
}
174+
175+
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
176+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
177+
PHP_V8_ENTER_STORED_CONTEXT(php_v8_value);
178+
179+
PHP_V8_TRY_CATCH(isolate);
180+
PHP_V8_INIT_ISOLATE_LIMITS_ON_OBJECT_VALUE(php_v8_value);
181+
182+
v8::Local<v8::Array> local_array = php_v8_value_get_set_local(isolate, php_v8_value)->AsArray();
183+
184+
PHP_V8_MAYBE_CATCH(php_v8_value->php_v8_context, try_catch);
185+
PHP_V8_THROW_EXCEPTION_WHEN_EMPTY(local_array, "Failed to get property names")
186+
187+
php_v8_get_or_create_value(return_value, local_array, isolate);
188+
}
189+
190+
191+
ZEND_BEGIN_ARG_INFO_EX(arginfo_v8_set___construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
192+
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
193+
ZEND_END_ARG_INFO()
194+
195+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_set_Size, ZEND_RETURN_VALUE, 0, IS_DOUBLE, 0)
196+
ZEND_END_ARG_INFO()
197+
198+
ZEND_BEGIN_ARG_INFO_EX(arginfo_v8_set_Clear, ZEND_RETURN_VALUE, ZEND_RETURN_VALUE, 0)
199+
ZEND_END_ARG_INFO()
200+
201+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_set_Add, ZEND_RETURN_VALUE, 3, V8\\SetObject, 0)
202+
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
203+
ZEND_ARG_OBJ_INFO(0, key, V8\\Value, 0)
204+
ZEND_END_ARG_INFO()
205+
206+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_set_Has, ZEND_RETURN_VALUE, 2, _IS_BOOL, 0)
207+
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
208+
ZEND_ARG_OBJ_INFO(0, key, V8\\Value, 0)
209+
ZEND_END_ARG_INFO()
210+
211+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_set_Delete, ZEND_RETURN_VALUE, 2, _IS_BOOL, 0)
212+
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
213+
ZEND_ARG_OBJ_INFO(0, key, V8\\Value, 0)
214+
ZEND_END_ARG_INFO()
215+
216+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_set_AsArray, ZEND_RETURN_VALUE, 0, V8\\ArrayObject, 0)
217+
ZEND_END_ARG_INFO()
218+
219+
220+
static const zend_function_entry php_v8_set_methods[] = {
221+
PHP_ME(V8Set, __construct, arginfo_v8_set___construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
222+
223+
PHP_ME(V8Set, Size, arginfo_v8_set_Size, ZEND_ACC_PUBLIC)
224+
PHP_ME(V8Set, Clear, arginfo_v8_set_Clear, ZEND_ACC_PUBLIC)
225+
226+
PHP_ME(V8Set, Add, arginfo_v8_set_Add, ZEND_ACC_PUBLIC)
227+
PHP_ME(V8Set, Has, arginfo_v8_set_Has, ZEND_ACC_PUBLIC)
228+
PHP_ME(V8Set, Delete, arginfo_v8_set_Delete, ZEND_ACC_PUBLIC)
229+
230+
PHP_ME(V8Set, AsArray, arginfo_v8_set_AsArray, ZEND_ACC_PUBLIC)
231+
232+
PHP_FE_END
233+
};
234+
235+
236+
PHP_MINIT_FUNCTION(php_v8_set) {
237+
zend_class_entry ce;
238+
INIT_NS_CLASS_ENTRY(ce, PHP_V8_NS, "SetObject", php_v8_set_methods);
239+
this_ce = zend_register_internal_class_ex(&ce, php_v8_object_class_entry);
240+
241+
return SUCCESS;
242+
}

‎src/php_v8_set.h‎

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* This file is part of the pinepain/php-v8 PHP extension.
3+
*
4+
* Copyright (c) 2015-2017 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_SET_H
14+
#define PHP_V8_SET_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_set_class_entry;
28+
29+
extern v8::Local<v8::Set> php_v8_value_get_set_local(v8::Isolate *isolate, php_v8_value_t *php_v8_value);
30+
31+
PHP_MINIT_FUNCTION(php_v8_set);
32+
33+
#endif //PHP_V8_SET_H

‎src/php_v8_value.cc‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "php_v8_function.h"
2828
#include "php_v8_array.h"
2929
#include "php_v8_map.h"
30+
#include "php_v8_set.h"
3031
#include "php_v8_object.h"
3132

3233
#include "php_v8_null.h"
@@ -231,6 +232,10 @@ zend_class_entry *php_v8_get_class_entry_from_value(v8::Local<v8::Value> value)
231232
return php_v8_map_class_entry;
232233
}
233234

235+
if (value->IsSet()) {
236+
return php_v8_set_class_entry;
237+
}
238+
234239
// anything else will be just an object
235240
return php_v8_object_class_entry;
236241
}

‎stubs/src/SetObject.php‎

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
/**
4+
* This file is part of the pinepain/php-v8 PHP extension.
5+
*
6+
* Copyright (c) 2015-2017 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;
17+
18+
/**
19+
* An instance of the built-in Set constructor (ECMA-262, 6th Edition, 23.2.1).
20+
*/
21+
class SetObject extends ObjectValue
22+
{
23+
public function Size(): float
24+
{
25+
}
26+
27+
public function Clear()
28+
{
29+
}
30+
31+
public function Add(Context $context, Value $key): SetObject
32+
{
33+
}
34+
35+
public function Has(Context $context, Value $key): bool
36+
{
37+
}
38+
39+
public function Delete(Context $context, Value $key): bool
40+
{
41+
}
42+
43+
/**
44+
* Returns an array of the keys in this Set.
45+
*/
46+
public function AsArray(): ArrayObject
47+
{
48+
}
49+
}
50+

0 commit comments

Comments
(0)

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