From 237c13779a0a30bf8a1fbfa94a8cc96f8b27ef59 Mon Sep 17 00:00:00 2001 From: Emiel Bruijntjes Date: Mon, 19 Jan 2015 22:08:16 +0100 Subject: the Constant class no longer wraps around a Php::Value, but uses the zend_constant struct directly --- zend/constant.cpp | 59 +++++++++++++++++++++++- zend/constantimpl.h | 130 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 160 insertions(+), 29 deletions(-) (limited to 'zend') diff --git a/zend/constant.cpp b/zend/constant.cpp index a5358c6..83a4de0 100644 --- a/zend/constant.cpp +++ b/zend/constant.cpp @@ -18,9 +18,66 @@ namespace Php { * @param name Constant name * @param value Constant value */ -Constant::Constant(const char *name, const Value &value) : +Constant::Constant(const char *name, std::nullptr_t value) : _impl(new ConstantImpl(name, value)) {} +/** + * Constructor + * @param name Constant name + * @param value Constant value + */ +Constant::Constant(const char *name, bool value) : + _impl(new ConstantImpl(name, value)) {} + +/** + * Constructor + * @param name Constant name + * @param value Constant value + */ +Constant::Constant(const char *name, int32_t value) : + _impl(new ConstantImpl(name, value)) {} + +/** + * Constructor + * @param name Constant name + * @param value Constant value + */ +Constant::Constant(const char *name, int64_t value) : + _impl(new ConstantImpl(name, value)) {} + +/** + * Constructor + * @param name Constant name + * @param value Constant value + */ +Constant::Constant(const char *name, double value) : + _impl(new ConstantImpl(name, value)) {} + +/** + * Constructor + * @param name Constant name + * @param value Constant value + */ +Constant::Constant(const char *name, const char *value) : + _impl(new ConstantImpl(name, value)) {} + +/** + * Constructor + * @param name Constant name + * @param value Constant value + * @param size Value size + */ +Constant::Constant(const char *name, const char *value, size_t size) : + _impl(new ConstantImpl(name, value, size)) {} + +/** + * Constructor + * @param name Constant name + * @param value Constant value + */ +Constant::Constant(const char *name, const std::string &value) : + _impl(new ConstantImpl(name, value)) {} + /** * End of namespace */ diff --git a/zend/constantimpl.h b/zend/constantimpl.h index af4ecde..096cb5c 100644 --- a/zend/constantimpl.h +++ b/zend/constantimpl.h @@ -23,8 +23,89 @@ public: * @param name * @param value */ - ConstantImpl(const char *name, const Value &value) : - _name(name), _value(value) {} + ConstantImpl(const char *name, std::nullptr_t value = nullptr) : _name(name) + { + // initialize the zval + ZVAL_NULL(&_constant.value); + } + + /** + * Constructor + * @param name + * @param value + */ + ConstantImpl(const char *name, bool value) : _name(name) + { + // initialize the zval + ZVAL_BOOL(&_constant.value, value); + } + + /** + * Constructor + * @param name + * @param value + */ + ConstantImpl(const char *name, int32_t value) : _name(name) + { + // initialize the zval + ZVAL_LONG(&_constant.value, value); + } + + /** + * Constructor + * @param name + * @param value + */ + ConstantImpl(const char *name, int64_t value) : _name(name) + { + // initialize the zval + ZVAL_LONG(&_constant.value, value); + } + + /** + * Constructor + * @param name + * @param value + */ + ConstantImpl(const char *name, double value) : _name(name) + { + // initialize the zval + ZVAL_DOUBLE(&_constant.value, value); + } + + /** + * Constructor + * @param name + * @param value + * @param len + */ + ConstantImpl(const char *name, const char *value, size_t len) : _name(name) + { + // initialize the zval + ZVAL_STRINGL(&_constant.value, value, len, 0); + } + + /** + * Constructor + * @param name + * @param value + */ + ConstantImpl(const char *name, const char *value) : _name(name) + { + // initialize the zval + ZVAL_STRINGL(&_constant.value, value, ::strlen(value), 0); + } + + /** + * Constructor + * @param name + * @param value + */ + ConstantImpl(const char *name, const std::string &value) : _name(name) + { + // initialize the zval + ZVAL_STRINGL(&_constant.value, value.c_str(), value.size(), 0); + } /** * Destructor @@ -37,17 +118,8 @@ public: * @param module_number The module number * @param tsrmls Optional parameter when running in multi-threading context */ - void initialize(const std::string &prefix, int module_number TSRMLS_DC) const + void initialize(const std::string &prefix, int module_number TSRMLS_DC) { - // create constant structure - zend_constant constant; - - // copy zval - INIT_PZVAL_COPY(&constant.value, _value._val); - - // we have to call the copy constructor to copy the entire other zval - zval_copy_ctor(&constant.value); - // is there a namespace name involved? if (prefix.size() > 0) { @@ -55,41 +127,43 @@ public: auto namelen = ::strlen(_name); // include prefix in the full name - constant.name_len = prefix.size() + 1 + namelen; - constant.name = (char *)emalloc(constant.name_len); - + _constant.name_len = prefix.size() + 1 + namelen; + _constant.name = (char *)emalloc(_constant.name_len); + // copy the entire namespace name, separator and constant name - ::strncpy(constant.name, prefix.c_str(), prefix.size()); - ::strncpy(constant.name + prefix.size(), "\\", 1); - ::strncpy(constant.name + prefix.size() + 1, _name, namelen); + ::strncpy(_constant.name, prefix.c_str(), prefix.size()); + ::strncpy(_constant.name + prefix.size(), "\\", 1); + ::strncpy(_constant.name + prefix.size() + 1, _name, namelen); } else { // no namespace, we simply copy the name - constant.name_len = ::strlen(_name); - constant.name = zend_strndup(_name, constant.name_len); + _constant.name_len = ::strlen(_name); + _constant.name = zend_strndup(_name, _constant.name_len); } + + std::cout << "register constant " << std::string(_constant.name, _constant.name_len) << std::endl; // set all the other constant properties - constant.flags = CONST_CS | CONST_PERSISTENT; - constant.module_number = module_number; + _constant.flags = CONST_CS | CONST_PERSISTENT; + _constant.module_number = module_number; // register the zval - zend_register_constant(&constant TSRMLS_CC); + zend_register_constant(&_constant TSRMLS_CC); } private: /** - * The name of the constant + * Name of the constant * @var const char * */ const char *_name; - + /** - * The value of the constant - * @var Value + * The zend_constant structure + * @var zend_constant */ - Value _value; + zend_constant _constant; }; /** -- cgit v1.2.3