static int spl_array_has_dimension_ex(int check_inherited, zval *object, zval *offset, int check_empty TSRMLS_DC) /* {{{ */
{
- spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
+ spl_array_object *intern = Z_SPLARRAY_P(object);
long index;
- zval *rv, *value = NULL, **tmp;
+ zval rv, *value = NULL, *tmp;
if (check_inherited && intern->fptr_offset_has) {
- zval *offset_tmp = offset;
- SEPARATE_ARG_IF_REF(offset_tmp);
- zend_call_method_with_1_params(&object, Z_OBJCE_P(object), &intern->fptr_offset_has, "offsetExists", &rv, offset_tmp);
- zval_ptr_dtor(&offset_tmp);
+//??? zval offset_tmp;
+//??? ZVAL_COPY_VALUE(&offset_tmp, offset);
+//??? SEPARATE_ARG_IF_REF(&offset_tmp);
+//??? zend_call_method_with_1_params(object, Z_OBJCE_P(object), &intern->fptr_offset_has, "offsetExists", &rv, &offset_tmp);
+//??? zval_ptr_dtor(&offset_tmp);
+ SEPARATE_ARG_IF_REF(offset);
+ zend_call_method_with_1_params(object, Z_OBJCE_P(object), &intern->fptr_offset_has, "offsetExists", &rv, offset);
+ zval_ptr_dtor(offset);
- if (rv && zend_is_true(rv TSRMLS_CC)) {
+ if (!Z_ISUNDEF(rv) && zend_is_true(&rv TSRMLS_CC)) {
zval_ptr_dtor(&rv);
- if (check_empty == 2) {
+ if (check_empty != 1) {
return 1;
} else if (intern->fptr_offset_get) {
- value = spl_array_read_dimension_ex(1, object, offset, BP_VAR_R TSRMLS_CC);
+ value = spl_array_read_dimension_ex(1, object, offset, BP_VAR_R, &rv TSRMLS_CC);
}
} else {
- if (rv) {
- zval_ptr_dtor(&rv);
- }
+ zval_ptr_dtor(&rv);
return 0;
}
}
return 0;
}
break;
+
case IS_DOUBLE:
+ index = (long)Z_DVAL_P(offset);
+ goto num_index;
case IS_RESOURCE:
- case IS_BOOL:
+ index = Z_RES_HANDLE_P(offset);
+ goto num_index;
+ case IS_FALSE:
+ index = 0;
+ goto num_index;
+ case IS_TRUE:
+ index = 1;
+ goto num_index;
case IS_LONG:
- if (offset->type == IS_DOUBLE) {
- index = (long)Z_DVAL_P(offset);
- } else {
- index = Z_LVAL_P(offset);
- }
- if (zend_hash_index_find(ht, index, (void **)&tmp) != FAILURE) {
+ index = Z_LVAL_P(offset);
+num_index:
+ if ((tmp = zend_hash_index_find(ht, index)) != NULL) {
if (check_empty == 2) {
return 1;
}
return 0;
}
- if (check_inherited && intern->fptr_offset_get) {
+ if (check_empty && check_inherited && intern->fptr_offset_get) {
- value = spl_array_read_dimension_ex(1, object, offset, BP_VAR_R TSRMLS_CC);
+ value = spl_array_read_dimension_ex(1, object, offset, BP_VAR_R, &rv TSRMLS_CC);
} else {
- value = *tmp;
+ value = tmp;
}
}