Skip to content

Commit 4051866

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 b1821ad commit 4051866

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
@@ -1061,7 +1061,7 @@ ZEND_API zval *zend_std_get_property_ptr_ptr(zend_object *zobj, zend_string *nam
10611061
UNEXPECTED((*zend_get_property_guard(zobj, name)) & IN_GET)) {
10621062
if (UNEXPECTED(zobj->ce->ce_flags & ZEND_ACC_NO_DYNAMIC_PROPERTIES)) {
10631063
zend_forbidden_dynamic_property(zobj->ce, name);
1064-
return NULL;
1064+
return &EG(error_zval);
10651065
}
10661066
if (UNEXPECTED(!zobj->properties)) {
10671067
rebuild_object_properties(zobj);

Zend/zend_weakrefs.c

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

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

620590
INIT_CLASS_ENTRY(ce, "WeakReference", class_WeakReference_methods);
621591
zend_ce_weakref = zend_register_internal_class(&ce);
622-
zend_ce_weakref->ce_flags |= ZEND_ACC_FINAL;
592+
zend_ce_weakref->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
623593

624594
zend_ce_weakref->create_object = zend_weakref_new;
625595
zend_ce_weakref->serialize = zend_class_serialize_deny;
@@ -629,16 +599,11 @@ void zend_register_weakref_ce(void) /* {{{ */
629599
zend_weakref_handlers.offset = XtOffsetOf(zend_weakref, std);
630600

631601
zend_weakref_handlers.free_obj = zend_weakref_free;
632-
zend_weakref_handlers.read_property = zend_weakref_no_read;
633-
zend_weakref_handlers.write_property = zend_weakref_no_write;
634-
zend_weakref_handlers.has_property = zend_weakref_no_isset;
635-
zend_weakref_handlers.unset_property = zend_weakref_no_unset;
636-
zend_weakref_handlers.get_property_ptr_ptr = zend_weakref_no_read_ptr;
637602
zend_weakref_handlers.clone_obj = NULL;
638603

639604
INIT_CLASS_ENTRY(ce, "WeakMap", class_WeakMap_methods);
640605
zend_ce_weakmap = zend_register_internal_class(&ce);
641-
zend_ce_weakmap->ce_flags |= ZEND_ACC_FINAL;
606+
zend_ce_weakmap->ce_flags |= ZEND_ACC_FINAL | ZEND_ACC_NO_DYNAMIC_PROPERTIES;
642607

643608
zend_ce_weakmap->create_object = zend_weakmap_create_object;
644609
zend_ce_weakmap->get_iterator = zend_weakmap_get_iterator;
@@ -660,11 +625,6 @@ void zend_register_weakref_ce(void) /* {{{ */
660625
zend_weakmap_handlers.get_properties_for = zend_weakmap_get_properties_for;
661626
zend_weakmap_handlers.get_gc = zend_weakmap_get_gc;
662627
zend_weakmap_handlers.clone_obj = zend_weakmap_clone_obj;
663-
zend_weakmap_handlers.read_property = zend_weakref_no_read;
664-
zend_weakmap_handlers.write_property = zend_weakref_no_write;
665-
zend_weakmap_handlers.has_property = zend_weakref_no_isset;
666-
zend_weakmap_handlers.unset_property = zend_weakref_no_unset;
667-
zend_weakmap_handlers.get_property_ptr_ptr = zend_weakref_no_read_ptr;
668628
}
669629
/* }}} */
670630

0 commit comments

Comments
 (0)