X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_message_object.c;h=b6b3aafcac271f5c12dd3305031618cdd1b875fb;hp=379d37592dcf91881eb31ed906f8e1480dffb40f;hb=1c2f839129e85a8ddde41c1984e8f89fd4409614;hpb=9a8e9d419007cafacf69e7678bc19d5fc37e7e3f diff --git a/http_message_object.c b/http_message_object.c index 379d375..b6b3aaf 100644 --- a/http_message_object.c +++ b/http_message_object.c @@ -119,6 +119,7 @@ HTTP_END_ARGS; HTTP_EMPTY_ARGS(getParentMessage); HTTP_EMPTY_ARGS(send); +HTTP_EMPTY_ARGS(__toString); HTTP_BEGIN_ARGS(toString, 0) HTTP_ARG_VAL(include_parent, 0) HTTP_END_ARGS; @@ -195,7 +196,7 @@ zend_function_entry http_message_object_fe[] = { HTTP_MESSAGE_ME(key, ZEND_ACC_PUBLIC) HTTP_MESSAGE_ME(next, ZEND_ACC_PUBLIC) - ZEND_MALIAS(HttpMessage, __toString, toString, HTTP_ARGS(HttpMessage, toString), ZEND_ACC_PUBLIC) + ZEND_MALIAS(HttpMessage, __toString, toString, HTTP_ARGS(HttpMessage, __toString), ZEND_ACC_PUBLIC) HTTP_MESSAGE_ME(factory, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_MALIAS(HttpMessage, fromString, factory, HTTP_ARGS(HttpMessage, factory), ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) @@ -417,7 +418,7 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type #else zend_property_info *pinfo = zend_get_property_info(obj->zo.ce, member, 1 TSRMLS_CC); - if (!pinfo || ACC_PROP_PUBLIC(pinfo->flags)) { + if (!pinfo) { return zend_get_std_object_handlers()->read_property(object, member, type TSRMLS_CC); } #endif @@ -428,8 +429,13 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type } ALLOC_ZVAL(return_value); +#ifdef Z_SET_REFCOUNT + Z_SET_REFCOUNT_P(return_value, 0); + Z_UNSET_ISREF_P(return_value); +#else return_value->refcount = 0; return_value->is_ref = 0; +#endif #ifdef WONKY switch (h) @@ -505,11 +511,8 @@ static zval *_http_message_object_read_prop(zval *object, zval *member, int type break; default: -#ifdef WONKY + FREE_ZVAL(return_value); return zend_get_std_object_handlers()->read_property(object, member, type TSRMLS_CC); -#else - RETVAL_NULL(); -#endif } return return_value; @@ -519,19 +522,19 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va { getObjectEx(http_message_object, obj, object); http_message *msg = obj->message; - zval *cpy = NULL; + zval *cpy; #ifdef WONKY ulong h = zend_hash_func(Z_STRVAL_P(member), Z_STRLEN_P(member) + 1); #else zend_property_info *pinfo = zend_get_property_info(obj->zo.ce, member, 1 TSRMLS_CC); - if (!pinfo || ACC_PROP_PUBLIC(pinfo->flags)) { + if (!pinfo) { zend_get_std_object_handlers()->write_property(object, member, value TSRMLS_CC); return; } #endif - cpy = zval_copy(Z_TYPE_P(value), value); + cpy = value; #ifdef WONKY switch (h) @@ -541,26 +544,26 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va { case HTTP_MSG_PROPHASH_TYPE: case HTTP_MSG_CHILD_PROPHASH_TYPE: - convert_to_long(cpy); + convert_to_long_ex(&cpy); http_message_set_type(msg, Z_LVAL_P(cpy)); break; case HTTP_MSG_PROPHASH_HTTP_VERSION: case HTTP_MSG_CHILD_PROPHASH_HTTP_VERSION: - convert_to_double(cpy); + convert_to_double_ex(&cpy); msg->http.version = Z_DVAL_P(cpy); break; case HTTP_MSG_PROPHASH_BODY: case HTTP_MSG_CHILD_PROPHASH_BODY: - convert_to_string(cpy); + convert_to_string_ex(&cpy); phpstr_dtor(PHPSTR(msg)); phpstr_from_string_ex(PHPSTR(msg), Z_STRVAL_P(cpy), Z_STRLEN_P(cpy)); break; case HTTP_MSG_PROPHASH_HEADERS: case HTTP_MSG_CHILD_PROPHASH_HEADERS: - convert_to_array(cpy); + convert_to_array_ex(&cpy); zend_hash_clean(&msg->hdrs); zend_hash_copy(&msg->hdrs, Z_ARRVAL_P(cpy), (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *)); break; @@ -581,7 +584,7 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va case HTTP_MSG_PROPHASH_REQUEST_METHOD: case HTTP_MSG_CHILD_PROPHASH_REQUEST_METHOD: if (HTTP_MSG_TYPE(REQUEST, msg)) { - convert_to_string(cpy); + convert_to_string_ex(&cpy); STR_SET(msg->http.info.request.method, estrndup(Z_STRVAL_P(cpy), Z_STRLEN_P(cpy))); } break; @@ -589,7 +592,7 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va case HTTP_MSG_PROPHASH_REQUEST_URL: case HTTP_MSG_CHILD_PROPHASH_REQUEST_URL: if (HTTP_MSG_TYPE(REQUEST, msg)) { - convert_to_string(cpy); + convert_to_string_ex(&cpy); STR_SET(msg->http.info.request.url, estrndup(Z_STRVAL_P(cpy), Z_STRLEN_P(cpy))); } break; @@ -597,7 +600,7 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va case HTTP_MSG_PROPHASH_RESPONSE_CODE: case HTTP_MSG_CHILD_PROPHASH_RESPONSE_CODE: if (HTTP_MSG_TYPE(RESPONSE, msg)) { - convert_to_long(cpy); + convert_to_long_ex(&cpy); msg->http.info.response.code = Z_LVAL_P(cpy); } break; @@ -605,18 +608,18 @@ static void _http_message_object_write_prop(zval *object, zval *member, zval *va case HTTP_MSG_PROPHASH_RESPONSE_STATUS: case HTTP_MSG_CHILD_PROPHASH_RESPONSE_STATUS: if (HTTP_MSG_TYPE(RESPONSE, msg)) { - convert_to_string(cpy); + convert_to_string_ex(&cpy); STR_SET(msg->http.info.response.status, estrndup(Z_STRVAL_P(cpy), Z_STRLEN_P(cpy))); } break; default: -#ifdef WONKY zend_get_std_object_handlers()->write_property(object, member, value TSRMLS_CC); -#endif break; } - zval_free(&cpy); + if (cpy != value) { + zval_ptr_dtor(&cpy); + } } static HashTable *_http_message_object_get_props(zval *object TSRMLS_DC) @@ -1282,7 +1285,6 @@ PHP_METHOD(HttpMessage, toMessageTypeObject) zval_copy_ctor(&body); sapi_module.treat_data(PARSE_STRING, Z_STRVAL(body), &post TSRMLS_CC); zend_call_method_with_1_params(&return_value, http_request_object_ce, NULL, "setpostfields", NULL, &post); - zval_dtor(&body); } } #else @@ -1495,16 +1497,18 @@ PHP_METHOD(HttpMessage, next) { NO_ARGS { getObject(http_message_object, obj); - getObjectEx(http_message_object, itr, obj->iterator); - - if (itr && itr->parent.handle) { - zval *old = obj->iterator; - MAKE_STD_ZVAL(obj->iterator); - ZVAL_OBJVAL(obj->iterator, itr->parent, 1); - zval_ptr_dtor(&old); - } else { - zval_ptr_dtor(&obj->iterator); - obj->iterator = NULL; + if (obj->iterator) { + getObjectEx(http_message_object, itr, obj->iterator); + + if (itr && itr->parent.handle) { + zval *old = obj->iterator; + MAKE_STD_ZVAL(obj->iterator); + ZVAL_OBJVAL(obj->iterator, itr->parent, 1); + zval_ptr_dtor(&old); + } else { + zval_ptr_dtor(&obj->iterator); + obj->iterator = NULL; + } } } }