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

Commit 24f6706

Browse files
committed
Add V8\MapObject
1 parent 8477a9f commit 24f6706

File tree

8 files changed

+874
-4
lines changed

8 files changed

+874
-4
lines changed

config.m4

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

src/php_v8_map.cc

Lines changed: 290 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,290 @@
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_map.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_map_class_entry;
24+
#define this_ce php_v8_map_class_entry
25+
26+
v8::Local<v8::Map> php_v8_value_get_map_local(v8::Isolate *isolate, php_v8_value_t *php_v8_value) {
27+
return v8::Local<v8::Map>::Cast(php_v8_value_get_value_local(isolate, php_v8_value));
28+
};
29+
30+
static PHP_METHOD(V8Map, __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::Map> local_map = v8::Map::New(isolate);
41+
42+
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_EMPTY(local_map, "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_map, php_v8_value);
46+
47+
php_v8_value->persistent->Reset(isolate, local_map);
48+
}
49+
50+
static PHP_METHOD(V8Map, 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_map_local(isolate, php_v8_value)->Size());
60+
}
61+
62+
static PHP_METHOD(V8Map, 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_map_local(isolate, php_v8_value)->Clear();
72+
}
73+
74+
static PHP_METHOD(V8Map, Get) {
75+
zval *php_v8_context_zv;
76+
zval *php_v8_key_zv;
77+
v8::MaybeLocal<v8::Value> maybe_local;
78+
79+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "oo", &php_v8_context_zv, &php_v8_key_zv) == FAILURE) {
80+
return;
81+
}
82+
83+
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
84+
PHP_V8_VALUE_FETCH_WITH_CHECK(php_v8_key_zv, php_v8_key);
85+
PHP_V8_CONTEXT_FETCH_WITH_CHECK(php_v8_context_zv, php_v8_context);
86+
87+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_context);
88+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_key);
89+
90+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
91+
PHP_V8_ENTER_CONTEXT(php_v8_context);
92+
93+
v8::Local<v8::Map> local_map = php_v8_value_get_map_local(isolate, php_v8_value);
94+
v8::Local<v8::Value> local_key = php_v8_value_get_value_local(isolate, php_v8_key);
95+
96+
PHP_V8_TRY_CATCH(isolate);
97+
PHP_V8_INIT_ISOLATE_LIMITS_ON_OBJECT_VALUE(php_v8_value);
98+
99+
maybe_local = local_map->Get(context, local_key);
100+
101+
PHP_V8_MAYBE_CATCH(php_v8_context, try_catch);
102+
PHP_V8_THROW_EXCEPTION_WHEN_EMPTY(maybe_local, "Failed to get");
103+
104+
v8::Local<v8::Value> local_value = maybe_local.ToLocalChecked();
105+
106+
php_v8_get_or_create_value(return_value, local_value, isolate);
107+
}
108+
109+
110+
static PHP_METHOD(V8Map, Set) {
111+
zval *php_v8_context_zv;
112+
zval *php_v8_key_zv;
113+
zval *php_v8_value_zv;
114+
115+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ooo", &php_v8_context_zv, &php_v8_key_zv, &php_v8_value_zv) == FAILURE) {
116+
return;
117+
}
118+
119+
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
120+
PHP_V8_VALUE_FETCH_WITH_CHECK(php_v8_key_zv, php_v8_key);
121+
PHP_V8_VALUE_FETCH_WITH_CHECK(php_v8_value_zv, php_v8_value_value_to_set);
122+
PHP_V8_CONTEXT_FETCH_WITH_CHECK(php_v8_context_zv, php_v8_context);
123+
124+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_context);
125+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_key);
126+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_value_value_to_set);
127+
128+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
129+
PHP_V8_ENTER_CONTEXT(php_v8_context);
130+
131+
v8::Local<v8::Map> local_map = php_v8_value_get_map_local(isolate, php_v8_value);
132+
v8::Local<v8::Value> local_key = php_v8_value_get_value_local(isolate, php_v8_key);
133+
v8::Local<v8::Value> local_value_to_set = php_v8_value_get_value_local(isolate, php_v8_value_value_to_set);
134+
135+
PHP_V8_TRY_CATCH(isolate);
136+
PHP_V8_INIT_ISOLATE_LIMITS_ON_OBJECT_VALUE(php_v8_value);
137+
138+
v8::MaybeLocal<v8::Map> maybe_local_res = local_map->Set(context, local_key, local_value_to_set);
139+
140+
PHP_V8_MAYBE_CATCH(php_v8_context, try_catch);
141+
PHP_V8_THROW_EXCEPTION_WHEN_EMPTY(maybe_local_res, "Failed to set");
142+
143+
RETVAL_ZVAL(&php_v8_value->this_ptr, 1, 0);
144+
}
145+
146+
147+
static PHP_METHOD(V8Map, Has) {
148+
zval *php_v8_context_zv;
149+
zval *php_v8_key_zv;
150+
151+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "oo", &php_v8_context_zv, &php_v8_key_zv) == FAILURE) {
152+
return;
153+
}
154+
155+
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
156+
PHP_V8_VALUE_FETCH_WITH_CHECK(php_v8_key_zv, php_v8_key);
157+
PHP_V8_CONTEXT_FETCH_WITH_CHECK(php_v8_context_zv, php_v8_context);
158+
159+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_context);
160+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_key);
161+
162+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
163+
PHP_V8_ENTER_CONTEXT(php_v8_context);
164+
165+
v8::Local<v8::Map> local_map = php_v8_value_get_map_local(isolate, php_v8_value);
166+
v8::Local<v8::Value> local_key = php_v8_value_get_value_local(isolate, php_v8_key);
167+
168+
PHP_V8_TRY_CATCH(isolate);
169+
PHP_V8_INIT_ISOLATE_LIMITS_ON_OBJECT_VALUE(php_v8_value);
170+
171+
v8::Maybe<bool> maybe_res = local_map->Has(context, local_key);
172+
173+
PHP_V8_MAYBE_CATCH(php_v8_context, try_catch);
174+
PHP_V8_THROW_EXCEPTION_WHEN_NOTHING(maybe_res, "Failed to check");
175+
176+
RETURN_BOOL(maybe_res.FromJust());
177+
}
178+
179+
static PHP_METHOD(V8Map, Delete) {
180+
zval *php_v8_context_zv;
181+
zval *php_v8_key_zv;
182+
183+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "oo", &php_v8_context_zv, &php_v8_key_zv) == FAILURE) {
184+
return;
185+
}
186+
187+
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
188+
PHP_V8_VALUE_FETCH_WITH_CHECK(php_v8_key_zv, php_v8_key);
189+
PHP_V8_CONTEXT_FETCH_WITH_CHECK(php_v8_context_zv, php_v8_context);
190+
191+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_context);
192+
PHP_V8_DATA_ISOLATES_CHECK(php_v8_value, php_v8_key);
193+
194+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
195+
PHP_V8_ENTER_CONTEXT(php_v8_context);
196+
197+
v8::Local<v8::Map> local_map = php_v8_value_get_map_local(isolate, php_v8_value);
198+
v8::Local<v8::Value> local_key = php_v8_value_get_value_local(isolate, php_v8_key);
199+
200+
PHP_V8_TRY_CATCH(isolate);
201+
PHP_V8_INIT_ISOLATE_LIMITS_ON_OBJECT_VALUE(php_v8_value);
202+
203+
v8::Maybe<bool> maybe_res = local_map->Delete(context, local_key);
204+
205+
PHP_V8_MAYBE_CATCH(php_v8_context, try_catch);
206+
PHP_V8_THROW_EXCEPTION_WHEN_NOTHING(maybe_res, "Failed to delete");
207+
208+
RETURN_BOOL(maybe_res.FromJust());
209+
}
210+
211+
static PHP_METHOD(V8Map, AsArray) {
212+
if (zend_parse_parameters_none() == FAILURE) {
213+
return;
214+
}
215+
216+
PHP_V8_VALUE_FETCH_WITH_CHECK(getThis(), php_v8_value);
217+
PHP_V8_ENTER_STORED_ISOLATE(php_v8_value);
218+
PHP_V8_ENTER_STORED_CONTEXT(php_v8_value);
219+
220+
PHP_V8_TRY_CATCH(isolate);
221+
PHP_V8_INIT_ISOLATE_LIMITS_ON_OBJECT_VALUE(php_v8_value);
222+
223+
v8::Local<v8::Array> local_array = php_v8_value_get_map_local(isolate, php_v8_value)->AsArray();
224+
225+
PHP_V8_MAYBE_CATCH(php_v8_value->php_v8_context, try_catch);
226+
PHP_V8_THROW_EXCEPTION_WHEN_EMPTY(local_array, "Failed to get property names")
227+
228+
php_v8_get_or_create_value(return_value, local_array, isolate);
229+
}
230+
231+
232+
ZEND_BEGIN_ARG_INFO_EX(arginfo_v8_map___construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
233+
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
234+
ZEND_END_ARG_INFO()
235+
236+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_map_Size, ZEND_RETURN_VALUE, 0, IS_DOUBLE, 0)
237+
ZEND_END_ARG_INFO()
238+
239+
ZEND_BEGIN_ARG_INFO_EX(arginfo_v8_map_Clear, ZEND_RETURN_VALUE, ZEND_RETURN_VALUE, 0)
240+
ZEND_END_ARG_INFO()
241+
242+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_map_Get, ZEND_RETURN_VALUE, 2, V8\\Value, 0)
243+
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
244+
ZEND_ARG_OBJ_INFO(0, key, V8\\Value, 0)
245+
ZEND_END_ARG_INFO()
246+
247+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_map_Set, ZEND_RETURN_VALUE, 3, V8\\MapObject, 0)
248+
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
249+
ZEND_ARG_OBJ_INFO(0, key, V8\\Value, 0)
250+
ZEND_ARG_OBJ_INFO(0, value, V8\\Value, 0)
251+
ZEND_END_ARG_INFO()
252+
253+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_map_Has, ZEND_RETURN_VALUE, 2, _IS_BOOL, 0)
254+
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
255+
ZEND_ARG_OBJ_INFO(0, key, V8\\Value, 0)
256+
ZEND_END_ARG_INFO()
257+
258+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_map_Delete, ZEND_RETURN_VALUE, 2, _IS_BOOL, 0)
259+
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
260+
ZEND_ARG_OBJ_INFO(0, key, V8\\Value, 0)
261+
ZEND_END_ARG_INFO()
262+
263+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_map_AsArray, ZEND_RETURN_VALUE, 0, V8\\ArrayObject, 0)
264+
ZEND_END_ARG_INFO()
265+
266+
267+
static const zend_function_entry php_v8_map_methods[] = {
268+
PHP_ME(V8Map, __construct, arginfo_v8_map___construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
269+
270+
PHP_ME(V8Map, Size, arginfo_v8_map_Size, ZEND_ACC_PUBLIC)
271+
PHP_ME(V8Map, Clear, arginfo_v8_map_Clear, ZEND_ACC_PUBLIC)
272+
273+
PHP_ME(V8Map, Get, arginfo_v8_map_Get, ZEND_ACC_PUBLIC)
274+
PHP_ME(V8Map, Set, arginfo_v8_map_Set, ZEND_ACC_PUBLIC)
275+
PHP_ME(V8Map, Has, arginfo_v8_map_Has, ZEND_ACC_PUBLIC)
276+
PHP_ME(V8Map, Delete, arginfo_v8_map_Delete, ZEND_ACC_PUBLIC)
277+
278+
PHP_ME(V8Map, AsArray, arginfo_v8_map_AsArray, ZEND_ACC_PUBLIC)
279+
280+
PHP_FE_END
281+
};
282+
283+
284+
PHP_MINIT_FUNCTION(php_v8_map) {
285+
zend_class_entry ce;
286+
INIT_NS_CLASS_ENTRY(ce, PHP_V8_NS, "MapObject", php_v8_map_methods);
287+
this_ce = zend_register_internal_class_ex(&ce, php_v8_object_class_entry);
288+
289+
return SUCCESS;
290+
}

src/php_v8_map.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_MAP_H
14+
#define PHP_V8_MAP_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_map_class_entry;
28+
29+
extern v8::Local<v8::Map> php_v8_value_get_map_local(v8::Isolate *isolate, php_v8_value_t *php_v8_value);
30+
31+
PHP_MINIT_FUNCTION(php_v8_map);
32+
33+
#endif //PHP_V8_MAP_H

src/php_v8_object.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,7 +1454,7 @@ ZEND_END_ARG_INFO()
14541454
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_object_GetContext, ZEND_RETURN_VALUE, 0, V8\\Context, 0)
14551455
ZEND_END_ARG_INFO()
14561456

