Index: TODO =================================================================== diff -u -N -r9a578692ecf2d05eb4da0de37c7e0bdca3819570 -r3696772f6383ca87f6f4c7716a12843afacdff2f --- TODO (.../TODO) (revision 9a578692ecf2d05eb4da0de37c7e0bdca3819570) +++ TODO (.../TODO) (revision 3696772f6383ca87f6f4c7716a12843afacdff2f) @@ -1964,6 +1964,10 @@ * just show warning and errors when rebuilding pkgIndex files * stop make in case of errors in pkg_mkIndex +- Fixed switching between INACTIVE_MIXIN frames to ACTIVE_MIXIN frames +- Extended regression test + + TODO: - "-returns" Index: generic/nsf.c =================================================================== diff -u -N -r7ac9328ee6b3fd77da6da4235e10f29c3c4513de -r3696772f6383ca87f6f4c7716a12843afacdff2f --- generic/nsf.c (.../nsf.c) (revision 7ac9328ee6b3fd77da6da4235e10f29c3c4513de) +++ generic/nsf.c (.../nsf.c) (revision 3696772f6383ca87f6f4c7716a12843afacdff2f) @@ -9176,7 +9176,7 @@ */ if (object->mixinStack) { if (cscPtr->frameType == NSF_CSC_TYPE_ACTIVE_MIXIN) - cscPtr->frameType = NSF_CSC_TYPE_INACTIVE; + cscPtr->frameType = NSF_CSC_TYPE_INACTIVE_MIXIN; /* otherwise move the command pointer forward */ if (isMixinEntry) { @@ -15319,6 +15319,7 @@ if (object && (object->filterStack || object->mixinStack) ) { CallStackUseActiveFrame(interp, &ctx); } + if (!Tcl_Interp_varFramePtr(interp)) { CallStackRestoreSavedFrames(interp, &ctx); return NsfVarErrMsg(interp, "instvar used on ", objectName(object), Index: tests/varresolution.test =================================================================== diff -u -N -r84c5ee62a46e8fab7b9cc481c87290d387baced9 -r3696772f6383ca87f6f4c7716a12843afacdff2f --- tests/varresolution.test (.../varresolution.test) (revision 84c5ee62a46e8fab7b9cc481c87290d387baced9) +++ tests/varresolution.test (.../varresolution.test) (revision 3696772f6383ca87f6f4c7716a12843afacdff2f) @@ -1073,8 +1073,32 @@ ? {::ns1::o bar} "1-1-:XXX-" } +} +Test case after-next { + # + # This test case tests, whether we can use e..g an instvar in an + # mixin method after the next. In such cases, the frame flags have + # to be altered from inactive mixin to active mixin (otherwise the + # actual frame would be skipped in useActiveFrames below in :instvar). + # + Class create FormPage { + :attribute package_id + :public method initialize_loaded_object {} {;} + } + Class create WorkflowPage { + :alias instvar :::nsf::methods::object::instvar + :public method initialize_loaded_object {} { + next + :instvar package_id + return $package_id + } + FormPage mixin WorkflowPage + FormPage create p1 -package_id 123 + + ? {p1 initialize_loaded_object} 123 + } +} -} \ No newline at end of file