mirror of
https://github.com/php/php-src.git
synced 2025-08-17 06:28:50 +02:00
switch to zend_parse_method_parameters for consistancy
insure object parameters are correct class types convert zvals to correct type if needed for property writes fix a few segfaults found while testing
This commit is contained in:
parent
595d6a2d84
commit
2a32e4328a
2 changed files with 63 additions and 26 deletions
|
@ -136,18 +136,18 @@ int dom_attr_value_read(dom_object *obj, zval **retval TSRMLS_DC)
|
||||||
|
|
||||||
if ((content = xmlNodeGetContent((xmlNodePtr) attrp)) != NULL) {
|
if ((content = xmlNodeGetContent((xmlNodePtr) attrp)) != NULL) {
|
||||||
ZVAL_STRING(*retval, content, 1);
|
ZVAL_STRING(*retval, content, 1);
|
||||||
|
xmlFree(content);
|
||||||
} else {
|
} else {
|
||||||
ZVAL_EMPTY_STRING(*retval);
|
ZVAL_EMPTY_STRING(*retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
xmlFree(content);
|
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int dom_attr_value_write(dom_object *obj, zval *newval TSRMLS_DC)
|
int dom_attr_value_write(dom_object *obj, zval *newval TSRMLS_DC)
|
||||||
{
|
{
|
||||||
|
zval value_copy;
|
||||||
xmlAttrPtr attrp;
|
xmlAttrPtr attrp;
|
||||||
|
|
||||||
attrp = (xmlAttrPtr) dom_object_get_node(obj);
|
attrp = (xmlAttrPtr) dom_object_get_node(obj);
|
||||||
|
@ -155,8 +155,22 @@ int dom_attr_value_write(dom_object *obj, zval *newval TSRMLS_DC)
|
||||||
if (attrp->children) {
|
if (attrp->children) {
|
||||||
node_list_unlink(attrp->children TSRMLS_CC);
|
node_list_unlink(attrp->children TSRMLS_CC);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (newval->type != IS_STRING) {
|
||||||
|
if(newval->refcount > 1) {
|
||||||
|
value_copy = *newval;
|
||||||
|
zval_copy_ctor(&value_copy);
|
||||||
|
newval = &value_copy;
|
||||||
|
}
|
||||||
|
convert_to_string(newval);
|
||||||
|
}
|
||||||
|
|
||||||
xmlNodeSetContentLen((xmlNodePtr) attrp, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1);
|
xmlNodeSetContentLen((xmlNodePtr) attrp, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1);
|
||||||
|
|
||||||
|
if (newval == &value_copy) {
|
||||||
|
zval_dtor(newval);
|
||||||
|
}
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,7 +237,11 @@ PHP_FUNCTION(dom_attr_is_id)
|
||||||
xmlAttrPtr attrp;
|
xmlAttrPtr attrp;
|
||||||
xmlNodePtr nodep;
|
xmlNodePtr nodep;
|
||||||
|
|
||||||
DOM_GET_THIS_OBJ(attrp, id, xmlAttrPtr, intern);
|
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", &id, dom_attr_class_entry) == FAILURE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DOM_GET_OBJ(attrp, id, xmlAttrPtr, intern);
|
||||||
|
|
||||||
nodep = attrp->parent;
|
nodep = attrp->parent;
|
||||||
|
|
||||||
|
|
|
@ -60,21 +60,36 @@ int dom_characterdata_data_read(dom_object *obj, zval **retval TSRMLS_DC)
|
||||||
|
|
||||||
if ((content = xmlNodeGetContent(nodep)) != NULL) {
|
if ((content = xmlNodeGetContent(nodep)) != NULL) {
|
||||||
ZVAL_STRING(*retval, content, 1);
|
ZVAL_STRING(*retval, content, 1);
|
||||||
|
xmlFree(content);
|
||||||
} else {
|
} else {
|
||||||
ZVAL_EMPTY_STRING(*retval);
|
ZVAL_EMPTY_STRING(*retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
xmlFree(content);
|
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int dom_characterdata_data_write(dom_object *obj, zval *newval TSRMLS_DC)
|
int dom_characterdata_data_write(dom_object *obj, zval *newval TSRMLS_DC)
|
||||||
{
|
{
|
||||||
|
zval value_copy;
|
||||||
xmlNode *nodep;
|
xmlNode *nodep;
|
||||||
|
|
||||||
nodep = dom_object_get_node(obj);
|
nodep = dom_object_get_node(obj);
|
||||||
|
|
||||||
|
if (newval->type != IS_STRING) {
|
||||||
|
if(newval->refcount > 1) {
|
||||||
|
value_copy = *newval;
|
||||||
|
zval_copy_ctor(&value_copy);
|
||||||
|
newval = &value_copy;
|
||||||
|
}
|
||||||
|
convert_to_string(newval);
|
||||||
|
}
|
||||||
|
|
||||||
xmlNodeSetContentLen(nodep, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1);
|
xmlNodeSetContentLen(nodep, Z_STRVAL_P(newval), Z_STRLEN_P(newval) + 1);
|
||||||
|
|
||||||
|
if (newval == &value_copy) {
|
||||||
|
zval_dtor(newval);
|
||||||
|
}
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,16 +104,19 @@ int dom_characterdata_length_read(dom_object *obj, zval **retval TSRMLS_DC)
|
||||||
{
|
{
|
||||||
xmlNodePtr nodep;
|
xmlNodePtr nodep;
|
||||||
xmlChar *content;
|
xmlChar *content;
|
||||||
long length;
|
long length = 0;
|
||||||
|
|
||||||
nodep = dom_object_get_node(obj);
|
nodep = dom_object_get_node(obj);
|
||||||
|
|
||||||
ALLOC_ZVAL(*retval);
|
ALLOC_ZVAL(*retval);
|
||||||
|
|
||||||
content = xmlNodeGetContent(nodep);
|
content = xmlNodeGetContent(nodep);
|
||||||
length = xmlUTF8Strlen(content);
|
|
||||||
|
|
||||||
|
if (content) {
|
||||||
|
length = xmlUTF8Strlen(content);
|
||||||
xmlFree(content);
|
xmlFree(content);
|
||||||
|
}
|
||||||
|
|
||||||
ZVAL_LONG(*retval, length);
|
ZVAL_LONG(*retval, length);
|
||||||
|
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
|
@ -107,14 +125,13 @@ int dom_characterdata_length_read(dom_object *obj, zval **retval TSRMLS_DC)
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* {{{ proto domstring dom_characterdata_substring_data(unsigned long offset, unsigned long count);
|
/* {{{ proto domstring dom_characterdata_substring_data(unsigned long offset, unsigned long count);
|
||||||
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6531BCCF
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#core-ID-6531BCCF
|
||||||
Since:
|
Since:
|
||||||
*/
|
*/
|
||||||
PHP_FUNCTION(dom_characterdata_substring_data)
|
PHP_FUNCTION(dom_characterdata_substring_data)
|
||||||
{
|
{
|
||||||
|
zval *id;
|
||||||
xmlChar *cur;
|
xmlChar *cur;
|
||||||
xmlChar *substring;
|
xmlChar *substring;
|
||||||
xmlNodePtr node;
|
xmlNodePtr node;
|
||||||
|
@ -122,12 +139,12 @@ PHP_FUNCTION(dom_characterdata_substring_data)
|
||||||
int length;
|
int length;
|
||||||
dom_object *intern;
|
dom_object *intern;
|
||||||
|
|
||||||
DOM_GET_THIS_OBJ(node, getThis(), xmlNodePtr, intern);
|
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll", &id, dom_characterdata_class_entry, &offset, &count) == FAILURE) {
|
||||||
|
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &offset, &count) == FAILURE) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DOM_GET_OBJ(node, id, xmlNodePtr, intern);
|
||||||
|
|
||||||
cur = xmlNodeGetContent(node);
|
cur = xmlNodeGetContent(node);
|
||||||
if (cur == NULL) {
|
if (cur == NULL) {
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
|
@ -170,13 +187,12 @@ PHP_FUNCTION(dom_characterdata_append_data)
|
||||||
char *arg;
|
char *arg;
|
||||||
int arg_len;
|
int arg_len;
|
||||||
|
|
||||||
|
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &id, dom_characterdata_class_entry, &arg, &arg_len) == FAILURE) {
|
||||||
DOM_GET_THIS_OBJ(nodep, id, xmlNodePtr, intern);
|
|
||||||
|
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DOM_GET_OBJ(nodep, id, xmlNodePtr, intern);
|
||||||
|
|
||||||
xmlTextConcat(nodep, arg, arg_len);
|
xmlTextConcat(nodep, arg, arg_len);
|
||||||
|
|
||||||
RETURN_TRUE;
|
RETURN_TRUE;
|
||||||
|
@ -190,6 +206,7 @@ Since:
|
||||||
*/
|
*/
|
||||||
PHP_FUNCTION(dom_characterdata_insert_data)
|
PHP_FUNCTION(dom_characterdata_insert_data)
|
||||||
{
|
{
|
||||||
|
zval *id;
|
||||||
xmlChar *cur, *first, *second;
|
xmlChar *cur, *first, *second;
|
||||||
xmlNodePtr node;
|
xmlNodePtr node;
|
||||||
char *arg;
|
char *arg;
|
||||||
|
@ -197,12 +214,12 @@ PHP_FUNCTION(dom_characterdata_insert_data)
|
||||||
int length, arg_len;
|
int length, arg_len;
|
||||||
dom_object *intern;
|
dom_object *intern;
|
||||||
|
|
||||||
DOM_GET_THIS_OBJ(node, getThis(), xmlNodePtr, intern);
|
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ols", &id, dom_characterdata_class_entry, &offset, &arg, &arg_len) == FAILURE) {
|
||||||
|
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ls", &offset, &arg, &arg_len) == FAILURE) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DOM_GET_OBJ(node, id, xmlNodePtr, intern);
|
||||||
|
|
||||||
cur = xmlNodeGetContent(node);
|
cur = xmlNodeGetContent(node);
|
||||||
if (cur == NULL) {
|
if (cur == NULL) {
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
|
@ -238,18 +255,19 @@ Since:
|
||||||
*/
|
*/
|
||||||
PHP_FUNCTION(dom_characterdata_delete_data)
|
PHP_FUNCTION(dom_characterdata_delete_data)
|
||||||
{
|
{
|
||||||
|
zval *id;
|
||||||
xmlChar *cur, *substring, *second;
|
xmlChar *cur, *substring, *second;
|
||||||
xmlNodePtr node;
|
xmlNodePtr node;
|
||||||
long offset, count;
|
long offset, count;
|
||||||
int length;
|
int length;
|
||||||
dom_object *intern;
|
dom_object *intern;
|
||||||
|
|
||||||
DOM_GET_THIS_OBJ(node, getThis(), xmlNodePtr, intern);
|
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll", &id, dom_characterdata_class_entry, &offset, &count) == FAILURE) {
|
||||||
|
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ll", &offset, &count) == FAILURE) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DOM_GET_OBJ(node, id, xmlNodePtr, intern);
|
||||||
|
|
||||||
cur = xmlNodeGetContent(node);
|
cur = xmlNodeGetContent(node);
|
||||||
if (cur == NULL) {
|
if (cur == NULL) {
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
|
@ -293,6 +311,7 @@ Since:
|
||||||
*/
|
*/
|
||||||
PHP_FUNCTION(dom_characterdata_replace_data)
|
PHP_FUNCTION(dom_characterdata_replace_data)
|
||||||
{
|
{
|
||||||
|
zval *id;
|
||||||
xmlChar *cur, *substring, *second = NULL;
|
xmlChar *cur, *substring, *second = NULL;
|
||||||
xmlNodePtr node;
|
xmlNodePtr node;
|
||||||
char *arg;
|
char *arg;
|
||||||
|
@ -300,12 +319,12 @@ PHP_FUNCTION(dom_characterdata_replace_data)
|
||||||
int length, arg_len;
|
int length, arg_len;
|
||||||
dom_object *intern;
|
dom_object *intern;
|
||||||
|
|
||||||
DOM_GET_THIS_OBJ(node, getThis(), xmlNodePtr, intern);
|
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Olls", &id, dom_characterdata_class_entry, &offset, &count, &arg, &arg_len) == FAILURE) {
|
||||||
|
|
||||||
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "lls", &offset, &count, &arg, &arg_len) == FAILURE) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DOM_GET_OBJ(node, id, xmlNodePtr, intern);
|
||||||
|
|
||||||
cur = xmlNodeGetContent(node);
|
cur = xmlNodeGetContent(node);
|
||||||
if (cur == NULL) {
|
if (cur == NULL) {
|
||||||
RETURN_FALSE;
|
RETURN_FALSE;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue