Commit 0cd95ddaceb for php
commit 0cd95ddacebc802fc96883e414132eec1e5bb53f
Author: Gina Peter Banyard <girgias@php.net>
Date: Wed Sep 30 20:04:57 2026 +0100
streams: refactor _php_userstream_data struct to hold zend_object* instead of zval (#24027)
This reduces the struct size from 24 to 16 bytes.
Using a zend_object* directly also ensures no other zval type could possibly be used.
diff --git a/main/streams/userspace.c b/main/streams/userspace.c
index 9b6f283c075..b6177ade8b4 100644
--- a/main/streams/userspace.c
+++ b/main/streams/userspace.c
@@ -86,7 +86,7 @@ PHP_MINIT_FUNCTION(user_streams)
struct _php_userstream_data {
struct php_user_stream_wrapper * wrapper;
- zval object;
+ zend_object *object;
};
typedef struct _php_userstream_data php_userstream_data_t;
@@ -247,33 +247,34 @@ typedef struct _php_userstream_data php_userstream_data_t;
}}} **/
-static void user_stream_create_object(struct php_user_stream_wrapper *uwrap, php_stream_context *context, zval *object)
+static zend_object* user_stream_create_object(struct php_user_stream_wrapper *uwrap, php_stream_context *context)
{
ZEND_ASSERT((uwrap->ce->ce_flags & ZEND_ACC_UNINSTANTIABLE) == 0);
+ zval object;
/* create an instance of our class */
- if (object_init_ex(object, uwrap->ce) == FAILURE) {
- ZVAL_UNDEF(object);
- return;
+ if (object_init_ex(&object, uwrap->ce) == FAILURE) {
+ return NULL;
}
if (context) {
GC_ADDREF(context->res);
- add_property_resource(object, "context", context->res);
+ add_property_resource(&object, "context", context->res);
} else {
- add_property_null(object, "context");
+ add_property_null(&object, "context");
}
if (EG(exception) != NULL) {
- zval_ptr_dtor(object);
- ZVAL_UNDEF(object);
- return;
+ zval_ptr_dtor(&object);
+ return NULL;
}
if (uwrap->ce->constructor) {
zend_call_known_instance_method_with_0_params(
- uwrap->ce->constructor, Z_OBJ_P(object), NULL);
+ uwrap->ce->constructor, Z_OBJ(object), NULL);
}
+
+ return Z_OBJ(object);
}
static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *filename, const char *mode,
@@ -310,8 +311,8 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *
/* zend_call_method_if_exists() may unregister the stream wrapper. Hold on to it. */
GC_ADDREF(us->wrapper->resource);
- user_stream_create_object(uwrap, context, &us->object);
- if (Z_ISUNDEF(us->object)) {
+ us->object = user_stream_create_object(uwrap, context);
+ if (!us->object) {
goto end;
}
@@ -322,7 +323,7 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *
ZVAL_NEW_REF(&args[3], &EG(uninitialized_zval));
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_OPEN, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &zretval, 4, args);
+ zend_result call_result = zend_call_method_if_exists(us->object, func_name, &zretval, 4, args);
zend_string_release_ex(func_name, false);
/* Keep arg3 alive if it has assigned the reference */
@@ -351,7 +352,7 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *
// TODO Warn when assigning a non string value to the reference?
/* set wrapper data to be a reference to our object */
- ZVAL_COPY(&stream->wrapperdata, &us->object);
+ ZVAL_OBJ_COPY(&stream->wrapperdata, us->object);
} else {
php_stream_wrapper_log_warn(wrapper, context, options,
UserspaceCallFailed,
@@ -365,7 +366,9 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *
FG(user_stream_current_filename) = NULL;
PG(in_user_include) = old_in_user_include;
if (stream == NULL) {
- zval_ptr_dtor(&us->object);
+ if (us->object) {
+ OBJ_RELEASE(us->object);
+ }
zend_list_delete(us->wrapper->resource);
efree(us);
}
@@ -402,8 +405,8 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char
/* zend_call_method_if_exists() may unregister the stream wrapper. Hold on to it. */
GC_ADDREF(us->wrapper->resource);
- user_stream_create_object(uwrap, context, &us->object);
- if (Z_TYPE(us->object) == IS_UNDEF) {
+ us->object = user_stream_create_object(uwrap, context);
+ if (!us->object) {
goto end;
}
@@ -412,7 +415,7 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char
ZVAL_LONG(&args[1], options);
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_DIR_OPEN, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &zretval, 2, args);
+ zend_result call_result = zend_call_method_if_exists(us->object, func_name, &zretval, 2, args);
zend_string_release_ex(func_name, false);
zval_ptr_dtor(&args[0]);
@@ -432,7 +435,7 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char
stream = php_stream_alloc_rel(&php_stream_userspace_dir_ops, us, 0, mode);
/* set wrapper data to be a reference to our object */
- ZVAL_COPY(&stream->wrapperdata, &us->object);
+ ZVAL_OBJ_COPY(&stream->wrapperdata, us->object);
} else {
php_stream_wrapper_log_warn(wrapper, context, options,
UserspaceCallFailed,
@@ -443,7 +446,9 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char
end:
FG(user_stream_current_filename) = NULL;
if (stream == NULL) {
- zval_ptr_dtor(&us->object);
+ if (us->object) {
+ OBJ_RELEASE(us->object);
+ }
zend_list_delete(us->wrapper->resource);
efree(us);
}
@@ -585,7 +590,7 @@ static ssize_t php_userstreamop_write(php_stream *stream, const char *buf, size_
stream->flags |= PHP_STREAM_FLAG_NO_FCLOSE;
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_WRITE, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 1, args);
+ zend_result call_result = zend_call_method_if_exists(us->object, func_name, &retval, 1, args);
zend_string_release_ex(func_name, false);
zval_ptr_dtor(&args[0]);
@@ -636,7 +641,7 @@ static ssize_t php_userstreamop_read(php_stream *stream, char *buf, size_t count
ZVAL_LONG(&args[0], count);
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_READ, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 1, args);
+ zend_result call_result = zend_call_method_if_exists(us->object, func_name, &retval, 1, args);
zend_string_release_ex(func_name, false);
if (UNEXPECTED(Z_ISUNDEF(retval))) {
@@ -678,7 +683,7 @@ static ssize_t php_userstreamop_read(php_stream *stream, char *buf, size_t count
/* since the user stream has no way of setting the eof flag directly, we need to ask it if we hit eof */
func_name = ZSTR_INIT_LITERAL(USERSTREAM_EOF, false);
- call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 0, NULL);
+ call_result = zend_call_method_if_exists(us->object, func_name, &retval, 0, NULL);
zend_string_release_ex(func_name, false);
if (UNEXPECTED(call_result == FAILURE)) {
@@ -717,13 +722,13 @@ static int php_userstreamop_close(php_stream *stream, int close_handle)
assert(us != NULL);
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_CLOSE, false);
- zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 0, NULL);
+ zend_call_method_if_exists(us->object, func_name, &retval, 0, NULL);
zend_string_release_ex(func_name, false);
zval_ptr_dtor(&retval);
- zval_ptr_dtor(&us->object);
- ZVAL_UNDEF(&us->object);
+ ZEND_ASSERT(us->object != NULL);
+ OBJ_RELEASE(us->object);
efree(us);
@@ -738,7 +743,7 @@ static int php_userstreamop_flush(php_stream *stream)
assert(us != NULL);
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_FLUSH, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 0, NULL);
+ zend_result call_result = zend_call_method_if_exists(us->object, func_name, &retval, 0, NULL);
zend_string_release_ex(func_name, false);
int ret = call_result == SUCCESS && Z_TYPE(retval) != IS_UNDEF && zend_is_true(&retval) ? 0 : -1;
@@ -764,7 +769,7 @@ static int php_userstreamop_seek(php_stream *stream, zend_off_t offset, int when
stream->flags |= PHP_STREAM_FLAG_NO_FCLOSE;
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_SEEK, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 2, args);
+ zend_result call_result = zend_call_method_if_exists(us->object, func_name, &retval, 2, args);
zend_string_release_ex(func_name, false);
if (call_result == FAILURE) {
@@ -791,7 +796,7 @@ static int php_userstreamop_seek(php_stream *stream, zend_off_t offset, int when
/* now determine where we are */
func_name = ZSTR_INIT_LITERAL(USERSTREAM_TELL, false);
- call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 0, NULL);
+ call_result = zend_call_method_if_exists(us->object, func_name, &retval, 0, NULL);
zend_string_release_ex(func_name, false);
if (call_result == SUCCESS && Z_TYPE(retval) == IS_LONG) {
@@ -859,7 +864,7 @@ static int php_userstreamop_stat(php_stream *stream, php_stream_statbuf *ssb)
int ret = -1;
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_STAT, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 0, NULL);
+ zend_result call_result = zend_call_method_if_exists(us->object, func_name, &retval, 0, NULL);
zend_string_release_ex(func_name, false);
if (UNEXPECTED(call_result == FAILURE)) {
@@ -887,7 +892,7 @@ static int user_stream_set_check_liveliness(php_stream *stream, const php_userst
zval retval;
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_EOF, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 0, NULL);
+ zend_result call_result = zend_call_method_if_exists(us->object, func_name, &retval, 0, NULL);
zend_string_release_ex(func_name, false);
if (UNEXPECTED(call_result == FAILURE)) {
@@ -937,7 +942,7 @@ static int user_stream_set_locking(php_stream *stream, const php_userstream_data
/* TODO wouldblock */
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_LOCK, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 1, &zlock);
+ zend_result call_result = zend_call_method_if_exists(us->object, func_name, &retval, 1, &zlock);
zend_string_release_ex(func_name, false);
if (UNEXPECTED(call_result == FAILURE)) {
@@ -972,7 +977,7 @@ static int user_stream_set_truncation(php_stream *stream, const php_userstream_d
if (value == PHP_STREAM_TRUNCATE_SUPPORTED) {
zval zstr;
ZVAL_STR(&zstr, func_name);
- bool is_callable = zend_is_callable_ex(&zstr, Z_OBJ(us->object), IS_CALLABLE_SUPPRESS_DEPRECATIONS, NULL, NULL, NULL);
+ bool is_callable = zend_is_callable_ex(&zstr, us->object, IS_CALLABLE_SUPPRESS_DEPRECATIONS, NULL, NULL, NULL);
// Frees func_name
zval_ptr_dtor(&zstr);
return is_callable ? PHP_STREAM_OPTION_RETURN_OK : PHP_STREAM_OPTION_RETURN_ERR;
@@ -990,7 +995,7 @@ static int user_stream_set_truncation(php_stream *stream, const php_userstream_d
zval size;
ZVAL_LONG(&size, (zend_long)new_size);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 1, &size);
+ zend_result call_result = zend_call_method_if_exists(us->object, func_name, &retval, 1, &size);
zend_string_release_ex(func_name, false);
if (UNEXPECTED(call_result == FAILURE)) {
@@ -1034,7 +1039,7 @@ static int user_stream_set_option(php_stream *stream, const php_userstream_data_
zval retval;
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_SET_OPTION, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 3, args);
+ zend_result call_result = zend_call_method_if_exists(us->object, func_name, &retval, 3, args);
zend_string_release_ex(func_name, false);
if (UNEXPECTED(call_result == FAILURE)) {
@@ -1088,12 +1093,11 @@ static int user_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int
struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract;
zval zretval;
zval args[1];
- zval object;
int ret = 0;
/* create an instance of our class */
- user_stream_create_object(uwrap, context, &object);
- if (Z_TYPE(object) == IS_UNDEF) {
+ zend_object *object = user_stream_create_object(uwrap, context);
+ if (object == NULL) {
return ret;
}
@@ -1102,10 +1106,10 @@ static int user_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_UNLINK, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(object), func_name, &zretval, 1, args);
+ zend_result call_result = zend_call_method_if_exists(object, func_name, &zretval, 1, args);
zend_string_release_ex(func_name, false);
zval_ptr_dtor(&args[0]);
- zval_ptr_dtor(&object);
+ OBJ_RELEASE(object);
if (UNEXPECTED(call_result == FAILURE)) {
php_stream_wrapper_warn(wrapper, context, REPORT_ERRORS, NotImplemented,
@@ -1126,12 +1130,11 @@ static int user_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract;
zval zretval;
zval args[2];
- zval object;
int ret = 0;
/* create an instance of our class */
- user_stream_create_object(uwrap, context, &object);
- if (Z_TYPE(object) == IS_UNDEF) {
+ zend_object *object = user_stream_create_object(uwrap, context);
+ if (object == NULL) {
return ret;
}
@@ -1140,11 +1143,11 @@ static int user_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
ZVAL_STRING(&args[1], url_to);
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_RENAME, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(object), func_name, &zretval, 2, args);
+ zend_result call_result = zend_call_method_if_exists(object, func_name, &zretval, 2, args);
zend_string_release_ex(func_name, false);
zval_ptr_dtor(&args[1]);
zval_ptr_dtor(&args[0]);
- zval_ptr_dtor(&object);
+ OBJ_RELEASE(object);
if (UNEXPECTED(call_result == FAILURE)) {
php_stream_wrapper_warn(wrapper, context, REPORT_ERRORS, NotImplemented,
@@ -1165,12 +1168,11 @@ static int user_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url, int
struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract;
zval zretval;
zval args[3];
- zval object;
int ret = 0;
/* create an instance of our class */
- user_stream_create_object(uwrap, context, &object);
- if (Z_TYPE(object) == IS_UNDEF) {
+ zend_object *object = user_stream_create_object(uwrap, context);
+ if (object == NULL) {
return ret;
}
@@ -1180,10 +1182,10 @@ static int user_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url, int
ZVAL_LONG(&args[2], options);
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_MKDIR, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(object), func_name, &zretval, 3, args);
+ zend_result call_result = zend_call_method_if_exists(object, func_name, &zretval, 3, args);
zend_string_release_ex(func_name, false);
zval_ptr_dtor(&args[0]);
- zval_ptr_dtor(&object);
+ OBJ_RELEASE(object);
if (UNEXPECTED(call_result == FAILURE)) {
php_stream_wrapper_warn(wrapper, context, REPORT_ERRORS, NotImplemented,
@@ -1204,12 +1206,11 @@ static int user_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url,
struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract;
zval zretval;
zval args[2];
- zval object;
int ret = 0;
/* create an instance of our class */
- user_stream_create_object(uwrap, context, &object);
- if (Z_TYPE(object) == IS_UNDEF) {
+ zend_object *object = user_stream_create_object(uwrap, context);
+ if (object == NULL) {
return ret;
}
@@ -1218,10 +1219,10 @@ static int user_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url,
ZVAL_LONG(&args[1], options);
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_RMDIR, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(object), func_name, &zretval, 2, args);
+ zend_result call_result = zend_call_method_if_exists(object, func_name, &zretval, 2, args);
zend_string_release_ex(func_name, false);
zval_ptr_dtor(&args[0]);
- zval_ptr_dtor(&object);
+ OBJ_RELEASE(object);
if (UNEXPECTED(call_result == FAILURE)) {
php_stream_wrapper_warn(wrapper, context, REPORT_ERRORS, NotImplemented,
@@ -1242,7 +1243,6 @@ static int user_wrapper_metadata(php_stream_wrapper *wrapper, const char *url, i
struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract;
zval zretval;
zval args[3];
- zval object;
int ret = 0;
switch(option) {
@@ -1271,8 +1271,8 @@ static int user_wrapper_metadata(php_stream_wrapper *wrapper, const char *url, i
}
/* create an instance of our class */
- user_stream_create_object(uwrap, context, &object);
- if (Z_TYPE(object) == IS_UNDEF) {
+ zend_object *object = user_stream_create_object(uwrap, context);
+ if (object == NULL) {
zval_ptr_dtor(&args[2]);
return ret;
}
@@ -1282,11 +1282,11 @@ static int user_wrapper_metadata(php_stream_wrapper *wrapper, const char *url, i
ZVAL_LONG(&args[1], option);
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_METADATA, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(object), func_name, &zretval, 3, args);
+ zend_result call_result = zend_call_method_if_exists(object, func_name, &zretval, 3, args);
zend_string_release_ex(func_name, false);
zval_ptr_dtor(&args[2]);
zval_ptr_dtor(&args[0]);
- zval_ptr_dtor(&object);
+ OBJ_RELEASE(object);
if (UNEXPECTED(call_result == FAILURE)) {
php_stream_wrapper_warn(wrapper, context, REPORT_ERRORS, NotImplemented,
@@ -1308,12 +1308,11 @@ static int user_wrapper_stat_url(php_stream_wrapper *wrapper, const char *url, i
struct php_user_stream_wrapper *uwrap = (struct php_user_stream_wrapper*)wrapper->abstract;
zval zretval;
zval args[2];
- zval object;
int ret = -1;
/* create an instance of our class */
- user_stream_create_object(uwrap, context, &object);
- if (Z_TYPE(object) == IS_UNDEF) {
+ zend_object *object = user_stream_create_object(uwrap, context);
+ if (object == NULL) {
return -1;
}
@@ -1322,10 +1321,10 @@ static int user_wrapper_stat_url(php_stream_wrapper *wrapper, const char *url, i
ZVAL_LONG(&args[1], flags);
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_STATURL, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(object), func_name, &zretval, 2, args);
+ zend_result call_result = zend_call_method_if_exists(object, func_name, &zretval, 2, args);
zend_string_release_ex(func_name, false);
zval_ptr_dtor(&args[0]);
- zval_ptr_dtor(&object);
+ OBJ_RELEASE(object);
if (UNEXPECTED(call_result == FAILURE)) {
php_stream_wrapper_warn(wrapper, context, REPORT_ERRORS, NotImplemented,
@@ -1360,7 +1359,7 @@ static ssize_t php_userstreamop_readdir(php_stream *stream, char *buf, size_t co
}
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_DIR_READ, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 0, NULL);
+ zend_result call_result = zend_call_method_if_exists(us->object, func_name, &retval, 0, NULL);
zend_string_release_ex(func_name, false);
if (UNEXPECTED(call_result == FAILURE)) {
@@ -1397,12 +1396,12 @@ static int php_userstreamop_closedir(php_stream *stream, int close_handle)
assert(us != NULL);
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_DIR_CLOSE, false);
- zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 0, NULL);
+ zend_call_method_if_exists(us->object, func_name, &retval, 0, NULL);
zend_string_release_ex(func_name, false);
zval_ptr_dtor(&retval);
- zval_ptr_dtor(&us->object);
- ZVAL_UNDEF(&us->object);
+ ZEND_ASSERT(us->object != NULL);
+ OBJ_RELEASE(us->object);
efree(us);
return 0;
@@ -1414,7 +1413,7 @@ static int php_userstreamop_rewinddir(php_stream *stream, zend_off_t offset, int
php_userstream_data_t *us = (php_userstream_data_t *)stream->abstract;
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_DIR_REWIND, false);
- zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 0, NULL);
+ zend_call_method_if_exists(us->object, func_name, &retval, 0, NULL);
zend_string_release_ex(func_name, false);
zval_ptr_dtor(&retval);
@@ -1446,7 +1445,7 @@ static int php_userstreamop_cast(php_stream *stream, int castas, void **retptr)
stream->flags |= PHP_STREAM_FLAG_NO_FCLOSE;
zend_string *func_name = ZSTR_INIT_LITERAL(USERSTREAM_CAST, false);
- zend_result call_result = zend_call_method_if_exists(Z_OBJ(us->object), func_name, &retval, 1, args);
+ zend_result call_result = zend_call_method_if_exists(us->object, func_name, &retval, 1, args);
zend_string_release_ex(func_name, false);
if (UNEXPECTED(call_result == FAILURE)) {