diff options
| author | dkf <donal.k.fellows@manchester.ac.uk> | 2018-05-13 19:20:52 (GMT) |
|---|---|---|
| committer | dkf <donal.k.fellows@manchester.ac.uk> | 2018-05-13 19:20:52 (GMT) |
| commit | 5eef06ea24f7486a2dcca559a64b3ec08f0c6710 (patch) | |
| tree | f3ca471401c17e7a36b327041660b7ab1031e571 /generic/tclOOBasic.c | |
| parent | 9333525d11e12a66c55b6fff2721bf601abb5763 (diff) | |
| download | tcl-5eef06ea24f7486a2dcca559a64b3ec08f0c6710.zip tcl-5eef06ea24f7486a2dcca559a64b3ec08f0c6710.tar.gz tcl-5eef06ea24f7486a2dcca559a64b3ec08f0c6710.tar.bz2 | |
Correct results from unknown method handler.
Diffstat (limited to 'generic/tclOOBasic.c')
| -rw-r--r-- | generic/tclOOBasic.c | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/generic/tclOOBasic.c b/generic/tclOOBasic.c index 6306416..763f0ad 100644 --- a/generic/tclOOBasic.c +++ b/generic/tclOOBasic.c @@ -500,9 +500,12 @@ TclOO_Object_Unknown( Tcl_Obj *const *objv) /* The actual arguments. */ { CallContext *contextPtr = (CallContext *) context; + Object *callerObj = NULL; + Class *callerCls = NULL; Object *oPtr = contextPtr->oPtr; const char **methodNames; int numMethodNames, i, skip = Tcl_ObjectContextSkippedArgs(context); + CallFrame *framePtr = ((Interp *) interp)->varFramePtr; Tcl_Obj *errorMsg; /* @@ -517,10 +520,31 @@ TclOO_Object_Unknown( } /* + * Determine if the calling context should know about extra private + * methods, and if so, which. + */ + + if (framePtr->isProcCallFrame & FRAME_IS_METHOD) { + CallContext *callerContext = framePtr->clientData; + Method *mPtr = callerContext->callPtr->chain[ + callerContext->index].mPtr; + + if (mPtr->declaringObjectPtr) { + if (oPtr == mPtr->declaringObjectPtr) { + callerObj = mPtr->declaringObjectPtr; + } + } else { + if (TclOOIsReachable(mPtr->declaringClassPtr, oPtr->selfCls)) { + callerCls = mPtr->declaringClassPtr; + } + } + } + + /* * Get the list of methods that we want to know about. */ - numMethodNames = TclOOGetSortedMethodList(oPtr, + numMethodNames = TclOOGetSortedMethodList(oPtr, callerObj, callerCls, contextPtr->callPtr->flags & PUBLIC_METHOD, &methodNames); /* |
