Tcl Source Code

Check-in [45569c7084]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Fix for [b9ecf3ce98], [uplevel] unnecessarily generates string representation.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | core-8-branch
Files: files | file ages | folders
SHA3-256: 45569c70843466323a8aab1c59328c0331a32485a6926128c0ce55641ee5d930
User & Date: pooryorick 2020-09-19 14:10:44
References
2020-09-19
14:15 Ticket [b9ecf3ce98] uplevel $list, uplevel 1 $list and generation of string representations status still Open with 3 other changes artifact: bf67df259c user: pooryorick
Context
2020-09-19
16:48
merge mark (safety) check-in: 7d49ac4d02 user: dgp tags: core-8-branch
14:33
Fix for [b9ecf3ce98], [uplevel] unnecessarily generates string representation. check-in: d67c23f6d1 user: pooryorick tags: core-8-6-branch
14:10
Fix for [b9ecf3ce98], [uplevel] unnecessarily generates string representation. check-in: 45569c7084 user: pooryorick tags: core-8-branch
2020-09-17
13:48
Eliminate many usages of Tcl_NewObj (-> TclNewObj) and Tcl_NewIntObj (-> TclNewIntObj or Tcl_NewWide... check-in: ef22eb8ac3 user: jan.nijtmans tags: core-8-branch
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to generic/tclProc.c.

901
902
903
904
905
906
907

908
909
910
911
912





913
914
915









916



917



918
919
920
921
922
923
924
925
926
927
928
929
930


931
932
933
934
935
936
937
    int objc,			/* Number of arguments. */
    Tcl_Obj *const objv[])	/* Argument objects. */
{

    Interp *iPtr = (Interp *) interp;
    CmdFrame *invoker = NULL;
    int word = 0;

    int result;
    CallFrame *savedVarFramePtr, *framePtr;
    Tcl_Obj *objPtr;

    if (objc < 2) {





    uplevelSyntax:
	Tcl_WrongNumArgs(interp, 1, objv, "?level? command ?arg ...?");
	return TCL_ERROR;









    }







    /*
     * Find the level to use for executing the command.
     */

    result = TclObjGetFrame(interp, objv[1], &framePtr);
    if (result == -1) {
	return TCL_ERROR;
    }
    objc -= result + 1;
    if (objc == 0) {
	goto uplevelSyntax;
    }
    objv += result + 1;



    /*
     * Modify the interpreter state to execute in the given frame.
     */

    savedVarFramePtr = iPtr->varFramePtr;
    iPtr->varFramePtr = framePtr;







>





>
>
>
>
>



>
>
>
>
>
>
>
>
>
|
>
>
>
|
>
>
>
|
|
|

|
|
|
|
|
|
|
|
|
>
>







901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
    int objc,			/* Number of arguments. */
    Tcl_Obj *const objv[])	/* Argument objects. */
{

    Interp *iPtr = (Interp *) interp;
    CmdFrame *invoker = NULL;
    int word = 0;
    int havelevel = 0;
    int result;
    CallFrame *savedVarFramePtr, *framePtr;
    Tcl_Obj *objPtr;

    if (objc < 2) {
    /* to do 
    *    simplify things by interpreting the argument as a command when there
    *    is only one argument.  This requires a TIP since currently a single
    *    argument is interpreted as a level indicator if possible.
    */
    uplevelSyntax:
	Tcl_WrongNumArgs(interp, 1, objv, "?level? command ?arg ...?");
	return TCL_ERROR;
    } else if (objc == 2) {
	int status ,llength;
	status = Tcl_ListObjLength(interp, objv[1], &llength);
	if (status == TCL_OK && llength > 1) {
	    /* the first argument can't interpreted as a level. Avoid
	     * generating a string representation of the script. */
	    result = TclGetFrame(interp, "1", &framePtr);
	    if (result == -1) {
		return TCL_ERROR;
	    }
	    havelevel = 1;
	    objc -= 1;
	    objv += 1;
	}
    }

    if (!havelevel) {
	/*
	 * Find the level to use for executing the command.
	 */

	result = TclObjGetFrame(interp, objv[1], &framePtr);
	if (result == -1) {
	    return TCL_ERROR;
	}
	objc -= result + 1;
	if (objc == 0) {
	    goto uplevelSyntax;
	}
	objv += result + 1;
    }


    /*
     * Modify the interpreter state to execute in the given frame.
     */

    savedVarFramePtr = iPtr->varFramePtr;
    iPtr->varFramePtr = framePtr;

Changes to tests/uplevel.test.

300
301
302
303
304
305
306
307

















308
309
310
311
312
313
314
    }
    foo
    moo
} -cleanup {
    rename foo {}
    rename moo {}
} -result {3 3 3}


















# cleanup
::tcltest::cleanupTests
return

# Local Variables:
# mode: tcl
# fill-column: 78







|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
    }
    foo
    moo
} -cleanup {
    rename foo {}
    rename moo {}
} -result {3 3 3}


test uplevel-8.0 {
    string representation isn't generated when there is only one argument
} -body {
    set res {} 
    set script [list lindex 5]
    lappend res [apply {script {
	uplevel $script
    }} $script]
    lappend res [string match {value is a list *no string representation*} [
	::tcl::unsupported::representation $script]]
} -cleanup {
    unset script
    unset res
} -result {5 1}


# cleanup
::tcltest::cleanupTests
return

# Local Variables:
# mode: tcl
# fill-column: 78