diff options
author | Dmitry Stogov <dmitry@php.net> | 2010-07-08 14:05:11 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2010-07-08 14:05:11 +0000 |
commit | f0c8366a9e8acd832b6d433035d162218f8db1ec (patch) | |
tree | 8187bb3ba4addf708a7845b408db6bdc0fe7e488 /main/php_variables.c | |
parent | eea8fc6122d80179adbfd9f0a234d9cb23c7984e (diff) | |
download | php-git-f0c8366a9e8acd832b6d433035d162218f8db1ec.tar.gz |
- use interned strings for auto globals
- $GLOBALS became a JIT autoglobal, so it's initialized only if used (this may affect opcode caches)
Diffstat (limited to 'main/php_variables.c')
-rw-r--r-- | main/php_variables.c | 184 |
1 files changed, 96 insertions, 88 deletions
diff --git a/main/php_variables.c b/main/php_variables.c index a37349ac1d..e45598f603 100644 --- a/main/php_variables.c +++ b/main/php_variables.c @@ -643,98 +643,106 @@ static zend_bool php_auto_globals_create_request(char *name, uint name_len TSRML */ int php_hash_environment(TSRMLS_D) { - char *p; - unsigned char _gpc_flags[5] = {0, 0, 0, 0, 0}; - struct auto_global_record { - char *name; - uint name_len; - zend_bool jit_initialization; - } auto_global_records[] = { - { "_POST", sizeof("_POST"), 0 }, - { "_GET", sizeof("_GET"), 0 }, - { "_COOKIE", sizeof("_COOKIE"), 0 }, - { "_SERVER", sizeof("_SERVER"), 1 }, - { "_ENV", sizeof("_ENV"), 1 }, - { "_FILES", sizeof("_FILES"), 0 }, - }; - size_t num_track_vars = sizeof(auto_global_records)/sizeof(struct auto_global_record); - size_t i; - - /* jit_initialization = 0; */ - for (i=0; i<num_track_vars; i++) { - PG(http_globals)[i] = NULL; - } - - for (p=PG(variables_order); p && *p; p++) { - switch(*p) { - case 'p': - case 'P': - if (!_gpc_flags[0] && !SG(headers_sent) && SG(request_info).request_method && !strcasecmp(SG(request_info).request_method, "POST")) { - sapi_module.treat_data(PARSE_POST, NULL, NULL TSRMLS_CC); /* POST Data */ - _gpc_flags[0] = 1; - } - break; - case 'c': - case 'C': - if (!_gpc_flags[1]) { - sapi_module.treat_data(PARSE_COOKIE, NULL, NULL TSRMLS_CC); /* Cookie Data */ - _gpc_flags[1] = 1; - } - break; - case 'g': - case 'G': - if (!_gpc_flags[2]) { - sapi_module.treat_data(PARSE_GET, NULL, NULL TSRMLS_CC); /* GET Data */ - _gpc_flags[2] = 1; - } - break; - case 'e': - case 'E': - if (!PG(auto_globals_jit) && !_gpc_flags[3]) { - zend_auto_global_disable_jit("_ENV", sizeof("_ENV")-1 TSRMLS_CC); - php_auto_globals_create_env("_ENV", sizeof("_ENV")-1 TSRMLS_CC); - _gpc_flags[3] = 1; - } - break; - case 's': - case 'S': - if (!PG(auto_globals_jit) && !_gpc_flags[4]) { - zend_auto_global_disable_jit("_SERVER", sizeof("_SERVER")-1 TSRMLS_CC); - php_register_server_variables(TSRMLS_C); - _gpc_flags[4] = 1; - } - break; - } - } - - /* argv/argc support */ + memset(PG(http_globals), 0, sizeof(PG(http_globals))); + zend_activate_auto_globals(TSRMLS_C); if (PG(register_argc_argv)) { php_build_argv(SG(request_info).query_string, PG(http_globals)[TRACK_VARS_SERVER] TSRMLS_CC); } + return SUCCESS; +} +/* }}} */ - for (i=0; i<num_track_vars; i++) { - if (PG(auto_globals_jit) && auto_global_records[i].jit_initialization) { - continue; +static zend_bool php_auto_globals_create_get(char *name, uint name_len TSRMLS_DC) +{ + zval *vars; + + if (PG(variables_order) && (strchr(PG(variables_order),'G') || strchr(PG(variables_order),'g'))) { + sapi_module.treat_data(PARSE_GET, NULL, NULL TSRMLS_CC); + vars = PG(http_globals)[TRACK_VARS_GET]; + } else { + ALLOC_ZVAL(vars); + array_init(vars); + INIT_PZVAL(vars); + if (PG(http_globals)[TRACK_VARS_GET]) { + zval_ptr_dtor(&PG(http_globals)[TRACK_VARS_GET]); } - if (!PG(http_globals)[i]) { - ALLOC_ZVAL(PG(http_globals)[i]); - array_init(PG(http_globals)[i]); - INIT_PZVAL(PG(http_globals)[i]); + PG(http_globals)[TRACK_VARS_GET] = vars; + } + + zend_hash_update(&EG(symbol_table), name, name_len + 1, &vars, sizeof(zval *), NULL); + Z_ADDREF_P(vars); + + return 0; /* don't rearm */ +} + +static zend_bool php_auto_globals_create_post(char *name, uint name_len TSRMLS_DC) +{ + zval *vars; + + if (PG(variables_order) && + (strchr(PG(variables_order),'P') || strchr(PG(variables_order),'p')) && + !SG(headers_sent) && + SG(request_info).request_method && + !strcasecmp(SG(request_info).request_method, "POST")) { + sapi_module.treat_data(PARSE_POST, NULL, NULL TSRMLS_CC); + vars = PG(http_globals)[TRACK_VARS_POST]; + } else { + ALLOC_ZVAL(vars); + array_init(vars); + INIT_PZVAL(vars); + if (PG(http_globals)[TRACK_VARS_POST]) { + zval_ptr_dtor(&PG(http_globals)[TRACK_VARS_POST]); } + PG(http_globals)[TRACK_VARS_POST] = vars; + } + + zend_hash_update(&EG(symbol_table), name, name_len + 1, &vars, sizeof(zval *), NULL); + Z_ADDREF_P(vars); + + return 0; /* don't rearm */ +} - Z_ADDREF_P(PG(http_globals)[i]); - zend_hash_update(&EG(symbol_table), auto_global_records[i].name, auto_global_records[i].name_len, &PG(http_globals)[i], sizeof(zval *), NULL); +static zend_bool php_auto_globals_create_cookie(char *name, uint name_len TSRMLS_DC) +{ + zval *vars; + + if (PG(variables_order) && (strchr(PG(variables_order),'C') || strchr(PG(variables_order),'c'))) { + sapi_module.treat_data(PARSE_COOKIE, NULL, NULL TSRMLS_CC); + vars = PG(http_globals)[TRACK_VARS_COOKIE]; + } else { + ALLOC_ZVAL(vars); + array_init(vars); + INIT_PZVAL(vars); + if (PG(http_globals)[TRACK_VARS_COOKIE]) { + zval_ptr_dtor(&PG(http_globals)[TRACK_VARS_COOKIE]); + } + PG(http_globals)[TRACK_VARS_COOKIE] = vars; } - /* Create _REQUEST */ - if (!PG(auto_globals_jit)) { - zend_auto_global_disable_jit("_REQUEST", sizeof("_REQUEST")-1 TSRMLS_CC); - php_auto_globals_create_request("_REQUEST", sizeof("_REQUEST")-1 TSRMLS_CC); + zend_hash_update(&EG(symbol_table), name, name_len + 1, &vars, sizeof(zval *), NULL); + Z_ADDREF_P(vars); + + return 0; /* don't rearm */ +} + +static zend_bool php_auto_globals_create_files(char *name, uint name_len TSRMLS_DC) +{ + zval *vars; + + if (PG(http_globals)[TRACK_VARS_FILES]) { + vars = PG(http_globals)[TRACK_VARS_FILES]; + } else { + ALLOC_ZVAL(vars); + array_init(vars); + INIT_PZVAL(vars); + PG(http_globals)[TRACK_VARS_FILES] = vars; } - return SUCCESS; + zend_hash_update(&EG(symbol_table), name, name_len + 1, &vars, sizeof(zval *), NULL); + Z_ADDREF_P(vars); + + return 0; /* don't rearm */ } -/* }}} */ static zend_bool php_auto_globals_create_server(char *name, uint name_len TSRMLS_DC) { @@ -837,19 +845,19 @@ static zend_bool php_auto_globals_create_request(char *name, uint name_len TSRML } } - zend_hash_update(&EG(symbol_table), "_REQUEST", sizeof("_REQUEST"), &form_variables, sizeof(zval *), NULL); + zend_hash_update(&EG(symbol_table), name, name_len + 1, &form_variables, sizeof(zval *), NULL); return 0; } void php_startup_auto_globals(TSRMLS_D) { - zend_register_auto_global("_GET", sizeof("_GET")-1, NULL TSRMLS_CC); - zend_register_auto_global("_POST", sizeof("_POST")-1, NULL TSRMLS_CC); - zend_register_auto_global("_COOKIE", sizeof("_COOKIE")-1, NULL TSRMLS_CC); - zend_register_auto_global("_SERVER", sizeof("_SERVER")-1, php_auto_globals_create_server TSRMLS_CC); - zend_register_auto_global("_ENV", sizeof("_ENV")-1, php_auto_globals_create_env TSRMLS_CC); - zend_register_auto_global("_REQUEST", sizeof("_REQUEST")-1, php_auto_globals_create_request TSRMLS_CC); - zend_register_auto_global("_FILES", sizeof("_FILES")-1, NULL TSRMLS_CC); + zend_register_auto_global("_GET", sizeof("_GET")-1, 0, php_auto_globals_create_get TSRMLS_CC); + zend_register_auto_global("_POST", sizeof("_POST")-1, 0, php_auto_globals_create_post TSRMLS_CC); + zend_register_auto_global("_COOKIE", sizeof("_COOKIE")-1, 0, php_auto_globals_create_cookie TSRMLS_CC); + zend_register_auto_global("_SERVER", sizeof("_SERVER")-1, PG(auto_globals_jit), php_auto_globals_create_server TSRMLS_CC); + zend_register_auto_global("_ENV", sizeof("_ENV")-1, PG(auto_globals_jit), php_auto_globals_create_env TSRMLS_CC); + zend_register_auto_global("_REQUEST", sizeof("_REQUEST")-1, PG(auto_globals_jit), php_auto_globals_create_request TSRMLS_CC); + zend_register_auto_global("_FILES", sizeof("_FILES")-1, 0, php_auto_globals_create_files TSRMLS_CC); } /* |