Changeset 36033d4 in git


Ignore:
Timestamp:
2014-09-08T09:33:09Z (3 years ago)
Author:
Xuefer <xuefer@…>
Branches:
3.2
Children:
1dfe7cc
Parents:
6fa5963
Message:

MFT: [1486-1491] [1496-1516], PHP 5.6 support

git-svn-id: svn://svn.lighttpd.net/xcache/branches/3.2@1515 c26eb9a1-5813-0410-bd6c-c2e55f420ca7

Files:
1 added
24 edited

Legend:

Unmodified
Added
Removed
  • ChangeLog

    rf67c798 r36033d4  
    33========
    44 * cacher:
     5   * PHP_5_6 support
    56   * fixed #333: reduce memory usage for small or empty files
    67
  • NEWS

    rf67c798 r36033d4  
    113.2.1 2013-??-??
    22========
     3 * PHP_5_6 support
    34 * reduce memory usage for small or empty files
    45
  • devel/prepare.cfg.example

    r02eb6be r36033d4  
    66PHP5_4_DIR=
    77PHP5_5_DIR=
     8PHP5_6_DIR=
    89PHP6_x_DIR=
    910
    10 PHP_DEVEL_DIR=
     11PHP_DEVEL_DIR=$(PHP5_6_DIR)
    1112
    1213# path to eaccelerator source dir
  • devel/prepare.mak

    refab40d r36033d4  
    2525    xcache/xc_const_string_opcodes_php5.4.h \
    2626    xcache/xc_const_string_opcodes_php5.5.h \
     27    xcache/xc_const_string_opcodes_php5.6.h \
    2728    xcache/xc_const_string_opcodes_php6.x.h
    2829
     
    99100endif
    100101
     102ifeq (${PHP5_6_DIR},)
     103xcache/xc_const_string_opcodes_php5.6.h: dummy
     104    @echo "Skipped $@: PHP_5_6_DIR not set"
     105else
     106xcache/xc_const_string_opcodes_php5.6.h: ${PHP5_6_DIR}/Zend/zend_vm_def.h
     107    $(AWK) -f ./devel/gen_const_string_opcodes.awk < "$<" > "$@.tmp"
     108    mv "$@.tmp" "$@"
     109endif
     110
    101111ifeq (${PHP6_x_DIR},)
    102112xcache/xc_const_string_opcodes_php6.x.h: dummy
  • devel/sample.cpp.php

    r6fa5963 r36033d4  
    4545    static public $static_const11 = array(self::CONST_VALUE => self::CONST_VALUE);
    4646    static public $static_const12 = array(ClassName::CONST_VALUE => ClassName::CONST_VALUE);
     47#if PHP_VERSION >= 560
     48    static public $ast_binop = ClassName::CONST_VALUE + ClassName::CONST_VALUE;
     49    static public $ast_and = ClassName::CONST_VALUE && 1;
     50    static public $ast_or = ClassName::CONST_VALUE || 2;
     51    static public $ast_select = ClassName::CONST_VALUE ? a : b;
     52    static public $ast_unaryPlus = +ClassName::CONST_VALUE;
     53    static public $ast_unaryMinus = -ClassName::CONST_VALUE;
     54#endif
    4755    /** doc */
    4856    static public $public_static = array(2, 'str');
  • lib/Decompiler.class.php

    r638209c r36033d4  
    8888}
    8989// }}}
     90function decompileAst($ast, $EX) // {{{
     91{
     92    $kind = $ast['kind'];
     93    $children = $ast['children'];
     94    unset($ast['kind']);
     95    unset($ast['children']);
     96    switch ($kind) {
     97    case ZEND_CONST:
     98        return value($ast[0], $EX);
     99
     100    case XC_INIT_ARRAY:
     101        $array = new Decompiler_Array();
     102        for ($i = 0; $i < $children; $i += 2) {
     103            if (isset($ast[$i + 1])) {
     104                $key = decompileAst($ast[$i], $EX);
     105                $value = decompileAst($ast[$i + 1], $EX);
     106                $array->value[] = array($key, $value);
     107            }
     108            else {
     109                $array->value[] = array(null, decompileAst($ast[$i], $EX));
     110            }
     111        }
     112        return $array;
     113
     114    // ZEND_BOOL_AND: handled in binop
     115    // ZEND_BOOL_OR:  handled in binop
     116
     117    case ZEND_SELECT:
     118        return new Decompiler_TriOp(
     119                decompileAst($ast[0], $EX)
     120                , decompileAst($ast[1], $EX)
     121                , decompileAst($ast[2], $EX)
     122                );
     123
     124    case ZEND_UNARY_PLUS:
     125        return new Decompiler_Code('+' . str(decompileAst($ast[0], $EX)));
     126
     127    case ZEND_UNARY_MINUS:
     128        return new Decompiler_Code('-' . str(decompileAst($ast[0], $EX)));
     129
     130    default:
     131        $decompiler = $GLOBALS['__xcache_decompiler'];
     132        if (isset($decompiler->binops[$kind])) {
     133            return new Decompiler_Binop($decompiler
     134                    , decompileAst($ast[0], $EX)
     135                    , $kind
     136                    , decompileAst($ast[1], $EX)
     137                    );
     138        }
     139
     140        return "un-handled kind $kind in zend_ast";
     141    }
     142}
     143// }}}
    90144function value($value, &$EX) // {{{
    91145{
     146    if (ZEND_ENGINE_2_6 && (xcache_get_type($value) & IS_CONSTANT_TYPE_MASK) == IS_CONSTANT_AST) {
     147        return decompileAst(xcache_dasm_ast($value), $EX);
     148    }
     149
    92150    $originalValue = xcache_get_special_value($value);
    93151    if (isset($originalValue)) {
     
    592650                XC_JMPNZ_EX            => "||",
    593651                );
     652        if (defined('IS_CONSTANT_AST')) {
     653            $this->binops[ZEND_BOOL_AND] = '&&';
     654            $this->binops[ZEND_BOOL_OR]  = '||';
     655        }
    594656        // }}}
    595657        $this->includeTypes = array( // {{{
     
    27972859
    27982860// {{{ defines
    2799 define('ZEND_ENGINE_2_4', PHP_VERSION >= "5.4");
     2861define('ZEND_ENGINE_2_6', PHP_VERSION >= "5.6");
     2862define('ZEND_ENGINE_2_5', ZEND_ENGINE_2_6 || PHP_VERSION >= "5.5.");
     2863define('ZEND_ENGINE_2_4', ZEND_ENGINE_2_5 || PHP_VERSION >= "5.4.");
    28002864define('ZEND_ENGINE_2_3', ZEND_ENGINE_2_4 || PHP_VERSION >= "5.3.");
    28012865define('ZEND_ENGINE_2_2', ZEND_ENGINE_2_3 || PHP_VERSION >= "5.2.");
     
    29262990define('IS_RESOURCE', 7);
    29272991define('IS_CONSTANT', 8);
    2928 define('IS_CONSTANT_ARRAY',   9);
     2992if (ZEND_ENGINE_2_6) {
     2993    define('IS_CONSTANT_ARRAY', -1);
     2994    define('IS_CONSTANT_AST', 9);
     2995}
     2996else {
     2997    define('IS_CONSTANT_ARRAY', 9);
     2998}
    29292999if (ZEND_ENGINE_2_4) {
    29303000    define('IS_CALLABLE', 10);
     
    29363006define('IS_LEXICAL_VAR',          0x20);
    29373007define('IS_LEXICAL_REF',          0x40);
     3008
     3009if (ZEND_ENGINE_2_6) {
     3010    define('ZEND_CONST',          256);
     3011    define('ZEND_BOOL_AND',       256 + 1);
     3012    define('ZEND_BOOL_OR',        256 + 2);
     3013    define('ZEND_SELECT',         256 + 3);
     3014    define('ZEND_UNARY_PLUS',     256 + 4);
     3015    define('ZEND_UNARY_MINUS',    256 + 5);
     3016}
    29383017
    29393018@define('XC_IS_CV', 16);
  • mod_disassembler/xc_disassembler.c

    r02eb6be r36033d4  
    221221/* }}} */
    222222
     223#ifdef IS_CONSTANT_AST
     224/* {{{ proto array xcache_dasm_ast(mixed ast)
     225   Disassemble zend_ast data into array */
     226#ifdef ZEND_BEGIN_ARG_INFO_EX
     227ZEND_BEGIN_ARG_INFO_EX(arginfo_xcache_dasm_ast, 0, 0, 1)
     228    ZEND_ARG_INFO(0, ast)
     229ZEND_END_ARG_INFO()
     230#else
     231static unsigned char arginfo_xcache_dasm_ast[] = { 1, BYREF_NONE };
     232#endif
     233
     234PHP_FUNCTION(xcache_dasm_ast)
     235{
     236    zval *ast;
     237    xc_dasm_t dasm;
     238
     239    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &ast) == FAILURE) {
     240        return;
     241    }
     242    if ((Z_TYPE_P(ast) & IS_CONSTANT_TYPE_MASK) != IS_CONSTANT_AST) {
     243        php_error_docref(NULL TSRMLS_CC, E_ERROR, "Data type is not zend_ast");
     244        return;
     245    }
     246    array_init(return_value);
     247    xc_dasm_zend_ast(&dasm, return_value, ast->value.ast TSRMLS_CC);
     248}
     249/* }}} */
     250#endif
     251
    223252/* {{{ PHP_MINFO_FUNCTION(xcache_disassembler) */
    224253static PHP_MINFO_FUNCTION(xcache_disassembler)
     
    235264    PHP_FE(xcache_dasm_file,         NULL)
    236265    PHP_FE(xcache_dasm_string,       NULL)
     266#ifdef IS_CONSTANT_AST
     267    PHP_FE(xcache_dasm_ast,          arginfo_xcache_dasm_ast)
     268#endif
    237269    PHP_FE_END
    238270};
  • processor/head.m4

    r9e88b02 r36033d4  
    311311        SET_IF_SAME_NAME(__tostring);
    312312#endif
     313#if defined(ZEND_ENGINE_2_6)
     314        SET_IF_SAME_NAME(__debugInfo);
     315#endif
    313316    ')
    314317#ifdef IS_UNICODE
  • processor/main.m4

    r76e4d46 r36033d4  
    2828define(`ALLOC', `
    2929    pushdef(`COUNT', `ifelse(`$3', `', `1', `$3')')
    30     pushdef(`SIZE', `sizeof($2)ifelse(`$3', `', `', ` * $3')')
     30    ifdef(`ALLOC_SIZE_HELPER', `
     31        pushdef(`SIZE', `ALLOC_SIZE_HELPER()')
     32    ', `
     33        pushdef(`SIZE', `sizeof($2)ifelse(`$3', `', `', ` * $3')')
     34    ')
    3135    pushdef(`REALTYPE', `ifelse(`$5', , `$2', `$5')')
    3236    /* allocate */
     
    255259EXPORT(`xc_entry_php_t')
    256260EXPORT(`xc_entry_data_php_t')
     261EXPORT(`zend_ast')
    257262EXPORT(`zval')
    258263
  • processor/processor.m4

    rffcd9cc r36033d4  
    6969#ifdef ZEND_ENGINE_2
    7070DEF_HASH_TABLE_FUNC(`HashTable_zend_property_info', `zend_property_info')
     71#endif
     72#ifdef IS_CONSTANT_AST
     73define(`ZEND_AST_HELPER', `dnl {{{
     74{
     75    IFCALCCOPY(`
     76        size_t zend_ast_size = ($1->kind == ZEND_CONST)
     77         ? sizeof(zend_ast) + sizeof(zval)
     78         : sizeof(zend_ast) + sizeof(zend_ast *) * ($1->children - 1);
     79    ')
     80
     81    pushdef(`ALLOC_SIZE_HELPER', `zend_ast_size')
     82    $2
     83    popdef(`ALLOC_SIZE_HELPER')
     84}
     85')
     86dnl }}}
     87DEF_STRUCT_P_FUNC(`zend_ast', , `dnl {{{
     88        zend_ushort i;
     89        PROCESS(zend_ushort, kind)
     90        PROCESS(zend_ushort, children)
     91        DONE(u)
     92        DISABLECHECK(`
     93            if (src->kind == ZEND_CONST) {
     94                assert(src->u.val);
     95                IFCOPY(`
     96                    dst->u.val = (zval *) (dst + 1);
     97                    memcpy(dst->u.val, src->u.val, sizeof(zval));
     98                ')
     99                STRUCT_P_EX(zval, dst->u.val, src->u.val, `[]', `', ` ')
     100                FIXPOINTER(zval, u.val)
     101            }
     102            else {
     103                for (i = 0; i < src->children; ++i) {
     104                    zend_ast *src_ast = (&src->u.child)[i];
     105                    if (src_ast) {
     106                        ZEND_AST_HELPER(`src_ast', `
     107                            ALLOC(`(&dst->u.child)[i]', zend_ast)
     108                            STRUCT_P_EX(zend_ast, (&dst->u.child)[i], src_ast, `[]', `', ` ')
     109                        ')
     110                        FIXPOINTER_EX(zend_ast, (&dst->u.child)[i])
     111                    }
     112                    else {
     113                        SETNULL_EX(`(&dst->u.child)[i]', `[]')
     114                    }
     115                }
     116            }
     117        ')
     118')
     119dnl }}}
    71120#endif
    72121DEF_STRUCT_P_FUNC(`zval', , `dnl {{{
     
    126175
    127176            case IS_ARRAY:
     177#ifdef IS_CONSTANT_ARRAY
    128178            case IS_CONSTANT_ARRAY:
     179#endif
     180                assert(src->value.ht);
    129181                STRUCT_P(HashTable, value.ht, HashTable_zval_ptr)
    130182                break;
     183
     184#ifdef IS_CONSTANT_AST
     185            case IS_CONSTANT_AST:
     186                assert(src->value.ast);
     187                ZEND_AST_HELPER(`src->value.ast', `STRUCT_P(zend_ast, value.ast)')
     188                break;
     189#endif
    131190
    132191            case IS_OBJECT:
     
    239298    PROCESS(zend_bool, array_type_hint)
    240299#endif
     300#ifdef ZEND_ENGINE_2_6
     301    PROCESS(zend_uchar, pass_by_reference)
     302#endif
    241303    PROCESS(zend_bool, allow_null)
     304
     305#ifdef ZEND_ENGINE_2_6
     306    PROCESS(zend_bool, is_variadic)
     307#else
    242308    PROCESS(zend_bool, pass_by_reference)
     309#endif
     310
    243311#ifndef ZEND_ENGINE_2_4
    244312    PROCESS(zend_bool, return_reference)
     
    482550    COPY(__unset)
    483551    COPY(__isset)
    484 #    if defined(ZEND_ENGINE_2_2) || PHP_MAJOR_VERSION >= 6
    485     COPY(__tostring)
    486 #    endif
    487552#   endif
    488553    COPY(__call)
     
    490555    COPY(__callstatic)
    491556#   endif
     557# if defined(ZEND_ENGINE_2_2) || PHP_MAJOR_VERSION >= 6
     558    COPY(__tostring)
     559# endif
     560# if defined(ZEND_ENGINE_2_6)
     561    COPY(__debugInfo)
     562# endif
    492563#   ifndef ZEND_ENGINE_2_4
    493564    /* # NOT DONE */
     
    534605                IFDASM(`{
    535606                    zval *zv;
    536                     ALLOC_INIT_ZVAL(zv);
    537                     *zv = dasm->active_op_array_src->literals[SRC(`$1.constant')].constant;
    538                     zval_copy_ctor(zv);
     607                    zval *srczv = &dasm->active_op_array_src->literals[SRC(`$1.constant')].constant;
     608                    ALLOC_ZVAL(zv);
     609                    MAKE_COPY_ZVAL(&srczv, zv);
    539610                    add_assoc_zval_ex(dst, XCACHE_STRS("$1.constant"), zv);
    540611                }
  • processor/struct.m4

    r76e4d46 r36033d4  
    151151ifdef(`DASM_STRUCT_DIRECT', `', `
    152152    IFDASM(`
    153         add_assoc_zval_ex(dst, XCACHE_STRS("$4"), zv);
     153        ifelse(`$4', `[]', `
     154            add_next_index_zval(dst, zv);
     155        ', `
     156            add_assoc_zval_ex(dst, XCACHE_STRS("$4"), zv);
     157        ')
    154158    } while (0);
    155159    ')
  • tests/xcache_deep_copy_arg_info.phpt

    r1ca0e24 r36033d4  
    11--TEST--
    22xcache requires deep copying arg info
     3--SKIPIF--
     4<?php
     5require("include-skipif.inc");
     6?>
    37--INI--
    48xcache.readonly_protection=0
     9xcache.test = 1
     10xcache.size = 32M
    511--FILE--
    612<?php
  • tests/xcache_deep_copy_opcodes_for_const.phpt

    rf46ace6 r36033d4  
    11--TEST--
    22xcache requires deep copying opcodes for __FILE__ and __DIR__
     3--SKIPIF--
     4<?php
     5require("include-skipif.inc");
     6?>
    37--INI--
     8xcache.test = 1
     9xcache.size = 32M
    410--FILE--
    511<?php
  • tests/xcache_deep_copy_static_variables.phpt

    r1ca0e24 r36033d4  
    11--TEST--
    22xcache requires deep copying static variables in shallow copy mode
     3--SKIPIF--
     4<?php
     5require("include-skipif.inc");
     6?>
    37--INI--
    48xcache.readonly_protection=0
     9xcache.test = 1
     10xcache.size = 32M
    511--FILE--
    612<?php
  • tests/xcache_include_absolute.phpt

    r5cd9012 r36033d4  
    55require("include-skipif.inc");
    66?>
     7--INI--
     8xcache.test = 1
     9xcache.size = 32M
    710--FILE--
    811<?php
  • tests/xcache_include_relative_cwd.phpt

    r5cd9012 r36033d4  
    55require("include-skipif.inc");
    66?>
     7--INI--
     8xcache.test = 1
     9xcache.size = 32M
    710--FILE--
    811<?php
  • tests/xcache_include_relative_file.phpt

    r5cd9012 r36033d4  
    55require("include-skipif.inc");
    66?>
     7--INI--
     8xcache.test = 1
     9xcache.size = 32M
    710--FILE--
    811<?php
  • tests/xcache_is_autoglobal.phpt

    r8cf65a5 r36033d4  
    55require("skipif.inc");
    66?>
     7--INI--
     8xcache.test = 1
     9xcache.size = 32M
    710--FILE--
    811<?php
  • tests/xcache_shallow_copy_check_early_binding.phpt

    rf46ace6 r36033d4  
    33--SKIPIF--
    44<?php
     5require("include-skipif.inc");
    56if (version_compare(PHP_VERSION, "5.3", ">=")) {
    67    die("skip only needed for PHP 5.2 or less");
    78}
    89?>
     10--INI--
     11xcache.test = 1
     12xcache.size = 32M
    913--FILE--
    1014<?php
  • tests/xcache_var.phpt

    r8cf65a5 r36033d4  
    55require("skipif.inc");
    66?>
     7--INI--
     8xcache.test = 1
     9xcache.size = 32M
     10xcache.var_size = 2M
    711--FILE--
    812<?php
  • xcache.c

    rd50f8ca r36033d4  
    344344        break;
    345345
     346#ifdef IS_CONSTANT_ARRAY
    346347    case IS_CONSTANT_ARRAY:
    347348        *return_value = *value;
     
    349350        return_value->type = IS_ARRAY;
    350351        break;
     352#endif
     353
     354#ifdef IS_CONSTANT_AST
     355    case IS_CONSTANT_AST:
     356        RETURN_NULL();
     357        break;
     358#endif
    351359
    352360    default:
  • xcache/xc_compatibility.h

    r02eb6be r36033d4  
    1111 */
    1212
    13 #if !defined(ZEND_ENGINE_2_5) && (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 5 || PHP_MAJOR_VERSION > 6)
     13#if !defined(ZEND_ENGINE_2_6) && (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 6 || PHP_MAJOR_VERSION > 6)
     14#   define ZEND_ENGINE_2_6
     15#endif
     16#if !defined(ZEND_ENGINE_2_5) && (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION == 5 || defined(ZEND_ENGINE_2_6))
    1417#   define ZEND_ENGINE_2_5
    1518#endif
     
    9598#endif
    9699/* }}} */
     100
     101#ifndef ZEND_ENGINE_2_6
     102typedef void zend_ast;
     103#endif
    97104
    98105#ifdef ZEND_ENGINE_2_4
  • xcache/xc_const_string.c

    r98eb42c r36033d4  
    7272#if PHP_MAJOR_VERSION >= 6
    7373#   include "xc_const_string_opcodes_php6.x.h"
     74#elif defined(ZEND_ENGINE_2_6)
     75#   include "xc_const_string_opcodes_php5.6.h"
    7476#elif defined(ZEND_ENGINE_2_5)
    7577#   include "xc_const_string_opcodes_php5.5.h"
  • xcache/xc_opcode_spec_def.h

    r2252347 r36033d4  
    301301    OPSPEC(    UNUSED,     UNUSED,     UNUSED,     UNUSED) /* 163 FAST_RET                       */
    302302#endif
     303#ifdef ZEND_ENGINE_2_6
     304    OPSPEC(    UNUSED,        ARG,     UNUSED,        VAR) /* 164 RECV_VARIADIC                  */
     305    OPSPEC(      SEND,        STD,        ARG,     UNUSED) /* 165 SEND_UNPACK                    */
     306    OPSPEC(    UNUSED,        STD,        STD,        TMP) /* 166 POW                            */
     307    OPSPEC(    ASSIGN,        STD,        STD,        VAR) /* 167 ASSIGN_POW                     */
     308#endif
    303309};
Note: See TracChangeset for help on using the changeset viewer.