Blob Blame History Raw
commit 43d11bffa629143625266900e5ca8efea47f335d
Author: Tom Hughes <tom@compton.nu>
Date:   Mon Dec 7 11:38:23 2015 +0000

    Update to nan 2.x for nodejs 4.x
    
    Based on https://github.com/node-xmpp/node-stringprep/tree/nan2-astro

diff --git a/node-stringprep.cc b/node-stringprep.cc
index 4b5b371..83c272c 100644
--- a/node-stringprep.cc
+++ b/node-stringprep.cc
@@ -13,19 +13,19 @@ class UnknownProfileException : public std::exception {
 };
 
 // protect constructor from GC
-static Persistent<FunctionTemplate> stringprep_constructor;
+static Nan::Persistent<FunctionTemplate> stringprep_constructor;
 
-class StringPrep : public ObjectWrap {
+class StringPrep : public Nan::ObjectWrap {
 public:
   static void Initialize(Handle<Object> target)
   {
-    NanScope();
-    Local<FunctionTemplate> t = NanNew<FunctionTemplate>(New);
-    NanAssignPersistent(stringprep_constructor, t);
+    Nan::HandleScope scope;
+    Local<FunctionTemplate> t = Nan::New<FunctionTemplate>(New);
+    stringprep_constructor.Reset(t);
     t->InstanceTemplate()->SetInternalFieldCount(1);
-    NODE_SET_PROTOTYPE_METHOD(t, "prepare", Prepare);
+    Nan::SetPrototypeMethod(t, "prepare", Prepare);
 
-    target->Set(NanNew<String>("StringPrep"), t->GetFunction());
+    target->Set(Nan::New<String>("StringPrep").ToLocalChecked(), t->GetFunction());
   }
 
   bool good() const
@@ -43,11 +43,9 @@ protected:
 
   static NAN_METHOD(New)
   {
-    NanScope();
-
-    if (args.Length() >= 1 && args[0]->IsString())
+    if (info.Length() >= 1 && info[0]->IsString())
       {
-        String::Utf8Value arg0(args[0]->ToString());
+        Nan::Utf8String arg0(info[0]->ToString());
         UStringPrepProfileType profileType;
         try
           {
@@ -55,27 +53,28 @@ protected:
           }
         catch (UnknownProfileException &)
           {
-            NanThrowTypeError("Unknown StringPrep profile");
-            NanReturnUndefined();
+            Nan::ThrowTypeError("Unknown StringPrep profile");
+            return;
           }
 
         StringPrep *self = new StringPrep(profileType);
         if (self->good())
           {
-            self->Wrap(args.This());
-            NanReturnValue(args.This());
+            self->Wrap(info.This());
+            info.GetReturnValue().Set(info.This());
+            return;
           }
         else
           {
             const char* err = self->errorName();
             delete self;
-            NanThrowError(err);
-            NanReturnUndefined();
+            Nan::ThrowError(err);
+            return;
           }
       }
     else {
-      NanThrowTypeError("Bad argument.");
-      NanReturnUndefined();
+      Nan::ThrowTypeError("Bad argument.");
+      return;
     }
   }
 
@@ -97,22 +96,22 @@ protected:
 
   static NAN_METHOD(Prepare)
   {
-    NanScope();
-
-    if (args.Length() >= 1 && args[0]->IsString())
+    if (info.Length() >= 1 && info[0]->IsString())
       {
-        StringPrep *self = ObjectWrap::Unwrap<StringPrep>(args.This());
-        String::Value arg0(args[0]->ToString());
-        NanReturnValue(self->prepare(arg0));
+        StringPrep *self = Nan::ObjectWrap::Unwrap<StringPrep>(info.This());
+        String::Value arg0(info[0]->ToString());
+        info.GetReturnValue().Set(self->prepare(arg0));
+        return;
       }
     else {
-      NanThrowTypeError("Bad argument.");
-      NanReturnUndefined();
+      Nan::ThrowTypeError("Bad argument.");
+      return;
     }
   }
 
-  Handle<Value> prepare(String::Value &str)
+  Local<Value> prepare(String::Value &str)
   {
+    Nan::EscapableHandleScope scope;
     size_t destLen = str.length() + 1;
     UChar *dest = NULL;
     while(!dest)
@@ -135,23 +134,23 @@ protected:
           {
             // other error, just bail out
             delete[] dest;
-            NanThrowError(errorName());
-            return NanUndefined();
+            Nan::ThrowError(errorName());
+            return scope.Escape(Nan::Undefined());
           }
         else
           destLen = w;
       }
 
-    Local<String> result = NanNew<String>(dest, destLen);
+    Local<Value> result = Nan::New<String>(dest, destLen).ToLocalChecked();
     delete[] dest;
-    return result;
+    return scope.Escape(result);
   }
 
 private:
   UStringPrepProfile *profile;
   UErrorCode error;
 
-  static enum UStringPrepProfileType parseProfileType(String::Utf8Value &profile)
+  static enum UStringPrepProfileType parseProfileType(Nan::Utf8String &profile)
     throw(UnknownProfileException)
   {
     if (strcasecmp(*profile, "nameprep") == 0)
@@ -192,12 +191,10 @@ private:
 
 NAN_METHOD(ToUnicode)
 {
-  NanScope();
-
-  if (args.Length() >= 2 && args[0]->IsString() && args[1]->IsInt32())
+  if (info.Length() >= 2 && info[0]->IsString() && info[1]->IsInt32())
   {
-    String::Value str(args[0]->ToString());
-    int32_t options = args[1]->ToInt32()->Value();
+    String::Value str(info[0]->ToString());
+    int32_t options = info[1]->ToInt32()->Value();
 
     // ASCII encoding (xn--*--*) should be longer than Unicode
     size_t destLen = str.length() + 1;
@@ -222,31 +219,30 @@ NAN_METHOD(ToUnicode)
           {
             // other error, just bail out
             delete[] dest;
-            NanThrowError(u_errorName(error));
-            NanReturnUndefined();
+            Nan::ThrowError(u_errorName(error));
+            return;
           }
         else
           destLen = w;
       }
 
-    Local<String> result = NanNew<String>(dest, destLen);
+    Local<String> result = Nan::New<String>(dest, destLen).ToLocalChecked();
     delete[] dest;
-    NanReturnValue(result);
+    info.GetReturnValue().Set(result);
+    return;
   }
   else {
-    NanThrowTypeError("Bad argument.");
-    NanReturnUndefined();
+    Nan::ThrowTypeError("Bad argument.");
+    return;
   }
 }
 
 NAN_METHOD(ToASCII)
 {
-  NanScope();
-
-  if (args.Length() >= 2 && args[0]->IsString() && args[1]->IsInt32())
+  if (info.Length() >= 2 && info[0]->IsString() && info[1]->IsInt32())
   {
-    String::Value str(args[0]->ToString());
-    int32_t options = args[1]->ToInt32()->Value();
+    String::Value str(info[0]->ToString());
+    int32_t options = info[1]->ToInt32()->Value();
 
     // find out length first
     UErrorCode error = U_ZERO_ERROR;
@@ -270,28 +266,28 @@ NAN_METHOD(ToASCII)
       {
         // other error, just bail out
         delete[] dest;
-        NanThrowError(u_errorName(error));
-        NanReturnUndefined();
+        Nan::ThrowError(u_errorName(error));
+        return;
       }
 
-    Local<String> result = NanNew<String>(dest, destLen);
+    Local<String> result = Nan::New<String>(dest, destLen).ToLocalChecked();
     delete[] dest;
-    NanReturnValue(result);
+    info.GetReturnValue().Set(result);
+    return;
   }
   else {
-    NanThrowTypeError("Bad argument.");
-    NanReturnUndefined();
+    Nan::ThrowTypeError("Bad argument.");
+    return;
   }
 }
 
 /*** Initialization ***/
 
-extern "C" void init(Handle<Object> target)
+NAN_MODULE_INIT(init)
 {
-  NanScope();
   StringPrep::Initialize(target);
-  NODE_SET_METHOD(target, "toUnicode", ToUnicode);
-  NODE_SET_METHOD(target, "toASCII", ToASCII);
+  Nan::SetMethod(target, "toUnicode", ToUnicode);
+  Nan::SetMethod(target, "toASCII", ToASCII);
 }
 
 NODE_MODULE(node_stringprep, init)
diff --git a/package.json b/package.json
index bc1ccdf..cc2970a 100644
--- a/package.json
+++ b/package.json
@@ -14,7 +14,7 @@
   "dependencies": {
     "bindings": "~1.2.1",
     "debug": "~2.2.0",
-    "nan": "~1.8.4"
+    "nan": "^2.1.0"
   },
   "devDependencies": {
     "grunt": "~0.4.2",