1457-
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_object_Set, ZEND_RETURN_VALUE, 3, _IS_BOOL, 0)
1457+
ZEND_BEGIN_ARG_INFO_EX(arginfo_v8_object_Set, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 3)
14581458
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
14591459
ZEND_ARG_OBJ_INFO(0, key, V8\\Value, 0)
14601460
ZEND_ARG_OBJ_INFO(0, value, V8\\Value, 0)
@@ -1507,7 +1507,7 @@ ZEND_END_ARG_INFO()
15071507

15081508
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_object_Has, ZEND_RETURN_VALUE, 2, _IS_BOOL, 0)
15091509
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
1510-
ZEND_ARG_OBJ_INFO(0, key, V8\\StringValue, 0)
1510+
ZEND_ARG_OBJ_INFO(0, key, V8\\Value, 0)
15111511
ZEND_END_ARG_INFO()
15121512

15131513
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_object_HasIndex, ZEND_RETURN_VALUE, 2, _IS_BOOL, 0)
@@ -1517,7 +1517,7 @@ ZEND_END_ARG_INFO()
15171517

15181518
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_object_Delete, ZEND_RETURN_VALUE, 2, _IS_BOOL, 0)
15191519
ZEND_ARG_OBJ_INFO(0, context, V8\\Context, 0)
1520-
ZEND_ARG_OBJ_INFO(0, key, V8\\StringValue, 0)
1520+
ZEND_ARG_OBJ_INFO(0, key, V8\\Value, 0)
15211521
ZEND_END_ARG_INFO()
15221522

15231523
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_v8_object_DeleteIndex, ZEND_RETURN_VALUE, 2, _IS_BOOL, 0)

src/php_v8_value.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "php_v8_regexp.h"
2727
#include "php_v8_function.h"
2828
#include "php_v8_array.h"
29+
#include "php_v8_map.h"
2930
#include "php_v8_object.h"
3031

3132
#include "php_v8_null.h"
@@ -226,6 +227,10 @@ zend_class_entry *php_v8_get_class_entry_from_value(v8::Local<v8::Value> value)
226227
}
227228
*/
228229

230+
if (value->IsMap()) {
231+
return php_v8_map_class_entry;
232+
}
233+
229234
// anything else will be just an object
230235
return php_v8_object_class_entry;
231236
}

0 commit comments

Comments
 (0)