diff --git a/hphp/runtime/base/preg.cpp b/hphp/runtime/base/preg.cpp index 89e91ee42..2001f8658 100644 --- a/hphp/runtime/base/preg.cpp +++ b/hphp/runtime/base/preg.cpp @@ -329,14 +329,12 @@ static pcre* pcre_get_compiled_regex(CStrRef regex, pcre_extra **extra, static inline void add_offset_pair(Variant &result, CStrRef str, int offset, const char *name) { - Array match_pair; - match_pair.append(str); - match_pair.append(offset); - - if (name) { - result.set(name, match_pair); - } - result.append(match_pair); + ArrayInit match_pair(2); + match_pair.set(str); + match_pair.set(offset); + Variant match_pair_v = match_pair.toVariant(); + if (name) result.set(String(name), match_pair_v); + result.append(match_pair_v); } static inline bool pcre_need_log_error(int pcre_code) { @@ -633,7 +631,7 @@ static Variant preg_match_impl(CStrRef pattern, CStrRef subject, String value(stringlist[i], offsets[(i<<1)+1] - offsets[i<<1], CopyString); if (subpat_names[i]) { - result_set.set(subpat_names[i], value); + result_set.set(String(subpat_names[i]), value); } result_set.append(value); } @@ -654,7 +652,7 @@ static Variant preg_match_impl(CStrRef pattern, CStrRef subject, String value(stringlist[i], offsets[(i<<1)+1] - offsets[i<<1], CopyString); if (subpat_names[i]) { - subpats->set(subpat_names[i], value); + subpats->set(String(subpat_names[i]), value); } subpats->append(value); } @@ -698,7 +696,7 @@ static Variant preg_match_impl(CStrRef pattern, CStrRef subject, if (subpats && global && subpats_order == PREG_PATTERN_ORDER) { for (i = 0; i < num_subpats; i++) { if (subpat_names[i]) { - subpats->set(subpat_names[i], match_sets[i]); + subpats->set(String(subpat_names[i]), match_sets[i]); } subpats->append(match_sets[i]); } diff --git a/hphp/runtime/base/program_functions.cpp b/hphp/runtime/base/program_functions.cpp index 27a295166..abfade84e 100644 --- a/hphp/runtime/base/program_functions.cpp +++ b/hphp/runtime/base/program_functions.cpp @@ -128,7 +128,7 @@ static void process_cmd_arguments(int argc, char **argv) { SystemGlobals *g = (SystemGlobals *)get_global_variables(); g->GV(argc) = argc; for (int i = 0; i < argc; i++) { - g->GV(argv).lvalAt() = argv[i]; + g->GV(argv).lvalAt() = String(argv[i]); } } @@ -439,6 +439,21 @@ 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_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; @@ -455,10 +470,10 @@ void execute_command_line_begin(int argc, char **argv, int xhprof) { SystemGlobals *g = (SystemGlobals *)get_global_variables(); process_env_variables(g->GV(_ENV)); - g->GV(_ENV).set("HPHP", 1); - g->GV(_ENV).set("HHVM", 1); + g->GV(_ENV).set(s_HPHP, 1); + g->GV(_ENV).set(s_HHVM, 1); if (RuntimeOption::EvalJit) { - g->GV(_ENV).set("HHVM_JIT", 1); + g->GV(_ENV).set(s_HHVM_JIT, 1); } process_cmd_arguments(argc, argv); @@ -466,18 +481,18 @@ void execute_command_line_begin(int argc, char **argv, int xhprof) { Variant &server = g->GV(_SERVER); process_env_variables(server); time_t now = time(nullptr); - server.set("REQUEST_START_TIME", now); - server.set("REQUEST_TIME", now); - server.set("DOCUMENT_ROOT", ""); - server.set("SCRIPT_FILENAME", argv[0]); - server.set("SCRIPT_NAME", argv[0]); - server.set("PHP_SELF", argv[0]); - server.set("argv", g->GV(argv)); - server.set("argc", g->GV(argc)); - server.set("PWD", g_context->getCwd()); + server.set(s_REQUEST_START_TIME, now); + server.set(s_REQUEST_TIME, now); + server.set(s_DOCUMENT_ROOT, empty_string); + server.set(s_SCRIPT_FILENAME, argv[0]); + server.set(s_SCRIPT_NAME, argv[0]); + server.set(s_PHP_SELF, argv[0]); + server.set(s_argv, g->GV(argv)); + server.set(s_argc, g->GV(argc)); + server.set(s_PWD, g_context->getCwd()); char hostname[1024]; if (!gethostname(hostname, 1024)) { - server.set("HOSTNAME", String(hostname, CopyString)); + server.set(s_HOSTNAME, String(hostname, CopyString)); } for(std::map::iterator it = diff --git a/hphp/runtime/base/server/http_protocol.cpp b/hphp/runtime/base/server/http_protocol.cpp index 040e981aa..6b2718d03 100644 --- a/hphp/runtime/base/server/http_protocol.cpp +++ b/hphp/runtime/base/server/http_protocol.cpp @@ -73,6 +73,51 @@ const VirtualHost *HttpProtocol::GetVirtualHost(Transport *transport) { return VirtualHost::GetCurrent(); } +static const StaticString + s_REQUEST_START_TIME("REQUEST_START_TIME"), + s_HPHP("HPHP"), + s_HHVM("HHVM"), + s_HHVM_JIT("HHVM_JIT"), + s_HPHP_SERVER("HPHP_SERVER"), + s_HPHP_HOTPROFILER("HPHP_HOTPROFILER"), + s_HTTP_HOST("HTTP_HOST"), + s_CONTENT_TYPE("CONTENT_TYPE"), + s_CONTENT_LENGTH("CONTENT_LENGTH"), + s_PHP_AUTH_USER("PHP_AUTH_USER"), + s_PHP_AUTH_PW("PHP_AUTH_PW"), + s_REQUEST_URI("REQUEST_URI"), + s_SCRIPT_URL("SCRIPT_URL"), + s_SCRIPT_URI("SCRIPT_URI"), + s_SCRIPT_NAME("SCRIPT_NAME"), + s_PHP_SELF("PHP_SELF"), + s_SCRIPT_FILENAME("SCRIPT_FILENAME"), + s_PATH_TRANSLATED("PATH_TRANSLATED"), + s_PATH_INFO("PATH_INFO"), + s_argc("argc"), + s_argv("argv"), + s_GATEWAY_INTERFACE("GATEWAY_INTERFACE"), + s_CGI_1_1("CGI/1.1"), + s_SERVER_ADDR("SERVER_ADDR"), + s_SERVER_NAME("SERVER_NAME"), + s_SERVER_PORT("SERVER_PORT"), + s_SERVER_SOFTWARE("SERVER_SOFTWARE"), + s_SERVER_PROTOCOL("SERVER_PROTOCOL"), + s_SERVER_ADMIN("SERVER_ADMIN"), + s_SERVER_SIGNATURE("SERVER_SIGNATURE"), + s_REQUEST_METHOD("REQUEST_METHOD"), + s_GET("GET"), + s_HEAD("HEAD"), + s_POST("POST"), + s_HTTPS("HTTPS"), + s_1("1"), + s_REQUEST_TIME("REQUEST_TIME"), + s_QUERY_STRING("QUERY_STRING"), + s_REMOTE_ADDR("REMOTE_ADDR"), + s_REMOTE_HOST("REMOTE_HOST"), + s_REMOTE_PORT("REMOTE_PORT"), + s_DOCUMENT_ROOT("DOCUMENT_ROOT"), + s_THREAD_TYPE("THREAD_TYPE"); + /** * PHP has "EGPCS" processing order of these global variables, and this * order is important in preparing $_REQUEST that needs to know which to @@ -85,21 +130,21 @@ void HttpProtocol::PrepareSystemVariables(Transport *transport, const VirtualHost *vhost = VirtualHost::GetCurrent(); Variant &server = g->GV(_SERVER); - server.set("REQUEST_START_TIME", time(nullptr)); + server.set(s_REQUEST_START_TIME, time(nullptr)); // $_ENV process_env_variables(g->GV(_ENV)); - g->GV(_ENV).set("HPHP", 1); - g->GV(_ENV).set("HHVM", 1); + g->GV(_ENV).set(s_HPHP, 1); + g->GV(_ENV).set(s_HHVM, 1); if (RuntimeOption::EvalJit) { - g->GV(_ENV).set("HHVM_JIT", 1); + g->GV(_ENV).set(s_HHVM_JIT, 1); } bool isServer = RuntimeOption::serverExecutionMode(); if (isServer) { - g->GV(_ENV).set("HPHP_SERVER", 1); + g->GV(_ENV).set(s_HPHP_SERVER, 1); #ifdef HOTPROFILER - g->GV(_ENV).set("HPHP_HOTPROFILER", 1); + g->GV(_ENV).set(s_HPHP_HOTPROFILER, 1); #endif } @@ -235,7 +280,7 @@ void HttpProtocol::PrepareSystemVariables(Transport *transport, String hostName(VirtualHost::GetCurrent()->serverName(host)); string hostHeader(host); if (hostHeader.empty()) { - server.set("HTTP_HOST", hostName); + server.set(s_HTTP_HOST, hostName); StackTraceNoHeap::AddExtraLogging("Server", hostName.data()); } else { StackTraceNoHeap::AddExtraLogging("Server", hostHeader.c_str()); @@ -251,10 +296,10 @@ void HttpProtocol::PrepareSystemVariables(Transport *transport, // APE sets CONTENT_TYPE and CONTENT_LENGTH without HTTP_ if (!contentType.empty()) { - server.set("CONTENT_TYPE", String(contentType)); + server.set(s_CONTENT_TYPE, String(contentType)); } if (!contentLength.empty()) { - server.set("CONTENT_LENGTH", String(contentLength)); + server.set(s_CONTENT_LENGTH, String(contentLength)); } // APE processes Authorization: Basic into PHP_AUTH_USER and PHP_AUTH_PW @@ -267,14 +312,14 @@ void HttpProtocol::PrepareSystemVariables(Transport *transport, StringUtil::Base64Decode(String(authorization.c_str() + 6)); int colonPos = decodedAuth.find(':'); if (colonPos != String::npos) { - server.set("PHP_AUTH_USER", decodedAuth.substr(0, colonPos)); - server.set("PHP_AUTH_PW", decodedAuth.substr(colonPos + 1)); + server.set(s_PHP_AUTH_USER, decodedAuth.substr(0, colonPos)); + server.set(s_PHP_AUTH_PW, decodedAuth.substr(colonPos + 1)); } } } - server.set("REQUEST_URI", String(transport->getUrl(), CopyString)); - server.set("SCRIPT_URL", r.originalURL()); + server.set(s_REQUEST_URI, String(transport->getUrl(), CopyString)); + server.set(s_SCRIPT_URL, r.originalURL()); String prefix(transport->isSSL() ? "https://" : "http://"); String port_suffix(""); @@ -282,7 +327,7 @@ void HttpProtocol::PrepareSystemVariables(Transport *transport, if (!transport->isSSL() && RuntimeOption::ServerPort != 80) { port_suffix = ":" + RuntimeOption::ServerPort; } - server.set("SCRIPT_URI", + server.set(s_SCRIPT_URI, String(prefix + (hostHeader.empty() ? hostName + port_suffix : String(hostHeader)) + r.originalURL())); @@ -301,57 +346,57 @@ void HttpProtocol::PrepareSystemVariables(Transport *transport, } name += String(RuntimeOption::DefaultDocument); } - server.set("SCRIPT_NAME", name); + server.set(s_SCRIPT_NAME, name); } else { - server.set("SCRIPT_NAME", r.resolvedURL()); + server.set(s_SCRIPT_NAME, r.resolvedURL()); } if (!r.rewritten() && r.pathInfo().empty()) { - server.set("PHP_SELF", r.resolvedURL()); + server.set(s_PHP_SELF, r.resolvedURL()); } else { // when URL is rewritten, or pathinfo is not empty, use original URL - server.set("PHP_SELF", r.originalURL()); + server.set(s_PHP_SELF, r.originalURL()); } - server.set("SCRIPT_FILENAME", r.absolutePath()); + server.set(s_SCRIPT_FILENAME, r.absolutePath()); if (r.pathInfo().empty()) { - server.set("PATH_TRANSLATED", r.absolutePath()); + server.set(s_PATH_TRANSLATED, r.absolutePath()); } else { - server.set("PATH_TRANSLATED", + server.set(s_PATH_TRANSLATED, String(vhost->getDocumentRoot() + r.pathInfo().data())); - server.set("PATH_INFO", r.pathInfo()); + server.set(s_PATH_INFO, r.pathInfo()); } - server.set("argv", r.queryString()); - server.set("argc", 0); - server.set("GATEWAY_INTERFACE", "CGI/1.1"); - server.set("SERVER_ADDR", String(RuntimeOption::ServerPrimaryIP)); - server.set("SERVER_NAME", hostName); - server.set("SERVER_PORT", RuntimeOption::ServerPort); - server.set("SERVER_SOFTWARE", "HPHP"); - server.set("SERVER_PROTOCOL", "HTTP/" + transport->getHTTPVersion()); - server.set("SERVER_ADMIN", ""); - server.set("SERVER_SIGNATURE", ""); + server.set(s_argv, r.queryString()); + server.set(s_argc, 0); + server.set(s_GATEWAY_INTERFACE, s_CGI_1_1); + server.set(s_SERVER_ADDR, String(RuntimeOption::ServerPrimaryIP)); + server.set(s_SERVER_NAME, hostName); + server.set(s_SERVER_PORT, RuntimeOption::ServerPort); + server.set(s_SERVER_SOFTWARE, s_HPHP); + server.set(s_SERVER_PROTOCOL, "HTTP/" + transport->getHTTPVersion()); + server.set(s_SERVER_ADMIN, empty_string); + server.set(s_SERVER_SIGNATURE, empty_string); switch (transport->getMethod()) { - case Transport::GET: server.set("REQUEST_METHOD", "GET"); break; - case Transport::HEAD: server.set("REQUEST_METHOD", "HEAD"); break; + case Transport::GET: server.set(s_REQUEST_METHOD, s_GET); break; + case Transport::HEAD: server.set(s_REQUEST_METHOD, s_HEAD); break; case Transport::POST: if (transport->getExtendedMethod() == nullptr) { - server.set("REQUEST_METHOD", "POST"); + server.set(s_REQUEST_METHOD, s_POST); } else { - server.set("REQUEST_METHOD", transport->getExtendedMethod()); + server.set(s_REQUEST_METHOD, transport->getExtendedMethod()); } break; - default: server.set("REQUEST_METHOD", ""); break; + default: server.set(s_REQUEST_METHOD, empty_string); break; } - server.set("HTTPS", transport->isSSL() ? "1" : ""); - server.set("REQUEST_TIME", time(nullptr)); - server.set("QUERY_STRING", r.queryString()); + server.set(s_HTTPS, transport->isSSL() ? s_1 : empty_string); + server.set(s_REQUEST_TIME, time(nullptr)); + server.set(s_QUERY_STRING, r.queryString()); - server.set("REMOTE_ADDR", String(transport->getRemoteHost(), CopyString)); - server.set("REMOTE_HOST", ""); // I don't think we need to nslookup - server.set("REMOTE_PORT", transport->getRemotePort()); + server.set(s_REMOTE_ADDR, String(transport->getRemoteHost(), CopyString)); + server.set(s_REMOTE_HOST, empty_string); // I don't think we need to nslookup + server.set(s_REMOTE_PORT, transport->getRemotePort()); - server.set("DOCUMENT_ROOT", String(vhost->getDocumentRoot())); + server.set(s_DOCUMENT_ROOT, String(vhost->getDocumentRoot())); for (map::const_iterator iter = RuntimeOption::ServerVariables.begin(); @@ -367,7 +412,7 @@ void HttpProtocol::PrepareSystemVariables(Transport *transport, sri.setServerVariables(server); const char *threadType = transport->getThreadTypeName(); - server.set("THREAD_TYPE", threadType); + server.set(s_THREAD_TYPE, threadType); StackTraceNoHeap::AddExtraLogging("ThreadType", threadType); } diff --git a/hphp/runtime/base/server/rpc_request_handler.cpp b/hphp/runtime/base/server/rpc_request_handler.cpp index 23bf1d300..97ffad4d8 100644 --- a/hphp/runtime/base/server/rpc_request_handler.cpp +++ b/hphp/runtime/base/server/rpc_request_handler.cpp @@ -152,8 +152,10 @@ void RPCRequestHandler::handleRequest(Transport *transport) { HttpProtocol::ClearRecord(ret, tmpfile); } -static const StaticString s_output("output"); -static const StaticString s_return("return"); +static const StaticString + s_output("output"), + s_return("return"), + s_HPHP_RPC("HPHP_RPC"); bool RPCRequestHandler::executePHPFunction(Transport *transport, SourceRootInfo &sourceRootInfo) { @@ -166,7 +168,7 @@ bool RPCRequestHandler::executePHPFunction(Transport *transport, RequestURI reqURI(rpcFunc); HttpProtocol::PrepareSystemVariables(transport, reqURI, sourceRootInfo); SystemGlobals *g = (SystemGlobals*)get_global_variables(); - g->GV(_ENV).set("HPHP_RPC", 1); + g->GV(_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 fc4f0d659..2a87f5712 100644 --- a/hphp/runtime/base/server/source_root_info.cpp +++ b/hphp/runtime/base/server/source_root_info.cpp @@ -247,10 +247,12 @@ string SourceRootInfo::path() const { } } +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("PHP_ROOT"); + Variant v = server.rvalAt(s_PHP_ROOT); if (v.isString()) { *s_phproot.getCheck() = string(v.asCStrRef().data()) + string("/"); } else { diff --git a/hphp/runtime/base/server/xbox_server.cpp b/hphp/runtime/base/server/xbox_server.cpp index 3c6ebf8e3..8b8b0893c 100644 --- a/hphp/runtime/base/server/xbox_server.cpp +++ b/hphp/runtime/base/server/xbox_server.cpp @@ -31,7 +31,7 @@ namespace HPHP { class XboxTransport : public Transport, public Synchronizable { public: - XboxTransport(CStrRef message, CStrRef reqInitDoc = "") + explicit XboxTransport(CStrRef message, CStrRef reqInitDoc = "") : m_refCount(0), m_done(false), m_code(0) { gettime(CLOCK_MONOTONIC, &m_queueTime); @@ -239,6 +239,11 @@ static bool isLocalHost(CStrRef host) { return host.empty() || host == "localhost" || host == "127.0.0.1"; } +static const StaticString + s_code("code"), + s_response("response"), + s_error("error"); + bool XboxServer::SendMessage(CStrRef message, Variant &ret, int timeout_ms, CStrRef host /* = "localhost" */) { if (isLocalHost(host)) { @@ -262,11 +267,11 @@ bool XboxServer::SendMessage(CStrRef message, Variant &ret, int timeout_ms, job->decRefCount(); // i'm done with this job if (code > 0) { - ret.set("code", code); + ret.set(s_code, code); if (code == 200) { - ret.set("response", unserialize_from_string(response)); + ret.set(s_response, unserialize_from_string(response)); } else { - ret.set("error", response); + ret.set(s_error, response); } return true; } @@ -294,17 +299,17 @@ bool XboxServer::SendMessage(CStrRef message, Variant &ret, int timeout_ms, int len = 0; char *response = http->recv(len); String sresponse(response, len, AttachString); - ret.set("code", code); + ret.set(s_code, code); if (code == 200) { - ret.set("response", unserialize_from_string(sresponse)); + ret.set(s_response, unserialize_from_string(sresponse)); } else { - ret.set("error", sresponse); + ret.set(s_error, sresponse); } return true; } // code wasn't correctly set by http client, treat it as not found - ret.set("code", 404); - ret.set("error", "http client failed"); + ret.set(s_code, 404); + ret.set(s_error, "http client failed"); } } diff --git a/hphp/runtime/base/type_variant.cpp b/hphp/runtime/base/type_variant.cpp index 525fbdbd5..415f8b3ae 100644 --- a/hphp/runtime/base/type_variant.cpp +++ b/hphp/runtime/base/type_variant.cpp @@ -291,10 +291,6 @@ HOT_FUNC IMPLEMENT_SET(bool, m_type = KindOfBoolean; m_data.num = v) IMPLEMENT_SET(int, m_type = KindOfInt64; m_data.num = v) HOT_FUNC IMPLEMENT_SET(int64_t, m_type = KindOfInt64; m_data.num = v) IMPLEMENT_SET(double, m_type = KindOfDouble; m_data.dbl = v) -IMPLEMENT_SET(litstr, - m_type = KindOfString; - m_data.pstr = NEW(StringData)(v); - m_data.pstr->incRefCount()) IMPLEMENT_SET(const StaticString&, StringData* s = v.get(); assert(s); @@ -1279,7 +1275,7 @@ Variant &Variant::operator++() { case KindOfString: { if (getStringData()->empty()) { - set("1"); + set(s_1); } else { int64_t lval; double dval; DataType ret = convertToNumeric(&lval, &dval); @@ -1914,11 +1910,6 @@ Variant Variant::rvalAtHelper(int64_t offset, ACCESSPARAMS_IMPL) const { return null_variant; } -Variant Variant::rvalAt(litstr offset, ACCESSPARAMS_IMPL) const { - String key(offset); - return rvalAt(key, flags); -} - Variant Variant::rvalAt(CStrRef offset, ACCESSPARAMS_IMPL) const { if (m_type == KindOfArray) { bool error = flags & AccessFlags::Error; @@ -2068,11 +2059,6 @@ CVarRef Variant::rvalRef(double offset, CVarRef tmp, ACCESSPARAMS_IMPL) const { return rvalRefHelper(offset, tmp, flags); } -CVarRef Variant::rvalRef(litstr offset, CVarRef tmp, ACCESSPARAMS_IMPL) const { - String key(offset); - return rvalRef(key, tmp, flags); -} - CVarRef Variant::rvalRef(CStrRef offset, CVarRef tmp, ACCESSPARAMS_IMPL) const { if (m_type == KindOfArray) { bool error = flags & AccessFlags::Error; @@ -2252,10 +2238,6 @@ Variant &Variant::lvalAt(int64_t key, ACCESSPARAMS_IMPL) { Variant &Variant::lvalAt(double key, ACCESSPARAMS_IMPL) { return lvalAtImpl(key, flags); } -Variant &Variant::lvalAt(litstr ckey, ACCESSPARAMS_IMPL) { - String key(ckey); - return lvalAt(key, flags); -} Variant &Variant::lvalAt(CStrRef key, ACCESSPARAMS_IMPL) { return lvalAtImpl(key, flags); } @@ -2272,10 +2254,6 @@ Variant &Variant::lvalRef(int64_t key, Variant& tmp, ACCESSPARAMS_IMPL) { Variant &Variant::lvalRef(double key, Variant& tmp, ACCESSPARAMS_IMPL) { return LvalAtImpl0(this, key, &tmp, false, flags); } -Variant &Variant::lvalRef(litstr ckey, Variant& tmp, ACCESSPARAMS_IMPL) { - String key(ckey); - return lvalRef(key, tmp, flags); -} Variant &Variant::lvalRef(CStrRef key, Variant& tmp, ACCESSPARAMS_IMPL) { return Variant::LvalAtImpl0(this, key, &tmp, false, flags); } diff --git a/hphp/runtime/base/type_variant.h b/hphp/runtime/base/type_variant.h index efe79dffe..9058517ac 100644 --- a/hphp/runtime/base/type_variant.h +++ b/hphp/runtime/base/type_variant.h @@ -802,7 +802,7 @@ class Variant : private TypedValue { return rvalAtHelper(offset, flags); } Variant rvalAt(double offset, ACCESSPARAMS_DECL) const; - Variant rvalAt(litstr offset, ACCESSPARAMS_DECL) const; + Variant rvalAt(litstr offset, ACCESSPARAMS_DECL) const = delete; Variant rvalAt(CStrRef offset, ACCESSPARAMS_DECL) const; Variant rvalAt(CVarRef offset, ACCESSPARAMS_DECL) const; @@ -819,7 +819,7 @@ class Variant : private TypedValue { return rvalRefHelper(offset, tmp, flags); } CVarRef rvalRef(double offset, CVarRef tmp, ACCESSPARAMS_DECL) const; - CVarRef rvalRef(litstr offset, CVarRef tmp, ACCESSPARAMS_DECL) const; + CVarRef rvalRef(litstr offset, CVarRef tmp, ACCESSPARAMS_DECL) const = delete; CVarRef rvalRef(CStrRef offset, CVarRef tmp, ACCESSPARAMS_DECL) const; CVarRef rvalRef(CVarRef offset, CVarRef tmp, ACCESSPARAMS_DECL) const; @@ -873,14 +873,14 @@ class Variant : private TypedValue { Variant &lvalAt(int key, ACCESSPARAMS_DECL); Variant &lvalAt(int64_t key, ACCESSPARAMS_DECL); Variant &lvalAt(double key, ACCESSPARAMS_DECL); - Variant &lvalAt(litstr key, ACCESSPARAMS_DECL); + Variant &lvalAt(litstr key, ACCESSPARAMS_DECL) = delete; Variant &lvalAt(CStrRef key, ACCESSPARAMS_DECL); Variant &lvalAt(CVarRef key, ACCESSPARAMS_DECL); Variant &lvalRef(int key, Variant& tmp, ACCESSPARAMS_DECL); Variant &lvalRef(int64_t key, Variant& tmp, ACCESSPARAMS_DECL); Variant &lvalRef(double key, Variant& tmp, ACCESSPARAMS_DECL); - Variant &lvalRef(litstr key, Variant& tmp, ACCESSPARAMS_DECL); + Variant &lvalRef(litstr key, Variant& tmp, ACCESSPARAMS_DECL) = delete; Variant &lvalRef(CStrRef key, Variant& tmp, ACCESSPARAMS_DECL); Variant &lvalRef(CVarRef key, Variant& tmp, ACCESSPARAMS_DECL); @@ -907,9 +907,7 @@ class Variant : private TypedValue { CVarRef set(int key, CVarRef v) { return set((int64_t)key, v); } CVarRef set(int64_t key, CVarRef v); CVarRef set(double key, CVarRef v); - CVarRef set(litstr key, CVarRef v, bool isString = false) { - return set(String(key), v, isString); - } + CVarRef set(litstr key, CVarRef v, bool isString = false) = delete; CVarRef set(CStrRef key, CVarRef v, bool isString = false); CVarRef set(CVarRef key, CVarRef v); @@ -918,18 +916,14 @@ class Variant : private TypedValue { CVarRef setRef(int key, CVarRef v) { return setRef((int64_t)key, v); } CVarRef setRef(int64_t key, CVarRef v); CVarRef setRef(double key, CVarRef v); - CVarRef setRef(litstr key, CVarRef v, bool isString = false) { - return setRef(String(key), v, isString); - } + CVarRef setRef(litstr key, CVarRef v, bool isString = false) = delete; CVarRef setRef(CStrRef key, CVarRef v, bool isString = false); CVarRef setRef(CVarRef key, CVarRef v); CVarRef set(int key, RefResult v) { return setRef(key, variant(v)); } CVarRef set(int64_t key, RefResult v) { return setRef(key, variant(v)); } CVarRef set(double key, RefResult v) { return setRef(key, variant(v)); } - CVarRef set(litstr key, RefResult v, bool isString = false) { - return setRef(key, variant(v), isString); - } + CVarRef set(litstr key, RefResult v, bool isString = false) = delete; CVarRef set(CStrRef key, RefResult v, bool isString = false) { return setRef(key, variant(v), isString); } @@ -941,9 +935,7 @@ class Variant : private TypedValue { void remove(int key) { removeImpl((int64_t)key);} void remove(int64_t key) { removeImpl(key);} void remove(double key) { removeImpl(key);} - void remove(litstr key, bool isString = false) { - remove(String(key), isString); - } + void remove(litstr key, bool isString = false) = delete; void remove(CStrRef key, bool isString = false) { removeImpl(key, isString); } @@ -1129,7 +1121,7 @@ class Variant : private TypedValue { CVarRef set(int v); CVarRef set(int64_t v); CVarRef set(double v); - CVarRef set(litstr v); + CVarRef set(litstr v) = delete; CVarRef set(const std::string & v) { return set(String(v)); } @@ -1449,8 +1441,8 @@ public: return asVariant()->isNull(); } private: - /* implicit */ VarNR(litstr v); // not implemented - /* implicit */ VarNR(const std::string & v); // not implemented + /* implicit */ VarNR(litstr v) = delete; + /* implicit */ VarNR(const std::string & v) = delete; void init(DataType dt) { m_type = dt; diff --git a/hphp/runtime/ext/ext_function.cpp b/hphp/runtime/ext/ext_function.cpp index 1f1e62cf0..331d5e4f9 100644 --- a/hphp/runtime/ext/ext_function.cpp +++ b/hphp/runtime/ext/ext_function.cpp @@ -49,6 +49,10 @@ bool f_function_exists(CStrRef function_name, bool autoload /* = true */) { function_exists(function_name)); } +static const StaticString + s__invoke("__invoke"), + s_Closure__invoke("Closure::__invoke"); + bool f_is_callable(CVarRef v, bool syntax /* = false */, VRefParam name /* = null */) { bool ret = true; @@ -107,13 +111,11 @@ bool f_is_callable(CVarRef v, bool syntax /* = false */, if (Variant::GetAccessorType(tv_func) == KindOfObject) { ObjectData *d = Variant::GetObjectData(tv_func); - static const StringData* sd__invoke - = StringData::GetStaticString("__invoke"); - const Func* invoke = d->getVMClass()->lookupMethod(sd__invoke); + const Func* invoke = d->getVMClass()->lookupMethod(s__invoke.get()); if (name.isReferenced()) { if (d->instanceof(c_Closure::s_cls)) { // Hack to stop the mangled name from showing up - name = "Closure::__invoke"; + name = s_Closure__invoke; } else { name = d->o_getClassName() + "::__invoke"; } @@ -124,7 +126,8 @@ bool f_is_callable(CVarRef v, bool syntax /* = false */, return false; } -Variant f_call_user_func(int _argc, CVarRef function, CArrRef _argv /* = null_array */) { +Variant f_call_user_func(int _argc, CVarRef function, + CArrRef _argv /* = null_array */) { return vm_call_user_func(function, _argv); } @@ -165,9 +168,9 @@ String f_call_user_func_serialized(CStrRef input) { Variant out; try { Variant in = unserialize_from_string(input); - out.set("ret", vm_call_user_func(in[s_func], in[s_args])); + out.set(s_ret, vm_call_user_func(in[s_func], in[s_args])); } catch (Object &e) { - out.set("exception", e); + out.set(s_exception, e); } return f_serialize(out); } diff --git a/hphp/runtime/ext/ext_ipc.cpp b/hphp/runtime/ext/ext_ipc.cpp index f3ba0f037..e045776ad 100644 --- a/hphp/runtime/ext/ext_ipc.cpp +++ b/hphp/runtime/ext/ext_ipc.cpp @@ -260,7 +260,7 @@ bool f_msg_receive(CObjRef queue, int64_t desiredmsgtype, VRefParam msgtype, return false; } } else { - message = (const char *)MSGBUF_MTEXT(buffer); + message = String((const char *)MSGBUF_MTEXT(buffer)); } return true; diff --git a/hphp/runtime/ext/ext_pdo.cpp b/hphp/runtime/ext/ext_pdo.cpp index 4befecd39..a1c3abec6 100644 --- a/hphp/runtime/ext/ext_pdo.cpp +++ b/hphp/runtime/ext/ext_pdo.cpp @@ -1670,7 +1670,7 @@ static inline void fetch_value(sp_PDOStatement stmt, Variant &dest, int colno, dest = dest.toString(); } if (dest.isNull() && stmt->dbh->oracle_nulls == PDO_NULL_TO_STRING) { - dest = ""; + dest = empty_string; } } diff --git a/hphp/runtime/ext/ext_socket.cpp b/hphp/runtime/ext/ext_socket.cpp index 7e4722235..e32be48e5 100644 --- a/hphp/runtime/ext/ext_socket.cpp +++ b/hphp/runtime/ext/ext_socket.cpp @@ -842,6 +842,10 @@ Variant f_socket_recv(CObjRef socket, VRefParam buf, int len, int flags) { return retval; } +static const StaticString + s_2colons("::"), + s_0_0_0_0("0.0.0.0"); + Variant f_socket_recvfrom(CObjRef socket, VRefParam buf, int len, int flags, VRefParam name, VRefParam port /* = 0 */) { if (len <= 0) { @@ -893,7 +897,7 @@ Variant f_socket_recvfrom(CObjRef socket, VRefParam buf, int len, int flags, name = String(Util::safe_inet_ntoa(sin.sin_addr)); if (name.toString().empty()) { - name = "0.0.0.0"; + name = s_0_0_0_0; } port = ntohs(sin.sin_port); } @@ -922,7 +926,7 @@ Variant f_socket_recvfrom(CObjRef socket, VRefParam buf, int len, int flags, if (succ) { name = String(addr6, CopyString); } else { - name = "::"; + name = s_2colons; } port = ntohs(sin6.sin6_port); } diff --git a/hphp/test/test_cpp_base.cpp b/hphp/test/test_cpp_base.cpp index 854e6315d..4c186e830 100644 --- a/hphp/test/test_cpp_base.cpp +++ b/hphp/test/test_cpp_base.cpp @@ -337,20 +337,20 @@ bool TestCppBase::TestArray() { } { Array arr; - arr.lvalAt(0) = "v1"; - arr.lvalAt(1) = "v2"; + arr.lvalAt(0) = String("v1"); + arr.lvalAt(1) = String("v2"); VS(arr, CREATE_VECTOR2("v1", "v2")); } { Array arr; - arr.lvalAt(s_n1) = "v1"; - arr.lvalAt(s_n2) = "v2"; + arr.lvalAt(s_n1) = String("v1"); + arr.lvalAt(s_n2) = String("v2"); VS(arr, CREATE_MAP2("n1", "v1", "n2", "v2")); } { Array arr; Variant name = "name"; - arr.lvalAt(name) = "value"; + arr.lvalAt(name) = String("value"); VS(arr, CREATE_MAP1("name", "value")); } { @@ -400,8 +400,8 @@ bool TestCppBase::TestArray() { // membership { Array arr; - arr.lvalAt(0) = "v1"; - arr.lvalAt(1) = "v2"; + arr.lvalAt(0) = String("v1"); + arr.lvalAt(1) = String("v2"); VERIFY(arr.exists(0)); arr.remove(0); VERIFY(!arr.exists(0)); @@ -412,28 +412,28 @@ bool TestCppBase::TestArray() { { static const StaticString s_0("0"); Array arr; - arr.lvalAt(0) = "v1"; + arr.lvalAt(0) = String("v1"); VERIFY(arr.exists(0)); arr.remove(String(s_0)); VERIFY(!arr.exists(0)); } { Array arr; - arr.lvalAt(0) = "v1"; + arr.lvalAt(0) = String("v1"); VERIFY(arr.exists(0)); arr.remove(Variant("0")); VERIFY(!arr.exists(0)); } { Array arr; - arr.lvalAt(0) = "v1"; + arr.lvalAt(0) = String("v1"); VERIFY(arr.exists(0)); arr.remove(Variant(Variant("0"))); VERIFY(!arr.exists(0)); } { Array arr; - arr.lvalAt(0) = "v1"; + arr.lvalAt(0) = String("v1"); VERIFY(arr.exists(0)); arr.remove(Variant(Variant(0.5))); VERIFY(!arr.exists(0)); @@ -447,8 +447,8 @@ bool TestCppBase::TestArray() { } { Array arr; - arr.lvalAt(s_n1) = "v1"; - arr.lvalAt(s_n2) = "v2"; + arr.lvalAt(s_n1) = String("v1"); + arr.lvalAt(s_n2) = String("v2"); VERIFY(arr.exists(s_n1)); arr.remove(s_n1); VERIFY(!arr.exists(s_n1)); @@ -458,17 +458,17 @@ bool TestCppBase::TestArray() { } { Array arr; - arr.lvalAt() = "test"; + arr.lvalAt() = String("test"); VS(arr, CREATE_VECTOR1("test")); } { Array arr; - arr.lvalAt(s_name) = "value"; + arr.lvalAt(s_name) = String("value"); VERIFY(arr.exists(s_name)); } { Array arr; - arr.lvalAt(1) = "value"; + arr.lvalAt(1) = String("value"); VERIFY(arr.exists(1)); VERIFY(arr.exists(1.5)); VERIFY(arr.exists(s_1)); @@ -478,7 +478,7 @@ bool TestCppBase::TestArray() { } { Array arr; - arr.lvalAt(s_1) = "value"; + arr.lvalAt(s_1) = String("value"); VERIFY(arr.exists(1)); VERIFY(arr.exists(1.5)); VERIFY(arr.exists(s_1)); @@ -488,7 +488,7 @@ bool TestCppBase::TestArray() { } { Array arr; - arr.lvalAt(1.5) = "value"; + arr.lvalAt(1.5) = String("value"); VERIFY(arr.exists(1)); VERIFY(arr.exists(1.5)); VERIFY(arr.exists(s_1)); @@ -498,7 +498,7 @@ bool TestCppBase::TestArray() { } { Array arr; - arr.lvalAt(Variant(1.5)) = "value"; + arr.lvalAt(Variant(1.5)) = String("value"); VERIFY(arr.exists(1)); VERIFY(arr.exists(1.5)); VERIFY(arr.exists(s_1)); @@ -508,7 +508,7 @@ bool TestCppBase::TestArray() { } { Array arr; - arr.lvalAt(Variant("1")) = "value"; + arr.lvalAt(Variant("1")) = String("value"); VERIFY(arr.exists(1)); VERIFY(arr.exists(1.5)); VERIFY(arr.exists(s_1)); @@ -657,19 +657,19 @@ bool TestCppBase::TestVariant() { } { Variant v; - v.lvalAt(0) = "v0"; - v.lvalAt(1) = "v1"; + v.lvalAt(0) = String("v0"); + v.lvalAt(1) = String("v1"); VERIFY(v[0] == "v0"); VERIFY(v[1] == "v1"); } { Variant v; - v.lvalAt() = "test"; + v.lvalAt() = String("test"); VS(v, CREATE_VECTOR1("test")); } { Variant v; - v.lvalAt(1) = "test"; + v.lvalAt(1) = String("test"); VS(v[1], "test"); VS(v[1.5], "test"); VS(v[Variant(1.5)], "test"); @@ -678,7 +678,7 @@ bool TestCppBase::TestVariant() { } { Variant v; - v.lvalAt(Variant(1.5)) = "test"; + v.lvalAt(Variant(1.5)) = String("test"); VS(v[1], "test"); VS(v[1.5], "test"); VS(v[Variant(1.5)], "test"); @@ -687,7 +687,7 @@ bool TestCppBase::TestVariant() { } { Variant v; - v.lvalAt(s_1) = "test"; + v.lvalAt(s_1) = String("test"); VS(v[1], "test"); VS(v[1.5], "test"); VS(v[Variant(1.5)], "test"); @@ -696,7 +696,7 @@ bool TestCppBase::TestVariant() { } { Variant v; - v.lvalAt(Variant("1")) = "test"; + v.lvalAt(Variant("1")) = String("test"); VS(v[1], "test"); VS(v[1.5], "test"); VS(v[Variant(1.5)], "test"); @@ -707,8 +707,8 @@ bool TestCppBase::TestVariant() { // membership { Variant v; - v.lvalAt(s_n0) = "v0"; - v.lvalAt(s_n1) = "v1"; + v.lvalAt(s_n0) = String("v0"); + v.lvalAt(s_n1) = String("v1"); v.remove(s_n1); VS(v, CREATE_MAP1(s_n0, "v0")); v.append("v2"); @@ -716,29 +716,29 @@ bool TestCppBase::TestVariant() { } { Variant v; - v.lvalAt(s_n0) = "v0"; - v.lvalAt(1) = "v1"; + v.lvalAt(s_n0) = String("v0"); + v.lvalAt(1) = String("v1"); v.remove(Variant(1.5)); VS(v, CREATE_MAP1("n0", "v0")); } { Variant v; - v.lvalAt(s_n0) = "v0"; - v.lvalAt(1) = "v1"; + v.lvalAt(s_n0) = String("v0"); + v.lvalAt(1) = String("v1"); v.remove(Variant("1")); VS(v, CREATE_MAP1("n0", "v0")); } { Variant v; - v.lvalAt(s_n0) = "v0"; - v.lvalAt(1) = "v1"; - v.remove("1"); + v.lvalAt(s_n0) = String("v0"); + v.lvalAt(1) = String("v1"); + v.remove(String("1")); VS(v, CREATE_MAP1("n0", "v0")); } { Variant v; - v.lvalAt(s_n0) = "v0"; - v.lvalAt(empty_string) = "v1"; + v.lvalAt(s_n0) = String("v0"); + v.lvalAt(empty_string) = String("v1"); v.remove(Variant()); VS(v, CREATE_MAP1("n0", "v0")); } @@ -747,13 +747,13 @@ bool TestCppBase::TestVariant() { { Variant v1("original"); Variant v2 = v1; - v2 = "changed"; + v2 = String("changed"); VERIFY(v1 == "original"); } { Variant v1("original"); Variant v2 = strongBind(v1); - v2 = "changed"; + v2 = String("changed"); VERIFY(v1 == "changed"); } { @@ -972,18 +972,18 @@ bool TestCppBase::TestEqualAsStr() { var_array[5] = 0.0; var_array[6] = 1.0; var_array[7] = 42.2; - var_array[8] = "0"; - var_array[9] = "1"; - var_array[10] = "42"; - var_array[11] = "x"; + var_array[8] = String("0"); + var_array[9] = String("1"); + var_array[10] = String("42"); + var_array[11] = String("x"); var_array[12] = Array::Create(); Variant v1("original"); var_array[13] = v1; Variant v2("changed"); var_array[14] = v2; - var_array[15] = ""; - var_array[16] = "Array"; - var_array[17] = "ARRAY"; + var_array[15] = empty_string; + var_array[16] = String("Array"); + var_array[17] = String("ARRAY"); for (int i = 0; i < arr_len; i++) { for (int j = 0; j < arr_len; j++) { bool eqAsStr = equalAsStr(var_array[i], var_array[j]); diff --git a/hphp/test/test_ext_apc.cpp b/hphp/test/test_ext_apc.cpp index 435ee607e..21d41fd6e 100644 --- a/hphp/test/test_ext_apc.cpp +++ b/hphp/test/test_ext_apc.cpp @@ -158,7 +158,7 @@ bool TestExtApc::test_apc_fetch() { { Variant apcdata = f_apc_fetch("apcdata"); Variant c = apcdata; // bump up ref count to make a MapVariant copy - apcdata.set("b", 3); // problem + apcdata.set(String("b"), 3); // problem VS(apcdata, CREATE_MAP2("a", "test", "b", 3)); } { diff --git a/hphp/test/test_ext_array.cpp b/hphp/test/test_ext_array.cpp index ef69bbc98..fbd4c2407 100644 --- a/hphp/test/test_ext_array.cpp +++ b/hphp/test/test_ext_array.cpp @@ -1115,7 +1115,7 @@ bool TestExtArray::test_array_unshift() { ")\n"); q = CREATE_MAP3(0, "orange", 1, "banana", "a", "dummy"); - q.remove("a"); + q.remove(String("a")); f_array_unshift(3, ref(q), "apple", CREATE_VECTOR1("raspberry")); VS(f_print_r(q, true), "Array\n" diff --git a/hphp/test/test_ext_sqlite3.cpp b/hphp/test/test_ext_sqlite3.cpp index 66e48836c..b94511188 100644 --- a/hphp/test/test_ext_sqlite3.cpp +++ b/hphp/test/test_ext_sqlite3.cpp @@ -80,7 +80,7 @@ bool TestExtSqlite3::test_sqlite3() { Variant id = "DEF"; VERIFY(stmt->t_bindvalue(":id", id, SQLITE3_TEXT)); - id = "ABC"; + id = String("ABC"); { Object objResult = stmt->t_execute(); c_SQLite3Result *res = objResult.getTyped(); @@ -89,9 +89,9 @@ bool TestExtSqlite3::test_sqlite3() { VERIFY(stmt->t_clear()); VERIFY(stmt->t_reset()); - id = "DEF"; + id = String("DEF"); VERIFY(stmt->t_bindparam(":id", ref(id), SQLITE3_TEXT)); - id = "ABC"; + id = String("ABC"); { Object objResult = stmt->t_execute(); c_SQLite3Result *res = objResult.getTyped(); diff --git a/hphp/test/test_ext_xml.cpp b/hphp/test/test_ext_xml.cpp index bc9221857..53a46f40b 100644 --- a/hphp/test/test_ext_xml.cpp +++ b/hphp/test/test_ext_xml.cpp @@ -74,9 +74,9 @@ bool TestExtXml::test_xml_parse_into_struct() { Variant vals, index; f_xml_parse_into_struct(p, simple, ref(vals), ref(index)); f_xml_parser_free(p); - VS(f_print_r(index.rvalAt("PARA"),1), + VS(f_print_r(index.rvalAt(String("PARA")),1), "Array\n(\n [0] => 0\n [1] => 2\n)\n"); - VS(f_print_r(index.rvalAt("NOTE"),1), + VS(f_print_r(index.rvalAt(String("NOTE")),1), "Array\n(\n [0] => 1\n)\n"); VS(f_print_r(vals.rvalAt(0),1), "Array\n(\n [tag] => PARA\n [type] => open\n [level] => 1\n)\n");