diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2017-07-03 12:32:38 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2017-07-03 12:32:38 (GMT) |
commit | 50dd22e6cdf60c09bbab7adb19cd338f37b85dd7 (patch) | |
tree | 66680f31354b7397dcd85df73423554298d825fb /generic/tclPathObj.c | |
parent | fafe9a283fd31baef4c4c0ea42826dac9d6ae2c9 (diff) | |
parent | f7a562e6ef980a33224b0f7f578e9b4b0c0280c0 (diff) | |
download | tcl-50dd22e6cdf60c09bbab7adb19cd338f37b85dd7.zip tcl-50dd22e6cdf60c09bbab7adb19cd338f37b85dd7.tar.gz tcl-50dd22e6cdf60c09bbab7adb19cd338f37b85dd7.tar.bz2 |
merge core-8-6-branch
Diffstat (limited to 'generic/tclPathObj.c')
-rw-r--r-- | generic/tclPathObj.c | 58 |
1 files changed, 26 insertions, 32 deletions
diff --git a/generic/tclPathObj.c b/generic/tclPathObj.c index 31ed68e..60aafdf 100644 --- a/generic/tclPathObj.c +++ b/generic/tclPathObj.c @@ -849,18 +849,18 @@ TclJoinPath( int elements, Tcl_Obj * const objv[]) { - Tcl_Obj *res; + Tcl_Obj *res = NULL; /* Resulting path object (container of join) */ + Tcl_Obj *elt; /* Path part (result if returns part of path) */ int i; const Tcl_Filesystem *fsPtr = NULL; - res = NULL; - for (i = 0; i < elements; i++) { int driveNameLength, strEltLen, length; Tcl_PathType type; char *strElt, *ptr; Tcl_Obj *driveName = NULL; - Tcl_Obj *elt = objv[i]; + + elt = objv[i]; /* * This is a special case where we can be much more efficient, where @@ -893,10 +893,7 @@ TclJoinPath( * the base itself is just fine! */ - if (res != NULL) { - TclDecrRefCount(res); - } - return elt; + goto partReturn; /* return elt; */ } /* @@ -917,20 +914,20 @@ TclJoinPath( */ if ((tclPlatform != TCL_PLATFORM_WINDOWS) - || (strchr(Tcl_GetString(elt), '\\') == NULL)) { - if (res != NULL) { - TclDecrRefCount(res); - } - + || (strchr(Tcl_GetString(elt), '\\') == NULL) + ) { if (PATHFLAGS(elt)) { - return TclNewFSPathObj(elt, str, len); + elt = TclNewFSPathObj(elt, str, len); + goto partReturn; /* return elt; */ } if (TCL_PATH_ABSOLUTE != Tcl_FSGetPathType(elt)) { - return TclNewFSPathObj(elt, str, len); + elt = TclNewFSPathObj(elt, str, len); + goto partReturn; /* return elt; */ } (void) Tcl_FSGetNormalizedPath(NULL, elt); if (elt == PATHOBJ(elt)->normPathPtr) { - return TclNewFSPathObj(elt, str, len); + elt = TclNewFSPathObj(elt, str, len); + goto partReturn; /* return elt; */ } } } @@ -940,19 +937,15 @@ TclJoinPath( * more general code below handle things. */ } else if (tclPlatform == TCL_PLATFORM_UNIX) { - if (res != NULL) { - TclDecrRefCount(res); - } - return tailObj; + elt = tailObj; + goto partReturn; /* return elt; */ } else { const char *str = TclGetString(tailObj); if (tclPlatform == TCL_PLATFORM_WINDOWS) { if (strchr(str, '\\') == NULL) { - if (res != NULL) { - TclDecrRefCount(res); - } - return tailObj; + elt = tailObj; + goto partReturn; /* return elt; */ } } } @@ -1031,16 +1024,12 @@ TclJoinPath( } ptr++; } - if (res != NULL) { - TclDecrRefCount(res); - } - /* * This element is just what we want to return already; no further * manipulation is requred. */ - return elt; + goto partReturn; /* return elt; */ } /* @@ -1051,10 +1040,8 @@ TclJoinPath( noQuickReturn: if (res == NULL) { res = Tcl_NewObj(); - ptr = Tcl_GetStringFromObj(res, &length); - } else { - ptr = Tcl_GetStringFromObj(res, &length); } + ptr = Tcl_GetStringFromObj(res, &length); /* * Strip off any './' before a tilde, unless this is the beginning of @@ -1087,6 +1074,7 @@ TclJoinPath( if (sep != NULL) { separator = TclGetString(sep)[0]; + TclDecrRefCount(sep); } /* Safety check in case the VFS driver caused sharing */ if (Tcl_IsShared(res)) { @@ -1126,6 +1114,12 @@ TclJoinPath( res = Tcl_NewObj(); } return res; + +partReturn: + if (res != NULL) { + TclDecrRefCount(res); + } + return elt; } /* |