Skip to content

Commit 26f5d66

Browse files
committed
Use NO_DYNAMIC_PROPERTIES flag for WeakRef/WeakMap
This is slightly weaker than the existing code, but I think this makes more sense. In particular something like isset($wr->foobar) should just return false instead of throwing.
1 parent e198546 commit 26f5d66

File tree

4 files changed

+25
-84
lines changed

4 files changed

+25
-84
lines changed

Zend/tests/weakrefs/weakmap_error_conditions.phpt

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,17 @@ try {
4141
echo $e->getMessage(), "\n";
4242
}
4343

44+
var_dump($map->prop);
45+
var_dump(isset($map->prop));
46+
unset($map->prop);
47+
4448
try {
4549
$map->prop = 1;
4650
} catch (Error $e) {
4751
echo $e->getMessage(), "\n";
4852
}
4953
try {
50-
var_dump($map->prop);
54+
$map->prop[] = 1;
5155
} catch (Error $e) {
5256
echo $e->getMessage(), "\n";
5357
}
@@ -56,16 +60,6 @@ try {
5660
} catch (Error $e) {
5761
echo $e->getMessage(), "\n";
5862
}
59-
try {
60-
isset($map->prop);
61-
} catch (Error $e) {
62-
echo $e->getMessage(), "\n";
63-
}
64-
try {
65-
unset($map->prop);
66-
} catch (Error $e) {
67-
echo $e->getMessage(), "\n";
68-
}
6963

