On Wed, May 18, 2022 at 10:06 AM Rony G. Flatscher <rony.flatsc...@wu.ac.at> wrote:
> > On 18.05.2022 15:29, Rick McGuire wrote: > > > > On Wed, May 18, 2022 at 8:45 AM Rony G. Flatscher <rony.flatsc...@wu.ac.at> > wrote: > >> > ... cut ... > > ObjectClass.cpp defines validateScopeOverride() as: >> >> /** >> * Validate a scope override on a message send. >> * >> * @param scope The scope we're checking. >> */ >> void RexxObject::validateScopeOverride(RexxClass *scope) >> { >> if (scope != OREF_NULL) >> { >> if (!isInstanceOf(scope)) >> { >> reportException(Error_Incorrect_method_array_noclass, this, >> scope); >> } >> } >> } >> >> >> Should ObjectClass.validateScopeOverride() be changed to check in >> addition whether "this" is a class object and if so, use maybe >> isSubClassOrEnhanced() instead of isInstanceOf()? >> >> If so, what would be the best approach, the best code for this? >> > Ok, I see what's going on here. This is failing because isInstanceOf() is > a real instance of check. The class is not itself an instance of the > itself, so o~isA(.mixin2) returns .false, which is the correct answer. > However, class objects can still have methods at the requested scope even > though they are not instances. I suspect the best approach is to remove > this check altogether and just fall back to reporting "Method not found". > However, this certainly can be improved by using a new version of the > method that includes the requested scope information in the error. > > What about some version that first tests for isInstanceOf() and if that > fails checks whether receiver is a class object and if so whether it is a > subclass, something like: > > /** > * Validate a scope override on a message send. > * > * @param scope The scope we're checking. > */ > void RexxObject::validateScopeOverride(RexxClass *scope) > { > if (scope != OREF_NULL) > { > if (!isInstanceOf(scope)) > { > if (isInstanceOf(TheClassClass)) > { > if (!((RexxClass *)scope)->isSubClassOf(scope)) > { > reportException(Error_Incorrect_method_array_noclass, > this, scope); > } > } > else > { > reportException(Error_Incorrect_method_array_noclass, this, > scope); > } > } > } > } > > The above does not work as compiling would issue: > > F:\work\svn\oorexx\main\trunk\interpreter\classes\ObjectClass.cpp(1971): > error C2039: 'isSubClassOf': is not a member of 'RexxClass' > f:\work\svn\oorexx\main\trunk\interpreter\classes\MethodClass.hpp(55): note: > see declaration of 'RexxClass' > NMAKE : fatal error U1077: '"C:\Program Files\CMake\bin\cmake.exe"' : return > code '0x2' > > Found 'isSubClassOf' in: > > interpreter/classes/ClassClass.cpp:1692:RexxObject > *RexxClass::isSubclassOf(RexxClass *other) > interpreter/classes/ClassClass.hpp:138: RexxObject *isSubclassOf(RexxClass > *other); > interpreter/execution/CPPCode.cpp:735: CPPM(RexxClass::isSubclassOf), > interpreter/memory/Setup.cpp:480: AddMethod("IsSubclassOf", > RexxClass::isSubclassOf, 1); > > No, this really needs to be handled at the point where the method lookup is actually happening. I thought of another problem area. Methods added with addMethod() are given a scope of .nil, which is not a class object, but is a valid method scope. Rick > ---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