@@ -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,78 @@ Local<Value> ErrnoException(Isolate* isolate,
752751}
753752
754753
755- // hack alert! copy of ErrnoException, tuned for uv errors
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+
768+ Local<Value> UVException (Isolate* isolate,
769+ int errorno,
770+ const char * syscall,
771+ const char * msg,
772+ const char * path) {
773+ return UVException (isolate, errorno, syscall, msg, path, nullptr );
774+ }
775+
776+
756777Local<Value> UVException (Isolate* isolate,
757778 int errorno,
758- const char *syscall,
759- const char *msg,
760- const char *path) {
779+ const char * syscall,
780+ const char * msg,
781+ const char * path,
782+ const char * dest) {
761783 Environment* env = Environment::GetCurrent (isolate);
762784
763785 if (!msg || !msg[0 ])
764786 msg = uv_strerror (errorno);
765787
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;
788+ Local<String> js_code = OneByteString (isolate, uv_err_name (errorno));
789+ Local<String> js_syscall = OneByteString (isolate, syscall);
790+ Local<String> js_path;
791+ Local<String> js_dest;
773792
774- Local<String> path_str;
793+ Local<String> js_msg = js_code;
794+ js_msg = String::Concat (js_msg, FIXED_ONE_BYTE_STRING (isolate, " : " ));
795+ js_msg = String::Concat (js_msg, OneByteString (isolate, msg));
796+ js_msg = String::Concat (js_msg, FIXED_ONE_BYTE_STRING (isolate, " , " ));
797+ js_msg = String::Concat (js_msg, js_syscall);
775798
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
799+ if (path != nullptr ) {
800+ js_path = StringFromPath (isolate, path);
789801
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);
802+ js_msg = String::Concat (js_msg, FIXED_ONE_BYTE_STRING (isolate, " '" ));
803+ js_msg = String::Concat (js_msg, js_path);
804+ js_msg = String::Concat (js_msg, FIXED_ONE_BYTE_STRING (isolate, " '" ));
799805 }
800806
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);
807+ if (dest != nullptr ) {
808+ js_dest = StringFromPath (isolate, dest);
805809
806- if (path != nullptr ) {
807- obj->Set (env->path_string (), path_str);
810+ js_msg = String::Concat (js_msg, FIXED_ONE_BYTE_STRING (isolate, " -> '" ));
811+ js_msg = String::Concat (js_msg, js_dest);
812+ js_msg = String::Concat (js_msg, FIXED_ONE_BYTE_STRING (isolate, " '" ));
808813 }
809814
810- if (syscall != nullptr ) {
811- obj->Set (env->syscall_string (), OneByteString (env->isolate (), syscall));
812- }
815+ Local<Object> e = Exception::Error (js_msg)->ToObject (isolate);
816+
817+ // TODO(piscisaureus) errno should probably go; the user has no way of
818+ // knowing which uv errno value maps to which error.
819+ e->Set (env->errno_string (), Integer::New (isolate, errorno));
820+ e->Set (env->code_string (), js_code);
821+ e->Set (env->syscall_string (), js_syscall);
822+ if (!js_path.IsEmpty ())
823+ e->Set (env->path_string (), js_path);
824+ if (!js_dest.IsEmpty ())
825+ e->Set (env->dest_string (), js_dest);
813826
814827 return e;
815828}
0 commit comments