There are also other places where this check is made. Search for Error_Execution_super to find it. The entire validateOverrideContext() method and it's calls should be deleted.
Rick On Mon, May 16, 2022 at 8:24 AM Rick McGuire <object.r...@gmail.com> wrote: > You have only fixed part of the problem. There's also a change required to > MessageInstruction.cpp and also tests needed for that case. > > Rick > > On Mon, May 16, 2022 at 8:15 AM Rick McGuire <object.r...@gmail.com> > wrote: > >> Weren't there any tests for the restriction that needed to be removed? I >> only need new tests added for the case where this is not restricted. Also, >> I'd recommend adding some tests using mixins to make sure the correct >> targets are getting invoked. >> >> Rick >> >> On Mon, May 16, 2022 at 8:10 AM Rony G. Flatscher < >> rony.flatsc...@wu.ac.at> wrote: >> >>> >>> On 15.05.2022 14:47, Rony G. Flatscher wrote: >>> >>> >>> On 15.05.2022 12:27, Rony G. Flatscher wrote: >>> >>> On 14.05.2022 22:06, Jean Louis Faucher wrote: >>> >>> >>> >>> - So there is a need for having one or more methods that can be used >>> for forcing the invocation of the ooRexx .Object methods. >>> >>> The syntax described in 4.2.7 Changing the Search Order for Methods >>> could be used, if the restriction >>> "Message search overrides can be used only from methods of the target >>> object” >>> was removed. >>> >>> It works with oorexx4, after removing the check >>> if (_target != context->getReceiver()) >>> in RexxExpressionMessage::evaluate. >>> >>> s1 = "hello" >>> s2 = "hello" >>> say s1~"="(s2) -- display 1 >>> say s1~"=":.Object(s2) -- display 0 because not the same objects >>> >>> Indeed that would really be a general, fine solution alleviating a >>> programmer to come up with weird and cumbersome solutions. >>> >>> Rather than having to create methods SEND.SUPER, SENDWITH.SUPER, >>> CLASS.SUPER and COPY.SUPER to allow programmers to invoke the ooRexx root >>> class methods in .object, this problem with OLEObject, but also all >>> comparable in general would be solved with this. So instead one could code >>> >>> - ole~send(msg) ... will check for existence on the Windows side, >>> and if present invoke it, otherwise lookup super (which is .object) >>> - ole~send:.object(msg) ... will start resolving the method in the >>> superclass bypassing inspecting .oleobject >>> >>> and with the same technique: >>> >>> - ole~sendWith:.object(msg,arrArg) >>> - ole~copy:.object >>> - ole~class:.object >>> >>> This would be much easier and very clear. >>> >>> In ooRexx 5.0 this would be the place to change: >>> >>> Index: interpreter/expression/ExpressionMessage.cpp >>> =================================================================== >>> --- interpreter/expression/ExpressionMessage.cpp (revision 12388) >>> +++ interpreter/expression/ExpressionMessage.cpp (working copy) >>> @@ -161,6 +161,7 @@ >>> // do we have a super class override? >>> if (super != OREF_NULL) >>> { >>> +/* >>> // super class overrides are only allowed if the >>> // sender and the target are the same object (i.e., a message to >>> SELF) >>> if (_target != context->getReceiver()) >>> @@ -167,6 +168,7 @@ >>> { >>> reportException(Error_Execution_super); >>> } >>> +*/ >>> >>> _super = (RexxClass *)super->evaluate(context, stack); >>> // we send the message using the stack, which >>> >>> Doing so will make your example work on ooRexx 5 as well! >>> >>> Also experimented with other scenarious, including ones where >>> "mistakingly" wrong override classes get supplied. >>> >>> arr=.array~of("a", "b") >>> ........................................... rexxtry.rex on WindowsNT >>> say arr~items >>> 2 >>> ........................................... rexxtry.rex on WindowsNT >>> say arr~items:super >>> Oooops ! ... try again. Object method not found. >>> Object "an Array" does not understand message >>> "ITEMS". >>> rc = 97.1 ................................. rexxtry.rex on WindowsNT >>> say arr~items:.collection >>> 2 >>> ........................................... rexxtry.rex on WindowsNT >>> say arr~items:.rexxinfo >>> Oooops ! ... try again. Object method not found. >>> Object "an Array" does not understand message >>> "ITEMS". >>> rc = 97.1 ................................. rexxtry.rex on WindowsNT >>> say arr~copy >>> a >>> b >>> ........................................... rexxtry.rex on WindowsNT >>> say arr~copy:.rexxinfo >>> Oooops ! ... try again. Object method not found. >>> Object "an Array" does not understand message >>> "COPY". >>> rc = 97.1 ................................. rexxtry.rex on WindowsNT >>> say arr~copy:.object >>> a >>> b >>> ........................................... rexxtry.rex on WindowsNT >>> >>> So ooRexx 5 already catches wrong overrides and raises the appropriate >>> conditions (cf. overrides "super", ".rexxinfo" above)! >>> >>> --- >>> >>> Conceptually this change will allow the programmer to not only send a >>> message to the object, but also to tell the object in which superclass to >>> start the search for a matching method if he has a need to do so. >>> >>> In the case of .OLEObject it makes it simple for programmers to tell the >>> OLE object to start its search for a method in the root class .object >>> applying existing knowledge! So no need to come up with awkwardly named >>> methods or another dispatch.super method to somehow get access to the root >>> class methods making the usage/protocol of such classes rather complicated. >>> So such a change would simply allow to apply the message resolution >>> override pattern that the programmer is accustomed to already. >>> >>> --- >>> >>> The question would be whether there are any potentially dangerous >>> side-effects or incompatibilies with existing code that could get >>> introduced by removing this particular check. >>> >>> ---rony >>> >>> Opened a RFE for this: >>> <https://sourceforge.net/p/oorexx/feature-requests/802/> >>> <https://sourceforge.net/p/oorexx/feature-requests/802/> >>> >>> ---rony >>> >>> Implemented <http://sourceforge.net/p/oorexx/code-0/12390> >>> <http://sourceforge.net/p/oorexx/code-0/12390>. Added appropriate >>> tests. >>> >>> ---rony >>> >>> >>> _______________________________________________ >>> Oorexx-devel mailing list >>> Oorexx-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/oorexx-devel >>> >>
_______________________________________________ Oorexx-devel mailing list Oorexx-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/oorexx-devel