| ︙ | | | ︙ | |
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
|
Tcl_ObjectContextSkippedArgs(context));
}
/*
* Allocate the special frame data.
*/
fdPtr = TclInterpAlloc(interp, sizeof(PMFrameData));
/*
* Create a call frame for this method.
*/
result = PushMethodCallFrame(interp, (CallContext *) context, pmPtr,
objc, objv, fdPtr);
if (result != TCL_OK) {
TclInterpFree(interp, fdPtr);
return result;
}
pmPtr->refCount++;
/*
* Give the pre-call callback a chance to do some setup and, possibly,
* veto the call.
|
|
|
|
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
|
Tcl_ObjectContextSkippedArgs(context));
}
/*
* Allocate the special frame data.
*/
fdPtr = ckalloc(sizeof(PMFrameData));
/*
* Create a call frame for this method.
*/
result = PushMethodCallFrame(interp, (CallContext *) context, pmPtr,
objc, objv, fdPtr);
if (result != TCL_OK) {
ckfree(fdPtr);
return result;
}
pmPtr->refCount++;
/*
* Give the pre-call callback a chance to do some setup and, possibly,
* veto the call.
|
| ︙ | | | ︙ | |
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
|
* Restore the old cmdPtr so that a subsequent use of [info frame]
* won't crash on us. [Bug 3001438]
*/
pmPtr->procPtr->cmdPtr = fdPtr->oldCmdPtr;
Tcl_PopCallFrame(interp);
TclInterpFree(interp, fdPtr->framePtr);
if (--pmPtr->refCount < 1) {
DeleteProcedureMethodRecord(pmPtr);
}
TclInterpFree(interp, fdPtr);
return result;
}
}
/*
* Now invoke the body of the method.
*/
|
|
|
|
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
|
* Restore the old cmdPtr so that a subsequent use of [info frame]
* won't crash on us. [Bug 3001438]
*/
pmPtr->procPtr->cmdPtr = fdPtr->oldCmdPtr;
Tcl_PopCallFrame(interp);
ckfree(fdPtr->framePtr);
if (--pmPtr->refCount < 1) {
DeleteProcedureMethodRecord(pmPtr);
}
ckfree(fdPtr);
return result;
}
}
/*
* Now invoke the body of the method.
*/
|
| ︙ | | | ︙ | |
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
|
* are inlining DeleteProcedureMethod() here; this location is highly
* sensitive when it comes to performance!
*/
if (--pmPtr->refCount < 1) {
DeleteProcedureMethodRecord(pmPtr);
}
TclInterpFree(interp, fdPtr);
return result;
}
static int
PushMethodCallFrame(
Tcl_Interp *interp, /* Current interpreter. */
CallContext *contextPtr, /* Current method call context. */
|
|
|
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
|
* are inlining DeleteProcedureMethod() here; this location is highly
* sensitive when it comes to performance!
*/
if (--pmPtr->refCount < 1) {
DeleteProcedureMethodRecord(pmPtr);
}
ckfree(fdPtr);
return result;
}
static int
PushMethodCallFrame(
Tcl_Interp *interp, /* Current interpreter. */
CallContext *contextPtr, /* Current method call context. */
|
| ︙ | | | ︙ | |
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
|
FinalizeForwardCall(
ClientData data[],
Tcl_Interp *interp,
int result)
{
Tcl_Obj **argObjs = data[0];
TclInterpFree(interp, argObjs);
return result;
}
/*
* ----------------------------------------------------------------------
*
* DeleteForwardMethod, CloneForwardMethod --
|
|
|
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
|
FinalizeForwardCall(
ClientData data[],
Tcl_Interp *interp,
int result)
{
Tcl_Obj **argObjs = data[0];
ckfree(argObjs);
return result;
}
/*
* ----------------------------------------------------------------------
*
* DeleteForwardMethod, CloneForwardMethod --
|
| ︙ | | | ︙ | |
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
|
* array of rewritten arguments. */
{
Interp *iPtr = (Interp *) interp;
int isRootEnsemble = (iPtr->ensembleRewrite.sourceObjs == NULL);
Tcl_Obj **argObjs;
unsigned len = rewriteLength + objc - toRewrite;
argObjs = TclInterpAlloc(interp, sizeof(Tcl_Obj *) * len);
memcpy(argObjs, rewriteObjs, rewriteLength * sizeof(Tcl_Obj *));
memcpy(argObjs + rewriteLength, objv + toRewrite,
sizeof(Tcl_Obj *) * (objc - toRewrite));
/*
* Now plumb this into the core ensemble rewrite logging system so that
* Tcl_WrongNumArgs() can rewrite its result appropriately. The rules for
|
|
|
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
|
* array of rewritten arguments. */
{
Interp *iPtr = (Interp *) interp;
int isRootEnsemble = (iPtr->ensembleRewrite.sourceObjs == NULL);
Tcl_Obj **argObjs;
unsigned len = rewriteLength + objc - toRewrite;
argObjs = ckalloc(sizeof(Tcl_Obj *) * len);
memcpy(argObjs, rewriteObjs, rewriteLength * sizeof(Tcl_Obj *));
memcpy(argObjs + rewriteLength, objv + toRewrite,
sizeof(Tcl_Obj *) * (objc - toRewrite));
/*
* Now plumb this into the core ensemble rewrite logging system so that
* Tcl_WrongNumArgs() can rewrite its result appropriately. The rules for
|
| ︙ | | | ︙ | |