Tcl Source Code

View Ticket
Login
Ticket UUID: 77f0dbc0f8234ace6f613a37831d33fa5407ad63
Title: Wrong errorstack when using slave interp
Type: Bug Version: 8.6.6
Submitter: danckaert Created on: 2017-07-26 12:00:05
Subsystem: 20. [interp] Assigned To: nobody
Priority: 5 Medium Severity: Minor
Status: Open Last Modified: 2017-07-31 08:58:15
Resolution: None Closed By: nobody
    Closed on:
Description:

When running the following code:

interp create slave
interp alias slave foo {} master_foo
proc master_foo {arg} {}
proc run_in_slave {s} {
    try {
        interp eval slave $s
    } on error {msg options} {
        puts $options
    }
}
catch {error "catched error"}
run_in_slave {foo}
The output is:
-errorstack {INNER {returnImm {catched error} {}} CALL {run_in_slave foo}} -errorcode {TCL WRONGARGS} -errorinfo {wrong # args: should be "foo arg"
    invoked from within
"foo"
    invoked from within
"interp eval slave $s"} -errorline 3 -code 1 -level 0
The INNER part int the errorstack refers to a previous error which had already been catched and should not be present anymore. Note that -errorinfo and -errorcode are correct however.

User Comments: danckaert added on 2017-07-31 08:58:15:
With that change, the errorstack only contains CALL {run_in_slave foo}, but it should also contain an INNER {invokeStk1 foo} part, I think.

aspect added on 2017-07-27 14:46:03:
This might come from Tcl_GetReturnOptions() not respecting resetErrorStack -
when it grabs the error stack from the master, the stale error stack gets
captured and sent into the slave.

https://core.tcl.tk/tcl/artifact/0947f3566cd3dbab?ln=1625

Replacing that line with the following seems to clear it up:

        if (iPtr->resetErrorStack) {
            Tcl_DictObjPut(NULL, options, keys[KEY_ERRORSTACK], Tcl_NewListObj(NULL, 0));
        } else {                                  
            Tcl_DictObjPut(NULL, options, keys[KEY_ERRORSTACK], iPtr->errorStack);
        }


.. but I don't understand why an alias back into the master is needed to
observe this; someone who knows better should check.