@@ -698,11 +698,10 @@ void ThrowUVException(v8::Isolate* isolate,
698698 int errorno,
699699 const char * syscall,
700700 const char * message,
701- const char * path) {
702- Environment::GetCurrent (isolate)->ThrowErrnoException (errorno,
703- syscall,
704- message,
705- path);
701+ const char * path,
702+ const char * dest) {
703+ Environment::GetCurrent (isolate)
704+ ->ThrowUVException (errorno, syscall, message, path, dest);
706705}
707706
708707
@@ -752,64 +751,69 @@ Local<Value> ErrnoException(Isolate* isolate,
752751}
753752
754753
754+ static Local<String> StringFromPath (Isolate* isolate, const char * path) {
755+ #ifdef _WIN32
756+ if (strncmp (path, " \\\\ ?\\ UNC\\ " , 8 ) == 0 ) {
757+ return String::Concat (FIXED_ONE_BYTE_STRING (isolate, " \\\\ " ),
758+ String::NewFromUtf8 (isolate, path + 8 ));
759+ } else if (strncmp (path, " \\\\ ?\\ " , 4 ) == 0 ) {
760+ return String::NewFromUtf8 (isolate, path + 4 );
761+ }
762+ #endif
763+
764+ return String::NewFromUtf8 (isolate, path);
765+ }
766+
767+
755768// hack alert! copy of ErrnoException, tuned for uv errors
756769Local<Value> UVException (Isolate* isolate,
757770 int errorno,
758- const char *syscall,
759- const char *msg,
760- const char *path) {
771+ const char * syscall,
772+ const char * msg,
773+ const char * path,
774+ const char * dest) {
761775 Environment* env = Environment::GetCurrent (isolate);
762776
763777 if (!msg || !msg[0 ])
764778 msg = uv_strerror (errorno);
765779
766- Local<String> estring = OneByteString (env->isolate (), uv_err_name (errorno));
767- Local<String> message = OneByteString (env->isolate (), msg);
768- Local<String> cons1 =
769- String::Concat (estring, FIXED_ONE_BYTE_STRING (env->isolate (), " , " ));
770- Local<String> cons2 = String::Concat (cons1, message);
771-
772- Local<Value> e;
780+ Local<String> js_code = OneByteString (isolate, uv_err_name (errorno));
781+ Local<String> js_syscall = OneByteString (isolate, syscall);
782+ Local<String> js_path;
783+ Local<String> js_dest;
773784
774- Local<String> path_str;
785+ Local<String> js_msg = js_code;
786+ js_msg = String::Concat (js_msg, FIXED_ONE_BYTE_STRING (isolate, " : " ));
787+ js_msg = String::Concat (js_msg, OneByteString (isolate, msg));
788+ js_msg = String::Concat (js_msg, FIXED_ONE_BYTE_STRING (isolate, " , " ));
789+ js_msg = String::Concat (js_msg, js_syscall);
775790
776- if (path) {
777- #ifdef _WIN32
778- if (strncmp (path, " \\\\ ?\\ UNC\\ " , 8 ) == 0 ) {
779- path_str = String::Concat (FIXED_ONE_BYTE_STRING (env->isolate (), " \\\\ " ),
780- String::NewFromUtf8 (env->isolate (), path + 8 ));
781- } else if (strncmp (path, " \\\\ ?\\ " , 4 ) == 0 ) {
782- path_str = String::NewFromUtf8 (env->isolate (), path + 4 );
783- } else {
784- path_str = String::NewFromUtf8 (env->isolate (), path);
785- }
786- #else
787- path_str = String::NewFromUtf8 (env->isolate (), path);
788- #endif
791+ if (path != nullptr ) {
792+ js_path = StringFromPath (isolate, path);
789793
790- Local<String> cons3 =
791- String::Concat (cons2, FIXED_ONE_BYTE_STRING (env->isolate (), " '" ));
792- Local<String> cons4 =
793- String::Concat (cons3, path_str);
794- Local<String> cons5 =
795- String::Concat (cons4, FIXED_ONE_BYTE_STRING (env->isolate (), " '" ));
796- e = Exception::Error (cons5);
797- } else {
798- e = Exception::Error (cons2);
794+ js_msg = String::Concat (js_msg, FIXED_ONE_BYTE_STRING (isolate, " '" ));
795+ js_msg = String::Concat (js_msg, js_path);
796+ js_msg = String::Concat (js_msg, FIXED_ONE_BYTE_STRING (isolate, " '" ));
799797 }
800798
801- Local<Object> obj = e->ToObject (env->isolate ());
802- // TODO(piscisaureus) errno should probably go
803- obj->Set (env->errno_string (), Integer::New (env->isolate (), errorno));
804- obj->Set (env->code_string (), estring);
799+ if (dest != nullptr ) {
800+ js_dest = StringFromPath (isolate, dest);
805801
806- if (path != nullptr ) {
807- obj->Set (env->path_string (), path_str);
802+ js_msg = String::Concat (js_msg, FIXED_ONE_BYTE_STRING (isolate, " -> '" ));
803+ js_msg = String::Concat (js_msg, js_dest);
804+ js_msg = String::Concat (js_msg, FIXED_ONE_BYTE_STRING (isolate, " '" ));
808805 }
809806
810- if (syscall != nullptr ) {
811- obj->Set (env->syscall_string (), OneByteString (env->isolate (), syscall));
812- }
807+ Local<Object> e = Exception::Error (js_msg)->ToObject (isolate);
808+
809+ // TODO(piscisaureus) errorno should probably go
810+ e->Set (env->errno_string (), Integer::New (isolate, errorno));
811+ e->Set (env->code_string (), js_code);
812+ e->Set (env->syscall_string (), js_syscall);
813+ if (!js_path.IsEmpty ())
814+ e->Set (env->path_string (), js_path);
815+ if (!js_dest.IsEmpty ())
816+ e->Set (env->dest_string (), js_dest);
813817
814818 return e;
815819}
0 commit comments