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

Commit b977849

Browse files
committed
Consistently expose all well-known symbols
v8/v8@c80c0f1
1 parent f090684 commit b977849

File tree

3 files changed

+153
-150
lines changed

3 files changed

+153
-150
lines changed

src/php_v8_symbol.cc

Lines changed: 57 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -116,95 +116,37 @@ static PHP_METHOD(V8Symbol, ForApi)
116116
php_v8_get_or_create_value(return_value, local_symbol, php_v8_context->php_v8_isolate);
117117
}
118118

119-
static PHP_METHOD(V8Symbol, GetIterator)
120-
{
121-
zval *php_v8_isolate_zv;
122-
123-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &php_v8_isolate_zv) == FAILURE) {
124-
return;
125-
}
126-
127-
PHP_V8_ISOLATE_FETCH_WITH_CHECK(php_v8_isolate_zv, php_v8_isolate);
128-
PHP_V8_ENTER_ISOLATE(php_v8_isolate);
129-
130-
v8::Local<v8::Symbol> local_symbol = v8::Symbol::GetIterator(isolate);
131-
132-
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_EMPTY(local_symbol, "Failed to create Symbol value");
133-
134-
php_v8_get_or_create_value(return_value, local_symbol, php_v8_isolate);
135-
}
136-
137-
static PHP_METHOD(V8Symbol, GetUnscopables)
138-
{
139-
zval *php_v8_isolate_zv;
140-
141-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &php_v8_isolate_zv) == FAILURE) {
142-
return;
143-
}
144-
145-
PHP_V8_ISOLATE_FETCH_WITH_CHECK(php_v8_isolate_zv, php_v8_isolate);
146-
PHP_V8_ENTER_ISOLATE(php_v8_isolate);
147-
148-
v8::Local<v8::Symbol> local_symbol = v8::Symbol::GetUnscopables(isolate);
149-
150-
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_EMPTY(local_symbol, "Failed to create Symbol value");
151-
152-
php_v8_get_or_create_value(return_value, local_symbol, php_v8_isolate);
153-
}
154-
155-
static PHP_METHOD(V8Symbol, GetToPrimitive)
156-
{
157-
zval *php_v8_isolate_zv;
158-
159-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &php_v8_isolate_zv) == FAILURE) {
160-
return;
161-
}
162-
163-
PHP_V8_ISOLATE_FETCH_WITH_CHECK(php_v8_isolate_zv, php_v8_isolate);
164-
PHP_V8_ENTER_ISOLATE(php_v8_isolate);
165-
166-
v8::Local<v8::Symbol> local_symbol = v8::Symbol::GetToPrimitive(isolate);
167-
168-
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_EMPTY(local_symbol, "Failed to create Symbol value");
169-
170-
php_v8_get_or_create_value(return_value, local_symbol, php_v8_isolate);
171-
}
172-
173-
static PHP_METHOD(V8Symbol, GetToStringTag)
174-
{
175-
zval *php_v8_isolate_zv;
176-
177-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &php_v8_isolate_zv) == FAILURE) {
178-
return;
179-
}
180-
181-
PHP_V8_ISOLATE_FETCH_WITH_CHECK(php_v8_isolate_zv, php_v8_isolate);
182-
PHP_V8_ENTER_ISOLATE(php_v8_isolate);
183-
184-
v8::Local<v8::Symbol> local_symbol = v8::Symbol::GetToStringTag(isolate);
185-
186-
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_EMPTY(local_symbol, "Failed to create Symbol value");
187-
188-
php_v8_get_or_create_value(return_value, local_symbol, php_v8_isolate);
189-
}
190-
191-
static PHP_METHOD(V8Symbol, GetIsConcatSpreadable)
192-
{
193-
zval *php_v8_isolate_zv;
194-
195-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &php_v8_isolate_zv) == FAILURE) {
196-
return;
197-
}
198-
199-
PHP_V8_ISOLATE_FETCH_WITH_CHECK(php_v8_isolate_zv, php_v8_isolate);
200-
PHP_V8_ENTER_ISOLATE(php_v8_isolate);
201-
202-
v8::Local<v8::Symbol> local_symbol = v8::Symbol::GetIsConcatSpreadable(isolate);
203-
204-
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_EMPTY(local_symbol, "Failed to create Symbol value");
205-
206-
php_v8_get_or_create_value(return_value, local_symbol, php_v8_isolate);
207-
}
119+
// Well-known symbols
120+
121+
#define PHP_V8_SYMBOL_WELL_KNOWN_METHOD(classname, name) \
122+
PHP_METHOD(classname, name) \
123+
{ \
124+
zval *php_v8_isolate_zv; \
125+
\
126+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &php_v8_isolate_zv) == FAILURE) { \
127+
return; \
128+
} \
129+
\
130+
PHP_V8_ISOLATE_FETCH_WITH_CHECK(php_v8_isolate_zv, php_v8_isolate); \
131+
PHP_V8_ENTER_ISOLATE(php_v8_isolate); \
132+
\
133+
v8::Local<v8::Symbol> local_symbol = v8::Symbol::name(isolate); \
134+
\
135+
PHP_V8_THROW_VALUE_EXCEPTION_WHEN_EMPTY(local_symbol, "Failed to create Symbol value"); \
136+
\
137+
php_v8_get_or_create_value(return_value, local_symbol, php_v8_isolate); \
138+
} \
139+
140+
static PHP_V8_SYMBOL_WELL_KNOWN_METHOD(V8Symbol, GetHasInstance);
141+
static PHP_V8_SYMBOL_WELL_KNOWN_METHOD(V8Symbol, GetIsConcatSpreadable);
142+
static PHP_V8_SYMBOL_WELL_KNOWN_METHOD(V8Symbol, GetIterator);
143+
static PHP_V8_SYMBOL_WELL_KNOWN_METHOD(V8Symbol, GetMatch);
144+
static PHP_V8_SYMBOL_WELL_KNOWN_METHOD(V8Symbol, GetReplace);
145+
static PHP_V8_SYMBOL_WELL_KNOWN_METHOD(V8Symbol, GetSearch);
146+
static PHP_V8_SYMBOL_WELL_KNOWN_METHOD(V8Symbol, GetSplit);
147+
static PHP_V8_SYMBOL_WELL_KNOWN_METHOD(V8Symbol, GetToPrimitive);
148+
static PHP_V8_SYMBOL_WELL_KNOWN_METHOD(V8Symbol, GetToStringTag);
149+
static PHP_V8_SYMBOL_WELL_KNOWN_METHOD(V8Symbol, GetUnscopables);
208150

