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

Commit ea98957

Browse files
committed
Refactor ScriptOriginOptions to use bit field, closes #42
1 parent 79ead57 commit ea98957

16 files changed

+190
-299
lines changed

src/php_v8_script_origin.cc

+29-40
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,6 @@ extern void php_v8_create_script_origin(zval *return_value, v8::Local<v8::Contex
5151
}
5252
}
5353

54-
/* v8::SourceMapUrl::Options */
55-
php_v8_create_script_origin_options(&options_zv, origin.Options());
56-
zend_update_property(this_ce, return_value, ZEND_STRL("options"), &options_zv);
57-
zval_ptr_dtor(&options_zv);
58-
5954
/* v8::SourceMapUrl::ScriptID */
6055
if (!origin.ScriptID().IsEmpty() && origin.ScriptID()->NumberValue(context).IsJust()) {
6156
zend_long script_id = static_cast<zend_long>(origin.ScriptID()->NumberValue(context).FromJust());
@@ -69,6 +64,11 @@ extern void php_v8_create_script_origin(zval *return_value, v8::Local<v8::Contex
6964
PHP_V8_CONVERT_FROM_V8_STRING_TO_STRING(isolate, source_map_url_chars, origin.SourceMapUrl());
7065
zend_update_property_string(this_ce, return_value, ZEND_STRL("source_map_url"), source_map_url_chars);
7166
}
67+
68+
/* v8::SourceMapUrl::Options */
69+
php_v8_create_script_origin_options(&options_zv, origin.Options());
70+
zend_update_property(this_ce, return_value, ZEND_STRL("options"), &options_zv);
71+
zval_ptr_dtor(&options_zv);
7272
}
7373

7474

@@ -131,15 +131,13 @@ v8::ScriptOrigin *php_v8_create_script_origin_from_zval(zval *value, v8::Isolate
131131
zval *options_zv = zend_read_property(this_ce, value, ZEND_STRL("options"), 0, &rv); // ScriptOriginOptions
132132

133133
if (Z_TYPE_P(options_zv) == IS_OBJECT && instanceof_function(Z_OBJCE_P(options_zv), php_v8_script_origin_options_class_entry)) {
134-
zval *is_shared_cross_origin_zv = zend_read_property(php_v8_script_origin_options_class_entry, options_zv, ZEND_STRL("is_shared_cross_origin"), 0, &rv);
135-
zval *is_opaque_zv = zend_read_property(php_v8_script_origin_options_class_entry, options_zv, ZEND_STRL("is_opaque"), 0, &rv);
136-
zval *is_wasm_zv = zend_read_property(php_v8_script_origin_options_class_entry, options_zv, ZEND_STRL("is_wasm"), 0, &rv);
137-
zval *is_module_zv = zend_read_property(php_v8_script_origin_options_class_entry, options_zv, ZEND_STRL("is_module"), 0, &rv);
138-
139-
resource_is_shared_cross_origin = v8::Boolean::New(isolate, Z_TYPE_P(is_shared_cross_origin_zv) == IS_TRUE);
140-
resource_is_opaque = v8::Boolean::New(isolate, Z_TYPE_P(is_opaque_zv) == IS_TRUE);
141-
is_wasm = v8::Boolean::New(isolate, Z_TYPE_P(is_wasm_zv) == IS_TRUE);
142-
is_module = v8::Boolean::New(isolate, Z_TYPE_P(is_module_zv) == IS_TRUE);
134+
zval *tmp = zend_read_property(php_v8_script_origin_options_class_entry, options_zv, ZEND_STRL("flags"), 0, &rv);
135+
zend_long flags = Z_LVAL_P(tmp);
136+
137+
resource_is_shared_cross_origin = v8::Boolean::New(isolate, static_cast<bool>(flags & PHP_V8_SCRIPT_ORIGIN_OPTION_IS_SHARED_CROSS_ORIGIN));
138+
resource_is_opaque = v8::Boolean::New(isolate, static_cast<bool>(flags & PHP_V8_SCRIPT_ORIGIN_OPTION_IS_OPAQUE));
139+
is_wasm = v8::Boolean::New(isolate, static_cast<bool>(flags & PHP_V8_SCRIPT_ORIGIN_OPTION_IS_WASM));
140+
is_module = v8::Boolean::New(isolate, static_cast<bool>(flags & PHP_V8_SCRIPT_ORIGIN_OPTION_IS_MODULE));
143141
}
144142

145143
return new v8::ScriptOrigin(resource_name,
@@ -157,35 +155,20 @@ static PHP_METHOD(ScriptOrigin, __construct) {
157155
zend_string *resource_name = NULL;
158156
zend_long resource_line_offset = -1;
159157
zend_long resource_column_offset = -1;
160-
zend_bool resource_is_shared_cross_origin = '\0';
161158
zend_long script_id = -1;
162159
zend_string *source_map_url = NULL;
163-
zend_bool resource_is_opaque = '\0';
164-
zend_bool is_wasm = '\0';
165-
zend_bool is_module = '\0';
166160

167-
zval options_zv;
161+
zval *options_zv = NULL;
168162

169-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|SlllbSbbb",
163+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|SlllSo!",
170164
&resource_name,
171165
&resource_line_offset,
172166
&resource_column_offset,
173167
&script_id,
174-
&resource_is_shared_cross_origin,
175168
&source_map_url,
176-
&resource_is_opaque,
177-
&is_wasm,
178-
&is_module) == FAILURE) {
169+
&options_zv) == FAILURE) {
179170
return;
180171
}
181-
182-
v8::ScriptOriginOptions options(static_cast<bool>(resource_is_shared_cross_origin),
183-
static_cast<bool>(resource_is_opaque),
184-
static_cast<bool>(is_wasm),
185-
static_cast<bool>(is_module));
186-
187-
php_v8_create_script_origin_options(&options_zv, options);
188-
189172
zend_update_property_str(this_ce, getThis(), ZEND_STRL("resource_name"), resource_name);
190173

