From b8d747580db76bc3e51bae6c3cdae49b5b44e20b Mon Sep 17 00:00:00 2001 From: Emiel Bruijntjes Date: Thu, 29 Aug 2013 19:18:10 +0200 Subject: work in progress on nested arrays (still crashes with sigsegv) --- include/member.h | 92 +++++++++++++++++++++----------------------------------- src/argument.cpp | 6 ++-- src/callable.cpp | 7 +++++ 3 files changed, 44 insertions(+), 61 deletions(-) diff --git a/include/member.h b/include/member.h index 86e3554..49ac246 100644 --- a/include/member.h +++ b/include/member.h @@ -36,68 +36,22 @@ public: virtual ~Member() {} /** - * Assign a numeric value - * @param value - * @return Member - */ - Member &operator=(long value) - { - _value->set(_index, value); - return *this; - } - - /** - * Assign a numeric value - * @param value - * @return Member - */ - Member &operator=(int value) - { - _value->set(_index, value); - return *this; - } - - /** - * Assign a double value + * Assign a value object to the array * @param value * @return Member */ - Member &operator=(double value) - { - _value->set(_index, value); - return *this; - } - - /** - * Assign a boolean value - * @param value - * @return Member - */ - Member &operator=(bool value) - { - _value->set(_index, value); - return *this; - } - - /** - * Assign a string value - * @param value - * @return Member - */ - Member &operator=(const std::string &value) - { - _value->set(_index, value); - return *this; - } - - /** - * Assign a byte array value - * @param value - * @return Member - */ - Member &operator=(const char *value) + Member &operator=(const Value &value) { + // set property in parent array _value->set(_index, value); + + // leap out if this is not a nested array access + //if (!_parent) return *this; + + // nested array access, we need to update the parent too + //_parent->operator=(*_value); + + // done return *this; } @@ -174,7 +128,7 @@ public: { return _value->get(_index)[index]; } - + /** * Array access operator * This can be used for accessing associative arrays @@ -211,6 +165,16 @@ private: */ Member(const Member &member) : _value(member._value), _index(member._index) {} + /** + * Set the member + * @param member + */ + Member &add(Member *parent) + { + _parent = parent; + return *this; + } + /** * The array of which this is a member * @var Value @@ -223,6 +187,18 @@ private: */ Type _index; + /** + * Parent member + * + * When accessing nested arrays a["a"]["b"] = 'true', the member + * object that represents the "b" entry holds a pointer to the member + * object that represents "a", so that it can tell its parent to + * store itself in the top array too + * + * @var Member + */ + Member *_parent = nullptr; + /** * Value objects may create members */ diff --git a/src/argument.cpp b/src/argument.cpp index fc9d720..627ee05 100644 --- a/src/argument.cpp +++ b/src/argument.cpp @@ -22,7 +22,7 @@ namespace PhpCpp { */ Argument::Argument(const std::string &name, const std::string &classname, bool null, bool ref) { - _refcount = new int[1]; + _refcount = new int(1); _info = new ArgInfo(name, classname, null, ref); } @@ -35,7 +35,7 @@ Argument::Argument(const std::string &name, const std::string &classname, bool n */ Argument::Argument(const std::string &name, Type type, bool ref) { - _refcount = new int[1]; + _refcount = new int(1); _info = new ArgInfo(name, type, ref); } @@ -46,7 +46,7 @@ Argument::Argument(const std::string &name, Type type, bool ref) */ Argument::Argument(const std::string &name, bool ref) { - _refcount = new int[1]; + _refcount = new int(1); _info = new ArgInfo(name, ref); } diff --git a/src/callable.cpp b/src/callable.cpp index 929f39c..7cba919 100644 --- a/src/callable.cpp +++ b/src/callable.cpp @@ -160,6 +160,13 @@ int Callable::invoke(INTERNAL_FUNCTION_PARAMETERS) ret["2"] = 3; +// ret["hmm"]["s"] = 456; + + Value sub; + sub["something"] = "yes"; + + ret["b"] = sub; + std::cout << "done setting properties" << std::endl; -- cgit v1.2.3