summaryrefslogtreecommitdiff
path: root/src/value.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/value.cpp')
-rw-r--r--src/value.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/value.cpp b/src/value.cpp
index a78c2d4..29b6dcd 100644
--- a/src/value.cpp
+++ b/src/value.cpp
@@ -170,6 +170,21 @@ Value::Value(struct _zval_struct *val, bool ref)
}
/**
+ * Wrap around a hash table
+ * @param ht Hashtable to wrap
+ */
+Value::Value(HashTable *ht)
+{
+ // construct a zval
+ MAKE_STD_ZVAL(_val);
+ Z_ARRVAL_P(_val) = ht;
+ Z_TYPE_P(_val) = IS_ARRAY;
+
+ // add a reference
+ Z_ADDREF_P(_val);
+}
+
+/**
* Wrap around an object
* @param object
*/
@@ -302,6 +317,9 @@ Value::~Value()
*/
zval *Value::detach()
{
+ // leap out if already detached
+ if (!_val) return nullptr;
+
// copy return value
zval *result = _val;
@@ -316,6 +334,50 @@ zval *Value::detach()
}
/**
+ * Attach a different zval
+ *
+ * This will first detach the current zval, and link the Value object to
+ * a different zval.
+ *
+ * @param val
+ */
+void Value::attach(struct _zval_struct *val)
+{
+ // detach first
+ if (_val) detach();
+
+ // store the zval
+ _val = val;
+
+ // add one more reference
+ Z_ADDREF_P(_val);
+}
+
+/**
+ * Attach a different zval
+ *
+ * This will first detach the current zval, and link the Value object to
+ * a new zval
+ *
+ * @param hashtable
+ */
+void Value::attach(struct _hashtable *hashtable)
+{
+ // detach first
+ if (_val) detach();
+
+ // construct a new zval
+ MAKE_STD_ZVAL(_val);
+
+ // store pointer to the hashtable, and mark the zval as an array
+ Z_ARRVAL_P(_val) = hashtable;
+ Z_TYPE_P(_val) = IS_ARRAY;
+
+ // add a reference
+ Z_ADDREF_P(_val);
+}
+
+/**
* Retrieve the refcount
* @return int
*/