Patch and test scripts with <https://sourceforge.net/p/oorexx/bugs/1715/>.
---rony On 06.08.2020 16:30, Rony G. Flatscher wrote: > > O.K., I think I found a solution that works, will post the changes as a patch > with a new bug > tracker item. > > ---rony > > > On 06.08.2020 14:03, Rony G. Flatscher wrote: >> >> Attached please find the patch that makes method's newFile work with >> compiled Rexx scripts, but >> has a problem at runtime when trying to invoke a method that got restored >> from the compiled form. >> >> ---rony >> >> >> On 06.08.2020 13:54, Rony G. Flatscher wrote: >>> >>> As a first step I have been trying to correct the code to accept compiled >>> Rexx scripts as method >>> code (using the .method's newFile). >>> >>> This seems to have been successful, decoding now works. >>> >>> However, when assigning the method object to a class and then sending an >>> object of that class >>> the message to execute the method, I get the runtime error message (Rexx >>> test script at the end): >>> >>> 15 *-* say .context~name", return value:" o~aha(1,2,3) >>> Error 97 running >>> G:\oorexx.tmp\oorexxBuild\debug32.trunk\bin\testrgf.rex line 15: Object >>> method not found. >>> Error 97.3: Object "a TEST" cannot accept package scope message "AHA" >>> from a different package caller. >>> >>> The compiled Rexx code for the method gets successfully processed in a new >>> method defined in >>> ProgramMetaData.cpp: >>> >>> MethodClass *ProgramMetaData::restoreMethod(RexxString *name, >>> BufferClass *buffer) >>> { >>> ProgramMetaData *metaData; >>> >>> // check to see if this is already translated >>> if (!processRestoreData(name, buffer, metaData)) >>> { >>> // nope, can't restore this >>> return OREF_NULL; >>> } >>> >>> // make sure this is valid for interpreter >>> if (!metaData->validate(name)) >>> { >>> return OREF_NULL; >>> } >>> >>> // this should be valid...try to restore. >>> Protected<MethodClass> method = MethodClass::restore(buffer, >>> metaData->getImageData(), metaData->getImageSize()); >>> // change the program name to match the file this was restored from >>> method->getPackageObject()->setProgramName(name); >>> return method; >>> } >>> >>> The question is, how can I inhibit the runtime error 97.3, what do I need >>> to do to the method >>> object? >>> >>> The starting point is in LanguageParser the new method: >>> >>> MethodClass* LanguageParser::createMethod(RexxString *name, >>> PackageClass *sourceContext) >>> { >>> // load the file into a buffer >>> Protected<BufferClass> program_buffer = >>> FileProgramSource::readProgram(name->getStringData()); >>> // if this failed, report an error now. >>> if (program_buffer == (BufferClass *)OREF_NULL) >>> { >>> reportException(Error_Program_unreadable_name, name); >>> } >>> >>> // try to restore a flattened program first >>> Protected<MethodClass> method = MethodClass::restore(name, >>> program_buffer); >>> if (method != (MethodClass *)OREF_NULL) >>> { >>> >>> return method; >>> } >>> >>> // create the appropriate program source, then the parser, then >>> generate the >>> // code. >>> Protected<ProgramSource> programSource = new >>> BufferProgramSource(program_buffer); >>> Protected<LanguageParser> parser = new LanguageParser(name, >>> programSource); >>> return parser->generateMethod(sourceContext); >>> } >>> >>> Hence it would be possible to pass the sourceContext as the third arguemtn >>> via the new method >>> MethodClass::restore() to ProgramMetaData::restoreMethod(...). But then, >>> how can I set the scope >>> from the sourceContext which is a PackageClass, bet MethodClass::setScope >>> expects a RexxClass? >>> >>> ---rony >>> >>> P.S.: Here the Rexx test script that generates the above runtime error: >>> >>> fnames="testmethod.rex", "testmethod-compiled.rex", >>> "testmethod-compiled-encoded.rex" >>> say "testing routine code from external files:" >>> do fn over fnames >>> o=.routine~newFile(fn) >>> say .context~name", return value:" o[1,2,3] >>> say >>> end >>> >>> say "--------------------" >>> >>> say "testing method code from external files:" >>> do fn over fnames >>> o=.test~new~~addMethod("aha", .method~newFile(fn)) >>> say .context~name", return value:" o~aha(1,2,3) /* <--- line # 15 >>> */ >>> say >>> end >>> >>> >>> ::class test >>> ::method addMethod >>> use strict arg name, method >>> self~setmethod(name, method, "object") >>> >>> Here the three external files: >>> >>> testmethod-compiled.rex ... copmiled with rexxc >>> testmethod-compiled-encoded.rex ... compiled with the "/e" switch of >>> rexxc.exe >>> testmethod.rex ... source code: >>> >>> parse source s >>> say .dateTime~new": number of args:" arg() >>> say .dateTime~new": args :" arg(1,'A')~toString(,",") >>> say .dateTime~new": parse source :" s >>> say .dateTime~new": .context~name :" .context~name >>> return .dateTime~new >>> >>> Here the output of running the above test script including the runtime >>> error: >>> >>> G:\oorexx.tmp\oorexxBuild\debug32.trunk\bin>rexx testrgf.rex >>> testing routine code from external files: >>> 2020-08-06T13:53:14.998000: number of args: 3 >>> 2020-08-06T13:53:14.998000: args : 1,2,3 >>> 2020-08-06T13:53:14.998000: parse source : WindowsNT SUBROUTINE >>> testmethod.rex >>> 2020-08-06T13:53:14.998000: .context~name : testmethod.rex >>> G:\oorexx.tmp\oorexxBuild\debug32.trunk\bin\testrgf.rex, return value: >>> 2020-08-06T13:53:14.998000 >>> >>> 2020-08-06T13:53:14.998000: number of args: 3 >>> 2020-08-06T13:53:14.998000: args : 1,2,3 >>> 2020-08-06T13:53:14.998000: parse source : WindowsNT SUBROUTINE >>> testmethod-compiled.rex >>> 2020-08-06T13:53:14.998000: .context~name : >>> G:\oorexx.tmp\oorexxBuild\debug32.trunk\bin\testmethod.rex >>> G:\oorexx.tmp\oorexxBuild\debug32.trunk\bin\testrgf.rex, return value: >>> 2020-08-06T13:53:14.998000 >>> >>> 2020-08-06T13:53:15.014000: number of args: 3 >>> 2020-08-06T13:53:15.014000: args : 1,2,3 >>> 2020-08-06T13:53:15.014000: parse source : WindowsNT SUBROUTINE >>> testmethod-compiled-encoded.rex >>> 2020-08-06T13:53:15.014000: .context~name : >>> G:\oorexx.tmp\oorexxBuild\debug32.trunk\bin\testmethod.rex >>> G:\oorexx.tmp\oorexxBuild\debug32.trunk\bin\testrgf.rex, return value: >>> 2020-08-06T13:53:15.014000 >>> >>> -------------------- >>> testing method code from external files: >>> 2020-08-06T13:53:15.014000: number of args: 3 >>> 2020-08-06T13:53:15.014000: args : 1,2,3 >>> 2020-08-06T13:53:15.014000: parse source : WindowsNT METHOD >>> testmethod.rex >>> 2020-08-06T13:53:15.014000: .context~name : AHA >>> G:\oorexx.tmp\oorexxBuild\debug32.trunk\bin\testrgf.rex, return value: >>> 2020-08-06T13:53:15.014000 >>> >>> 15 *-* say .context~name", return value:" o~aha(1,2,3) >>> Error 97 running >>> G:\oorexx.tmp\oorexxBuild\debug32.trunk\bin\testrgf.rex line 15: Object >>> method not found. >>> Error 97.3: Object "a TEST" cannot accept package scope message "AHA" >>> from a different package caller. >>>
_______________________________________________ Oorexx-devel mailing list Oorexx-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/oorexx-devel