Tcl Source Code

Artifact [d6c5464b80]
Login

Artifact d6c5464b80f7dfb8c4ad7ef4305b5f6f4f011747:

Attachment "461322.patch" to ticket [461322ffff] added by hobbs 2001-09-14 06:46:45.
Index: generic/tclCmdMZ.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclCmdMZ.c,v
retrieving revision 1.44
diff -b -c -r1.44 tclCmdMZ.c
*** generic/tclCmdMZ.c	2001/09/13 11:56:19	1.44
--- generic/tclCmdMZ.c	2001/09/13 23:44:54
***************
*** 471,477 ****
      int start, end, subStart, subEnd, match;
      Tcl_RegExp regExpr;
      Tcl_RegExpInfo info;
!     Tcl_Obj *resultPtr, *varPtr, *objPtr;
      Tcl_UniChar ch, *wsrc, *wfirstChar, *wstring, *wsubspec, *wend;
  
      static char *options[] = {
--- 471,477 ----
      int start, end, subStart, subEnd, match;
      Tcl_RegExp regExpr;
      Tcl_RegExpInfo info;
!     Tcl_Obj *resultPtr, *subPtr, *objPtr;
      Tcl_UniChar ch, *wsrc, *wfirstChar, *wstring, *wsubspec, *wend;
  
      static char *options[] = {
***************
*** 553,572 ****
  
      objv += idx;
  
      /*
!      * Get the length of the string that we are matching before
!      * getting the regexp to avoid shimmering problems.
       */
  
      objPtr	= objv[1];
      wstring	= Tcl_GetUnicodeFromObj(objPtr, &wlen);
!     wsubspec	= Tcl_GetUnicodeFromObj(objv[2], &wsublen);
!     varPtr	= objv[3];
! 
!     regExpr = Tcl_GetRegExpFromObj(interp, objv[0], cflags);
!     if (regExpr == NULL) {
! 	return TCL_ERROR;
      }
  
      result = TCL_OK;
      resultPtr = Tcl_NewUnicodeObj(wstring, 0);
--- 553,581 ----
  
      objv += idx;
  
+     regExpr = Tcl_GetRegExpFromObj(interp, objv[0], cflags);
+     if (regExpr == NULL) {
+ 	return TCL_ERROR;
+     }
+ 
      /*
!      * Make sure to avoid problems where the objects are shared.  This
!      * can cause RegExpObj <> UnicodeObj shimmering that causes data
!      * corruption.  [Bug #461322]
       */
  
+     if (objv[1] == objv[0]) {
+ 	objPtr = Tcl_DuplicateObj(objv[1]);
+     } else {
  	objPtr = objv[1];
+     }
      wstring = Tcl_GetUnicodeFromObj(objPtr, &wlen);
!     if (objv[2] == objv[0]) {
! 	subPtr = Tcl_DuplicateObj(objv[2]);
!     } else {
! 	subPtr = objv[2];
      }
+     wsubspec = Tcl_GetUnicodeFromObj(subPtr, &wsublen);
  
      result = TCL_OK;
      resultPtr = Tcl_NewUnicodeObj(wstring, 0);
***************
*** 598,604 ****
  	    break;
  	}
  	if ((numMatches == 0) && (offset > 0)) {
! 	    /* Copy the initial portion of the string in if an offset
  	     * was specified.
  	     */
  	    Tcl_AppendUnicodeToObj(resultPtr, wstring, offset);
--- 607,614 ----
  	    break;
  	}
  	if ((numMatches == 0) && (offset > 0)) {
! 	    /*
! 	     * Copy the initial portion of the string in if an offset
  	     * was specified.
  	     */
  	    Tcl_AppendUnicodeToObj(resultPtr, wstring, offset);
***************
*** 695,703 ****
      } else if (offset < wlen) {
  	Tcl_AppendUnicodeToObj(resultPtr, wstring + offset, wlen - offset);
      }
!     if (Tcl_ObjSetVar2(interp, varPtr, NULL, resultPtr, 0) == NULL) {
  	Tcl_AppendResult(interp, "couldn't set variable \"",
! 		Tcl_GetString(varPtr), "\"", (char *) NULL);
  	result = TCL_ERROR;
      } else {
  	/*
--- 705,713 ----
      } else if (offset < wlen) {
  	Tcl_AppendUnicodeToObj(resultPtr, wstring + offset, wlen - offset);
      }
!     if (Tcl_ObjSetVar2(interp, objv[3], NULL, resultPtr, 0) == NULL) {
  	Tcl_AppendResult(interp, "couldn't set variable \"",
! 		Tcl_GetString(objv[3]), "\"", (char *) NULL);
  	result = TCL_ERROR;
      } else {
  	/*
***************
*** 709,714 ****
--- 719,726 ----
      }
  
      done:
+     if (objv[1] == objv[0]) { Tcl_DecrRefCount(objPtr); }
+     if (objv[2] == objv[0]) { Tcl_DecrRefCount(subPtr); }
      Tcl_DecrRefCount(resultPtr);
      return result;
  }