7064
try {
7165
serialize($map);
@@ -79,18 +73,20 @@ try {
7973
}
8074

8175
?>
82-
--EXPECT--
76+
--EXPECTF--
8377
WeakMap key must be an object
8478
WeakMap key must be an object
8579
WeakMap key must be an object
8680
WeakMap key must be an object
8781
Cannot append to WeakMap
8882
Cannot append to WeakMap
8983
Object stdClass#2 not contained in WeakMap
90-
WeakMap objects do not support properties
91-
WeakMap objects do not support properties
92-
WeakMap objects do not support property references
93-
WeakMap objects do not support properties
94-
WeakMap objects do not support properties
84+
85+
Warning: Undefined property: WeakMap::$prop in %s on line %d
86+
NULL
87+
bool(false)
88+
Cannot create dynamic property WeakMap::$prop
89+
Cannot create dynamic property WeakMap::$prop
90+
Cannot create dynamic property WeakMap::$prop
9591
Serialization of 'WeakMap' is not allowed
9692
Unserialization of 'WeakMap' is not allowed

Zend/tests/weakrefs/weakrefs_003.phpt

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,25 @@ WeakReference object handlers
44
<?php
55
$wr = WeakReference::create(new stdClass);
66

7-
try {
8-
$wr->disallow;
9-
} catch (Error $ex) {
10-
var_dump($ex->getMessage());
11-
}
7+
var_dump($wr->disallow);
8+
var_dump(isset($wr->disallow));
9+
unset($wr->disallow);
1210

1311
try {
1412
$wr->disallow = "writes";
1513
} catch (Error $ex) {
1614
var_dump($ex->getMessage());
1715
}
1816

19-
try {
20-
isset($wr->disallow);
21-
} catch (Error $ex) {
22-
var_dump($ex->getMessage());
23-
}
24-
25-
try {
26-
unset($wr->disallow);
27-
} catch (Error $ex) {
28-
var_dump($ex->getMessage());
29-
}
30-
3117
try {
3218
$disallow = &$wr->disallowed;
3319
} catch (Error $ex) {
3420
var_dump($ex->getMessage());
3521
}
3622
?>
37-
--EXPECT--
38-
string(47) "WeakReference objects do not support properties"
39-
string(47) "WeakReference objects do not support properties"
40-
string(47) "WeakReference objects do not support properties"
41-
string(47) "WeakReference objects do not support properties"
42-
string(56) "WeakReference objects do not support property references"
43-
23+
--EXPECTF--
24+
Warning: Undefined property: WeakReference::$disallow in %s on line %d
25+
NULL
26+
bool(false)
27+
string(55) "Cannot create dynamic property WeakReference::$disallow"
28+
string(57) "Cannot create dynamic property WeakReference::$disallowed"

Zend/zend_object_handlers.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -948,7 +948,7 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *nam
948948
UNEXPECTED((*zend_get_property_guard(zobj, name)) & IN_GET)) {
949949
if (UNEXPECTED(zobj->ce->ce_flags & ZEND_ACC_NO_DYNAMIC_PROPERTIES)) {
950950
zend_forbidden_dynamic_property(zobj->ce, name);
951-
return NULL;
951+
return &EG(error_zval);
952952
}
953953
if (UNEXPECTED(!zobj->properties)) {
954954
rebuild_object_properties(zobj);

Zend/zend_weakrefs.c

Lines changed: 2 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -237,36 +237,6 @@ static void zend_weakref_free(zend_object *zo) {
237237
#define zend_weakref_unsupported(object, thing) \
238238
zend_throw_error(NULL, "%s objects do not support " thing, ZSTR_VAL(object->ce->name));
239239

240-
static ZEND_COLD zval* zend_weakref_no_write(zend_object *object, zend_string *member, zval *value, void **rtc) {
241-
zend_weakref_unsupported(object, "properties");
242-
243-
return &EG(uninitialized_zval);
244-
}
245-
246-
static ZEND_COLD zval* zend_weakref_no_read(zend_object *object, zend_string *member, int type, void **rtc, zval *rv) {
247-
if (!EG(exception)) {
248-
zend_weakref_unsupported(object, "properties");
249-
}
250-
251-
return &EG(uninitialized_zval);
252-
}
253-
254-
static ZEND_COLD zval *zend_weakref_no_read_ptr(zend_object *object, zend_string *member, int type, void **rtc) {
255-
zend_weakref_unsupported(object, "property references");
256-
return NULL;
257-
}
258-
259-
static ZEND_COLD int zend_weakref_no_isset(zend_object *object, zend_string *member, int hse, void **rtc) {
260-
if (hse != 2) {
261-
zend_weakref_unsupported(object, "properties");
262-
}
263-
return 0;
264-
}
265-
266-
static ZEND_COLD void zend_weakref_no_unset(zend_object *object, zend_string *member, void **rtc) {
267-
zend_weakref_unsupported(object, "properties");
268-
}
269-
270240
ZEND_COLD ZEND_METHOD(WeakReference, __construct)
271241
{
272242
zend_throw_error(NULL,
@@ -615,7 +585,7 @@ void zend_register_weakref_ce(void) /* {{{ */
615585

616586
INIT_CLASS_ENTRY(ce, "WeakReference", class_WeakReference_methods);
617587
zend_ce_weakref = zend_register_internal_class(&ce);
618-
zend_ce_weakref->ce_flags |= ZEND_ACC_FINAL;
588+
zend_ce_weakref->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
619589

620590
zend_ce_weakref->create_object = zend_weakref_new;
621591
zend_ce_weakref->serialize = zend_class_serialize_deny;
@@ -625,16 +595,11 @@ void zend_register_weakref_ce(void) /* {{{ */
625595
zend_weakref_handlers.offset = XtOffsetOf(zend_weakref, std);
626596

627597
zend_weakref_handlers.free_obj = zend_weakref_free;
628-
zend_weakref_handlers.read_property = zend_weakref_no_read;
629-
zend_weakref_handlers.write_property = zend_weakref_no_write;
630-
zend_weakref_handlers.has_property = zend_weakref_no_isset;
631-
zend_weakref_handlers.unset_property = zend_weakref_no_unset;
632-
zend_weakref_handlers.get_property_ptr_ptr = zend_weakref_no_read_ptr;
633598
zend_weakref_handlers.clone_obj = NULL;
634599

635600
INIT_CLASS_ENTRY(ce, "WeakMap", class_WeakMap_methods);
636601
zend_ce_weakmap = zend_register_internal_class(&ce);
637-
zend_ce_weakmap->ce_flags |= ZEND_ACC_FINAL;
602+
zend_ce_weakmap->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
638603

639604
zend_ce_weakmap->create_object = zend_weakmap_create_object;
640605
zend_ce_weakmap->get_iterator = zend_weakmap_get_iterator;
@@ -656,11 +621,6 @@ void zend_register_weakref_ce(void) /* {{{ */
656621
zend_weakmap_handlers.get_properties_for = zend_weakmap_get_properties_for;
657622
zend_weakmap_handlers.get_gc = zend_weakmap_get_gc;
658623
zend_weakmap_handlers.clone_obj = zend_weakmap_clone_obj;
659-
zend_weakmap_handlers.read_property = zend_weakref_no_read;
660-
zend_weakmap_handlers.write_property = zend_weakref_no_write;
661-
zend_weakmap_handlers.has_property = zend_weakref_no_isset;
662-
zend_weakmap_handlers.unset_property = zend_weakref_no_unset;
663-
zend_weakmap_handlers.get_property_ptr_ptr = zend_weakref_no_read_ptr;
664624
}
665625
/* }}} */
666626

0 commit comments

Comments
 (0)