191174
if (resource_line_offset > 0) {
@@ -199,13 +182,20 @@ static PHP_METHOD(ScriptOrigin, __construct) {
199182
zend_update_property_long(this_ce, getThis(), ZEND_STRL("script_id"), script_id);
200183
}
201184

202-
zend_update_property(this_ce, getThis(), ZEND_STRL("options"), &options_zv);
203-
204-
if (source_map_url != NULL) {
185+
if (options_zv != NULL) {
205186
zend_update_property_str(this_ce, getThis(), ZEND_STRL("source_map_url"), source_map_url);
206187
}
207188

208-
zval_ptr_dtor(&options_zv);
189+
190+
if (NULL != options_zv) {
191+
zend_update_property(this_ce, getThis(), ZEND_STRL("options"), options_zv);
192+
} else {
193+
zval tmp;
194+
v8::ScriptOriginOptions options(0);
195+
php_v8_create_script_origin_options(&tmp, options);
196+
zend_update_property(this_ce, getThis(), ZEND_STRL("options"), &tmp);
197+
zval_ptr_dtor(&tmp);
198+
}
209199
}
210200

211201
static PHP_METHOD(ScriptOrigin, resourceName) {
@@ -269,14 +259,13 @@ static PHP_METHOD(ScriptOrigin, options) {
269259
}
270260

271261

272-
PHP_V8_ZEND_BEGIN_ARG_WITH_CONSTRUCTOR_INFO_EX(arginfo___construct, 1)
262+
PHP_V8_ZEND_BEGIN_ARG_WITH_CONSTRUCTOR_INFO_EX(arginfo___construct, 0)
273263
ZEND_ARG_TYPE_INFO(0, resource_name, IS_STRING, 0)
274264
ZEND_ARG_TYPE_INFO(0, resource_line_offset, IS_LONG, 1)
275265
ZEND_ARG_TYPE_INFO(0, resource_column_offset, IS_LONG, 1)
276266
ZEND_ARG_TYPE_INFO(0, script_id, IS_LONG, 1)
277-
ZEND_ARG_TYPE_INFO(0, resource_is_shared_cross_origin, _IS_BOOL, 0)
278267
ZEND_ARG_TYPE_INFO(0, source_map_url, IS_STRING, 0)
279-
ZEND_ARG_TYPE_INFO(0, resource_is_opaque, _IS_BOOL, 0)
268+
ZEND_ARG_OBJ_INFO(0, options, V8\\ScriptOriginOptions, 1)
280269
ZEND_END_ARG_INFO()
281270

282271
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_resourceName, ZEND_RETURN_VALUE, 0, IS_STRING, 0)
@@ -319,9 +308,9 @@ PHP_MINIT_FUNCTION (php_v8_script_origin) {
319308
zend_declare_property_string(this_ce, ZEND_STRL("resource_name"), "", ZEND_ACC_PRIVATE);
320309
zend_declare_property_null(this_ce, ZEND_STRL("resource_line_offset"), ZEND_ACC_PRIVATE);
321310
zend_declare_property_null(this_ce, ZEND_STRL("resource_column_offset"), ZEND_ACC_PRIVATE);
322-
zend_declare_property_null(this_ce, ZEND_STRL("options"), ZEND_ACC_PRIVATE);
323311
zend_declare_property_null(this_ce, ZEND_STRL("script_id"), ZEND_ACC_PRIVATE);
324312
zend_declare_property_string(this_ce, ZEND_STRL("source_map_url"), "", ZEND_ACC_PRIVATE);
313+
zend_declare_property_null(this_ce, ZEND_STRL("options"), ZEND_ACC_PRIVATE);
325314

326315
return SUCCESS;
327316
}

src/php_v8_script_origin_options.cc

+36-24
Original file line numberDiff line numberDiff line change
@@ -24,28 +24,29 @@ zend_class_entry* php_v8_script_origin_options_class_entry;
2424
void php_v8_create_script_origin_options(zval * return_value, v8::ScriptOriginOptions options) {
2525
object_init_ex(return_value, this_ce);
2626

27-
zend_update_property_bool(this_ce, return_value, ZEND_STRL("is_shared_cross_origin"), static_cast<zend_bool>(options.IsSharedCrossOrigin()));
28-
zend_update_property_bool(this_ce, return_value, ZEND_STRL("is_opaque"), static_cast<zend_bool>(options.IsOpaque()));
29-
zend_update_property_bool(this_ce, return_value, ZEND_STRL("is_wasm"), static_cast<zend_bool>(options.IsWasm()));
30-
zend_update_property_bool(this_ce, return_value, ZEND_STRL("is_module"), static_cast<zend_bool>(options.IsModule()));
27+
zend_update_property_long(this_ce, return_value, ZEND_STRL("flags"), static_cast<zend_long >(options.Flags()));
3128
}
3229

3330

3431
static PHP_METHOD(ScriptOriginOptions, __construct) {
35-
zend_bool is_shared_cross_origin = '\0';
36-
zend_bool is_opaque = '\0';
37-
zend_bool is_wasm = '\0';
38-
zend_bool is_module = '\0';
32+
zend_long flags = 0;
3933

40-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|bbbb",
41-
&is_shared_cross_origin, &is_opaque, &is_wasm, &is_module) == FAILURE) {
34+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|l", &flags) == FAILURE) {
4235
return;
4336
}
4437