209151

210152
ZEND_BEGIN_ARG_INFO_EX(arginfo_v8_symbol___construct, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
@@ -225,25 +167,22 @@ PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_symbol_ForApi, ZEND_RET
225167
ZEND_ARG_OBJ_INFO(0, name, V8\\StringValue, 0)
226168
ZEND_END_ARG_INFO()
227169

228-
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_symbol_GetIterator, ZEND_RETURN_VALUE, 1, V8\\SymbolValue, 0)
229-
ZEND_ARG_OBJ_INFO(0, isolate, V8\\Isolate, 0)
230-
ZEND_END_ARG_INFO()
231-
232-
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_symbol_GetUnscopables, ZEND_RETURN_VALUE, 1, V8\\SymbolValue, 0)
233-
ZEND_ARG_OBJ_INFO(0, isolate, V8\\Isolate, 0)
234-
ZEND_END_ARG_INFO()
235-
236-
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_symbol_GetToPrimitive, ZEND_RETURN_VALUE, 1, V8\\SymbolValue, 0)
237-
ZEND_ARG_OBJ_INFO(0, isolate, V8\\Isolate, 0)
238-
ZEND_END_ARG_INFO()
239-
240-
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_symbol_GetToStringTag, ZEND_RETURN_VALUE, 1, V8\\SymbolValue, 0)
241-
ZEND_ARG_OBJ_INFO(0, isolate, V8\\Isolate, 0)
242-
ZEND_END_ARG_INFO()
170+
#define PHP_V8_SYMBOL_WELL_KNOWN_ARGS(name) \
171+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(name, ZEND_RETURN_VALUE, 1, V8\\SymbolValue, 0) \
172+
ZEND_ARG_OBJ_INFO(0, isolate, V8\\Isolate, 0) \
173+
ZEND_END_ARG_INFO() \
243174

