#define SPL_ARRAY_METHOD_MAY_USER_ARG 2
typedef struct _spl_array_object {
- zend_object std;
zval array;
zval retval;
HashPosition pos;
zend_function *fptr_offset_del;
zend_function *fptr_count;
zend_class_entry* ce_get_iterator;
- HashTable *debug_info;
- unsigned char nApplyCount;
+ HashTable *debug_info;
+ unsigned char nApplyCount;
+ zend_object std;
} spl_array_object;
+static inline spl_array_object *spl_array_from_obj(zend_object *obj) /* {{{ */ {
+ return (spl_array_object*)((char*)(obj) - XtOffsetOf(spl_array_object, std));
+}
+/* }}} */
+
+#define Z_SPLARRAY_P(zv) spl_array_from_obj(Z_OBJ_P((zv)))
+
static inline HashTable *spl_array_get_hash_table(spl_array_object* intern, int check_std_props TSRMLS_DC) { /* {{{ */
if ((intern->ar_flags & SPL_ARRAY_IS_SELF) != 0) {
if (!intern->std.properties) {
}
return intern->std.properties;
} else if ((intern->ar_flags & SPL_ARRAY_USE_OTHER) && (check_std_props == 0 || (intern->ar_flags & SPL_ARRAY_STD_PROP_LIST) == 0) && Z_TYPE(intern->array) == IS_OBJECT) {
- spl_array_object *other = (spl_array_object*)Z_OBJ_P(&intern->array);
+ spl_array_object *other = Z_SPLARRAY_P(&intern->array);
return spl_array_get_hash_table(other, check_std_props TSRMLS_CC);
} else if ((intern->ar_flags & ((check_std_props ? SPL_ARRAY_STD_PROP_LIST : 0) | SPL_ARRAY_IS_SELF)) != 0) {
if (!intern->std.properties) {
/* {{{ spl_array_object_free_storage */
static void spl_array_object_free_storage(zend_object *object TSRMLS_DC)
{
- spl_array_object *intern = (spl_array_object *)object;
+ spl_array_object *intern = spl_array_from_obj(object);
zend_object_std_dtor(&intern->std TSRMLS_CC);
- zval_dtor(&intern->array);
- zval_dtor(&intern->retval);
+ zval_ptr_dtor(&intern->array);
+ zval_ptr_dtor(&intern->retval);
if (intern->debug_info != NULL) {
zend_hash_destroy(intern->debug_info);
efree(intern->debug_info);
}
- efree(object);
+ efree(intern);
}
/* }}} */
static zend_object *spl_array_object_new_ex(zend_class_entry *class_type, zval *orig, int clone_orig TSRMLS_DC)
{
spl_array_object *intern;
- zend_class_entry * parent = class_type;
+ zend_class_entry *parent = class_type;
int inherited = 0;
- intern = emalloc(sizeof(spl_array_object));
- memset(intern, 0, sizeof(spl_array_object));
+ intern = ecalloc(1, sizeof(spl_array_object) + sizeof(zval) * (parent->default_properties_count - 1));
zend_object_std_init(&intern->std, class_type TSRMLS_CC);
object_properties_init(&intern->std, class_type);
intern->debug_info = NULL;
intern->ce_get_iterator = spl_ce_ArrayIterator;
if (orig) {
- spl_array_object *other = (spl_array_object*)Z_OBJ_P(orig);
+ spl_array_object *other = Z_SPLARRAY_P(orig);
intern->ar_flags &= ~ SPL_ARRAY_CLONE_MASK;
intern->ar_flags |= (other->ar_flags & SPL_ARRAY_CLONE_MASK);
static zval *spl_array_get_dimension_ptr(int check_inherited, zval *object, zval *offset, int type TSRMLS_DC) /* {{{ */
{
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
zval *retval;
long index;
- HashTable *ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
zend_string *offset_key;
+ spl_array_object *intern = Z_SPLARRAY_P(object);
+ HashTable *ht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
if (ZVAL_IS_UNDEF(offset)) {
return &EG(uninitialized_zval);
zend_error(E_NOTICE,"Undefined index: %s", offset_key->val);
case BP_VAR_W: {
zval value;
- ZVAL_UNDEF(&value);
+ ZVAL_NULL(&value);
retval = zend_symtable_update(ht, offset_key, &value);
}
}
zval *ret;
if (check_inherited) {
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
if (intern->fptr_offset_get) {
zval rv, tmp;
if (!offset) {
//!!! FIXME?
// ZVAL_COPY(result, ret);
- return ret;
/* When in a write context,
* ZE has to be fooled into thinking this is in a reference set
* by separating (if necessary) and returning as an is_ref=1 zval (even if refcount == 1)
+ */
- if ((type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) && !Z_ISREF_PP(ret)) {
-
- Z_SET_ISREF_P(ret);
+ if ((type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) && !Z_ISREF_P(ret)) {
+ ZVAL_NEW_REF(ret, ret);
}
- */
+
+ return ret;
} /* }}} */
static zval *spl_array_read_dimension(zval *object, zval *offset, int type, zval *rv TSRMLS_DC) /* {{{ */
static void spl_array_write_dimension_ex(int check_inherited, zval *object, zval *offset, zval *value TSRMLS_DC) /* {{{ */
{
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
long index;
HashTable *ht;
{
long index;
HashTable *ht;
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
if (check_inherited && intern->fptr_offset_del) {
SEPARATE_ARG_IF_REF(offset);
break;
} else if (Z_TYPE(obj->array) == IS_OBJECT) {
if ((obj->ar_flags & SPL_ARRAY_USE_OTHER) == 0) {
- obj = (spl_array_object*)Z_OBJ_P(&obj->array);
+ obj = Z_SPLARRAY_P(&obj->array);
break;
} else {
- obj = (spl_array_object*)Z_OBJ_P(&obj->array);
+ obj = Z_SPLARRAY_P(&obj->array);
}
} else {
obj = NULL;
{
long index;
zval rv, *tmp;
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
if (check_inherited && intern->fptr_offset_has) {
SEPARATE_ARG_IF_REF(offset);
void spl_array_iterator_append(zval *object, zval *append_value TSRMLS_DC) /* {{{ */
{
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
HashTable *aht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
if (!aht) {
SPL_METHOD(Array, getArrayCopy)
{
zval *object = getThis();
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
array_init(return_value);
zend_hash_copy(Z_ARRVAL_P(return_value), spl_array_get_hash_table(intern, 0 TSRMLS_CC), (copy_ctor_func_t) zval_add_ref);
static HashTable *spl_array_get_properties(zval *object TSRMLS_DC) /* {{{ */
{
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
HashTable *result;
if (intern->nApplyCount > 1) {
zval *storage;
zend_string *zname;
zend_class_entry *base;
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(obj);
+ spl_array_object *intern = Z_SPLARRAY_P(obj);
*is_temp = 0;
static zval *spl_array_read_property(zval *object, zval *member, int type, const zend_literal *key, zval *rv TSRMLS_DC) /* {{{ */
{
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
if ((intern->ar_flags & SPL_ARRAY_ARRAY_AS_PROPS) != 0
&& !std_object_handlers.has_property(object, member, 2, key TSRMLS_CC)) {
static void spl_array_write_property(zval *object, zval *member, zval *value, const zend_literal *key TSRMLS_DC) /* {{{ */
{
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
if ((intern->ar_flags & SPL_ARRAY_ARRAY_AS_PROPS) != 0
&& !std_object_handlers.has_property(object, member, 2, key TSRMLS_CC)) {
static zval *spl_array_get_property_ptr_ptr(zval *object, zval *member, int type, const zend_literal *key TSRMLS_DC) /* {{{ */
{
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
if ((intern->ar_flags & SPL_ARRAY_ARRAY_AS_PROPS) != 0
&& !std_object_handlers.has_property(object, member, 2, key TSRMLS_CC)) {
static int spl_array_has_property(zval *object, zval *member, int has_set_exists, const zend_literal *key TSRMLS_DC) /* {{{ */
{
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
if ((intern->ar_flags & SPL_ARRAY_ARRAY_AS_PROPS) != 0
&& !std_object_handlers.has_property(object, member, 2, key TSRMLS_CC)) {
static void spl_array_unset_property(zval *object, zval *member, const zend_literal *key TSRMLS_DC) /* {{{ */
{
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
if ((intern->ar_flags & SPL_ARRAY_ARRAY_AS_PROPS) != 0
&& !std_object_handlers.has_property(object, member, 2, key TSRMLS_CC)) {
int result = 0;
zval temp_zv;
- intern1 = (spl_array_object*)Z_OBJ_P(o1);
- intern2 = (spl_array_object*)Z_OBJ_P(o2);
+ intern1 = Z_SPLARRAY_P(o1);
+ intern2 = Z_SPLARRAY_P(o2);
ht1 = spl_array_get_hash_table(intern1, 0 TSRMLS_CC);
ht2 = spl_array_get_hash_table(intern2, 0 TSRMLS_CC);
static int spl_array_it_valid(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
{
- spl_array_object *object = (spl_array_object*)Z_OBJ(iter->data);
+ spl_array_object *object = Z_SPLARRAY_P(&iter->data);
HashTable *aht = spl_array_get_hash_table(object, 0 TSRMLS_CC);
if (object->ar_flags & SPL_ARRAY_OVERLOADED_VALID) {
static zval *spl_array_it_get_current_data(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
{
- spl_array_object *object = (spl_array_object*)Z_OBJ(iter->data);
- HashTable *aht = spl_array_get_hash_table(object, 0 TSRMLS_CC);
+ spl_array_object *object = Z_SPLARRAY_P(&iter->data);
+ HashTable *aht = spl_array_get_hash_table(object, 0 TSRMLS_CC);
if (object->ar_flags & SPL_ARRAY_OVERLOADED_CURRENT) {
return zend_user_it_get_current_data(iter TSRMLS_CC);
static void spl_array_it_get_current_key(zend_object_iterator *iter, zval *key TSRMLS_DC) /* {{{ */
{
- spl_array_object *object = (spl_array_object*)Z_OBJ(iter->data);
+ spl_array_object *object = Z_SPLARRAY_P(&iter->data);
HashTable *aht = spl_array_get_hash_table(object, 0 TSRMLS_CC);
if (object->ar_flags & SPL_ARRAY_OVERLOADED_KEY) {
static void spl_array_it_move_forward(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
{
- spl_array_object *object = (spl_array_object*)Z_OBJ(iter->data);
+ spl_array_object *object = Z_SPLARRAY_P(&iter->data);
HashTable *aht = spl_array_get_hash_table(object, 0 TSRMLS_CC);
if (object->ar_flags & SPL_ARRAY_OVERLOADED_NEXT) {
static void spl_array_it_rewind(zend_object_iterator *iter TSRMLS_DC) /* {{{ */
{
- spl_array_object *object = (spl_array_object*)Z_OBJ(iter->data);
+ spl_array_object *object = Z_SPLARRAY_P(&iter->data);
if (object->ar_flags & SPL_ARRAY_OVERLOADED_REWIND) {
zend_user_it_rewind(iter TSRMLS_CC);
if (Z_TYPE_P(array) == IS_OBJECT && (Z_OBJ_HT_P(array) == &spl_handler_ArrayObject || Z_OBJ_HT_P(array) == &spl_handler_ArrayIterator)) {
zval_ptr_dtor(&intern->array);
if (just_array) {
- spl_array_object *other = (spl_array_object*)Z_OBJ_P(array);
+ spl_array_object *other = Z_SPLARRAY_P(array);
ar_flags = other->ar_flags & ~SPL_ARRAY_INT_MASK;
}
ar_flags |= SPL_ARRAY_USE_OTHER;
zval_ptr_dtor(&intern->array);
intern->array = *array;
}
- if (object == array) {
+ if (Z_TYPE_P(array) == IS_OBJECT && Z_OBJ_P(object) == Z_OBJ_P(array)) {
intern->ar_flags |= SPL_ARRAY_IS_SELF;
intern->ar_flags &= ~SPL_ARRAY_USE_OTHER;
} else {
zend_object_iterator *spl_array_get_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC) /* {{{ */
{
zend_user_iterator *iterator;
- spl_array_object *array_object = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *array_object = Z_SPLARRAY_P(object);
if (by_ref && (array_object->ar_flags & SPL_ARRAY_OVERLOADED_CURRENT)) {
zend_error(E_ERROR, "An iterator cannot be used with foreach by reference");
zend_replace_error_handling(EH_THROW, spl_ce_InvalidArgumentException, &error_handling TSRMLS_CC);
- intern = (spl_array_object*)Z_OBJ_P(object);
+ intern = Z_SPLARRAY_P(object);
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|lC", &array, &ar_flags, &ce_get_iterator) == FAILURE) {
zend_restore_error_handling(&error_handling TSRMLS_CC);
SPL_METHOD(Array, setIteratorClass)
{
zval *object = getThis();
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
zend_class_entry * ce_get_iterator = spl_ce_Iterator;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "C", &ce_get_iterator) == FAILURE) {
SPL_METHOD(Array, getIteratorClass)
{
zval *object = getThis();
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
if (zend_parse_parameters_none() == FAILURE) {
return;
SPL_METHOD(Array, getFlags)
{
zval *object = getThis();
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
if (zend_parse_parameters_none() == FAILURE) {
return;
SPL_METHOD(Array, setFlags)
{
zval *object = getThis();
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
long ar_flags = 0;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &ar_flags) == FAILURE) {
SPL_METHOD(Array, exchangeArray)
{
zval *object = getThis(), *array;
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
array_init(return_value);
zend_hash_copy(HASH_OF(return_value), spl_array_get_hash_table(intern, 0 TSRMLS_CC), (copy_ctor_func_t)zval_add_ref);
-
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &array) == FAILURE) {
return;
}
SPL_METHOD(Array, getIterator)
{
zval *object = getThis();
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
HashTable *aht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
if (zend_parse_parameters_none() == FAILURE) {
SPL_METHOD(Array, rewind)
{
zval *object = getThis();
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
if (zend_parse_parameters_none() == FAILURE) {
return;
{
long opos, position;
zval *object = getThis();
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
HashTable *aht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
int result;
int spl_array_object_count_elements(zval *object, long *count TSRMLS_DC) /* {{{ */
{
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
if (intern->fptr_count) {
zval rv;
SPL_METHOD(Array, count)
{
long count;
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(getThis());
+ spl_array_object *intern = Z_SPLARRAY_P(getThis());
if (zend_parse_parameters_none() == FAILURE) {
return;
static void spl_array_method(INTERNAL_FUNCTION_PARAMETERS, char *fname, int fname_len, int use_arg) /* {{{ */
{
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(getThis());
+ spl_array_object *intern = Z_SPLARRAY_P(getThis());
HashTable *aht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
zval tmp, *arg = NULL;
zval retval;
SPL_METHOD(Array, current)
{
zval *object = getThis();
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
zval *entry;
HashTable *aht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
void spl_array_iterator_key(zval *object, zval *return_value TSRMLS_DC) /* {{{ */
{
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
HashTable *aht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
if (spl_array_object_verify_pos(intern, aht TSRMLS_CC) == FAILURE) {
SPL_METHOD(Array, next)
{
zval *object = getThis();
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
HashTable *aht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
if (zend_parse_parameters_none() == FAILURE) {
SPL_METHOD(Array, valid)
{
zval *object = getThis();
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
HashTable *aht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
if (zend_parse_parameters_none() == FAILURE) {
SPL_METHOD(Array, hasChildren)
{
zval *object = getThis(), *entry;
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
HashTable *aht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
if (zend_parse_parameters_none() == FAILURE) {
SPL_METHOD(Array, getChildren)
{
zval *object = getThis(), *entry, flags;
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
HashTable *aht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
if (zend_parse_parameters_none() == FAILURE) {
SPL_METHOD(Array, serialize)
{
zval *object = getThis();
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(object);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
HashTable *aht = spl_array_get_hash_table(intern, 0 TSRMLS_CC);
zval members, flags;
php_serialize_data_t var_hash;
php_var_serialize(&buf, &members, &var_hash TSRMLS_CC); /* finishes the string */
+ zval_ptr_dtor(&members);
+
/* done */
PHP_VAR_SERIALIZE_DESTROY(var_hash);
if (buf.s) {
- RETVAL_STR(buf.s);
+ RETURN_STR(buf.s);
}
- zval_ptr_dtor(&members);
-
RETURN_NULL();
} /* }}} */
*/
SPL_METHOD(Array, unserialize)
{
- spl_array_object *intern = (spl_array_object*)Z_OBJ_P(getThis());
+ spl_array_object *intern = Z_SPLARRAY_P(getThis());
char *buf;
int buf_len;