summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile20
-rw-r--r--common/extensionbase.h138
-rw-r--r--hhvm/extension.cpp103
-rw-r--r--hhvm/extensionimpl.h55
-rw-r--r--hhvm/includes.h53
-rw-r--r--zend/extensionimpl.cpp56
-rw-r--r--zend/extensionimpl.h105
-rw-r--r--zend/includes.h7
8 files changed, 401 insertions, 136 deletions
diff --git a/Makefile b/Makefile
index 5955a3d..c883d2f 100644
--- a/Makefile
+++ b/Makefile
@@ -120,11 +120,11 @@ MKDIR = mkdir -p
# The source files
#
# For this we use a special Makefile function that automatically scans the
-# src/, zend/ and hhvm/ directories for all *.cpp files. No changes are
+# common/, zend/ and hhvm/ directories for all *.cpp files. No changes are
# probably necessary here
#
-SOURCES = $(wildcard src/*.cpp)
+COMMON_SOURCES = $(wildcard common/*.cpp)
PHP_SOURCES = $(wildcard zend/*.cpp)
HHVM_SOURCES = $(wildcard hhvm/*.cpp)
@@ -137,7 +137,7 @@ HHVM_SOURCES = $(wildcard hhvm/*.cpp)
# takes all source files.
#
-OBJECTS = $(SOURCES:%.cpp=%.o)
+COMMON_OBJECTS = $(COMMON_SOURCES:%.cpp=%.o)
PHP_OBJECTS = $(PHP_SOURCES:%.cpp=%.o)
HHVM_OBJECTS = $(HHVM_SOURCES:%.cpp=%.o)
@@ -149,17 +149,21 @@ HHVM_OBJECTS = $(HHVM_SOURCES:%.cpp=%.o)
all: ${PHP_LIBRARY}
-${PHP_LIBRARY}: ${OBJECTS} ${PHP_OBJECTS}
+phpcpp: ${PHP_LIBRARY}
+
+hhvmcpp: ${HHVM_LIBRARY}
+
+${PHP_LIBRARY}: ${COMMON_OBJECTS} ${PHP_OBJECTS}
${LINKER} ${PHP_LINKER_FLAGS} -o $@ ${OBJECTS} ${PHP_OBJECTS}
-${HHVM_LIBRARY}: ${OBJECTS} ${HHVM_OBJECTS}
+${HHVM_LIBRARY}: ${COMMON_OBJECTS} ${HHVM_OBJECTS}
${LINKER} ${HHVM_LINKER_FLAGS} -o $@ ${OBJECTS} ${HHVM_OBJECTS}
clean:
- ${RM} ${OBJECTS} ${PHP_OBJECTS} ${HHVM_OBJECTS} ${PHP_LIBRARY} ${HHVM_LIBRARY}
+ ${RM} ${COMMON_OBJECTS} ${PHP_OBJECTS} ${HHVM_OBJECTS} ${PHP_LIBRARY} ${HHVM_LIBRARY}
-${OBJECTS}:
- ${COMPILER} ${PHP_COMPILER_FLAGS} -o $@ ${@:%.o=%.cpp}
+${COMMON_OBJECTS}:
+ ${COMPILER} ${COMPILER_FLAGS} -o $@ ${@:%.o=%.cpp}
${PHP_OBJECTS}:
${COMPILER} ${PHP_COMPILER_FLAGS} -o $@ ${@:%.o=%.cpp}
diff --git a/common/extensionbase.h b/common/extensionbase.h
new file mode 100644
index 0000000..bf7f128
--- /dev/null
+++ b/common/extensionbase.h
@@ -0,0 +1,138 @@
+/**
+ * ExtensionBase.h
+ *
+ * Base class for ExtensionImpl objects. Common code used by both the Zend
+ * and HHVM engine.
+ *
+ * @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
+ * @copyright 2013, 2014 Copernica BV
+ */
+
+/**
+ * Set up namespace
+ */
+namespace Php {
+
+/**
+ * Class definition
+ */
+class ExtensionBase
+{
+protected:
+ /**
+ * Pointer to the extension object that is filled by the extension programmer
+ * @var Extension
+ */
+ Extension *_data;
+
+ /**
+ * Callback that is called after the engine is initialized and before the
+ * pageviews are going to be handled
+ * @var Callback
+ */
+ Callback _onStartup;
+
+ /**
+ * Callback that is called in front of each request
+ * @var Callback
+ */
+ Callback _onRequest;
+
+ /**
+ * Callback that is called right after each request
+ * @var Callback
+ */
+ Callback _onIdle;
+
+ /**
+ * Callback that is called right before the engine is closing down
+ * @var Callback
+ */
+ Callback _onShutdown;
+
+public:
+ /**
+ * Constructor
+ * @param data Extension object created by the extension programmer
+ */
+ ExtensionBase(Extension *data) : _data(data) {}
+
+ /**
+ * No copy'ing and no moving
+ */
+ ExtensionBase(const ExtensionImpl &extension) = delete;
+ ExtensionBase(ExtensionImpl &&extension) = delete;
+
+ /**
+ * Destructor
+ */
+ virtual ~ExtensionBase() {}
+
+ /**
+ * Register a function to be called when the PHP engine is ready
+ *
+ * The callback will be called after all extensions are loaded, and all
+ * functions and classes are available, but before the first pageview/request
+ * is handled. You can register this callback if you want to be notified
+ * when the engine is ready, for example to initialize certain things.
+ *
+ * @param callback
+ */
+ void onStartup(const Callback &callback)
+ {
+ // copy callback
+ _onStartup = callback;
+ }
+
+ /**
+ * Register a function to be called when the PHP engine is going to stop
+ *
+ * The callback will be called right before the process is going to stop.
+ * You can register a function if you want to clean up certain things.
+ *
+ * @param callback
+ */
+ void onShutdown(const Callback &callback)
+ {
+ // copy callback
+ _onShutdown = callback;
+ }
+
+ /**
+ * Register a callback that is called at the beginning of each pageview/request
+ *
+ * You can register a callback if you want to initialize certain things
+ * at the beginning of each request. Remember that the extension can handle
+ * multiple requests after each other, and you may want to set back certain
+ * global variables to their initial variables in front of each request
+ *
+ * @param callback
+ */
+ void onRequest(const Callback &callback)
+ {
+ // copy callback
+ _onRequest = callback;
+ }
+
+ /**
+ * Register a callback that is called to cleanup things after a pageview/request
+ *
+ * The callback will be called after _each_ request, so that you can clean up
+ * certain things and make your extension ready to handle the next request.
+ * This method is called onIdle because the extension is idle in between
+ * requests.
+ *
+ * @param callback
+ */
+ void onIdle(const Callback &callback)
+ {
+ // copy callback
+ _onIdle = callback;
+ }
+};
+
+/**
+ * End of namespace
+ */
+}
+
diff --git a/hhvm/extension.cpp b/hhvm/extension.cpp
new file mode 100644
index 0000000..9685b32
--- /dev/null
+++ b/hhvm/extension.cpp
@@ -0,0 +1,103 @@
+/**
+ * Extension.cpp
+ *
+ * @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
+ * @copyright 2013, 2014 Copernica BV
+ */
+#include "includes.h"
+
+/**
+ * Set up namespace
+ */
+namespace Php {
+
+/**
+ * Constructor that defines a number of functions right away
+ * @param name Extension name
+ * @param version Extension version string
+ */
+Extension::Extension(const char *name, const char *version) :
+ Namespace(""), _impl(new ExtensionImpl(this, name, version)) {}
+
+/**
+ * Destructor
+ */
+Extension::~Extension()
+{
+ // get rid of the implementation object
+ delete _impl;
+}
+
+/**
+ * Register a function to be called when the PHP engine is ready
+ * @param callback
+ * @return Extension
+ */
+Extension &Extension::onStartup(const Callback &callback)
+{
+ // pass on to the implementation
+ _impl->onStartup(callback);
+
+ // allow chaining
+ return *this;
+}
+
+/**
+ * Register a function to be called when the PHP engine is going to stop
+ * @param callback
+ * @return Extension
+ */
+Extension &Extension::onShutdown(const Callback &callback)
+{
+ // pass on to the implementation
+ _impl->onShutdown(callback);
+
+ // allow chaining
+ return *this;
+}
+
+/**
+ * Register a callback that is called at the beginning of each pageview/request
+ * @param callback
+ */
+Extension &Extension::onRequest(const Callback &callback)
+{
+ // pass on to the implementation
+ _impl->onRequest(callback);
+
+ // allow chaining
+ return *this;
+}
+
+/**
+ * Register a callback that is called to cleanup things after a pageview/request
+ * @param callback
+ */
+Extension &Extension::onIdle(const Callback &callback)
+{
+ // pass on to the implementation
+ _impl->onIdle(callback);
+
+ // allow chaining
+ return *this;
+}
+
+/**
+ * Retrieve the module pointer
+ *
+ * This is the memory address that should be exported by the get_module()
+ * function.
+ *
+ * @return void*
+ */
+void *Extension::module()
+{
+ // pass on to the implementation
+ return _impl->module();
+}
+
+/**
+ * End of namespace
+ */
+}
+
diff --git a/hhvm/extensionimpl.h b/hhvm/extensionimpl.h
new file mode 100644
index 0000000..deb80a6
--- /dev/null
+++ b/hhvm/extensionimpl.h
@@ -0,0 +1,55 @@
+/**
+ * ExtensionImpl.h
+ *
+ * Implementation of the extension object for the HHVM engine
+ *
+ * @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
+ * @copyright 2014 Copernica BV
+ */
+
+/**
+ * Namespace
+ */
+namespace Php {
+
+/**
+ * Class definition
+ */
+class ExtensionImpl : public ExtensionBase
+{
+private:
+ /**
+ * Pointer to the extension object that is filled by the extension programmer
+ * @var Extension
+ */
+ Extension *_data;
+
+public:
+ /**
+ * Constructor
+ * @param data Pointer to the extension object created by the extension programmer
+ * @param name Name of the extension
+ * @param version Version identifier of the extension
+ */
+ ExtensionImpl(Extension *data, const char *name, const char *version) : ExtensionBase(data) {}
+
+ /**
+ * Destructor
+ */
+ virtual ~ExtensionImpl() {}
+
+ /**
+ * Pointer to the module that is loaded by HHVM
+ * @return void*
+ */
+ void *module()
+ {
+ return nullptr;
+ }
+};
+
+/**
+ * End of namespace
+ */
+}
+
diff --git a/hhvm/includes.h b/hhvm/includes.h
new file mode 100644
index 0000000..b6f25c1
--- /dev/null
+++ b/hhvm/includes.h
@@ -0,0 +1,53 @@
+/**
+ * Includes.h
+ *
+ * All includes for compiling the HHVM implementation of PHP-CPP
+ *
+ * @author Emiel Bruijntjes <emiel.bruijntjes@copernica.com>
+ * @copyright 2014 Copernica BV
+ */
+
+/**
+ * Standard C and C++ libraries
+ */
+#include <functional>
+#include <list>
+#include <memory>
+#include <vector>
+#include <map>
+#include <string.h>
+
+/**
+ * HHVM includes
+ */
+
+
+/**
+ * Public include files
+ */
+#include "../include/type.h"
+#include "../include/hashparent.h"
+#include "../include/value.h"
+#include "../include/parameters.h"
+#include "../include/classtype.h"
+#include "../include/argument.h"
+#include "../include/modifiers.h"
+#include "../include/classbase.h"
+#include "../include/interface.h"
+#include "../include/iterator.h"
+#include "../include/traversable.h"
+#include "../include/serializable.h"
+#include "../include/class.h"
+#include "../include/namespace.h"
+#include "../include/extension.h"
+
+/**
+ * Generic implementation header files
+ */
+#include "../common/extensionbase.h"
+
+/**
+ * Specific HHVM header files for the implementation only
+ */
+#include "extensionimpl.h"
+
diff --git a/zend/extensionimpl.cpp b/zend/extensionimpl.cpp
index 9562362..77b9985 100644
--- a/zend/extensionimpl.cpp
+++ b/zend/extensionimpl.cpp
@@ -106,7 +106,7 @@ static ExtensionImpl *find(int number TSRMLS_DC)
* @param tsrm_ls
* @return int 0 on success
*/
-int ExtensionImpl::onStartup(int type, int module_number TSRMLS_DC)
+int ExtensionImpl::processStartup(int type, int module_number TSRMLS_DC)
{
// initialize and allocate the "global" variables
ZEND_INIT_MODULE_GLOBALS(phpcpp, init_globals, NULL);
@@ -131,7 +131,7 @@ int ExtensionImpl::onStartup(int type, int module_number TSRMLS_DC)
* @param tsrm_ls
* @return int
*/
-int ExtensionImpl::onShutdown(int type, int module_number TSRMLS_DC)
+int ExtensionImpl::processShutdown(int type, int module_number TSRMLS_DC)
{
// get the extension
auto *extension = find(module_number TSRMLS_CC);
@@ -150,7 +150,7 @@ int ExtensionImpl::onShutdown(int type, int module_number TSRMLS_DC)
* @param tsrm_ls
* @return int 0 on success
*/
-int ExtensionImpl::onRequest(int type, int module_number TSRMLS_DC)
+int ExtensionImpl::processRequest(int type, int module_number TSRMLS_DC)
{
// get the extension
auto *extension = find(module_number TSRMLS_CC);
@@ -169,7 +169,7 @@ int ExtensionImpl::onRequest(int type, int module_number TSRMLS_DC)
* @param tsrm_ls
* @return int 0 on success
*/
-int ExtensionImpl::onIdle(int type, int module_number TSRMLS_DC)
+int ExtensionImpl::processIdle(int type, int module_number TSRMLS_DC)
{
// get the extension
auto *extension = find(module_number TSRMLS_CC);
@@ -187,35 +187,35 @@ int ExtensionImpl::onIdle(int type, int module_number TSRMLS_DC)
* @param name Name of the extension
* @param version Version number
*/
-ExtensionImpl::ExtensionImpl(Extension *data, const char *name, const char *version) : _data(data)
+ExtensionImpl::ExtensionImpl(Extension *data, const char *name, const char *version) : ExtensionBase(data)
{
// keep extension pointer based on the name
name2extension[name] = this;
// assign all members (apart from the globals)
- _entry.size = sizeof(zend_module_entry); // size of the data
- _entry.zend_api = ZEND_MODULE_API_NO; // api number
- _entry.zend_debug = ZEND_DEBUG; // debug mode enabled?
- _entry.zts = USING_ZTS; // is thread safety enabled?
- _entry.ini_entry = NULL; // the php.ini record
- _entry.deps = NULL; // dependencies on other modules
- _entry.name = name; // extension name
- _entry.functions = NULL; // functions supported by this module (none for now)
- _entry.module_startup_func = &ExtensionImpl::onStartup; // startup function for the whole extension
- _entry.module_shutdown_func = &ExtensionImpl::onShutdown; // shutdown function for the whole extension
- _entry.request_startup_func = &ExtensionImpl::onRequest; // startup function per request
- _entry.request_shutdown_func = &ExtensionImpl::onIdle; // shutdown function per request
- _entry.info_func = NULL; // information for retrieving info
- _entry.version = version; // version string
- _entry.globals_size = 0; // size of the global variables
- _entry.globals_ctor = NULL; // constructor for global variables
- _entry.globals_dtor = NULL; // destructor for global variables
- _entry.post_deactivate_func = NULL; // unknown function
- _entry.module_started = 0; // module is not yet started
- _entry.type = 0; // temporary or persistent module, will be filled by Zend engine
- _entry.handle = NULL; // dlopen() handle, will be filled by Zend engine
- _entry.module_number = 0; // module number will be filled in by Zend engine
- _entry.build_id = (char *)ZEND_MODULE_BUILD_ID; // check if extension and zend engine are compatible
+ _entry.size = sizeof(zend_module_entry); // size of the data
+ _entry.zend_api = ZEND_MODULE_API_NO; // api number
+ _entry.zend_debug = ZEND_DEBUG; // debug mode enabled?
+ _entry.zts = USING_ZTS; // is thread safety enabled?
+ _entry.ini_entry = NULL; // the php.ini record
+ _entry.deps = NULL; // dependencies on other modules
+ _entry.name = name; // extension name
+ _entry.functions = NULL; // functions supported by this module (none for now)
+ _entry.module_startup_func = &ExtensionImpl::processStartup; // startup function for the whole extension
+ _entry.module_shutdown_func = &ExtensionImpl::processShutdown; // shutdown function for the whole extension
+ _entry.request_startup_func = &ExtensionImpl::processRequest; // startup function per request
+ _entry.request_shutdown_func = &ExtensionImpl::processIdle; // shutdown function per request
+ _entry.info_func = NULL; // information for retrieving info
+ _entry.version = version; // version string
+ _entry.globals_size = 0; // size of the global variables
+ _entry.globals_ctor = NULL; // constructor for global variables
+ _entry.globals_dtor = NULL; // destructor for global variables
+ _entry.post_deactivate_func = NULL; // unknown function
+ _entry.module_started = 0; // module is not yet started
+ _entry.type = 0; // temporary or persistent module, will be filled by Zend engine
+ _entry.handle = NULL; // dlopen() handle, will be filled by Zend engine
+ _entry.module_number = 0; // module number will be filled in by Zend engine
+ _entry.build_id = (char *)ZEND_MODULE_BUILD_ID; // check if extension and zend engine are compatible
// things that only need to be initialized
#ifdef ZTS
diff --git a/zend/extensionimpl.h b/zend/extensionimpl.h
index cc37354..e58ce66 100644
--- a/zend/extensionimpl.h
+++ b/zend/extensionimpl.h
@@ -15,16 +15,10 @@ namespace Php {
/**
* Class definition
*/
-class ExtensionImpl
+class ExtensionImpl : public ExtensionBase
{
protected:
/**
- * Pointer to the extension object that is filled by the extension programmer
- * @var Extension
- */
- Extension *_data;
-
- /**
* The information that is passed to the Zend engine
*
* Although it would be slightly faster to not make this a pointer, this
@@ -34,32 +28,7 @@ protected:
* @var zend_module_entry
*/
zend_module_entry _entry;
-
- /**
- * Callback that is called after the engine is initialized and before the
- * pageviews are going to be handled
- * @var Callback
- */
- Callback _onStartup;
-
- /**
- * Callback that is called in front of each request
- * @var Callback
- */
- Callback _onRequest;
-
- /**
- * Callback that is called right after each request
- * @var Callback
- */
- Callback _onIdle;
-
- /**
- * Callback that is called right before the engine is closing down
- * @var Callback
- */
- Callback _onShutdown;
-
+
public:
/**
* Constructor
@@ -81,68 +50,6 @@ public:
virtual ~ExtensionImpl();
/**
- * Register a function to be called when the PHP engine is ready
- *
- * The callback will be called after all extensions are loaded, and all
- * functions and classes are available, but before the first pageview/request
- * is handled. You can register this callback if you want to be notified
- * when the engine is ready, for example to initialize certain things.
- *
- * @param callback
- */
- void onStartup(const Callback &callback)
- {
- // copy callback
- _onStartup = callback;
- }
-
- /**
- * Register a function to be called when the PHP engine is going to stop
- *
- * The callback will be called right before the process is going to stop.
- * You can register a function if you want to clean up certain things.
- *
- * @param callback
- */
- void onShutdown(const Callback &callback)
- {
- // copy callback
- _onShutdown = callback;
- }
-
- /**
- * Register a callback that is called at the beginning of each pageview/request
- *
- * You can register a callback if you want to initialize certain things
- * at the beginning of each request. Remember that the extension can handle
- * multiple requests after each other, and you may want to set back certain
- * global variables to their initial variables in front of each request
- *
- * @param callback
- */
- void onRequest(const Callback &callback)
- {
- // copy callback
- _onRequest = callback;
- }
-
- /**
- * Register a callback that is called to cleanup things after a pageview/request
- *
- * The callback will be called after _each_ request, so that you can clean up
- * certain things and make your extension ready to handle the next request.
- * This method is called onIdle because the extension is idle in between
- * requests.
- *
- * @param callback
- */
- void onIdle(const Callback &callback)
- {
- // copy callback
- _onIdle = callback;
- }
-
- /**
* Retrieve the module entry
*
* This is the memory address that should be exported by the get_module()
@@ -175,7 +82,7 @@ private:
* @param tsrm_ls
* @return int 0 on success
*/
- static int onStartup(int type, int module_number TSRMLS_DC);
+ static int processStartup(int type, int module_number TSRMLS_DC);
/**
* Function that is called when the extension is about to be stopped
@@ -184,7 +91,7 @@ private:
* @param tsrm_ls
* @return int
*/
- static int onShutdown(int type, int module_number TSRMLS_DC);
+ static int processShutdown(int type, int module_number TSRMLS_DC);
/**
* Function that is called when a request starts
@@ -193,7 +100,7 @@ private:
* @param tsrm_ls
* @return int 0 on success
*/
- static int onRequest(int type, int module_number TSRMLS_DC);
+ static int processRequest(int type, int module_number TSRMLS_DC);
/**
* Function that is called when a request is ended
@@ -202,7 +109,7 @@ private:
* @param tsrm_ls
* @return int 0 on success
*/
- static int onIdle(int type, int module_number TSRMLS_DC);
+ static int processIdle(int type, int module_number TSRMLS_DC);
};
/**
diff --git a/zend/includes.h b/zend/includes.h
index f547eb2..50eb4d5 100644
--- a/zend/includes.h
+++ b/zend/includes.h
@@ -76,7 +76,12 @@
#include "../include/call.h"
/**
- * Interface files for internal use only
+ * Common header files for internal use only
+ */
+#include "../common/extensionbase.h"
+
+/**
+ * Specific zend implementation files for internal use only
*/
#include "init.h"
#include "callable.h"