Hi Matt,

I updated your patch a little bit to make it more clear (from my point
of view).
Please take a look.

Thanks. Dmitry.

Matt Wilmas wrote:
> Hi Dmitry,
> 
> Well, it's been awhile since Alpha 1 :-), so I wanted to finally resend this
> before Alpha 2!  I agree that the additional optimization probably wouldn't
> happen often, as there won't be that much namespace usage right away, I
> assume.  But I think it makes sense to handle :: prefix constants, since
> they're known to have global scope, and I can see the future [online]
> optimization tip: "When using namespaces, use :: for global constants to get
> compile-time substitution." ;-)
> 
> The code is the same as before, just updated the patch.  It doesn't really
> seem less clear, to me, than the current code.  In zend_do_fetch_constant(),
> the "check_namespace" variable may be better named something like
> "from_namespace" according to my changes, to be more clear, but I left that
> out to make the patch as simple as possible.
> 
> http://realplain.com/php/ct_const_fixes.diff
> http://realplain.com/php/ct_const_fixes_5_3.diff
> 
> 
> Thanks,
> Matt
> 
> 
> ----- Original Message -----
> From: "Dmitry Stogov"
> Sent: Thursday, July 31, 2008
> 
>> Hi Matt,
>>
>> Now I know. :)
>> Anyway, I don't think this optimization will work often.
>>
>> Send me the patch after Alpha1 release.
>>
>> Thanks. Dmitry.
>>
>>
>> Matt Wilmas wrote:
>>> Hi Dmitry,
>>>
>>> Do you know that with your changes, no substitution will happen in a
>>> namespace even when using :: prefix? :-/  (That's what I would do when I
>>> know it's global, for optimization.)  Or is that what you meant by "not
> so
>>> optimal?"
>>>
>>>
>>> - Matt
>>>
>>>
>>> ----- Original Message -----
>>> From: "Dmitry Stogov"
>>> Sent: Thursday, July 31, 2008
>>>
>>>> Thanks Matt. I committed near the same patch.
>>>> It's not so optimal, but little bit more clear.
>>>>
>>>> Thanks. Dmitry.
>>>>
>>>> Matt Wilmas wrote:
>>>>> Hi Dmitry,
>>>>>
>>>>> For the behavior change that I mentioned in the other thread, with
> this
>>>>> code:
>>>>>
>>>>> function foo() {
>>>>>     static $a = -PHP_INT_MAX;
>>>>> }
>>>>>
>>>>> Which could work sometimes, and sometimes not (if in a namespace or
>>>>> ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION is set).  I changed things so
> that
>>>>> there is no substitution of constants (except with CT_SUBST flag, like
>>>>> always) for compile time constants (ZEND_CT mode).  They don't create
> a
>>>>> FETCH_CONSTANT opcode anyway. :-)
>>>>>
>>>>> Another thing I realized wasn't getting optimized (runtime constants),
>>> which
>>>>> can be, is with:
>>>>>
>>>>> namespace foo;
>>>>> $a = ::PHP_INT_MAX;  // :: for global scope
>>>>>
>>>>> So the patch allows substitution there as well.
>>>>>
>>>>> http://realplain.com/php/ct_const_fixes.diff
>>>>> http://realplain.com/php/ct_const_fixes_5_3.diff
> 
Index: Zend/zend_compile.c
===================================================================
RCS file: /repository/ZendEngine2/zend_compile.c,v
retrieving revision 1.647.2.27.2.41.2.84
diff -u -p -d -r1.647.2.27.2.41.2.84 zend_compile.c
--- Zend/zend_compile.c 24 Aug 2008 18:22:33 -0000      1.647.2.27.2.41.2.84
+++ Zend/zend_compile.c 29 Aug 2008 09:09:48 -0000
@@ -1392,7 +1392,7 @@ void zend_do_begin_lambda_function_decla
        zend_do_begin_function_declaration(function_token, &function_name, 0, 
return_reference, NULL TSRMLS_CC);
 
        result->op_type = IS_TMP_VAR;
-       result->u.var = get_temporary_variable(current_op_array);;
+       result->u.var = get_temporary_variable(current_op_array);
 
        current_op = &current_op_array->opcodes[current_op_number];
        current_op->opcode = ZEND_DECLARE_LAMBDA_FUNCTION;
