summaryrefslogtreecommitdiff
path: root/zend
diff options
context:
space:
mode:
authorEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2014-11-20 17:12:54 +0100
committerEmiel Bruijntjes <emiel.bruijntjes@copernica.com>2014-11-20 17:12:54 +0100
commit069beaa49325728e0eff0ba13fa480604ce43a84 (patch)
tree066b5f2fac5418f0430320c9c67000903482c431 /zend
parent3d51521cc809f6ba23045bca03c261c5adca544e (diff)
Fixed issue #137: Php::Object("MyClass") crashed when no __construct() function was defined in it
Diffstat (limited to 'zend')
-rw-r--r--zend/object.cpp34
1 files changed, 32 insertions, 2 deletions
diff --git a/zend/object.cpp b/zend/object.cpp
index dc548cc..30fdcdb 100644
--- a/zend/object.cpp
+++ b/zend/object.cpp
@@ -52,10 +52,38 @@ Object::Object(const char *name, Base *base)
}
/**
+ * Copy constructor is valid if the passed in object is also an object,
+ * or when it is a string holding a classname
+ * @param that An other object
+ */
+Object::Object(const Value &value) : Value()
+{
+ // when a string is passed in, we are going to make a new instance of the
+ // passed in string
+ if (value.isString())
+ {
+ // instantiate the object
+ auto *entry = instantiate(value);
+
+ // leap out if there is no __construct function
+ if (!zend_hash_exists(&entry->function_table, "__construct", 12)) return;
+
+ // call the construct function
+ call("__construct");
+ }
+ else
+ {
+ // this simply copies the other object
+ operator=(value);
+ }
+}
+
+/**
* Internal method to instantiate an object
- * @param name
+ * @param name Name of the class to instantiate
+ * @return zend_class_entry
*/
-void Object::instantiate(const char *name)
+zend_class_entry *Object::instantiate(const char *name)
{
// we need the tsrm_ls variable
TSRMLS_FETCH();
@@ -79,6 +107,8 @@ void Object::instantiate(const char *name)
// @todo is this a memory leak? the base class first initializes a stdClass,
// and then we overwrite it with a specific class
+ // return the class entry
+ return entry;
}
/**