*** tclExecute.c	2006-03-30 03:03:24.000000000 +0200
--- tclExecute.c.new	2006-07-14 13:55:20.000000000 +0200
***************
*** 723,763 ****
      AuxData *auxDataPtr;
      LiteralEntry *entryPtr;
      Tcl_Obj *saveObjPtr, *resultPtr;
!     char *string;
      int length, i, result;
  
      /*
-      * First handle some common expressions specially.
-      */
- 
-     string = Tcl_GetStringFromObj(objPtr, &length);
-     if (length == 1) {
- 	if (*string == '0') {
- 	    TclNewBooleanObj(resultPtr, 0);
- 	    Tcl_IncrRefCount(resultPtr);
- 	    *resultPtrPtr = resultPtr;
- 	    return TCL_OK;
- 	} else if (*string == '1') {
- 	    TclNewBooleanObj(resultPtr, 1);
- 	    Tcl_IncrRefCount(resultPtr);
- 	    *resultPtrPtr = resultPtr;
- 	    return TCL_OK;
- 	}
-     } else if ((length == 2) && (*string == '!')) {
- 	if (*(string+1) == '0') {
- 	    TclNewBooleanObj(resultPtr, 1);
- 	    Tcl_IncrRefCount(resultPtr);
- 	    *resultPtrPtr = resultPtr;
- 	    return TCL_OK;
- 	} else if (*(string+1) == '1') {
- 	    TclNewBooleanObj(resultPtr, 0);
- 	    Tcl_IncrRefCount(resultPtr);
- 	    *resultPtrPtr = resultPtr;
- 	    return TCL_OK;
- 	}
-     }
- 
-     /*
       * Get the ByteCode from the object. If it exists, make sure it hasn't
       * been invalidated by, e.g., someone redefining a command with a compile
       * procedure (this might make the compiled code wrong). If necessary,
--- 723,732 ----
      AuxData *auxDataPtr;
      LiteralEntry *entryPtr;
      Tcl_Obj *saveObjPtr, *resultPtr;
!     char *string = NULL;
      int length, i, result;
  
      /*
       * Get the ByteCode from the object. If it exists, make sure it hasn't
       * been invalidated by, e.g., someone redefining a command with a compile
       * procedure (this might make the compiled code wrong). If necessary,
***************
*** 782,789 ****
--- 751,792 ----
  		objPtr->typePtr = (Tcl_ObjType *) NULL;
  	    }
  	}
+     } else {
+     /*
+      * First handle some common expressions specially.
+      */
+ 
+         string = Tcl_GetStringFromObj(objPtr, &length);
+         if (length == 1) {
+             if (*string == '0') {
+                 TclNewBooleanObj(resultPtr, 0);
+                 Tcl_IncrRefCount(resultPtr);
+                 *resultPtrPtr = resultPtr;
+                 return TCL_OK;
+             } else if (*string == '1') {
+                 TclNewBooleanObj(resultPtr, 1);
+                 Tcl_IncrRefCount(resultPtr);
+                 *resultPtrPtr = resultPtr;
+                 return TCL_OK;
+             }
+         } else if ((length == 2) && (*string == '!')) {
+             if (*(string+1) == '0') {
+                 TclNewBooleanObj(resultPtr, 1);
+                 Tcl_IncrRefCount(resultPtr);
+                 *resultPtrPtr = resultPtr;
+                 return TCL_OK;
+             } else if (*(string+1) == '1') {
+                 TclNewBooleanObj(resultPtr, 0);
+                 Tcl_IncrRefCount(resultPtr);
+                 *resultPtrPtr = resultPtr;
+                 return TCL_OK;
+             }
+     }
+ 
+ 
      }
      if (objPtr->typePtr != &tclByteCodeType) {
+         if( string == NULL ) string = Tcl_GetStringFromObj(objPtr, &length);
  	TclInitCompileEnv(interp, &compEnv, string, length);
  	result = TclCompileExpr(interp, string, length, &compEnv);
  