45-
zend_update_property_bool(this_ce, getThis(), ZEND_STRL("is_shared_cross_origin"), is_shared_cross_origin);
46-
zend_update_property_bool(this_ce, getThis(), ZEND_STRL("is_opaque"), is_opaque);
38+
zend_update_property_long(this_ce, getThis(), ZEND_STRL("flags"), flags & PHP_V8_SCRIPT_ORIGIN_OPTIONS);
4739
}
4840

41+
static PHP_METHOD(ScriptOriginOptions, getFlags) {
42+
zval rv;
43+
44+
if (zend_parse_parameters_none() == FAILURE) {
45+
return;
46+
}
47+
48+
RETVAL_ZVAL(zend_read_property(this_ce, getThis(), ZEND_STRL("flags"), 0, &rv), 1, 0);
49+
}
4950

5051
static PHP_METHOD(ScriptOriginOptions, isSharedCrossOrigin) {
5152
zval rv;
@@ -54,7 +55,9 @@ static PHP_METHOD(ScriptOriginOptions, isSharedCrossOrigin) {
5455
return;
5556
}
5657

57-
RETVAL_ZVAL(zend_read_property(this_ce, getThis(), ZEND_STRL("is_shared_cross_origin"), 0, &rv), 1, 0);
58+
zval *tmp = zend_read_property(this_ce, getThis(), ZEND_STRL("flags"), 0, &rv);
59+
60+
RETVAL_BOOL(Z_LVAL_P(tmp) & PHP_V8_SCRIPT_ORIGIN_OPTION_IS_SHARED_CROSS_ORIGIN);
5861
}
5962

