summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2015-04-02 02:05:25 +0300
committerDmitry Stogov <dmitry@zend.com>2015-04-02 02:05:25 +0300
commitea09a9fa325fe21ebc81c41a63ab8c2f377d7f75 (patch)
tree333736f85df668e9cba95ee567a59d3e889260c3 /Zend/zend_API.c
parent956fa034e3b9de643153fd83fd63d36547bfa821 (diff)
downloadphp-git-ea09a9fa325fe21ebc81c41a63ab8c2f377d7f75.tar.gz
Convert fatal errors into EngineExceptions
Make zval_update_constant_ex(), zval_update_constant(), zend_update_class_constants() and zend_ast_evaluate() return SUCCESS or FAILURE.
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r--Zend/zend_API.c40
1 files changed, 28 insertions, 12 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 80af57d76a..6744ea0a76 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -1119,7 +1119,7 @@ static int zval_update_class_constant(zval *pp, int is_static, uint32_t offset)
int ret;
zend_class_entry *old_scope = *scope;
*scope = prop_info->ce;
- ret = zval_update_constant(pp, 1);
+ ret = zval_update_constant_ex(pp, 1, NULL);
*scope = old_scope;
return ret;
}
@@ -1128,13 +1128,13 @@ static int zval_update_class_constant(zval *pp, int is_static, uint32_t offset)
} while (ce);
}
- return zval_update_constant(pp, 1);
+ return zval_update_constant_ex(pp, 1, NULL);
}
- return 0;
+ return SUCCESS;
}
/* }}} */
-ZEND_API void zend_update_class_constants(zend_class_entry *class_type) /* {{{ */
+ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */
{
int i;
@@ -1143,7 +1143,9 @@ ZEND_API void zend_update_class_constants(zend_class_entry *class_type) /* {{{ *
zval *p;
if (class_type->parent) {
- zend_update_class_constants(class_type->parent);
+ if (UNEXPECTED(zend_update_class_constants(class_type->parent) != SUCCESS)) {
+ return FAILURE;
+ }
}
#if ZTS
CG(static_members_table)[(zend_intptr_t)(class_type->static_members_table)] = emalloc(sizeof(zval) * class_type->default_static_members_count);
@@ -1177,22 +1179,29 @@ ZEND_API void zend_update_class_constants(zend_class_entry *class_type) /* {{{ *
*scope = class_type;
ZEND_HASH_FOREACH_VAL(&class_type->constants_table, val) {
- zval_update_constant(val, 1);
+ if (UNEXPECTED(zval_update_constant_ex(val, 1, class_type) != SUCCESS)) {
+ return FAILURE;
+ }
} ZEND_HASH_FOREACH_END();
for (i = 0; i < class_type->default_properties_count; i++) {
if (Z_TYPE(class_type->default_properties_table[i]) != IS_UNDEF) {
- zval_update_class_constant(&class_type->default_properties_table[i], 0, OBJ_PROP_TO_OFFSET(i));
+ if (UNEXPECTED(zval_update_class_constant(&class_type->default_properties_table[i], 0, OBJ_PROP_TO_OFFSET(i)) != SUCCESS)) {
+ return FAILURE;
+ }
}
}
for (i = 0; i < class_type->default_static_members_count; i++) {
- zval_update_class_constant(&CE_STATIC_MEMBERS(class_type)[i], 1, i);
+ if (UNEXPECTED(zval_update_class_constant(&CE_STATIC_MEMBERS(class_type)[i], 1, i) != SUCCESS)) {
+ return FAILURE;
+ }
}
*scope = old_scope;
class_type->ce_flags |= ZEND_ACC_CONSTANTS_UPDATED;
}
+ return SUCCESS;
}
/* }}} */
@@ -1273,15 +1282,22 @@ ZEND_API int _object_and_properties_init(zval *arg, zend_class_entry *class_type
{
if (class_type->ce_flags & (ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) {
if (class_type->ce_flags & ZEND_ACC_INTERFACE) {
- zend_error_noreturn(E_ERROR, "Cannot instantiate interface %s", class_type->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot instantiate interface %s", class_type->name->val);
} else if (class_type->ce_flags & ZEND_ACC_TRAIT) {
- zend_error_noreturn(E_ERROR, "Cannot instantiate trait %s", class_type->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot instantiate trait %s", class_type->name->val);
} else {
- zend_error_noreturn(E_ERROR, "Cannot instantiate abstract class %s", class_type->name->val);
+ zend_error(E_EXCEPTION | E_ERROR, "Cannot instantiate abstract class %s", class_type->name->val);
}
+ ZVAL_NULL(arg);
+ Z_OBJ_P(arg) = NULL;
+ return FAILURE;
}
- zend_update_class_constants(class_type);
+ if (UNEXPECTED(zend_update_class_constants(class_type) != SUCCESS)) {
+ ZVAL_NULL(arg);
+ Z_OBJ_P(arg) = NULL;
+ return FAILURE;
+ }
if (class_type->create_object == NULL) {
ZVAL_OBJ(arg, zend_objects_new(class_type));