Skip to content
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)