On Wed, May 18, 2022 at 8:45 AM Rony G. Flatscher <rony.flatsc...@wu.ac.at>
wrote:

> While looking at the FORWARD keyword statement and using
> "validateScopeOverride(superClass)" among mixin classes, where the receiver
> is a class object,  errors get raised.
>
> Turning back to the Message.testgroup and adding tests sending class
> messages causes the first test to fail already.
>
> Here the test code and the class definitions that got class methods added
> to them:
>
> ... cut ... (works)
>
> ::method test_override_among_mixinclasses
>   o=.mixin2~new
>   self~assertEquals("mixin2" , o~info)
>   self~assertEquals("mixin2" , o~info:.mixin2)
>   self~assertEquals("base"   , o~info:.base)
>   self~assertEquals("mixin1a", o~info:.mixin1a)
>   self~assertEquals("mixin1b", o~info:.mixin1b)
>
>   self~expectSyntax(93.957)   -- "Target object "a MIXIN2" is not a subclass 
> of the message override scope (The NIXINOXI class)."
>   o~info:.nixinoxi
>
> ... cut ... (causes an error)
>
> -- SEND at class level in mixins
> ::method test_send_override_among_mixinclasses_class
>   o=.mixin2       -- use the class object
>   m=.message~new(o,"clzInfo")
>   self~assertEquals("mixin2_class" , m~send)
>   m=.message~new(o,("clzInfo",.mixin2))
>   *self~assertEquals("mixin2_class" , m~send)*
>
>   m=.message~new(o,("clzInfo",.base))
>   self~assertEquals("base_class" , m~send)
>   m=.message~new(o,("clzInfo",.mixin1a))
>   self~assertEquals("mixin1a_class" , m~send)
>   m=.message~new(o,("clzInfo",.mixin1b))
>   self~assertEquals("mixin1b_class" , m~send)
>
>   self~expectSyntax(93.957)   -- "Target object "a MIXIN2" is not a subclass 
> of the message override scope (The NIXINOXI class)."
>   m=.message~new(o, ("clzInfo",.nixinoxi))
>   m~send
>
> ... cut ...
>
> ::class nixinoxi     -- has info method, but class is on its own
> ::method clzInfo class
>   return "nixinoxi_class"
>
> ::method info
>   return "nixinoxi"
>
> ::class base
> ::method clzInfo class
>   return "base_class"
> ::method info
>   return "base"
>
> ::class mixin1a mixinclass base
> ::method clzInfo class
>   return "mixin1a_class"
> ::method info
>   return "mixin1a"
>
> ::class mixin1b mixinclass base
> ::method clzInfo class
>   return "mxin1b_class"
> ::method info
>   return "mixin1b"
>
> ::class mixin2 mixinclass mixin1b inherit mixin1a
> ::method clzInfo class
>   return "mixin2_class"
> ::method info
>   return "mixin2"
>
> Running the test group yields the following result with an error:
>
> F:\work\svn\oorexx\test\trunk>rexx ooRexx/base/class/Message.testGroup
> Interpreter:        REXX-ooRexx_5.0.0(MT)_64-bit 6.05 17 May 2022
> OS Name:            WindowsNT
> SysVersion:         Windows 10.0.19043
>
> Tests ran:          70
> Assertions:         266
> Failures:           0
> Errors:             1
>
> [error] 20220518 14:26:05.453000
>   Test:   TEST_SEND_OVERRIDE_AMONG_MIXINCLASSES_CLASS
>   Class:  Message.testGroup
>   File:   ...\oorexx\test\trunk\ooRexx\base\class\Message.testGroup
>   Event:  SYNTAX 93.957 raised unexpectedly.
>    * Target object "The MIXIN2 class" is not a subclass of the message 
> override scope (The MIXIN2 class).*
>     Line:    735
>        *-* Compiled method "SEND" with scope "Message".
>    735 *-* self~assertEquals("mixin2_class" , m~send)
>        *-* Compiled method "SEND" with scope "Message".
>   1615 *-*     .message~new(self, methodName)~send
>   1578 *-* self~doTheTest(fName, aTestResult)  -- carry out the testmethod
>    552 *-*   test~execute(testResult, verbose)
>    552 *-*   test~execute(testResult, verbose)
>     45 *-* testResult = group~suite~execute~~print
>
> Test execution:     00:00:18.115000
>
> 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.

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

Reply via email to