244-
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_v8_symbol_GetIsConcatSpreadable, ZEND_RETURN_VALUE, 1, V8\\SymbolValue, 0)
245-
ZEND_ARG_OBJ_INFO(0, isolate, V8\\Isolate, 0)
246-
ZEND_END_ARG_INFO()
175+
// Well-known symbols
176+
PHP_V8_SYMBOL_WELL_KNOWN_ARGS(arginfo_v8_symbol_GetHasInstance);
177+
PHP_V8_SYMBOL_WELL_KNOWN_ARGS(arginfo_v8_symbol_GetIsConcatSpreadable);
178+
PHP_V8_SYMBOL_WELL_KNOWN_ARGS(arginfo_v8_symbol_GetIterator);
179+
PHP_V8_SYMBOL_WELL_KNOWN_ARGS(arginfo_v8_symbol_GetMatch);
180+
PHP_V8_SYMBOL_WELL_KNOWN_ARGS(arginfo_v8_symbol_GetReplace);
181+
PHP_V8_SYMBOL_WELL_KNOWN_ARGS(arginfo_v8_symbol_GetSearch);
182+
PHP_V8_SYMBOL_WELL_KNOWN_ARGS(arginfo_v8_symbol_GetSplit);
183+
PHP_V8_SYMBOL_WELL_KNOWN_ARGS(arginfo_v8_symbol_GetToPrimitive);
184+
PHP_V8_SYMBOL_WELL_KNOWN_ARGS(arginfo_v8_symbol_GetToStringTag);
185+
PHP_V8_SYMBOL_WELL_KNOWN_ARGS(arginfo_v8_symbol_GetUnscopables);
247186

248187

