Skip to content

Commit aa769c8

Browse files
committed
cleaned up some memory leaks
1 parent e306b64 commit aa769c8

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "hashtable",
3-
"version": "0.5.1",
3+
"version": "0.5.2",
44
"description": "Native HashTable and ES6 compatible Map for Node.js",
55
"main": "./index.js",
66
"keywords": [

src/hashtable.cpp

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,10 @@ Handle<Value> HashTable::Has(const Arguments& args) {
128128
MapType::const_iterator itr = obj->map.find(key);
129129

130130
if(itr == obj->map.end()) {
131-
return scope.Close(Boolean::New(false)); //return undefined
131+
return scope.Close(False()); //return undefined
132132
}
133133

134-
return scope.Close(Boolean::New(true));
134+
return scope.Close(True());
135135
}
136136

137137
Handle<Value> HashTable::Put(const Arguments& args) {
@@ -153,6 +153,7 @@ Handle<Value> HashTable::Put(const Arguments& args) {
153153
if(itr != obj->map.end()) {
154154
Persistent<Value> oldValue = itr->second;
155155
oldValue.Dispose(); //release the handle to the GC
156+
oldValue.Clear();
156157
}
157158

158159
obj->map.insert(std::pair<Persistent<Value>, Persistent<Value> >(key, value));
@@ -212,7 +213,7 @@ Handle<Value> HashTable::Remove(const Arguments& args) {
212213

213214
if (args.Length() < 1) {
214215
ThrowException(Exception::TypeError(String::New("Wrong arguments")));
215-
return scope.Close(Boolean::New(false));
216+
return scope.Close(False());
216217
}
217218

218219
HashTable *obj = ObjectWrap::Unwrap<HashTable>(args.This());
@@ -222,15 +223,20 @@ Handle<Value> HashTable::Remove(const Arguments& args) {
222223
MapType::const_iterator itr = obj->map.find(key);
223224

224225
if(itr == obj->map.end()) {
225-
return scope.Close(Boolean::New(false)); //do nothing and return false
226+
return scope.Close(False()); //do nothing and return false
226227
}
227228

229+
Persistent<Value> stored_key = itr->first;
230+
stored_key.Dispose();
231+
stored_key.Clear();
232+
228233
Persistent<Value> value = itr->second;
229234
value.Dispose();
235+
value.Clear();
230236

231237
obj->map.erase(itr);
232238

233-
return scope.Close(Boolean::New(true));
239+
return scope.Close(True());
234240
}
235241

236242
Handle<Value> HashTable::Clear(const Arguments& args) {
@@ -239,8 +245,13 @@ Handle<Value> HashTable::Clear(const Arguments& args) {
239245
HashTable *obj = ObjectWrap::Unwrap<HashTable>(args.This());
240246

241247
for(MapType::const_iterator itr = obj->map.begin(); itr != obj->map.end(); ) {
248+
Persistent<Value> key = itr->first;
249+
key.Dispose();
250+
key.Clear();
251+
242252
Persistent<Value> value = itr->second;
243253
value.Dispose();
254+
value.Clear();
244255

245256
itr = obj->map.erase(itr);
246257
}
@@ -315,7 +326,7 @@ Handle<Value> HashTable::ForEach(const Arguments& args) {
315326
}
316327
Local<Function> cb = Local<Function>::Cast(args[0]);
317328

318-
Handle<Object> ctx;
329+
Local<Object> ctx;
319330
if (args.Length() > 1 && args[1]->IsObject()) {
320331
ctx = args[1]->ToObject();
321332
} else {
@@ -328,8 +339,8 @@ Handle<Value> HashTable::ForEach(const Arguments& args) {
328339
MapType::const_iterator itr = obj->map.begin();
329340

330341
while (itr != obj->map.end()) {
331-
argv[0] = Persistent<Value>::New(itr->first);
332-
argv[1] = Persistent<Value>::New(itr->second);
342+
argv[0] = itr->first;
343+
argv[1] = itr->second;
333344
cb->Call(ctx, argc, argv);
334345
itr++;
335346
}
@@ -348,7 +359,7 @@ Handle<Value> HashTable::MapForEach(const Arguments& args) {
348359
}
349360
Local<Function> cb = Local<Function>::Cast(args[0]);
350361

351-
Handle<Object> ctx;
362+
Local<Object> ctx;
352363
if (args.Length() > 1 && args[1]->IsObject()) {
353364
ctx = args[1]->ToObject();
354365
} else {
@@ -361,8 +372,8 @@ Handle<Value> HashTable::MapForEach(const Arguments& args) {
361372
MapType::const_iterator itr = obj->map.begin();
362373

363374
while (itr != obj->map.end()) {
364-
argv[0] = Persistent<Value>::New(itr->second);
365-
argv[1] = Persistent<Value>::New(itr->first);
375+
argv[0] = itr->second;
376+
argv[1] = itr->first;
366377
cb->Call(ctx, argc, argv);
367378
itr++;
368379
}

0 commit comments

Comments
 (0)