@@ -598,39 +598,56 @@ Local<Value> BSONDeserializer::DeserializeValue(BsonType type, bool promoteLongs
598
598
return Nan::Null ();
599
599
}
600
600
601
+ // statics
601
602
Persistent<FunctionTemplate> BSON::constructor_template;
603
+ Persistent<String> BSON::longString;
604
+ Persistent<String> BSON::objectIDString;
605
+ Persistent<String> BSON::binaryString;
606
+ Persistent<String> BSON::codeString;
607
+ Persistent<String> BSON::dbrefString;
608
+ Persistent<String> BSON::symbolString;
609
+ Persistent<String> BSON::doubleString;
610
+ Persistent<String> BSON::timestampString;
611
+ Persistent<String> BSON::minKeyString;
612
+ Persistent<String> BSON::maxKeyString;
613
+ Persistent<String> BSON::_bsontypeString;
614
+ Persistent<String> BSON::_longLowString;
615
+ Persistent<String> BSON::_longHighString;
616
+ Persistent<String> BSON::_objectIDidString;
617
+ Persistent<String> BSON::_binaryPositionString;
618
+ Persistent<String> BSON::_binarySubTypeString;
619
+ Persistent<String> BSON::_binaryBufferString;
620
+ Persistent<String> BSON::_doubleValueString;
621
+ Persistent<String> BSON::_symbolValueString;
622
+ Persistent<String> BSON::_dbRefRefString;
623
+ Persistent<String> BSON::_dbRefIdRefString;
624
+ Persistent<String> BSON::_dbRefDbRefString;
625
+ Persistent<String> BSON::_dbRefNamespaceString;
626
+ Persistent<String> BSON::_dbRefDbString;
627
+ Persistent<String> BSON::_dbRefOidString;
628
+ Persistent<String> BSON::_codeCodeString;
629
+ Persistent<String> BSON::_codeScopeString;
630
+ Persistent<String> BSON::_toBSONString;
631
+
632
+ BSON::BSON () : ObjectWrap()
633
+ {
634
+ }
602
635
603
- BSON::BSON () : ObjectWrap() {
604
- // Setup pre-allocated comparision objects
605
- NanAssignPersistent (_bsontypeString, NanStr (" _bsontype" ));
606
- NanAssignPersistent (_longLowString, NanStr (" low_" ));
607
- NanAssignPersistent (_longHighString, NanStr (" high_" ));
608
- NanAssignPersistent (_objectIDidString, NanStr (" id" ));
609
- NanAssignPersistent (_binaryPositionString, NanStr (" position" ));
610
- NanAssignPersistent (_binarySubTypeString, NanStr (" sub_type" ));
611
- NanAssignPersistent (_binaryBufferString, NanStr (" buffer" ));
612
- NanAssignPersistent (_doubleValueString, NanStr (" value" ));
613
- NanAssignPersistent (_symbolValueString, NanStr (" value" ));
614
- NanAssignPersistent (_dbRefRefString, NanStr (" $ref" ));
615
- NanAssignPersistent (_dbRefIdRefString, NanStr (" $id" ));
616
- NanAssignPersistent (_dbRefDbRefString, NanStr (" $db" ));
617
- NanAssignPersistent (_dbRefNamespaceString, NanStr (" namespace" ));
618
- NanAssignPersistent (_dbRefDbString, NanStr (" db" ));
619
- NanAssignPersistent (_dbRefOidString, NanStr (" oid" ));
620
- NanAssignPersistent (_codeCodeString, NanStr (" code" ));
621
- NanAssignPersistent (_codeScopeString, NanStr (" scope" ));
622
- NanAssignPersistent (_toBSONString, NanStr (" toBSON" ));
623
-
624
- NanAssignPersistent (longString, NanStr (" Long" ));
625
- NanAssignPersistent (objectIDString, NanStr (" ObjectID" ));
626
- NanAssignPersistent (binaryString, NanStr (" Binary" ));
627
- NanAssignPersistent (codeString, NanStr (" Code" ));
628
- NanAssignPersistent (dbrefString, NanStr (" DBRef" ));
629
- NanAssignPersistent (symbolString, NanStr (" Symbol" ));
630
- NanAssignPersistent (doubleString, NanStr (" Double" ));
631
- NanAssignPersistent (timestampString, NanStr (" Timestamp" ));
632
- NanAssignPersistent (minKeyString, NanStr (" MinKey" ));
633
- NanAssignPersistent (maxKeyString, NanStr (" MaxKey" ));
636
+ BSON::~BSON ()
637
+ {
638
+ Nan::HandleScope scope;
639
+ // dispose persistent handles
640
+ buffer.Reset ();
641
+ longConstructor.Reset ();
642
+ objectIDConstructor.Reset ();
643
+ binaryConstructor.Reset ();
644
+ codeConstructor.Reset ();
645
+ dbrefConstructor.Reset ();
646
+ symbolConstructor.Reset ();
647
+ doubleConstructor.Reset ();
648
+ timestampConstructor.Reset ();
649
+ minKeyConstructor.Reset ();
650
+ maxKeyConstructor.Reset ();
634
651
}
635
652
636
653
void BSON::Initialize (v8::Local<v8::Object> target) {
@@ -648,9 +665,40 @@ void BSON::Initialize(v8::Local<v8::Object> target) {
648
665
Nan::SetPrototypeMethod (t, " deserialize" , BSONDeserialize);
649
666
Nan::SetPrototypeMethod (t, " deserializeStream" , BSONDeserializeStream);
650
667
651
- NanAssignPersistent (constructor_template, t);
668
+ constructor_template.Reset (t);
669
+
670
+ // Setup pre-allocated comparision objects
671
+ _bsontypeString.Reset (NanStr (" _bsontype" ));
672
+ _longLowString.Reset (NanStr (" low_" ));
673
+ _longHighString.Reset (NanStr (" high_" ));
674
+ _objectIDidString.Reset (NanStr (" id" ));
675
+ _binaryPositionString.Reset (NanStr (" position" ));
676
+ _binarySubTypeString.Reset (NanStr (" sub_type" ));
677
+ _binaryBufferString.Reset (NanStr (" buffer" ));
678
+ _doubleValueString.Reset (NanStr (" value" ));
679
+ _symbolValueString.Reset (NanStr (" value" ));
680
+ _dbRefRefString.Reset (NanStr (" $ref" ));
681
+ _dbRefIdRefString.Reset (NanStr (" $id" ));
682
+ _dbRefDbRefString.Reset (NanStr (" $db" ));
683
+ _dbRefNamespaceString.Reset (NanStr (" namespace" ));
684
+ _dbRefDbString.Reset (NanStr (" db" ));
685
+ _dbRefOidString.Reset (NanStr (" oid" ));
686
+ _codeCodeString.Reset (NanStr (" code" ));
687
+ _codeScopeString.Reset (NanStr (" scope" ));
688
+ _toBSONString.Reset (NanStr (" toBSON" ));
689
+ longString.Reset (NanStr (" Long" ));
690
+ objectIDString.Reset (NanStr (" ObjectID" ));
691
+ binaryString.Reset (NanStr (" Binary" ));
692
+ codeString.Reset (NanStr (" Code" ));
693
+ dbrefString.Reset (NanStr (" DBRef" ));
694
+ symbolString.Reset (NanStr (" Symbol" ));
695
+ doubleString.Reset (NanStr (" Double" ));
696
+ timestampString.Reset (NanStr (" Timestamp" ));
697
+ minKeyString.Reset (NanStr (" MinKey" ));
698
+ maxKeyString.Reset (NanStr (" MaxKey" ));
652
699
653
700
target->ForceSet (NanStr (" BSON" ), t->GetFunction ());
701
+
654
702
}
655
703
656
704
// Create a new instance of BSON and passing it the existing context
@@ -681,7 +729,7 @@ NAN_METHOD(BSON::New) {
681
729
bson->maxBSONSize = maxBSONSize;
682
730
683
731
// Allocate a new Buffer
684
- NanAssignPersistent ( bson->buffer , Unmaybe (Nan::NewBuffer (sizeof (char ) * maxBSONSize)));
732
+ bson->buffer . Reset ( Unmaybe (Nan::NewBuffer (sizeof (char ) * maxBSONSize)));
685
733
686
734
// Defined the classmask
687
735
uint32_t foundClassesMask = 0 ;
@@ -694,34 +742,34 @@ NAN_METHOD(BSON::New) {
694
742
695
743
// Save the functions making them persistant handles (they don't get collected)
696
744
if (functionName->StrictEquals (NanStr (bson->longString ))) {
697
- NanAssignPersistent ( bson->longConstructor , func);
745
+ bson->longConstructor . Reset ( func);
698
746
foundClassesMask |= 1 ;
699
747
} else if (functionName->StrictEquals (NanStr (bson->objectIDString ))) {
700
- NanAssignPersistent ( bson->objectIDConstructor , func);
748
+ bson->objectIDConstructor . Reset ( func);
701
749
foundClassesMask |= 2 ;
702
750
} else if (functionName->StrictEquals (NanStr (bson->binaryString ))) {
703
- NanAssignPersistent ( bson->binaryConstructor , func);
751
+ bson->binaryConstructor . Reset ( func);
704
752
foundClassesMask |= 4 ;
705
753
} else if (functionName->StrictEquals (NanStr (bson->codeString ))) {
706
- NanAssignPersistent ( bson->codeConstructor , func);
754
+ bson->codeConstructor . Reset ( func);
707
755
foundClassesMask |= 8 ;
708
756
} else if (functionName->StrictEquals (NanStr (bson->dbrefString ))) {
709
- NanAssignPersistent ( bson->dbrefConstructor , func);
757
+ bson->dbrefConstructor . Reset ( func);
710
758
foundClassesMask |= 0x10 ;
711
759
} else if (functionName->StrictEquals (NanStr (bson->symbolString ))) {
712
- NanAssignPersistent ( bson->symbolConstructor , func);
760
+ bson->symbolConstructor . Reset ( func);
713
761
foundClassesMask |= 0x20 ;
714
762
} else if (functionName->StrictEquals (NanStr (bson->doubleString ))) {
715
- NanAssignPersistent ( bson->doubleConstructor , func);
763
+ bson->doubleConstructor . Reset ( func);
716
764
foundClassesMask |= 0x40 ;
717
765
} else if (functionName->StrictEquals (NanStr (bson->timestampString ))) {
718
- NanAssignPersistent ( bson->timestampConstructor , func);
766
+ bson->timestampConstructor . Reset ( func);
719
767
foundClassesMask |= 0x80 ;
720
768
} else if (functionName->StrictEquals (NanStr (bson->minKeyString ))) {
721
- NanAssignPersistent ( bson->minKeyConstructor , func);
769
+ bson->minKeyConstructor . Reset ( func);
722
770
foundClassesMask |= 0x100 ;
723
771
} else if (functionName->StrictEquals (NanStr (bson->maxKeyString ))) {
724
- NanAssignPersistent ( bson->maxKeyConstructor , func);
772
+ bson->maxKeyConstructor . Reset ( func);
725
773
foundClassesMask |= 0x200 ;
726
774
}
727
775
}
@@ -895,8 +943,8 @@ NAN_METHOD(BSON::BSONSerialize) {
895
943
896
944
// If we have 3 arguments
897
945
if (info.Length () == 3 || info.Length () == 4 ) {
898
- Local<Object> buffer = Unmaybe ( Nan::CopyBuffer (serialized_object, object_size));
899
- free ( final );
946
+ // NewBuffer takes ownership on the memory, so no need to free the final allocation
947
+ Local<Object> buffer = Unmaybe ( Nan::NewBuffer (serialized_object, object_size) );
900
948
info.GetReturnValue ().Set (buffer);
901
949
} else {
902
950
Local<Value> bin_value = Nan::Encode (serialized_object, object_size)->ToString ();
0 commit comments