X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=php_http_property_proxy.c;h=8fae2f115d9eead34d0aa1fc629bd75181f90dbf;hb=8099f0bdec0a8731a3fbb350bf5a8e3320d1fc01;hp=196cccea223e23c7de161c70113c3b9135ed3793;hpb=d3485e3b28336153dca690e872ffe1ddc60fedd2;p=m6w6%2Fext-http diff --git a/php_http_property_proxy.c b/php_http_property_proxy.c index 196ccce..8fae2f1 100644 --- a/php_http_property_proxy.c +++ b/php_http_property_proxy.c @@ -1,6 +1,20 @@ - -#include "php_http.h" - +/* + +--------------------------------------------------------------------+ + | PECL :: http | + +--------------------------------------------------------------------+ + | Redistribution and use in source and binary forms, with or without | + | modification, are permitted provided that the conditions mentioned | + | in the accompanying LICENSE file are met. | + +--------------------------------------------------------------------+ + | Copyright (c) 2004-2011, Michael Wallner | + +--------------------------------------------------------------------+ +*/ + +#include "php_http_api.h" + +#ifndef PHP_HTTP_PPDBG +# define PHP_HTTP_PPDBG 1 +#endif php_http_property_proxy_t *php_http_property_proxy_init(php_http_property_proxy_t *proxy, zval *object, zval *member TSRMLS_DC) { @@ -13,8 +27,11 @@ php_http_property_proxy_t *php_http_property_proxy_init(php_http_property_proxy_ ZVAL_OBJVAL(proxy->myself, php_http_property_proxy_object_new_ex(php_http_property_proxy_class_entry, proxy, NULL TSRMLS_CC), 0); Z_ADDREF_P(object); proxy->object = object; - proxy->member = php_http_zsep(IS_STRING, member); + proxy->member = php_http_ztyp(IS_STRING, member); +#if PHP_HTTP_PPDBG + fprintf(stderr, "proxy_init: %s\n", Z_STRVAL_P(proxy->member)); +#endif return proxy; } @@ -88,14 +105,43 @@ static void php_http_property_proxy_object_set(zval **object, zval *value TSRMLS { php_http_property_proxy_object_t *obj = zend_object_store_get_object(*object TSRMLS_CC); - zend_update_property(Z_OBJCE_P(obj->proxy->object), obj->proxy->object, Z_STRVAL_P(obj->proxy->member), Z_STRLEN_P(obj->proxy->member), value TSRMLS_CC); +#if PHP_HTTP_PPDBG + fprintf(stderr, "proxy_set: %s\n", Z_STRVAL_P(obj->proxy->member)); +#endif + if (Z_TYPE_P(obj->proxy->object) == IS_OBJECT) { + zend_update_property(Z_OBJCE_P(obj->proxy->object), obj->proxy->object, Z_STRVAL_P(obj->proxy->member), Z_STRLEN_P(obj->proxy->member), value TSRMLS_CC); + } else { + Z_ADDREF_P(value); + zend_symtable_update(Z_ARRVAL_P(obj->proxy->object), Z_STRVAL_P(obj->proxy->member), Z_STRLEN_P(obj->proxy->member)+1, (void *) &value, sizeof(zval *), NULL); + } } static zval *php_http_property_proxy_object_get(zval *object TSRMLS_DC) { php_http_property_proxy_object_t *obj = zend_object_store_get_object(object TSRMLS_CC); - return zend_read_property(Z_OBJCE_P(obj->proxy->object), obj->proxy->object, Z_STRVAL_P(obj->proxy->member), Z_STRLEN_P(obj->proxy->member), 0 TSRMLS_CC); +#if PHP_HTTP_PPDBG + fprintf(stderr, "proxy_get: %s\n", Z_STRVAL_P(obj->proxy->member)); +#endif + if (Z_TYPE_P(obj->proxy->object) == IS_OBJECT) { + return zend_read_property(Z_OBJCE_P(obj->proxy->object), obj->proxy->object, Z_STRVAL_P(obj->proxy->member), Z_STRLEN_P(obj->proxy->member), 0 TSRMLS_CC); + } else { + zval **data = NULL; + + if (SUCCESS == zend_symtable_find(Z_ARRVAL_P(obj->proxy->object), Z_STRVAL_P(obj->proxy->member), Z_STRLEN_P(obj->proxy->member)+1, (void *) &data)) { + Z_ADDREF_PP(data); + } else { + zval *unset; + + MAKE_STD_ZVAL(unset); + ZVAL_NULL(unset); + zend_symtable_update(Z_ARRVAL_P(obj->proxy->object), Z_STRVAL_P(obj->proxy->member), Z_STRLEN_P(obj->proxy->member)+1, (void *) &unset, sizeof(zval *), (void *) &data); + } + + return *data; + } + + return NULL; } static STATUS php_http_property_proxy_object_cast(zval *object, zval *return_value, int type TSRMLS_DC) @@ -103,7 +149,7 @@ static STATUS php_http_property_proxy_object_cast(zval *object, zval *return_val zval *old_value, *new_value; old_value = php_http_property_proxy_object_get(object TSRMLS_CC); - new_value = php_http_zsep(type, old_value); + new_value = php_http_ztyp(type, old_value); if (old_value != new_value) { zval_ptr_dtor(&old_value); @@ -118,7 +164,16 @@ static zval *php_http_property_proxy_object_read_dimension(zval *object, zval *o { zval *retval = NULL, *property = php_http_property_proxy_object_get(object TSRMLS_CC); - if (Z_TYPE_P(property) == IS_ARRAY) { +#if PHP_HTTP_PPDBG + php_http_property_proxy_object_t *obj = zend_object_store_get_object(object TSRMLS_CC); + zval *ocpy = php_http_ztyp(IS_STRING, offset); + fprintf(stderr, "read_dimension: %s.%s (%d)\n", Z_STRVAL_P(obj->proxy->member), Z_STRVAL_P(ocpy), type); + zval_ptr_dtor(&ocpy); +#endif + if (type != BP_VAR_R) { + Z_ADDREF_P(property); + retval = php_http_property_proxy_init(NULL, property, offset TSRMLS_CC)->myself; + } else if (Z_TYPE_P(property) == IS_ARRAY) { zval **data = NULL; if (Z_TYPE_P(offset) == IS_LONG) { @@ -126,8 +181,8 @@ static zval *php_http_property_proxy_object_read_dimension(zval *object, zval *o retval = *data; } } else { - offset = php_http_zsep(IS_STRING, offset); - if (SUCCESS == zend_hash_find(Z_ARRVAL_P(property), Z_STRVAL_P(offset), Z_STRLEN_P(offset), (void *) &data)) { + offset = php_http_ztyp(IS_STRING, offset); + if (SUCCESS == zend_symtable_find(Z_ARRVAL_P(property), Z_STRVAL_P(offset), Z_STRLEN_P(offset), (void *) &data)) { retval = *data; } zval_ptr_dtor(&offset); @@ -138,7 +193,7 @@ static zval *php_http_property_proxy_object_read_dimension(zval *object, zval *o } } zval_ptr_dtor(&property); - +if(retval)Z_SET_ISREF_P(retval); return retval; } @@ -146,9 +201,16 @@ static void php_http_property_proxy_object_write_dimension(zval *object, zval *o { zval *property = php_http_property_proxy_object_get(object TSRMLS_CC); +#if PHP_HTTP_PPDBG + php_http_property_proxy_object_t *obj = zend_object_store_get_object(object TSRMLS_CC); + zval *ocpy = offset ? php_http_ztyp(IS_STRING, offset) : offset; + fprintf(stderr, "write_dimension: %s.%s (%d)\n", Z_STRVAL_P(obj->proxy->member), ocpy?Z_STRVAL_P(ocpy):"", Z_TYPE_P(property)); + if(ocpy)zval_ptr_dtor(&ocpy); +#endif switch (Z_TYPE_P(property)) { case IS_NULL: array_init(property); + /* no break */ case IS_ARRAY: Z_ADDREF_P(value); if (!offset) { @@ -156,7 +218,7 @@ static void php_http_property_proxy_object_write_dimension(zval *object, zval *o } else if (Z_TYPE_P(offset) == IS_LONG) { add_index_zval(property, Z_LVAL_P(offset), value); } else { - offset = php_http_zsep(IS_STRING, offset); + offset = php_http_ztyp(IS_STRING, offset); add_assoc_zval_ex(property, Z_STRVAL_P(offset), Z_STRLEN_P(offset) + 1, value); zval_ptr_dtor(&offset); } @@ -175,7 +237,7 @@ PHP_METHOD(HttpPropertyProxy, __construct) PHP_MINIT_FUNCTION(http_property_proxy) { - PHP_HTTP_REGISTER_CLASS(http\\object, PropertyProxy, http_property_proxy, NULL, ZEND_ACC_FINAL); + PHP_HTTP_REGISTER_CLASS(http\\Object, PropertyProxy, http_property_proxy, NULL, ZEND_ACC_FINAL); php_http_property_proxy_class_entry->create_object = php_http_property_proxy_object_new; memcpy(&php_http_property_proxy_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); php_http_property_proxy_object_handlers.set = php_http_property_proxy_object_set; @@ -187,3 +249,13 @@ PHP_MINIT_FUNCTION(http_property_proxy) return SUCCESS; } + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim600: noet sw=4 ts=4 fdm=marker + * vim<600: noet sw=4 ts=4 + */ +