Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Move refCount management of lookupNsPtr out of "resolve:/goto resolve" block. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | bug-e593adf103-core-8 |
Files: | files | file ages | folders |
SHA3-256: |
8d4c3590c5bd0a9a7494cbff79af863e |
User & Date: | pooryorick 2018-05-26 04:16:22 |
Context
2018-05-26
| ||
16:42 | merge 8.7 check-in: 74f9541fc2 user: dgp tags: bug-e593adf103-core-8 | |
04:16 | Move refCount management of lookupNsPtr out of "resolve:/goto resolve" block. check-in: 8d4c3590c5 user: pooryorick tags: bug-e593adf103-core-8 | |
2018-05-21
| ||
20:19 | Fix Namespace reference counting error in TclRenameCommand. check-in: df82243aa5 user: pooryorick tags: bug-e593adf103-core-8 | |
Changes
Changes to generic/tclBasic.c.
︙ | ︙ | |||
2705 2706 2707 2708 2709 2710 2711 | if (result != TCL_OK) { Tcl_DeleteHashEntry(cmdPtr->hPtr); cmdPtr->hPtr = oldHPtr; /* reference count was already incremented above */ cmdPtr->nsPtr = cmdNsPtr; goto done; } else { | | | 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 | if (result != TCL_OK) { Tcl_DeleteHashEntry(cmdPtr->hPtr); cmdPtr->hPtr = oldHPtr; /* reference count was already incremented above */ cmdPtr->nsPtr = cmdNsPtr; goto done; } else { cmdPtr->nsPtr->refCount++; TclNsDecrRefCount(cmdNsPtr); } /* * The list of command exported from the namespace might have changed. * However, we do not need to recompute this just yet; next time we need * the info will be soon enough. These might refer to the same variable, |
︙ | ︙ | |||
4263 4264 4265 4266 4267 4268 4269 | return TCL_OK; } static int EvalObjvCore( ClientData data[], Tcl_Interp *interp, | | | > | 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 | return TCL_OK; } static int EvalObjvCore( ClientData data[], Tcl_Interp *interp, int result) /* ignored */ { Command *cmdPtr = NULL, *preCmdPtr = data[0]; int flags = PTR2INT(data[1]); int objc = PTR2INT(data[2]); Tcl_Obj **objv = data[3]; Interp *iPtr = (Interp *) interp; Namespace *lookupNsPtr = NULL; int enterTracesDone = 0; result = TCL_OK; /* * Push records for task to be done on return, in INVERSE order. First, if * needed, the exception handlers (as they should happen last). */ if (!(flags & TCL_EVAL_NOERR)) { |
︙ | ︙ | |||
4349 4350 4351 4352 4353 4354 4355 | /* * When it's been deleted, and we're told not to attempt * resolving it ourselves, all we can do is raise an error. */ Tcl_SetObjResult(interp, Tcl_ObjPrintf( "attempt to invoke a deleted command")); Tcl_SetErrorCode(interp, "TCL", "EVAL", "DELETEDCOMMAND", NULL); | | > | | < | < < < < < | | | | 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 | /* * When it's been deleted, and we're told not to attempt * resolving it ourselves, all we can do is raise an error. */ Tcl_SetObjResult(interp, Tcl_ObjPrintf( "attempt to invoke a deleted command")); Tcl_SetErrorCode(interp, "TCL", "EVAL", "DELETEDCOMMAND", NULL); result = TCL_ERROR; goto cleanup; } } if (cmdPtr == NULL) { cmdPtr = TEOV_LookupCmdFromObj(interp, objv[0], lookupNsPtr); if (!cmdPtr) { result = TEOV_NotFound(interp, objc, objv, lookupNsPtr); goto cleanup; } } if (enterTracesDone || iPtr->tracePtr || (cmdPtr->flags & CMD_HAS_EXEC_TRACES)) { Tcl_Obj *commandPtr = TclGetSourceFromFrame( flags & TCL_EVAL_SOURCE_IN_FRAME ? iPtr->cmdFramePtr : NULL, objc, objv); Tcl_IncrRefCount(commandPtr); if (!enterTracesDone) { result = TEOV_RunEnterTraces(interp, &cmdPtr, commandPtr, objc, objv); /* * Send any exception from enter traces back as an exception * raised by the traced command. * TODO: Is this a bug? Letting an execution trace BREAK or * CONTINUE or RETURN in the place of the traced command? * Would either converting all exceptions to TCL_ERROR, or * just swallowing them be better? (Swallowing them has the * problem of permanently hiding program errors.) */ if (result != TCL_OK) { Tcl_DecrRefCount(commandPtr); goto cleanup; } /* * If the enter traces made the resolved cmdPtr unusable, go * back and resolve again, but next time don't run enter * traces again. */ |
︙ | ︙ | |||
4421 4422 4423 4424 4425 4426 4427 | TclNRAddCallback(interp, TEOV_RunLeaveTraces, INT2PTR(objc), commandPtr, cmdPtr, objv); } TclNRAddCallback(interp, Dispatch, cmdPtr->nreProc ? cmdPtr->nreProc : cmdPtr->objProc, cmdPtr->objClientData, INT2PTR(objc), objv); | > > > > > > > | | 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 | TclNRAddCallback(interp, TEOV_RunLeaveTraces, INT2PTR(objc), commandPtr, cmdPtr, objv); } TclNRAddCallback(interp, Dispatch, cmdPtr->nreProc ? cmdPtr->nreProc : cmdPtr->objProc, cmdPtr->objClientData, INT2PTR(objc), objv); cleanup: if (lookupNsPtr) { TclNsDecrRefCount(lookupNsPtr); } return result; } static int Dispatch( ClientData data[], Tcl_Interp *interp, int result) |
︙ | ︙ |