Arquivos
hhvm/hphp/runtime/ext/extension.cpp
T
Edwin Smith 12c676bc8b Litstr must die, episode V.
Removed the litstr overloads of Array::rvalAt, rvalAtRef, lval,
lvalPtr, lvalAt, and set.  The main one left to do is operator[].

Fixed a bug in f_get_html_translation_table() where we were copying
the null terminator of what should be a one-character string, thus
creating a two-character string with s[1] == 0.  (cc @jdelong)

In class Extension, store a String for the name instead of
const char*.  cc @sgolemon
2013-04-30 09:27:06 -07:00

111 linhas
3.8 KiB
C++

/*
+----------------------------------------------------------------------+
| HipHop for PHP |
+----------------------------------------------------------------------+
| Copyright (c) 2010- Facebook, Inc. (http://www.facebook.com) |
| Copyright (c) 1997-2010 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
*/
#include <runtime/ext/extension.h>
#include <runtime/base/complex_types.h>
#include <runtime/base/runtime_option.h>
namespace HPHP {
///////////////////////////////////////////////////////////////////////////////
typedef std::map<std::string, Extension*, stdltistr> ExtensionMap;
static ExtensionMap *s_registered_extensions = NULL;
static bool s_modules_initialised = false;
// just to make valgrind cleaner
class ExtensionUninitializer {
public:
~ExtensionUninitializer() {
delete s_registered_extensions;
}
};
static ExtensionUninitializer s_extension_uninitializer;
///////////////////////////////////////////////////////////////////////////////
Extension::Extension(litstr name, const char *version /* = "" */)
: m_name(StringData::GetStaticString(name))
, m_version(version ? version : "") {
if (s_registered_extensions == NULL) {
s_registered_extensions = new ExtensionMap();
}
assert(s_registered_extensions->find(name) ==
s_registered_extensions->end());
(*s_registered_extensions)[name] = this;
}
void Extension::LoadModules(Hdf hdf) {
assert(s_registered_extensions);
for (ExtensionMap::const_iterator iter = s_registered_extensions->begin();
iter != s_registered_extensions->end(); ++iter) {
iter->second->moduleLoad(hdf["Extensions"][iter->second->m_name.c_str()]);
}
}
void Extension::InitModules() {
assert(s_registered_extensions);
for (ExtensionMap::const_iterator iter = s_registered_extensions->begin();
iter != s_registered_extensions->end(); ++iter) {
iter->second->moduleInit();
}
s_modules_initialised = true;
}
bool Extension::ModulesInitialised() {
return s_modules_initialised;
}
void Extension::ShutdownModules() {
assert(s_registered_extensions);
for (ExtensionMap::const_iterator iter = s_registered_extensions->begin();
iter != s_registered_extensions->end(); ++iter) {
iter->second->moduleShutdown();
}
s_registered_extensions->clear();
}
bool Extension::IsLoaded(CStrRef name) {
if (name == "apc") {
return RuntimeOption::EnableApc;
}
assert(s_registered_extensions);
return s_registered_extensions->find(name.data()) !=
s_registered_extensions->end();
}
Extension *Extension::GetExtension(CStrRef name) {
assert(s_registered_extensions);
ExtensionMap::iterator iter = s_registered_extensions->find(name.data());
if (iter != s_registered_extensions->end()) {
return iter->second;
}
return NULL;
}
Array Extension::GetLoadedExtensions() {
assert(s_registered_extensions);
Array ret = Array::Create();
for (ExtensionMap::const_iterator iter = s_registered_extensions->begin();
iter != s_registered_extensions->end(); ++iter) {
ret.append(iter->second->m_name);
}
return ret;
}
///////////////////////////////////////////////////////////////////////////////
}