Refactor simpleXML (compilable, but incompleted)

This commit is contained in:
Xinchen Hui 2014-04-14 19:27:22 +08:00
parent b178992cd1
commit a975c7e0fe
5 changed files with 219 additions and 261 deletions

View file

@ -75,10 +75,10 @@ typedef struct _php_libxml_node_ptr {
} php_libxml_node_ptr;
typedef struct _php_libxml_node_object {
zend_object std;
php_libxml_node_ptr *node;
php_libxml_ref_obj *document;
HashTable *properties;
zend_object std;
} php_libxml_node_object;
typedef void * (*php_libxml_export_node) (zval *object TSRMLS_DC);

View file

@ -55,7 +55,6 @@ typedef enum {
} SXE_ITER;
typedef struct {
zend_object zo;
php_libxml_node_ptr *node;
php_libxml_ref_obj *document;
HashTable *properties;
@ -65,10 +64,11 @@ typedef struct {
xmlChar *nsprefix;
int isprefix;
SXE_ITER type;
zval *data;
zval data;
} iter;
zval *tmp;
zval tmp;
zend_function *fptr_count;
zend_object zo;
} php_sxe_object;
#ifdef ZTS

View file

@ -39,16 +39,15 @@
} \
}
PHP_SXE_API zend_object_value sxe_object_new(zend_class_entry *ce TSRMLS_DC);
/* {{{ php_sxe_fetch_object()
*/
static inline php_sxe_object *
php_sxe_fetch_object(zval *object TSRMLS_DC)
{
return (php_sxe_object *) zend_object_store_get_object(object TSRMLS_CC);
PHP_SXE_API zend_object *sxe_object_new(zend_class_entry *ce TSRMLS_DC);
static inline php_sxe_object *php_sxe_fetch_object(zend_object *obj) /* {{{ */ {
return (php_sxe_object *)((char*)(obj) - XtOffsetOf(php_sxe_object, zo));
}
/* }}} */
#define Z_SXEOBJ_P(zv) php_sxe_fetch_object(Z_OBJ_P((zv)))
typedef struct {
zend_object_iterator intern;
php_sxe_object *sxe;

File diff suppressed because it is too large Load diff

View file

@ -46,7 +46,7 @@ PHP_METHOD(ce_SimpleXMLIterator, rewind)
return;
}
iter.sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
iter.sxe = Z_SXEOBJ_P(getThis());
ce_SimpleXMLElement->iterator_funcs.funcs->rewind((zend_object_iterator*)&iter TSRMLS_CC);
}
/* }}} */
@ -55,13 +55,13 @@ PHP_METHOD(ce_SimpleXMLIterator, rewind)
Check whether iteration is valid */
PHP_METHOD(ce_SimpleXMLIterator, valid)
{
php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
php_sxe_object *sxe = Z_SXEOBJ_P(getThis());
if (zend_parse_parameters_none() == FAILURE) {
return;
}
RETURN_BOOL(sxe->iter.data);
RETURN_BOOL(!ZVAL_IS_UNDEF(&sxe->iter.data));
}
/* }}} */
@ -69,17 +69,17 @@ PHP_METHOD(ce_SimpleXMLIterator, valid)
Get current element */
PHP_METHOD(ce_SimpleXMLIterator, current)
{
php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
php_sxe_object *sxe = Z_SXEOBJ_P(getThis());
if (zend_parse_parameters_none() == FAILURE) {
return;
}
if (!sxe->iter.data) {
if (ZVAL_IS_UNDEF(&sxe->iter.data)) {
return; /* return NULL */
}
RETURN_ZVAL(sxe->iter.data, 1, 0);
RETURN_ZVAL(&sxe->iter.data, 1, 0);
}
/* }}} */
@ -89,20 +89,20 @@ PHP_METHOD(ce_SimpleXMLIterator, key)
{
xmlNodePtr curnode;
php_sxe_object *intern;
php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
php_sxe_object *sxe = Z_SXEOBJ_P(getThis());
if (zend_parse_parameters_none() == FAILURE) {
return;
}
if (!sxe->iter.data) {
if (ZVAL_IS_UNDEF(&sxe->iter.data)) {
RETURN_FALSE;
}
intern = (php_sxe_object *)zend_object_store_get_object(sxe->iter.data TSRMLS_CC);
intern = Z_SXEOBJ_P(&sxe->iter.data);
if (intern != NULL && intern->node != NULL) {
curnode = (xmlNodePtr)((php_libxml_node_ptr *)intern->node)->node;
RETURN_STRINGL((char*)curnode->name, xmlStrlen(curnode->name), 1);
RETURN_STRINGL((char*)curnode->name, xmlStrlen(curnode->name));
}
RETURN_FALSE;
@ -119,7 +119,7 @@ PHP_METHOD(ce_SimpleXMLIterator, next)
return;
}
iter.sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
iter.sxe = Z_SXEOBJ_P(getThis());
ce_SimpleXMLElement->iterator_funcs.funcs->move_forward((zend_object_iterator*)&iter TSRMLS_CC);
}
/* }}} */
@ -128,7 +128,7 @@ PHP_METHOD(ce_SimpleXMLIterator, next)
Check whether element has children (elements) */
PHP_METHOD(ce_SimpleXMLIterator, hasChildren)
{
php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
php_sxe_object *sxe = Z_SXEOBJ_P(getThis());
php_sxe_object *child;
xmlNodePtr node;
@ -136,10 +136,10 @@ PHP_METHOD(ce_SimpleXMLIterator, hasChildren)
return;
}
if (!sxe->iter.data || sxe->iter.type == SXE_ITER_ATTRLIST) {
if (ZVAL_IS_UNDEF(&sxe->iter.data) || sxe->iter.type == SXE_ITER_ATTRLIST) {
RETURN_FALSE;
}
child = php_sxe_fetch_object(sxe->iter.data TSRMLS_CC);
child = Z_SXEOBJ_P(&sxe->iter.data);
GET_NODE(child, node);
if (node) {
@ -156,16 +156,16 @@ PHP_METHOD(ce_SimpleXMLIterator, hasChildren)
Get child element iterator */
PHP_METHOD(ce_SimpleXMLIterator, getChildren)
{
php_sxe_object *sxe = php_sxe_fetch_object(getThis() TSRMLS_CC);
php_sxe_object *sxe = Z_SXEOBJ_P(getThis());
if (zend_parse_parameters_none() == FAILURE) {
return;
}
if (!sxe->iter.data || sxe->iter.type == SXE_ITER_ATTRLIST) {
if (ZVAL_IS_UNDEF(&sxe->iter.data) || sxe->iter.type == SXE_ITER_ATTRLIST) {
return; /* return NULL */
}
RETURN_ZVAL(sxe->iter.data, 1, 0);
RETURN_ZVAL(&sxe->iter.data, 1, 0);
}
/* {{{ arginfo */
@ -187,18 +187,18 @@ static const zend_function_entry funcs_SimpleXMLIterator[] = {
PHP_MINIT_FUNCTION(sxe) /* {{{ */
{
zend_class_entry **pce;
zend_class_entry *pce;
zend_class_entry sxi;
if (zend_hash_find(CG(class_table), "simplexmlelement", sizeof("SimpleXMLElement"), (void **) &pce) == FAILURE) {
if ((pce = zend_hash_str_find_ptr(CG(class_table), "simplexmlelement", sizeof("SimpleXMLElement") - 1)) == NULL) {
ce_SimpleXMLElement = NULL;
ce_SimpleXMLIterator = NULL;
return SUCCESS; /* SimpleXML must be initialized before */
}
ce_SimpleXMLElement = *pce;
ce_SimpleXMLElement = pce;
INIT_CLASS_ENTRY_EX(sxi, "SimpleXMLIterator", strlen("SimpleXMLIterator"), funcs_SimpleXMLIterator);
INIT_CLASS_ENTRY_EX(sxi, "SimpleXMLIterator", sizeof("SimpleXMLIterator") - 1, funcs_SimpleXMLIterator);
ce_SimpleXMLIterator = zend_register_internal_class_ex(&sxi, ce_SimpleXMLElement TSRMLS_CC);
ce_SimpleXMLIterator->create_object = ce_SimpleXMLElement->create_object;