From 79224cdd38e2070252b752613471ecba601dbaec Mon Sep 17 00:00:00 2001 From: Owen Yamauchi Date: Tue, 11 Jun 2013 15:44:50 -0700 Subject: [PATCH] Remove the hardcoded globals from GlobalNameValueTableWrapper The ultimate goal is to de-virtualize ArrayData. To do this, we need a single ArrayData subclass that has all the capabilities we need. This --- hphp/hhvm/global_variables.cpp | 33 +++++----- hphp/idl/class_map.php | 8 +-- hphp/runtime/base/class_info.cpp | 4 +- hphp/runtime/base/externals.h | 5 -- hphp/runtime/base/file/url_file.cpp | 7 ++- hphp/runtime/base/hphp_system.h | 10 --- hphp/runtime/base/macros.h | 5 -- hphp/runtime/base/program_functions.cpp | 61 ++++++++++--------- hphp/runtime/base/server/http_protocol.cpp | 50 +++++++++------ .../base/server/rpc_request_handler.cpp | 8 ++- hphp/runtime/base/server/source_root_info.cpp | 7 ++- hphp/runtime/debugger/dummy_sandbox.cpp | 6 +- hphp/runtime/ext/ext_options.cpp | 5 +- hphp/runtime/ext/ext_session.cpp | 58 ++++++++++-------- hphp/runtime/ext/ext_soap.cpp | 11 ++-- hphp/runtime/vm/name_value_table_wrapper.h | 16 ++--- hphp/system/class_map.cpp | 4 +- 17 files changed, 148 insertions(+), 150 deletions(-) diff --git a/hphp/hhvm/global_variables.cpp b/hphp/hhvm/global_variables.cpp index e9eb1895f..05e889ca0 100644 --- a/hphp/hhvm/global_variables.cpp +++ b/hphp/hhvm/global_variables.cpp @@ -39,29 +39,24 @@ void free_global_variables_after_sweep() { g_variables = nullptr; } -SystemGlobals* get_system_globals() { return get_global_variables(); } - GlobalNameValueTableWrapper::GlobalNameValueTableWrapper( NameValueTable* tab) : NameValueTableWrapper(tab) { - VarNR arr(HphpArray::GetStaticEmptyArray()); -#define X(s,v) \ - tab->migrateSet(StringData::GetStaticString(#s), \ - gvm_##s.asTypedValue()); \ - gvm_##s.v; + Variant arr(HphpArray::GetStaticEmptyArray()); +#define X(s,v) tab->set(StringData::GetStaticString(#s), v.asTypedValue()); - X(argc, setNull()); - X(argv, setNull()); - X(_SERVER, assignVal(arr)); - X(_GET, assignVal(arr)); - X(_POST, assignVal(arr)); - X(_COOKIE, assignVal(arr)); - X(_FILES, assignVal(arr)); - X(_ENV, assignVal(arr)); - X(_REQUEST, assignVal(arr)); - X(_SESSION, assignVal(arr)); - X(HTTP_RAW_POST_DATA, setNull()); - X(http_response_header, setNull()); + X(argc, init_null_variant); + X(argv, init_null_variant); + X(_SERVER, arr); + X(_GET, arr); + X(_POST, arr); + X(_COOKIE, arr); + X(_FILES, arr); + X(_ENV, arr); + X(_REQUEST, arr); + X(_SESSION, arr); + X(HTTP_RAW_POST_DATA, init_null_variant); + X(http_response_header, init_null_variant); #undef X ThreadInfo::s_threadInfo->m_globals = g_variables = this; diff --git a/hphp/idl/class_map.php b/hphp/idl/class_map.php index 6e1e8c380..0bd6aa638 100644 --- a/hphp/idl/class_map.php +++ b/hphp/idl/class_map.php @@ -33,11 +33,11 @@ if (substr($target, -4) == '.cpp') { foreach ($constants as $constant) { constantClassMap($constant); } - printf(' "SID", (const char *)((offsetof(SystemGlobals, k_SID) - '. - 'offsetof(SystemGlobals, stgv_Variant)) / sizeof(Variant)), '. + printf(' "SID", (const char *)((offsetof(GlobalVariables, k_SID) - '. + 'offsetof(GlobalVariables, stgv_Variant)) / sizeof(Variant)), '. "(const char *)1,\n"); - printf(' "PHP_SAPI", (const char *)((offsetof(SystemGlobals, k_PHP_SAPI) - '. - 'offsetof(SystemGlobals, stgv_Variant)) / sizeof(Variant)), '. + printf(' "PHP_SAPI", (const char *)((offsetof(GlobalVariables, k_PHP_SAPI) '. + '- offsetof(GlobalVariables, stgv_Variant)) / sizeof(Variant)), '. "(const char *)1,\n"); printf(" NULL, // End of constants\n"); printf(" NULL,\n"); diff --git a/hphp/runtime/base/class_info.cpp b/hphp/runtime/base/class_info.cpp index 2914191e0..e4f845278 100644 --- a/hphp/runtime/base/class_info.cpp +++ b/hphp/runtime/base/class_info.cpp @@ -14,8 +14,8 @@ +----------------------------------------------------------------------+ */ -#include "hphp/runtime/base/array/array_util.h" #include "hphp/runtime/base/class_info.h" +#include "hphp/runtime/base/array/array_util.h" #include "hphp/runtime/base/complex_types.h" #include "hphp/runtime/base/externals.h" #include "hphp/runtime/base/hphp_system.h" @@ -203,7 +203,7 @@ CVarRef ClassInfo::ConstantInfo::getDeferredValue() const { CVarRef (*f)()=(CVarRef(*)())callback; return (*f)(); } - SystemGlobals* g = get_global_variables(); + GlobalVariables* g = get_global_variables(); return g->stgv_Variant[valueLen]; } diff --git a/hphp/runtime/base/externals.h b/hphp/runtime/base/externals.h index b65c412e2..e07d7aee2 100644 --- a/hphp/runtime/base/externals.h +++ b/hphp/runtime/base/externals.h @@ -62,11 +62,6 @@ extern void init_global_variables(); extern void free_global_variables(); extern void free_global_variables_after_sweep(); extern Array get_global_state(); -/** - * Returns a thread local global variable table pointer. - */ -typedef GlobalNameValueTableWrapper SystemGlobals; -extern SystemGlobals *get_system_globals(); /** * Precomputed literal strings diff --git a/hphp/runtime/base/file/url_file.cpp b/hphp/runtime/base/file/url_file.cpp index fe94055d9..4fba33868 100644 --- a/hphp/runtime/base/file/url_file.cpp +++ b/hphp/runtime/base/file/url_file.cpp @@ -14,8 +14,8 @@ +----------------------------------------------------------------------+ */ -#include "hphp/runtime/base/hphp_system.h" #include "hphp/runtime/base/file/url_file.h" +#include "hphp/runtime/base/hphp_system.h" #include "hphp/runtime/base/util/http_client.h" #include "hphp/runtime/base/runtime_error.h" @@ -70,8 +70,9 @@ bool UrlFile::open(CStrRef url, CStrRef mode) { m_response, pHeaders, &responseHeaders); } - SystemGlobals *g = (SystemGlobals*)get_global_variables(); - Variant &r = g->GV(http_response_header); + static const StaticString s_http_response_header("http_response_header"); + GlobalVariables *g = get_global_variables(); + Variant &r = g->getRef(s_http_response_header); r = Array::Create(); for (unsigned int i = 0; i < responseHeaders.size(); i++) { r.append(responseHeaders[i]); diff --git a/hphp/runtime/base/hphp_system.h b/hphp/runtime/base/hphp_system.h index 69bd5c9eb..9027807ec 100644 --- a/hphp/runtime/base/hphp_system.h +++ b/hphp/runtime/base/hphp_system.h @@ -53,14 +53,4 @@ const char* getHphpCompilerId(); /////////////////////////////////////////////////////////////////////////////// } // namespace HPHP -#define DECLARE_SYSTEM_GLOBALS(sg) \ - SystemGlobals *sg ATTRIBUTE_UNUSED = \ - get_global_variables(); - -#define DECLARE_GLOBAL_VARIABLES(g) \ - SystemGlobals *g ATTRIBUTE_UNUSED = \ - get_global_variables(); - -/////////////////////////////////////////////////////////////////////////////// - #endif // incl_HPHP_CPP_BASE_HPHP_SYSTEM_H_ diff --git a/hphp/runtime/base/macros.h b/hphp/runtime/base/macros.h index 2ed4dd897..949d034b9 100644 --- a/hphp/runtime/base/macros.h +++ b/hphp/runtime/base/macros.h @@ -129,11 +129,6 @@ namespace HPHP { IMPLEMENT_CLASS_COMMON(cls) \ IMPLEMENT_OBJECT_ALLOCATION_NO_DEFAULT_SWEEP(c_##cls) \ -/////////////////////////////////////////////////////////////////////////////// -// global variable macros - -#define GV(s) gvm_ ## s - /////////////////////////////////////////////////////////////////////////////// // code instrumentation or injections diff --git a/hphp/runtime/base/program_functions.cpp b/hphp/runtime/base/program_functions.cpp index da8414dd1..999142a9a 100644 --- a/hphp/runtime/base/program_functions.cpp +++ b/hphp/runtime/base/program_functions.cpp @@ -124,12 +124,32 @@ time_t start_time() { return s_startTime.startTime; } +static const StaticString + s_HPHP("HPHP"), + s_HHVM("HHVM"), + s_HHVM_JIT("HHVM_JIT"), + s_REQUEST_START_TIME("REQUEST_START_TIME"), + s_REQUEST_TIME("REQUEST_TIME"), + s_REQUEST_TIME_FLOAT("REQUEST_TIME_FLOAT"), + s_DOCUMENT_ROOT("DOCUMENT_ROOT"), + s_SCRIPT_FILENAME("SCRIPT_FILENAME"), + s_SCRIPT_NAME("SCRIPT_NAME"), + s_PHP_SELF("PHP_SELF"), + s_argc("argc"), + s_argv("argv"), + s_PWD("PWD"), + s_HOSTNAME("HOSTNAME"), + s__SERVER("_SERVER"), + s__ENV("_ENV"); + static void process_cmd_arguments(int argc, char **argv) { - SystemGlobals *g = (SystemGlobals *)get_global_variables(); - g->GV(argc) = argc; + GlobalVariables *g = get_global_variables(); + g->set(s_argc, Variant(argc), false); + Array argvArray = HphpArray::GetStaticEmptyArray(); for (int i = 0; i < argc; i++) { - g->GV(argv).lvalAt() = String(argv[i]); + argvArray.append(String(argv[i])); } + g->set(s_argv, argvArray, false); } void process_env_variables(Variant &variables) { @@ -439,22 +459,6 @@ void handle_destructor_exception(const char* situation) { } } -static const StaticString - s_HPHP("HPHP"), - s_HHVM("HHVM"), - s_HHVM_JIT("HHVM_JIT"), - s_REQUEST_START_TIME("REQUEST_START_TIME"), - s_REQUEST_TIME("REQUEST_TIME"), - s_REQUEST_TIME_FLOAT("REQUEST_TIME_FLOAT"), - s_DOCUMENT_ROOT("DOCUMENT_ROOT"), - s_SCRIPT_FILENAME("SCRIPT_FILENAME"), - s_SCRIPT_NAME("SCRIPT_NAME"), - s_PHP_SELF("PHP_SELF"), - s_argc("argc"), - s_argv("argv"), - s_PWD("PWD"), - s_HOSTNAME("HOSTNAME"); - void execute_command_line_begin(int argc, char **argv, int xhprof) { StackTraceNoHeap::AddExtraLogging("ThreadType", "CLI"); string args; @@ -468,18 +472,19 @@ void execute_command_line_begin(int argc, char **argv, int xhprof) { ExecutionContext *context = g_context.getNoCheck(); context->obSetImplicitFlush(true); - SystemGlobals *g = (SystemGlobals *)get_global_variables(); + GlobalVariables *g = get_global_variables(); - process_env_variables(g->GV(_ENV)); - g->GV(_ENV).set(s_HPHP, 1); - g->GV(_ENV).set(s_HHVM, 1); + Variant& env = g->getRef(s__ENV); + process_env_variables(env); + env.set(s_HPHP, 1); + env.set(s_HHVM, 1); if (RuntimeOption::EvalJit) { - g->GV(_ENV).set(s_HHVM_JIT, 1); + env.set(s_HHVM_JIT, 1); } process_cmd_arguments(argc, argv); - Variant &server = g->GV(_SERVER); + Variant& server = g->getRef(s__SERVER); process_env_variables(server); time_t now; struct timeval tp = {0}; @@ -502,8 +507,8 @@ void execute_command_line_begin(int argc, char **argv, int xhprof) { server.set(s_SCRIPT_FILENAME, file); server.set(s_SCRIPT_NAME, file); server.set(s_PHP_SELF, file); - server.set(s_argv, g->GV(argv)); - server.set(s_argc, g->GV(argc)); + server.set(s_argv, g->get(s_argv)); + server.set(s_argc, g->get(s_argc)); server.set(s_PWD, g_context->getCwd()); char hostname[1024]; if (!gethostname(hostname, 1024)) { @@ -1309,7 +1314,7 @@ void hphp_session_init() { g_vmContext->requestInit(); - SystemGlobals *g = (SystemGlobals *)get_global_variables(); + GlobalVariables *g = get_global_variables(); g->k_PHP_SAPI = StringData::GetStaticString(RuntimeOption::ExecutionMode); } diff --git a/hphp/runtime/base/server/http_protocol.cpp b/hphp/runtime/base/server/http_protocol.cpp index 572f68c5f..80731c62b 100644 --- a/hphp/runtime/base/server/http_protocol.cpp +++ b/hphp/runtime/base/server/http_protocol.cpp @@ -94,6 +94,14 @@ static const StaticString s_PATH_INFO("PATH_INFO"), s_argc("argc"), s_argv("argv"), + s__SERVER("_SERVER"), + s__GET("_GET"), + s__POST("_POST"), + s__REQUEST("_REQUEST"), + s__ENV("_ENV"), + s__COOKIE("_COOKIE"), + s_HTTP_RAW_POST_DATA("HTTP_RAW_POST_DATA"), + s__FILES("_FILES"), s_GATEWAY_INTERFACE("GATEWAY_INTERFACE"), s_CGI_1_1("CGI/1.1"), s_SERVER_ADDR("SERVER_ADDR"), @@ -126,35 +134,37 @@ static const StaticString void HttpProtocol::PrepareSystemVariables(Transport *transport, const RequestURI &r, const SourceRootInfo &sri) { - SystemGlobals *g = (SystemGlobals*)get_global_variables(); + GlobalVariables *g = get_global_variables(); const VirtualHost *vhost = VirtualHost::GetCurrent(); - Variant &server = g->GV(_SERVER); + Variant& server = g->getRef(s__SERVER); server.set(s_REQUEST_START_TIME, time(nullptr)); // $_ENV - process_env_variables(g->GV(_ENV)); - g->GV(_ENV).set(s_HPHP, 1); - g->GV(_ENV).set(s_HHVM, 1); + Variant& env = g->getRef(s__ENV); + process_env_variables(env); + env.set(s_HPHP, 1); + env.set(s_HHVM, 1); if (RuntimeOption::EvalJit) { - g->GV(_ENV).set(s_HHVM_JIT, 1); + env.set(s_HHVM_JIT, 1); } bool isServer = RuntimeOption::ServerExecutionMode(); if (isServer) { - g->GV(_ENV).set(s_HPHP_SERVER, 1); + env.set(s_HPHP_SERVER, 1); #ifdef HOTPROFILER - g->GV(_ENV).set(s_HPHP_HOTPROFILER, 1); + env.set(s_HPHP_HOTPROFILER, 1); #endif } - Variant &request = g->GV(_REQUEST); + Variant &request = g->getRef(s__REQUEST); // $_GET and $_REQUEST if (!r.queryString().empty()) { - DecodeParameters(g->GV(_GET), r.queryString().data(), + Variant &get = g->getRef(s__GET); + DecodeParameters(get, r.queryString().data(), r.queryString().size()); - CopyParams(request, g->GV(_GET)); + CopyParams(request, get); } string contentType = transport->getHeader("Content-Type"); @@ -185,7 +195,7 @@ void HttpProtocol::PrepareSystemVariables(Transport *transport, needDelete = true; data = Util::buffer_duplicate(data, size); } - DecodeRfc1867(transport, g->GV(_POST), g->GV(_FILES), + DecodeRfc1867(transport, g->getRef(s__POST), g->getRef(s__FILES), content_length, data, size, boundary); } assert(!transport->getFiles(files)); @@ -199,26 +209,28 @@ void HttpProtocol::PrepareSystemVariables(Transport *transport, decodeData = true; if (decodeData) { - DecodeParameters(g->GV(_POST), (const char*)data, size, true); + DecodeParameters(g->getRef(s__POST), (const char*)data, size, true); } bool ret = transport->getFiles(files); if (ret) { - g->GV(_FILES) = unserialize_from_string(files); + g->getRef(s__FILES) = unserialize_from_string(files); } } - CopyParams(request, g->GV(_POST)); + CopyParams(request, g->getRef(s__POST)); if (needDelete) { if (RuntimeOption::AlwaysPopulateRawPostData && uint32_t(size) <= StringData::MaxSize) { - g->GV(HTTP_RAW_POST_DATA) = String((char*)data, size, AttachString); + g->getRef(s_HTTP_RAW_POST_DATA) = + String((char*)data, size, AttachString); } else { free((void *)data); } } else { // For literal we disregard RuntimeOption::AlwaysPopulateRawPostData if (uint32_t(size) <= StringData::MaxSize) { - g->GV(HTTP_RAW_POST_DATA) = String((char*)data, size, AttachLiteral); + g->getRef(s_HTTP_RAW_POST_DATA) = + String((char*)data, size, AttachLiteral); } } } @@ -229,8 +241,8 @@ void HttpProtocol::PrepareSystemVariables(Transport *transport, if (!cookie_data.empty()) { StringBuffer sb; sb.append(cookie_data); - DecodeCookies(g->GV(_COOKIE), (char*)sb.data()); - CopyParams(request, g->GV(_COOKIE)); + DecodeCookies(g->getRef(s__COOKIE), (char*)sb.data()); + CopyParams(request, g->getRef(s__COOKIE)); } // $_SERVER diff --git a/hphp/runtime/base/server/rpc_request_handler.cpp b/hphp/runtime/base/server/rpc_request_handler.cpp index 4b0df4cc7..8c84d2374 100644 --- a/hphp/runtime/base/server/rpc_request_handler.cpp +++ b/hphp/runtime/base/server/rpc_request_handler.cpp @@ -178,7 +178,8 @@ void RPCRequestHandler::handleRequest(Transport *transport) { static const StaticString s_output("output"), s_return("return"), - s_HPHP_RPC("HPHP_RPC"); + s_HPHP_RPC("HPHP_RPC"), + s__ENV("_ENV"); bool RPCRequestHandler::executePHPFunction(Transport *transport, SourceRootInfo &sourceRootInfo, @@ -191,8 +192,9 @@ bool RPCRequestHandler::executePHPFunction(Transport *transport, ServerStatsHelper ssh("input"); RequestURI reqURI(rpcFunc); HttpProtocol::PrepareSystemVariables(transport, reqURI, sourceRootInfo); - SystemGlobals *g = (SystemGlobals*)get_global_variables(); - g->GV(_ENV).set(s_HPHP_RPC, 1); + + GlobalVariables *g = get_global_variables(); + g->getRef(s__ENV).set(s_HPHP_RPC, 1); } bool isFile = rpcFunc.rfind('.') != string::npos; diff --git a/hphp/runtime/base/server/source_root_info.cpp b/hphp/runtime/base/server/source_root_info.cpp index 994d4d20f..b99944c66 100644 --- a/hphp/runtime/base/server/source_root_info.cpp +++ b/hphp/runtime/base/server/source_root_info.cpp @@ -247,12 +247,13 @@ string SourceRootInfo::path() const { } } +static const StaticString s_SERVER("_SERVER"); static const StaticString s_PHP_ROOT("PHP_ROOT"); string& SourceRootInfo::initPhpRoot() { - SystemGlobals *g = (SystemGlobals*)get_global_variables(); - Variant &server = g->GV(_SERVER); - Variant v = server.rvalAt(s_PHP_ROOT); + GlobalVariables *g = get_global_variables(); + CVarRef server = g->get(s_SERVER); + CVarRef v = server.rvalAt(s_PHP_ROOT); if (v.isString()) { *s_phproot.getCheck() = string(v.asCStrRef().data()) + string("/"); } else { diff --git a/hphp/runtime/debugger/dummy_sandbox.cpp b/hphp/runtime/debugger/dummy_sandbox.cpp index 8e02a30ab..150dd324a 100644 --- a/hphp/runtime/debugger/dummy_sandbox.cpp +++ b/hphp/runtime/debugger/dummy_sandbox.cpp @@ -91,6 +91,8 @@ struct CLISession : private boost::noncopyable { } +static const StaticString s__SERVER("_SERVER"); + void DummySandbox::run() { TRACE(2, "DummySandbox::run\n"); ThreadInfo *ti = ThreadInfo::s_threadInfo.getNoCheck(); @@ -103,7 +105,7 @@ void DummySandbox::run() { DSandboxInfo sandbox = m_proxy->getSandbox(); string msg; if (sandbox.valid()) { - SystemGlobals *g = (SystemGlobals *)get_global_variables(); + GlobalVariables *g = get_global_variables(); SourceRootInfo sri(sandbox.m_user, sandbox.m_name); if (sandbox.m_path.empty()) { sandbox.m_path = sri.path(); @@ -112,7 +114,7 @@ void DummySandbox::run() { msg = "Invalid sandbox was specified. " "PHP files may not be loaded properly.\n"; } else { - sri.setServerVariables(g->GV(_SERVER)); + sri.setServerVariables(g->getRef(s__SERVER)); } Debugger::RegisterSandbox(sandbox); g_context->setSandboxId(sandbox.id()); diff --git a/hphp/runtime/ext/ext_options.cpp b/hphp/runtime/ext/ext_options.cpp index 002cb041e..a1a5f540a 100644 --- a/hphp/runtime/ext/ext_options.cpp +++ b/hphp/runtime/ext/ext_options.cpp @@ -467,8 +467,9 @@ Array f_getopt(CStrRef options, CVarRef longopts /* = null_variant */) { opts->need_param = 0; opts->opt_name = NULL; - SystemGlobals *g = (SystemGlobals*)get_global_variables(); - Array vargv = g->GV(argv).toArray(); + static const StaticString s_argv("argv"); + GlobalVariables *g = get_global_variables(); + Array vargv = g->get(s_argv).toArray(); int argc = vargv.size(); char **argv = (char **)malloc((argc+1) * sizeof(char*)); vector holders; diff --git a/hphp/runtime/ext/ext_session.cpp b/hphp/runtime/ext/ext_session.cpp index fed009dce..be8351ae7 100644 --- a/hphp/runtime/ext/ext_session.cpp +++ b/hphp/runtime/ext/ext_session.cpp @@ -277,11 +277,17 @@ static void bin_to_readable(CStrRef in, StringBuffer &out, char nbits) { } } -static const StaticString s_REMOTE_ADDR("REMOTE_ADDR"); +static const StaticString + s_REMOTE_ADDR("REMOTE_ADDR"), + s__SERVER("_SERVER"), + s__SESSION("_SESSION"), + s__COOKIE("_COOKIE"), + s__GET("_GET"), + s__POST("_POST"); String SessionModule::create_sid() { - SystemGlobals *g = (SystemGlobals*)get_global_variables(); - String remote_addr = g->GV(_SERVER)[s_REMOTE_ADDR].toString(); + GlobalVariables *g = get_global_variables(); + String remote_addr = g->get(s__SERVER)[s_REMOTE_ADDR].toString(); struct timeval tv; gettimeofday(&tv, NULL); @@ -794,8 +800,8 @@ public: virtual String encode() { StringBuffer buf; - SystemGlobals *g = (SystemGlobals*)get_global_variables(); - for (ArrayIter iter(g->GV(_SESSION)); iter; ++iter) { + GlobalVariables *g = get_global_variables(); + for (ArrayIter iter(g->get(s__SESSION)); iter; ++iter) { Variant key = iter.first(); if (key.isString()) { String skey = key.toString(); @@ -813,7 +819,7 @@ public: virtual bool decode(CStrRef value) { const char *endptr = value.data() + value.size(); - SystemGlobals *g = (SystemGlobals*)get_global_variables(); + GlobalVariables *g = get_global_variables(); for (const char *p = value.data(); p < endptr; ) { int namelen = ((unsigned char)(*p)) & (~PS_BIN_UNDEF); if (namelen < 0 || namelen > PS_BIN_MAX || (p + namelen) >= endptr) { @@ -826,7 +832,7 @@ public: if (has_value) { VariableUnserializer vu(p, endptr, VariableUnserializer::Serialize); try { - g->GV(_SESSION).set(key, vu.unserialize()); + g->getRef(s__SESSION).set(key, vu.unserialize()); p = vu.head(); } catch (Exception &e) { } @@ -846,8 +852,8 @@ public: virtual String encode() { StringBuffer buf; - SystemGlobals *g = (SystemGlobals*)get_global_variables(); - for (ArrayIter iter(g->GV(_SESSION)); iter; ++iter) { + GlobalVariables *g = get_global_variables(); + for (ArrayIter iter(g->get(s__SESSION)); iter; ++iter) { Variant key = iter.first(); if (key.isString()) { String skey = key.toString(); @@ -867,7 +873,7 @@ public: virtual bool decode(CStrRef value) { const char *p = value.data(); const char *endptr = value.data() + value.size(); - SystemGlobals *g = (SystemGlobals*)get_global_variables(); + GlobalVariables *g = get_global_variables(); while (p < endptr) { const char *q = p; while (*q != PS_DELIMITER) { @@ -886,7 +892,7 @@ public: if (has_value) { VariableUnserializer vu(q, endptr, VariableUnserializer::Serialize); try { - g->GV(_SESSION).set(key, vu.unserialize()); + g->getRef(s__SESSION).set(key, vu.unserialize()); q = vu.head(); } catch (Exception &e) { } @@ -1023,8 +1029,8 @@ new_session: */ /* Unconditionally destroy existing arrays -- possible dirty data */ - SystemGlobals *g = (SystemGlobals*)get_global_variables(); - g->GV(_SESSION) = Array::Create(); + GlobalVariables *g = get_global_variables(); + g->getRef(s__SESSION) = Array::Create(); PS(invalid_session_id) = false; String value; @@ -1192,8 +1198,8 @@ static inline void strcpy_gmt(char *ubuf, time_t *when) { static const StaticString s_PATH_TRANSLATED("PATH_TRANSLATED"); static inline void last_modified() { - SystemGlobals *g = (SystemGlobals*)get_global_variables(); - String path = g->GV(_SERVER)[s_PATH_TRANSLATED].toString(); + GlobalVariables *g = get_global_variables(); + String path = g->get(s__SERVER)[s_PATH_TRANSLATED].toString(); if (!path.empty()) { struct stat sb; if (stat(path.data(), &sb) == -1) { @@ -1500,25 +1506,25 @@ bool f_session_start() { * Cookies are preferred, because initially * cookie and get variables will be available. */ - SystemGlobals *g = (SystemGlobals*)get_global_variables(); + GlobalVariables *g = get_global_variables(); if (PS(id).empty()) { if (PS(use_cookies) && - g->GV(_COOKIE).toArray().exists(String(PS(session_name)))) { - PS(id) = g->GV(_COOKIE)[String(PS(session_name))].toString(); + g->get(s__COOKIE).toArray().exists(String(PS(session_name)))) { + PS(id) = g->get(s__COOKIE)[String(PS(session_name))].toString(); PS(apply_trans_sid) = 0; PS(send_cookie) = 0; PS(define_sid) = 0; } if (!PS(use_only_cookies) && !PS(id) && - g->GV(_GET).toArray().exists(String(PS(session_name)))) { - PS(id) = g->GV(_GET)[String(PS(session_name))].toString(); + g->get(s__GET).toArray().exists(String(PS(session_name)))) { + PS(id) = g->get(s__GET)[String(PS(session_name))].toString(); PS(send_cookie) = 0; } if (!PS(use_only_cookies) && !PS(id) && - g->GV(_POST).toArray().exists(String(PS(session_name)))) { - PS(id) = g->GV(_POST)[String(PS(session_name))].toString(); + g->get(s__POST).toArray().exists(String(PS(session_name)))) { + PS(id) = g->get(s__POST)[String(PS(session_name))].toString(); PS(send_cookie) = 0; } } @@ -1529,7 +1535,7 @@ bool f_session_start() { '=' to allow URLs of the form http://yoursite/=/script.php */ if (!PS(use_only_cookies) && PS(id).empty()) { - value = g->GV(_SERVER)[s_REQUEST_URI].toString(); + value = g->get(s__SERVER)[s_REQUEST_URI].toString(); const char *p = strstr(value.data(), PS(session_name).c_str()); if (p && p[lensess] == '=') { p += lensess + 1; @@ -1544,7 +1550,7 @@ bool f_session_start() { /* check whether the current request was referred to by an external site which invalidates the previously found id */ if (!PS(id).empty() && PS(extern_referer_chk)[0] != '\0') { - value = g->GV(_SERVER)[s_HTTP_REFERER].toString(); + value = g->get(s__SERVER)[s_HTTP_REFERER].toString(); if (strstr(value.data(), PS(extern_referer_chk).c_str()) == NULL) { PS(id).reset(); PS(send_cookie) = 1; @@ -1607,8 +1613,8 @@ Variant f_session_unset() { if (PS(session_status) == Session::None) { return false; } - SystemGlobals *g = (SystemGlobals*)get_global_variables(); - g->GV(_SESSION).reset(); + GlobalVariables *g = get_global_variables(); + g->getRef(s__SESSION).reset(); return uninit_null(); } diff --git a/hphp/runtime/ext/ext_soap.cpp b/hphp/runtime/ext/ext_soap.cpp index 7a951c066..cab532992 100644 --- a/hphp/runtime/ext/ext_soap.cpp +++ b/hphp/runtime/ext/ext_soap.cpp @@ -1752,13 +1752,14 @@ static void model_to_string(sdlContentModelPtr model, StringBuffer &buf, // soap fault functions static const StaticString s_HTTP_USER_AGENT("HTTP_USER_AGENT"); +static const StaticString s__SERVER("_SERVER"); static void send_soap_server_fault(sdlFunctionPtr function, Variant fault, soapHeader *hdr) { USE_SOAP_GLOBAL; bool use_http_error_status = true; - SystemGlobals *g = (SystemGlobals*)get_global_variables(); - if (g->GV(_SERVER)[s_HTTP_USER_AGENT].toString() == "Shockwave Flash") { + GlobalVariables *g = get_global_variables(); + if (g->get(s__SERVER)[s_HTTP_USER_AGENT].toString() == "Shockwave Flash") { use_http_error_status = false; } if (use_http_error_status) { @@ -2091,9 +2092,9 @@ void c_SoapServer::t_handle(CStrRef request /* = null_string */) { } req = String(data, size, AttachLiteral); - SystemGlobals *g = (SystemGlobals*)get_global_variables(); - if (g->GV(_SERVER).toArray().exists(s_HTTP_CONTENT_ENCODING)) { - String encoding = g->GV(_SERVER)[s_HTTP_CONTENT_ENCODING]; + GlobalVariables *g = get_global_variables(); + if (g->get(s__SERVER).toArray().exists(s_HTTP_CONTENT_ENCODING)) { + String encoding = g->get(s__SERVER)[s_HTTP_CONTENT_ENCODING]; Variant ret; if (encoding == "gzip" || encoding == "x-gzip") { ret = f_gzinflate(String(data, size, AttachLiteral)); diff --git a/hphp/runtime/vm/name_value_table_wrapper.h b/hphp/runtime/vm/name_value_table_wrapper.h index 008570081..34add7532 100644 --- a/hphp/runtime/vm/name_value_table_wrapper.h +++ b/hphp/runtime/vm/name_value_table_wrapper.h @@ -74,6 +74,10 @@ public: // ArrayData implementation using ArrayData::addLval; using ArrayData::remove; + Variant& getRef(CStrRef k) { + return tvAsVariant(nvGet(k.get())); + } + virtual ssize_t vsize() const; virtual Variant getKey(ssize_t pos) const; virtual Variant getValue(ssize_t pos) const; @@ -148,18 +152,6 @@ private: class GlobalNameValueTableWrapper : public NameValueTableWrapper { public: explicit GlobalNameValueTableWrapper(NameValueTable* tab); - Variant gvm_argc; - Variant gvm_argv; - Variant gvm__SERVER; - Variant gvm__GET; - Variant gvm__POST; - Variant gvm__COOKIE; - Variant gvm__FILES; - Variant gvm__ENV; - Variant gvm__REQUEST; - Variant gvm__SESSION; - Variant gvm_HTTP_RAW_POST_DATA; - Variant gvm_http_response_header; Variant __realPropProxy; Variant __lvalProxy; diff --git a/hphp/system/class_map.cpp b/hphp/system/class_map.cpp index cb6cc30c8..6de8f3b6b 100644 --- a/hphp/system/class_map.cpp +++ b/hphp/system/class_map.cpp @@ -19046,8 +19046,8 @@ const char *g_class_map[] = { "CURLINFO_LOCAL_PORT", (const char *)&k_CURLINFO_LOCAL_PORT, (const char *)0xc /* KindOfInt64 */, "CURLOPT_TIMEOUT_MS", (const char *)&k_CURLOPT_TIMEOUT_MS, (const char *)0xc /* KindOfInt64 */, "CURLOPT_CONNECTTIMEOUT_MS", (const char *)&k_CURLOPT_CONNECTTIMEOUT_MS, (const char *)0xc /* KindOfInt64 */, - "SID", (const char *)((offsetof(SystemGlobals, k_SID) - offsetof(SystemGlobals, stgv_Variant)) / sizeof(Variant)), (const char *)1, - "PHP_SAPI", (const char *)((offsetof(SystemGlobals, k_PHP_SAPI) - offsetof(SystemGlobals, stgv_Variant)) / sizeof(Variant)), (const char *)1, + "SID", (const char *)((offsetof(GlobalVariables, k_SID) - offsetof(GlobalVariables, stgv_Variant)) / sizeof(Variant)), (const char *)1, + "PHP_SAPI", (const char *)((offsetof(GlobalVariables, k_PHP_SAPI) - offsetof(GlobalVariables, stgv_Variant)) / sizeof(Variant)), (const char *)1, NULL, // End of constants NULL, (const char *)0x10006000, "PDO", "", "", (const char *)0, (const char *)0,