33#include < cstdlib>
44#include < limits>
55#include < new>
6+ #include < string>
7+ #include < sstream>
68
79#include " nan.h"
810
@@ -110,10 +112,17 @@ class ZVal : public NonAssignable {
110112 virtual ~Base () { }
111113 virtual v8::Local<v8::Value> ToJs (ObjectMapper *m) const = 0;
112114 virtual void ToPhp (ObjectMapper *m, zval *return_value, zval **return_value_ptr TSRMLS_DC) const = 0;
115+ /* For debugging. The returned value should not be deallocated. */
116+ virtual const char *TypeString () const = 0;
117+ /* For debugging purposes. Caller (implicitly) deallocates. */
118+ virtual std::string ToString () const {
119+ return std::string (TypeString ());
120+ }
113121 };
114122 class Null : public Base {
115123 public:
116124 explicit Null () { }
125+ virtual const char *TypeString () const { return " Null" ; }
117126 virtual v8::Local<v8::Value> ToJs (ObjectMapper *m) const {
118127 Nan::EscapableHandleScope scope;
119128 return scope.Escape (Nan::Null ());
@@ -122,10 +131,21 @@ class ZVal : public NonAssignable {
122131 RETURN_NULL ();
123132 }
124133 };
125- class Bool : public Base {
134+ template <class T >
135+ class Prim : public Base {
126136 public:
127- bool value_;
128- explicit Bool (bool value) : value_(value) { }
137+ T value_;
138+ explicit Prim (T value) : value_(value) { }
139+ virtual std::string ToString () const {
140+ std::stringstream ss;
141+ ss << TypeString () << " (" << value_ << " )" ;
142+ return ss.str ();
143+ }
144+ };
145+ class Bool : public Prim <bool > {
146+ public:
147+ using Prim::Prim;
148+ virtual const char *TypeString () const { return " Bool" ; }
129149 virtual v8::Local<v8::Value> ToJs (ObjectMapper *m) const {
130150 Nan::EscapableHandleScope scope;
131151 return scope.Escape (Nan::New (value_));
@@ -134,10 +154,10 @@ class ZVal : public NonAssignable {
134154 RETURN_BOOL (value_);
135155 }
136156 };
137- class Int : public Base {
157+ class Int : public Prim < int64_t > {
138158 public:
139- int64_t value_ ;
140- explicit Int ( int64_t value) : value_(value) { }
159+ using Prim::Prim ;
160+ virtual const char * TypeString () const { return " Int " ; }
141161 virtual v8::Local<v8::Value> ToJs (ObjectMapper *m) const {
142162 Nan::EscapableHandleScope scope;
143163 if (value_ >= 0 && value_ <= std::numeric_limits<uint32_t >::max ()) {
@@ -156,10 +176,10 @@ class ZVal : public NonAssignable {
156176 RETURN_DOUBLE ((double )value_);
157177 }
158178 };
159- class Double : public Base {
160- double value_;
179+ class Double : public Prim <double > {
161180 public:
162- explicit Double (double value) : value_(value) { }
181+ using Prim::Prim;
182+ virtual const char *TypeString () const { return " Double" ; }
163183 virtual v8::Local<v8::Value> ToJs (ObjectMapper *m) const {
164184 Nan::EscapableHandleScope scope;
165185 return scope.Escape (Nan::New (value_));
@@ -175,13 +195,25 @@ class ZVal : public NonAssignable {
175195 public:
176196 explicit Str (const char *data, std::size_t length)
177197 : data_(data), length_(length) { }
198+ virtual const char *TypeString () const { return " Str" ; }
178199 virtual v8::Local<v8::Value> ToJs (ObjectMapper *m) const {
179200 Nan::EscapableHandleScope scope;
180201 return scope.Escape (Nan::New (data_, length_).ToLocalChecked ());
181202 }
182203 virtual void ToPhp (ObjectMapper *m, zval *return_value, zval **return_value_ptr TSRMLS_DC) const {
183204 RETURN_STRINGL (data_, length_, 1 );
184205 }
206+ virtual std::string ToString () const {
207+ std::stringstream ss;
208+ ss << TypeString () << " (" << length_ << " ," ;
209+ if (length_ > 10 ) {
210+ ss << std::string (data_, 7 ) << " ..." ;
211+ } else {
212+ ss << std::string (data_, length_);
213+ }
214+ ss << " )" ;
215+ return ss.str ();
216+ }
185217 };
186218 class OStr : public Str {
187219 // an "owned string", will copy data on creation and free it on delete.
@@ -198,10 +230,12 @@ class ZVal : public NonAssignable {
198230 delete[] data_;
199231 }
200232 }
233+ virtual const char *TypeString () const { return " OStr" ; }
201234 };
202235 class Buf : public Str {
203236 public:
204237 Buf (const char *data, std::size_t length) : Str(data, length) { }
238+ virtual const char *TypeString () const { return " Buf" ; }
205239 virtual v8::Local<v8::Value> ToJs (ObjectMapper *m) const {
206240 Nan::EscapableHandleScope scope;
207241 return scope.Escape (Nan::CopyBuffer (data_, length_).ToLocalChecked ());
@@ -210,6 +244,7 @@ class ZVal : public NonAssignable {
210244 class OBuf : public OStr {
211245 public:
212246 OBuf (const char *data, std::size_t length) : OStr(data, length) { }
247+ virtual const char *TypeString () const { return " OBuf" ; }
213248 virtual v8::Local<v8::Value> ToJs (ObjectMapper *m) const {
214249 Nan::EscapableHandleScope scope;
215250 return scope.Escape (Nan::CopyBuffer (data_, length_).ToLocalChecked ());
@@ -230,18 +265,25 @@ class ZVal : public NonAssignable {
230265 // reference owned by the caller. so increment reference count.
231266 Z_ADDREF_P (return_value);
232267 }
268+ virtual std::string ToString () const {
269+ std::stringstream ss;
270+ ss << TypeString () << " (" << id_ << " )" ;
271+ return ss.str ();
272+ }
233273 };
234274 class JsObj : public Obj {
235275 public:
276+ using Obj::Obj;
236277 explicit JsObj (ObjectMapper *m, v8::Local<v8::Object> o)
237278 : Obj(m->IdForJsObj (o)) { }
238- explicit JsObj ( objid_t id) : Obj(id) { }
279+ virtual const char * TypeString () const { return " JsObj " ; }
239280 };
240281 class PhpObj : public Obj {
241282 public:
283+ using Obj::Obj;
242284 explicit PhpObj (ObjectMapper *m, zval *o)
243285 : Obj(m->IdForPhpObj (o)) { }
244- explicit PhpObj ( objid_t id) : Obj(id) { }
286+ virtual const char * TypeString () const { return " PhpObj " ; }
245287 };
246288
247289 public:
@@ -412,6 +454,11 @@ class ZVal : public NonAssignable {
412454 return false ;
413455 }
414456 }
457+ /* For debugging: describe the value. Caller implicitly deallocates. */
458+ std::string ToString () {
459+ return AsBase ().ToString ();
460+ }
461+
415462 private:
416463 void PerhapsDestroy () {
417464 if (!IsEmpty ()) {
0 commit comments