summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2003-08-29 23:27:22 +0000
committerMarcus Boerger <helly@php.net>2003-08-29 23:27:22 +0000
commit047a574e6c930ff4c451031843687d89305ce8c4 (patch)
tree56b270bf247b13c53e465acf65ada6b4d0512b0a /Zend/zend_API.c
parent50040c8ae9bdc7e015f95872863887191a6e7ddb (diff)
downloadphp-git-047a574e6c930ff4c451031843687d89305ce8c4.tar.gz
- Add zend_merge_properties() which is designed to serve *_fetch_object().
- Explain drawbacks of object_and_properties_init and zend_merge_properties. # # I guess we can live with the purity problem of potentially calling __set() # of an object which wasn't already ctored. #
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r--Zend/zend_API.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index ccfb51fce5..ead407f9e7 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -655,6 +655,44 @@ ZEND_API int _array_init(zval *arg ZEND_FILE_LINE_DC)
}
+static int zend_merge_property(zval **value, int num_args, va_list args, zend_hash_key *hash_key)
+{
+ /* which name should a numeric property have ? */
+ if (hash_key->nKeyLength) {
+ zval *obj = va_arg(args, zval *);
+ zend_object_handlers *obj_ht = va_arg(args, zend_object_handlers *);
+ zval member;
+ TSRMLS_FETCH();
+
+ ZVAL_STRINGL(&member, hash_key->arKey, hash_key->nKeyLength-1, 0);
+ obj_ht->write_property(obj, &member, *value TSRMLS_CC);
+ }
+ return ZEND_HASH_APPLY_KEEP;
+}
+
+
+/* This function should be called after the constructor has been called
+ * because it may call __set from the uninitialized object otherwise. */
+ZEND_API void zend_merge_properties(zval *obj, HashTable *properties, int destroy_ht TSRMLS_DC)
+{
+ zend_object_handlers *obj_ht = Z_OBJ_HT_P(obj);
+ zend_class_entry *old_scope = EG(scope);
+
+ EG(scope) = Z_OBJCE_P(obj);
+ zend_hash_apply_with_arguments(properties, (apply_func_args_t)zend_merge_property, 2, obj, obj_ht);
+ EG(scope) = old_scope;
+
+ if (destroy_ht) {
+ zend_hash_destroy(properties);
+ FREE_HASHTABLE(properties);
+ }
+}
+
+
+/* This function requires 'properties' to contain all props declared in the
+ * class and all props being public. If only a subset is given or the class
+ * has protected members then you need to merge the properties seperately by
+ * calling zend_merge_properties(). */
ZEND_API int _object_and_properties_init(zval *arg, zend_class_entry *class_type, HashTable *properties ZEND_FILE_LINE_DC TSRMLS_DC)
{
zval *tmp;