2 +--------------------------------------------------------------------+
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2013, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
19 #include "php_pq_object.h"
21 void php_pq_object_to_zval(void *o
, zval
**zv TSRMLS_DC
)
23 php_pq_object_t
*obj
= o
;
29 zend_objects_store_add_ref_by_handle(obj
->zv
.handle TSRMLS_CC
);
31 (*zv
)->type
= IS_OBJECT
;
32 (*zv
)->value
.obj
= obj
->zv
;
35 void php_pq_object_to_zval_no_addref(void *o
, zval
**zv TSRMLS_DC
)
37 php_pq_object_t
*obj
= o
;
45 (*zv
)->type
= IS_OBJECT
;
46 (*zv
)->value
.obj
= obj
->zv
;
49 void php_pq_object_addref(void *o TSRMLS_DC
)
51 php_pq_object_t
*obj
= o
;
52 zend_objects_store_add_ref_by_handle(obj
->zv
.handle TSRMLS_CC
);
55 void php_pq_object_delref(void *o TSRMLS_DC
)
57 php_pq_object_t
*obj
= o
;
58 zend_objects_store_del_ref_by_handle_ex(obj
->zv
.handle
, obj
->zv
.handlers TSRMLS_CC
);
61 static int apply_pi_to_ht(void *p TSRMLS_DC
, int argc
, va_list argv
, zend_hash_key
*key
)
63 zend_property_info
*pi
= p
;
64 HashTable
*ht
= va_arg(argv
, HashTable
*);
65 zval
*object
= va_arg(argv
, zval
*);
66 php_pq_object_t
*obj
= va_arg(argv
, php_pq_object_t
*);
67 int addref
= va_arg(argv
, int);
68 zval
*property
= zend_read_property(obj
->zo
.ce
, object
, pi
->name
, pi
->name_length
, 0 TSRMLS_CC
);
73 zend_hash_update(ht
, pi
->name
, pi
->name_length
+ 1, (void *) &property
, sizeof(zval
*), NULL
);
75 return ZEND_HASH_APPLY_KEEP
;
78 HashTable
*php_pq_object_debug_info(zval
*object
, int *temp TSRMLS_DC
)
81 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
85 ZEND_INIT_SYMTABLE(ht
);
87 zend_hash_apply_with_arguments(&obj
->zo
.ce
->properties_info TSRMLS_CC
, apply_pi_to_ht
, 4, ht
, object
, obj
, 1);
92 HashTable
*php_pq_object_properties(zval
*object TSRMLS_DC
)
94 HashTable
*ht
= zend_get_std_object_handlers()->get_properties(object TSRMLS_CC
);
95 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
97 zend_hash_apply_with_arguments(&obj
->zo
.ce
->properties_info TSRMLS_CC
, apply_pi_to_ht
, 4, ht
, object
, obj
, 1);
102 zend_class_entry
*ancestor(zend_class_entry
*ce
)
110 zval
*php_pq_object_read_prop(zval
*object
, zval
*member
, int type
, const zend_literal
*key TSRMLS_DC
)
112 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
113 php_pq_object_prophandler_t
*handler
;
114 zval
*return_value
= NULL
;
117 php_error(E_RECOVERABLE_ERROR
, "%s not initialized", ancestor(obj
->zo
.ce
)->name
);
118 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
119 } else if ((SUCCESS
!= zend_hash_find(obj
->prophandler
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) || !handler
->read
) {
120 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
121 } else if (type
!= BP_VAR_R
) {
122 php_error(E_WARNING
, "Cannot access %s properties by reference or array key/index", ancestor(obj
->zo
.ce
)->name
);
123 return_value
= zend_get_std_object_handlers()->read_property(object
, member
, type
, key TSRMLS_CC
);
125 ALLOC_ZVAL(return_value
);
126 Z_SET_REFCOUNT_P(return_value
, 0);
127 Z_UNSET_ISREF_P(return_value
);
129 handler
->read(object
, obj
, return_value TSRMLS_CC
);
135 void php_pq_object_write_prop(zval
*object
, zval
*member
, zval
*value
, const zend_literal
*key TSRMLS_DC
)
137 php_pq_object_t
*obj
= zend_object_store_get_object(object TSRMLS_CC
);
138 php_pq_object_prophandler_t
*handler
;
141 php_error(E_RECOVERABLE_ERROR
, "%s not initialized", ancestor(obj
->zo
.ce
)->name
);
142 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);
143 } else if (SUCCESS
== zend_hash_find(obj
->prophandler
, Z_STRVAL_P(member
), Z_STRLEN_P(member
)+1, (void *) &handler
)) {
144 if (handler
->write
) {
145 handler
->write(object
, obj
, value TSRMLS_CC
);
148 zend_get_std_object_handlers()->write_property(object
, member
, value
, key TSRMLS_CC
);