Annotation of embedaddon/php/ext/standard/assert.c, revision 1.1

1.1     ! misho       1: /*
        !             2:    +----------------------------------------------------------------------+
        !             3:    | PHP Version 5                                                        |
        !             4:    +----------------------------------------------------------------------+
        !             5:    | Copyright (c) 1997-2012 The PHP Group                                |
        !             6:    +----------------------------------------------------------------------+
        !             7:    | This source file is subject to version 3.01 of the PHP license,      |
        !             8:    | that is bundled with this package in the file LICENSE, and is        |
        !             9:    | available through the world-wide-web at the following url:           |
        !            10:    | http://www.php.net/license/3_01.txt                                  |
        !            11:    | If you did not receive a copy of the PHP license and are unable to   |
        !            12:    | obtain it through the world-wide-web, please send a note to          |
        !            13:    | license@php.net so we can mail you a copy immediately.               |
        !            14:    +----------------------------------------------------------------------+
        !            15:    | Author: Thies C. Arntzen <thies@thieso.net>                          |
        !            16:    +----------------------------------------------------------------------+
        !            17: */
        !            18: 
        !            19: /* $Id: assert.c 321634 2012-01-01 13:15:04Z felipe $ */
        !            20: 
        !            21: /* {{{ includes */
        !            22: #include "php.h"
        !            23: #include "php_assert.h"
        !            24: #include "php_ini.h"
        !            25: /* }}} */
        !            26: 
        !            27: ZEND_BEGIN_MODULE_GLOBALS(assert)
        !            28:        long active;
        !            29:        long bail;
        !            30:        long warning;
        !            31:        long quiet_eval;
        !            32:        zval *callback;
        !            33:        char *cb;
        !            34: ZEND_END_MODULE_GLOBALS(assert)
        !            35: 
        !            36: ZEND_DECLARE_MODULE_GLOBALS(assert)
        !            37: 
        !            38: #ifdef ZTS
        !            39: #define ASSERTG(v) TSRMG(assert_globals_id, zend_assert_globals *, v)
        !            40: #else
        !            41: #define ASSERTG(v) (assert_globals.v)
        !            42: #endif
        !            43: 
        !            44: #define SAFE_STRING(s) ((s)?(s):"")
        !            45: 
        !            46: enum {
        !            47:        ASSERT_ACTIVE=1,
        !            48:        ASSERT_CALLBACK,
        !            49:        ASSERT_BAIL,
        !            50:        ASSERT_WARNING,
        !            51:        ASSERT_QUIET_EVAL
        !            52: };
        !            53: 
        !            54: static PHP_INI_MH(OnChangeCallback) /* {{{ */
        !            55: {
        !            56:        if (EG(in_execution)) {
        !            57:                if (ASSERTG(callback)) {
        !            58:                        zval_ptr_dtor(&ASSERTG(callback));
        !            59:                        ASSERTG(callback) = NULL;
        !            60:                }
        !            61:                if (new_value && (ASSERTG(callback) || new_value_length)) {
        !            62:                        MAKE_STD_ZVAL(ASSERTG(callback));
        !            63:                        ZVAL_STRINGL(ASSERTG(callback), new_value, new_value_length, 1);
        !            64:                }
        !            65:        } else {
        !            66:                if (ASSERTG(cb)) {
        !            67:                        pefree(ASSERTG(cb), 1);
        !            68:                }
        !            69:                if (new_value && new_value_length) {
        !            70:                        ASSERTG(cb) = pemalloc(new_value_length + 1, 1);
        !            71:                        memcpy(ASSERTG(cb), new_value, new_value_length);
        !            72:                        ASSERTG(cb)[new_value_length] = '\0';
        !            73:                } else {
        !            74:                        ASSERTG(cb) = NULL;
        !            75:                }
        !            76:        }
        !            77:        return SUCCESS;
        !            78: }
        !            79: /* }}} */
        !            80: 
        !            81: PHP_INI_BEGIN()
        !            82:         STD_PHP_INI_ENTRY("assert.active",             "1",    PHP_INI_ALL,    OnUpdateLong,           active,                         zend_assert_globals,            assert_globals)
        !            83:         STD_PHP_INI_ENTRY("assert.bail",               "0",    PHP_INI_ALL,    OnUpdateLong,           bail,                           zend_assert_globals,            assert_globals)
        !            84:         STD_PHP_INI_ENTRY("assert.warning",    "1",    PHP_INI_ALL,    OnUpdateLong,           warning,                        zend_assert_globals,            assert_globals)
        !            85:         PHP_INI_ENTRY("assert.callback",               NULL,   PHP_INI_ALL,    OnChangeCallback)
        !            86:         STD_PHP_INI_ENTRY("assert.quiet_eval", "0",    PHP_INI_ALL,    OnUpdateLong,           quiet_eval,                     zend_assert_globals,            assert_globals)
        !            87: PHP_INI_END()
        !            88: 
        !            89: static void php_assert_init_globals(zend_assert_globals *assert_globals_p TSRMLS_DC) /* {{{ */
        !            90: {
        !            91:        assert_globals_p->callback = NULL;
        !            92:        assert_globals_p->cb = NULL;
        !            93: }
        !            94: /* }}} */
        !            95: 
        !            96: PHP_MINIT_FUNCTION(assert) /* {{{ */
        !            97: {
        !            98:        ZEND_INIT_MODULE_GLOBALS(assert, php_assert_init_globals, NULL);
        !            99: 
        !           100:        REGISTER_INI_ENTRIES();
        !           101: 
        !           102:        REGISTER_LONG_CONSTANT("ASSERT_ACTIVE", ASSERT_ACTIVE, CONST_CS|CONST_PERSISTENT);
        !           103:        REGISTER_LONG_CONSTANT("ASSERT_CALLBACK", ASSERT_CALLBACK, CONST_CS|CONST_PERSISTENT);
        !           104:        REGISTER_LONG_CONSTANT("ASSERT_BAIL", ASSERT_BAIL, CONST_CS|CONST_PERSISTENT);
        !           105:        REGISTER_LONG_CONSTANT("ASSERT_WARNING", ASSERT_WARNING, CONST_CS|CONST_PERSISTENT);
        !           106:        REGISTER_LONG_CONSTANT("ASSERT_QUIET_EVAL", ASSERT_QUIET_EVAL, CONST_CS|CONST_PERSISTENT);
        !           107: 
        !           108:        return SUCCESS;
        !           109: }
        !           110: /* }}} */
        !           111: 
        !           112: PHP_MSHUTDOWN_FUNCTION(assert) /* {{{ */
        !           113: {
        !           114:        if (ASSERTG(cb)) {
        !           115:                pefree(ASSERTG(cb), 1);
        !           116:                ASSERTG(cb) = NULL;
        !           117:        }
        !           118:        return SUCCESS;
        !           119: }
        !           120: /* }}} */
        !           121: 
        !           122: PHP_RSHUTDOWN_FUNCTION(assert) /* {{{ */
        !           123: {
        !           124:        if (ASSERTG(callback)) {
        !           125:                zval_ptr_dtor(&ASSERTG(callback));
        !           126:                ASSERTG(callback) = NULL;
        !           127:        }
        !           128: 
        !           129:        return SUCCESS;
        !           130: }
        !           131: /* }}} */
        !           132: 
        !           133: PHP_MINFO_FUNCTION(assert) /* {{{ */
        !           134: {
        !           135:        DISPLAY_INI_ENTRIES();
        !           136: }
        !           137: /* }}} */
        !           138: 
        !           139: /* {{{ proto int assert(string|bool assertion)
        !           140:    Checks if assertion is false */
        !           141: PHP_FUNCTION(assert)
        !           142: {
        !           143:        zval **assertion;
        !           144:        int val;
        !           145:        char *myeval = NULL;
        !           146:        char *compiled_string_description;
        !           147: 
        !           148:        if (! ASSERTG(active)) {
        !           149:                RETURN_TRUE;
        !           150:        }
        !           151: 
        !           152:        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &assertion) == FAILURE) {
        !           153:                return;
        !           154:        }
        !           155: 
        !           156:        if (Z_TYPE_PP(assertion) == IS_STRING) {
        !           157:                zval retval;
        !           158:                int old_error_reporting = 0; /* shut up gcc! */
        !           159: 
        !           160:                myeval = Z_STRVAL_PP(assertion);
        !           161: 
        !           162:                if (ASSERTG(quiet_eval)) {
        !           163:                        old_error_reporting = EG(error_reporting);
        !           164:                        EG(error_reporting) = 0;
        !           165:                }
        !           166: 
        !           167:                compiled_string_description = zend_make_compiled_string_description("assert code" TSRMLS_CC);
        !           168:                if (zend_eval_stringl(myeval, Z_STRLEN_PP(assertion), &retval, compiled_string_description TSRMLS_CC) == FAILURE) {
        !           169:                        efree(compiled_string_description);
        !           170:                        php_error_docref(NULL TSRMLS_CC, E_RECOVERABLE_ERROR, "Failure evaluating code: %s%s", PHP_EOL, myeval);
        !           171:                        if (ASSERTG(bail)) {
        !           172:                                zend_bailout();
        !           173:                        }
        !           174:                        RETURN_FALSE;
        !           175:                }
        !           176:                efree(compiled_string_description);
        !           177: 
        !           178:                if (ASSERTG(quiet_eval)) {
        !           179:                        EG(error_reporting) = old_error_reporting;
        !           180:                }
        !           181: 
        !           182:                convert_to_boolean(&retval);
        !           183:                val = Z_LVAL(retval);
        !           184:        } else {
        !           185:                convert_to_boolean_ex(assertion);
        !           186:                val = Z_LVAL_PP(assertion);
        !           187:        }
        !           188: 
        !           189:        if (val) {
        !           190:                RETURN_TRUE;
        !           191:        }
        !           192: 
        !           193:        if (!ASSERTG(callback) && ASSERTG(cb)) {
        !           194:                MAKE_STD_ZVAL(ASSERTG(callback));
        !           195:                ZVAL_STRING(ASSERTG(callback), ASSERTG(cb), 1);
        !           196:        }
        !           197: 
        !           198:        if (ASSERTG(callback)) {
        !           199:                zval *args[3];
        !           200:                zval *retval;
        !           201:                int i;
        !           202:                uint lineno = zend_get_executed_lineno(TSRMLS_C);
        !           203:                char *filename = zend_get_executed_filename(TSRMLS_C);
        !           204: 
        !           205:                MAKE_STD_ZVAL(args[0]);
        !           206:                MAKE_STD_ZVAL(args[1]);
        !           207:                MAKE_STD_ZVAL(args[2]);
        !           208: 
        !           209:                ZVAL_STRING(args[0], SAFE_STRING(filename), 1);
        !           210:                ZVAL_LONG (args[1], lineno);
        !           211:                ZVAL_STRING(args[2], SAFE_STRING(myeval), 1);
        !           212: 
        !           213:                MAKE_STD_ZVAL(retval);
        !           214:                ZVAL_FALSE(retval);
        !           215: 
        !           216:                /* XXX do we want to check for error here? */
        !           217:                call_user_function(CG(function_table), NULL, ASSERTG(callback), retval, 3, args TSRMLS_CC);
        !           218: 
        !           219:                for (i = 0; i <= 2; i++) {
        !           220:                        zval_ptr_dtor(&(args[i]));
        !           221:                }
        !           222:                zval_ptr_dtor(&retval);
        !           223:        }
        !           224: 
        !           225:        if (ASSERTG(warning)) {
        !           226:                if (myeval) {
        !           227:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion \"%s\" failed", myeval);
        !           228:                } else {
        !           229:                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Assertion failed");
        !           230:                }
        !           231:        }
        !           232: 
        !           233:        if (ASSERTG(bail)) {
        !           234:                zend_bailout();
        !           235:        }
        !           236: }
        !           237: /* }}} */
        !           238: 
        !           239: /* {{{ proto mixed assert_options(int what [, mixed value])
        !           240:    Set/get the various assert flags */
        !           241: PHP_FUNCTION(assert_options)
        !           242: {
        !           243:        zval **value = NULL;
        !           244:        long what;
        !           245:        int oldint;
        !           246:        int ac = ZEND_NUM_ARGS();
        !           247: 
        !           248:        if (zend_parse_parameters(ac TSRMLS_CC, "l|Z", &what, &value) == FAILURE) {
        !           249:                return;
        !           250:        }
        !           251: 
        !           252:        switch (what) {
        !           253:        case ASSERT_ACTIVE:
        !           254:                oldint = ASSERTG(active);
        !           255:                if (ac == 2) {
        !           256:                        convert_to_string_ex(value);
        !           257:                        zend_alter_ini_entry_ex("assert.active", sizeof("assert.active"), Z_STRVAL_PP(value), Z_STRLEN_PP(value), PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0 TSRMLS_CC);
        !           258:                }
        !           259:                RETURN_LONG(oldint);
        !           260:                break;
        !           261: 
        !           262:        case ASSERT_BAIL:
        !           263:                oldint = ASSERTG(bail);
        !           264:                if (ac == 2) {
        !           265:                        convert_to_string_ex(value);
        !           266:                        zend_alter_ini_entry_ex("assert.bail", sizeof("assert.bail"), Z_STRVAL_PP(value), Z_STRLEN_PP(value), PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0 TSRMLS_CC);
        !           267:                }
        !           268:                RETURN_LONG(oldint);
        !           269:                break;
        !           270: 
        !           271:        case ASSERT_QUIET_EVAL:
        !           272:                oldint = ASSERTG(quiet_eval);
        !           273:                if (ac == 2) {
        !           274:                        convert_to_string_ex(value);
        !           275:                        zend_alter_ini_entry_ex("assert.quiet_eval", sizeof("assert.quiet_eval"), Z_STRVAL_PP(value), Z_STRLEN_PP(value), PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0 TSRMLS_CC);
        !           276:                }
        !           277:                RETURN_LONG(oldint);
        !           278:                break;
        !           279: 
        !           280:        case ASSERT_WARNING:
        !           281:                oldint = ASSERTG(warning);
        !           282:                if (ac == 2) {
        !           283:                        convert_to_string_ex(value);
        !           284:                        zend_alter_ini_entry_ex("assert.warning", sizeof("assert.warning"), Z_STRVAL_PP(value), Z_STRLEN_PP(value), PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0 TSRMLS_CC);
        !           285:                }
        !           286:                RETURN_LONG(oldint);
        !           287:                break;
        !           288: 
        !           289:        case ASSERT_CALLBACK:
        !           290:                if (ASSERTG(callback) != NULL) {
        !           291:                        RETVAL_ZVAL(ASSERTG(callback), 1, 0);
        !           292:                } else if (ASSERTG(cb)) {
        !           293:                        RETVAL_STRING(ASSERTG(cb), 1);
        !           294:                } else {
        !           295:                        RETVAL_NULL();
        !           296:                }
        !           297:                if (ac == 2) {
        !           298:                        if (ASSERTG(callback)) {
        !           299:                                zval_ptr_dtor(&ASSERTG(callback));
        !           300:                        }
        !           301:                        ASSERTG(callback) = *value;
        !           302:                        zval_add_ref(value);
        !           303:                }
        !           304:                return;
        !           305:                break;
        !           306: 
        !           307:        default:
        !           308:                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown value %ld", what);
        !           309:                break;
        !           310:        }
        !           311: 
        !           312:        RETURN_FALSE;
        !           313: }
        !           314: /* }}} */
        !           315: 
        !           316: /*
        !           317:  * Local variables:
        !           318:  * tab-width: 4
        !           319:  * c-basic-offset: 4
        !           320:  * End:
        !           321:  * vim600: sw=4 ts=4 fdm=marker
        !           322:  * vim<600: sw=4 ts=4
        !           323:  */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>