@@ -265,47 +265,28 @@ PHP_DOM_EXPORT dom_object *php_dom_object_get_data(xmlNodePtr obj)
265265}
266266/* }}} end php_dom_object_get_data */
267267
268- /* {{{ dom_read_na */
269- static int dom_read_na (dom_object * obj , zval * retval )
270- {
271- zend_throw_error (NULL , "Cannot read property" );
272- return FAILURE ;
273- }
274- /* }}} */
275-
276- /* {{{ dom_write_na */
277- static int dom_write_na (dom_object * obj , zval * newval )
278- {
279- zend_throw_error (NULL , "Cannot write property" );
280- return FAILURE ;
281- }
282- /* }}} */
283-
284- /* {{{ dom_register_prop_handler */
285268static void dom_register_prop_handler (HashTable * prop_handler , char * name , size_t name_len , dom_read_t read_func , dom_write_t write_func )
286269{
287270 dom_prop_handler hnd ;
288271 zend_string * str ;
289272
290- hnd .read_func = read_func ? read_func : dom_read_na ;
291- hnd .write_func = write_func ? write_func : dom_write_na ;
273+ hnd .read_func = read_func ;
274+ hnd .write_func = write_func ;
292275 str = zend_string_init_interned (name , name_len , 1 );
293276 zend_hash_add_mem (prop_handler , str , & hnd , sizeof (dom_prop_handler ));
294277 zend_string_release_ex (str , 1 );
295278}
296- /* }}} */
297279
298- static zval * dom_get_property_ptr_ptr (zend_object * object , zend_string * name , int type , void * * cache_slot ) /* {{{ */
280+ static zval * dom_get_property_ptr_ptr (zend_object * object , zend_string * name , int type , void * * cache_slot )
299281{
300282 dom_object * obj = php_dom_obj_from_obj (object );
301- zval * retval = NULL ;
302283
303284 if (!obj -> prop_handler || !zend_hash_exists (obj -> prop_handler , name )) {
304- retval = zend_std_get_property_ptr_ptr (object , name , type , cache_slot );
285+ return zend_std_get_property_ptr_ptr (object , name , type , cache_slot );
305286 }
306- return retval ;
287+
288+ return NULL ;
307289}
308- /* }}} */
309290
310291/* {{{ dom_read_property */
311292zval * dom_read_property (zend_object * object , zend_string * name , int type , void * * cache_slot , zval * rv )
@@ -337,7 +318,6 @@ zval *dom_read_property(zend_object *object, zend_string *name, int type, void *
337318}
338319/* }}} */
339320
340- /* {{{ dom_write_property */
341321zval * dom_write_property (zend_object * object , zend_string * name , zval * value , void * * cache_slot )
342322{
343323 dom_object * obj = php_dom_obj_from_obj (object );
@@ -346,15 +326,32 @@ zval *dom_write_property(zend_object *object, zend_string *name, zval *value, vo
346326 if (obj -> prop_handler != NULL ) {
347327 hnd = zend_hash_find_ptr (obj -> prop_handler , name );
348328 }
329+
349330 if (hnd ) {
350- hnd -> write_func (obj , value );
351- } else {
352- value = zend_std_write_property (object , name , value , cache_slot );
331+ if (!hnd -> write_func ) {
332+ zend_throw_error (NULL , "Cannot write read-only property %s::$%s" , ZSTR_VAL (object -> ce -> name ), ZSTR_VAL (name ));
333+ return & EG (error_zval );
334+ }
335+
336+ zend_property_info * prop = zend_get_property_info (object -> ce , name , /* silent */ true);
337+ if (prop && ZEND_TYPE_IS_SET (prop -> type )) {
338+ zval tmp ;
339+ ZVAL_COPY (& tmp , value );
340+ if (!zend_verify_property_type (prop , & tmp , ZEND_CALL_USES_STRICT_TYPES (EG (current_execute_data )))) {
341+ zval_ptr_dtor (& tmp );
342+ return & EG (error_zval );
343+ }
344+ hnd -> write_func (obj , & tmp );
345+ zval_ptr_dtor (& tmp );
346+ } else {
347+ hnd -> write_func (obj , value );
348+ }
349+
350+ return value ;
353351 }
354352
355- return value ;
353+ return zend_std_write_property ( object , name , value , cache_slot ) ;
356354}
357- /* }}} */
358355
359356/* {{{ dom_property_exists */
360357static int dom_property_exists (zend_object * object , zend_string * name , int check_empty , void * * cache_slot )
0 commit comments