249188
static const zend_function_entry php_v8_symbol_methods[] = {
@@ -254,11 +193,17 @@ static const zend_function_entry php_v8_symbol_methods[] = {
254193
PHP_ME(V8Symbol, For, arginfo_v8_symbol_For, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
255194
PHP_ME(V8Symbol, ForApi, arginfo_v8_symbol_ForApi, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
256195

257-
PHP_ME(V8Symbol, GetIterator, arginfo_v8_symbol_GetIterator, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
258-
PHP_ME(V8Symbol, GetUnscopables, arginfo_v8_symbol_GetUnscopables, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
259-
PHP_ME(V8Symbol, GetToPrimitive, arginfo_v8_symbol_GetToPrimitive, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
260-
PHP_ME(V8Symbol, GetToStringTag, arginfo_v8_symbol_GetToStringTag, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
261-
PHP_ME(V8Symbol, GetIsConcatSpreadable, arginfo_v8_symbol_GetIsConcatSpreadable, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
196+
// Well-known symbols
197+
PHP_ME(V8Symbol, GetHasInstance, arginfo_v8_symbol_GetHasInstance, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
198+
PHP_ME(V8Symbol, GetIsConcatSpreadable, arginfo_v8_symbol_GetIsConcatSpreadable, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
199+
PHP_ME(V8Symbol, GetIterator, arginfo_v8_symbol_GetIterator, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
200+
PHP_ME(V8Symbol, GetMatch, arginfo_v8_symbol_GetMatch, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
201+
PHP_ME(V8Symbol, GetReplace, arginfo_v8_symbol_GetReplace, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
202+
PHP_ME(V8Symbol, GetSearch, arginfo_v8_symbol_GetSearch, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
203+
PHP_ME(V8Symbol, GetSplit, arginfo_v8_symbol_GetSplit, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
204+
PHP_ME(V8Symbol, GetToPrimitive, arginfo_v8_symbol_GetToPrimitive, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
205+
PHP_ME(V8Symbol, GetToStringTag, arginfo_v8_symbol_GetToStringTag, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
206+
PHP_ME(V8Symbol, GetUnscopables, arginfo_v8_symbol_GetUnscopables, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC)
262207

263208
PHP_FE_END
264209
};

stubs/src/SymbolValue.php

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,26 @@ public static function ForApi(Context $context, StringValue $name): SymbolValue
7676
{
7777
}
7878

79+
// Well-known symbols
80+
81+
/**
82+
* @param Isolate $isolate
83+
*
84+
* @return SymbolValue
85+
*/
86+
public static function GetHasInstance(Isolate $isolate): SymbolValue
87+
{
88+
}
89+
90+
/**
91+
* @param Isolate $isolate
92+
*
93+
* @return SymbolValue
94+
*/
95+
public static function GetIsConcatSpreadable(Isolate $isolate): SymbolValue
96+
{
97+
}
98+
7999
/**
80100
* @param Isolate $isolate
81101
*
@@ -90,7 +110,34 @@ public static function GetIterator(Isolate $isolate): SymbolValue
90110
*
91111
* @return SymbolValue
92112
*/
93-
public static function GetUnscopables(Isolate $isolate): SymbolValue
113+
public static function GetMatch(Isolate $isolate): SymbolValue
114+
{
115+
}
116+
117+
/**
118+
* @param Isolate $isolate
119+
*
120+
* @return SymbolValue
121+
*/
122+
public static function GetReplace(Isolate $isolate): SymbolValue
123+
{
124+
}
125+
126+
/**
127+
* @param Isolate $isolate
128+
*
129+
* @return SymbolValue
130+
*/
131+
public static function GetSearch(Isolate $isolate): SymbolValue
132+
{
133+
}
134+
135+
/**
136+
* @param Isolate $isolate
137+
*
138+
* @return SymbolValue
139+
*/
140+
public static function GetSplit(Isolate $isolate): SymbolValue
94141
{
95142
}
96143

@@ -117,7 +164,7 @@ public static function GetToStringTag(Isolate $isolate): SymbolValue
117164
*
118165
* @return SymbolValue
119166
*/
120-
public static function GetIsConcatSpreadable(Isolate $isolate): SymbolValue
167+
public static function GetUnscopables(Isolate $isolate): SymbolValue
121168
{
122169
}
123170
}

tests/V8SymbolValue.phpt

Lines changed: 47 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -145,35 +145,26 @@ $helper->assert('Symbol ForApi(string) returned', $value instanceof \V8\SymbolVa
145145
$helper->pretty_dump('Symbol ForApi(string) name', $value->Name()->Value());
146146
$helper->line();
147147

148-
$helper->assert('Isolate not in context', !$isolate->InContext());
149-
$value = V8\SymbolValue::GetIterator($isolate);
150-
$helper->assert('Symbol GetIterator() returned', $value instanceof \V8\SymbolValue);
151-
$helper->pretty_dump('Symbol GetIterator() name', $value->Name()->Value());
152-
$helper->line();
153-
154-
$helper->assert('Isolate not in context', !$isolate->InContext());
155-
$value = V8\SymbolValue::GetUnscopables($isolate);
156-
$helper->assert('Symbol GetUnscopables() returned', $value instanceof \V8\SymbolValue);
157-
$helper->pretty_dump('Symbol GetUnscopables() name', $value->Name()->Value());
158-
$helper->line();
159-
160-
$helper->assert('Isolate not in context', !$isolate->InContext());
161-
$value = V8\SymbolValue::GetToPrimitive($isolate);
162-
$helper->assert('Symbol GetToPrimitive() returned', $value instanceof \V8\SymbolValue);
163-
$helper->pretty_dump('Symbol GetToPrimitive() name', $value->Name()->Value());
164-
$helper->line();
165-
166-
$helper->assert('Isolate not in context', !$isolate->InContext());
167-
$value = V8\SymbolValue::GetToStringTag($isolate);
168-
$helper->assert('Symbol GetToStringTag() returned', $value instanceof \V8\SymbolValue);
169-
$helper->pretty_dump('Symbol GetToStringTag() name', $value->Name()->Value());
170-
$helper->line();
171-
172-
$helper->assert('Isolate not in context', !$isolate->InContext());
173-
$value = V8\SymbolValue::GetIsConcatSpreadable($isolate);
174-
$helper->assert('Symbol GetIsConcatSpreadable() returned', $value instanceof \V8\SymbolValue);
175-
$helper->pretty_dump('Symbol GetIsConcatSpreadable() name', $value->Name()->Value());
176-
$helper->line();
148+
$static_getters = [
149+
'GetHasInstance',
150+
'GetIsConcatSpreadable',
151+
'GetIterator',
152+
'GetMatch',
153+
'GetReplace',
154+
'GetSearch',
155+
'GetSplit',
156+
'GetToPrimitive',
157+
'GetToStringTag',
158+
'GetUnscopables',
159+
];
160+
161+
foreach ($static_getters as $static_getter) {
162+
$helper->assert('Isolate not in context', !$isolate->InContext());
163+
$value = V8\SymbolValue::$static_getter($isolate);
164+
$helper->assert("Symbol {$static_getter}() returned", $value instanceof \V8\SymbolValue);
165+
$helper->pretty_dump("Symbol {$static_getter}() name", $value->Name()->Value());
166+
$helper->line();
167+
}
177168

178169
?>
179170
--EXPECT--
@@ -205,7 +196,7 @@ Accessors:
205196
----------
206197
V8\SymbolValue::GetIsolate() matches expected value
207198
V8\SymbolValue->Name():
208-
object(V8\Value)#87 (1) {
199+
object(V8\Value)#92 (1) {
209200
["isolate":"V8\Value":private]=>
210201
object(V8\Isolate)#3 (5) {
211202
["snapshot":"V8\Isolate":private]=>
@@ -282,7 +273,7 @@ Null constructor:
282273

283274
Object representation:
284275
----------------------
285-
object(V8\SymbolValue)#87 (1) {
276+
object(V8\SymbolValue)#92 (1) {
286277
["isolate":"V8\Value":private]=>
287278
object(V8\Isolate)#3 (5) {
288279
["snapshot":"V8\Isolate":private]=>
@@ -509,7 +500,7 @@ Accessors:
509500
----------
510501
V8\SymbolValue::GetIsolate() matches expected value
511502
V8\SymbolValue->Name():
512-
object(V8\StringValue)#88 (1) {
503+
object(V8\StringValue)#93 (1) {
513504
["isolate":"V8\Value":private]=>
514505
object(V8\Isolate)#3 (5) {
515506
["snapshot":"V8\Isolate":private]=>
@@ -704,13 +695,33 @@ Isolate not in context: ok
704695
Symbol ForApi(string) returned: ok
705696
Symbol ForApi(string) name: string(4) "test"
706697

698+
Isolate not in context: ok
699+
Symbol GetHasInstance() returned: ok
700+
Symbol GetHasInstance() name: string(18) "Symbol.hasInstance"
701+
702+
Isolate not in context: ok
703+
Symbol GetIsConcatSpreadable() returned: ok
704+
Symbol GetIsConcatSpreadable() name: string(25) "Symbol.isConcatSpreadable"
705+
707706
Isolate not in context: ok
708707
Symbol GetIterator() returned: ok
709708
Symbol GetIterator() name: string(15) "Symbol.iterator"
710709

711710
Isolate not in context: ok
712-
Symbol GetUnscopables() returned: ok
713-
Symbol GetUnscopables() name: string(18) "Symbol.unscopables"
711+
Symbol GetMatch() returned: ok
712+
Symbol GetMatch() name: string(12) "Symbol.match"
713+
714+
Isolate not in context: ok
715+
Symbol GetReplace() returned: ok
716+
Symbol GetReplace() name: string(14) "Symbol.replace"
717+
718+
Isolate not in context: ok
719+
Symbol GetSearch() returned: ok
720+
Symbol GetSearch() name: string(13) "Symbol.search"
721+
722+
Isolate not in context: ok
723+
Symbol GetSplit() returned: ok
724+
Symbol GetSplit() name: string(12) "Symbol.split"
714725

715726
Isolate not in context: ok
716727
Symbol GetToPrimitive() returned: ok
@@ -721,5 +732,5 @@ Symbol GetToStringTag() returned: ok
721732
Symbol GetToStringTag() name: string(18) "Symbol.toStringTag"
722733

723734
Isolate not in context: ok
724-
Symbol GetIsConcatSpreadable() returned: ok
725-
Symbol GetIsConcatSpreadable() name: string(25) "Symbol.isConcatSpreadable"
735+
Symbol GetUnscopables() returned: ok
736+
Symbol GetUnscopables() name: string(18) "Symbol.unscopables"

0 commit comments

Comments
 (0)