1
1
/*
2
2
* 2012|lloyd|http://wtfpl.org
3
3
*/
4
-
5
- #include " heapdiff.hh"
6
- #include " util.hh"
7
-
8
- #include < node.h>
9
-
10
4
#include < map>
11
5
#include < string>
12
6
#include < set>
15
9
#include < stdlib.h> // abs()
16
10
#include < time.h> // time()
17
11
12
+ #include " heapdiff.hh"
13
+ #include " util.hh"
14
+
18
15
using namespace v8 ;
19
16
using namespace node ;
20
17
using namespace std ;
21
18
22
19
static bool s_inProgress = false ;
23
20
static time_t s_startTime;
24
21
25
- bool heapdiff::HeapDiff::InProgress ()
22
+ bool heapdiff::HeapDiff::InProgress ()
26
23
{
27
24
return s_inProgress;
28
25
}
@@ -48,29 +45,27 @@ heapdiff::HeapDiff::~HeapDiff()
48
45
void
49
46
heapdiff::HeapDiff::Initialize ( v8::Handle <v8::Object> target )
50
47
{
51
- v8::HandleScope scope;
52
- v8::Local<v8::FunctionTemplate> t = v8::FunctionTemplate::New (New);
48
+ NanScope ();
49
+
50
+ v8::Local<v8::FunctionTemplate> t = NanNew<v8::FunctionTemplate>(New);
53
51
t->InstanceTemplate ()->SetInternalFieldCount (1 );
54
- t->SetClassName (String::NewSymbol (" HeapDiff" ));
52
+ t->SetClassName (NanNew (" HeapDiff" ));
55
53
56
54
NODE_SET_PROTOTYPE_METHOD (t, " end" , End);
57
55
58
- target->Set (v8::String::NewSymbol ( " HeapDiff" ), t->GetFunction ());
56
+ target->Set (NanNew ( " HeapDiff" ), t->GetFunction ());
59
57
}
60
58
61
- v8::Handle <v8::Value>
62
- heapdiff::HeapDiff::New (const v8::Arguments& args)
59
+ NAN_METHOD (heapdiff::HeapDiff::New)
63
60
{
64
61
// Don't blow up when the caller says "new require('memwatch').HeapDiff()"
65
62
// issue #30
66
63
// stolen from: https://github.com/kkaefer/node-cpp-modules/commit/bd9432026affafd8450ecfd9b49b7dc647b6d348
67
64
if (!args.IsConstructCall ()) {
68
- return ThrowException (
69
- Exception::TypeError (
70
- String::New (" Use the new operator to create instances of this object." )));
65
+ return NanThrowTypeError (" Use the new operator to create instances of this object." );
71
66
}
72
67
73
- v8::HandleScope scope ;
68
+ NanScope () ;
74
69
75
70
// allocate the underlying c++ class and wrap it up in the this pointer
76
71
HeapDiff * self = new HeapDiff ();
@@ -79,22 +74,28 @@ heapdiff::HeapDiff::New (const v8::Arguments& args)
79
74
// take a snapshot and save a pointer to it
80
75
s_inProgress = true ;
81
76
s_startTime = time (NULL );
82
- self->before = v8::HeapProfiler::TakeSnapshot (v8::String::New (" " ));
77
+
78
+ #if (NODE_MODULE_VERSION > 0x000B)
79
+ self->before = v8::Isolate::GetCurrent ()->GetHeapProfiler ()->TakeHeapSnapshot (NanNew<v8::String>(" " ), NULL );
80
+ #else
81
+ self->before = v8::HeapProfiler::TakeSnapshot (NanNew<v8::String>(" " ), HeapSnapshot::kFull , NULL );
82
+ #endif
83
+
83
84
s_inProgress = false ;
84
85
85
- return args.This ();
86
+ NanReturnValue ( args.This () );
86
87
}
87
88
88
89
static string handleToStr (const Handle <Value> & str)
89
90
{
90
91
String::Utf8Value utfString (str->ToString ());
91
- return *utfString;
92
+ return *utfString;
92
93
}
93
94
94
95
static void
95
96
buildIDSet (set<uint64_t > * seen, const HeapGraphNode* cur, int & s)
96
97
{
97
- v8::HandleScope scope ;
98
+ NanScope () ;
98
99
99
100
// cycle detection
100
101
if (seen->find (cur->GetId ()) != seen->end ()) {
@@ -210,66 +211,66 @@ static void manageChange(changeset & changes, const HeapGraphNode * node, bool a
210
211
211
212
static Handle <Value> changesetToObject (changeset & changes)
212
213
{
213
- v8::HandleScope scope ;
214
- Local<Array> a = Array::New ();
214
+ NanEscapableScope () ;
215
+ Local<Array> a = NanNew<v8::Array> ();
215
216
216
217
for (changeset::iterator i = changes.begin (); i != changes.end (); i++) {
217
- Local<Object> d = Object::New ();
218
- d->Set (String::New (" what" ), String::New (i->first .c_str ()));
219
- d->Set (String::New (" size_bytes" ), Integer::New (i->second .size ));
220
- d->Set (String::New (" size" ), String::New (mw_util::niceSize (i->second .size ).c_str ()));
221
- d->Set (String::New (" +" ), Integer::New (i->second .added ));
222
- d->Set (String::New (" -" ), Integer::New (i->second .released ));
218
+ Local<Object> d = NanNew<v8::Object> ();
219
+ d->Set (NanNew (" what" ), NanNew (i->first .c_str ()));
220
+ d->Set (NanNew (" size_bytes" ), NanNew<v8::Number> (i->second .size ));
221
+ d->Set (NanNew (" size" ), NanNew (mw_util::niceSize (i->second .size ).c_str ()));
222
+ d->Set (NanNew (" +" ), NanNew<v8::Number> (i->second .added ));
223
+ d->Set (NanNew (" -" ), NanNew<v8::Number> (i->second .released ));
223
224
a->Set (a->Length (), d);
224
225
}
225
226
226
- return scope. Close (a);
227
+ return NanEscapeScope (a);
227
228
}
228
229
229
230
230
231
static v8::Handle <Value>
231
232
compare (const v8::HeapSnapshot * before, const v8::HeapSnapshot * after)
232
233
{
233
- v8::HandleScope scope ;
234
+ NanEscapableScope () ;
234
235
int s, diffBytes;
235
236
236
- Local<Object> o = Object::New ();
237
+ Local<Object> o = NanNew<v8::Object> ();
237
238
238
239
// first let's append summary information
239
- Local<Object> b = Object::New ();
240
- b->Set (String::New (" nodes" ), Integer::New (before->GetNodesCount ()));
241
- b->Set (String::New (" time" ), NODE_UNIXTIME_V8 ( s_startTime) );
242
- o->Set (String::New (" before" ), b);
240
+ Local<Object> b = NanNew<v8::Object> ();
241
+ b->Set (NanNew (" nodes" ), NanNew (before->GetNodesCount ()));
242
+ // b->Set(NanNew ("time"), s_startTime);
243
+ o->Set (NanNew (" before" ), b);
243
244
244
- Local<Object> a = Object::New ();
245
- a->Set (String::New (" nodes" ), Integer::New (after->GetNodesCount ()));
246
- a->Set (String::New (" time" ), NODE_UNIXTIME_V8 ( time (NULL ) ));
247
- o->Set (String::New (" after" ), a);
245
+ Local<Object> a = NanNew<v8::Object> ();
246
+ a->Set (NanNew (" nodes" ), NanNew (after->GetNodesCount ()));
247
+ // a->Set(NanNew ("time"), time(NULL));
248
+ o->Set (NanNew (" after" ), a);
248
249
249
250
// now let's get allocations by name
250
251
set<uint64_t > beforeIDs, afterIDs;
251
252
s = 0 ;
252
253
buildIDSet (&beforeIDs, before->GetRoot (), s);
253
- b->Set (String::New (" size_bytes" ), Integer::New (s));
254
- b->Set (String::New (" size" ), String::New (mw_util::niceSize (s).c_str ()));
254
+ b->Set (NanNew (" size_bytes" ), NanNew (s));
255
+ b->Set (NanNew (" size" ), NanNew (mw_util::niceSize (s).c_str ()));
255
256
256
257
diffBytes = s;
257
258
s = 0 ;
258
259
buildIDSet (&afterIDs, after->GetRoot (), s);
259
- a->Set (String::New (" size_bytes" ), Integer::New (s));
260
- a->Set (String::New (" size" ), String::New (mw_util::niceSize (s).c_str ()));
260
+ a->Set (NanNew (" size_bytes" ), NanNew (s));
261
+ a->Set (NanNew (" size" ), NanNew (mw_util::niceSize (s).c_str ()));
261
262
262
263
diffBytes = s - diffBytes;
263
264
264
- Local<Object> c = Object::New ();
265
- c->Set (String::New (" size_bytes" ), Integer::New (diffBytes));
266
- c->Set (String::New (" size" ), String::New (mw_util::niceSize (diffBytes).c_str ()));
267
- o->Set (String::New (" change" ), c);
265
+ Local<Object> c = NanNew<v8::Object> ();
266
+ c->Set (NanNew (" size_bytes" ), NanNew (diffBytes));
267
+ c->Set (NanNew (" size" ), NanNew (mw_util::niceSize (diffBytes).c_str ()));
268
+ o->Set (NanNew (" change" ), c);
268
269
269
270
// before - after will reveal nodes released (memory freed)
270
271
vector<uint64_t > changedIDs;
271
272
setDiff (beforeIDs, afterIDs, changedIDs);
272
- c->Set (String::New (" freed_nodes" ), Integer::New (changedIDs.size ()));
273
+ c->Set (NanNew (" freed_nodes" ), NanNew<v8::Number> (changedIDs.size ()));
273
274
274
275
// here's where we'll collect all the summary information
275
276
changeset changes;
@@ -285,39 +286,39 @@ compare(const v8::HeapSnapshot * before, const v8::HeapSnapshot * after)
285
286
// after - before will reveal nodes added (memory allocated)
286
287
setDiff (afterIDs, beforeIDs, changedIDs);
287
288
288
- c->Set (String::New (" allocated_nodes" ), Integer::New (changedIDs.size ()));
289
+ c->Set (NanNew (" allocated_nodes" ), NanNew<v8::Number> (changedIDs.size ()));
289
290
290
291
for (unsigned long i = 0 ; i < changedIDs.size (); i++) {
291
292
const HeapGraphNode * n = after->GetNodeById (changedIDs[i]);
292
293
manageChange (changes, n, true );
293
294
}
294
295
295
- c->Set (String::New (" details" ), changesetToObject (changes));
296
+ c->Set (NanNew (" details" ), changesetToObject (changes));
296
297
297
- return scope. Close (o);
298
+ return NanEscapeScope (o);
298
299
}
299
300
300
- v8::Handle <Value>
301
- heapdiff::HeapDiff::End ( const Arguments& args )
301
+ NAN_METHOD (heapdiff::HeapDiff::End)
302
302
{
303
303
// take another snapshot and compare them
304
- v8::HandleScope scope ;
304
+ NanScope () ;
305
305
306
306
HeapDiff *t = Unwrap<HeapDiff>( args.This () );
307
307
308
308
// How shall we deal with double .end()ing? The only reasonable
309
309
// approach seems to be an exception, cause nothing else makes
310
310
// sense.
311
311
if (t->ended ) {
312
- return v8::ThrowException (
313
- v8::Exception::Error (
314
- v8::String::New (" attempt to end() a HeapDiff that was "
315
- " already ended" )));
312
+ return NanThrowError (" attempt to end() a HeapDiff that was already ended" );
316
313
}
317
314
t->ended = true ;
318
315
319
316
s_inProgress = true ;
320
- t->after = v8::HeapProfiler::TakeSnapshot (v8::String::New (" " ));
317
+ #if (NODE_MODULE_VERSION > 0x000B)
318
+ t->after = v8::Isolate::GetCurrent ()->GetHeapProfiler ()->TakeHeapSnapshot (NanNew<v8::String>(" " ), NULL );
319
+ #else
320
+ t->after = v8::HeapProfiler::TakeSnapshot (NanNew<v8::String>(" " ), HeapSnapshot::kFull , NULL );
321
+ #endif
321
322
s_inProgress = false ;
322
323
323
324
v8::Handle <Value> comparison = compare (t->before , t->after );
@@ -328,5 +329,5 @@ heapdiff::HeapDiff::End( const Arguments& args )
328
329
((HeapSnapshot *) t->after )->Delete ();
329
330
t->after = NULL ;
330
331
331
- return scope. Close (comparison);
332
+ NanReturnValue (comparison);
332
333
}
0 commit comments