]> granicus.if.org Git - php/commitdiff
Eliminated run-time constant fetching for TRUE, FALSE and NULL
authorDmitry Stogov <dmitry@php.net>
Wed, 15 Mar 2006 09:04:36 +0000 (09:04 +0000)
committerDmitry Stogov <dmitry@php.net>
Wed, 15 Mar 2006 09:04:36 +0000 (09:04 +0000)
NEWS
Zend/zend_compile.c
Zend/zend_constants.c
Zend/zend_constants.h

diff --git a/NEWS b/NEWS
index f25ac55ad9fd14a834031ab4766e60deda936204..adebf83924b08b9fb91540b14180e7d41317967b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,7 @@
 PHP                                                                        NEWS
 |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 ?? Mar 2006, PHP 5.1.3RC2
+- Eliminated run-time constant fetching for TRUE, FALSE and NULL. (Dmitry)
 - Fixed offset/length parameter validation in substr_compare() function. (Ilia)
 - Added overflow checks to wordwrap() function. (Ilia)
 - Removed the E_STRICT deprecation notice from "var". (Ilia)
index f96fd44332e92ab3ec8c80f80034659ff1ce646a..a967fe2f1257de1a3286833071beaa5af17c7a3f 100644 (file)
@@ -3095,6 +3095,33 @@ void zend_do_end_new_object(znode *result, znode *new_token, znode *argument_lis
        *result = CG(active_op_array)->opcodes[new_token->u.opline_num].result;
 }
 
+static int zend_constant_ct_subst(znode *result, zval *const_name TSRMLS_DC)
+{
+       zend_constant *c = NULL;
+
+       if (zend_hash_find(EG(zend_constants), Z_STRVAL_P(const_name), Z_STRLEN_P(const_name)+1, (void **) &c) == FAILURE) {
+               char *lookup_name = zend_str_tolower_dup(Z_STRVAL_P(const_name), Z_STRLEN_P(const_name));
+                
+               if (zend_hash_find(EG(zend_constants), lookup_name, Z_STRLEN_P(const_name)+1, (void **) &c)==SUCCESS) {
+                       if ((c->flags & CONST_CS) && memcmp(c->name, Z_STRVAL_P(const_name), Z_STRLEN_P(const_name))!=0) {
+                               c = NULL;
+                       }
+               } else {
+                       c = NULL;
+               }
+               efree(lookup_name);
+       }
+       if (c && (c->flags & CONST_CT_SUBST)) {
+               zval_dtor(const_name);
+               result->op_type = IS_CONST;
+               result->u.constant = c->value;
+               zval_copy_ctor(&result->u.constant);
+               INIT_PZVAL(&result->u.constant);
+               return 1;
+       }
+       return 0;
+}
+
 void zend_do_fetch_constant(znode *result, znode *constant_container, znode *constant_name, int mode TSRMLS_DC)
 {
        switch (mode) {
@@ -3102,13 +3129,15 @@ void zend_do_fetch_constant(znode *result, znode *constant_container, znode *con
                        if (constant_container) {
                                zend_do_fetch_class_name(NULL, constant_container, constant_name TSRMLS_CC);
                                *result = *constant_container;
-                       } else {
+                               result->u.constant.type = IS_CONSTANT;
+                       } else if (!zend_constant_ct_subst(result, &constant_name->u.constant TSRMLS_CC)) {
                                *result = *constant_name;
+                               result->u.constant.type = IS_CONSTANT;
                        }
-                       result->u.constant.type = IS_CONSTANT;
                        break;
                case ZEND_RT:
-                       {
+                       if (constant_container ||
+                           !zend_constant_ct_subst(result, &constant_name->u.constant TSRMLS_CC)) {
                                zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);
        
                                opline->opcode = ZEND_FETCH_CONSTANT;
index 0f8e0a41bdadf46ce8edbe282de2600706570175..670a76199d01c4bffe83c6b74c052999464ce10f 100644 (file)
@@ -114,8 +114,7 @@ void zend_register_standard_constants(TSRMLS_D)
        {
                zend_constant c;
        
-               c.value.type = IS_BOOL;
-               c.flags = CONST_PERSISTENT;
+               c.flags = CONST_PERSISTENT | CONST_CT_SUBST;
                c.module_number = 0;
 
                c.name = zend_strndup(ZEND_STRL("TRUE"));
@@ -130,16 +129,18 @@ void zend_register_standard_constants(TSRMLS_D)
                c.value.type = IS_BOOL;
                zend_register_constant(&c TSRMLS_CC);
 
+               c.name = zend_strndup(ZEND_STRL("NULL"));
+               c.name_len = sizeof("NULL");
+               c.value.type = IS_NULL;
+               zend_register_constant(&c TSRMLS_CC);
+
+               c.flags = CONST_PERSISTENT;
+
                c.name = zend_strndup(ZEND_STRL("ZEND_THREAD_SAFE"));
                c.name_len = sizeof("ZEND_THREAD_SAFE");
                c.value.value.lval = ZTS_V;
                c.value.type = IS_BOOL;
                zend_register_constant(&c TSRMLS_CC);
-
-               c.name = zend_strndup(ZEND_STRL("NULL"));
-               c.name_len = sizeof("NULL");
-               c.value.type = IS_NULL;
-               zend_register_constant(&c TSRMLS_CC);
        }
 }
 
index 1bffa56cefd8de7e73e48e1ad45015b7b5f5592b..a0cc2b1bb584029f25240e76f40434d9b2c5c456 100644 (file)
@@ -26,6 +26,7 @@
 
 #define CONST_CS                               (1<<0)                          /* Case Sensitive */
 #define CONST_PERSISTENT               (1<<1)                          /* Persistent */
+#define CONST_CT_SUBST                 (2<<1)                          /* Allow compile-time substitution */
 
 #define        PHP_USER_CONSTANT INT_MAX       /* a constant defined in user space */