You can subscribe to this list here.
2006 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(4) |
Oct
(20) |
Nov
(42) |
Dec
(32) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2007 |
Jan
(10) |
Feb
(42) |
Mar
(53) |
Apr
(121) |
May
(98) |
Jun
(110) |
Jul
(110) |
Aug
(88) |
Sep
(123) |
Oct
(321) |
Nov
(172) |
Dec
(607) |
2008 |
Jan
(376) |
Feb
(52) |
Mar
(26) |
Apr
(60) |
May
(42) |
Jun
(120) |
Jul
(181) |
Aug
(318) |
Sep
(265) |
Oct
(225) |
Nov
(92) |
Dec
(103) |
2009 |
Jan
(202) |
Feb
(191) |
Mar
(102) |
Apr
(235) |
May
(169) |
Jun
(122) |
Jul
(178) |
Aug
(87) |
Sep
(102) |
Oct
(69) |
Nov
(71) |
Dec
(101) |
2010 |
Jan
(55) |
Feb
(139) |
Mar
(99) |
Apr
(101) |
May
(112) |
Jun
(65) |
Jul
(31) |
Aug
(50) |
Sep
(94) |
Oct
(101) |
Nov
(95) |
Dec
(103) |
2011 |
Jan
(139) |
Feb
(136) |
Mar
(80) |
Apr
(59) |
May
(34) |
Jun
(37) |
Jul
(66) |
Aug
(51) |
Sep
(29) |
Oct
(100) |
Nov
(49) |
Dec
(92) |
2012 |
Jan
(53) |
Feb
(147) |
Mar
(113) |
Apr
(60) |
May
(39) |
Jun
(164) |
Jul
(143) |
Aug
(84) |
Sep
(127) |
Oct
(91) |
Nov
(97) |
Dec
(103) |
2013 |
Jan
(162) |
Feb
(139) |
Mar
(106) |
Apr
(23) |
May
(80) |
Jun
(73) |
Jul
(39) |
Aug
(27) |
Sep
(38) |
Oct
(54) |
Nov
(95) |
Dec
(195) |
2014 |
Jan
(113) |
Feb
(46) |
Mar
(22) |
Apr
(18) |
May
(136) |
Jun
(145) |
Jul
(86) |
Aug
(70) |
Sep
(169) |
Oct
(216) |
Nov
(58) |
Dec
(19) |
2015 |
Jan
|
Feb
(5) |
Mar
(7) |
Apr
(15) |
May
(22) |
Jun
(18) |
Jul
(4) |
Aug
(2) |
Sep
(3) |
Oct
(21) |
Nov
(24) |
Dec
(1) |
2016 |
Jan
|
Feb
(7) |
Mar
(1) |
Apr
(19) |
May
(10) |
Jun
(31) |
Jul
(24) |
Aug
(41) |
Sep
(12) |
Oct
(19) |
Nov
|
Dec
|
2017 |
Jan
(12) |
Feb
(15) |
Mar
(12) |
Apr
(8) |
May
(25) |
Jun
(8) |
Jul
(18) |
Aug
(4) |
Sep
(11) |
Oct
(25) |
Nov
(7) |
Dec
(11) |
2018 |
Jan
(2) |
Feb
(13) |
Mar
(28) |
Apr
(53) |
May
(5) |
Jun
(6) |
Jul
(13) |
Aug
(23) |
Sep
(10) |
Oct
(14) |
Nov
(33) |
Dec
(116) |
2019 |
Jan
(46) |
Feb
(112) |
Mar
(38) |
Apr
(23) |
May
(10) |
Jun
(2) |
Jul
(18) |
Aug
(4) |
Sep
(11) |
Oct
(15) |
Nov
(15) |
Dec
(17) |
2020 |
Jan
(6) |
Feb
(12) |
Mar
(41) |
Apr
(36) |
May
(7) |
Jun
(18) |
Jul
(5) |
Aug
(6) |
Sep
(6) |
Oct
(8) |
Nov
(13) |
Dec
(9) |
2021 |
Jan
(1) |
Feb
(42) |
Mar
(37) |
Apr
(16) |
May
(25) |
Jun
(4) |
Jul
(14) |
Aug
(5) |
Sep
|
Oct
(15) |
Nov
(29) |
Dec
(11) |
2022 |
Jan
(10) |
Feb
(1) |
Mar
(8) |
Apr
(16) |
May
(46) |
Jun
(37) |
Jul
(36) |
Aug
(10) |
Sep
(15) |
Oct
(6) |
Nov
(6) |
Dec
(68) |
2023 |
Jan
(27) |
Feb
(18) |
Mar
(7) |
Apr
(21) |
May
(12) |
Jun
(8) |
Jul
(16) |
Aug
(16) |
Sep
(2) |
Oct
(8) |
Nov
(3) |
Dec
(17) |
2024 |
Jan
(27) |
Feb
(9) |
Mar
(25) |
Apr
(21) |
May
(1) |
Jun
(8) |
Jul
(12) |
Aug
(30) |
Sep
(27) |
Oct
|
Nov
|
Dec
|
From: <eri...@us...> - 2024-09-02 15:51:26
|
Revision: 12891 http://sourceforge.net/p/oorexx/code-0/12891 Author: erich_st Date: 2024-09-02 15:51:23 +0000 (Mon, 02 Sep 2024) Log Message: ----------- remove spurious SAY Modified Paths: -------------- test/trunk/ooRexx/base/keyword/TRACE_TraceObject.testGroup Modified: test/trunk/ooRexx/base/keyword/TRACE_TraceObject.testGroup =================================================================== --- test/trunk/ooRexx/base/keyword/TRACE_TraceObject.testGroup 2024-09-02 15:47:54 UTC (rev 12890) +++ test/trunk/ooRexx/base/keyword/TRACE_TraceObject.testGroup 2024-09-02 15:51:23 UTC (rev 12891) @@ -640,7 +640,7 @@ -- say "idx:" idx~left(16,'.') "ohaCallerStackFrame value:" ohaCallerStackFrame~send(idx) -- say " do_the_work_stack_frame :" do_the_work_stack_frame~send(idx) self~assertSame(ohaCallerStackFrame~send(idx), do_the_work_stack_frame~send(idx), "caller's stackFrame" idx": not the same!") - say +-- say end return |
From: <eri...@us...> - 2024-09-02 15:47:56
|
Revision: 12890 http://sourceforge.net/p/oorexx/code-0/12890 Author: erich_st Date: 2024-09-02 15:47:54 +0000 (Mon, 02 Sep 2024) Log Message: ----------- fix code, update tests, update rexxref for [feature-requests:#843] .File method extension issue with files starting with dot Modified Paths: -------------- docs/trunk/rexxref/en-US/utilityclasses.xml main/trunk/interpreter/RexxClasses/StreamClasses.orx test/trunk/ooRexx/base/class/File.testGroup Modified: docs/trunk/rexxref/en-US/utilityclasses.xml =================================================================== --- docs/trunk/rexxref/en-US/utilityclasses.xml 2024-08-31 19:27:09 UTC (rev 12889) +++ docs/trunk/rexxref/en-US/utilityclasses.xml 2024-09-02 15:47:54 UTC (rev 12890) @@ -3849,6 +3849,8 @@ </para> <para>Returns the file's extension, the portion of the file name after the last dot. +Returns the null string if the file name contains only one dot that is +its first character. </para> <para>See also method <xref linkend="mthFileName" xrefstyle="select:title"/>. </para> @@ -3858,7 +3860,8 @@ </title> <programlisting><![CDATA[ say .File~new("/usr/local/lib/rexx.img")~extension -- img -say .File~new("/")~name -- "" +say .File~new("c:\windows")~extension -- "" +say .File~new(".config")~extension -- "" ]]></programlisting></example></para> </section> Modified: main/trunk/interpreter/RexxClasses/StreamClasses.orx =================================================================== --- main/trunk/interpreter/RexxClasses/StreamClasses.orx 2024-08-31 19:27:09 UTC (rev 12889) +++ main/trunk/interpreter/RexxClasses/StreamClasses.orx 2024-09-02 15:47:54 UTC (rev 12890) @@ -1,7 +1,7 @@ /*----------------------------------------------------------------------------*/ /* */ /* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2022 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2005-2024 Rexx Language Association. All rights reserved. */ /* */ /* This program and the accompanying materials are made available under */ /* the terms of the Common Public License v1.0 which accompanies this */ @@ -724,6 +724,8 @@ end -- returns the extension, everything after the last dot in the name. +-- if the name has only one dot that is its first character, name is +-- not condsidered to have an extension ::METHOD extension use strict arg path = self~qualifiedPath @@ -730,8 +732,8 @@ name = path~substr(path~lastPos(self~separator) + 1) -- we search the name portion of the path for the last dot - dot = name~lastPos(".") - if dot == 0 then + dot = self~name~lastPos(".") + if dot <= 1 then return "" else return name~substr(dot + 1) Modified: test/trunk/ooRexx/base/class/File.testGroup =================================================================== --- test/trunk/ooRexx/base/class/File.testGroup 2024-08-31 19:27:09 UTC (rev 12889) +++ test/trunk/ooRexx/base/class/File.testGroup 2024-09-02 15:47:54 UTC (rev 12890) @@ -1,7 +1,7 @@ #!/usr/bin/env rexx /*----------------------------------------------------------------------------*/ /* */ -/* Copyright (c) 2007-2022 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2007-2024 Rexx Language Association. All rights reserved. */ /* */ /* This program and the accompanying materials are made available under */ /* the terms of the Common Public License v1.0 which accompanies this */ @@ -711,9 +711,21 @@ shell = .RexxInfo~platform~caselessStartsWith("Windows")~?("cmd.exe", "sh") found = .File~searchPath(shell) self~assertIsA(found, .File) - self~assertTrue(found~absolutePath~caselessEndsWith(shell)) + self~assertTrue(found~absolutePath~caselessEndsWith(shell), shell "not found in PATH") ::method test_searchPath_two_args + -- we assume that the default shell is in PATH + shell = .RexxInfo~platform~caselessStartsWith("Windows")~?("cmd.exe", "sh") + path = value("PATH", ,"environment") + found = .File~searchPath(shell, path) -- PATH as a string + self~assertIsA(found, .File) + self~assertTrue(found~absolutePath~caselessEndsWith(shell), shell "not found in PATH") + + -- now second arg as an Array + found = .File~searchPath(shell, path~makeArray(.File~pathSeparator)) -- PATH as an Array + self~assertIsA(found, .File) + self~assertTrue(found~absolutePath~caselessEndsWith(shell), shell "not found in PATH") + -- searchPath will search for files with or without path -- if this file's path was /dir1/dir2/dir3/File.testgroup, we'd test -- searchPath("dir1/dir2/dir3/File.testgroup", "/") @@ -731,53 +743,7 @@ root~append(components~delete(1)) end -::method test_searchpath1 - self~assertNil(.file~searchPath("*non existent filename*", ".")) - self~assertNil(.file~searchPath("*non existent filename*", (".", ".."))) - - -- the following assumes the executable is on the path - executable = .RexxInfo~executable - - currentPath = Value("PATH",,"ENVIRONMENT") - - file = .file~searchPath(executable~name, currentPath) - - self~assertIsA(file, .File) - self~assertEquals(executable~absolutePath, file~absolutePath, "this may fail if rexx is run directly from a build tree") - - currentPath = currentPath~makeArray(.File~pathSeparator) - - file = .file~searchPath(executable~name, currentPath) - - self~assertIsA(file, .File) - self~assertEquals(executable~absolutePath, file~absolutePath) - - loop i = 1 to currentPath~items - currentPath[i] = .File~new(currentPath[i]) - end - - file = .file~searchPath(executable~name, currentPath) - - self~assertIsA(file, .File) - self~assertEquals(executable~absolutePath, file~absolutePath) - - parse source . . thisFile - me = .file~new(thisFile) - - filename = me~name - directory = me~parent - - self~assertNotNil(.file~searchPath(filename, directory), "01 : Must be found because current dir is in path") - self~assertNotNil(.file~searchPath(filename, .array~of(.file~new(directory))), "01 : Must be found because current dir is in path") - self~assertNotNil(.file~searchPath(filename, ("dummy before", directory, "dummy after")), "02 : Must be found because current dir is in path") - self~assertNotNil(.file~searchPath(filename, ("dummy before", .file~new(directory), "dummy after")), "02 : Must be found because current dir is in path") - - curdir = directory(directory) - self~assertNotNil(.file~searchPath(filename, "."), "04 : Must be found because current dir is searched") - call directory curdir -- restore - - -- parent/parentFile tests ::method test_parent_one_arg_too_many @@ -856,12 +822,12 @@ .File~new("")~extension("") ::method test_extension - do name over "", ".", "..", "a.", "a..", "a" + do name over "", ".", "..", "a.", "a..", "a", ".a" self~assertSame("", .File~new(name)~extension, "extension of" name) self~assertSame("", .File~new(name, "/")~extension, "extension of" name) end - do name over ".a", "..a", "a.b", "temp.txt", "a b.c", "file.d e" + do name over "..a", "a.b", "temp.txt", "a b.c", "file.d e" self~assertSame(name~substr(name~lastPos(".") + 1), .File~new(name)~extension, "extension of" name) self~assertSame(name~substr(name~lastPos(".") + 1), .File~new(name, "/")~extension, "extension of" name) end |
From: <eri...@us...> - 2024-08-31 19:27:16
|
Revision: 12889 http://sourceforge.net/p/oorexx/code-0/12889 Author: erich_st Date: 2024-08-31 19:27:09 +0000 (Sat, 31 Aug 2024) Log Message: ----------- fix code for [bugs:#1973] GUARD WHEN with USE LOCAL; update rexxref (also for [documentation:#330] GUARD incomplete; update GUARD.testGroup Modified Paths: -------------- docs/trunk/rexxref/en-US/instrc.xml main/trunk/interpreter/parser/LanguageParser.cpp test/trunk/ooRexx/base/keyword/GUARD.testGroup Modified: docs/trunk/rexxref/en-US/instrc.xml =================================================================== --- docs/trunk/rexxref/en-US/instrc.xml 2024-08-28 16:14:31 UTC (rev 12888) +++ docs/trunk/rexxref/en-US/instrc.xml 2024-08-31 19:27:09 UTC (rev 12889) @@ -1455,7 +1455,7 @@ <emphasis role="italic">expression</emphasis> evaluates to &false;, GUARD waits until another method assigns or drops -an object variable (that is, a variable named on an EXPOSE instruction) used +an object variable used in the WHEN <emphasis role="italic">expression</emphasis>. When an object variable changes, GUARD reevaluates the WHEN <emphasis role="italic">expression</emphasis>. If the @@ -1473,6 +1473,15 @@ returned as the condition result. If all of the <emphasis role="italic">expression</emphasis>s evaluate to &true;, then the condition result is also &true;. +</para> +<para>The <emphasis role="italic">expression</emphasis> or list of +<emphasis role="italic">expression</emphasis>s +can reference both local and object variables, +but must reference at least one object variable exposed by a +<xref linkend="keyUseLocal" xrefstyle="select:title"/> instruction or an +<xref linkend="keyExpose" xrefstyle="select:title"/> instruction with a +simple variable name (not a variable in parentheses representing a +subsidiary list of variables). <indexterm><primary>GUARD instruction</primary> <secondary>example</secondary></indexterm> <indexterm><primary>examples</primary> @@ -1480,19 +1489,21 @@ <example> <title>Instructions — GUARD</title> <programlisting> -<![CDATA[ -::method c - expose y - if y>0 then - return 1 - else - return 0 -::method d - expose z - guard on when z>0 - self~c /* Reevaluated when Z changes */ - say "Method D" -]]> +c = .Concurrent~new +c~work + +::class Concurrent +::method init + expose ready + ready = .false + reply + call SysSleep 1 -- long-running initialization + ready = .true + +::method work unguarded + expose ready + guard on when ready -- wait until initialized + say "starting work" </programlisting> </example> </para> @@ -3695,14 +3706,14 @@ double quotation marks so that leading and trailing whitespace characters are apparent. Any control codes in the data encoding (ASCII values less than <literal>'20'x</literal>, except -tab <literal>'08'x</literal>, +tab <literal>'09'x</literal>, line-feed <literal>'0a'x</literal>, and -carriage-return <literal>'0d'x</literal> -are replaced by a question mark (?) to avoid screen interference. Results other +carriage-return <literal>'0d'x</literal>, +are replaced by a question mark to avoid screen interference. Results other than strings appear in the string representation obtained by sending them a -<computeroutput>STRING</computeroutput> message. The resulting string is -enclosed in parentheses. The line number in the program precedes the first -clause traced on any line. All lines displayed during tracing have a +<methodname>STRING</methodname> message. +The line number in the program precedes the traced clause. +All lines displayed during tracing have a three-character prefix to identify the type of data being traced. These can be: </para> <indexterm><primary>tracing</primary> Modified: main/trunk/interpreter/parser/LanguageParser.cpp =================================================================== --- main/trunk/interpreter/parser/LanguageParser.cpp 2024-08-28 16:14:31 UTC (rev 12888) +++ main/trunk/interpreter/parser/LanguageParser.cpp 2024-08-31 19:27:09 UTC (rev 12889) @@ -1,7 +1,7 @@ /*----------------------------------------------------------------------------*/ /* */ /* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2020 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2005-2024 Rexx Language Association. All rights reserved. */ /* */ /* This program and the accompanying materials are made available under */ /* the terms of the Common Public License v1.0 which accompanies this */ @@ -579,7 +579,7 @@ * Generate a method object from a source collection. * * @param sourceContext - * An optional source context used to add additional visibilty to + * An optional source context used to add additional visibility to * dynamically generated methods. * * @return A method object represented by the leading code block @@ -613,7 +613,7 @@ * Generate a routine object from a source collection. * * @param sourceContext - * An optional source context used to add additional visibilty to + * An optional source context used to add additional visibility to * dynamically generated methods. * * @return A routine object represented by the leading code @@ -693,7 +693,7 @@ // context is visible during the install processing. package->inheritPackageContext(sourceContext); - //. the package ends up with neither a init section or a main executable. + // the package ends up with neither an init section or a main executable. // we just return the main code section // return the main executable. return mainSection; @@ -1504,7 +1504,7 @@ second = popDo(); } - // Now do the apprpriate closure action based on the instruction type. + // Now do the appropriate closure action based on the instruction type. if (type == KEYWORD_SELECT || type == KEYWORD_SELECT_CASE) { ((RexxInstructionSelect *)second)->matchEnd((RexxInstructionEnd *)instruction, this); @@ -1678,8 +1678,8 @@ /** - * Translate a expression of REXX code on a directive (already - * have an active clause, not not translating a block + * Translate an expression of REXX code on a directive (already + * have an active clause, not translating a block * yet) * * @param token The left paren delimiter for the expression. Required for error reporting. @@ -1779,7 +1779,7 @@ currentClass->addDependencies(classDependencies); } - // get a array for handling the ordering + // get an array for handling the ordering ArrayClass *classOrder = new_array(classCount); ProtectedObject p2(classOrder); @@ -1921,7 +1921,7 @@ } // we need a new end marker second = endIfNew((RexxInstructionIf *)second); - // we add this clause behine the new one, and also add this + // we add this clause behind the new one, and also add this // to the control stack as a pending instruction addClause(second); pushDo(second); @@ -1959,8 +1959,7 @@ { return exposedVariables->hasIndex(varName); } - // had a USE ARG instruction specified? Variable is exposed - + // did we have a USE LOCAL instruction specified? Variable is exposed else if (localVariables != OREF_NULL) { return !localVariables->hasIndex(varName); @@ -2031,14 +2030,10 @@ // and add this to the table. variables->put(retriever, varname); } - // Small optimization here. In order for a variable to be added to the - // guard variable list, it must have been exposed already. That means - // the variable will already be in this table, so we don't need to - // perform the capturing test then. - else - { - captureGuardVariable(varname, retriever); - } + // we need to always perform the capturing test because we allow e. g. + // USE LOCAL; GUARD ON/OFF WHEN v > 0 + captureGuardVariable(varname, retriever); + // return the variable accesser, either a new one or one pulled from the cache. return retriever; } @@ -2072,15 +2067,12 @@ } variables->put(retriever, stemName); } - // Small optimization here. In order for a variable to be added to the - // guard variable list, it must have been exposed already. That means - // the variable will already be in this table, so we don't need to - // perform the capturing test then. - else - { - captureGuardVariable(stemName, retriever); - } - return retriever; /* return variable accesser */ + // we need to always perform the capturing test because we allow e. g. + // USE LOCAL; GUARD ON/OFF WHEN v > 0 + captureGuardVariable(stemName, retriever); + + // return variable accesser + return retriever; } @@ -2176,7 +2168,7 @@ // variables table for this. variables->put(retriever, name); - // NOTE: compound variables do get get added to the guard list. + // NOTE: compound variables do get added to the guard list. return retriever; } @@ -2210,7 +2202,6 @@ localVariables->put(GlobalNames::RC, GlobalNames::RC); localVariables->put(GlobalNames::RESULT, GlobalNames::RESULT); localVariables->put(GlobalNames::SIGL, GlobalNames::SIGL); - } @@ -2222,7 +2213,6 @@ */ void LanguageParser::localVariable(RexxString *name ) { - localVariables->put(name, name); } @@ -2526,7 +2516,7 @@ /** * Add a label to our global table. Note, in Rexx it is - * not an error to have duplicate labels, but ony the + * not an error to have duplicate labels, but only the * first can be used as a target. We do not overwrite * a given name if it is already in the table. * @@ -2605,7 +2595,7 @@ */ RexxInternalObject *LanguageParser::parseConstantExpression() { - // everthing keys off of the first token. + // everything keys off of the first token. RexxToken *token = nextReal(); // just a literal token? if (token->isLiteral()) /* literal string expression? */ @@ -3287,7 +3277,7 @@ ProtectedObject p(target); // get the arguments. Like with builtin function calls, we just ignore any - // prior terminator context and rely on the fact that the brackes must match. + // prior terminator context and rely on the fact that the brackets must match. size_t argCount = parseArgList(token, (TERM_SQRIGHT)); // create the message item. @@ -3334,7 +3324,7 @@ * * @param target The target object term for the message send. * @param doubleTilde - * Indicates whether this is the "~" or "~~" form of operatior. + * Indicates whether this is the "~" or "~~" form of operation. * @param terminators * Expression terminators. * @@ -3632,7 +3622,7 @@ return new RexxUnaryOperator(token->subtype(), term); break; } - // not a aperator in the normal sense, but > or as a prefix creates + // not an operator in the normal sense, but > or as a prefix creates // a variable reference. case OPERATOR_LESSTHAN: case OPERATOR_GREATERTHAN: @@ -3761,7 +3751,7 @@ { syntaxError(Error_Invalid_expression_general, token); } - // this had better been terminated by a righ paren. + // this had better been terminated by a right paren. if (!nextToken()->isRightParen()) { syntaxErrorAt(Error_Unmatched_parenthesis_paren, token); Modified: test/trunk/ooRexx/base/keyword/GUARD.testGroup =================================================================== --- test/trunk/ooRexx/base/keyword/GUARD.testGroup 2024-08-28 16:14:31 UTC (rev 12888) +++ test/trunk/ooRexx/base/keyword/GUARD.testGroup 2024-08-31 19:27:09 UTC (rev 12889) @@ -1,7 +1,7 @@ #!/usr/bin/env rexx /*----------------------------------------------------------------------------*/ /* */ -/* Copyright (c) 2020-2022 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2020-2024 Rexx Language Association. All rights reserved. */ /* */ /* This program and the accompanying materials are made available under */ /* the terms of the Common Public License v1.0 which accompanies this */ @@ -71,11 +71,27 @@ -- GUARD instruction did not include references to exposed variables self~assertSyntaxError(99.913, "guard on when self \= .nil") +::method setup + expose list initialized + list = "var" + initialized = .true + +::method test_when_expression_reference + expose list (list) + -- "list" will expose "var" at runtime, but GUARD checks at translation time + -- GUARD instruction did not include references to exposed variables + self~assertSyntaxError(99.913, "guard on when var \= .nil") + ::method test_when_expression_compound -- GUARD instruction did not include references to exposed variables expose stem.1 self~assertSyntaxError(99.913, "guard on when stem.1 \= .nil") +::method test_when_use_local + use local local + -- GUARD instruction did not include references to exposed variables + self~assertSyntaxError(99.913, "guard on when local") + ::method test_when_novalue expose var signal on novalue @@ -170,17 +186,33 @@ stem. = 1 guard on when var == var guard off when .nil \== var | var == var + signal off nostring guard on when stem. - -- compound variables really aren't supposed to work - -- this may be a quirk or a bug guard off when stem.var -::method test_when_single_uninitialized_no_wait - expose var stem. +::method test_when_use_local_no_wait + use local signal off novalue + guard on when novar == novar + signal off novalue + guard off when initialized + var = "value" + guard on when var = "value" + + var = "value" + stem. = 1 guard on when var == var guard off when .nil \== var | var == var + signal off nostring + guard on when stem. + guard off when stem.var +::method test_when_single_uninitialized_no_wait + expose novar + signal off novalue + guard on when novar == novar + guard off when .nil \== novar | var == var + ::method test_when_multiple_no_wait expose a b a = 1 @@ -304,5 +336,4 @@ drop var2 - -::options novalue syntax +::options all syntax |
From: <or...@us...> - 2024-08-28 16:14:34
|
Revision: 12888 http://sourceforge.net/p/oorexx/code-0/12888 Author: orexx Date: 2024-08-28 16:14:31 +0000 (Wed, 28 Aug 2024) Log Message: ----------- 20240828 Add tests for CALLERSTACKFRAME and THREAD entry for reply keyword instruction and start messages. Modified Paths: -------------- test/trunk/ooRexx/base/keyword/TRACE_TraceObject.testGroup Modified: test/trunk/ooRexx/base/keyword/TRACE_TraceObject.testGroup =================================================================== --- test/trunk/ooRexx/base/keyword/TRACE_TraceObject.testGroup 2024-08-28 15:38:37 UTC (rev 12887) +++ test/trunk/ooRexx/base/keyword/TRACE_TraceObject.testGroup 2024-08-28 16:14:31 UTC (rev 12888) @@ -665,6 +665,99 @@ /* ========================================================================== */ +::method test_caller_stack_frame_reply_start +-- test callerStackFrame correct + +traceLog=.array~new +.traceObject~option='P' +.traceObject~collector=traceLog + +callerName="testCallerStackFrame_ReplyStart" +r=.routine~new(callerName, .resources~test_caller_stackframe_reply_start_program) +r~call -- note: this is a method call to an object! +.traceObject~collector=.nil + +/* +-- show actual traceLog +say "--->" +do counter c traceObj over traceLog + say traceObj +end +say "<---" +*/ + +callerStackFrames=.list~new +-- now analyze traceLog, first check whether expected sequence +expectedTraceLog=.resources~test_caller_stackframe_reply_start_tracelog +do counter c traceObj over traceLog + str=traceObj~makeString + self~assertEquals(str, expectedTraceLog[c]) + if pos(">I>",str)>0 then + callerStackFrames~append(traceObj) -- save traceObject which needs to have a CALLERSTACKFRAME entry +end + +say "... checking callerStackFrames ..." +countThreadId_in_CSF=0 +do csf over callerStackFrames + self~assertTrue(csf~hasEntry("CALLERSTACKFRAME")) + countThreadId_in_CSF+=csf~callerStackFrame~hasEntry("THREAD") +end + +self~assertEquals(countThreadId_in_CSF,2) + + +::resource test_caller_stackframe_reply_start_program + o=.test~new + o~count=2 + o~m_reply + call syssleep 0.01 + o~start("m_s") + o~m_wait + + ::class test + ::method init + expose count + count=0 + + ::attribute count + + ::method m_reply + expose count + reply + count-=1 + + ::method m_s + expose count + count-=1 + call syssleep .01 + + ::method m_wait unguarded + expose count + guard on when count=0 + + ::options trace labels +::END + +::resource test_caller_stackframe_reply_start_tracelog + >I> Routine "testCallerStackFrame_ReplyStart" in package "testCallerStackFrame_ReplyStart". + <I< Routine "testCallerStackFrame_ReplyStart" in package "testCallerStackFrame_ReplyStart". + >I> Routine "testCallerStackFrame_ReplyStart" in package "testCallerStackFrame_ReplyStart". + >I> Method "INIT" with scope "TEST" in package "testCallerStackFrame_ReplyStart". + <I< Method "INIT" with scope "TEST" in package "testCallerStackFrame_ReplyStart". + >I> Method "M_REPLY" with scope "TEST" in package "testCallerStackFrame_ReplyStart". + <I< Method "M_REPLY" with scope "TEST" in package "testCallerStackFrame_ReplyStart". + >I> Method "M_REPLY" with scope "TEST" in package "testCallerStackFrame_ReplyStart". + <I< Method "M_REPLY" with scope "TEST" in package "testCallerStackFrame_ReplyStart". + >I> Method "M_WAIT" with scope "TEST" in package "testCallerStackFrame_ReplyStart". + >I> Method "M_S" with scope "TEST" in package "testCallerStackFrame_ReplyStart". + <I< Method "M_S" with scope "TEST" in package "testCallerStackFrame_ReplyStart". + <I< Method "M_WAIT" with scope "TEST" in package "testCallerStackFrame_ReplyStart". + <I< Routine "testCallerStackFrame_ReplyStart" in package "testCallerStackFrame_ReplyStart". +::END + + + +/* ========================================================================== */ ::routine pp return "["arg(1)"]" |
From: <or...@us...> - 2024-08-28 15:38:42
|
Revision: 12887 http://sourceforge.net/p/oorexx/code-0/12887 Author: orexx Date: 2024-08-28 15:38:37 +0000 (Wed, 28 Aug 2024) Log Message: ----------- 20240828 Update TraceObject's CALLERSTACKFRAME documentation (RFE842). Modified Paths: -------------- docs/trunk/rexxref/en-US/utilityclasses.xml Modified: docs/trunk/rexxref/en-US/utilityclasses.xml =================================================================== --- docs/trunk/rexxref/en-US/utilityclasses.xml 2024-08-28 15:09:07 UTC (rev 12886) +++ docs/trunk/rexxref/en-US/utilityclasses.xml 2024-08-28 15:38:37 UTC (rev 12887) @@ -11458,6 +11458,13 @@ <entry><para>the name associated with the stack frame context </para></entry> </row> + <row><entry>"<literal>THREAD</literal>" + <indexterm><primary>THREAD</primary><secondary>CALLERSTACKFRAME</secondary><tertiary>TraceObject</tertiary></indexterm> + </entry> + <entry><para>the thread ID of the caller in case it used a REPLY keyword instruction or a START message + to create (spawn) a new thread of execution + </para></entry> + </row> <row><entry>"<literal>TRACELINE</literal>" <indexterm><primary>TRACELINE</primary><secondary>CALLERSTACKFRAME</secondary><tertiary>TraceObject</tertiary></indexterm> </entry> |
From: <or...@us...> - 2024-08-28 15:09:09
|
Revision: 12886 http://sourceforge.net/p/oorexx/code-0/12886 Author: orexx Date: 2024-08-28 15:09:07 +0000 (Wed, 28 Aug 2024) Log Message: ----------- 20240828 Update example for instanceMethods to include explanations in comments to ease understanding. Modified Paths: -------------- docs/trunk/rexxref/en-US/fundclasses.xml Modified: docs/trunk/rexxref/en-US/fundclasses.xml =================================================================== --- docs/trunk/rexxref/en-US/fundclasses.xml 2024-08-28 11:59:52 UTC (rev 12885) +++ docs/trunk/rexxref/en-US/fundclasses.xml 2024-08-28 15:09:07 UTC (rev 12886) @@ -2982,18 +2982,27 @@ <example id="ex.object-instancemethods"> <title>Object class — instanceMethods method</title> <programlisting> --- count all class methods of .String only -say .String~instanceMethods(.String)~allIndexes~items --> 17 +-- if running under ooRexx 5.1.0 +-- list all class methods of .String only +say .String~instanceMethods(.String)~allIndexes~sort~toString(,', ') + -- outputs: ALNUM, ALPHA, BLANK, CNTRL, CR, DIGIT, GRAPH, LOWER, NEW, NL, NULL, + -- PRINT, PUNCT, SPACE, TAB, UPPER, XDIGIT -- count all class methods of .String and its superclasses -say .String~instanceMethods~allIndexes~items --> 83 +say .String~instanceMethods~allIndexes~items + -- outputs: 83 + -- (17 .String class methods, 33 .Object class methods, + -- 33 .Class class methods, i.e., without its NEW method) - -- count all instance methods of .String only -say ''~instanceMethods(.String)~allIndexes~items --> 117 +say ''~instanceMethods(.String)~allIndexes~items + -- outputs: 117 -- count all instance methods of .String and its superclasses -say ''~instanceMethods~allIndexes~items --> 150 +say ''~instanceMethods~allIndexes~items + -- outputs: 150 + -- (117 .String instance methods, 32 .Object instance methods, + -- 1 .Comparable instance method) </programlisting> </example> </section> |
From: <or...@us...> - 2024-08-28 11:59:54
|
Revision: 12885 http://sourceforge.net/p/oorexx/code-0/12885 Author: orexx Date: 2024-08-28 11:59:52 +0000 (Wed, 28 Aug 2024) Log Message: ----------- 20240828 fix ArrayStream's lineOut method, remove makeStringArray routine, not needed anymore. Modified Paths: -------------- test/trunk/ooRexx/base/keyword/TRACE.testGroup Modified: test/trunk/ooRexx/base/keyword/TRACE.testGroup =================================================================== --- test/trunk/ooRexx/base/keyword/TRACE.testGroup 2024-08-27 18:41:39 UTC (rev 12884) +++ test/trunk/ooRexx/base/keyword/TRACE.testGroup 2024-08-28 11:59:52 UTC (rev 12885) @@ -208,7 +208,7 @@ address 'invalid' '' address 'invalid' with output normal trace off - self~assertTraceOutput(.resources~address, makeStringArray(t), start) + self~assertTraceOutput(.resources~address, t, start) ::resource address end " ::end" 1 *-* address @@ -230,7 +230,7 @@ arg arg 1 a . trace off - self~assertTraceOutput(.resources~arg, makeStringArray(t), start) + self~assertTraceOutput(.resources~arg, t, start) ::resource arg end " ::end" 1 *-* arg @@ -250,7 +250,7 @@ call left 'abc', 1 call on user 123 trace off - self~assertTraceOutput(.resources~call, makeStringArray(t), start) + self~assertTraceOutput(.resources~call, t, start) ::resource call end " ::end" 1 *-* call left 'abc', 1 @@ -275,7 +275,7 @@ do item over 'a', 'b' end trace off - self~assertTraceOutput(.resources~do, makeStringArray(t), start) + self~assertTraceOutput(.resources~do, t, start) ::resource do end " ::end" 1 *-* do @@ -332,7 +332,7 @@ start = .line; trace i drop (list) trace off - self~assertTraceOutput(.resources~drop, makeStringArray(t), start) + self~assertTraceOutput(.resources~drop, t, start) ::resource drop end " ::end" 1 *-* drop (list) @@ -343,7 +343,7 @@ ::method test_trace_exit t = .TraceOutput~destination(.ArrayStream~new) .Routine~new("trace_exit", "trace i; exit 99")~call - self~assertTraceOutput(.resources~exit, makeStringArray(t), 0) + self~assertTraceOutput(.resources~exit, t, 0) ::resource exit end " ::end" >I> Routine "trace_exit" in package "trace_exit". @@ -357,7 +357,7 @@ ::method test_trace_exit_trace_i_second_statement t = .TraceOutput~destination(.ArrayStream~new) .Routine~new("trace_exit", "a=1;trace i; exit 99")~call - self~assertTraceOutput(.resources~exit_trace_i_second_statement, makeStringArray(t), 0) + self~assertTraceOutput(.resources~exit_trace_i_second_statement, t, 0) ::resource exit_trace_i_second_statement end " ::end" 1 *-* exit 99 @@ -375,7 +375,7 @@ m = .Method~new("", "expose (list); ::options trace i") self~setMethod("trace_expose", m, "OBJECT") -- give access to object variables self~trace_expose - self~assertTraceOutput(.resources~expose, makeStringArray(t), 0) + self~assertTraceOutput(.resources~expose, t, 0) ::resource expose end " ::end" >I> Method "TRACE_EXPOSE" with scope "TRACE.TESTGROUP" in package "". @@ -394,7 +394,7 @@ forward message 'trace_forward' to (self) class (self~class) arguments (1, 2) continue forward message 'trace_forward_ret' array ('a', , 'b') continue trace off - self~assertTraceOutput(.resources~forward, makeStringArray(t), start) + self~assertTraceOutput(.resources~forward, t, start) -- all keywords TO, MESSAGE, CLASS, ARGUMENTS, and ARRAY are traced -- with >K>, and the return value is traced with >>> @@ -434,7 +434,7 @@ guard on guard off when v trace off - self~assertTraceOutput(.resources~guard, makeStringArray(t), start) + self~assertTraceOutput(.resources~guard, t, start) ::resource guard end " ::end" 1 *-* guard on @@ -456,7 +456,7 @@ else nop trace off - self~assertTraceOutput(.resources~if, makeStringArray(t), start) + self~assertTraceOutput(.resources~if, t, start) ::resource if end " ::end" 1 *-* if .true @@ -480,7 +480,7 @@ start = .line; trace i interpret 'a = 1' trace off - self~assertTraceOutput(.resources~interpret, makeStringArray(t), start) + self~assertTraceOutput(.resources~interpret, t, start) ::resource interpret end " ::end" 1 *-* interpret 'a = 1' @@ -500,7 +500,7 @@ iterate end trace off - self~assertTraceOutput(.resources~iterate, makeStringArray(t), start) + self~assertTraceOutput(.resources~iterate, t, start) ::resource iterate end " ::end" 1 *-* do 2 @@ -520,7 +520,7 @@ leave end trace off - self~assertTraceOutput(.resources~leave, makeStringArray(t), start) + self~assertTraceOutput(.resources~leave, t, start) ::resource leave end " ::end" 1 *-* do 2 @@ -538,7 +538,7 @@ loop i = 3 to 1 by -1 until i = 2 end trace off - self~assertTraceOutput(.resources~loop, makeStringArray(t), start) + self~assertTraceOutput(.resources~loop, t, start) ::resource loop end " ::end" 1 *-* loop 2 @@ -584,7 +584,7 @@ nop -- but they are traced when ... nop /* ... trailing a clause */ trace off - self~assertTraceOutput(.resources~nop, makeStringArray(t), start) + self~assertTraceOutput(.resources~nop, t, start) ::resource nop end " ::end" 3 *-* nop @@ -600,7 +600,7 @@ numeric form scientific numeric fuzz 0 trace off - self~assertTraceOutput(.resources~numeric, makeStringArray(t), start) + self~assertTraceOutput(.resources~numeric, t, start) ::resource numeric end " ::end" 1 *-* numeric digits (digits() + 1) @@ -620,7 +620,7 @@ start = .line; trace i options "string" trace off - self~assertTraceOutput(.resources~options, makeStringArray(t), start) + self~assertTraceOutput(.resources~options, t, start) ::resource options end " ::end" 1 *-* options "string" @@ -634,7 +634,7 @@ start = .line; trace i parse value 1 2 3 with x y . trace off - self~assertTraceOutput(.resources~parse, makeStringArray(t), start) + self~assertTraceOutput(.resources~parse, t, start) ::resource parse end " ::end" 1 *-* parse value 1 2 3 with x y . @@ -661,7 +661,7 @@ return a + 1 end: trace off - self~assertTraceOutput(.resources~procedure, makeStringArray(t), start) + self~assertTraceOutput(.resources~procedure, t, start) ::resource procedure end " ::end" 1 *-* a = 1 @@ -692,7 +692,7 @@ pull a . c pull a trace off - self~assertTraceOutput(.resources~pull_push_queue, makeStringArray(t), start) + self~assertTraceOutput(.resources~pull_push_queue, t, start) ::resource pull_push_queue end " ::end" 1 *-* push "1 2 3" @@ -722,7 +722,7 @@ p: raise user 999 array (1, 2) description "desc" return 1 end: trace off - self~assertTraceOutput(.resources~raise, makeStringArray(t), start) + self~assertTraceOutput(.resources~raise, t, start) --@@bug: "raise user 999 return 1" should trace >K> RETURN instead of RESULT --@@bug: "raise user 999 exit 1" should trace >K> EXIT instead of RESULT @@ -760,7 +760,7 @@ do i = 1 to 10 while t~items < 5 call SysSleep 0.001 -- wait for the REPLY thread to finish end - self~assertTraceOutput(.resources~reply, makeStringArray(t), trace_reply_start) + self~assertTraceOutput(.resources~reply, t, trace_reply_start) ::resource reply end " ::end" 754 *-* reply 1 @@ -779,7 +779,7 @@ say 1 || 2 trace off .Output~destination - self~assertTraceOutput(.resources~say, makeStringArray(t), start) + self~assertTraceOutput(.resources~say, t, start) ::resource say end " ::end" 1 *-* say 1 || 2 @@ -809,7 +809,7 @@ otherwise nop end trace off - self~assertTraceOutput(.resources~select, makeStringArray(t), start) + self~assertTraceOutput(.resources~select, t, start) -- @@bug #1850 but may well be intentional: -- END is traced when flow goes through OTHERWISE, but @@ -861,7 +861,7 @@ signal value "LBL2"; lbl2: signal on user 999 name user999 trace off - self~assertTraceOutput(.resources~signal, makeStringArray(t), start) + self~assertTraceOutput(.resources~signal, t, start) ::resource signal end " ::end" 1 *-* signal lbl1; @@ -878,7 +878,7 @@ t = .TraceOutput~destination(.ArrayStream~new) start = .line; trace i trace off - self~assertTraceOutput(.resources~trace, makeStringArray(t), start) + self~assertTraceOutput(.resources~trace, t, start) ::resource trace end " ::end" 1 *-* trace off @@ -890,7 +890,7 @@ start = .line; trace i use arg a = .nil trace off - self~assertTraceOutput(.resources~use, makeStringArray(t), start) + self~assertTraceOutput(.resources~use, t, start) ::resource use end " ::end" 1 *-* use arg a = .nil @@ -910,7 +910,7 @@ i = 1 a = a.i.i.i.i trace off - self~assertTraceOutput(.resources~compound, makeStringArray(t), start) + self~assertTraceOutput(.resources~compound, t, start) ::resource compound end " ::end" 1 *-* a. = '' @@ -933,7 +933,7 @@ t = .TraceOutput~destination(.ArrayStream~new) .Routine~new("trace_other_entrypoint", "::options trace i")~call - self~assertTraceOutput(.resources~entrypoint, makeStringArray(t), 0) + self~assertTraceOutput(.resources~entrypoint, t, 0) ::resource entrypoint end " ::end" >I> Routine "trace_other_entrypoint" in package "trace_other_entrypoint". @@ -946,7 +946,7 @@ start = .line; trace i 1~reverse trace off - self~assertTraceOutput(.resources~message, makeStringArray(t), start) + self~assertTraceOutput(.resources~message, t, start) ::resource message end " ::end" 1 *-* 1~reverse @@ -960,7 +960,7 @@ start = .line; trace i a = rexx:Array trace off - self~assertTraceOutput(.resources~namespace, makeStringArray(t), start) + self~assertTraceOutput(.resources~namespace, t, start) ::resource namespace end " ::end" 1 *-* a = rexx:Array @@ -980,7 +980,7 @@ use arg >v. return end: - self~assertTraceOutput(.resources~reference, makeStringArray(t), start) + self~assertTraceOutput(.resources~reference, t, start) ::resource reference end " ::end" 1 *-* call r >a. @@ -1100,7 +1100,6 @@ nnn *-* call trace "off" -- stop all tracing */ self~assertSame(4, t~items, "unexpected TRACE ?A output" t) - t=makeStringArray(t) self~assertSame("+++ *-* +++ Interactive *-*", - t[1]~word(1) t[2]~word(2) t[3]~subWord(1, 2) t[4]~word(2), - "unexpected TRACE ?A output" t) @@ -1116,7 +1115,6 @@ -- with no expressions, the expected TRACE ?R output is the same as -- above TRACE ?A output self~assertSame(4, t~items, "unexpected TRACE ?R output" t) - t=makeStringArray(t) self~assertSame("+++ *-* +++ Interactive *-*", - t[1]~word(1) t[2]~word(2) t[3]~subWord(1, 2) t[4]~word(2), - "unexpected TRACE ?R output" t) @@ -1143,7 +1141,6 @@ >A> "off" */ self~assertSame(11, t~items, "unexpected TRACE ?I output" t) - t=makeStringArray(t) self~assertSame("+++ *-* >V> >L> >A> >F> >A> +++ Interactive *-* >L> >A>", - t[1]~word(1) t[2]~word(2) t[3]~word(1) t[4]~word(1) t[5]~word(1) t[6]~word(1) - t[7]~word(1) t[8]~subWord(1, 2) t[9]~word(2) t[10]~word(1) t[11]~word(1), - @@ -1162,7 +1159,7 @@ nop /* 7 */ trace off -- ignore entry trace output +++ "platform METHOD /path/to/TRACE.testGroup" - self~assertTraceOutput(.resources~trace_numeric_debug, makeStringArray(t)~section(2), start) + self~assertTraceOutput(.resources~trace_numeric_debug, t~section(2), start) ::resource trace_numeric_debug end " ::end" 1 *-* nop /* 1 */ @@ -1180,7 +1177,8 @@ expose line line = 0 ::method lineOut - self~append(arg(1)) + parse arg line + self~append(line) return 0 ::method lineIn expose line @@ -1189,12 +1187,4 @@ raise notready return self[line] -::routine makeStringArray -- turn array of TraceObject instances in an array of strings - use arg inArray - outArray=.array~new - do traceObj over inArray - outArray~append(traceObj~makeString) - end - return outArray - ::options all syntax error condition failure condition |
From: <per...@us...> - 2024-08-27 18:41:41
|
Revision: 12884 http://sourceforge.net/p/oorexx/code-0/12884 Author: perolovjonsson Date: 2024-08-27 18:41:39 +0000 (Tue, 27 Aug 2024) Log Message: ----------- Correcting a typo to trigger a rebuild; Testcase failing on NetBSD Modified Paths: -------------- test/trunk/ooRexx/base/class/DateTime.testGroup Modified: test/trunk/ooRexx/base/class/DateTime.testGroup =================================================================== --- test/trunk/ooRexx/base/class/DateTime.testGroup 2024-08-26 13:56:53 UTC (rev 12883) +++ test/trunk/ooRexx/base/class/DateTime.testGroup 2024-08-27 18:41:39 UTC (rev 12884) @@ -588,7 +588,7 @@ expected = 366 self~assertSame(expected, a_dt~daysInYear) -::method 'test_elasped1' +::method 'test_elapsed1' a_dt = .datetime~new call syssleep 1 duration = a_dt~elapsed |
From: <or...@us...> - 2024-08-26 13:56:55
|
Revision: 12883 http://sourceforge.net/p/oorexx/code-0/12883 Author: orexx Date: 2024-08-26 13:56:53 +0000 (Mon, 26 Aug 2024) Log Message: ----------- 20240826 Fix for some compilers that treat 'overqualifying' as an error. Modified Paths: -------------- main/trunk/interpreter/concurrency/Activity.hpp Modified: main/trunk/interpreter/concurrency/Activity.hpp =================================================================== --- main/trunk/interpreter/concurrency/Activity.hpp 2024-08-25 20:04:35 UTC (rev 12882) +++ main/trunk/interpreter/concurrency/Activity.hpp 2024-08-26 13:56:53 UTC (rev 12883) @@ -161,8 +161,8 @@ ArrayClass *generateStackFrames(bool skipFirst); // allow TraceObject's callerStackFrame entry to indicate the caller that caused the spawned activity - StackFrameClass* Activity::generateCallerStackFrame(bool skipFirst); - static void Activity::setCallerStackFrameAsStringTable(Activity *oldActivity, Activity *newActivity, bool skipFirst); + StackFrameClass* generateCallerStackFrame(bool skipFirst); + static void setCallerStackFrameAsStringTable(Activity *oldActivity, Activity *newActivity, bool skipFirst); StringTable *spawnerStackFrameInfo; Activity *spawnReply(); |
From: <eri...@us...> - 2024-08-25 20:04:38
|
Revision: 12882 http://sourceforge.net/p/oorexx/code-0/12882 Author: erich_st Date: 2024-08-25 20:04:35 +0000 (Sun, 25 Aug 2024) Log Message: ----------- fix code, update rexxref and add test for [bugs:#1951] Error message insert masking issues Modified Paths: -------------- docs/trunk/rexxref/en-US/instrc.xml main/trunk/interpreter/classes/StringClass.cpp test/trunk/ooRexx/base/keyword/RAISE.testGroup Modified: docs/trunk/rexxref/en-US/instrc.xml =================================================================== --- docs/trunk/rexxref/en-US/instrc.xml 2024-08-25 11:20:17 UTC (rev 12881) +++ docs/trunk/rexxref/en-US/instrc.xml 2024-08-25 20:04:35 UTC (rev 12882) @@ -3693,7 +3693,11 @@ formatting (indentation) according to its logical depth of nesting, for example. Results, if requested, are indented by two extra spaces and are enclosed in double quotation marks so that leading and trailing whitespace characters are -apparent. Any control codes in the data encoding (ASCII values less than "20"x) +apparent. Any control codes in the data encoding (ASCII values less than +<literal>'20'x</literal>, except +tab <literal>'08'x</literal>, +line-feed <literal>'0a'x</literal>, and +carriage-return <literal>'0d'x</literal> are replaced by a question mark (?) to avoid screen interference. Results other than strings appear in the string representation obtained by sending them a <computeroutput>STRING</computeroutput> message. The resulting string is Modified: main/trunk/interpreter/classes/StringClass.cpp =================================================================== --- main/trunk/interpreter/classes/StringClass.cpp 2024-08-25 11:20:17 UTC (rev 12881) +++ main/trunk/interpreter/classes/StringClass.cpp 2024-08-25 20:04:35 UTC (rev 12882) @@ -1,7 +1,7 @@ /*----------------------------------------------------------------------------*/ /* */ /* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2021 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2005-2024 Rexx Language Association. All rights reserved. */ /* */ /* This program and the accompanying materials are made available under */ /* the terms of the Common Public License v1.0 which accompanies this */ @@ -1638,7 +1638,7 @@ // loop through, breaking on the first non-displayable character for (; i > 0; i--, current++) { - if (*current < ch_SPACE && *current != ch_TAB) + if (*current < ch_SPACE && *current != ch_TAB && *current != '\r' && *current != '\n') { nonDisplay = true; break; @@ -1653,14 +1653,14 @@ RexxString *newCopy = (RexxString *)copy(); i = newCopy->getLength(); - char *outptr = newCopy->getWritableData(); + unsigned char *outptr = (unsigned char *)(newCopy->getWritableData()); // now loop again translating all of the non-displayables for (; i > 0; i--) { - // we don't translate tabs either...all other + // we don't translate cr, lf and tabs...all other // non-displayables become question marks. - if (*outptr < ch_SPACE && *outptr != ch_TAB) + if (*outptr < ch_SPACE && *outptr != ch_TAB && *outptr != '\r' && *outptr != '\n') { *outptr = '?'; } Modified: test/trunk/ooRexx/base/keyword/RAISE.testGroup =================================================================== --- test/trunk/ooRexx/base/keyword/RAISE.testGroup 2024-08-25 11:20:17 UTC (rev 12881) +++ test/trunk/ooRexx/base/keyword/RAISE.testGroup 2024-08-25 20:04:35 UTC (rev 12882) @@ -1,7 +1,7 @@ #!/usr/bin/env rexx /*----------------------------------------------------------------------------*/ /* */ -/* Copyright (c) 2006-2022 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2006-2024 Rexx Language Association. All rights reserved. */ /* */ /* This program and the accompanying materials are made available under */ /* the terms of the Common Public License v1.0 which accompanies this */ @@ -35,23 +35,19 @@ /* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* */ /*----------------------------------------------------------------------------*/ - parse source . . fileSpec +parse source . . fileSpec +group = .TestGroup~new(fileSpec) +group~add(.RAISE.testGroup) +if group~isAutomatedTest then + return group +else + return group~suite~execute~~print - group = .TestGroup~new(fileSpec) - group~add(.RAISE.testGroup) +::requires 'ooTest.frm' - if group~isAutomatedTest then return group +::class RAISE.testGroup subclass ooTestCase public - testResult = group~suite~execute~~print -return testResult - - -::requires 'ooTest.frm' -- load the ooRexxUnit classes - -::class "RAISE.testGroup" subclass ooTestCase public - - -- ANY ERROR FAILURE HALT LOSTDIGITS NOMETHOD NOMETHOD -- NOSTRING NOTREADY NOVALUE SYNTAX USER... @@ -110,8 +106,6 @@ co=condition("Object") -- get condition object rgf_Sigl=SIGL -- save signal line number - -- call dumpCO co -- dump content of condition object (a directory) - self~assertNotNull(co~additional) a=co~additional -- get additional array @@ -160,8 +154,6 @@ co=condition("Object") -- get condition object rgf_Sigl=SIGL -- save signal line number - -- call dumpCO co -- dump content of condition object (a directory) - self~assertNotNull(co~additional) a=co~additional -- get additional array @@ -211,8 +203,6 @@ co=condition("Object") -- get condition object rgf_Sigl=SIGL -- save signal line number - -- call dumpCO co -- dump content of condition object (a directory) - self~assertNotNull(co~additional) a=co~additional -- get additional array @@ -265,8 +255,6 @@ co=condition("Object") -- get condition object rgf_Sigl=SIGL -- save signal line number - -- call dumpCO co -- dump content of condition object (a directory) - self~assertNotNull(co~additional) a=co~additional -- get additional array @@ -316,8 +304,6 @@ co=condition("Object") -- get condition object rgf_Sigl=SIGL -- save signal line number - -- call dumpCO co -- dump content of condition object (a directory) - self~assertNotNull(co~additional) a=co~additional -- get additional array @@ -370,8 +356,6 @@ co=condition("Object") -- get condition object rgf_Sigl=SIGL -- save signal line number - -- call dumpCO co -- dump content of condition object (a directory) - self~assertNotNull(co~additional) a=co~additional -- get additional array @@ -425,8 +409,6 @@ a.0=3 str="abc" - -- call dumpCO co -- dump content of condition object (a directory) - self~assertNotNull(co~additional) a=co~additional -- get additional array @@ -484,7 +466,45 @@ raise UseR rGf +-- test whether message inserts keep CR/LF unmasked, not masking as "?" +-- as the reply thread runs without caller, we can raise SYNTAX +-- without being taken down by it +::method raise_insert_crlf unguarded + -- why does this require UNGUARDED for the reply thread to run? + reply + -- all chars in the first line should be masked with "?" + -- '09'x, '0d'x, and '0a'x should not be masked + raise syntax 98.900 array(xrange('00'x, '08'x, '0b'x, '0c'x, '0e'x, '1f'x) || .endofline || "second line") +::method test_raise_insert_crlf + t = .TraceOutput~destination(.ArrayStream~new) + self~raise_insert_crlf + do i = 1 to 10 while t~items < 4 + call SysSleep 0.001 -- wait for the REPLY thread to finish + end + -- we ignore these two leading lines: + -- nnn *-* raise syntax 98.900 ... + -- Error 98 running ...RAISE.testGroup line nnn: Execution error. + self~assertSame("Error 98.900: ?????????????????????????????" || .endofline || "second line.", t[3]) +-- ArrayStream allows to capture TRACE output to an Array +-- we inherit from Stream just for the SAY method +::class ArrayStream subclass Array inherit Stream +::method init + expose line + line = 0 +::method lineOut + -- TraceObject changes break compatibility + -- need to convert arg(1) to string + self~append(arg(1)~makeString) + return 0 +::method lineIn + expose line + line += 1 + if line > self~size then + raise notready + return self[line] + + ::routine do_it_in_a_routine -- this routine is needed to test propagation of conditions signal on syntax a.1="1" @@ -503,22 +523,4 @@ return - -::routine dumpCO - use arg co - - say "co # entries:" co~items - do idx over co - o1=co~at(idx) - say pp(idx)~left(15)":" pp(o1) - if o1~hasmethod("items") then - do - say " " "# entries:" o1~items - do idx2 over o1 - say " " pp(idx2) - end - end - end - - -::options novalue error +::options all syntax error condition failure condition |
From: <or...@us...> - 2024-08-25 11:20:19
|
Revision: 12881 http://sourceforge.net/p/oorexx/code-0/12881 Author: orexx Date: 2024-08-25 11:20:17 +0000 (Sun, 25 Aug 2024) Log Message: ----------- 20240825 [feature-requests:#842] add callerStackFrame to TraceObject for reply keyword instruction and messages that got invoked using start (tested with the ooRexx test suite) Modified Paths: -------------- main/trunk/interpreter/classes/MessageClass.cpp main/trunk/interpreter/concurrency/Activity.cpp main/trunk/interpreter/concurrency/Activity.hpp main/trunk/interpreter/execution/RexxActivation.cpp Modified: main/trunk/interpreter/classes/MessageClass.cpp =================================================================== --- main/trunk/interpreter/classes/MessageClass.cpp 2024-08-24 20:01:12 UTC (rev 12880) +++ main/trunk/interpreter/classes/MessageClass.cpp 2024-08-25 11:20:17 UTC (rev 12881) @@ -537,6 +537,10 @@ // spawn a new activity off of the old activity Activity *oldActivity = ActivityManager::currentActivity; Activity *newActivity = oldActivity->spawnReply(); + + // save current frame info in a StringTable as it has caused the creation of a new activity + Activity::setCallerStackFrameAsStringTable(oldActivity, newActivity, true); // create stackframe from parent/caller + // mark which activity we're running on, then dispatch the message // on the new activity (which is sitting waiting for work to perform) setField(startActivity, newActivity); Modified: main/trunk/interpreter/concurrency/Activity.cpp =================================================================== --- main/trunk/interpreter/concurrency/Activity.cpp 2024-08-24 20:01:12 UTC (rev 12880) +++ main/trunk/interpreter/concurrency/Activity.cpp 2024-08-25 11:20:17 UTC (rev 12881) @@ -1160,30 +1160,50 @@ /** - * Generates a StackFrame from the parent and returns it. + * Generate the caller's stack frame. * - * @return parent's StackFrame or NULLOBJECT, if no parent exists + * @param skipFirst Determines if we should skip the first frame: + * false for reply in RexxActivation::run(...), + * true for Message::start() and in the general case. + * + * @return The stackframe of the caller which caused a spawned activity. */ -StackFrameClass* Activity::generateParentStackFrame() +StackFrameClass* Activity::generateCallerStackFrame(bool skipFirst) { - // create lists for both the stack frames and the traceback lines - StackFrameClass *parentStackFrame = NULLOBJECT; - ActivationFrame *frame = activationFrames; + StackFrameClass *callerStackFrame = NULL; - if (frame != NULL) + if (frame && skipFirst) { - frame = frame->next; // get parent - if (frame != NULL) - { - parentStackFrame = frame->createStackFrame(); - } + frame = frame->next; } - return parentStackFrame; + if (frame) + { + callerStackFrame = frame->createStackFrame(); + } + return callerStackFrame; } /** + * Generates and saves a StringTable to store stackFrame infos of oldActivity in newActivity + * (for TraceObject), used by MessageClass::start(). + * + */ +void Activity::setCallerStackFrameAsStringTable(Activity *oldActivity, Activity *newActivity, bool skipFirst) +{ + // get caller stackframe, if any + StackFrameClass *oldActivityStackFrame = oldActivity -> generateCallerStackFrame(skipFirst); + // returns a StringTable that may be empty if oldActivityStackFrame==NULLOBJECT + newActivity -> spawnerStackFrameInfo=RexxActivation::getStackFrameAsStringTable(oldActivityStackFrame); + // save thread ID to indicate from which thread ID the spawnReply() came from (helpful, e.g., if StringTable is empty) + newActivity -> spawnerStackFrameInfo -> put(new_integer(oldActivity -> getIdntfr()), GlobalNames::THREAD); + return; +} + + + +/** * Build a message and perform the indicated substitutions. * * @param messageCode Modified: main/trunk/interpreter/concurrency/Activity.hpp =================================================================== --- main/trunk/interpreter/concurrency/Activity.hpp 2024-08-24 20:01:12 UTC (rev 12880) +++ main/trunk/interpreter/concurrency/Activity.hpp 2024-08-25 11:20:17 UTC (rev 12881) @@ -159,8 +159,12 @@ void unwindToFrame(RexxActivation *frame); void cleanupStackFrame(ActivationBase *poppedStackFrame); ArrayClass *generateStackFrames(bool skipFirst); - StackFrameClass *generateParentStackFrame(); + // allow TraceObject's callerStackFrame entry to indicate the caller that caused the spawned activity + StackFrameClass* Activity::generateCallerStackFrame(bool skipFirst); + static void Activity::setCallerStackFrameAsStringTable(Activity *oldActivity, Activity *newActivity, bool skipFirst); + StringTable *spawnerStackFrameInfo; + Activity *spawnReply(); void exitKernel(); Modified: main/trunk/interpreter/execution/RexxActivation.cpp =================================================================== --- main/trunk/interpreter/execution/RexxActivation.cpp 2024-08-24 20:01:12 UTC (rev 12880) +++ main/trunk/interpreter/execution/RexxActivation.cpp 2024-08-25 11:20:17 UTC (rev 12881) @@ -702,6 +702,9 @@ activity = oldActivity->spawnReply(); + // save current frame info in a StringTable as it has caused the creation of a new activity + Activity::setCallerStackFrameAsStringTable(oldActivity, activity, false); + // save the pointer to the start of our stack frame. We're // going to need to release this after we migrate everything // over. @@ -5157,8 +5160,23 @@ } else if (tracePrefix == TRACE_PREFIX_INVOCATION) // tracing an invocation entry { - StackFrameClass *stackFrame = activity -> generateParentStackFrame(); - traceObject -> put(stackFrame ? getStackFrameAsStringTable(stackFrame) : TheNilObject, GlobalNames::CALLERSTACKFRAME); + StackFrameClass *stackFrame = activity -> generateCallerStackFrame(true); + if (stackFrame) + { + traceObject -> put(getStackFrameAsStringTable(stackFrame), GlobalNames::CALLERSTACKFRAME); + } + else + { + if (activity -> spawnerStackFrameInfo) // spawner's frame infos saved as a StringTable? + { + // allows for analyzing trace logs to identify the caller of a spawned activity + traceObject -> put(activity -> spawnerStackFrameInfo, GlobalNames::CALLERSTACKFRAME); + } + else + { + traceObject -> put(TheNilObject, GlobalNames::CALLERSTACKFRAME); + } + } } // METHODCALL, fill in method related information @@ -5232,26 +5250,28 @@ * the identityHash of the StackFrame entries EXECUTABLE and TARGET if they are not * .nil. * -* @param stackFrame the StackFrame object to use -* @return a StringTable with all the entries of stackFrame +* @param stackFrame the StackFrame object to use, may be NULLOBJECT +* @return a StringTable with all the entries of stackFrame, if available */ StringTable * RexxActivation::getStackFrameAsStringTable(StackFrameClass * stackFrame) { - ProtectedObject result; StringTable *tmpStringTable = new_string_table(); - // array - tmpStringTable -> put(stackFrame->sendMessage(GlobalNames::ARGUMENTS , result), GlobalNames::ARGUMENTS ); + if (stackFrame != NULLOBJECT) + { + ProtectedObject result; + // array + tmpStringTable -> put(stackFrame->sendMessage(GlobalNames::ARGUMENTS , result), GlobalNames::ARGUMENTS ); - // strings - tmpStringTable -> put(stackFrame->sendMessage(GlobalNames::LINE , result), GlobalNames::LINE ); - tmpStringTable -> put(stackFrame->sendMessage(GlobalNames::NAME , result), GlobalNames::NAME ); - tmpStringTable -> put(stackFrame->sendMessage(GlobalNames::TRACELINE , result), GlobalNames::TRACELINE ); - tmpStringTable -> put(stackFrame->sendMessage(GlobalNames::TYPE , result), GlobalNames::TYPE ); + // strings + tmpStringTable -> put(stackFrame->sendMessage(GlobalNames::LINE , result), GlobalNames::LINE ); + tmpStringTable -> put(stackFrame->sendMessage(GlobalNames::NAME , result), GlobalNames::NAME ); + tmpStringTable -> put(stackFrame->sendMessage(GlobalNames::TRACELINE , result), GlobalNames::TRACELINE ); + tmpStringTable -> put(stackFrame->sendMessage(GlobalNames::TYPE , result), GlobalNames::TYPE ); - // objects - tmpStringTable -> put(stackFrame->sendMessage(GlobalNames::EXECUTABLE, result), GlobalNames::EXECUTABLE); - tmpStringTable -> put(stackFrame->sendMessage(GlobalNames::TARGET , result), GlobalNames::TARGET ); - + // objects + tmpStringTable -> put(stackFrame->sendMessage(GlobalNames::EXECUTABLE, result), GlobalNames::EXECUTABLE); + tmpStringTable -> put(stackFrame->sendMessage(GlobalNames::TARGET , result), GlobalNames::TARGET ); + } return tmpStringTable; } |
From: <eri...@us...> - 2024-08-24 20:01:15
|
Revision: 12880 http://sourceforge.net/p/oorexx/code-0/12880 Author: erich_st Date: 2024-08-24 20:01:12 +0000 (Sat, 24 Aug 2024) Log Message: ----------- add additional nullstring tests for [bugs:#1958] EXTERNAL spec issues Modified Paths: -------------- test/trunk/ooRexx/base/directives/METHOD.testGroup test/trunk/ooRexx/base/directives/ROUTINE.testGroup Modified: test/trunk/ooRexx/base/directives/METHOD.testGroup =================================================================== --- test/trunk/ooRexx/base/directives/METHOD.testGroup 2024-08-24 19:46:39 UTC (rev 12879) +++ test/trunk/ooRexx/base/directives/METHOD.testGroup 2024-08-24 20:01:12 UTC (rev 12880) @@ -1,7 +1,7 @@ #!/usr/bin/env rexx /*----------------------------------------------------------------------------*/ /* */ -/* Copyright (c) 2007-2022 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2007-2024 Rexx Language Association. All rights reserved. */ /* */ /* This program and the accompanying materials are made available under */ /* the terms of the Common Public License v1.0 which accompanies this */ @@ -133,6 +133,10 @@ ::method testMisplacedClassMethod self~assertSyntaxError(99.905, ("::method 'foo' class", "say hi")) +::method testExternalNullstring + -- 99.917: Incorrect external name specification + self~assertSyntaxError(99.917, "::method foo external ''") + ::method testExternalTwice self~assertSyntaxError(25.902, "::METHOD isCaseSensitive EXTERNAL 'LIBRARY REXX file_case_sensitivexxxxx' EXTERNAL 'LIBRARY REXX file_case_sensitivexxxxx'") Modified: test/trunk/ooRexx/base/directives/ROUTINE.testGroup =================================================================== --- test/trunk/ooRexx/base/directives/ROUTINE.testGroup 2024-08-24 19:46:39 UTC (rev 12879) +++ test/trunk/ooRexx/base/directives/ROUTINE.testGroup 2024-08-24 20:01:12 UTC (rev 12880) @@ -109,6 +109,10 @@ self~assertIsA(r, .routine) self~assertEquals(r[], rxcalcpi()) +::method testExternalNullstring + -- 99.917: Incorrect external name specification + self~assertSyntaxError(99.917, "::routine foo external ''") + ::method testExternalLibraryBadName self~assertSyntaxError(90.999, "::routine foo external 'LIBRARY rxmath RxCalxPiXXXXXX'") |
From: <eri...@us...> - 2024-08-24 19:46:42
|
Revision: 12879 http://sourceforge.net/p/oorexx/code-0/12879 Author: erich_st Date: 2024-08-24 19:46:39 +0000 (Sat, 24 Aug 2024) Log Message: ----------- update tests for [bugs:#1958] Modified Paths: -------------- test/trunk/ooRexx/base/directives/ROUTINE.testGroup Modified: test/trunk/ooRexx/base/directives/ROUTINE.testGroup =================================================================== --- test/trunk/ooRexx/base/directives/ROUTINE.testGroup 2024-08-24 19:44:12 UTC (rev 12878) +++ test/trunk/ooRexx/base/directives/ROUTINE.testGroup 2024-08-24 19:46:39 UTC (rev 12879) @@ -1,7 +1,7 @@ #!/usr/bin/env rexx /*----------------------------------------------------------------------------*/ /* */ -/* Copyright (c) 2007-2022 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2007-2024 Rexx Language Association. All rights reserved. */ /* */ /* This program and the accompanying materials are made available under */ /* the terms of the Common Public License v1.0 which accompanies this */ @@ -119,10 +119,12 @@ self~assertSyntaxError(99.917, "::routine foo external 'LIBRARY'") ::method testExternalLibraryMissingSpec - self~assertSyntaxError(19.925, "::routine foo external") + -- String expected after EXTERNAL keyword + self~assertSyntaxError(19.905, "::routine foo external") ::method testExternalLibraryBadSpecType - self~assertSyntaxError(19.925, "::routine foo external library") + -- String expected after EXTERNAL keyword + self~assertSyntaxError(19.905, "::routine foo external library") ::method testExternalLibraryBadRoutineType self~assertSyntaxError(99.917, "::routine foo external 'LIB rxmath RxCalxPi'") |
From: <eri...@us...> - 2024-08-24 19:44:15
|
Revision: 12878 http://sourceforge.net/p/oorexx/code-0/12878 Author: erich_st Date: 2024-08-24 19:44:12 +0000 (Sat, 24 Aug 2024) Log Message: ----------- add tests for [bugs:#1965] Modified Paths: -------------- test/trunk/ooRexx/base/directives/OPTIONS.testGroup Modified: test/trunk/ooRexx/base/directives/OPTIONS.testGroup =================================================================== --- test/trunk/ooRexx/base/directives/OPTIONS.testGroup 2024-08-24 19:41:08 UTC (rev 12877) +++ test/trunk/ooRexx/base/directives/OPTIONS.testGroup 2024-08-24 19:44:12 UTC (rev 12878) @@ -147,8 +147,8 @@ -- OPTIONS ERROR tests ::method test_error_syntax_missing - -- 19.922: String or symbol expected after ERROR keyword. - self~assertSyntaxError(19.922, "::options error") + -- 20.929: Symbol expected after ERROR keyword + self~assertSyntaxError(20.929, "::options error") ::method test_error_syntax_invalid -- 25.927: Unknown keyword following "ERROR"; found "INVALID". @@ -200,8 +200,8 @@ */ ::method test_failure_syntax_missing - -- 19.922: String or symbol expected after FAILURE keyword. - self~assertSyntaxError(19.922, "::options failure") + -- 20.929: Symbol expected after FAILURE keyword + self~assertSyntaxError(20.929, "::options failure") ::method test_failure_syntax_invalid -- 25.927: Unknown keyword following "FAILURE"; found "INVALID". @@ -244,8 +244,8 @@ -- OPTIONS LOSTDIGITS tests ::method test_lostdigits_syntax_missing - -- 19.922: String or symbol expected after LOSTDIGITS keyword. - self~assertSyntaxError(19.922, "::options lostdigits") + -- 20.929: Symbol expected after LOSTDIGITS keyword + self~assertSyntaxError(20.929, "::options lostdigits") ::method test_lostdigits_syntax_invalid -- 25.927: Unknown keyword following "LOSTDIGITS"; found "INVALID". @@ -297,8 +297,8 @@ -- OPTIONS NOSTRING tests ::method test_nostring_syntax_missing - -- 19.922: String or symbol expected after NOSTRING keyword. - self~assertSyntaxError(19.922, "::options nostring") + -- 20.929: Symbol expected after NOSTRING keyword + self~assertSyntaxError(20.929, "::options nostring") ::method test_nostring_syntax_invalid -- 25.927: Unknown keyword following "NOSTRING"; found "INVALID". @@ -332,8 +332,8 @@ -- OPTIONS NOTREADY tests ::method test_notready_syntax_missing - -- 19.922: String or symbol expected after NOTREADY keyword. - self~assertSyntaxError(19.922, "::options notready") + -- 20.929: Symbol expected after NOTREADY keyword + self~assertSyntaxError(20.929, "::options notready") ::method test_notready_syntax_invalid -- 25.927: Unknown keyword following "NOTREADY"; found "INVALID". @@ -365,8 +365,8 @@ -- OPTIONS ALL tests ::method test_all_syntax_missing - -- 19.922: String or symbol expected after ALL keyword. - self~assertSyntaxError((19.922, "ALL"), "::options all") + -- 20.929: Symbol expected after ALL keyword + self~assertSyntaxError((20.929, "ALL"), "::options all") ::method test_all_syntax_invalid -- 25.927: Unknown keyword following "ALL"; found "INVALID". @@ -503,7 +503,8 @@ self~assertSyntaxError(25.927, ("return abc.1.2", "::options novalue on")) ::method test_novalue_missing_value - self~assertSyntaxError(19.922, ("return abc.1.2", "::options novalue")) + -- 20.929: Symbol expected after NOVALUE keyword + self~assertSyntaxError(20.929, ("return abc.1.2", "::options novalue")) -- OPTIONS (NO)PROLOG tests |
From: <eri...@us...> - 2024-08-24 19:41:15
|
Revision: 12877 http://sourceforge.net/p/oorexx/code-0/12877 Author: erich_st Date: 2024-08-24 19:41:08 +0000 (Sat, 24 Aug 2024) Log Message: ----------- fix minor rexxref typos Modified Paths: -------------- docs/trunk/rexxref/en-US/fundclasses.xml docs/trunk/rexxref/en-US/instrc.xml docs/trunk/rexxref/en-US/intro.xml docs/trunk/rexxref/en-US/oneof.xml docs/trunk/rexxref/en-US/utilityclasses.xml Modified: docs/trunk/rexxref/en-US/fundclasses.xml =================================================================== --- docs/trunk/rexxref/en-US/fundclasses.xml 2024-08-24 19:32:56 UTC (rev 12876) +++ docs/trunk/rexxref/en-US/fundclasses.xml 2024-08-24 19:41:08 UTC (rev 12877) @@ -1578,7 +1578,7 @@ </para> <para>As this method, other than the similar method <xref linkend="mthMessageStart" xrefstyle="select:title"/>, -starts a copy of the message, it can be called mutiple times with the +starts a copy of the message, it can be called multiple times with the same receiving message. </para> <para>If <emphasis role="italic">target</emphasis> is specified, @@ -1627,7 +1627,7 @@ </para> <para>As this method, other than the similar method <xref linkend="mthMessageStartWith" xrefstyle="select:title"/>, -starts a copy of the message, it can be called mutiple times with the +starts a copy of the message, it can be called multiple times with the same receiving message. </para> <para>If <emphasis role="italic">target</emphasis> is specified, Modified: docs/trunk/rexxref/en-US/instrc.xml =================================================================== --- docs/trunk/rexxref/en-US/instrc.xml 2024-08-24 19:32:56 UTC (rev 12876) +++ docs/trunk/rexxref/en-US/instrc.xml 2024-08-24 19:41:08 UTC (rev 12877) @@ -201,7 +201,7 @@ <literal>ksh</literal>, <literal>tcsh</literal>, or <literal>zsh</literal> to execute the command. If the appropriate shell is not installed on the system, executing a - command in any of these enviroments will raise a failure. + command in any of these environments will raise a failure. </para></listitem> </varlistentry> <varlistentry> @@ -338,7 +338,7 @@ specified for a RexxQueue. If the resulting object is an OrderedCollection object and <option>REPLACE</option> is specified, the collection is emptied using -method <methodname>emtpy</methodname> before any output lines are added +method <methodname>empty</methodname> before any output lines are added to the collection using method <methodname>append</methodname>. <option>REPLACE</option> is the default. If <option>APPEND</option> is specified, output lines are appended to Modified: docs/trunk/rexxref/en-US/intro.xml =================================================================== --- docs/trunk/rexxref/en-US/intro.xml 2024-08-24 19:32:56 UTC (rev 12876) +++ docs/trunk/rexxref/en-US/intro.xml 2024-08-24 19:41:08 UTC (rev 12877) @@ -394,7 +394,7 @@ <section id="xpolym"><title>Polymorphism</title> <indexterm><primary>variables</primary> -<secondary>aquiring</secondary></indexterm> +<secondary>acquiring</secondary></indexterm> <indexterm><primary>polymorphism</primary></indexterm> <para>Polymorphism gives you a single interface to objects of different types. This example shows instances of classes inheriting from the Collection @@ -478,7 +478,7 @@ <secondary>general</secondary></indexterm> <indexterm><primary>structure and syntax</primary></indexterm> <indexterm><primary>variables</primary> -<secondary>aquiring</secondary></indexterm> +<secondary>acquiring</secondary></indexterm> <para>A Rexx program is built from a series of <emphasis>clauses</emphasis> that are composed of: </para> <itemizedlist> Modified: docs/trunk/rexxref/en-US/oneof.xml =================================================================== --- docs/trunk/rexxref/en-US/oneof.xml 2024-08-24 19:32:56 UTC (rev 12876) +++ docs/trunk/rexxref/en-US/oneof.xml 2024-08-24 19:41:08 UTC (rev 12877) @@ -7,7 +7,7 @@ # # Description: Open Object Rexx: Reference XML File # - # Copyright (c) 2005-2022, Rexx Language Association. All rights reserved. + # Copyright (c) 2005-2024, Rexx Language Association. All rights reserved. # Portions Copyright (c) 2004, IBM Corporation. All rights reserved. # # This program and the accompanying materials are made available under @@ -285,7 +285,7 @@ <indexterm><primary>built-in object</primary> <secondary>.TRACEOUTPUT object</secondary></indexterm> <indexterm><primary>public object</primary> -<secondary>.TRACEOUPUT object</secondary></indexterm> +<secondary>.TRACEOUTPUT object</secondary></indexterm> <para>This <xref linkend="clsMonitor" xrefstyle="template:Monitor"/> object holds the trace output target object. You can redirect the trace output in the same way as with the output Modified: docs/trunk/rexxref/en-US/utilityclasses.xml =================================================================== --- docs/trunk/rexxref/en-US/utilityclasses.xml 2024-08-24 19:32:56 UTC (rev 12876) +++ docs/trunk/rexxref/en-US/utilityclasses.xml 2024-08-24 19:41:08 UTC (rev 12877) @@ -3245,7 +3245,7 @@ <xref linkend="mthEventSemaphoreWait" xrefstyle="template:waiting"/> for this event are released. Activities calling the <methodname>wait</methodname> method while -the event semapahore is already in the posted state will continue +the event semaphore is already in the posted state will continue executing without getting suspended. </para> <para>See also method <xref linkend="mthEventSemaphoreReset" xrefstyle="select:title"/>. |
From: <eri...@us...> - 2024-08-24 19:32:58
|
Revision: 12876 http://sourceforge.net/p/oorexx/code-0/12876 Author: erich_st Date: 2024-08-24 19:32:56 +0000 (Sat, 24 Aug 2024) Log Message: ----------- fix code an update tests for [bugs:#1970] allow DO WITH as repetitive DO Modified Paths: -------------- main/trunk/interpreter/parser/InstructionParser.cpp main/trunk/interpreter/parser/LanguageParser.hpp test/trunk/ooRexx/base/keyword/DoWith.testGroup test/trunk/ooRexx/base/keyword/LoopWith.testGroup Modified: main/trunk/interpreter/parser/InstructionParser.cpp =================================================================== --- main/trunk/interpreter/parser/InstructionParser.cpp 2024-08-23 13:13:26 UTC (rev 12875) +++ main/trunk/interpreter/parser/InstructionParser.cpp 2024-08-24 19:32:56 UTC (rev 12876) @@ -1579,7 +1579,7 @@ * * @return A constructed instruction object of the appropriate type. */ -RexxInstruction* LanguageParser::newDoWithLoop(RexxString *label, RexxVariableBase *countVariable) +RexxInstruction* LanguageParser::newDoWithLoop(RexxString *label, RexxVariableBase *countVariable, RexxToken *token) { // a construct to fill in for the instruction. WithLoop withLoop; @@ -1588,13 +1588,10 @@ // track while/until forms InstructionSubKeyword conditionalType = SUBKEY_NONE; - // we have already parsed over the WITH keyword, so we're looing + // we have already parsed over the WITH keyword, so we're looking // for the INDEX, ITEM, and OVER keywords now. OVER must be after // INDEX and ITEM, which can be in any order (and only one is needed). - // get the next real token. - RexxToken *token = nextReal(); - // these all options are marked by symbols, so keep looping while we have one while (token->isSymbol()) { @@ -2124,6 +2121,12 @@ // parse and return the DO OVER options return newDoOverLoop(label, countVariable, token); } + // WITH INDEX var ITEM var OVER expr....with a potential WHILE or UNTIL modifier + else if (token->subKeyword() == SUBKEY_WITH && + (second->subKeyword() == SUBKEY_INDEX || second->subKeyword() == SUBKEY_ITEM)) + { + return newDoWithLoop(label, countVariable, second); + } // not a controlled form, but this could be a conditional form. else { @@ -2135,11 +2138,6 @@ // now check the other keyword varieties. switch (token->subKeyword()) { - // WITH INDEX var ITEM var OVER expr....with a potential WHILE or UNTIL modifier - case SUBKEY_WITH: - { - return newDoWithLoop(label, countVariable); - } // FOREVER...this can have either a WHILE or UNTIL modifier. case SUBKEY_FOREVER: // DO FOREVER { Modified: main/trunk/interpreter/parser/LanguageParser.hpp =================================================================== --- main/trunk/interpreter/parser/LanguageParser.hpp 2024-08-23 13:13:26 UTC (rev 12875) +++ main/trunk/interpreter/parser/LanguageParser.hpp 2024-08-24 19:32:56 UTC (rev 12876) @@ -1,7 +1,7 @@ /*----------------------------------------------------------------------------*/ /* */ /* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2019 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2005-2024 Rexx Language Association. All rights reserved. */ /* */ /* This program and the accompanying materials are made available under */ /* the terms of the Common Public License v1.0 which accompanies this */ @@ -256,7 +256,7 @@ RexxInstruction *doNew(); RexxInstruction *newControlledLoop(RexxString *label, RexxVariableBase *countVariable, RexxToken *nameToken); RexxInstruction *newDoOverLoop(RexxString *label, RexxVariableBase *countVariable, RexxToken *nameToken); - RexxInstruction *newDoWithLoop(RexxString *label, RexxVariableBase *countVariable); + RexxInstruction *newDoWithLoop(RexxString *label, RexxVariableBase *countVariable, RexxToken *nameToken); RexxInstruction *newSimpleDo(RexxString *label); RexxInstruction *newLoopForever(RexxString *label, RexxVariableBase *countVariable); RexxInstruction *newLoopWhile(RexxString *label, RexxVariableBase *countVariable, WhileUntilLoop &conditional); Modified: test/trunk/ooRexx/base/keyword/DoWith.testGroup =================================================================== --- test/trunk/ooRexx/base/keyword/DoWith.testGroup 2024-08-23 13:13:26 UTC (rev 12875) +++ test/trunk/ooRexx/base/keyword/DoWith.testGroup 2024-08-24 19:32:56 UTC (rev 12876) @@ -1,7 +1,7 @@ #!/usr/bin/env rexx /*----------------------------------------------------------------------------*/ /* */ -/* Copyright (c) 2007-2022 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2007-2024 Rexx Language Association. All rights reserved. */ /* */ /* This program and the accompanying materials are made available under */ /* the terms of the Common Public License v1.0 which accompanies this */ @@ -229,13 +229,25 @@ do with index i over "abc" end +::method test_with_no_variables + -- this is actually a repetitive DO, since DO WITH is checked for a trailing INDEX or ITEM + with = 3 + loops = 0 + do with + loops += 1 + end + self~assertEquals(3, loops) + + with = 3 + do counter loops with + end + self~assertEquals(3, loops) + ::method test_no_control - -- this is actually a DO over do, since the control variable/OVER combination is checked -- first do with over "abc" end - self~assertEquals("abc", with) ::method test_no_over1 @@ -274,9 +286,6 @@ ::method test_index_no_symbol self~assertSyntaxError(20.929, ("do with index 'i' over (1,2)", "end")) -::method test_with_no_variables - self~assertSyntaxError(27.903, ("do with", "end")) - ::method test_with_over_no_expr self~assertSyntaxError(35.911, ("do with index i over", "end")) Modified: test/trunk/ooRexx/base/keyword/LoopWith.testGroup =================================================================== --- test/trunk/ooRexx/base/keyword/LoopWith.testGroup 2024-08-23 13:13:26 UTC (rev 12875) +++ test/trunk/ooRexx/base/keyword/LoopWith.testGroup 2024-08-24 19:32:56 UTC (rev 12876) @@ -1,7 +1,7 @@ #!/usr/bin/env rexx /*----------------------------------------------------------------------------*/ /* */ -/* Copyright (c) 2007-2022 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2007-2024 Rexx Language Association. All rights reserved. */ /* */ /* This program and the accompanying materials are made available under */ /* the terms of the Common Public License v1.0 which accompanies this */ @@ -229,13 +229,25 @@ loop with index i over "abc" end +::method test_with_no_variables + -- this is actually a repetitive LOOP, since DO WITH is checked for a trailing INDEX or ITEM + with = 3 + loops = 0 + loop with + loops += 1 + end + self~assertEquals(3, loops) + + with = 3 + loop counter loops with + end + self~assertEquals(3, loops) + ::method test_no_control - - -- this is actually a DO over loop, since the control variable/OVER combination is checked + -- this is actually a LOOP over loop, since the control variable/OVER combination is checked -- first loop with over "abc" end - self~assertEquals("abc", with) ::method test_no_over1 @@ -274,9 +286,6 @@ ::method test_index_no_symbol self~assertSyntaxError(20.929, ("loop with index 'i' over (1,2)", "end")) -::method test_with_no_variables - self~assertSyntaxError(27.903, ("loop with", "end")) - ::method test_with_over_no_expr self~assertSyntaxError(35.911, ("loop with index i over", "end")) |
From: <eri...@us...> - 2024-08-23 13:13:29
|
Revision: 12875 http://sourceforge.net/p/oorexx/code-0/12875 Author: erich_st Date: 2024-08-23 13:13:26 +0000 (Fri, 23 Aug 2024) Log Message: ----------- fix code for [bugs:#1965] Text of syntax error 19.922 wrong Modified Paths: -------------- main/trunk/interpreter/parser/DirectiveParser.cpp main/trunk/interpreter/parser/InstructionParser.cpp Modified: main/trunk/interpreter/parser/DirectiveParser.cpp =================================================================== --- main/trunk/interpreter/parser/DirectiveParser.cpp 2024-08-23 13:03:23 UTC (rev 12874) +++ main/trunk/interpreter/parser/DirectiveParser.cpp 2024-08-23 13:13:26 UTC (rev 12875) @@ -1079,7 +1079,7 @@ token = nextReal(); if (!token->isSymbol()) { - syntaxError(Error_Symbol_or_string_keyword, GlobalNames::NOVALUE); + syntaxError(Error_Symbol_expected_after_keyword, GlobalNames::NOVALUE); } switch (token->subDirective()) @@ -1109,7 +1109,7 @@ token = nextReal(); if (!token->isSymbol()) { - syntaxError(Error_Symbol_or_string_keyword, GlobalNames::ERRORNAME); + syntaxError(Error_Symbol_expected_after_keyword, GlobalNames::ERRORNAME); } switch (token->subDirective()) @@ -1138,7 +1138,7 @@ token = nextReal(); if (!token->isSymbol()) { - syntaxError(Error_Symbol_or_string_keyword, GlobalNames::FAILURE); + syntaxError(Error_Symbol_expected_after_keyword, GlobalNames::FAILURE); } switch (token->subDirective()) @@ -1168,7 +1168,7 @@ token = nextReal(); if (!token->isSymbol()) { - syntaxError(Error_Symbol_or_string_keyword, GlobalNames::LOSTDIGITS); + syntaxError(Error_Symbol_expected_after_keyword, GlobalNames::LOSTDIGITS); } switch (token->subDirective()) @@ -1198,7 +1198,7 @@ token = nextReal(); if (!token->isSymbol()) { - syntaxError(Error_Symbol_or_string_keyword, GlobalNames::NOSTRING); + syntaxError(Error_Symbol_expected_after_keyword, GlobalNames::NOSTRING); } switch (token->subDirective()) @@ -1228,7 +1228,7 @@ token = nextReal(); if (!token->isSymbol()) { - syntaxError(Error_Symbol_or_string_keyword, GlobalNames::NOTREADY); + syntaxError(Error_Symbol_expected_after_keyword, GlobalNames::NOTREADY); } switch (token->subDirective()) @@ -1258,7 +1258,7 @@ token = nextReal(); if (!token->isSymbol()) { - syntaxError(Error_Symbol_or_string_keyword, GlobalNames::ALL); + syntaxError(Error_Symbol_expected_after_keyword, GlobalNames::ALL); } switch (token->subDirective()) Modified: main/trunk/interpreter/parser/InstructionParser.cpp =================================================================== --- main/trunk/interpreter/parser/InstructionParser.cpp 2024-08-23 13:03:23 UTC (rev 12874) +++ main/trunk/interpreter/parser/InstructionParser.cpp 2024-08-23 13:13:26 UTC (rev 12875) @@ -1,7 +1,7 @@ /*----------------------------------------------------------------------------*/ /* */ /* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2023 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2005-2024 Rexx Language Association. All rights reserved. */ /* */ /* This program and the accompanying materials are made available under */ /* the terms of the Common Public License v1.0 which accompanies this */ |
From: <eri...@us...> - 2024-08-23 13:03:26
|
Revision: 12874 http://sourceforge.net/p/oorexx/code-0/12874 Author: erich_st Date: 2024-08-23 13:03:23 +0000 (Fri, 23 Aug 2024) Log Message: ----------- fix code for [bugs:#1958] Text of syntax error 19.925 is wrong; this also fixes an interpreter crash if EXTERNAL is spec is a nullstring Modified Paths: -------------- main/trunk/interpreter/parser/DirectiveParser.cpp Modified: main/trunk/interpreter/parser/DirectiveParser.cpp =================================================================== --- main/trunk/interpreter/parser/DirectiveParser.cpp 2024-08-23 12:53:43 UTC (rev 12873) +++ main/trunk/interpreter/parser/DirectiveParser.cpp 2024-08-23 13:03:23 UTC (rev 12874) @@ -1,7 +1,7 @@ /*----------------------------------------------------------------------------*/ /* */ /* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */ -/* Copyright (c) 2005-2020 Rexx Language Association. All rights reserved. */ +/* Copyright (c) 2005-2024 Rexx Language Association. All rights reserved. */ /* */ /* This program and the accompanying materials are made available under */ /* the terms of the Common Public License v1.0 which accompanies this */ @@ -979,8 +979,8 @@ size_t digits; - // convert to a binary number - if (!token->value()->requestUnsignedNumber(digits, number_digits()) || digits < 1) + // convert to a binary number using either 9 or 18 digits + if (!token->value()->requestUnsignedNumber(digits, Numerics::ARGUMENT_DIGITS) || digits < 1) { syntaxError(Error_Invalid_whole_number_digits, token->value()); } @@ -1036,7 +1036,8 @@ size_t fuzz; - if (!value->requestUnsignedNumber(fuzz, number_digits())) + // convert to a binary number using either 9 or 18 digits + if (!value->requestUnsignedNumber(fuzz, Numerics::ARGUMENT_DIGITS)) { syntaxError(Error_Invalid_whole_number_fuzz, value); } @@ -1359,6 +1360,11 @@ // convert external into array of words (this also adds all words // to the common string pool and uppercases the first word) Protected<ArrayClass> _words = words(externalSpec); + if (_words->size() == 0) + { + syntaxError(Error_Translation_bad_external, externalSpec); + } + // not 'LIBRARY library [entry]' form? if (((RexxString *)(_words->get(1)))->strCompare("LIBRARY")) { @@ -2554,7 +2560,7 @@ // this is a compound string descriptor, so it must be a literal if (!token->isLiteral()) { - syntaxError(Error_Symbol_or_string_directive_option, GlobalNames::ROUTINE_DIRECTIVE, GlobalNames::EXTERNAL); + syntaxError(Error_Symbol_or_string_external, token); } externalname = token->value(); @@ -2592,8 +2598,13 @@ // convert external into array of words (this also adds all words // to the common string pool and uppercases the first word) Protected<ArrayClass> _words = words(externalname); + if (_words->size() == 0) + { + syntaxError(Error_Translation_bad_external, externalname); + } + // ::ROUTINE foo EXTERNAL "LIBRARY libbar [foo]" - // NOTE: decodeMethodLibrary doesn't really work for routines + // NOTE: decodeExternalMethod doesn't really work for routines // because we have a second form. Not really worth writing // a second version just for one use. if (((RexxString *)(_words->get(1)))->strCompare("LIBRARY")) |
From: <eri...@us...> - 2024-08-23 12:53:45
|
Revision: 12873 http://sourceforge.net/p/oorexx/code-0/12873 Author: erich_st Date: 2024-08-23 12:53:43 +0000 (Fri, 23 Aug 2024) Log Message: ----------- fix code for [bugs:#1963] Extraneous data wrongly accepted after FOREVER Modified Paths: -------------- main/trunk/interpreter/parser/InstructionParser.cpp Modified: main/trunk/interpreter/parser/InstructionParser.cpp =================================================================== --- main/trunk/interpreter/parser/InstructionParser.cpp 2024-08-23 12:47:00 UTC (rev 12872) +++ main/trunk/interpreter/parser/InstructionParser.cpp 2024-08-23 12:53:43 UTC (rev 12873) @@ -4642,5 +4642,11 @@ break; } } + else + { + // not a symbol, this is invalid + syntaxError(error_message, token); + } + return conditional; } |
From: <eri...@us...> - 2024-08-23 12:47:02
|
Revision: 12872 http://sourceforge.net/p/oorexx/code-0/12872 Author: erich_st Date: 2024-08-23 12:47:00 +0000 (Fri, 23 Aug 2024) Log Message: ----------- clarify rexxref for [documentation:#328] DO reserved subkeywords Modified Paths: -------------- docs/trunk/rexxref/en-US/dire.xml docs/trunk/rexxref/en-US/instrc.xml docs/trunk/rexxref/en-US/utilityclasses.xml Modified: docs/trunk/rexxref/en-US/dire.xml =================================================================== --- docs/trunk/rexxref/en-US/dire.xml 2024-08-23 12:43:54 UTC (rev 12871) +++ docs/trunk/rexxref/en-US/dire.xml 2024-08-23 12:47:00 UTC (rev 12872) @@ -597,7 +597,7 @@ <orderedlist> <listitem><para>Calculated ::CONSTANT directives (where <emphasis role="italic">value</emphasis> is an expression enclosed in -parenthesis) can reference any other constant ::CONSTANT directives (where +parentheses) can reference any other constant ::CONSTANT directives (where <emphasis role="italic">value</emphasis> is omitted, a single literal string, a symbol that is taken as a constant, or a valid number optionally preceded by "<literal>-</literal>" or "<literal>+</literal>"). Modified: docs/trunk/rexxref/en-US/instrc.xml =================================================================== --- docs/trunk/rexxref/en-US/instrc.xml 2024-08-23 12:43:54 UTC (rev 12871) +++ docs/trunk/rexxref/en-US/instrc.xml 2024-08-23 12:47:00 UTC (rev 12872) @@ -1008,8 +1008,10 @@ commands, message instructions, and keyword instructions (including any of the more complex constructs such as IF, SELECT, and the DO or LOOP instruction itself). </para></listitem> -<listitem><para>The subkeywords WHILE, UNTIL, OVER, WITH, INDEX, and ITEM are reserved within a DO or LOOP -instruction in that they act as expression terminators for other keywords. Thus they +<listitem> +<para>Within DO or LOOP instructions that allow subkeywords +WHILE, UNTIL, OVER, WITH, INDEX, or ITEM, these subkeywords are reserved +in that they act as expression terminators for other keywords. Thus they cannot be used as symbols in any of the expressions. Similarly, TO, BY, and FOR cannot be used in <emphasis role="italic">expri</emphasis>, @@ -1020,7 +1022,7 @@ FOREVER is also reserved, but only if it immediately follows the keyword DO or LOOP and is not followed by an equal sign. However, parentheses around or within an expression can prevent these keywords from terminating an expression. For example, -<example><title>Instructions — DO variable without parenthesis</title> +<example><title>Instructions — DO variable without parentheses</title> <programlisting> do i = 1 while i < until say i @@ -1030,7 +1032,7 @@ </para> <para>is considered a syntax error because of the variable named UNTIL. Using parentheses around the expression allows the variable UNTIL to be used: -<example><title>Instructions — DO variable with parenthesis</title> +<example><title>Instructions — DO variable with parentheses</title> <programlisting> do i = 1 while (i < until) say i Modified: docs/trunk/rexxref/en-US/utilityclasses.xml =================================================================== --- docs/trunk/rexxref/en-US/utilityclasses.xml 2024-08-23 12:43:54 UTC (rev 12871) +++ docs/trunk/rexxref/en-US/utilityclasses.xml 2024-08-23 12:47:00 UTC (rev 12872) @@ -7022,7 +7022,7 @@ <entry><para>"Escape" symbol: use the next character literally </para></entry></row> <row><entry><literal>(</literal>…<literal>)</literal></entry> -<entry><para>Expression in parenthesis (use where needed) +<entry><para>Expression in parentheses (use where needed) </para></entry></row> <row><entry><literal>{</literal><emphasis role="italic">n</emphasis><literal>}</literal> </entry> <entry><para>Matches previous expression <emphasis role="italic">n</emphasis> times (<emphasis role="italic">n</emphasis> > 1) |
From: <eri...@us...> - 2024-08-23 12:43:56
|
Revision: 12871 http://sourceforge.net/p/oorexx/code-0/12871 Author: erich_st Date: 2024-08-23 12:43:54 +0000 (Fri, 23 Aug 2024) Log Message: ----------- fix error message inserts for [documentation:#329] Modified Paths: -------------- docs/trunk/rexxref/en-US/errnums.xml main/trunk/interpreter/messages/RexxErrorMessages.h main/trunk/interpreter/messages/errnums.xml main/trunk/interpreter/messages/rexxmsg.xml Modified: docs/trunk/rexxref/en-US/errnums.xml =================================================================== --- docs/trunk/rexxref/en-US/errnums.xml 2024-08-18 16:46:53 UTC (rev 12870) +++ docs/trunk/rexxref/en-US/errnums.xml 2024-08-23 12:43:54 UTC (rev 12871) @@ -250,7 +250,7 @@ <varlistentry> <term>002</term> <listitem> -<para>Symbol following END ("<emphasis role="italic">symbol</emphasis>") must match block specification name ("<emphasis role="italic">control_variable</emphasis>") on line <emphasis role="italic">line_number</emphasis> or be omitted.</para> +<para>Symbol following END ("<emphasis role="italic">symbol</emphasis>") must match block specification name ("<emphasis role="italic">name</emphasis>") on line <emphasis role="italic">line_number</emphasis> or be omitted.</para> </listitem> </varlistentry> <varlistentry> @@ -262,7 +262,7 @@ <varlistentry> <term>004</term> <listitem> -<para>Symbol following END ("<emphasis role="italic">symbol</emphasis>") must match LABEL of SELECT specification ("<emphasis role="italic">control_variable</emphasis>") on line <emphasis role="italic">line_number</emphasis> or be omitted.</para> +<para>Symbol following END ("<emphasis role="italic">symbol</emphasis>") must match LABEL of SELECT specification ("<emphasis role="italic">name</emphasis>") on line <emphasis role="italic">line_number</emphasis> or be omitted.</para> </listitem> </varlistentry> <varlistentry> @@ -975,19 +975,19 @@ <varlistentry> <term>907</term> <listitem> -<para>Data must not follow the LEAVE control variable name; found "<emphasis role="italic">data</emphasis>".</para> +<para>Data must not follow the LEAVE name; found "<emphasis role="italic">data</emphasis>".</para> </listitem> </varlistentry> <varlistentry> <term>908</term> <listitem> -<para>Data must not follow the ITERATE control variable name; found "<emphasis role="italic">data</emphasis>".</para> +<para>Data must not follow the ITERATE name; found "<emphasis role="italic">data</emphasis>".</para> </listitem> </varlistentry> <varlistentry> <term>909</term> <listitem> -<para>Data must not follow the END control variable name; found "<emphasis role="italic">data</emphasis>".</para> +<para>Data must not follow the END name; found "<emphasis role="italic">data</emphasis>".</para> </listitem> </varlistentry> <varlistentry> Modified: main/trunk/interpreter/messages/RexxErrorMessages.h =================================================================== --- main/trunk/interpreter/messages/RexxErrorMessages.h 2024-08-18 16:46:53 UTC (rev 12870) +++ main/trunk/interpreter/messages/RexxErrorMessages.h 2024-08-23 12:43:54 UTC (rev 12871) @@ -196,9 +196,9 @@ MESSAGE(Error_Invalid_data_condition, "Data must not follow the condition name; found \"&1\".") MESSAGE(Error_Invalid_data_signal, "Data must not follow the SIGNAL label name; found \"&1\".") MESSAGE(Error_Invalid_data_trace, "Data must not follow the TRACE setting; found \"&1\".") - MESSAGE(Error_Invalid_data_leave, "Data must not follow the LEAVE control variable name; found \"&1\".") - MESSAGE(Error_Invalid_data_iterate, "Data must not follow the ITERATE control variable name; found \"&1\".") - MESSAGE(Error_Invalid_data_end, "Data must not follow the END control variable name; found \"&1\".") + MESSAGE(Error_Invalid_data_leave, "Data must not follow the LEAVE name; found \"&1\".") + MESSAGE(Error_Invalid_data_iterate, "Data must not follow the ITERATE name; found \"&1\".") + MESSAGE(Error_Invalid_data_end, "Data must not follow the END name; found \"&1\".") MESSAGE(Error_Invalid_data_form, "Data must not follow the NUMERIC FORM specification; found \"&1\".") MESSAGE(Error_Invalid_data_guard_off, "Data must not follow the GUARD OFF specification; found \"&1\".") MESSAGE(Error_Invalid_data_constant_dir, "Data must not follow the ::CONSTANT value; found \"&1\".") Modified: main/trunk/interpreter/messages/errnums.xml =================================================================== --- main/trunk/interpreter/messages/errnums.xml 2024-08-18 16:46:53 UTC (rev 12870) +++ main/trunk/interpreter/messages/errnums.xml 2024-08-23 12:43:54 UTC (rev 12871) @@ -250,7 +250,7 @@ <varlistentry> <term>002</term> <listitem> -<para>Symbol following END ("<emphasis role="italic">symbol</emphasis>") must match block specification name ("<emphasis role="italic">control_variable</emphasis>") on line <emphasis role="italic">line_number</emphasis> or be omitted.</para> +<para>Symbol following END ("<emphasis role="italic">symbol</emphasis>") must match block specification name ("<emphasis role="italic">name</emphasis>") on line <emphasis role="italic">line_number</emphasis> or be omitted.</para> </listitem> </varlistentry> <varlistentry> @@ -262,7 +262,7 @@ <varlistentry> <term>004</term> <listitem> -<para>Symbol following END ("<emphasis role="italic">symbol</emphasis>") must match LABEL of SELECT specification ("<emphasis role="italic">control_variable</emphasis>") on line <emphasis role="italic">line_number</emphasis> or be omitted.</para> +<para>Symbol following END ("<emphasis role="italic">symbol</emphasis>") must match LABEL of SELECT specification ("<emphasis role="italic">name</emphasis>") on line <emphasis role="italic">line_number</emphasis> or be omitted.</para> </listitem> </varlistentry> <varlistentry> @@ -975,19 +975,19 @@ <varlistentry> <term>907</term> <listitem> -<para>Data must not follow the LEAVE control variable name; found "<emphasis role="italic">data</emphasis>".</para> +<para>Data must not follow the LEAVE name; found "<emphasis role="italic">data</emphasis>".</para> </listitem> </varlistentry> <varlistentry> <term>908</term> <listitem> -<para>Data must not follow the ITERATE control variable name; found "<emphasis role="italic">data</emphasis>".</para> +<para>Data must not follow the ITERATE name; found "<emphasis role="italic">data</emphasis>".</para> </listitem> </varlistentry> <varlistentry> <term>909</term> <listitem> -<para>Data must not follow the END control variable name; found "<emphasis role="italic">data</emphasis>".</para> +<para>Data must not follow the END name; found "<emphasis role="italic">data</emphasis>".</para> </listitem> </varlistentry> <varlistentry> Modified: main/trunk/interpreter/messages/rexxmsg.xml =================================================================== --- main/trunk/interpreter/messages/rexxmsg.xml 2024-08-18 16:46:53 UTC (rev 12870) +++ main/trunk/interpreter/messages/rexxmsg.xml 2024-08-23 12:43:54 UTC (rev 12871) @@ -371,7 +371,7 @@ <Component>Rexx</Component> <Severity>Warning</Severity> <SymbolicName>Error_Unexpected_end_control</SymbolicName> - <Text>Symbol following END (<q><Sub position="1" name="symbol"/></q>) must match block specification name (<q><Sub position="2" name="control_variable"/></q>) on line <Sub position="3" name="line_number"/> or be omitted.</Text> + <Text>Symbol following END (<q><Sub position="1" name="symbol"/></q>) must match block specification name (<q><Sub position="2" name="name"/></q>) on line <Sub position="3" name="line_number"/> or be omitted.</Text> </SubMessage> <SubMessage> <Code>10</Code> @@ -389,7 +389,7 @@ <Component>Rexx</Component> <Severity>Warning</Severity> <SymbolicName>Error_Unexpected_end_select</SymbolicName> - <Text>Symbol following END (<q><Sub position="1" name="symbol"/></q>) must match LABEL of SELECT specification (<q><Sub position="2" name="control_variable"/></q>) on line <Sub position="3" name="line_number"/> or be omitted.</Text> + <Text>Symbol following END (<q><Sub position="1" name="symbol"/></q>) must match LABEL of SELECT specification (<q><Sub position="2" name="name"/></q>) on line <Sub position="3" name="line_number"/> or be omitted.</Text> </SubMessage> <SubMessage> <Code>10</Code> @@ -1409,7 +1409,7 @@ <Component>Rexx</Component> <Severity>Warning</Severity> <SymbolicName>Error_Invalid_data_leave</SymbolicName> - <Text>Data must not follow the LEAVE control variable name; found <q><Sub position="1" name="data"/></q>.</Text> + <Text>Data must not follow the LEAVE name; found <q><Sub position="1" name="data"/></q>.</Text> </SubMessage> <SubMessage> <Code>21</Code> @@ -1418,7 +1418,7 @@ <Component>Rexx</Component> <Severity>Warning</Severity> <SymbolicName>Error_Invalid_data_iterate</SymbolicName> - <Text>Data must not follow the ITERATE control variable name; found <q><Sub position="1" name="data"/></q>.</Text> + <Text>Data must not follow the ITERATE name; found <q><Sub position="1" name="data"/></q>.</Text> </SubMessage> <SubMessage> <Code>21</Code> @@ -1427,7 +1427,7 @@ <Component>Rexx</Component> <Severity>Warning</Severity> <SymbolicName>Error_Invalid_data_end</SymbolicName> - <Text>Data must not follow the END control variable name; found <q><Sub position="1" name="data"/></q>.</Text> + <Text>Data must not follow the END name; found <q><Sub position="1" name="data"/></q>.</Text> </SubMessage> <SubMessage> <Code>21</Code> |
From: <eri...@us...> - 2024-08-18 16:46:56
|
Revision: 12870 http://sourceforge.net/p/oorexx/code-0/12870 Author: erich_st Date: 2024-08-18 16:46:53 +0000 (Sun, 18 Aug 2024) Log Message: ----------- update rexxref and rexxpg for [documentation:#319] Environment Symbols Modified Paths: -------------- docs/trunk/rexxpg/en-US/classes.xml docs/trunk/rexxref/en-US/intro.xml Modified: docs/trunk/rexxpg/en-US/classes.xml =================================================================== --- docs/trunk/rexxpg/en-US/classes.xml 2024-08-18 16:40:59 UTC (rev 12869) +++ docs/trunk/rexxpg/en-US/classes.xml 2024-08-18 16:46:53 UTC (rev 12870) @@ -7,7 +7,7 @@ # # Description: Open Object Rexx: Programming Guide XML file. # - # Copyright (c) 2005-2022, Rexx Language Association. All rights reserved. + # Copyright (c) 2005-2024, Rexx Language Association. All rights reserved. # Portions Copyright (c) 2004, IBM Corporation. All rights reserved. # # This program and the accompanying materials are made available under @@ -925,56 +925,77 @@ <para> <indexterm><primary>search order</primary> <secondary>for environment symbols</secondary></indexterm> -When you -use an environment symbol, Rexx performs a series of searches to see if the -environment symbol has an assigned value. The search locations and their ordering -are: </para> - +When you use an environment symbol, the language processor performs a +series of searches to see if the environment symbol has an assigned value. The +search locations and their ordering are: <orderedlist> - -<listitem><para>The classes and routines maintained in the current package by the interpreter. -This package can be retrieved programmatically with the statement <code>.context~package</code>. +<listitem><para>Constants <literal>.nil</literal>, <literal>.false</literal>; and <literal>.true</literal>. </para></listitem> - -<listitem><para>&added50;The current package <emphasis role="italic">local</emphasis> directory. -The package local directory can be accessed programmatically with the statement <code>.context~package~local</code>. +<listitem><para>The list of classes declared on +::CLASS directives +within the current program package or added to the current package using +Package addClass method. </para></listitem> - -<listitem><para>The program local environment directory <literal>.local</literal>, which includes interpreter instance-specific -objects such as the <literal>.input</literal> and <literal>.output</literal> objects. You can directly access the -local environment directory by using the <literal>.local</literal> environment symbol.</para></listitem> - -<listitem><para>The global environment directory <literal>.environment</literal>, which includes all "global" Rexx -objects such as the Rexx-supplied classes (for example, <literal>.Array</literal>) and constants -such as <literal>.true</literal> and <literal>.false</literal>. You can directly access the global environment by -using the <literal>.environment</literal> symbol or using the VALUE built-in function with a -null string for the <emphasis role="italic">selector</emphasis> argument.</para></listitem> - -<listitem><para>Rexx defined symbols. Other simple environment symbols are reserved for -use by Rexx for built-in objects. +<listitem><para>The list of public classes declared on ::CLASS directives +of other files included with a ::REQUIRES directive or added to the current +Package instance using the Package addPackage method. </para></listitem> +<listitem><para>The list of public Rexx supplied classes in the REXX package, like +Object, +String, or +Array. +</para></listitem> +<listitem><para>The package local environment directory specific to the current package. +You can access the package local environment directory through the +Package local method +with <code>.context~package~local</code>. +</para> +</listitem> +<listitem><para>The local environment directory specific to the current +interpreter instance. The local +environment includes instance-specific +objects such as the .INPUT and .OUTPUT objects. You can access the +local environment directory by using the +<literal>.LOCAL</literal> environment symbol. +</para> +</listitem> +<listitem><para>The global environment directory. +The global environment includes Rexx supplied objects like +<literal>.endofline</literal> or the +<literal>.RexxInfo</literal> object. +You can access the global environment by using the +<literal>.ENVIRONMENT</literal> environment symbol. +Entries in the global environment directory can also be accessed via the +<literal>VALUE</literal> built-in function +by using a null string for the +<emphasis role="italic">selector</emphasis> argument.</para></listitem> +<listitem><para>Rexx defined symbols. Other simple environment symbols +reserved for use by Rexx, including +<literal>.RS</literal>, +<literal>.LINE</literal>, +<literal>.METHODS</literal>, +<literal>.ROUTINES</literal>, +<literal>.RESOURCES</literal>, and +<literal>.CONTEXT</literal>.</para></listitem> </orderedlist> +</para> +<para>If an entry is not found for an environment symbol, then the default +character string value is used.</para> -<para>If an entry is not found for an environment symbol, the default character string value (uppercased) of the environment symbol is used including -its leading dot. </para> - -<note> -<para>You can place entries in the <code>.context~package~local</code>, <literal>.local</literal> -and <literal>.environment</literal> directories for programs to use, but <literal>.local</literal> should be preferred over -<literal>.environment</literal> to avoid accidentally overwriting system-defined values. -To avoid conflicts with future Rexx-defined entries, it is recommended that entries you place in either -of these directories include at least one period in the entry name.</para></note> -<example> -<title>.Local Object</title> - +<para>You can place entries in any of the three directories, +the package local, the <literal>.LOCAL</literal>, +and the <literal>.ENVIRONMENT</literal> directory, for programs to use, +with package local preferred over <literal>.LOCAL</literal>, and +and <literal>.LOCAL</literal> preferred over <literal>.ENVIRONMENT</literal>. +To avoid conflicts with future Rexx defined entries, it is recommended +that the entries that you place in any of these directories include at least one +period in the entry name, for example: <programlisting> -<![CDATA[ -/* establish a settings directory in the local environment directory */ -.local~setentry("my.settings", .directory~new) -]]> +-- establish settings directory +.local~setEntry("MyProgram.settings", .directory~new) </programlisting> +</para> -</example> </section> </section> Modified: docs/trunk/rexxref/en-US/intro.xml =================================================================== --- docs/trunk/rexxref/en-US/intro.xml 2024-08-18 16:40:59 UTC (rev 12869) +++ docs/trunk/rexxref/en-US/intro.xml 2024-08-18 16:46:53 UTC (rev 12870) @@ -2889,17 +2889,14 @@ symbol is the string consisting of the characters of the symbol (translated to uppercase). If the symbol identifies an object in the current environment, its value is the mapped object.</para> -<para>These are environment symbols: +<para>These are examples of environment symbols: <example> <title>Environment symbols</title> <programlisting> -.method // A reference to the Rexx Method class - -.true // The Rexx "true" object. Has the value "1" - -.xyz // Normally the value .XYZ - -.3DGlasses // Normally the value .3DGLASSES +.method -- A reference to the Rexx Method class +.true -- The Rexx "true" object. Has the value "1" +.xyz -- Normally the value .XYZ +.3DGlasses -- Normally the value .3DGLASSES </programlisting> </example> </para> @@ -2925,15 +2922,16 @@ </para></listitem> <listitem><para>The package local environment directory specific to the current package. You can access the package local environment directory through the -<classname>Package</classname> -<xref linkend="mthPackageLocal" xrefstyle="select:title"/> method. +Package <xref linkend="mthPackageLocal" xrefstyle="select:title"/> method +with <code>.context~package~local</code>. </para> </listitem> <listitem><para>The local environment directory specific to the current interpreter instance. The local environment includes instance-specific -objects such as the .INPUT and .OUTPUT objects. You can directly access the -local environment directory by using the <xref linkend="locenv" xrefstyle="template:.LOCAL environment symbol"/>. +objects such as the .INPUT and .OUTPUT objects. You can access the +local environment directory by using the +<xref linkend="locenv" xrefstyle="template:.LOCAL"/> environment symbol. </para> </listitem> <listitem><para>The global environment directory. @@ -2940,15 +2938,14 @@ The global environment includes Rexx supplied objects like <xref linkend="ENDOFLINE" xrefstyle="template:.endofline"/> or the <xref linkend="rexxinfoEnv" xrefstyle="template:.RexxInfo object"/>. -You can directly access the global environment by using the -<xref linkend="envo" xrefstyle="template:.ENVIRONMENT environment symbol"/>. +You can access the global environment by using the +<xref linkend="envo" xrefstyle="template:.ENVIRONMENT"/> environment symbol. Entries in the global environment directory can also be accessed via the -<xref linkend="bifValue" xrefstyle="template:VALUE built-in function"/> +<xref linkend="bifValue" xrefstyle="template:VALUE"/> built-in function by using a null string for the <emphasis role="italic">selector</emphasis> argument.</para></listitem> -<listitem><para>Rexx defined symbols. Other simple environment symbols are -reserved for use by Rexx <xref linkend="oneof" xrefstyle="template:built-in environment objects"/>. -The currently defined built-in objects are +<listitem><para>Rexx defined symbols. Other simple environment symbols +reserved for use by Rexx, including <xref linkend="rs" xrefstyle="template:.RS"/>, <xref linkend="linee" xrefstyle="template:.LINE"/>, <xref linkend="methe" xrefstyle="template:.METHODS"/>, @@ -2960,18 +2957,19 @@ <para>If an entry is not found for an environment symbol, then the default character string value is used.</para> -<note><title>Note</title> -<para>You can place entries in both the <literal>.LOCAL</literal> -and the <literal>.ENVIRONMENT</literal> directories for programs to use. +<para>You can place entries in any of the three directories, +the package local, the <literal>.LOCAL</literal>, +and the <literal>.ENVIRONMENT</literal> directory, for programs to use, +with package local preferred over <literal>.LOCAL</literal>, and +and <literal>.LOCAL</literal> preferred over <literal>.ENVIRONMENT</literal>. To avoid conflicts with future Rexx defined entries, it is recommended -that the entries that you place in either directory include at least one +that the entries that you place in any of these directories include at least one period in the entry name, for example: <programlisting> -/* establish settings directory */ -.local~setentry("MyProgram.settings", .directory~new) +-- establish settings directory +.local~setEntry("MyProgram.settings", .directory~new) </programlisting> </para> -</note> </section> </section> |
From: <eri...@us...> - 2024-08-18 16:41:02
|
Revision: 12869 http://sourceforge.net/p/oorexx/code-0/12869 Author: erich_st Date: 2024-08-18 16:40:59 +0000 (Sun, 18 Aug 2024) Log Message: ----------- add clarification for [documentation:#308] Description of PARSE VALUE inaccurate Modified Paths: -------------- docs/trunk/rexxref/en-US/instrc.xml Modified: docs/trunk/rexxref/en-US/instrc.xml =================================================================== --- docs/trunk/rexxref/en-US/instrc.xml 2024-08-18 16:38:05 UTC (rev 12868) +++ docs/trunk/rexxref/en-US/instrc.xml 2024-08-18 16:40:59 UTC (rev 12869) @@ -2349,7 +2349,9 @@ evaluating <emphasis role="italic">expression</emphasis>. If you specify no <emphasis role="italic">expression</emphasis>, the null string is used. Note that WITH is a subkeyword in this context and cannot be used as -a symbol within <emphasis role="italic">expression</emphasis>.</para> +a symbol within <emphasis role="italic">expression</emphasis>, +except when within a bracketed subexpression. +</para> <para>Thus, for example: <indexterm><primary>PARSE instruction</primary> <secondary>example</secondary></indexterm> |
From: <eri...@us...> - 2024-08-18 16:38:07
|
Revision: 12868 http://sourceforge.net/p/oorexx/code-0/12868 Author: erich_st Date: 2024-08-18 16:38:05 +0000 (Sun, 18 Aug 2024) Log Message: ----------- update rexxref for [documentation:#290] Set removeItem Modified Paths: -------------- docs/trunk/rexxref/en-US/collclasses.xml Modified: docs/trunk/rexxref/en-US/collclasses.xml =================================================================== --- docs/trunk/rexxref/en-US/collclasses.xml 2024-08-18 16:33:13 UTC (rev 12867) +++ docs/trunk/rexxref/en-US/collclasses.xml 2024-08-18 16:38:05 UTC (rev 12868) @@ -7,7 +7,7 @@ # # Description: Open Object Rexx: Reference XML File # - # Copyright (c) 2005-2022, Rexx Language Association. All rights reserved. + # Copyright (c) 2005-2024, Rexx Language Association. All rights reserved. # Portions Copyright (c) 2004, IBM Corporation. All rights reserved. # # This program and the accompanying materials are made available under @@ -7902,9 +7902,8 @@ </imageobject> </mediaobject> -<para>Removes an item from the set. If the target item exists at more than -one index, the first located item is removed. The return value is the -removed item. +<para>Returns and removes an item from the set. +Returns &nil; if the set does not contain <emphasis role="italic">item</emphasis>. Item equality is determined by using the <methodname>==</methodname> method of <emphasis role="italic">item</emphasis>. </para> </section> |
From: <eri...@us...> - 2024-08-18 16:33:15
|
Revision: 12867 http://sourceforge.net/p/oorexx/code-0/12867 Author: erich_st Date: 2024-08-18 16:33:13 +0000 (Sun, 18 Aug 2024) Log Message: ----------- clarify message instruction vs message term Modified Paths: -------------- docs/trunk/rexxref/en-US/intro.xml Modified: docs/trunk/rexxref/en-US/intro.xml =================================================================== --- docs/trunk/rexxref/en-US/intro.xml 2024-08-17 15:54:18 UTC (rev 12866) +++ docs/trunk/rexxref/en-US/intro.xml 2024-08-18 16:33:13 UTC (rev 12867) @@ -2339,7 +2339,8 @@ <para>A <emphasis>message instruction</emphasis> is a single clause in the form of a message term (see <xref linkend="mssg" />) or in the form -<emphasis role="italic">messageterm</emphasis>=<emphasis role="italic">expression</emphasis>. +<emphasis role="italic">messageterm</emphasis> = <emphasis role="italic">expression</emphasis>, +without the requirement for <emphasis role="italic">messageterm</emphasis> to return a result. A message is sent to an object, which responds by performing some action. See <xref linkend="msgi" />.</para> </section> |