Skip to content

Commit 7073802

Browse files
committed
Add Value::ToString() for debugging.
1 parent 90dc026 commit 7073802

File tree

1 file changed

+58
-11
lines changed

1 file changed

+58
-11
lines changed

src/values.h

Lines changed: 58 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
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

Comments
 (0)