6063
static PHP_METHOD(ScriptOriginOptions, isOpaque) {
@@ -64,7 +67,9 @@ static PHP_METHOD(ScriptOriginOptions, isOpaque) {
6467
return;
6568
}
6669

67-
RETVAL_ZVAL(zend_read_property(this_ce, getThis(), ZEND_STRL("is_opaque"), 0, &rv), 1, 0);
70+
zval *tmp = zend_read_property(this_ce, getThis(), ZEND_STRL("flags"), 0, &rv);
71+
72+
RETVAL_BOOL(Z_LVAL_P(tmp) & PHP_V8_SCRIPT_ORIGIN_OPTION_IS_OPAQUE);
6873
}
6974

7075
static PHP_METHOD(ScriptOriginOptions, isWasm) {
@@ -74,7 +79,9 @@ static PHP_METHOD(ScriptOriginOptions, isWasm) {
7479
return;
7580
}
7681

77-
RETVAL_ZVAL(zend_read_property(this_ce, getThis(), ZEND_STRL("is_wasm"), 0, &rv), 1, 0);
82+
zval *tmp = zend_read_property(this_ce, getThis(), ZEND_STRL("flags"), 0, &rv);
83+
84+
RETVAL_BOOL(Z_LVAL_P(tmp) & PHP_V8_SCRIPT_ORIGIN_OPTION_IS_WASM);
7885
}
7986

8087
static PHP_METHOD(ScriptOriginOptions, isModule) {
@@ -84,18 +91,20 @@ static PHP_METHOD(ScriptOriginOptions, isModule) {
8491
return;
8592
}
8693

87-
RETVAL_ZVAL(zend_read_property(this_ce, getThis(), ZEND_STRL("is_module"), 0, &rv), 1, 0);
94+
zval *tmp = zend_read_property(this_ce, getThis(), ZEND_STRL("flags"), 0, &rv);
95+
96+
RETVAL_BOOL(Z_LVAL_P(tmp) & PHP_V8_SCRIPT_ORIGIN_OPTION_IS_MODULE);
8897
}
8998

9099

91100
PHP_V8_ZEND_BEGIN_ARG_WITH_CONSTRUCTOR_INFO_EX(arginfo___construct, 0)
92-
ZEND_ARG_TYPE_INFO(0, is_shared_cross_origin, _IS_BOOL, 0)
93-
ZEND_ARG_TYPE_INFO(0, is_opaque, _IS_BOOL, 0)
94-
ZEND_ARG_TYPE_INFO(0, is_wasm, _IS_BOOL, 0)
95-
ZEND_ARG_TYPE_INFO(0, is_module, _IS_BOOL, 0)
101+
ZEND_ARG_TYPE_INFO(0, options, IS_LONG, 0)
96102
ZEND_END_ARG_INFO()
97103

98104

105+
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_getFlags, ZEND_RETURN_VALUE, 0, IS_LONG, 0)
106+
ZEND_END_ARG_INFO()
107+
99108
PHP_V8_ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_isSharedCrossOrigin, ZEND_RETURN_VALUE, 0, _IS_BOOL, 0)
100109
ZEND_END_ARG_INFO()
101110

@@ -111,6 +120,7 @@ ZEND_END_ARG_INFO()
111120