@@ -3767,7 +3767,7 @@ void zend_do_end_new_object(znode *resul
        *result = CG(active_op_array)->opcodes[new_token->u.opline_num].result;
 }
 
-static zend_constant* zend_get_ct_const(const zval *const_name, int mode 
TSRMLS_DC) /* {{{ */
+static zend_constant* zend_get_ct_const(const zval *const_name, int 
all_internal_constants_substitution TSRMLS_DC) /* {{{ */
 {
        zend_constant *c = NULL;
 
@@ -3786,9 +3786,8 @@ static zend_constant* zend_get_ct_const(
        if (c->flags & CONST_CT_SUBST) {
                return c;
        }
-       if (mode == ZEND_RT &&
+       if (all_internal_constants_substitution &&
            (c->flags & CONST_PERSISTENT) &&
-           !CG(current_namespace) &&
            !(CG(compiler_options) & ZEND_COMPILE_NO_CONSTANT_SUBSTITUTION) &&
            Z_TYPE(c->value) != IS_CONSTANT &&
            Z_TYPE(c->value) != IS_CONSTANT_ARRAY) {
@@ -3798,9 +3797,9 @@ static zend_constant* zend_get_ct_const(
 }
 /* }}} */
 
-static int zend_constant_ct_subst(znode *result, zval *const_name, int mode 
TSRMLS_DC) /* {{{ */
+static int zend_constant_ct_subst(znode *result, zval *const_name, int 
all_internal_constants_substitution TSRMLS_DC) /* {{{ */
 {
-       zend_constant *c = zend_get_ct_const(const_name, mode TSRMLS_CC);
+       zend_constant *c = zend_get_ct_const(const_name, 
all_internal_constants_substitution TSRMLS_CC);
 
        if (c) {
                zval_dtor(const_name);
@@ -3827,7 +3826,7 @@ void zend_do_fetch_constant(znode *resul
                zval_dtor(&constant_container->u.constant);
                check_namespace = 1;
                constant_container = NULL;
-               fetch_type = ZEND_FETCH_CLASS_RT_NS_CHECK | 
IS_CONSTANT_RT_NS_CHECK;;
+               fetch_type = ZEND_FETCH_CLASS_RT_NS_CHECK | 
IS_CONSTANT_RT_NS_CHECK;
        }
 
        switch (mode) {
@@ -3843,7 +3842,7 @@ void zend_do_fetch_constant(znode *resul
                                zend_do_build_full_name(NULL, 
constant_container, constant_name TSRMLS_CC);
                                *result = *constant_container;
                                result->u.constant.type = IS_CONSTANT | 
fetch_type;
-                       } else if (fetch_type || 
!zend_constant_ct_subst(result, &constant_name->u.constant, ZEND_CT TSRMLS_CC)) 
{
+                       } else if (fetch_type || 
!zend_constant_ct_subst(result, &constant_name->u.constant, 0 TSRMLS_CC)) {
                                if (check_namespace && CG(current_namespace)) {
                                        /* We assume we use constant from the 
current namespace
                                           if it is not prefixed. */
@@ -3860,7 +3859,7 @@ void zend_do_fetch_constant(znode *resul
                        break;
                case ZEND_RT:
                        if (constant_container ||
-                           !zend_constant_ct_subst(result, 
&constant_name->u.constant, ZEND_RT TSRMLS_CC)) {
+                           !zend_constant_ct_subst(result, 
&constant_name->u.constant, (!CG(current_namespace) || !check_namespace) 
TSRMLS_CC)) {
                                zend_op *opline;
 
                                if (constant_container) {
@@ -5166,7 +5165,7 @@ void zend_do_declare_constant(znode *nam
                zend_error(E_COMPILE_ERROR, "Arrays are not allowed as 
constants");
        }
 
-       if (zend_get_ct_const(&name->u.constant, ZEND_CT TSRMLS_CC)) {
+       if (zend_get_ct_const(&name->u.constant, 0 TSRMLS_CC)) {
                zend_error(E_COMPILE_ERROR, "Cannot redeclare constant '%s'", 
Z_STRVAL(name->u.constant));
        }
 

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to