@@ -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
137137Handle<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
236242Handle<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