112121
static const zend_function_entry php_v8_script_origin_options_methods[] = {
113122
PHP_V8_ME(ScriptOriginOptions, __construct, ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
123+
PHP_V8_ME(ScriptOriginOptions, getFlags, ZEND_ACC_PUBLIC)
114124
PHP_V8_ME(ScriptOriginOptions, isSharedCrossOrigin, ZEND_ACC_PUBLIC)
115125
PHP_V8_ME(ScriptOriginOptions, isOpaque, ZEND_ACC_PUBLIC)
116126
PHP_V8_ME(ScriptOriginOptions, isWasm, ZEND_ACC_PUBLIC)
@@ -125,10 +135,12 @@ PHP_MINIT_FUNCTION(php_v8_script_origin_options) {
125135
INIT_NS_CLASS_ENTRY(ce, PHP_V8_NS, "ScriptOriginOptions", php_v8_script_origin_options_methods);
126136
this_ce = zend_register_internal_class(&ce);
127137

128-
zend_declare_property_bool(this_ce, ZEND_STRL("is_shared_cross_origin"), static_cast<zend_bool>(false), ZEND_ACC_PRIVATE);
129-
zend_declare_property_bool(this_ce, ZEND_STRL("is_opaque"), static_cast<zend_bool>(false), ZEND_ACC_PRIVATE);
130-
zend_declare_property_bool(this_ce, ZEND_STRL("is_wasm"), static_cast<zend_bool>(false), ZEND_ACC_PRIVATE);
131-
zend_declare_property_bool(this_ce, ZEND_STRL("is_module"), static_cast<zend_bool>(false), ZEND_ACC_PRIVATE);
138+
zend_declare_class_constant_long(this_ce, ZEND_STRL("IS_SHARED_CROSS_ORIGIN"), PHP_V8_SCRIPT_ORIGIN_OPTION_IS_SHARED_CROSS_ORIGIN);
139+
zend_declare_class_constant_long(this_ce, ZEND_STRL("IS_OPAQUE"), PHP_V8_SCRIPT_ORIGIN_OPTION_IS_OPAQUE);
140+
zend_declare_class_constant_long(this_ce, ZEND_STRL("IS_WASM"), PHP_V8_SCRIPT_ORIGIN_OPTION_IS_WASM);
141+
zend_declare_class_constant_long(this_ce, ZEND_STRL("IS_MODULE"), PHP_V8_SCRIPT_ORIGIN_OPTION_IS_MODULE);
142+
143+
zend_declare_property_long(this_ce, ZEND_STRL("flags"), 0, ZEND_ACC_PRIVATE);
132144

133145
return SUCCESS;
134146
}

src/php_v8_script_origin_options.h

+12
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,18 @@ extern zend_class_entry* php_v8_script_origin_options_class_entry;
2727

2828
extern void php_v8_create_script_origin_options(zval * return_value, v8::ScriptOriginOptions options);
2929

30+
#define PHP_V8_SCRIPT_ORIGIN_OPTION_IS_SHARED_CROSS_ORIGIN 1
31+
#define PHP_V8_SCRIPT_ORIGIN_OPTION_IS_OPAQUE 1 << 1
32+
#define PHP_V8_SCRIPT_ORIGIN_OPTION_IS_WASM 1 << 2
33+
#define PHP_V8_SCRIPT_ORIGIN_OPTION_IS_MODULE 1 << 3
34+
35+
#define PHP_V8_SCRIPT_ORIGIN_OPTIONS ( 0 \
36+
| PHP_V8_SCRIPT_ORIGIN_OPTION_IS_SHARED_CROSS_ORIGIN \
37+
| PHP_V8_SCRIPT_ORIGIN_OPTION_IS_OPAQUE \
38+
| PHP_V8_SCRIPT_ORIGIN_OPTION_IS_WASM \
39+
| PHP_V8_SCRIPT_ORIGIN_OPTION_IS_MODULE \
40+
) \
41+
3042

3143
PHP_MINIT_FUNCTION (php_v8_script_origin_options);
3244

stubs/src/ScriptOrigin.php

+9-14
Original file line numberDiff line numberDiff line change
@@ -48,33 +48,28 @@ class ScriptOrigin
4848
private $options;
4949

5050
/**
51-
* @param string $resource_name
52-
* @param int|null $resource_line_offset
53-
* @param int|null $resource_column_offset
54-
* @param int|null $script_id
55-
* @param bool $resource_is_shared_cross_origin
56-
* @param string $source_map_url
57-
* @param bool $resource_is_opaque
58-
* @param bool $is_wasm
59-
* @param bool $is_module
51+
* @param string $resource_name
52+
* @param int|null $resource_line_offset
53+
* @param int|null $resource_column_offset
54+
* @param int|null $script_id
55+
* @param string $source_map_url
56+
* @param ScriptOriginOptions|null $options
6057
*/
6158
public function __construct(
6259
string $resource_name = "",
6360
?int $resource_line_offset = null,
6461
?int $resource_column_offset = null,
6562
?int $script_id = null,
66-
bool $resource_is_shared_cross_origin = false,
6763
string $source_map_url = '',
68-
bool $resource_is_opaque = false,
69-
bool $is_wasm = false,
70-
bool $is_module = false
64+
ScriptOriginOptions $options = null
7165
) {
7266
$this->resource_name = $resource_name;
7367
$this->resource_line_offset = $resource_line_offset;
7468
$this->resource_column_offset = $resource_column_offset;
7569
$this->script_id = $script_id;
7670

77-
$this->options = new ScriptOriginOptions($resource_is_shared_cross_origin, $resource_is_opaque, $is_wasm, $is_module);
71+
72+
$this->options = $options ?: new ScriptOriginOptions();
7873

7974
$this->source_map_url = $source_map_url;
8075
}

0 commit comments

Comments
 (0)